mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
nl80211: fix beacon tx rate mask validation
While adding HE MCS beacon tx rate support, it is observed that legacy beacon tx rate in VHT hwsim test suite is failed. Whenever the application doesn't explicitly set VHT/MCS rate attribute in fixed rate command, by default all HE MCS masks are enabled in cfg80211. In beacon fixed rate, more than one rate mask is not allowed. Fix that by not setting all rate mask by default in case of beacon tx rate. Signed-off-by: Rajkumar Manoharan <rmanohar@codeaurora.org> Link: https://lore.kernel.org/r/1602879327-29488-1-git-send-email-rmanohar@codeaurora.org Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
ba5c25236b
commit
857b34c4fb
1 changed files with 10 additions and 5 deletions
|
@ -4597,7 +4597,8 @@ static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
|
||||||
struct nlattr *attrs[],
|
struct nlattr *attrs[],
|
||||||
enum nl80211_attrs attr,
|
enum nl80211_attrs attr,
|
||||||
struct cfg80211_bitrate_mask *mask,
|
struct cfg80211_bitrate_mask *mask,
|
||||||
struct net_device *dev)
|
struct net_device *dev,
|
||||||
|
bool default_all_enabled)
|
||||||
{
|
{
|
||||||
struct nlattr *tb[NL80211_TXRATE_MAX + 1];
|
struct nlattr *tb[NL80211_TXRATE_MAX + 1];
|
||||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||||
|
@ -4612,6 +4613,9 @@ static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
|
||||||
for (i = 0; i < NUM_NL80211_BANDS; i++) {
|
for (i = 0; i < NUM_NL80211_BANDS; i++) {
|
||||||
const struct ieee80211_sta_he_cap *he_cap;
|
const struct ieee80211_sta_he_cap *he_cap;
|
||||||
|
|
||||||
|
if (!default_all_enabled)
|
||||||
|
break;
|
||||||
|
|
||||||
sband = rdev->wiphy.bands[i];
|
sband = rdev->wiphy.bands[i];
|
||||||
|
|
||||||
if (!sband)
|
if (!sband)
|
||||||
|
@ -5246,7 +5250,7 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
|
||||||
err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
|
err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
|
||||||
NL80211_ATTR_TX_RATES,
|
NL80211_ATTR_TX_RATES,
|
||||||
¶ms.beacon_rate,
|
¶ms.beacon_rate,
|
||||||
dev);
|
dev, false);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -11096,7 +11100,7 @@ static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
|
||||||
|
|
||||||
err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
|
err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
|
||||||
NL80211_ATTR_TX_RATES, &mask,
|
NL80211_ATTR_TX_RATES, &mask,
|
||||||
dev);
|
dev, true);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -11705,7 +11709,7 @@ static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
|
||||||
err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
|
err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
|
||||||
NL80211_ATTR_TX_RATES,
|
NL80211_ATTR_TX_RATES,
|
||||||
&setup.beacon_rate,
|
&setup.beacon_rate,
|
||||||
dev);
|
dev, false);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -14485,7 +14489,8 @@ static int parse_tid_conf(struct cfg80211_registered_device *rdev,
|
||||||
if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) {
|
if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) {
|
||||||
attr = NL80211_TID_CONFIG_ATTR_TX_RATE;
|
attr = NL80211_TID_CONFIG_ATTR_TX_RATE;
|
||||||
err = nl80211_parse_tx_bitrate_mask(info, attrs, attr,
|
err = nl80211_parse_tx_bitrate_mask(info, attrs, attr,
|
||||||
&tid_conf->txrate_mask, dev);
|
&tid_conf->txrate_mask, dev,
|
||||||
|
true);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue