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.
Fixes: 636c02c6e9
("nl80211: Add regulatory wmm_limit to hostapd_channel_data")
Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
bc1289b076
commit
d240c74b6a
1 changed files with 18 additions and 2 deletions
|
@ -1368,6 +1368,20 @@ static int phy_info_edmg_capa(struct hostapd_hw_modes *mode,
|
|||
}
|
||||
|
||||
|
||||
static 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,
|
||||
struct nlattr *tb_freq[])
|
||||
|
@ -1475,9 +1489,11 @@ 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 =
|
||||
|
|
Loading…
Reference in a new issue