ieee80211_ht.c (183255) | ieee80211_ht.c (183256) |
---|---|
1/*- 2 * Copyright (c) 2007-2008 Sam Leffler, Errno Consulting 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include <sys/cdefs.h> 27#ifdef __FreeBSD__ | 1/*- 2 * Copyright (c) 2007-2008 Sam Leffler, Errno Consulting 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include <sys/cdefs.h> 27#ifdef __FreeBSD__ |
28__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_ht.c 183255 2008-09-21 23:59:14Z sam $"); | 28__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_ht.c 183256 2008-09-22 00:10:22Z sam $"); |
29#endif 30 31/* 32 * IEEE 802.11n protocol support. 33 */ 34 35#include "opt_inet.h" 36#include "opt_wlan.h" --- 124 unchanged lines hidden (view full) --- 161 if (vap->iv_htcaps & IEEE80211_HTCAP_SHORTGI20) 162 vap->iv_flags_ext |= IEEE80211_FEXT_SHORTGI20; 163 /* XXX infer from channel list? */ 164 if (vap->iv_htcaps & IEEE80211_HTCAP_CHWIDTH40) { 165 vap->iv_flags_ext |= IEEE80211_FEXT_USEHT40; 166 if (vap->iv_htcaps & IEEE80211_HTCAP_SHORTGI40) 167 vap->iv_flags_ext |= IEEE80211_FEXT_SHORTGI40; 168 } | 29#endif 30 31/* 32 * IEEE 802.11n protocol support. 33 */ 34 35#include "opt_inet.h" 36#include "opt_wlan.h" --- 124 unchanged lines hidden (view full) --- 161 if (vap->iv_htcaps & IEEE80211_HTCAP_SHORTGI20) 162 vap->iv_flags_ext |= IEEE80211_FEXT_SHORTGI20; 163 /* XXX infer from channel list? */ 164 if (vap->iv_htcaps & IEEE80211_HTCAP_CHWIDTH40) { 165 vap->iv_flags_ext |= IEEE80211_FEXT_USEHT40; 166 if (vap->iv_htcaps & IEEE80211_HTCAP_SHORTGI40) 167 vap->iv_flags_ext |= IEEE80211_FEXT_SHORTGI40; 168 } |
169 /* enable RIFS if capable */ 170 if (vap->iv_htcaps & IEEE80211_HTC_RIFS) 171 vap->iv_flags_ext |= IEEE80211_FEXT_RIFS; 172 |
|
169 /* NB: A-MPDU and A-MSDU rx are mandated, these are tx only */ 170 vap->iv_flags_ext |= IEEE80211_FEXT_AMPDU_RX; 171 if (vap->iv_htcaps & IEEE80211_HTC_AMPDU) 172 vap->iv_flags_ext |= IEEE80211_FEXT_AMPDU_TX; 173 vap->iv_flags_ext |= IEEE80211_FEXT_AMSDU_RX; 174 if (vap->iv_htcaps & IEEE80211_HTC_AMSDU) 175 vap->iv_flags_ext |= IEEE80211_FEXT_AMSDU_TX; 176 } --- 781 unchanged lines hidden (view full) --- 958 ni->ni_ht2ndchan = IEEE80211_HTINFO_2NDCHAN_BELOW; 959 if (vap->iv_flags_ext & IEEE80211_FEXT_SHORTGI40) 960 ni->ni_htcap |= IEEE80211_HTCAP_SHORTGI40; 961 } else { 962 ni->ni_chw = 20; 963 ni->ni_ht2ndchan = IEEE80211_HTINFO_2NDCHAN_NONE; 964 } 965 ni->ni_htctlchan = ni->ni_chan->ic_ieee; | 173 /* NB: A-MPDU and A-MSDU rx are mandated, these are tx only */ 174 vap->iv_flags_ext |= IEEE80211_FEXT_AMPDU_RX; 175 if (vap->iv_htcaps & IEEE80211_HTC_AMPDU) 176 vap->iv_flags_ext |= IEEE80211_FEXT_AMPDU_TX; 177 vap->iv_flags_ext |= IEEE80211_FEXT_AMSDU_RX; 178 if (vap->iv_htcaps & IEEE80211_HTC_AMSDU) 179 vap->iv_flags_ext |= IEEE80211_FEXT_AMSDU_TX; 180 } --- 781 unchanged lines hidden (view full) --- 962 ni->ni_ht2ndchan = IEEE80211_HTINFO_2NDCHAN_BELOW; 963 if (vap->iv_flags_ext & IEEE80211_FEXT_SHORTGI40) 964 ni->ni_htcap |= IEEE80211_HTCAP_SHORTGI40; 965 } else { 966 ni->ni_chw = 20; 967 ni->ni_ht2ndchan = IEEE80211_HTINFO_2NDCHAN_NONE; 968 } 969 ni->ni_htctlchan = ni->ni_chan->ic_ieee; |
970 if (vap->iv_flags_ext & IEEE80211_FEXT_RIFS) 971 ni->ni_flags |= IEEE80211_NODE_RIFS; 972 /* XXX does it make sense to enable SMPS? */ |
|
966 967 ni->ni_htopmode = 0; /* XXX need protection state */ 968 ni->ni_htstbc = 0; /* XXX need info */ 969 970 for (ac = 0; ac < WME_NUM_AC; ac++) { 971 tap = &ni->ni_tx_ampdu[ac]; 972 tap->txa_ac = ac; 973 } --- 315 unchanged lines hidden (view full) --- 1289 if ((htinfo->hi_byte1 & IEEE80211_HTINFO_TXWIDTH_2040) && 1290 (vap->iv_flags_ext & IEEE80211_FEXT_USEHT40)) { 1291 if (ni->ni_ht2ndchan == IEEE80211_HTINFO_2NDCHAN_ABOVE) 1292 htflags = IEEE80211_CHAN_HT40U; 1293 else if (ni->ni_ht2ndchan == IEEE80211_HTINFO_2NDCHAN_BELOW) 1294 htflags = IEEE80211_CHAN_HT40D; 1295 } 1296 htinfo_update_chw(ni, htflags); | 973 974 ni->ni_htopmode = 0; /* XXX need protection state */ 975 ni->ni_htstbc = 0; /* XXX need info */ 976 977 for (ac = 0; ac < WME_NUM_AC; ac++) { 978 tap = &ni->ni_tx_ampdu[ac]; 979 tap->txa_ac = ac; 980 } --- 315 unchanged lines hidden (view full) --- 1296 if ((htinfo->hi_byte1 & IEEE80211_HTINFO_TXWIDTH_2040) && 1297 (vap->iv_flags_ext & IEEE80211_FEXT_USEHT40)) { 1298 if (ni->ni_ht2ndchan == IEEE80211_HTINFO_2NDCHAN_ABOVE) 1299 htflags = IEEE80211_CHAN_HT40U; 1300 else if (ni->ni_ht2ndchan == IEEE80211_HTINFO_2NDCHAN_BELOW) 1301 htflags = IEEE80211_CHAN_HT40D; 1302 } 1303 htinfo_update_chw(ni, htflags); |
1304 1305 if ((htinfo->hi_byte1 & IEEE80211_HTINFO_RIFSMODE_PERM) && 1306 (vap->iv_flags_ext & IEEE80211_FEXT_RIFS)) 1307 ni->ni_flags |= IEEE80211_NODE_RIFS; 1308 else 1309 ni->ni_flags &= ~IEEE80211_NODE_RIFS; |
|
1297} 1298 1299/* 1300 * Parse and update HT-related state extracted from the HT cap ie 1301 * for a station joining an HT BSS. 1302 */ 1303void 1304ieee80211_ht_updatehtcap(struct ieee80211_node *ni, const uint8_t *htcapie) --- 901 unchanged lines hidden (view full) --- 2206#define PROTMODE (IEEE80211_HTINFO_OPMODE|IEEE80211_HTINFO_NONHT_PRESENT) 2207 const struct ieee80211_channel *bsschan = vap->iv_bss->ni_chan; 2208 struct ieee80211com *ic = vap->iv_ic; 2209 struct ieee80211_ie_htinfo *ht = 2210 (struct ieee80211_ie_htinfo *) bo->bo_htinfo; 2211 2212 /* XXX only update on channel change */ 2213 ht->hi_ctrlchannel = ieee80211_chan2ieee(ic, bsschan); | 1310} 1311 1312/* 1313 * Parse and update HT-related state extracted from the HT cap ie 1314 * for a station joining an HT BSS. 1315 */ 1316void 1317ieee80211_ht_updatehtcap(struct ieee80211_node *ni, const uint8_t *htcapie) --- 901 unchanged lines hidden (view full) --- 2219#define PROTMODE (IEEE80211_HTINFO_OPMODE|IEEE80211_HTINFO_NONHT_PRESENT) 2220 const struct ieee80211_channel *bsschan = vap->iv_bss->ni_chan; 2221 struct ieee80211com *ic = vap->iv_ic; 2222 struct ieee80211_ie_htinfo *ht = 2223 (struct ieee80211_ie_htinfo *) bo->bo_htinfo; 2224 2225 /* XXX only update on channel change */ 2226 ht->hi_ctrlchannel = ieee80211_chan2ieee(ic, bsschan); |
2214 ht->hi_byte1 = IEEE80211_HTINFO_RIFSMODE_PROH; | 2227 if (vap->iv_flags_ext & IEEE80211_FEXT_RIFS) 2228 ht->hi_byte1 = IEEE80211_HTINFO_RIFSMODE_PERM; 2229 else 2230 ht->hi_byte1 = IEEE80211_HTINFO_RIFSMODE_PROH; |
2215 if (IEEE80211_IS_CHAN_HT40U(bsschan)) 2216 ht->hi_byte1 |= IEEE80211_HTINFO_2NDCHAN_ABOVE; 2217 else if (IEEE80211_IS_CHAN_HT40D(bsschan)) 2218 ht->hi_byte1 |= IEEE80211_HTINFO_2NDCHAN_BELOW; 2219 else 2220 ht->hi_byte1 |= IEEE80211_HTINFO_2NDCHAN_NONE; 2221 if (IEEE80211_IS_CHAN_HT40(bsschan)) 2222 ht->hi_byte1 |= IEEE80211_HTINFO_TXWIDTH_2040; --- 10 unchanged lines hidden (view full) --- 2233 * 2234 * NB: We don't use struct ieee80211_ie_htinfo because we can 2235 * be called to fillin both a standard ie and a compat ie that 2236 * has a vendor OUI at the front. 2237 */ 2238static uint8_t * 2239ieee80211_add_htinfo_body(uint8_t *frm, struct ieee80211_node *ni) 2240{ | 2231 if (IEEE80211_IS_CHAN_HT40U(bsschan)) 2232 ht->hi_byte1 |= IEEE80211_HTINFO_2NDCHAN_ABOVE; 2233 else if (IEEE80211_IS_CHAN_HT40D(bsschan)) 2234 ht->hi_byte1 |= IEEE80211_HTINFO_2NDCHAN_BELOW; 2235 else 2236 ht->hi_byte1 |= IEEE80211_HTINFO_2NDCHAN_NONE; 2237 if (IEEE80211_IS_CHAN_HT40(bsschan)) 2238 ht->hi_byte1 |= IEEE80211_HTINFO_TXWIDTH_2040; --- 10 unchanged lines hidden (view full) --- 2249 * 2250 * NB: We don't use struct ieee80211_ie_htinfo because we can 2251 * be called to fillin both a standard ie and a compat ie that 2252 * has a vendor OUI at the front. 2253 */ 2254static uint8_t * 2255ieee80211_add_htinfo_body(uint8_t *frm, struct ieee80211_node *ni) 2256{ |
2257 struct ieee80211vap *vap = ni->ni_vap; |
|
2241 struct ieee80211com *ic = ni->ni_ic; 2242 2243 /* pre-zero remainder of ie */ 2244 memset(frm, 0, sizeof(struct ieee80211_ie_htinfo) - 2); 2245 2246 /* primary/control channel center */ 2247 *frm++ = ieee80211_chan2ieee(ic, ni->ni_chan); 2248 | 2258 struct ieee80211com *ic = ni->ni_ic; 2259 2260 /* pre-zero remainder of ie */ 2261 memset(frm, 0, sizeof(struct ieee80211_ie_htinfo) - 2); 2262 2263 /* primary/control channel center */ 2264 *frm++ = ieee80211_chan2ieee(ic, ni->ni_chan); 2265 |
2249 frm[0] = IEEE80211_HTINFO_RIFSMODE_PROH; | 2266 if (vap->iv_flags_ext & IEEE80211_FEXT_RIFS) 2267 frm[0] = IEEE80211_HTINFO_RIFSMODE_PERM; 2268 else 2269 frm[0] = IEEE80211_HTINFO_RIFSMODE_PROH; |
2250 if (IEEE80211_IS_CHAN_HT40U(ni->ni_chan)) 2251 frm[0] |= IEEE80211_HTINFO_2NDCHAN_ABOVE; 2252 else if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan)) 2253 frm[0] |= IEEE80211_HTINFO_2NDCHAN_BELOW; 2254 else 2255 frm[0] |= IEEE80211_HTINFO_2NDCHAN_NONE; 2256 if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) 2257 frm[0] |= IEEE80211_HTINFO_TXWIDTH_2040; --- 38 unchanged lines hidden --- | 2270 if (IEEE80211_IS_CHAN_HT40U(ni->ni_chan)) 2271 frm[0] |= IEEE80211_HTINFO_2NDCHAN_ABOVE; 2272 else if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan)) 2273 frm[0] |= IEEE80211_HTINFO_2NDCHAN_BELOW; 2274 else 2275 frm[0] |= IEEE80211_HTINFO_2NDCHAN_NONE; 2276 if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) 2277 frm[0] |= IEEE80211_HTINFO_TXWIDTH_2040; --- 38 unchanged lines hidden --- |