Deleted Added
full compact
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 ---