From f159bf3ace0da75328bc22d218c119bf4798493f Mon Sep 17 00:00:00 2001 From: sam Date: Sun, 11 Mar 2007 06:55:59 +0000 Subject: split check for rate set mismatch on assoc req away from check for pure 11g mode so we can give meaningful diagnostic msgs MFC after: 2 weeks --- sys/net80211/ieee80211_input.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'sys/net80211/ieee80211_input.c') diff --git a/sys/net80211/ieee80211_input.c b/sys/net80211/ieee80211_input.c index cfe106e..19a9b8b 100644 --- a/sys/net80211/ieee80211_input.c +++ b/sys/net80211/ieee80211_input.c @@ -1774,6 +1774,21 @@ ieee80211_deliver_l2uf(struct ieee80211_node *ni) } static void +ratesetmismatch(struct ieee80211_node *ni, const struct ieee80211_frame *wh, + int reassoc, int resp, const char *tag, int rate) +{ + struct ieee80211com *ic = ni->ni_ic; + + IEEE80211_DPRINTF(ic, IEEE80211_MSG_ANY, + "[%s] deny %s request, %srate set mismatch, rate 0x%x\n", + ether_sprintf(wh->i_addr2), + reassoc ? "reassoc" : "assoc", tag, rate); + IEEE80211_SEND_MGMT(ic, ni, resp, IEEE80211_STATUS_BASIC_RATE); + ieee80211_node_leave(ic, ni); + ic->ic_stats.is_rx_assoc_norate++; +} + +static void capinfomismatch(struct ieee80211_node *ni, const struct ieee80211_frame *wh, int reassoc, int resp, const char *tag, int capinfo) { @@ -2378,22 +2393,18 @@ ieee80211_recv_mgmt(struct ieee80211com *ic, struct mbuf *m0, rate = ieee80211_setup_rates(ni, rates, xrates, IEEE80211_F_DOSORT | IEEE80211_F_DOFRATE | IEEE80211_F_DONEGO | IEEE80211_F_DODEL); + if (rate & IEEE80211_RATE_BASIC) { + ratesetmismatch(ni, wh, reassoc, resp, "basic", rate); + return; + } /* * If constrained to 11g-only stations reject an * 11b-only station. We cheat a bit here by looking * at the max negotiated xmit rate and assuming anyone * with a best rate <24Mb/s is an 11b station. */ - if ((rate & IEEE80211_RATE_BASIC) || - ((ic->ic_flags & IEEE80211_F_PUREG) && rate < 48)) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ANY, - "[%s] deny %s request, rate set mismatch\n", - ether_sprintf(wh->i_addr2), - reassoc ? "reassoc" : "assoc"); - IEEE80211_SEND_MGMT(ic, ni, resp, - IEEE80211_STATUS_BASIC_RATE); - ieee80211_node_leave(ic, ni); - ic->ic_stats.is_rx_assoc_norate++; + if ((ic->ic_flags & IEEE80211_F_PUREG) && rate < 48) { + ratesetmismatch(ni, wh, reassoc, resp, "11g", rate); return; } ni->ni_rssi = rssi; -- cgit v1.1