nl80211: support P2P GO powersave configuration
If a driver supports P2P GO powersave, allow it to set the new feature flags for it and allow userspace to configure the parameters for it. This can be done at GO startup and later changed with SET_BSS. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
@@ -363,6 +363,8 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
|
||||
[NL80211_ATTR_SAE_DATA] = { .type = NLA_BINARY, },
|
||||
[NL80211_ATTR_VHT_CAPABILITY] = { .len = NL80211_VHT_CAPABILITY_LEN },
|
||||
[NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
|
||||
[NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 },
|
||||
[NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 },
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
@@ -2702,6 +2704,32 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
|
||||
info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]);
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
|
||||
if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
|
||||
return -EINVAL;
|
||||
params.p2p_ctwindow =
|
||||
nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
|
||||
if (params.p2p_ctwindow > 127)
|
||||
return -EINVAL;
|
||||
if (params.p2p_ctwindow != 0 &&
|
||||
!(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
|
||||
u8 tmp;
|
||||
|
||||
if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
|
||||
return -EINVAL;
|
||||
tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
|
||||
if (tmp > 1)
|
||||
return -EINVAL;
|
||||
params.p2p_opp_ps = tmp;
|
||||
if (params.p2p_opp_ps != 0 &&
|
||||
!(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
|
||||
err = nl80211_parse_chandef(rdev, info, ¶ms.chandef);
|
||||
if (err)
|
||||
@@ -3668,6 +3696,8 @@ static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
|
||||
params.use_short_slot_time = -1;
|
||||
params.ap_isolate = -1;
|
||||
params.ht_opmode = -1;
|
||||
params.p2p_ctwindow = -1;
|
||||
params.p2p_opp_ps = -1;
|
||||
|
||||
if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
|
||||
params.use_cts_prot =
|
||||
@@ -3690,6 +3720,32 @@ static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
|
||||
params.ht_opmode =
|
||||
nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]);
|
||||
|
||||
if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
|
||||
if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
|
||||
return -EINVAL;
|
||||
params.p2p_ctwindow =
|
||||
nla_get_s8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
|
||||
if (params.p2p_ctwindow < 0)
|
||||
return -EINVAL;
|
||||
if (params.p2p_ctwindow != 0 &&
|
||||
!(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
|
||||
u8 tmp;
|
||||
|
||||
if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
|
||||
return -EINVAL;
|
||||
tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
|
||||
if (tmp > 1)
|
||||
return -EINVAL;
|
||||
params.p2p_opp_ps = tmp;
|
||||
if (params.p2p_opp_ps &&
|
||||
!(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!rdev->ops->change_bss)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
|
Reference in New Issue
Block a user