Date: Wed, 27 Aug 2008 16:04:31 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 148624 for review Message-ID: <200808271604.m7RG4Vtb005787@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=148624 Change 148624 by sam@sam_ebb on 2008/08/27 16:03:35 fix channel width handling for sta's associating to an ap; this was broken when ieee80211_parse_htcap was changed to only parse ie's and push state to the node; we need to also update ni_chw to reflect htcap contents because no htinfo state is provided in an AssocReq frame Affected files ... .. //depot/projects/vap/sys/net80211/ieee80211_hostap.c#24 edit .. //depot/projects/vap/sys/net80211/ieee80211_ht.c#39 edit .. //depot/projects/vap/sys/net80211/ieee80211_ht.h#19 edit .. //depot/projects/vap/sys/net80211/ieee80211_sta.c#15 edit Differences ... ==== //depot/projects/vap/sys/net80211/ieee80211_hostap.c#24 (text+ko) ==== @@ -2039,7 +2039,7 @@ return; } ieee80211_ht_node_init(ni); - ieee80211_parse_htcap(ni, htcap); + ieee80211_ht_updatehtcap(ni, htcap); } else if (ni->ni_flags & IEEE80211_NODE_HT) ieee80211_ht_node_cleanup(ni); /* ==== //depot/projects/vap/sys/net80211/ieee80211_ht.c#39 (text+ko) ==== @@ -1196,24 +1196,13 @@ * parsing the contents of a beacon frame). */ static void -htinfo_update_chw(struct ieee80211_node *ni, - const struct ieee80211_ie_htinfo *htinfo) +htinfo_update_chw(struct ieee80211_node *ni, int htflags) { struct ieee80211com *ic = ni->ni_ic; struct ieee80211vap *vap = ni->ni_vap; struct ieee80211_channel *c; - int htflags, chanflags; + int chanflags; - /* NB: honor operating mode constraint */ - htflags = (vap->iv_flags_ext & IEEE80211_FEXT_HT) ? - IEEE80211_CHAN_HT20 : 0; - if ((htinfo->hi_byte1 & IEEE80211_HTINFO_TXWIDTH_2040) && - (vap->iv_flags_ext & IEEE80211_FEXT_USEHT40)) { - if (ni->ni_ht2ndchan == IEEE80211_HTINFO_2NDCHAN_ABOVE) - htflags = IEEE80211_CHAN_HT40U; - else if (ni->ni_ht2ndchan == IEEE80211_HTINFO_2NDCHAN_BELOW) - htflags = IEEE80211_CHAN_HT40D; - } chanflags = (ni->ni_chan->ic_flags &~ IEEE80211_CHAN_HT) | htflags; if (chanflags != ni->ni_chan->ic_flags) { /* XXX not right for ht40- */ @@ -1254,11 +1243,53 @@ ieee80211_ht_updateparams(struct ieee80211_node *ni, const uint8_t *htcapie, const uint8_t *htinfoie) { + struct ieee80211vap *vap = ni->ni_vap; + const struct ieee80211_ie_htinfo *htinfo; + int htflags; + ieee80211_parse_htcap(ni, htcapie); if (htinfoie[0] == IEEE80211_ELEMID_VENDOR) htinfoie += 4; - htinfo_parse(ni, (const struct ieee80211_ie_htinfo *) htinfoie); - htinfo_update_chw(ni, (const struct ieee80211_ie_htinfo *) htinfoie); + htinfo = (const struct ieee80211_ie_htinfo *) htinfoie; + htinfo_parse(ni, htinfo); + + htflags = (vap->iv_flags_ext & IEEE80211_FEXT_HT) ? + IEEE80211_CHAN_HT20 : 0; + /* NB: honor operating mode constraint */ + if ((htinfo->hi_byte1 & IEEE80211_HTINFO_TXWIDTH_2040) && + (vap->iv_flags_ext & IEEE80211_FEXT_USEHT40)) { + if (ni->ni_ht2ndchan == IEEE80211_HTINFO_2NDCHAN_ABOVE) + htflags = IEEE80211_CHAN_HT40U; + else if (ni->ni_ht2ndchan == IEEE80211_HTINFO_2NDCHAN_BELOW) + htflags = IEEE80211_CHAN_HT40D; + } + htinfo_update_chw(ni, htflags); +} + +/* + * Parse and update HT-related state extracted from the HT cap ie + * for a station joining an HT BSS. + */ +void +ieee80211_ht_updatehtcap(struct ieee80211_node *ni, const uint8_t *htcapie) +{ + struct ieee80211vap *vap = ni->ni_vap; + int htflags; + + ieee80211_parse_htcap(ni, htcapie); + + /* NB: honor operating mode constraint */ + /* XXX 40 MHZ intolerant */ + htflags = (vap->iv_flags_ext & IEEE80211_FEXT_HT) ? + IEEE80211_CHAN_HT20 : 0; + if ((ni->ni_htcap & IEEE80211_HTCAP_CHWIDTH40) && + (vap->iv_flags_ext & IEEE80211_FEXT_USEHT40)) { + if (IEEE80211_IS_CHAN_HT40U(vap->iv_bss->ni_chan)) + htflags = IEEE80211_CHAN_HT40U; + else if (IEEE80211_IS_CHAN_HT40D(vap->iv_bss->ni_chan)) + htflags = IEEE80211_CHAN_HT40D; + } + htinfo_update_chw(ni, htflags); } /* ==== //depot/projects/vap/sys/net80211/ieee80211_ht.h#19 (text+ko) ==== @@ -180,6 +180,7 @@ void ieee80211_parse_htinfo(struct ieee80211_node *, const uint8_t *); void ieee80211_ht_updateparams(struct ieee80211_node *, const uint8_t *, const uint8_t *); +void ieee80211_ht_updatehtcap(struct ieee80211_node *, const uint8_t *); void ieee80211_recv_action(struct ieee80211_node *, const uint8_t *, const uint8_t *); int ieee80211_ampdu_request(struct ieee80211_node *, ==== //depot/projects/vap/sys/net80211/ieee80211_sta.c#15 (text+ko) ==== @@ -1268,7 +1268,8 @@ ieee80211_wme_updateparams(vap); if (scan.ath != NULL) ieee80211_parse_athparams(ni, scan.ath, wh); - if (scan.htcap != NULL && scan.htinfo != NULL) { + if (scan.htcap != NULL && scan.htinfo != NULL && + (vap->iv_flags_ext & IEEE80211_FEXT_HT)) { ieee80211_ht_updateparams(ni, scan.htcap, scan.htinfo); /* XXX state changes? */help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200808271604.m7RG4Vtb005787>
