mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
cfg80211: allow userspace to specify client P2P PS support
Legacy clients don't support P2P power save mechanisms, and thus if a P2P GO has a legacy client connected to it, it has to make some changes in the PS behavior. To handle this, add an attribute to specify whether a station supports P2P PS or not. If the attribute was not specified cfg80211 will assume that station supports it for P2P GO interface, and does NOT support it for AP interface, matching the current assumptions in the code. Signed-off-by: Ayala Beker <[email protected]> Signed-off-by: Emmanuel Grumbach <[email protected]> Signed-off-by: Johannes Berg <[email protected]>
This commit is contained in:
parent
b100e5d622
commit
17b9424786
3 changed files with 55 additions and 0 deletions
|
|
@ -403,6 +403,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
|||
[NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG },
|
||||
[NL80211_ATTR_PBSS] = { .type = NLA_FLAG },
|
||||
[NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED },
|
||||
[NL80211_ATTR_STA_SUPPORT_P2P_PS] = { .type = NLA_U8 },
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
|
|
@ -4006,6 +4007,10 @@ int cfg80211_check_station_change(struct wiphy *wiphy,
|
|||
statype != CFG80211_STA_AP_CLIENT_UNASSOC)
|
||||
return -EINVAL;
|
||||
|
||||
if (params->support_p2p_ps != -1 &&
|
||||
statype != CFG80211_STA_AP_CLIENT_UNASSOC)
|
||||
return -EINVAL;
|
||||
|
||||
if (params->aid &&
|
||||
!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) &&
|
||||
statype != CFG80211_STA_AP_CLIENT_UNASSOC)
|
||||
|
|
@ -4299,6 +4304,18 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
|
|||
else
|
||||
params.listen_interval = -1;
|
||||
|
||||
if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
|
||||
u8 tmp;
|
||||
|
||||
tmp = nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
|
||||
if (tmp >= NUM_NL80211_P2P_PS_STATUS)
|
||||
return -EINVAL;
|
||||
|
||||
params.support_p2p_ps = tmp;
|
||||
} else {
|
||||
params.support_p2p_ps = -1;
|
||||
}
|
||||
|
||||
if (!info->attrs[NL80211_ATTR_MAC])
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -4422,6 +4439,23 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
|
|||
params.listen_interval =
|
||||
nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
|
||||
|
||||
if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
|
||||
u8 tmp;
|
||||
|
||||
tmp = nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
|
||||
if (tmp >= NUM_NL80211_P2P_PS_STATUS)
|
||||
return -EINVAL;
|
||||
|
||||
params.support_p2p_ps = tmp;
|
||||
} else {
|
||||
/*
|
||||
* if not specified, assume it's supported for P2P GO interface,
|
||||
* and is NOT supported for AP interface
|
||||
*/
|
||||
params.support_p2p_ps =
|
||||
dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO;
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_PEER_AID])
|
||||
params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
|
||||
else
|
||||
|
|
|
|||
Loading…
Reference in a new issue