Author: adrian
Date: Fri Feb 27 04:45:47 2015
New Revision: 279350
URL: https://svnweb.freebsd.org/changeset/base/279350

Log:
  Fix kern/196290 - don't announce 11n HTINFO rates if the channel is
  configured as 11b.
  
  This came up when debugging other issues surrounding scanning and
  channel modes.
  
  What's going on:
  
  * The VAP comes up as an 11b VAP, but on an 11n capable NIC;
  * .. it announces HTINFO and MCS rates;
  * The AP thinks it's an 11n capable device and transmits 11n frames
    to the STA;
  * But the STA is in 11b mode, and thus doesn't receive/ACK the frames.
  
  It didn't happen for the ath(4) devices as the AR5416/AR9300 HALs
  unconditionally enable MCS frame reception, even if the channel
  mode is not 11n.  But the Intel NICs are configured in 11b/11a/11g
  modes when doing those, even if 11n is enabled and available.
  
  So, don't announce 11n capabilities if the VAP isn't on an 11n
  channel when sending management assocation request / reassociation
  request frames.
  
  TODO:
  
  * Lots more testing - 11n should be "upgraded" after association,
    and I just want to make sure I haven't broken 11n upgrade.
    I shouldn't have - this is only happening for /sending/ association
    requests, which APs aren't doing.
  
  Tested:
  
  * ath(4) APs (AR9331, AR7161+AR9280, AR934x)
  * AR5416, STA mode
  * Intel 5100, STA mode
  
  PR:           kern/196290

Modified:
  head/sys/net80211/ieee80211_output.c

Modified: head/sys/net80211/ieee80211_output.c
==============================================================================
--- head/sys/net80211/ieee80211_output.c        Fri Feb 27 02:56:58 2015        
(r279349)
+++ head/sys/net80211/ieee80211_output.c        Fri Feb 27 04:45:47 2015        
(r279350)
@@ -2322,18 +2322,33 @@ ieee80211_send_mgmt(struct ieee80211_nod
                            ic->ic_curchan);
                        frm = ieee80211_add_supportedchannels(frm, ic);
                }
+
+               /*
+                * Check the channel - we may be using an 11n NIC with an
+                * 11n capable station, but we're configured to be an 11b
+                * channel.
+                */
                if ((vap->iv_flags_ht & IEEE80211_FHT_HT) &&
+                   IEEE80211_IS_CHAN_HT(ni->ni_chan) &&
                    ni->ni_ies.htcap_ie != NULL &&
-                   ni->ni_ies.htcap_ie[0] == IEEE80211_ELEMID_HTCAP)
+                   ni->ni_ies.htcap_ie[0] == IEEE80211_ELEMID_HTCAP) {
                        frm = ieee80211_add_htcap(frm, ni);
+               }
                frm = ieee80211_add_wpa(frm, vap);
                if ((ic->ic_flags & IEEE80211_F_WME) &&
                    ni->ni_ies.wme_ie != NULL)
                        frm = ieee80211_add_wme_info(frm, &ic->ic_wme);
+
+               /*
+                * Same deal - only send HT info if we're on an 11n
+                * capable channel.
+                */
                if ((vap->iv_flags_ht & IEEE80211_FHT_HT) &&
+                   IEEE80211_IS_CHAN_HT(ni->ni_chan) &&
                    ni->ni_ies.htcap_ie != NULL &&
-                   ni->ni_ies.htcap_ie[0] == IEEE80211_ELEMID_VENDOR)
+                   ni->ni_ies.htcap_ie[0] == IEEE80211_ELEMID_VENDOR) {
                        frm = ieee80211_add_htcap_vendor(frm, ni);
+               }
 #ifdef IEEE80211_SUPPORT_SUPERG
                if (IEEE80211_ATH_CAP(vap, ni, IEEE80211_F_ATHEROS)) {
                        frm = ieee80211_add_ath(frm, 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to