diff options
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/nl80211.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index eb4437fa0539..dc96077afe5e 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -4550,6 +4550,9 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) | |||
4550 | 4550 | ||
4551 | nl80211_calculate_ap_params(¶ms); | 4551 | nl80211_calculate_ap_params(¶ms); |
4552 | 4552 | ||
4553 | if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) | ||
4554 | params.flags |= AP_SETTINGS_EXTERNAL_AUTH_SUPPORT; | ||
4555 | |||
4553 | wdev_lock(wdev); | 4556 | wdev_lock(wdev); |
4554 | err = rdev_start_ap(rdev, dev, ¶ms); | 4557 | err = rdev_start_ap(rdev, dev, ¶ms); |
4555 | if (!err) { | 4558 | if (!err) { |
@@ -13086,7 +13089,9 @@ static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info) | |||
13086 | if (!rdev->ops->external_auth) | 13089 | if (!rdev->ops->external_auth) |
13087 | return -EOPNOTSUPP; | 13090 | return -EOPNOTSUPP; |
13088 | 13091 | ||
13089 | if (!info->attrs[NL80211_ATTR_SSID]) | 13092 | if (!info->attrs[NL80211_ATTR_SSID] && |
13093 | dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && | ||
13094 | dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) | ||
13090 | return -EINVAL; | 13095 | return -EINVAL; |
13091 | 13096 | ||
13092 | if (!info->attrs[NL80211_ATTR_BSSID]) | 13097 | if (!info->attrs[NL80211_ATTR_BSSID]) |
@@ -13097,18 +13102,24 @@ static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info) | |||
13097 | 13102 | ||
13098 | memset(¶ms, 0, sizeof(params)); | 13103 | memset(¶ms, 0, sizeof(params)); |
13099 | 13104 | ||
13100 | params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); | 13105 | if (info->attrs[NL80211_ATTR_SSID]) { |
13101 | if (params.ssid.ssid_len == 0 || | 13106 | params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); |
13102 | params.ssid.ssid_len > IEEE80211_MAX_SSID_LEN) | 13107 | if (params.ssid.ssid_len == 0 || |
13103 | return -EINVAL; | 13108 | params.ssid.ssid_len > IEEE80211_MAX_SSID_LEN) |
13104 | memcpy(params.ssid.ssid, nla_data(info->attrs[NL80211_ATTR_SSID]), | 13109 | return -EINVAL; |
13105 | params.ssid.ssid_len); | 13110 | memcpy(params.ssid.ssid, |
13111 | nla_data(info->attrs[NL80211_ATTR_SSID]), | ||
13112 | params.ssid.ssid_len); | ||
13113 | } | ||
13106 | 13114 | ||
13107 | memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), | 13115 | memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), |
13108 | ETH_ALEN); | 13116 | ETH_ALEN); |
13109 | 13117 | ||
13110 | params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); | 13118 | params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); |
13111 | 13119 | ||
13120 | if (info->attrs[NL80211_ATTR_PMKID]) | ||
13121 | params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); | ||
13122 | |||
13112 | return rdev_external_auth(rdev, dev, ¶ms); | 13123 | return rdev_external_auth(rdev, dev, ¶ms); |
13113 | } | 13124 | } |
13114 | 13125 | ||