aboutsummaryrefslogtreecommitdiff
path: root/sys/net80211/ieee80211_ht.c
diff options
context:
space:
mode:
authorAndriy Voskoboinyk <avos@FreeBSD.org>2017-03-03 01:06:27 +0000
committerAndriy Voskoboinyk <avos@FreeBSD.org>2017-03-03 01:06:27 +0000
commitdfabbaa0e030669f8ccddb4d52e85e96e8fcf39c (patch)
tree65068da874772f9a391680aaaf06aa2ce6fcfc40 /sys/net80211/ieee80211_ht.c
parent0132c9cd4ac9a4cf86ff858e22cab39fc446ba93 (diff)
downloadsrc-dfabbaa0e030669f8ccddb4d52e85e96e8fcf39c.tar.gz
src-dfabbaa0e030669f8ccddb4d52e85e96e8fcf39c.zip
net80211: fix ieee80211_htrateset setup, return EINVAL for an unsupported
ucast/mcast/mgmt HT rate. - Init global ieee80211_htrateset only once; neither ic_htcaps nor ic_txstream is changed when device is attached; - Move global ieee80211_htrateset structure to ieee80211com; there was a possible data race when more than 1 wireless device is used simultaneously; - Discard unsupported rates in ieee80211_ioctl_settxparams(); otherwise, an unsupported value may break connectivity (actually, 'ifconfig wlan0 ucastrate 8' for RTL8188EU results in immediate disconnect + infinite 'device timeout's after it). Tested with: - Intel 6205, STA mode. - RTL8821AU, STA mode. Reviewed by: adrian Differential Revision: https://reviews.freebsd.org/D9871
Notes
Notes: svn path=/head/; revision=314575
Diffstat (limited to 'sys/net80211/ieee80211_ht.c')
-rw-r--r--sys/net80211/ieee80211_ht.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/sys/net80211/ieee80211_ht.c b/sys/net80211/ieee80211_ht.c
index 4ee6b2489f40..1c4d954896ee 100644
--- a/sys/net80211/ieee80211_ht.c
+++ b/sys/net80211/ieee80211_ht.c
@@ -421,19 +421,17 @@ ieee80211_ht_announce(struct ieee80211com *ic)
ht_announce(ic, IEEE80211_MODE_11NG);
}
-static struct ieee80211_htrateset htrateset;
-
-const struct ieee80211_htrateset *
-ieee80211_get_suphtrates(struct ieee80211com *ic,
- const struct ieee80211_channel *c)
+void
+ieee80211_init_suphtrates(struct ieee80211com *ic)
{
#define ADDRATE(x) do { \
- htrateset.rs_rates[htrateset.rs_nrates] = x; \
- htrateset.rs_nrates++; \
+ htrateset->rs_rates[htrateset->rs_nrates] = x; \
+ htrateset->rs_nrates++; \
} while (0)
+ struct ieee80211_htrateset *htrateset = &ic->ic_sup_htrates;
int i;
- memset(&htrateset, 0, sizeof(struct ieee80211_htrateset));
+ memset(htrateset, 0, sizeof(struct ieee80211_htrateset));
for (i = 0; i < ic->ic_txstream * 8; i++)
ADDRATE(i);
if ((ic->ic_htcaps & IEEE80211_HTCAP_CHWIDTH40) &&
@@ -453,7 +451,6 @@ ieee80211_get_suphtrates(struct ieee80211com *ic,
ADDRATE(i);
}
}
- return &htrateset;
#undef ADDRATE
}