cfg80211/mac80211: improve ad-hoc multicast rate handling
- store the multicast rate as an index instead of the rate value (reduces cpu overhead in a hotpath) - validate the rate values (must match a bitrate in at least one sband) Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:

committed by
John W. Linville

parent
46090979a5
commit
dd5b4cc71c
@@ -3600,6 +3600,34 @@ static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
|
||||
local_state_change);
|
||||
}
|
||||
|
||||
static bool
|
||||
nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev,
|
||||
int mcast_rate[IEEE80211_NUM_BANDS],
|
||||
int rateval)
|
||||
{
|
||||
struct wiphy *wiphy = &rdev->wiphy;
|
||||
bool found = false;
|
||||
int band, i;
|
||||
|
||||
for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
||||
sband = wiphy->bands[band];
|
||||
if (!sband)
|
||||
continue;
|
||||
|
||||
for (i = 0; i < sband->n_bitrates; i++) {
|
||||
if (sband->bitrates[i].bitrate == rateval) {
|
||||
mcast_rate[band] = i + 1;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
@@ -3683,9 +3711,11 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
if (info->attrs[NL80211_ATTR_MCAST_RATE])
|
||||
ibss.mcast_rate =
|
||||
nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
|
||||
|
||||
if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
|
||||
!nl80211_parse_mcast_rate(rdev, ibss.mcast_rate,
|
||||
nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
|
||||
return -EINVAL;
|
||||
|
||||
if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
|
||||
connkeys = nl80211_parse_connkeys(rdev,
|
||||
|
Reference in New Issue
Block a user