You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.3 KiB
Diff
48 lines
1.3 KiB
Diff
From: Felix Fietkau <nbd@nbd.name>
|
|
Date: Thu, 23 Jan 2020 14:10:20 +0100
|
|
Subject: [PATCH] driver_nl80211: fix regulatory limits for wmm cwmin/cwmax
|
|
values
|
|
|
|
The internal WMM AC parameters use just the exponent of the CW value, while
|
|
nl80211 reports the full CW value.
|
|
This led to completely bogus CWmin/CWmax values in the WMM IE when a regulatory
|
|
limit was present. Fix this by converting the value to the exponent before
|
|
passing it on
|
|
|
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
---
|
|
|
|
--- a/src/drivers/driver_nl80211_capa.c
|
|
+++ b/src/drivers/driver_nl80211_capa.c
|
|
@@ -1336,6 +1336,18 @@ static void phy_info_vht_capa(struct hos
|
|
}
|
|
}
|
|
|
|
+static inline int cw2ecw(unsigned int cw)
|
|
+{
|
|
+ int bit;
|
|
+
|
|
+ if (cw == 0)
|
|
+ return 0;
|
|
+
|
|
+ for (bit = 1; cw != 1; bit++)
|
|
+ cw >>= 1;
|
|
+
|
|
+ return bit;
|
|
+}
|
|
|
|
static void phy_info_freq(struct hostapd_hw_modes *mode,
|
|
struct hostapd_channel_data *chan,
|
|
@@ -1438,9 +1450,9 @@ static void phy_info_freq(struct hostapd
|
|
|
|
ac = wmm_map[ac];
|
|
chan->wmm_rules[ac].min_cwmin =
|
|
- nla_get_u16(tb_wmm[NL80211_WMMR_CW_MIN]);
|
|
+ cw2ecw(nla_get_u16(tb_wmm[NL80211_WMMR_CW_MIN]));
|
|
chan->wmm_rules[ac].min_cwmax =
|
|
- nla_get_u16(tb_wmm[NL80211_WMMR_CW_MAX]);
|
|
+ cw2ecw(nla_get_u16(tb_wmm[NL80211_WMMR_CW_MAX]));
|
|
chan->wmm_rules[ac].min_aifs =
|
|
nla_get_u8(tb_wmm[NL80211_WMMR_AIFSN]);
|
|
chan->wmm_rules[ac].max_txop =
|