|
@@ -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;
|
|
|
|