summaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2018-03-26 13:52:43 -0400
committerJohannes Berg <johannes.berg@intel.com>2018-03-29 07:45:04 -0400
commit64bf3d4bc2b0725b3c5ffadd982a9746bfc738b7 (patch)
tree2e673641d4a1f00b79f82cf506fd24dc1f5b24a2 /net/wireless
parent2576a9ace47eba28a682d249d1d6402f891808c9 (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.c26
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
8215static 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
8214static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 8231static 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;