diff options
author | Andriy Voskoboinyk <avos@FreeBSD.org> | 2017-03-03 01:06:27 +0000 |
---|---|---|
committer | Andriy Voskoboinyk <avos@FreeBSD.org> | 2017-03-03 01:06:27 +0000 |
commit | dfabbaa0e030669f8ccddb4d52e85e96e8fcf39c (patch) | |
tree | 65068da874772f9a391680aaaf06aa2ce6fcfc40 /sys/net80211/ieee80211_ht.c | |
parent | 0132c9cd4ac9a4cf86ff858e22cab39fc446ba93 (diff) | |
download | src-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.c | 15 |
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 } |