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