diff --git a/ath/if_ath.c b/ath/if_ath.c index 515936a..8592a84 100644 --- a/ath/if_ath.c +++ b/ath/if_ath.c @@ -181,7 +181,7 @@ static void ath_node_free(struct ieee80211_node *); static u_int8_t ath_node_getrssi(const struct ieee80211_node *); static struct sk_buff *ath_rxbuf_take_skb(struct ath_softc *, struct ath_buf *); static int ath_rxbuf_init(struct ath_softc *, struct ath_buf *); -static void ath_recv_mgmt(struct ieee80211vap *, struct ieee80211_node *, +static int ath_recv_mgmt(struct ieee80211vap *, struct ieee80211_node *, struct sk_buff *, int, int, u_int64_t); static void ath_setdefantenna(struct ath_softc *, u_int); static struct ath_txq *ath_txq_setup(struct ath_softc *, int, int); @@ -6436,7 +6436,7 @@ ath_capture(struct net_device *dev, const struct ath_buf *bf, * ibss merges. This function is called for all management frames, * including those belonging to other BSS. */ -static void +static int ath_recv_mgmt(struct ieee80211vap * vap, struct ieee80211_node *ni_or_null, struct sk_buff *skb, int subtype, int rssi, u_int64_t rtsf) { @@ -6455,14 +6455,15 @@ ath_recv_mgmt(struct ieee80211vap * vap, struct ieee80211_node *ni_or_null, /* Call up first so subsequent work can use information * potentially stored in the node (e.g. for ibss merge). */ - sc->sc_recv_mgmt(vap, ni_or_null, skb, subtype, rssi, rtsf); + if (sc->sc_recv_mgmt(vap, ni_or_null, skb, subtype, rssi, rtsf) == 0) + return 0; /* Lookup the new node if any (this grabs a reference to it). */ ni = ieee80211_find_rxnode(vap->iv_ic, (const struct ieee80211_frame_min *)skb->data); if (ni == NULL) { DPRINTF(sc, ATH_DEBUG_BEACON, "Dropping; node unknown.\n"); - return; + return 0; } switch (subtype) { @@ -6538,6 +6539,7 @@ ath_recv_mgmt(struct ieee80211vap * vap, struct ieee80211_node *ni_or_null, } ieee80211_unref_node(&ni); + return 0; } static void @@ -6837,12 +6839,12 @@ rx_next: if (sc->sc_useintmit) ath_hal_rxmonitor(ah, &sc->sc_halstats, &sc->sc_curchan); if (!bf_processed) - DPRINTF(sc, ATH_DEBUG_RX_PROC, - "Warning: %s got scheduled when no recieve " - "buffers were ready. Were they cleared?\n", + DPRINTF(sc, ATH_DEBUG_RX_PROC, + "Warning: %s got scheduled when no receive " + "buffers were ready. Were they cleared?\n", __func__); - DPRINTF(sc, ATH_DEBUG_RX_PROC, "%s: cycle completed. " - " %d rx buf processed. %d were errors. %d skb accepted.\n", + DPRINTF(sc, ATH_DEBUG_RX_PROC, "%s: cycle completed. " + " %d rx buf processed. %d were errors. %d skb accepted.\n", __func__, bf_processed, errors, skb_accepted); #undef PA2DESC } diff --git a/ath/if_athvar.h b/ath/if_athvar.h index 1362f37..4aa42f5 100644 --- a/ath/if_athvar.h +++ b/ath/if_athvar.h @@ -641,7 +641,7 @@ struct ath_softc { int devid; int sc_debug; int sc_default_ieee80211_debug; /* default debug flags for new VAPs */ - void (*sc_recv_mgmt)(struct ieee80211vap *, struct ieee80211_node *, + int (*sc_recv_mgmt)(struct ieee80211vap *, struct ieee80211_node *, struct sk_buff *, int, int, u_int64_t); #ifdef IEEE80211_DEBUG_REFCNT void (*sc_node_cleanup_debug)(struct ieee80211_node *, const char* func, int line); diff --git a/net80211/ieee80211_input.c b/net80211/ieee80211_input.c index e8fa999..87ea8eb 100644 --- a/net80211/ieee80211_input.c +++ b/net80211/ieee80211_input.c @@ -1678,7 +1678,7 @@ bad: IEEE80211_FC0_SUBTYPE_SHIFT], \ "%s", "no " #__elem); \ vap->iv_stats.is_rx_elem_missing++; \ - return; \ + return 0; \ } \ if ((__elem)[1] > (__maxlen)) { \ IEEE80211_DISCARD(vap, IEEE80211_MSG_ELEMID, \ @@ -1686,7 +1686,7 @@ bad: IEEE80211_FC0_SUBTYPE_SHIFT], \ "bad " #__elem " len %d", (__elem)[1]); \ vap->iv_stats.is_rx_elem_toobig++; \ - return; \ + return 0; \ } \ } while (0) @@ -1697,7 +1697,7 @@ bad: IEEE80211_FC0_SUBTYPE_SHIFT], \ "%s", "ie too short"); \ vap->iv_stats.is_rx_elem_toosmall++; \ - return; \ + return 0; \ } \ } while (0) @@ -1722,7 +1722,7 @@ ieee80211_ssid_mismatch(struct ieee80211vap *vap, const char *tag, IEEE80211_FC0_SUBTYPE_SHIFT], \ wh->i_addr2, _ssid); \ vap->iv_stats.is_rx_ssidmismatch++; \ - return; \ + return 0; \ } \ } while (0) #else /* !IEEE80211_DEBUG */ @@ -1731,7 +1731,7 @@ ieee80211_ssid_mismatch(struct ieee80211vap *vap, const char *tag, ((_ssid)[1] != (_ni)->ni_esslen || \ memcmp((_ssid) + 2, (_ni)->ni_essid, (_ssid)[1]) != 0)) { \ vap->iv_stats.is_rx_ssidmismatch++; \ - return; \ + return 0; \ } \ } while (0) #endif /* !IEEE80211_DEBUG */ @@ -3040,7 +3040,7 @@ startbgscan(struct ieee80211vap *vap) /* * Context: SoftIRQ */ -void +int ieee80211_recv_mgmt(struct ieee80211vap *vap, struct ieee80211_node *ni_or_null, struct sk_buff *skb, int subtype, int rssi, u_int64_t rtsf) @@ -3089,7 +3089,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, (vap->iv_opmode == IEEE80211_M_STA && ni->ni_associd) || vap->iv_opmode == IEEE80211_M_IBSS)) { vap->iv_stats.is_rx_mgtdiscard++; - return; + return 0; } /* * beacon/probe response frame format @@ -3197,7 +3197,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, frm += frm[1] + 2; } if (frm > efrm) - return; + return 0; /* reached past the end */ IEEE80211_VERIFY_ELEMENT(scan.rates, IEEE80211_RATE_MAXSIZE); IEEE80211_VERIFY_ELEMENT(scan.ssid, IEEE80211_NWID_LEN); #if IEEE80211_CHAN_MAX < 255 @@ -3207,7 +3207,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, IEEE80211_FC0_SUBTYPE_SHIFT], "invalid channel %u", scan.chan); vap->iv_stats.is_rx_badchan++; - return; + return 0; } #endif if (scan.chan != scan.bchan && @@ -3227,7 +3227,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, IEEE80211_FC0_SUBTYPE_SHIFT], "for off-channel %u", scan.chan); vap->iv_stats.is_rx_chanmismatch++; - return; + return 0; } /* IEEE802.11 does not specify the allowed range for @@ -3239,7 +3239,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, IEEE80211_DISCARD(vap, IEEE80211_MSG_SCAN, wh, "beacon", "invalid beacon interval (%u)", scan.bintval); - return; + return 0; } /* @@ -3406,20 +3406,22 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, subtype, rssi, rtsf); else if (contbgscan(vap) || startbgscan(vap)) ieee80211_bg_scan(vap); - return; + return 0; } /* * If scanning, just pass information to the scan module. */ if (ic->ic_flags & IEEE80211_F_SCAN) { ieee80211_add_scan(vap, &scan, wh, subtype, rssi, rtsf); - return; + return 0; } if ((vap->iv_opmode == IEEE80211_M_IBSS) && (scan.capinfo & IEEE80211_CAPINFO_IBSS)) { if (ni_or_null == NULL) { /* Create a new entry in the neighbor table. */ ni = ieee80211_add_neighbor(vap, wh, &scan); + if (ni == NULL) + return 0; } else { /* * Copy data from beacon to neighbor table. @@ -3467,12 +3469,12 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, vap->iv_opmode == IEEE80211_M_AHDEMO || vap->iv_state != IEEE80211_S_RUN) { vap->iv_stats.is_rx_mgtdiscard++; - return; + return 0; } if (IEEE80211_IS_MULTICAST(wh->i_addr2)) { /* frame must be directed */ vap->iv_stats.is_rx_mgtdiscard++; /* XXX: stat */ - return; + return 0; } /* @@ -3480,7 +3482,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, */ #ifdef ATH_SUPERG_XR if (vap->iv_flags & IEEE80211_F_XR) - return; + return 0; #endif /* * prreq frame format @@ -3511,7 +3513,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, frm += frm[1] + 2; } if (frm > efrm) - return; + return 0; /* reached past the end */ IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); IEEE80211_VERIFY_ELEMENT(ssid, IEEE80211_NWID_LEN); IEEE80211_VERIFY_SSID(vap->iv_bss, ssid); @@ -3521,7 +3523,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, IEEE80211_FC0_SUBTYPE_SHIFT], "%s", "no ssid with ssid suppression enabled"); vap->iv_stats.is_rx_ssidmismatch++; /*XXX*/ - return; + return 0; } if (ni == vap->iv_bss) { if (vap->iv_opmode == IEEE80211_M_IBSS) { @@ -3537,7 +3539,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, ni = ieee80211_dup_bss(vap, wh->i_addr2, 1); } if (ni == NULL) - return; + return 0; allocbs = 1; } @@ -3602,7 +3604,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, } else { IEEE80211_DISCARD(vap, IEEE80211_MSG_AUTH, wh, "auth", "%s", "not to pier xr bssid"); - return; + return 0; } } #endif @@ -3614,7 +3616,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, IEEE80211_DISCARD(vap, IEEE80211_MSG_ACL, wh, "auth", "%s", "disallowed by ACL"); vap->iv_stats.is_rx_acl++; - return; + return 0; } if (vap->iv_flags & IEEE80211_F_COUNTERM) { IEEE80211_DISCARD(vap, @@ -3626,7 +3628,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, IEEE80211_FC0_SUBTYPE_AUTH, IEEE80211_REASON_MIC_FAILURE); } - return; + return 0; } if (algo == IEEE80211_AUTH_ALG_SHARED) ieee80211_auth_shared(ni, wh, frm + 6, efrm, rssi, @@ -3644,7 +3646,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, (seq + 1) | (IEEE80211_STATUS_ALG << 16)); } - return; + return 0; } break; } @@ -3658,7 +3660,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, if (vap->iv_opmode != IEEE80211_M_HOSTAP || vap->iv_state != IEEE80211_S_RUN) { vap->iv_stats.is_rx_mgtdiscard++; - return; + return 0; } if (subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ) { @@ -3689,7 +3691,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, IEEE80211_FC0_SUBTYPE_SHIFT], "%s", "wrong bssid"); vap->iv_stats.is_rx_assoc_bss++; - return; + return 0; } capinfo = le16toh(*(__le16 *)frm); frm += 2; @@ -3745,7 +3747,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, frm += frm[1] + 2; } if (frm > efrm) - return; + return 0; /* reached past the end */ IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); IEEE80211_VERIFY_ELEMENT(ssid, IEEE80211_NWID_LEN); @@ -3759,7 +3761,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, IEEE80211_FC0_SUBTYPE_DEAUTH, IEEE80211_REASON_ASSOC_NOT_AUTHED); vap->iv_stats.is_rx_assoc_notauth++; - return; + return 0; } if (ni->ni_needed_chans != NULL) { @@ -3775,7 +3777,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, IEEE80211_SEND_MGMT(ni, resp, status); ieee80211_node_leave(ni); /* XXX */ vap->iv_stats.is_rx_assoc_badscie++; /* XXX */ - return; + return 0; } } @@ -3792,7 +3794,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, ieee80211_node_leave(ni); /* XXX distinguish WPA/RSN? */ vap->iv_stats.is_rx_assoc_badwpaie++; - return; + return 0; } if (rsn != NULL) { @@ -3810,7 +3812,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, ieee80211_node_leave(ni); /* XXX distinguish WPA/RSN? */ vap->iv_stats.is_rx_assoc_badwpaie++; - return; + return 0; } IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_ASSOC | IEEE80211_MSG_WPA, @@ -3834,7 +3836,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, IEEE80211_SEND_MGMT(ni, resp, IEEE80211_STATUS_CAPINFO); ieee80211_node_leave(ni); vap->iv_stats.is_rx_assoc_capmismatch++; - return; + return 0; } rate = ieee80211_setup_rates(ni, rates, xrates, IEEE80211_F_DOSORT | IEEE80211_F_DOFRATE | @@ -3854,7 +3856,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, IEEE80211_STATUS_BASIC_RATE); ieee80211_node_leave(ni); vap->iv_stats.is_rx_assoc_norate++; - return; + return 0; } if (ni->ni_associd != 0 && @@ -3870,7 +3872,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, IEEE80211_STATUS_CAPINFO); ieee80211_node_leave(ni); vap->iv_stats.is_rx_assoc_capmismatch++; - return; + return 0; } } @@ -3924,7 +3926,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, if (vap->iv_opmode != IEEE80211_M_STA || vap->iv_state != IEEE80211_S_ASSOC) { vap->iv_stats.is_rx_mgtdiscard++; - return; + return 0; } /* @@ -3950,7 +3952,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, vap->iv_stats.is_rx_auth_fail++; /* XXX */ ieee80211_new_state(vap, IEEE80211_S_SCAN, IEEE80211_SCAN_FAIL_STATUS); - return; + return 0; } associd = le16toh(*(__le16 *)frm); frm += 2; @@ -3986,7 +3988,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, frm += frm[1] + 2; } if (frm > efrm) - return; + return 0; /* reached past the end */ IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); rate = ieee80211_setup_rates(ni, rates, xrates, IEEE80211_F_DOSORT | IEEE80211_F_DOFRATE | @@ -3999,7 +4001,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, vap->iv_stats.is_rx_assoc_norate++; ieee80211_new_state(vap, IEEE80211_S_SCAN, IEEE80211_SCAN_FAIL_STATUS); - return; + return 0; } ni->ni_capinfo = capinfo; @@ -4067,7 +4069,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, if (vap->iv_state == IEEE80211_S_SCAN) { vap->iv_stats.is_rx_mgtdiscard++; - return; + return 0; } /* * deauth frame format @@ -4103,7 +4105,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, vap->iv_state != IEEE80211_S_ASSOC && vap->iv_state != IEEE80211_S_AUTH) { vap->iv_stats.is_rx_mgtdiscard++; - return; + return 0; } /* * disassoc frame format @@ -4138,6 +4140,7 @@ ieee80211_recv_mgmt(struct ieee80211vap *vap, } #undef ISREASSOC #undef ISPROBE + return 1; } #undef IEEE80211_VERIFY_LENGTH #undef IEEE80211_VERIFY_ELEMENT diff --git a/net80211/ieee80211_node.c b/net80211/ieee80211_node.c index 38dcf87..b474344 100644 --- a/net80211/ieee80211_node.c +++ b/net80211/ieee80211_node.c @@ -946,9 +946,9 @@ node_print_message( show_counter = 1; if (show_counter) { - snprintf(node_count, - sizeof(node_count), - "[#NODES=%05d] ", + snprintf(node_count, + sizeof(node_count), + "[#NODES=%05d] ", atomic_read(&ni->ni_ic->ic_node_counter)); } va_start(args, message); diff --git a/net80211/ieee80211_proto.h b/net80211/ieee80211_proto.h index 433fa7b..8e6f1cf 100644 --- a/net80211/ieee80211_proto.h +++ b/net80211/ieee80211_proto.h @@ -70,7 +70,7 @@ int ieee80211_setup_rates(struct ieee80211_node *, const u_int8_t *, const u_int8_t *, int); void ieee80211_saveie(u_int8_t **, const u_int8_t *); void ieee80211_saveath(struct ieee80211_node *, u_int8_t *); -void ieee80211_recv_mgmt(struct ieee80211vap *, struct ieee80211_node *, +int ieee80211_recv_mgmt(struct ieee80211vap *, struct ieee80211_node *, struct sk_buff *, int, int, u_int64_t); void ieee80211_sta_pwrsave(struct ieee80211vap *, int); int ieee80211_hardstart(struct sk_buff *, struct net_device *); diff --git a/net80211/ieee80211_var.h b/net80211/ieee80211_var.h index 1d3911f..4d1c1a2 100644 --- a/net80211/ieee80211_var.h +++ b/net80211/ieee80211_var.h @@ -436,7 +436,7 @@ struct ieee80211com { /* Send/recv 802.11 management frame */ int (*ic_send_mgmt)(struct ieee80211_node *, int, int); - void (*ic_recv_mgmt)(struct ieee80211vap *, struct ieee80211_node *, + int (*ic_recv_mgmt)(struct ieee80211vap *, struct ieee80211_node *, struct sk_buff *, int, int, u_int64_t); /* Send management frame to driver (like hardstart) */