aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/services/hostapd/patches/071-driver_nl80211-fix-regulatory-limits-for-wmm-cwmin-c.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/network/services/hostapd/patches/071-driver_nl80211-fix-regulatory-limits-for-wmm-cwmin-c.patch')
-rw-r--r--package/network/services/hostapd/patches/071-driver_nl80211-fix-regulatory-limits-for-wmm-cwmin-c.patch47
1 files changed, 47 insertions, 0 deletions
diff --git a/package/network/services/hostapd/patches/071-driver_nl80211-fix-regulatory-limits-for-wmm-cwmin-c.patch b/package/network/services/hostapd/patches/071-driver_nl80211-fix-regulatory-limits-for-wmm-cwmin-c.patch
new file mode 100644
index 0000000000..fe41e2b788
--- /dev/null
+++ b/package/network/services/hostapd/patches/071-driver_nl80211-fix-regulatory-limits-for-wmm-cwmin-c.patch
@@ -0,0 +1,47 @@
+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 =