diff options
author | Denis Kenzior <denkenz@gmail.com> | 2018-03-26 13:52:43 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2018-03-29 07:45:04 -0400 |
commit | 64bf3d4bc2b0725b3c5ffadd982a9746bfc738b7 (patch) | |
tree | 2e673641d4a1f00b79f82cf506fd24dc1f5b24a2 /net/wireless | |
parent | 2576a9ace47eba28a682d249d1d6402f891808c9 (diff) |
nl80211: Add CONTROL_PORT_OVER_NL80211 attribute
Signed-off-by: Denis Kenzior <denkenz@gmail.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/nl80211.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 6eb286784924..d3b14d9d002a 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -287,6 +287,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { | |||
287 | [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG }, | 287 | [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG }, |
288 | [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 }, | 288 | [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 }, |
289 | [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, | 289 | [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, |
290 | [NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG }, | ||
290 | [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, | 291 | [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, |
291 | [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, | 292 | [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, |
292 | [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, | 293 | [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, |
@@ -8211,6 +8212,22 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) | |||
8211 | return err; | 8212 | return err; |
8212 | } | 8213 | } |
8213 | 8214 | ||
8215 | static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev, | ||
8216 | struct genl_info *info) | ||
8217 | { | ||
8218 | if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { | ||
8219 | GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set"); | ||
8220 | return -EINVAL; | ||
8221 | } | ||
8222 | |||
8223 | if (!rdev->ops->tx_control_port || | ||
8224 | !wiphy_ext_feature_isset(&rdev->wiphy, | ||
8225 | NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) | ||
8226 | return -EOPNOTSUPP; | ||
8227 | |||
8228 | return 0; | ||
8229 | } | ||
8230 | |||
8214 | static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, | 8231 | static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, |
8215 | struct genl_info *info, | 8232 | struct genl_info *info, |
8216 | struct cfg80211_crypto_settings *settings, | 8233 | struct cfg80211_crypto_settings *settings, |
@@ -8234,6 +8251,15 @@ static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, | |||
8234 | } else | 8251 | } else |
8235 | settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); | 8252 | settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); |
8236 | 8253 | ||
8254 | if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { | ||
8255 | int r = validate_pae_over_nl80211(rdev, info); | ||
8256 | |||
8257 | if (r < 0) | ||
8258 | return r; | ||
8259 | |||
8260 | settings->control_port_over_nl80211 = true; | ||
8261 | } | ||
8262 | |||
8237 | if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { | 8263 | if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { |
8238 | void *data; | 8264 | void *data; |
8239 | int len, i; | 8265 | int len, i; |