PERFORCE change 135071 for review
Sam Leffler
sam at FreeBSD.org
Fri Feb 8 15:21:52 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=135071
Change 135071 by sam at sam_ebb on 2008/02/08 23:21:23
correct HT protection handling of overlapping bss; need to
give MIXED precedence over PROTOPT; this also fixes an issue
with our bouncing between MIXED and PROTOPT on each beacon we
received from an overlapping legacy bss
Affected files ...
.. //depot/projects/vap/sys/net80211/ieee80211_hostap.c#10 edit
.. //depot/projects/vap/sys/net80211/ieee80211_ht.c#8 edit
Differences ...
==== //depot/projects/vap/sys/net80211/ieee80211_hostap.c#10 (text+ko) ====
@@ -1728,15 +1728,14 @@
break;
}
if (scan.htinfo == NULL) {
- ic->ic_flags_ext |= IEEE80211_FEXT_NONHT_PR;
- ic->ic_lastnonht = ticks;
- ieee80211_htinfo_update(ic,
+ ieee80211_htprot_update(ic,
IEEE80211_HTINFO_OPMODE_PROTOPT |
IEEE80211_HTINFO_NONHT_PRESENT);
} else if (ishtmixed(scan.htinfo)) {
- /* XXX propagate HT20PR too? */
- ieee80211_htinfo_update(ic,
- IEEE80211_HTINFO_OPMODE_MIXED);
+ /* XXX? take NONHT_PRESENT from beacon? */
+ ieee80211_htprot_update(ic,
+ IEEE80211_HTINFO_OPMODE_MIXED |
+ IEEE80211_HTINFO_NONHT_PRESENT);
}
}
break;
==== //depot/projects/vap/sys/net80211/ieee80211_ht.c#8 (text+ko) ====
@@ -930,12 +930,12 @@
{
uint8_t protmode;
- if (ic->ic_flags_ext & IEEE80211_FEXT_NONHT_PR) {
+ if (ic->ic_sta_assoc != ic->ic_ht_sta_assoc) {
+ protmode = IEEE80211_HTINFO_OPMODE_MIXED
+ | IEEE80211_HTINFO_NONHT_PRESENT;
+ } else if (ic->ic_flags_ext & IEEE80211_FEXT_NONHT_PR) {
protmode = IEEE80211_HTINFO_OPMODE_PROTOPT
- | IEEE80211_HTINFO_NONHT_PRESENT;
- } else if (ic->ic_sta_assoc != ic->ic_ht_sta_assoc) {
- protmode = IEEE80211_HTINFO_OPMODE_MIXED
- | IEEE80211_HTINFO_NONHT_PRESENT;
+ | IEEE80211_HTINFO_NONHT_PRESENT;
} else if (ic->ic_bsschan != IEEE80211_CHAN_ANYC &&
IEEE80211_IS_CHAN_HT40(ic->ic_bsschan) &&
ic->ic_sta_assoc != ic->ic_ht40_sta_assoc) {
@@ -987,15 +987,36 @@
/*
* Public version of htinfo_update; used for processing
- * beacon frames from overlapping bss in hostap_recv_mgmt.
+ * beacon frames from overlapping bss.
+ *
+ * Caller can specify either IEEE80211_HTINFO_OPMODE_MIXED
+ * (on receipt of a beacon that advertises MIXED) or
+ * IEEE80211_HTINFO_OPMODE_PROTOPT (on receipt of a beacon
+ * from an overlapping legacy bss). We treat MIXED with
+ * a higher precedence than PROTOPT (i.e. we will not change
+ * change PROTOPT -> MIXED; only MIXED -> PROTOPT). This
+ * corresponds to how we handle things in htinfo_update.
*/
void
-ieee80211_htinfo_update(struct ieee80211com *ic, int protmode)
+ieee80211_htprot_update(struct ieee80211com *ic, int protmode)
{
- if (protmode != ic->ic_curhtprotmode) {
- ic->ic_curhtprotmode = protmode;
- htinfo_notify(ic);
- }
+#define OPMODE(x) SM(x, IEEE80211_HTINFO_OPMODE)
+ if (protmode == ic->ic_curhtprotmode)
+ return;
+ if (OPMODE(ic->ic_curhtprotmode) == IEEE80211_HTINFO_OPMODE_MIXED &&
+ OPMODE(protmode) == IEEE80211_HTINFO_OPMODE_PROTOPT)
+ return;
+
+ /* track non-HT station presence */
+ KASSERT(protmode & IEEE80211_HTINFO_NONHT_PRESENT,
+ ("missing NONHT_PRESENT"));
+ ic->ic_flags_ext |= IEEE80211_FEXT_NONHT_PR;
+ ic->ic_lastnonht = ticks;
+
+ /* push beacon update */
+ ic->ic_curhtprotmode = protmode;
+ htinfo_notify(ic);
+#undef OPMODE
}
/*
More information about the p4-projects
mailing list