mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
cfg80211: Advertise extended capabilities per interface type to userspace
The driver extended capabilities may differ for different interface types which the userspace needs to know (for example the fine timing measurement initiator and responder bits might differ for a station and AP). Add a new nl80211 attribute to provide extended capabilities per interface type to userspace. Signed-off-by: Vidyullatha Kanchanapally <[email protected]> Reviewed-by: Jouni Malinen <[email protected]> Signed-off-by: Johannes Berg <[email protected]>
This commit is contained in:
parent
bf1ecd2105
commit
019ae3a918
4 changed files with 106 additions and 2 deletions
|
|
@ -750,6 +750,36 @@ int wiphy_register(struct wiphy *wiphy)
|
|||
nl80211_send_reg_change_event(&request);
|
||||
}
|
||||
|
||||
/* Check that nobody globally advertises any capabilities they do not
|
||||
* advertise on all possible interface types.
|
||||
*/
|
||||
if (wiphy->extended_capabilities_len &&
|
||||
wiphy->num_iftype_ext_capab &&
|
||||
wiphy->iftype_ext_capab) {
|
||||
u8 supported_on_all, j;
|
||||
const struct wiphy_iftype_ext_capab *capab;
|
||||
|
||||
capab = wiphy->iftype_ext_capab;
|
||||
for (j = 0; j < wiphy->extended_capabilities_len; j++) {
|
||||
if (capab[0].extended_capabilities_len > j)
|
||||
supported_on_all =
|
||||
capab[0].extended_capabilities[j];
|
||||
else
|
||||
supported_on_all = 0x00;
|
||||
for (i = 1; i < wiphy->num_iftype_ext_capab; i++) {
|
||||
if (j >= capab[i].extended_capabilities_len) {
|
||||
supported_on_all = 0x00;
|
||||
break;
|
||||
}
|
||||
supported_on_all &=
|
||||
capab[i].extended_capabilities[j];
|
||||
}
|
||||
if (WARN_ON(wiphy->extended_capabilities[j] &
|
||||
~supported_on_all))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
rdev->wiphy.registered = true;
|
||||
rtnl_unlock();
|
||||
|
||||
|
|
|
|||
|
|
@ -1264,7 +1264,7 @@ nl80211_send_mgmt_stypes(struct sk_buff *msg,
|
|||
struct nl80211_dump_wiphy_state {
|
||||
s64 filter_wiphy;
|
||||
long start;
|
||||
long split_start, band_start, chan_start;
|
||||
long split_start, band_start, chan_start, capa_start;
|
||||
bool split;
|
||||
};
|
||||
|
||||
|
|
@ -1761,6 +1761,47 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
|
|||
nla_nest_end(msg, nested);
|
||||
}
|
||||
|
||||
state->split_start++;
|
||||
break;
|
||||
case 13:
|
||||
if (rdev->wiphy.num_iftype_ext_capab &&
|
||||
rdev->wiphy.iftype_ext_capab) {
|
||||
struct nlattr *nested_ext_capab, *nested;
|
||||
|
||||
nested = nla_nest_start(msg,
|
||||
NL80211_ATTR_IFTYPE_EXT_CAPA);
|
||||
if (!nested)
|
||||
goto nla_put_failure;
|
||||
|
||||
for (i = state->capa_start;
|
||||
i < rdev->wiphy.num_iftype_ext_capab; i++) {
|
||||
const struct wiphy_iftype_ext_capab *capab;
|
||||
|
||||
capab = &rdev->wiphy.iftype_ext_capab[i];
|
||||
|
||||
nested_ext_capab = nla_nest_start(msg, i);
|
||||
if (!nested_ext_capab ||
|
||||
nla_put_u32(msg, NL80211_ATTR_IFTYPE,
|
||||
capab->iftype) ||
|
||||
nla_put(msg, NL80211_ATTR_EXT_CAPA,
|
||||
capab->extended_capabilities_len,
|
||||
capab->extended_capabilities) ||
|
||||
nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
|
||||
capab->extended_capabilities_len,
|
||||
capab->extended_capabilities_mask))
|
||||
goto nla_put_failure;
|
||||
|
||||
nla_nest_end(msg, nested_ext_capab);
|
||||
if (state->split)
|
||||
break;
|
||||
}
|
||||
nla_nest_end(msg, nested);
|
||||
if (i < rdev->wiphy.num_iftype_ext_capab) {
|
||||
state->capa_start = i + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* done */
|
||||
state->split_start = 0;
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in a new issue