|
@@ -421,6 +421,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
|
[NL80211_ATTR_FILS_CACHE_ID] = { .len = 2 },
|
|
[NL80211_ATTR_FILS_CACHE_ID] = { .len = 2 },
|
|
[NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN },
|
|
[NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN },
|
|
[NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG },
|
|
[NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG },
|
|
|
|
+ [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG },
|
|
};
|
|
};
|
|
|
|
|
|
/* policy for the key attributes */
|
|
/* policy for the key attributes */
|
|
@@ -3923,9 +3924,10 @@ static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
|
|
return false;
|
|
return false;
|
|
return true;
|
|
return true;
|
|
case NL80211_CMD_CONNECT:
|
|
case NL80211_CMD_CONNECT:
|
|
- /* SAE not supported yet */
|
|
|
|
- if (auth_type == NL80211_AUTHTYPE_SAE)
|
|
|
|
|
|
+ if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
|
|
|
|
+ auth_type == NL80211_AUTHTYPE_SAE)
|
|
return false;
|
|
return false;
|
|
|
|
+
|
|
/* FILS with SK PFS or PK not supported yet */
|
|
/* FILS with SK PFS or PK not supported yet */
|
|
if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
|
|
if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
|
|
auth_type == NL80211_AUTHTYPE_FILS_PK)
|
|
auth_type == NL80211_AUTHTYPE_FILS_PK)
|
|
@@ -4487,6 +4489,7 @@ static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
|
|
PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc);
|
|
PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc);
|
|
PUT_SINFO_U64(BEACON_RX, rx_beacon);
|
|
PUT_SINFO_U64(BEACON_RX, rx_beacon);
|
|
PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
|
|
PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
|
|
|
|
+ PUT_SINFO(ACK_SIGNAL, ack_signal, u8);
|
|
|
|
|
|
#undef PUT_SINFO
|
|
#undef PUT_SINFO
|
|
#undef PUT_SINFO_U64
|
|
#undef PUT_SINFO_U64
|
|
@@ -5848,7 +5851,6 @@ static int nl80211_get_mesh_config(struct sk_buff *skb,
|
|
return genlmsg_reply(msg, info);
|
|
return genlmsg_reply(msg, info);
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
out:
|
|
out:
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
return -ENOBUFS;
|
|
return -ENOBUFS;
|
|
@@ -6329,7 +6331,6 @@ static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info)
|
|
nla_put_failure_rcu:
|
|
nla_put_failure_rcu:
|
|
rcu_read_unlock();
|
|
rcu_read_unlock();
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
put_failure:
|
|
put_failure:
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
return -EMSGSIZE;
|
|
return -EMSGSIZE;
|
|
@@ -6718,8 +6719,17 @@ nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev,
|
|
|
|
|
|
*flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]);
|
|
*flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]);
|
|
|
|
|
|
- if ((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
|
|
|
|
- !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN))
|
|
|
|
|
|
+ if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
|
|
|
|
+ !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) ||
|
|
|
|
+ ((*flags & NL80211_SCAN_FLAG_LOW_SPAN) &&
|
|
|
|
+ !wiphy_ext_feature_isset(wiphy,
|
|
|
|
+ NL80211_EXT_FEATURE_LOW_SPAN_SCAN)) ||
|
|
|
|
+ ((*flags & NL80211_SCAN_FLAG_LOW_POWER) &&
|
|
|
|
+ !wiphy_ext_feature_isset(wiphy,
|
|
|
|
+ NL80211_EXT_FEATURE_LOW_POWER_SCAN)) ||
|
|
|
|
+ ((*flags & NL80211_SCAN_FLAG_HIGH_ACCURACY) &&
|
|
|
|
+ !wiphy_ext_feature_isset(wiphy,
|
|
|
|
+ NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN)))
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
|
|
|
|
if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
|
|
if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
|
|
@@ -9155,6 +9165,15 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) {
|
|
|
|
+ if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
|
|
|
|
+ GENL_SET_ERR_MSG(info,
|
|
|
|
+ "external auth requires connection ownership");
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+ connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT;
|
|
|
|
+ }
|
|
|
|
+
|
|
wdev_lock(dev->ieee80211_ptr);
|
|
wdev_lock(dev->ieee80211_ptr);
|
|
|
|
|
|
err = cfg80211_connect(rdev, dev, &connect, connkeys,
|
|
err = cfg80211_connect(rdev, dev, &connect, connkeys,
|
|
@@ -12463,6 +12482,41 @@ static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info)
|
|
|
|
+{
|
|
|
|
+ struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
|
|
|
+ struct net_device *dev = info->user_ptr[1];
|
|
|
|
+ struct cfg80211_external_auth_params params;
|
|
|
|
+
|
|
|
|
+ if (!rdev->ops->external_auth)
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+
|
|
|
|
+ if (!info->attrs[NL80211_ATTR_SSID])
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ if (!info->attrs[NL80211_ATTR_BSSID])
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ if (!info->attrs[NL80211_ATTR_STATUS_CODE])
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ memset(¶ms, 0, sizeof(params));
|
|
|
|
+
|
|
|
|
+ params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
|
|
|
|
+ if (params.ssid.ssid_len == 0 ||
|
|
|
|
+ params.ssid.ssid_len > IEEE80211_MAX_SSID_LEN)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ memcpy(params.ssid.ssid, nla_data(info->attrs[NL80211_ATTR_SSID]),
|
|
|
|
+ params.ssid.ssid_len);
|
|
|
|
+
|
|
|
|
+ memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]),
|
|
|
|
+ ETH_ALEN);
|
|
|
|
+
|
|
|
|
+ params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
|
|
|
|
+
|
|
|
|
+ return rdev_external_auth(rdev, dev, ¶ms);
|
|
|
|
+}
|
|
|
|
+
|
|
#define NL80211_FLAG_NEED_WIPHY 0x01
|
|
#define NL80211_FLAG_NEED_WIPHY 0x01
|
|
#define NL80211_FLAG_NEED_NETDEV 0x02
|
|
#define NL80211_FLAG_NEED_NETDEV 0x02
|
|
#define NL80211_FLAG_NEED_RTNL 0x04
|
|
#define NL80211_FLAG_NEED_RTNL 0x04
|
|
@@ -13358,6 +13412,14 @@ static const struct genl_ops nl80211_ops[] = {
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
NL80211_FLAG_NEED_RTNL,
|
|
NL80211_FLAG_NEED_RTNL,
|
|
},
|
|
},
|
|
|
|
+ {
|
|
|
|
+ .cmd = NL80211_CMD_EXTERNAL_AUTH,
|
|
|
|
+ .doit = nl80211_external_auth,
|
|
|
|
+ .policy = nl80211_policy,
|
|
|
|
+ .flags = GENL_ADMIN_PERM,
|
|
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
|
|
+ NL80211_FLAG_NEED_RTNL,
|
|
|
|
+ },
|
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
@@ -13672,7 +13734,6 @@ void nl80211_common_reg_change_event(enum nl80211_commands cmd_id,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -13720,7 +13781,6 @@ static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -13808,7 +13868,6 @@ static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -13884,7 +13943,6 @@ void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -13924,7 +13982,6 @@ void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -13954,7 +14011,6 @@ void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -13991,7 +14047,6 @@ void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -14024,7 +14079,6 @@ void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -14065,7 +14119,6 @@ void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
|
|
EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
|
|
@@ -14104,7 +14157,6 @@ void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -14159,7 +14211,6 @@ void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -14205,7 +14256,6 @@ static void nl80211_send_remain_on_chan_event(
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -14319,7 +14369,6 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_conn_failed);
|
|
EXPORT_SYMBOL(cfg80211_conn_failed);
|
|
@@ -14356,7 +14405,6 @@ static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
|
|
return true;
|
|
return true;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
@@ -14440,7 +14488,6 @@ int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
|
|
return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
|
|
return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
return -ENOBUFS;
|
|
return -ENOBUFS;
|
|
}
|
|
}
|
|
@@ -14484,7 +14531,6 @@ void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
|
|
EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
|
|
@@ -14693,7 +14739,6 @@ static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -14751,7 +14796,6 @@ nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -14804,7 +14848,6 @@ static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -14886,12 +14929,67 @@ nl80211_radar_notify(struct cfg80211_registered_device *rdev,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac,
|
|
|
|
+ struct sta_opmode_info *sta_opmode,
|
|
|
|
+ gfp_t gfp)
|
|
|
|
+{
|
|
|
|
+ struct sk_buff *msg;
|
|
|
|
+ struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
|
|
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
|
|
+ void *hdr;
|
|
|
|
+
|
|
|
|
+ if (WARN_ON(!mac))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
|
|
|
|
+ if (!msg)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED);
|
|
|
|
+ if (!hdr) {
|
|
|
|
+ nlmsg_free(msg);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+
|
|
|
|
+ if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+
|
|
|
|
+ if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+
|
|
|
|
+ if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) &&
|
|
|
|
+ nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode))
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+
|
|
|
|
+ if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) &&
|
|
|
|
+ nla_put_u8(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw))
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+
|
|
|
|
+ if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) &&
|
|
|
|
+ nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss))
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+
|
|
|
|
+ genlmsg_end(msg, hdr);
|
|
|
|
+
|
|
|
|
+ genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
|
|
|
|
+ NL80211_MCGRP_MLME, gfp);
|
|
|
|
+
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+nla_put_failure:
|
|
|
|
+ nlmsg_free(msg);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify);
|
|
|
|
+
|
|
void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
|
|
void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
|
|
- u64 cookie, bool acked, gfp_t gfp)
|
|
|
|
|
|
+ u64 cookie, bool acked, s32 ack_signal,
|
|
|
|
+ bool is_valid_ack_signal, gfp_t gfp)
|
|
{
|
|
{
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
@@ -14916,7 +15014,9 @@ void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
|
|
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
|
|
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
|
|
nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
|
|
nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
|
|
NL80211_ATTR_PAD) ||
|
|
NL80211_ATTR_PAD) ||
|
|
- (acked && nla_put_flag(msg, NL80211_ATTR_ACK)))
|
|
|
|
|
|
+ (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) ||
|
|
|
|
+ (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL,
|
|
|
|
+ ack_signal)))
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
|
|
genlmsg_end(msg, hdr);
|
|
genlmsg_end(msg, hdr);
|
|
@@ -14926,7 +15026,6 @@ void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_probe_status);
|
|
EXPORT_SYMBOL(cfg80211_probe_status);
|
|
@@ -14971,8 +15070,6 @@ void cfg80211_report_obss_beacon(struct wiphy *wiphy,
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
spin_unlock_bh(&rdev->beacon_registrations_lock);
|
|
spin_unlock_bh(&rdev->beacon_registrations_lock);
|
|
- if (hdr)
|
|
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_report_obss_beacon);
|
|
EXPORT_SYMBOL(cfg80211_report_obss_beacon);
|
|
@@ -15188,7 +15285,6 @@ void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_tdls_oper_request);
|
|
EXPORT_SYMBOL(cfg80211_tdls_oper_request);
|
|
@@ -15333,8 +15429,6 @@ void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp)
|
|
return;
|
|
return;
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
- if (hdr)
|
|
|
|
- genlmsg_cancel(msg, hdr);
|
|
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
|
|
EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
|
|
@@ -15369,6 +15463,47 @@ void nl80211_send_ap_stopped(struct wireless_dev *wdev)
|
|
nlmsg_free(msg);
|
|
nlmsg_free(msg);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int cfg80211_external_auth_request(struct net_device *dev,
|
|
|
|
+ struct cfg80211_external_auth_params *params,
|
|
|
|
+ gfp_t gfp)
|
|
|
|
+{
|
|
|
|
+ struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
|
|
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
|
|
+ struct sk_buff *msg;
|
|
|
|
+ void *hdr;
|
|
|
|
+
|
|
|
|
+ if (!wdev->conn_owner_nlportid)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
|
|
|
|
+ if (!msg)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
|
|
+ hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH);
|
|
|
|
+ if (!hdr)
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+
|
|
|
|
+ if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
|
|
|
|
+ nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
|
|
|
|
+ nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) ||
|
|
|
|
+ nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION,
|
|
|
|
+ params->action) ||
|
|
|
|
+ nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) ||
|
|
|
|
+ nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len,
|
|
|
|
+ params->ssid.ssid))
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+
|
|
|
|
+ genlmsg_end(msg, hdr);
|
|
|
|
+ genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
|
|
|
|
+ wdev->conn_owner_nlportid);
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ nla_put_failure:
|
|
|
|
+ nlmsg_free(msg);
|
|
|
|
+ return -ENOBUFS;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(cfg80211_external_auth_request);
|
|
|
|
+
|
|
/* initialisation/exit functions */
|
|
/* initialisation/exit functions */
|
|
|
|
|
|
int __init nl80211_init(void)
|
|
int __init nl80211_init(void)
|