diff mbox series

[2/2] driver_nl80211: fix regulatory limits for wmm cwmin/cwmax values

Message ID 20200123131333.58776-2-nbd@nbd.name
State Accepted
Headers show
Series [1/2] driver_nl80211: fix WMM queue mapping for regulatory limit | expand

Commit Message

Felix Fietkau Jan. 23, 2020, 1:13 p.m. UTC
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>
---
 src/drivers/driver_nl80211_capa.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
index d29ad34caf94..a69c86742dab 100644
--- a/src/drivers/driver_nl80211_capa.c
+++ b/src/drivers/driver_nl80211_capa.c
@@ -1367,6 +1367,18 @@  static int phy_info_edmg_capa(struct hostapd_hw_modes *mode,
 	return NL_OK;
 }
 
+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,
@@ -1475,9 +1487,9 @@  static void phy_info_freq(struct hostapd_hw_modes *mode,
 
 			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 =