ERP (Extended Rate PHY) protection must be honoured in 11n mode
on 2 GHz channels.

>From an 11b client's point of view, 11n behaves like 11g in terms
of frame protection, and we must enable ERP protection in 11n mode
if requested by the AP.
The drivers already enable ERP protection if IEEE80211_F_USEPROT is set,
even in 11n mode. But the stack doesn't yet set this flag in 11n mode.

Note that ERP protection is called "TGG protection" in iwn/iwm driver
code. TGG expands to "Task Group G" after the IEEE task group which
worked on 802.11g.

Index: ieee80211_input.c
===================================================================
RCS file: /cvs/src/sys/net80211/ieee80211_input.c,v
retrieving revision 1.152
diff -u -p -r1.152 ieee80211_input.c
--- ieee80211_input.c   25 Jan 2016 11:27:11 -0000      1.152
+++ ieee80211_input.c   25 Jan 2016 13:32:29 -0000
@@ -2299,7 +2299,9 @@ ieee80211_recv_assoc_resp(struct ieee802
        /*
         * Honor ERP protection.
         */
-       if (ic->ic_curmode == IEEE80211_MODE_11G &&
+       if ((ic->ic_curmode == IEEE80211_MODE_11G ||
+           (ic->ic_curmode == IEEE80211_MODE_11N &&
+           IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))) &&
            (ni->ni_erp & IEEE80211_ERP_USE_PROTECTION))
                ic->ic_flags |= IEEE80211_F_USEPROT;
        else
Index: ieee80211_node.c
===================================================================
RCS file: /cvs/src/sys/net80211/ieee80211_node.c,v
retrieving revision 1.97
diff -u -p -r1.97 ieee80211_node.c
--- ieee80211_node.c    7 Jan 2016 23:22:31 -0000       1.97
+++ ieee80211_node.c    25 Jan 2016 13:32:29 -0000
@@ -1515,7 +1515,9 @@ ieee80211_node_join(struct ieee80211com 
                ni->ni_associd = aid | 0xc000;
                IEEE80211_AID_SET(ni->ni_associd, ic->ic_aid_bitmap);
                newassoc = 1;
-               if (ic->ic_curmode == IEEE80211_MODE_11G)
+               if (ic->ic_curmode == IEEE80211_MODE_11G ||
+                   (ic->ic_curmode == IEEE80211_MODE_11N &&
+                   IEEE80211_IS_CHAN_2GHZ(ic->ic_bss->ni_chan)))
                        ieee80211_node_join_11g(ic, ni);
        } else
                newassoc = 0;
@@ -1682,7 +1684,9 @@ ieee80211_node_leave(struct ieee80211com
        if (ic->ic_flags & IEEE80211_F_RSNON)
                ieee80211_node_leave_rsn(ic, ni);
 
-       if (ic->ic_curmode == IEEE80211_MODE_11G)
+       if (ic->ic_curmode == IEEE80211_MODE_11G ||
+           (ic->ic_curmode == IEEE80211_MODE_11N &&
+           IEEE80211_IS_CHAN_2GHZ(ic->ic_bss->ni_chan)))
                ieee80211_node_leave_11g(ic, ni);
 
        if (ni->ni_flags & IEEE80211_NODE_HT)

Reply via email to