@@ -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 =
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(-)