1 // SPDX-License-Identifier: GPL-2.0-only
3 * This is the new netlink-based wireless configuration interface.
5 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
6 * Copyright 2013-2014 Intel Mobile Communications GmbH
7 * Copyright 2015-2017 Intel Deutschland GmbH
8 * Copyright (C) 2018-2022 Intel Corporation
12 #include <linux/module.h>
13 #include <linux/err.h>
14 #include <linux/slab.h>
15 #include <linux/list.h>
16 #include <linux/if_ether.h>
17 #include <linux/ieee80211.h>
18 #include <linux/nl80211.h>
19 #include <linux/rtnetlink.h>
20 #include <linux/netlink.h>
21 #include <linux/nospec.h>
22 #include <linux/etherdevice.h>
23 #include <linux/if_vlan.h>
24 #include <net/net_namespace.h>
25 #include <net/genetlink.h>
26 #include <net/cfg80211.h>
28 #include <net/inet_connection_sock.h>
34 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
35 struct genl_info *info,
36 struct cfg80211_crypto_settings *settings,
39 /* the netlink family */
40 static struct genl_family nl80211_fam;
42 /* multicast groups */
43 enum nl80211_multicast_groups {
46 NL80211_MCGRP_REGULATORY,
50 NL80211_MCGRP_TESTMODE /* keep last - ifdef! */
53 static const struct genl_multicast_group nl80211_mcgrps[] = {
54 [NL80211_MCGRP_CONFIG] = { .name = NL80211_MULTICAST_GROUP_CONFIG },
55 [NL80211_MCGRP_SCAN] = { .name = NL80211_MULTICAST_GROUP_SCAN },
56 [NL80211_MCGRP_REGULATORY] = { .name = NL80211_MULTICAST_GROUP_REG },
57 [NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME },
58 [NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR },
59 [NL80211_MCGRP_NAN] = { .name = NL80211_MULTICAST_GROUP_NAN },
60 #ifdef CONFIG_NL80211_TESTMODE
61 [NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE }
65 /* returns ERR_PTR values */
66 static struct wireless_dev *
67 __cfg80211_wdev_from_attrs(struct cfg80211_registered_device *rdev,
68 struct net *netns, struct nlattr **attrs)
70 struct wireless_dev *result = NULL;
71 bool have_ifidx = attrs[NL80211_ATTR_IFINDEX];
72 bool have_wdev_id = attrs[NL80211_ATTR_WDEV];
77 if (!have_ifidx && !have_wdev_id)
78 return ERR_PTR(-EINVAL);
81 ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
83 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
84 wiphy_idx = wdev_id >> 32;
88 struct wireless_dev *wdev;
90 lockdep_assert_held(&rdev->wiphy.mtx);
92 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
93 if (have_ifidx && wdev->netdev &&
94 wdev->netdev->ifindex == ifidx) {
98 if (have_wdev_id && wdev->identifier == (u32)wdev_id) {
104 return result ?: ERR_PTR(-ENODEV);
109 list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
110 struct wireless_dev *wdev;
112 if (wiphy_net(&rdev->wiphy) != netns)
115 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx)
118 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
119 if (have_ifidx && wdev->netdev &&
120 wdev->netdev->ifindex == ifidx) {
124 if (have_wdev_id && wdev->identifier == (u32)wdev_id) {
136 return ERR_PTR(-ENODEV);
139 static struct cfg80211_registered_device *
140 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs)
142 struct cfg80211_registered_device *rdev = NULL, *tmp;
143 struct net_device *netdev;
147 if (!attrs[NL80211_ATTR_WIPHY] &&
148 !attrs[NL80211_ATTR_IFINDEX] &&
149 !attrs[NL80211_ATTR_WDEV])
150 return ERR_PTR(-EINVAL);
152 if (attrs[NL80211_ATTR_WIPHY])
153 rdev = cfg80211_rdev_by_wiphy_idx(
154 nla_get_u32(attrs[NL80211_ATTR_WIPHY]));
156 if (attrs[NL80211_ATTR_WDEV]) {
157 u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
158 struct wireless_dev *wdev;
161 tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32);
163 /* make sure wdev exists */
164 list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) {
165 if (wdev->identifier != (u32)wdev_id)
174 if (rdev && tmp != rdev)
175 return ERR_PTR(-EINVAL);
180 if (attrs[NL80211_ATTR_IFINDEX]) {
181 int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
183 netdev = __dev_get_by_index(netns, ifindex);
185 if (netdev->ieee80211_ptr)
187 netdev->ieee80211_ptr->wiphy);
191 /* not wireless device -- return error */
193 return ERR_PTR(-EINVAL);
195 /* mismatch -- return error */
196 if (rdev && tmp != rdev)
197 return ERR_PTR(-EINVAL);
204 return ERR_PTR(-ENODEV);
206 if (netns != wiphy_net(&rdev->wiphy))
207 return ERR_PTR(-ENODEV);
213 * This function returns a pointer to the driver
214 * that the genl_info item that is passed refers to.
216 * The result of this can be a PTR_ERR and hence must
217 * be checked with IS_ERR() for errors.
219 static struct cfg80211_registered_device *
220 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info)
222 return __cfg80211_rdev_from_attrs(netns, info->attrs);
225 static int validate_beacon_head(const struct nlattr *attr,
226 struct netlink_ext_ack *extack)
228 const u8 *data = nla_data(attr);
229 unsigned int len = nla_len(attr);
230 const struct element *elem;
231 const struct ieee80211_mgmt *mgmt = (void *)data;
232 unsigned int fixedlen, hdrlen;
235 if (len < offsetofend(typeof(*mgmt), frame_control))
238 s1g_bcn = ieee80211_is_s1g_beacon(mgmt->frame_control);
240 fixedlen = offsetof(struct ieee80211_ext,
241 u.s1g_beacon.variable);
242 hdrlen = offsetof(struct ieee80211_ext, u.s1g_beacon);
244 fixedlen = offsetof(struct ieee80211_mgmt,
246 hdrlen = offsetof(struct ieee80211_mgmt, u.beacon);
252 if (ieee80211_hdrlen(mgmt->frame_control) != hdrlen)
258 for_each_element(elem, data, len) {
262 if (for_each_element_completed(elem, data, len))
266 NL_SET_ERR_MSG_ATTR(extack, attr, "malformed beacon head");
270 static int validate_ie_attr(const struct nlattr *attr,
271 struct netlink_ext_ack *extack)
273 const u8 *data = nla_data(attr);
274 unsigned int len = nla_len(attr);
275 const struct element *elem;
277 for_each_element(elem, data, len) {
281 if (for_each_element_completed(elem, data, len))
284 NL_SET_ERR_MSG_ATTR(extack, attr, "malformed information elements");
288 static int validate_he_capa(const struct nlattr *attr,
289 struct netlink_ext_ack *extack)
291 if (!ieee80211_he_capa_size_ok(nla_data(attr), nla_len(attr)))
297 /* policy for the attributes */
298 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR];
300 static const struct nla_policy
301 nl80211_ftm_responder_policy[NL80211_FTM_RESP_ATTR_MAX + 1] = {
302 [NL80211_FTM_RESP_ATTR_ENABLED] = { .type = NLA_FLAG, },
303 [NL80211_FTM_RESP_ATTR_LCI] = { .type = NLA_BINARY,
305 [NL80211_FTM_RESP_ATTR_CIVICLOC] = { .type = NLA_BINARY,
309 static const struct nla_policy
310 nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX + 1] = {
311 [NL80211_PMSR_FTM_REQ_ATTR_ASAP] = { .type = NLA_FLAG },
312 [NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE] = { .type = NLA_U32 },
313 [NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP] =
314 NLA_POLICY_MAX(NLA_U8, 15),
315 [NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD] = { .type = NLA_U16 },
316 [NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION] =
317 NLA_POLICY_MAX(NLA_U8, 15),
318 [NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST] =
319 NLA_POLICY_MAX(NLA_U8, 31),
320 [NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES] = { .type = NLA_U8 },
321 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI] = { .type = NLA_FLAG },
322 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG },
323 [NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED] = { .type = NLA_FLAG },
324 [NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED] = { .type = NLA_FLAG },
325 [NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK] = { .type = NLA_FLAG },
328 static const struct nla_policy
329 nl80211_pmsr_req_data_policy[NL80211_PMSR_TYPE_MAX + 1] = {
330 [NL80211_PMSR_TYPE_FTM] =
331 NLA_POLICY_NESTED(nl80211_pmsr_ftm_req_attr_policy),
334 static const struct nla_policy
335 nl80211_pmsr_req_attr_policy[NL80211_PMSR_REQ_ATTR_MAX + 1] = {
336 [NL80211_PMSR_REQ_ATTR_DATA] =
337 NLA_POLICY_NESTED(nl80211_pmsr_req_data_policy),
338 [NL80211_PMSR_REQ_ATTR_GET_AP_TSF] = { .type = NLA_FLAG },
341 static const struct nla_policy
342 nl80211_pmsr_peer_attr_policy[NL80211_PMSR_PEER_ATTR_MAX + 1] = {
343 [NL80211_PMSR_PEER_ATTR_ADDR] = NLA_POLICY_ETH_ADDR,
344 [NL80211_PMSR_PEER_ATTR_CHAN] = NLA_POLICY_NESTED(nl80211_policy),
345 [NL80211_PMSR_PEER_ATTR_REQ] =
346 NLA_POLICY_NESTED(nl80211_pmsr_req_attr_policy),
347 [NL80211_PMSR_PEER_ATTR_RESP] = { .type = NLA_REJECT },
350 static const struct nla_policy
351 nl80211_pmsr_attr_policy[NL80211_PMSR_ATTR_MAX + 1] = {
352 [NL80211_PMSR_ATTR_MAX_PEERS] = { .type = NLA_REJECT },
353 [NL80211_PMSR_ATTR_REPORT_AP_TSF] = { .type = NLA_REJECT },
354 [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR] = { .type = NLA_REJECT },
355 [NL80211_PMSR_ATTR_TYPE_CAPA] = { .type = NLA_REJECT },
356 [NL80211_PMSR_ATTR_PEERS] =
357 NLA_POLICY_NESTED_ARRAY(nl80211_pmsr_peer_attr_policy),
360 static const struct nla_policy
361 he_obss_pd_policy[NL80211_HE_OBSS_PD_ATTR_MAX + 1] = {
362 [NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET] =
363 NLA_POLICY_RANGE(NLA_U8, 1, 20),
364 [NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET] =
365 NLA_POLICY_RANGE(NLA_U8, 1, 20),
366 [NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET] =
367 NLA_POLICY_RANGE(NLA_U8, 1, 20),
368 [NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP] =
369 NLA_POLICY_EXACT_LEN(8),
370 [NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP] =
371 NLA_POLICY_EXACT_LEN(8),
372 [NL80211_HE_OBSS_PD_ATTR_SR_CTRL] = { .type = NLA_U8 },
375 static const struct nla_policy
376 he_bss_color_policy[NL80211_HE_BSS_COLOR_ATTR_MAX + 1] = {
377 [NL80211_HE_BSS_COLOR_ATTR_COLOR] = NLA_POLICY_RANGE(NLA_U8, 1, 63),
378 [NL80211_HE_BSS_COLOR_ATTR_DISABLED] = { .type = NLA_FLAG },
379 [NL80211_HE_BSS_COLOR_ATTR_PARTIAL] = { .type = NLA_FLAG },
382 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
383 [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY,
384 .len = NL80211_MAX_SUPP_RATES },
385 [NL80211_TXRATE_HT] = { .type = NLA_BINARY,
386 .len = NL80211_MAX_SUPP_HT_RATES },
387 [NL80211_TXRATE_VHT] = NLA_POLICY_EXACT_LEN_WARN(sizeof(struct nl80211_txrate_vht)),
388 [NL80211_TXRATE_GI] = { .type = NLA_U8 },
389 [NL80211_TXRATE_HE] = NLA_POLICY_EXACT_LEN(sizeof(struct nl80211_txrate_he)),
390 [NL80211_TXRATE_HE_GI] = NLA_POLICY_RANGE(NLA_U8,
391 NL80211_RATE_INFO_HE_GI_0_8,
392 NL80211_RATE_INFO_HE_GI_3_2),
393 [NL80211_TXRATE_HE_LTF] = NLA_POLICY_RANGE(NLA_U8,
394 NL80211_RATE_INFO_HE_1XLTF,
395 NL80211_RATE_INFO_HE_4XLTF),
398 static const struct nla_policy
399 nl80211_tid_config_attr_policy[NL80211_TID_CONFIG_ATTR_MAX + 1] = {
400 [NL80211_TID_CONFIG_ATTR_VIF_SUPP] = { .type = NLA_U64 },
401 [NL80211_TID_CONFIG_ATTR_PEER_SUPP] = { .type = NLA_U64 },
402 [NL80211_TID_CONFIG_ATTR_OVERRIDE] = { .type = NLA_FLAG },
403 [NL80211_TID_CONFIG_ATTR_TIDS] = NLA_POLICY_RANGE(NLA_U16, 1, 0xff),
404 [NL80211_TID_CONFIG_ATTR_NOACK] =
405 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE),
406 [NL80211_TID_CONFIG_ATTR_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1),
407 [NL80211_TID_CONFIG_ATTR_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1),
408 [NL80211_TID_CONFIG_ATTR_AMPDU_CTRL] =
409 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE),
410 [NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL] =
411 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE),
412 [NL80211_TID_CONFIG_ATTR_AMSDU_CTRL] =
413 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE),
414 [NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE] =
415 NLA_POLICY_MAX(NLA_U8, NL80211_TX_RATE_FIXED),
416 [NL80211_TID_CONFIG_ATTR_TX_RATE] =
417 NLA_POLICY_NESTED(nl80211_txattr_policy),
420 static const struct nla_policy
421 nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = {
422 [NL80211_FILS_DISCOVERY_ATTR_INT_MIN] = NLA_POLICY_MAX(NLA_U32, 10000),
423 [NL80211_FILS_DISCOVERY_ATTR_INT_MAX] = NLA_POLICY_MAX(NLA_U32, 10000),
424 [NL80211_FILS_DISCOVERY_ATTR_TMPL] =
425 NLA_POLICY_RANGE(NLA_BINARY,
426 NL80211_FILS_DISCOVERY_TMPL_MIN_LEN,
427 IEEE80211_MAX_DATA_LEN),
430 static const struct nla_policy
431 nl80211_unsol_bcast_probe_resp_policy[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1] = {
432 [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] = NLA_POLICY_MAX(NLA_U32, 20),
433 [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL] = { .type = NLA_BINARY,
434 .len = IEEE80211_MAX_DATA_LEN }
437 static const struct nla_policy
438 sar_specs_policy[NL80211_SAR_ATTR_SPECS_MAX + 1] = {
439 [NL80211_SAR_ATTR_SPECS_POWER] = { .type = NLA_S32 },
440 [NL80211_SAR_ATTR_SPECS_RANGE_INDEX] = {.type = NLA_U32 },
443 static const struct nla_policy
444 sar_policy[NL80211_SAR_ATTR_MAX + 1] = {
445 [NL80211_SAR_ATTR_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_SAR_TYPE),
446 [NL80211_SAR_ATTR_SPECS] = NLA_POLICY_NESTED_ARRAY(sar_specs_policy),
449 static const struct nla_policy
450 nl80211_mbssid_config_policy[NL80211_MBSSID_CONFIG_ATTR_MAX + 1] = {
451 [NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES] = NLA_POLICY_MIN(NLA_U8, 2),
452 [NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY] =
453 NLA_POLICY_MIN(NLA_U8, 1),
454 [NL80211_MBSSID_CONFIG_ATTR_INDEX] = { .type = NLA_U8 },
455 [NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX] = { .type = NLA_U32 },
456 [NL80211_MBSSID_CONFIG_ATTR_EMA] = { .type = NLA_FLAG },
459 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
460 [0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD },
461 [NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
462 [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
464 [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED },
466 [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 },
467 [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 },
468 [NL80211_ATTR_WIPHY_EDMG_CHANNELS] = NLA_POLICY_RANGE(NLA_U8,
469 NL80211_EDMG_CHANNELS_MIN,
470 NL80211_EDMG_CHANNELS_MAX),
471 [NL80211_ATTR_WIPHY_EDMG_BW_CONFIG] = NLA_POLICY_RANGE(NLA_U8,
472 NL80211_EDMG_BW_CONFIG_MIN,
473 NL80211_EDMG_BW_CONFIG_MAX),
475 [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 },
476 [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 },
477 [NL80211_ATTR_CENTER_FREQ1_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999),
478 [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 },
480 [NL80211_ATTR_WIPHY_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1),
481 [NL80211_ATTR_WIPHY_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1),
482 [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 },
483 [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 },
484 [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 },
485 [NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG },
487 [NL80211_ATTR_IFTYPE] = NLA_POLICY_MAX(NLA_U32, NL80211_IFTYPE_MAX),
488 [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
489 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
491 [NL80211_ATTR_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
492 [NL80211_ATTR_PREV_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
494 [NL80211_ATTR_KEY] = { .type = NLA_NESTED, },
495 [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
496 .len = WLAN_MAX_KEY_LEN },
497 [NL80211_ATTR_KEY_IDX] = NLA_POLICY_MAX(NLA_U8, 7),
498 [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 },
499 [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG },
500 [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
501 [NL80211_ATTR_KEY_TYPE] =
502 NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES),
504 [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 },
505 [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 },
506 [NL80211_ATTR_BEACON_HEAD] =
507 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head,
508 IEEE80211_MAX_DATA_LEN),
509 [NL80211_ATTR_BEACON_TAIL] =
510 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
511 IEEE80211_MAX_DATA_LEN),
512 [NL80211_ATTR_STA_AID] =
513 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
514 [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED },
515 [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 },
516 [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY,
517 .len = NL80211_MAX_SUPP_RATES },
518 [NL80211_ATTR_STA_PLINK_ACTION] =
519 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1),
520 [NL80211_ATTR_STA_TX_POWER_SETTING] =
521 NLA_POLICY_RANGE(NLA_U8,
522 NL80211_TX_POWER_AUTOMATIC,
523 NL80211_TX_POWER_FIXED),
524 [NL80211_ATTR_STA_TX_POWER] = { .type = NLA_S16 },
525 [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 },
526 [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
527 [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
528 .len = IEEE80211_MAX_MESH_ID_LEN },
529 [NL80211_ATTR_MPATH_NEXT_HOP] = NLA_POLICY_ETH_ADDR_COMPAT,
531 [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 },
532 [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
534 [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
535 [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
536 [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
537 [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY,
538 .len = NL80211_MAX_SUPP_RATES },
539 [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 },
541 [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED },
542 [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG },
544 [NL80211_ATTR_HT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_HT_CAPABILITY_LEN),
546 [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
547 [NL80211_ATTR_IE] = NLA_POLICY_VALIDATE_FN(NLA_BINARY,
549 IEEE80211_MAX_DATA_LEN),
550 [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
551 [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
553 [NL80211_ATTR_SSID] = { .type = NLA_BINARY,
554 .len = IEEE80211_MAX_SSID_LEN },
555 [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
556 [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
557 [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
558 [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
559 [NL80211_ATTR_USE_MFP] = NLA_POLICY_RANGE(NLA_U32,
561 NL80211_MFP_OPTIONAL),
562 [NL80211_ATTR_STA_FLAGS2] = {
563 .len = sizeof(struct nl80211_sta_flag_update),
565 [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
566 [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 },
567 [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG },
568 [NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG },
569 [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG },
570 [NL80211_ATTR_STATUS_CODE] = { .type = NLA_U16 },
571 [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 },
572 [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 },
573 [NL80211_ATTR_PID] = { .type = NLA_U32 },
574 [NL80211_ATTR_4ADDR] = { .type = NLA_U8 },
575 [NL80211_ATTR_PMKID] = NLA_POLICY_EXACT_LEN_WARN(WLAN_PMKID_LEN),
576 [NL80211_ATTR_DURATION] = { .type = NLA_U32 },
577 [NL80211_ATTR_COOKIE] = { .type = NLA_U64 },
578 [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED },
579 [NL80211_ATTR_FRAME] = { .type = NLA_BINARY,
580 .len = IEEE80211_MAX_DATA_LEN },
581 [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, },
582 [NL80211_ATTR_PS_STATE] = NLA_POLICY_RANGE(NLA_U32,
585 [NL80211_ATTR_CQM] = { .type = NLA_NESTED, },
586 [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG },
587 [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 },
588 [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
589 [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
590 [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
591 [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 },
592 [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 },
593 [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 },
594 [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG },
595 [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
596 [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED },
597 [NL80211_ATTR_STA_PLINK_STATE] =
598 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1),
599 [NL80211_ATTR_MEASUREMENT_DURATION] = { .type = NLA_U16 },
600 [NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY] = { .type = NLA_FLAG },
601 [NL80211_ATTR_MESH_PEER_AID] =
602 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
603 [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 },
604 [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED },
605 [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED },
606 [NL80211_ATTR_HIDDEN_SSID] =
607 NLA_POLICY_RANGE(NLA_U32,
608 NL80211_HIDDEN_SSID_NOT_IN_USE,
609 NL80211_HIDDEN_SSID_ZERO_CONTENTS),
610 [NL80211_ATTR_IE_PROBE_RESP] =
611 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
612 IEEE80211_MAX_DATA_LEN),
613 [NL80211_ATTR_IE_ASSOC_RESP] =
614 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
615 IEEE80211_MAX_DATA_LEN),
616 [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG },
617 [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED },
618 [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG },
619 [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 },
620 [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 },
621 [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 },
622 [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG },
623 [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG },
624 [NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG },
625 [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
626 [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
627 .len = IEEE80211_MAX_DATA_LEN },
628 [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 },
629 [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG },
630 [NL80211_ATTR_HT_CAPABILITY_MASK] = {
631 .len = NL80211_HT_CAPABILITY_LEN
633 [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 },
634 [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 },
635 [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 },
636 [NL80211_ATTR_WDEV] = { .type = NLA_U64 },
637 [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 },
639 /* need to include at least Auth Transaction and Status Code */
640 [NL80211_ATTR_AUTH_DATA] = NLA_POLICY_MIN_LEN(4),
642 [NL80211_ATTR_VHT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_VHT_CAPABILITY_LEN),
643 [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
644 [NL80211_ATTR_P2P_CTWINDOW] = NLA_POLICY_MAX(NLA_U8, 127),
645 [NL80211_ATTR_P2P_OPPPS] = NLA_POLICY_MAX(NLA_U8, 1),
646 [NL80211_ATTR_LOCAL_MESH_POWER_MODE] =
647 NLA_POLICY_RANGE(NLA_U32,
648 NL80211_MESH_POWER_UNKNOWN + 1,
649 NL80211_MESH_POWER_MAX),
650 [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 },
651 [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
652 [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
653 [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, },
654 [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, },
655 [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG },
656 [NL80211_ATTR_VHT_CAPABILITY_MASK] = {
657 .len = NL80211_VHT_CAPABILITY_LEN,
659 [NL80211_ATTR_MDID] = { .type = NLA_U16 },
660 [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
661 .len = IEEE80211_MAX_DATA_LEN },
662 [NL80211_ATTR_CRIT_PROT_ID] = { .type = NLA_U16 },
663 [NL80211_ATTR_MAX_CRIT_PROT_DURATION] =
664 NLA_POLICY_MAX(NLA_U16, NL80211_CRIT_PROTO_MAX_DURATION),
665 [NL80211_ATTR_PEER_AID] =
666 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
667 [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 },
668 [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG },
669 [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
670 [NL80211_ATTR_CNTDWN_OFFS_BEACON] = { .type = NLA_BINARY },
671 [NL80211_ATTR_CNTDWN_OFFS_PRESP] = { .type = NLA_BINARY },
672 [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = NLA_POLICY_MIN_LEN(2),
674 * The value of the Length field of the Supported Operating
675 * Classes element is between 2 and 253.
677 [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] =
678 NLA_POLICY_RANGE(NLA_BINARY, 2, 253),
679 [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG },
680 [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 },
681 [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 },
682 [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 },
683 [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
684 [NL80211_ATTR_QOS_MAP] = NLA_POLICY_RANGE(NLA_BINARY,
685 IEEE80211_QOS_MAP_LEN_MIN,
686 IEEE80211_QOS_MAP_LEN_MAX),
687 [NL80211_ATTR_MAC_HINT] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
688 [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 },
689 [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 },
690 [NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG },
691 [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY },
692 [NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG },
693 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1),
694 [NL80211_ATTR_USER_PRIO] =
695 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1),
696 [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 },
697 [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 },
698 [NL80211_ATTR_OPER_CLASS] = { .type = NLA_U8 },
699 [NL80211_ATTR_MAC_MASK] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
700 [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG },
701 [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 },
702 [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 },
703 [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG },
704 [NL80211_ATTR_PBSS] = { .type = NLA_FLAG },
705 [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED },
706 [NL80211_ATTR_STA_SUPPORT_P2P_PS] =
707 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1),
708 [NL80211_ATTR_MU_MIMO_GROUP_DATA] = {
709 .len = VHT_MUMIMO_GROUPS_DATA_LEN
711 [NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
712 [NL80211_ATTR_NAN_MASTER_PREF] = NLA_POLICY_MIN(NLA_U8, 1),
713 [NL80211_ATTR_BANDS] = { .type = NLA_U32 },
714 [NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED },
715 [NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY,
716 .len = FILS_MAX_KEK_LEN },
717 [NL80211_ATTR_FILS_NONCES] = NLA_POLICY_EXACT_LEN_WARN(2 * FILS_NONCE_LEN),
718 [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, },
719 [NL80211_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
720 [NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 },
721 [NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = {
722 .len = sizeof(struct nl80211_bss_select_rssi_adjust)
724 [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 },
725 [NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY,
726 .len = FILS_ERP_MAX_USERNAME_LEN },
727 [NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY,
728 .len = FILS_ERP_MAX_REALM_LEN },
729 [NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 },
730 [NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY,
731 .len = FILS_ERP_MAX_RRK_LEN },
732 [NL80211_ATTR_FILS_CACHE_ID] = NLA_POLICY_EXACT_LEN_WARN(2),
733 [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN },
734 [NL80211_ATTR_PMKR0_NAME] = NLA_POLICY_EXACT_LEN(WLAN_PMK_NAME_LEN),
735 [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG },
736 [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG },
738 [NL80211_ATTR_TXQ_LIMIT] = { .type = NLA_U32 },
739 [NL80211_ATTR_TXQ_MEMORY_LIMIT] = { .type = NLA_U32 },
740 [NL80211_ATTR_TXQ_QUANTUM] = { .type = NLA_U32 },
741 [NL80211_ATTR_HE_CAPABILITY] =
742 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_he_capa,
743 NL80211_HE_MAX_CAPABILITY_LEN),
744 [NL80211_ATTR_FTM_RESPONDER] =
745 NLA_POLICY_NESTED(nl80211_ftm_responder_policy),
746 [NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1),
747 [NL80211_ATTR_PEER_MEASUREMENTS] =
748 NLA_POLICY_NESTED(nl80211_pmsr_attr_policy),
749 [NL80211_ATTR_AIRTIME_WEIGHT] = NLA_POLICY_MIN(NLA_U16, 1),
750 [NL80211_ATTR_SAE_PASSWORD] = { .type = NLA_BINARY,
751 .len = SAE_PASSWORD_MAX_LEN },
752 [NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG },
753 [NL80211_ATTR_HE_OBSS_PD] = NLA_POLICY_NESTED(he_obss_pd_policy),
754 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2),
755 [NL80211_ATTR_HE_BSS_COLOR] = NLA_POLICY_NESTED(he_bss_color_policy),
756 [NL80211_ATTR_TID_CONFIG] =
757 NLA_POLICY_NESTED_ARRAY(nl80211_tid_config_attr_policy),
758 [NL80211_ATTR_CONTROL_PORT_NO_PREAUTH] = { .type = NLA_FLAG },
759 [NL80211_ATTR_PMK_LIFETIME] = NLA_POLICY_MIN(NLA_U32, 1),
760 [NL80211_ATTR_PMK_REAUTH_THRESHOLD] = NLA_POLICY_RANGE(NLA_U8, 1, 100),
761 [NL80211_ATTR_RECEIVE_MULTICAST] = { .type = NLA_FLAG },
762 [NL80211_ATTR_WIPHY_FREQ_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999),
763 [NL80211_ATTR_SCAN_FREQ_KHZ] = { .type = NLA_NESTED },
764 [NL80211_ATTR_HE_6GHZ_CAPABILITY] =
765 NLA_POLICY_EXACT_LEN(sizeof(struct ieee80211_he_6ghz_capa)),
766 [NL80211_ATTR_FILS_DISCOVERY] =
767 NLA_POLICY_NESTED(nl80211_fils_discovery_policy),
768 [NL80211_ATTR_UNSOL_BCAST_PROBE_RESP] =
769 NLA_POLICY_NESTED(nl80211_unsol_bcast_probe_resp_policy),
770 [NL80211_ATTR_S1G_CAPABILITY] =
771 NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN),
772 [NL80211_ATTR_S1G_CAPABILITY_MASK] =
773 NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN),
774 [NL80211_ATTR_SAE_PWE] =
775 NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK,
776 NL80211_SAE_PWE_BOTH),
777 [NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT },
778 [NL80211_ATTR_SAR_SPEC] = NLA_POLICY_NESTED(sar_policy),
779 [NL80211_ATTR_DISABLE_HE] = { .type = NLA_FLAG },
780 [NL80211_ATTR_OBSS_COLOR_BITMAP] = { .type = NLA_U64 },
781 [NL80211_ATTR_COLOR_CHANGE_COUNT] = { .type = NLA_U8 },
782 [NL80211_ATTR_COLOR_CHANGE_COLOR] = { .type = NLA_U8 },
783 [NL80211_ATTR_COLOR_CHANGE_ELEMS] = NLA_POLICY_NESTED(nl80211_policy),
784 [NL80211_ATTR_MBSSID_CONFIG] =
785 NLA_POLICY_NESTED(nl80211_mbssid_config_policy),
786 [NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED },
787 [NL80211_ATTR_RADAR_BACKGROUND] = { .type = NLA_FLAG },
788 [NL80211_ATTR_AP_SETTINGS_FLAGS] = { .type = NLA_U32 },
789 [NL80211_ATTR_EHT_CAPABILITY] =
790 NLA_POLICY_RANGE(NLA_BINARY,
791 NL80211_EHT_MIN_CAPABILITY_LEN,
792 NL80211_EHT_MAX_CAPABILITY_LEN),
795 /* policy for the key attributes */
796 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
797 [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
798 [NL80211_KEY_IDX] = { .type = NLA_U8 },
799 [NL80211_KEY_CIPHER] = { .type = NLA_U32 },
800 [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
801 [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG },
802 [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG },
803 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
804 [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
805 [NL80211_KEY_MODE] = NLA_POLICY_RANGE(NLA_U8, 0, NL80211_KEY_SET_TX),
808 /* policy for the key default flags */
809 static const struct nla_policy
810 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = {
811 [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG },
812 [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG },
816 /* policy for WoWLAN attributes */
817 static const struct nla_policy
818 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = {
819 [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG },
820 [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG },
821 [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG },
822 [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED },
823 [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG },
824 [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG },
825 [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG },
826 [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG },
827 [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED },
828 [NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED },
831 static const struct nla_policy
832 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = {
833 [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 },
834 [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 },
835 [NL80211_WOWLAN_TCP_DST_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
836 [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 },
837 [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 },
838 [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = NLA_POLICY_MIN_LEN(1),
839 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = {
840 .len = sizeof(struct nl80211_wowlan_tcp_data_seq)
842 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = {
843 .len = sizeof(struct nl80211_wowlan_tcp_data_token)
845 [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 },
846 [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = NLA_POLICY_MIN_LEN(1),
847 [NL80211_WOWLAN_TCP_WAKE_MASK] = NLA_POLICY_MIN_LEN(1),
849 #endif /* CONFIG_PM */
851 /* policy for coalesce rule attributes */
852 static const struct nla_policy
853 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = {
854 [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 },
855 [NL80211_ATTR_COALESCE_RULE_CONDITION] =
856 NLA_POLICY_RANGE(NLA_U32,
857 NL80211_COALESCE_CONDITION_MATCH,
858 NL80211_COALESCE_CONDITION_NO_MATCH),
859 [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED },
862 /* policy for GTK rekey offload attributes */
863 static const struct nla_policy
864 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
865 [NL80211_REKEY_DATA_KEK] = {
867 .len = NL80211_KEK_EXT_LEN
869 [NL80211_REKEY_DATA_KCK] = {
871 .len = NL80211_KCK_EXT_LEN
873 [NL80211_REKEY_DATA_REPLAY_CTR] = NLA_POLICY_EXACT_LEN(NL80211_REPLAY_CTR_LEN),
874 [NL80211_REKEY_DATA_AKM] = { .type = NLA_U32 },
877 static const struct nla_policy
878 nl80211_match_band_rssi_policy[NUM_NL80211_BANDS] = {
879 [NL80211_BAND_2GHZ] = { .type = NLA_S32 },
880 [NL80211_BAND_5GHZ] = { .type = NLA_S32 },
881 [NL80211_BAND_6GHZ] = { .type = NLA_S32 },
882 [NL80211_BAND_60GHZ] = { .type = NLA_S32 },
883 [NL80211_BAND_LC] = { .type = NLA_S32 },
886 static const struct nla_policy
887 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = {
888 [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY,
889 .len = IEEE80211_MAX_SSID_LEN },
890 [NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
891 [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 },
892 [NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI] =
893 NLA_POLICY_NESTED(nl80211_match_band_rssi_policy),
896 static const struct nla_policy
897 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = {
898 [NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 },
899 [NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 },
902 static const struct nla_policy
903 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = {
904 [NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG },
905 [NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 },
906 [NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = {
907 .len = sizeof(struct nl80211_bss_select_rssi_adjust)
911 /* policy for NAN function attributes */
912 static const struct nla_policy
913 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = {
914 [NL80211_NAN_FUNC_TYPE] =
915 NLA_POLICY_MAX(NLA_U8, NL80211_NAN_FUNC_MAX_TYPE),
916 [NL80211_NAN_FUNC_SERVICE_ID] = {
917 .len = NL80211_NAN_FUNC_SERVICE_ID_LEN },
918 [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 },
919 [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG },
920 [NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG },
921 [NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 },
922 [NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 },
923 [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
924 [NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG },
925 [NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 },
926 [NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY,
927 .len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN },
928 [NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED },
929 [NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED },
930 [NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED },
931 [NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 },
932 [NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 },
935 /* policy for Service Response Filter attributes */
936 static const struct nla_policy
937 nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = {
938 [NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG },
939 [NL80211_NAN_SRF_BF] = { .type = NLA_BINARY,
940 .len = NL80211_NAN_FUNC_SRF_MAX_LEN },
941 [NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 },
942 [NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED },
945 /* policy for packet pattern attributes */
946 static const struct nla_policy
947 nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = {
948 [NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, },
949 [NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, },
950 [NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 },
953 static int nl80211_prepare_wdev_dump(struct netlink_callback *cb,
954 struct cfg80211_registered_device **rdev,
955 struct wireless_dev **wdev,
956 struct nlattr **attrbuf)
961 struct nlattr **attrbuf_free = NULL;
964 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf),
968 attrbuf_free = attrbuf;
971 err = nlmsg_parse_deprecated(cb->nlh,
972 GENL_HDRLEN + nl80211_fam.hdrsize,
973 attrbuf, nl80211_fam.maxattr,
974 nl80211_policy, NULL);
981 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk),
986 return PTR_ERR(*wdev);
988 *rdev = wiphy_to_rdev((*wdev)->wiphy);
989 mutex_lock(&(*rdev)->wiphy.mtx);
991 /* 0 is the first index - add 1 to parse only once */
992 cb->args[0] = (*rdev)->wiphy_idx + 1;
993 cb->args[1] = (*wdev)->identifier;
995 /* subtract the 1 again here */
997 struct wireless_dev *tmp;
1000 wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
1005 *rdev = wiphy_to_rdev(wiphy);
1008 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) {
1009 if (tmp->identifier == cb->args[1]) {
1019 mutex_lock(&(*rdev)->wiphy.mtx);
1026 /* message building helper */
1027 void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
1030 /* since there is no private header just add the generic one */
1031 return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd);
1034 static int nl80211_msg_put_wmm_rules(struct sk_buff *msg,
1035 const struct ieee80211_reg_rule *rule)
1038 struct nlattr *nl_wmm_rules =
1039 nla_nest_start_noflag(msg, NL80211_FREQUENCY_ATTR_WMM);
1042 goto nla_put_failure;
1044 for (j = 0; j < IEEE80211_NUM_ACS; j++) {
1045 struct nlattr *nl_wmm_rule = nla_nest_start_noflag(msg, j);
1048 goto nla_put_failure;
1050 if (nla_put_u16(msg, NL80211_WMMR_CW_MIN,
1051 rule->wmm_rule.client[j].cw_min) ||
1052 nla_put_u16(msg, NL80211_WMMR_CW_MAX,
1053 rule->wmm_rule.client[j].cw_max) ||
1054 nla_put_u8(msg, NL80211_WMMR_AIFSN,
1055 rule->wmm_rule.client[j].aifsn) ||
1056 nla_put_u16(msg, NL80211_WMMR_TXOP,
1057 rule->wmm_rule.client[j].cot))
1058 goto nla_put_failure;
1060 nla_nest_end(msg, nl_wmm_rule);
1062 nla_nest_end(msg, nl_wmm_rules);
1070 static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy,
1071 struct ieee80211_channel *chan,
1074 /* Some channels must be completely excluded from the
1075 * list to protect old user-space tools from breaking
1077 if (!large && chan->flags &
1078 (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ))
1080 if (!large && chan->freq_offset)
1083 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ,
1085 goto nla_put_failure;
1087 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset))
1088 goto nla_put_failure;
1090 if ((chan->flags & IEEE80211_CHAN_DISABLED) &&
1091 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED))
1092 goto nla_put_failure;
1093 if (chan->flags & IEEE80211_CHAN_NO_IR) {
1094 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR))
1095 goto nla_put_failure;
1096 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS))
1097 goto nla_put_failure;
1099 if (chan->flags & IEEE80211_CHAN_RADAR) {
1100 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
1101 goto nla_put_failure;
1105 time = elapsed_jiffies_msecs(chan->dfs_state_entered);
1107 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE,
1109 goto nla_put_failure;
1110 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME,
1112 goto nla_put_failure;
1113 if (nla_put_u32(msg,
1114 NL80211_FREQUENCY_ATTR_DFS_CAC_TIME,
1116 goto nla_put_failure;
1121 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
1122 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
1123 goto nla_put_failure;
1124 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) &&
1125 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS))
1126 goto nla_put_failure;
1127 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) &&
1128 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ))
1129 goto nla_put_failure;
1130 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) &&
1131 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ))
1132 goto nla_put_failure;
1133 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) &&
1134 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY))
1135 goto nla_put_failure;
1136 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) &&
1137 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT))
1138 goto nla_put_failure;
1139 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) &&
1140 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ))
1141 goto nla_put_failure;
1142 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) &&
1143 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ))
1144 goto nla_put_failure;
1145 if ((chan->flags & IEEE80211_CHAN_NO_HE) &&
1146 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HE))
1147 goto nla_put_failure;
1148 if ((chan->flags & IEEE80211_CHAN_1MHZ) &&
1149 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_1MHZ))
1150 goto nla_put_failure;
1151 if ((chan->flags & IEEE80211_CHAN_2MHZ) &&
1152 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_2MHZ))
1153 goto nla_put_failure;
1154 if ((chan->flags & IEEE80211_CHAN_4MHZ) &&
1155 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_4MHZ))
1156 goto nla_put_failure;
1157 if ((chan->flags & IEEE80211_CHAN_8MHZ) &&
1158 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_8MHZ))
1159 goto nla_put_failure;
1160 if ((chan->flags & IEEE80211_CHAN_16MHZ) &&
1161 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_16MHZ))
1162 goto nla_put_failure;
1163 if ((chan->flags & IEEE80211_CHAN_NO_320MHZ) &&
1164 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_320MHZ))
1165 goto nla_put_failure;
1166 if ((chan->flags & IEEE80211_CHAN_NO_EHT) &&
1167 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_EHT))
1168 goto nla_put_failure;
1171 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
1172 DBM_TO_MBM(chan->max_power)))
1173 goto nla_put_failure;
1176 const struct ieee80211_reg_rule *rule =
1177 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq));
1179 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) {
1180 if (nl80211_msg_put_wmm_rules(msg, rule))
1181 goto nla_put_failure;
1191 static bool nl80211_put_txq_stats(struct sk_buff *msg,
1192 struct cfg80211_txq_stats *txqstats,
1195 struct nlattr *txqattr;
1197 #define PUT_TXQVAL_U32(attr, memb) do { \
1198 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \
1199 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \
1203 txqattr = nla_nest_start_noflag(msg, attrtype);
1207 PUT_TXQVAL_U32(BACKLOG_BYTES, backlog_bytes);
1208 PUT_TXQVAL_U32(BACKLOG_PACKETS, backlog_packets);
1209 PUT_TXQVAL_U32(FLOWS, flows);
1210 PUT_TXQVAL_U32(DROPS, drops);
1211 PUT_TXQVAL_U32(ECN_MARKS, ecn_marks);
1212 PUT_TXQVAL_U32(OVERLIMIT, overlimit);
1213 PUT_TXQVAL_U32(OVERMEMORY, overmemory);
1214 PUT_TXQVAL_U32(COLLISIONS, collisions);
1215 PUT_TXQVAL_U32(TX_BYTES, tx_bytes);
1216 PUT_TXQVAL_U32(TX_PACKETS, tx_packets);
1217 PUT_TXQVAL_U32(MAX_FLOWS, max_flows);
1218 nla_nest_end(msg, txqattr);
1220 #undef PUT_TXQVAL_U32
1224 /* netlink command implementations */
1227 struct key_params p;
1230 bool def, defmgmt, defbeacon;
1231 bool def_uni, def_multi;
1234 static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key,
1235 struct key_parse *k)
1237 struct nlattr *tb[NL80211_KEY_MAX + 1];
1238 int err = nla_parse_nested_deprecated(tb, NL80211_KEY_MAX, key,
1244 k->def = !!tb[NL80211_KEY_DEFAULT];
1245 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT];
1246 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON];
1250 k->def_multi = true;
1252 if (k->defmgmt || k->defbeacon)
1253 k->def_multi = true;
1255 if (tb[NL80211_KEY_IDX])
1256 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]);
1258 if (tb[NL80211_KEY_DATA]) {
1259 k->p.key = nla_data(tb[NL80211_KEY_DATA]);
1260 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]);
1263 if (tb[NL80211_KEY_SEQ]) {
1264 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]);
1265 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]);
1268 if (tb[NL80211_KEY_CIPHER])
1269 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]);
1271 if (tb[NL80211_KEY_TYPE])
1272 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]);
1274 if (tb[NL80211_KEY_DEFAULT_TYPES]) {
1275 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
1277 err = nla_parse_nested_deprecated(kdt,
1278 NUM_NL80211_KEY_DEFAULT_TYPES - 1,
1279 tb[NL80211_KEY_DEFAULT_TYPES],
1280 nl80211_key_default_policy,
1285 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
1286 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
1289 if (tb[NL80211_KEY_MODE])
1290 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]);
1295 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
1297 if (info->attrs[NL80211_ATTR_KEY_DATA]) {
1298 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
1299 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
1302 if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
1303 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
1304 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
1307 if (info->attrs[NL80211_ATTR_KEY_IDX])
1308 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
1310 if (info->attrs[NL80211_ATTR_KEY_CIPHER])
1311 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
1313 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
1314 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
1318 k->def_multi = true;
1321 k->def_multi = true;
1323 if (info->attrs[NL80211_ATTR_KEY_TYPE])
1324 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
1326 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
1327 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
1328 int err = nla_parse_nested_deprecated(kdt,
1329 NUM_NL80211_KEY_DEFAULT_TYPES - 1,
1330 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
1331 nl80211_key_default_policy,
1336 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
1337 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
1343 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
1347 memset(k, 0, sizeof(*k));
1351 if (info->attrs[NL80211_ATTR_KEY])
1352 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k);
1354 err = nl80211_parse_key_old(info, k);
1359 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) +
1360 (k->defbeacon ? 1 : 0) > 1) {
1361 GENL_SET_ERR_MSG(info,
1362 "key with multiple default flags is invalid");
1366 if (k->defmgmt || k->defbeacon) {
1367 if (k->def_uni || !k->def_multi) {
1368 GENL_SET_ERR_MSG(info,
1369 "defmgmt/defbeacon key must be mcast");
1376 if (k->idx < 4 || k->idx > 5) {
1377 GENL_SET_ERR_MSG(info,
1378 "defmgmt key idx not 4 or 5");
1381 } else if (k->defbeacon) {
1382 if (k->idx < 6 || k->idx > 7) {
1383 GENL_SET_ERR_MSG(info,
1384 "defbeacon key idx not 6 or 7");
1387 } else if (k->def) {
1388 if (k->idx < 0 || k->idx > 3) {
1389 GENL_SET_ERR_MSG(info, "def key idx not 0-3");
1393 if (k->idx < 0 || k->idx > 7) {
1394 GENL_SET_ERR_MSG(info, "key idx not 0-7");
1403 static struct cfg80211_cached_keys *
1404 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
1405 struct genl_info *info, bool *no_ht)
1407 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS];
1408 struct key_parse parse;
1410 struct cfg80211_cached_keys *result;
1411 int rem, err, def = 0;
1412 bool have_key = false;
1414 nla_for_each_nested(key, keys, rem) {
1422 result = kzalloc(sizeof(*result), GFP_KERNEL);
1424 return ERR_PTR(-ENOMEM);
1428 nla_for_each_nested(key, keys, rem) {
1429 memset(&parse, 0, sizeof(parse));
1432 err = nl80211_parse_key_new(info, key, &parse);
1438 if (parse.idx < 0 || parse.idx > 3) {
1439 GENL_SET_ERR_MSG(info, "key index out of range [0-3]");
1444 GENL_SET_ERR_MSG(info,
1445 "only one key can be default");
1449 result->def = parse.idx;
1450 if (!parse.def_uni || !parse.def_multi)
1452 } else if (parse.defmgmt)
1454 err = cfg80211_validate_key_settings(rdev, &parse.p,
1455 parse.idx, false, NULL);
1458 if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 &&
1459 parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) {
1460 GENL_SET_ERR_MSG(info, "connect key must be WEP");
1464 result->params[parse.idx].cipher = parse.p.cipher;
1465 result->params[parse.idx].key_len = parse.p.key_len;
1466 result->params[parse.idx].key = result->data[parse.idx];
1467 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len);
1469 /* must be WEP key if we got here */
1474 if (result->def < 0) {
1476 GENL_SET_ERR_MSG(info, "need a default/TX key");
1483 return ERR_PTR(err);
1486 static int nl80211_key_allowed(struct wireless_dev *wdev)
1488 ASSERT_WDEV_LOCK(wdev);
1490 switch (wdev->iftype) {
1491 case NL80211_IFTYPE_AP:
1492 case NL80211_IFTYPE_AP_VLAN:
1493 case NL80211_IFTYPE_P2P_GO:
1494 case NL80211_IFTYPE_MESH_POINT:
1496 case NL80211_IFTYPE_ADHOC:
1497 case NL80211_IFTYPE_STATION:
1498 case NL80211_IFTYPE_P2P_CLIENT:
1499 if (!wdev->current_bss)
1502 case NL80211_IFTYPE_UNSPECIFIED:
1503 case NL80211_IFTYPE_OCB:
1504 case NL80211_IFTYPE_MONITOR:
1505 case NL80211_IFTYPE_NAN:
1506 case NL80211_IFTYPE_P2P_DEVICE:
1507 case NL80211_IFTYPE_WDS:
1508 case NUM_NL80211_IFTYPES:
1515 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy,
1518 struct ieee80211_channel *chan;
1520 chan = ieee80211_get_channel_khz(wiphy, freq);
1521 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
1526 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
1528 struct nlattr *nl_modes = nla_nest_start_noflag(msg, attr);
1532 goto nla_put_failure;
1536 if ((ifmodes & 1) && nla_put_flag(msg, i))
1537 goto nla_put_failure;
1542 nla_nest_end(msg, nl_modes);
1549 static int nl80211_put_iface_combinations(struct wiphy *wiphy,
1550 struct sk_buff *msg,
1553 struct nlattr *nl_combis;
1556 nl_combis = nla_nest_start_noflag(msg,
1557 NL80211_ATTR_INTERFACE_COMBINATIONS);
1559 goto nla_put_failure;
1561 for (i = 0; i < wiphy->n_iface_combinations; i++) {
1562 const struct ieee80211_iface_combination *c;
1563 struct nlattr *nl_combi, *nl_limits;
1565 c = &wiphy->iface_combinations[i];
1567 nl_combi = nla_nest_start_noflag(msg, i + 1);
1569 goto nla_put_failure;
1571 nl_limits = nla_nest_start_noflag(msg,
1572 NL80211_IFACE_COMB_LIMITS);
1574 goto nla_put_failure;
1576 for (j = 0; j < c->n_limits; j++) {
1577 struct nlattr *nl_limit;
1579 nl_limit = nla_nest_start_noflag(msg, j + 1);
1581 goto nla_put_failure;
1582 if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX,
1584 goto nla_put_failure;
1585 if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
1586 c->limits[j].types))
1587 goto nla_put_failure;
1588 nla_nest_end(msg, nl_limit);
1591 nla_nest_end(msg, nl_limits);
1593 if (c->beacon_int_infra_match &&
1594 nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
1595 goto nla_put_failure;
1596 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
1597 c->num_different_channels) ||
1598 nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
1600 goto nla_put_failure;
1602 (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
1603 c->radar_detect_widths) ||
1604 nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
1605 c->radar_detect_regions)))
1606 goto nla_put_failure;
1607 if (c->beacon_int_min_gcd &&
1608 nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD,
1609 c->beacon_int_min_gcd))
1610 goto nla_put_failure;
1612 nla_nest_end(msg, nl_combi);
1615 nla_nest_end(msg, nl_combis);
1623 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev,
1624 struct sk_buff *msg)
1626 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp;
1627 struct nlattr *nl_tcp;
1632 nl_tcp = nla_nest_start_noflag(msg,
1633 NL80211_WOWLAN_TRIG_TCP_CONNECTION);
1637 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
1638 tcp->data_payload_max))
1641 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
1642 tcp->data_payload_max))
1645 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ))
1648 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
1649 sizeof(*tcp->tok), tcp->tok))
1652 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
1653 tcp->data_interval_max))
1656 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
1657 tcp->wake_payload_max))
1660 nla_nest_end(msg, nl_tcp);
1664 static int nl80211_send_wowlan(struct sk_buff *msg,
1665 struct cfg80211_registered_device *rdev,
1668 struct nlattr *nl_wowlan;
1670 if (!rdev->wiphy.wowlan)
1673 nl_wowlan = nla_nest_start_noflag(msg,
1674 NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED);
1678 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) &&
1679 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
1680 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) &&
1681 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
1682 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) &&
1683 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
1684 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) &&
1685 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) ||
1686 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
1687 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
1688 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) &&
1689 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
1690 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) &&
1691 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
1692 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) &&
1693 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
1696 if (rdev->wiphy.wowlan->n_patterns) {
1697 struct nl80211_pattern_support pat = {
1698 .max_patterns = rdev->wiphy.wowlan->n_patterns,
1699 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len,
1700 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len,
1701 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset,
1704 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
1709 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) &&
1710 nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT,
1711 rdev->wiphy.wowlan->max_nd_match_sets))
1714 if (large && nl80211_send_wowlan_tcp_caps(rdev, msg))
1717 nla_nest_end(msg, nl_wowlan);
1723 static int nl80211_send_coalesce(struct sk_buff *msg,
1724 struct cfg80211_registered_device *rdev)
1726 struct nl80211_coalesce_rule_support rule;
1728 if (!rdev->wiphy.coalesce)
1731 rule.max_rules = rdev->wiphy.coalesce->n_rules;
1732 rule.max_delay = rdev->wiphy.coalesce->max_delay;
1733 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns;
1734 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len;
1735 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len;
1736 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset;
1738 if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule))
1745 nl80211_send_iftype_data(struct sk_buff *msg,
1746 const struct ieee80211_supported_band *sband,
1747 const struct ieee80211_sband_iftype_data *iftdata)
1749 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap;
1750 const struct ieee80211_sta_eht_cap *eht_cap = &iftdata->eht_cap;
1752 if (nl80211_put_iftypes(msg, NL80211_BAND_IFTYPE_ATTR_IFTYPES,
1753 iftdata->types_mask))
1756 if (he_cap->has_he) {
1757 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC,
1758 sizeof(he_cap->he_cap_elem.mac_cap_info),
1759 he_cap->he_cap_elem.mac_cap_info) ||
1760 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY,
1761 sizeof(he_cap->he_cap_elem.phy_cap_info),
1762 he_cap->he_cap_elem.phy_cap_info) ||
1763 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET,
1764 sizeof(he_cap->he_mcs_nss_supp),
1765 &he_cap->he_mcs_nss_supp) ||
1766 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE,
1767 sizeof(he_cap->ppe_thres), he_cap->ppe_thres))
1771 if (eht_cap->has_eht && he_cap->has_he) {
1772 u8 mcs_nss_size, ppe_thresh_size;
1776 ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
1777 &eht_cap->eht_cap_elem);
1779 ppe_thres_hdr = get_unaligned_le16(&eht_cap->eht_ppe_thres[0]);
1781 ieee80211_eht_ppe_size(ppe_thres_hdr,
1782 eht_cap->eht_cap_elem.phy_cap_info);
1784 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC,
1785 sizeof(eht_cap->eht_cap_elem.mac_cap_info),
1786 eht_cap->eht_cap_elem.mac_cap_info) ||
1787 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY,
1788 sizeof(eht_cap->eht_cap_elem.phy_cap_info),
1789 eht_cap->eht_cap_elem.phy_cap_info) ||
1790 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET,
1791 mcs_nss_size, &eht_cap->eht_mcs_nss_supp) ||
1792 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE,
1793 ppe_thresh_size, eht_cap->eht_ppe_thres))
1797 if (sband->band == NL80211_BAND_6GHZ &&
1798 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA,
1799 sizeof(iftdata->he_6ghz_capa),
1800 &iftdata->he_6ghz_capa))
1803 if (iftdata->vendor_elems.data && iftdata->vendor_elems.len &&
1804 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS,
1805 iftdata->vendor_elems.len, iftdata->vendor_elems.data))
1811 static int nl80211_send_band_rateinfo(struct sk_buff *msg,
1812 struct ieee80211_supported_band *sband,
1815 struct nlattr *nl_rates, *nl_rate;
1816 struct ieee80211_rate *rate;
1820 if (sband->ht_cap.ht_supported &&
1821 (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET,
1822 sizeof(sband->ht_cap.mcs),
1823 &sband->ht_cap.mcs) ||
1824 nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA,
1825 sband->ht_cap.cap) ||
1826 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
1827 sband->ht_cap.ampdu_factor) ||
1828 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
1829 sband->ht_cap.ampdu_density)))
1833 if (sband->vht_cap.vht_supported &&
1834 (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET,
1835 sizeof(sband->vht_cap.vht_mcs),
1836 &sband->vht_cap.vht_mcs) ||
1837 nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA,
1838 sband->vht_cap.cap)))
1841 if (large && sband->n_iftype_data) {
1842 struct nlattr *nl_iftype_data =
1843 nla_nest_start_noflag(msg,
1844 NL80211_BAND_ATTR_IFTYPE_DATA);
1847 if (!nl_iftype_data)
1850 for (i = 0; i < sband->n_iftype_data; i++) {
1851 struct nlattr *iftdata;
1853 iftdata = nla_nest_start_noflag(msg, i + 1);
1857 err = nl80211_send_iftype_data(msg, sband,
1858 &sband->iftype_data[i]);
1862 nla_nest_end(msg, iftdata);
1865 nla_nest_end(msg, nl_iftype_data);
1869 if (large && sband->edmg_cap.channels &&
1870 (nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_CHANNELS,
1871 sband->edmg_cap.channels) ||
1872 nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_BW_CONFIG,
1873 sband->edmg_cap.bw_config)))
1878 nl_rates = nla_nest_start_noflag(msg, NL80211_BAND_ATTR_RATES);
1882 for (i = 0; i < sband->n_bitrates; i++) {
1883 nl_rate = nla_nest_start_noflag(msg, i);
1887 rate = &sband->bitrates[i];
1888 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE,
1891 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) &&
1893 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE))
1896 nla_nest_end(msg, nl_rate);
1899 nla_nest_end(msg, nl_rates);
1905 nl80211_send_mgmt_stypes(struct sk_buff *msg,
1906 const struct ieee80211_txrx_stypes *mgmt_stypes)
1909 struct nlattr *nl_ftypes, *nl_ifs;
1910 enum nl80211_iftype ift;
1916 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_TX_FRAME_TYPES);
1920 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1921 nl_ftypes = nla_nest_start_noflag(msg, ift);
1925 stypes = mgmt_stypes[ift].tx;
1928 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1929 (i << 4) | IEEE80211_FTYPE_MGMT))
1934 nla_nest_end(msg, nl_ftypes);
1937 nla_nest_end(msg, nl_ifs);
1939 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_RX_FRAME_TYPES);
1943 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1944 nl_ftypes = nla_nest_start_noflag(msg, ift);
1948 stypes = mgmt_stypes[ift].rx;
1951 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1952 (i << 4) | IEEE80211_FTYPE_MGMT))
1957 nla_nest_end(msg, nl_ftypes);
1959 nla_nest_end(msg, nl_ifs);
1964 #define CMD(op, n) \
1966 if (rdev->ops->op) { \
1968 if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \
1969 goto nla_put_failure; \
1973 static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev,
1974 struct sk_buff *msg)
1979 * do *NOT* add anything into this function, new things need to be
1980 * advertised only to new versions of userspace that can deal with
1981 * the split (and they can't possibly care about new features...
1983 CMD(add_virtual_intf, NEW_INTERFACE);
1984 CMD(change_virtual_intf, SET_INTERFACE);
1985 CMD(add_key, NEW_KEY);
1986 CMD(start_ap, START_AP);
1987 CMD(add_station, NEW_STATION);
1988 CMD(add_mpath, NEW_MPATH);
1989 CMD(update_mesh_config, SET_MESH_CONFIG);
1990 CMD(change_bss, SET_BSS);
1991 CMD(auth, AUTHENTICATE);
1992 CMD(assoc, ASSOCIATE);
1993 CMD(deauth, DEAUTHENTICATE);
1994 CMD(disassoc, DISASSOCIATE);
1995 CMD(join_ibss, JOIN_IBSS);
1996 CMD(join_mesh, JOIN_MESH);
1997 CMD(set_pmksa, SET_PMKSA);
1998 CMD(del_pmksa, DEL_PMKSA);
1999 CMD(flush_pmksa, FLUSH_PMKSA);
2000 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)
2001 CMD(remain_on_channel, REMAIN_ON_CHANNEL);
2002 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
2003 CMD(mgmt_tx, FRAME);
2004 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL);
2005 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) {
2007 if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS))
2008 goto nla_put_failure;
2010 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap ||
2011 rdev->ops->join_mesh) {
2013 if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL))
2014 goto nla_put_failure;
2016 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) {
2017 CMD(tdls_mgmt, TDLS_MGMT);
2018 CMD(tdls_oper, TDLS_OPER);
2020 if (rdev->wiphy.max_sched_scan_reqs)
2021 CMD(sched_scan_start, START_SCHED_SCAN);
2022 CMD(probe_client, PROBE_CLIENT);
2023 CMD(set_noack_map, SET_NOACK_MAP);
2024 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) {
2026 if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS))
2027 goto nla_put_failure;
2029 CMD(start_p2p_device, START_P2P_DEVICE);
2030 CMD(set_mcast_rate, SET_MCAST_RATE);
2031 #ifdef CONFIG_NL80211_TESTMODE
2032 CMD(testmode_cmd, TESTMODE);
2035 if (rdev->ops->connect || rdev->ops->auth) {
2037 if (nla_put_u32(msg, i, NL80211_CMD_CONNECT))
2038 goto nla_put_failure;
2041 if (rdev->ops->disconnect || rdev->ops->deauth) {
2043 if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT))
2044 goto nla_put_failure;
2053 nl80211_send_pmsr_ftm_capa(const struct cfg80211_pmsr_capabilities *cap,
2054 struct sk_buff *msg)
2058 if (!cap->ftm.supported)
2061 ftm = nla_nest_start_noflag(msg, NL80211_PMSR_TYPE_FTM);
2065 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP))
2067 if (cap->ftm.non_asap &&
2068 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP))
2070 if (cap->ftm.request_lci &&
2071 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI))
2073 if (cap->ftm.request_civicloc &&
2074 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC))
2076 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES,
2077 cap->ftm.preambles))
2079 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS,
2080 cap->ftm.bandwidths))
2082 if (cap->ftm.max_bursts_exponent >= 0 &&
2083 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT,
2084 cap->ftm.max_bursts_exponent))
2086 if (cap->ftm.max_ftms_per_burst &&
2087 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST,
2088 cap->ftm.max_ftms_per_burst))
2090 if (cap->ftm.trigger_based &&
2091 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED))
2093 if (cap->ftm.non_trigger_based &&
2094 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED))
2097 nla_nest_end(msg, ftm);
2101 static int nl80211_send_pmsr_capa(struct cfg80211_registered_device *rdev,
2102 struct sk_buff *msg)
2104 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa;
2105 struct nlattr *pmsr, *caps;
2111 * we don't need to clean up anything here since the caller
2112 * will genlmsg_cancel() if we fail
2115 pmsr = nla_nest_start_noflag(msg, NL80211_ATTR_PEER_MEASUREMENTS);
2119 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers))
2122 if (cap->report_ap_tsf &&
2123 nla_put_flag(msg, NL80211_PMSR_ATTR_REPORT_AP_TSF))
2126 if (cap->randomize_mac_addr &&
2127 nla_put_flag(msg, NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR))
2130 caps = nla_nest_start_noflag(msg, NL80211_PMSR_ATTR_TYPE_CAPA);
2134 if (nl80211_send_pmsr_ftm_capa(cap, msg))
2137 nla_nest_end(msg, caps);
2138 nla_nest_end(msg, pmsr);
2144 nl80211_put_iftype_akm_suites(struct cfg80211_registered_device *rdev,
2145 struct sk_buff *msg)
2148 struct nlattr *nested, *nested_akms;
2149 const struct wiphy_iftype_akm_suites *iftype_akms;
2151 if (!rdev->wiphy.num_iftype_akm_suites ||
2152 !rdev->wiphy.iftype_akm_suites)
2155 nested = nla_nest_start(msg, NL80211_ATTR_IFTYPE_AKM_SUITES);
2159 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) {
2160 nested_akms = nla_nest_start(msg, i + 1);
2164 iftype_akms = &rdev->wiphy.iftype_akm_suites[i];
2166 if (nl80211_put_iftypes(msg, NL80211_IFTYPE_AKM_ATTR_IFTYPES,
2167 iftype_akms->iftypes_mask))
2170 if (nla_put(msg, NL80211_IFTYPE_AKM_ATTR_SUITES,
2171 sizeof(u32) * iftype_akms->n_akm_suites,
2172 iftype_akms->akm_suites)) {
2175 nla_nest_end(msg, nested_akms);
2178 nla_nest_end(msg, nested);
2184 nl80211_put_tid_config_support(struct cfg80211_registered_device *rdev,
2185 struct sk_buff *msg)
2187 struct nlattr *supp;
2189 if (!rdev->wiphy.tid_config_support.vif &&
2190 !rdev->wiphy.tid_config_support.peer)
2193 supp = nla_nest_start(msg, NL80211_ATTR_TID_CONFIG);
2197 if (rdev->wiphy.tid_config_support.vif &&
2198 nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_VIF_SUPP,
2199 rdev->wiphy.tid_config_support.vif,
2200 NL80211_TID_CONFIG_ATTR_PAD))
2203 if (rdev->wiphy.tid_config_support.peer &&
2204 nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_PEER_SUPP,
2205 rdev->wiphy.tid_config_support.peer,
2206 NL80211_TID_CONFIG_ATTR_PAD))
2209 /* for now we just use the same value ... makes more sense */
2210 if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_SHORT,
2211 rdev->wiphy.tid_config_support.max_retry))
2213 if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_LONG,
2214 rdev->wiphy.tid_config_support.max_retry))
2217 nla_nest_end(msg, supp);
2221 nla_nest_cancel(msg, supp);
2226 nl80211_put_sar_specs(struct cfg80211_registered_device *rdev,
2227 struct sk_buff *msg)
2229 struct nlattr *sar_capa, *specs, *sub_freq_range;
2233 if (!rdev->wiphy.sar_capa)
2236 num_freq_ranges = rdev->wiphy.sar_capa->num_freq_ranges;
2238 sar_capa = nla_nest_start(msg, NL80211_ATTR_SAR_SPEC);
2242 if (nla_put_u32(msg, NL80211_SAR_ATTR_TYPE, rdev->wiphy.sar_capa->type))
2245 specs = nla_nest_start(msg, NL80211_SAR_ATTR_SPECS);
2249 /* report supported freq_ranges */
2250 for (i = 0; i < num_freq_ranges; i++) {
2251 sub_freq_range = nla_nest_start(msg, i + 1);
2252 if (!sub_freq_range)
2255 if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_START_FREQ,
2256 rdev->wiphy.sar_capa->freq_ranges[i].start_freq))
2259 if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_END_FREQ,
2260 rdev->wiphy.sar_capa->freq_ranges[i].end_freq))
2263 nla_nest_end(msg, sub_freq_range);
2266 nla_nest_end(msg, specs);
2267 nla_nest_end(msg, sar_capa);
2271 nla_nest_cancel(msg, sar_capa);
2275 static int nl80211_put_mbssid_support(struct wiphy *wiphy, struct sk_buff *msg)
2277 struct nlattr *config;
2279 if (!wiphy->mbssid_max_interfaces)
2282 config = nla_nest_start(msg, NL80211_ATTR_MBSSID_CONFIG);
2286 if (nla_put_u8(msg, NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES,
2287 wiphy->mbssid_max_interfaces))
2290 if (wiphy->ema_max_profile_periodicity &&
2292 NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY,
2293 wiphy->ema_max_profile_periodicity))
2296 nla_nest_end(msg, config);
2300 nla_nest_cancel(msg, config);
2304 struct nl80211_dump_wiphy_state {
2307 long split_start, band_start, chan_start, capa_start;
2311 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
2312 enum nl80211_commands cmd,
2313 struct sk_buff *msg, u32 portid, u32 seq,
2314 int flags, struct nl80211_dump_wiphy_state *state)
2317 struct nlattr *nl_bands, *nl_band;
2318 struct nlattr *nl_freqs, *nl_freq;
2319 struct nlattr *nl_cmds;
2320 enum nl80211_band band;
2321 struct ieee80211_channel *chan;
2323 const struct ieee80211_txrx_stypes *mgmt_stypes =
2324 rdev->wiphy.mgmt_stypes;
2327 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
2331 if (WARN_ON(!state))
2334 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
2335 nla_put_string(msg, NL80211_ATTR_WIPHY_NAME,
2336 wiphy_name(&rdev->wiphy)) ||
2337 nla_put_u32(msg, NL80211_ATTR_GENERATION,
2338 cfg80211_rdev_list_generation))
2339 goto nla_put_failure;
2341 if (cmd != NL80211_CMD_NEW_WIPHY)
2344 switch (state->split_start) {
2346 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
2347 rdev->wiphy.retry_short) ||
2348 nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
2349 rdev->wiphy.retry_long) ||
2350 nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
2351 rdev->wiphy.frag_threshold) ||
2352 nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
2353 rdev->wiphy.rts_threshold) ||
2354 nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS,
2355 rdev->wiphy.coverage_class) ||
2356 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
2357 rdev->wiphy.max_scan_ssids) ||
2358 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
2359 rdev->wiphy.max_sched_scan_ssids) ||
2360 nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
2361 rdev->wiphy.max_scan_ie_len) ||
2362 nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
2363 rdev->wiphy.max_sched_scan_ie_len) ||
2364 nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS,
2365 rdev->wiphy.max_match_sets))
2366 goto nla_put_failure;
2368 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) &&
2369 nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN))
2370 goto nla_put_failure;
2371 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
2372 nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH))
2373 goto nla_put_failure;
2374 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) &&
2375 nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD))
2376 goto nla_put_failure;
2377 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) &&
2378 nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT))
2379 goto nla_put_failure;
2380 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) &&
2381 nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT))
2382 goto nla_put_failure;
2383 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) &&
2384 nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP))
2385 goto nla_put_failure;
2386 state->split_start++;
2391 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES,
2392 sizeof(u32) * rdev->wiphy.n_cipher_suites,
2393 rdev->wiphy.cipher_suites))
2394 goto nla_put_failure;
2396 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS,
2397 rdev->wiphy.max_num_pmkids))
2398 goto nla_put_failure;
2400 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
2401 nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE))
2402 goto nla_put_failure;
2404 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
2405 rdev->wiphy.available_antennas_tx) ||
2406 nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
2407 rdev->wiphy.available_antennas_rx))
2408 goto nla_put_failure;
2410 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) &&
2411 nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD,
2412 rdev->wiphy.probe_resp_offload))
2413 goto nla_put_failure;
2415 if ((rdev->wiphy.available_antennas_tx ||
2416 rdev->wiphy.available_antennas_rx) &&
2417 rdev->ops->get_antenna) {
2418 u32 tx_ant = 0, rx_ant = 0;
2421 res = rdev_get_antenna(rdev, &tx_ant, &rx_ant);
2423 if (nla_put_u32(msg,
2424 NL80211_ATTR_WIPHY_ANTENNA_TX,
2427 NL80211_ATTR_WIPHY_ANTENNA_RX,
2429 goto nla_put_failure;
2433 state->split_start++;
2438 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
2439 rdev->wiphy.interface_modes))
2440 goto nla_put_failure;
2441 state->split_start++;
2446 nl_bands = nla_nest_start_noflag(msg,
2447 NL80211_ATTR_WIPHY_BANDS);
2449 goto nla_put_failure;
2451 for (band = state->band_start;
2452 band < (state->split ?
2454 NL80211_BAND_60GHZ + 1);
2456 struct ieee80211_supported_band *sband;
2458 /* omit higher bands for ancient software */
2459 if (band > NL80211_BAND_5GHZ && !state->split)
2462 sband = rdev->wiphy.bands[band];
2467 nl_band = nla_nest_start_noflag(msg, band);
2469 goto nla_put_failure;
2471 switch (state->chan_start) {
2473 if (nl80211_send_band_rateinfo(msg, sband,
2475 goto nla_put_failure;
2476 state->chan_start++;
2481 /* add frequencies */
2482 nl_freqs = nla_nest_start_noflag(msg,
2483 NL80211_BAND_ATTR_FREQS);
2485 goto nla_put_failure;
2487 for (i = state->chan_start - 1;
2488 i < sband->n_channels;
2490 nl_freq = nla_nest_start_noflag(msg,
2493 goto nla_put_failure;
2495 chan = &sband->channels[i];
2497 if (nl80211_msg_put_channel(
2498 msg, &rdev->wiphy, chan,
2500 goto nla_put_failure;
2502 nla_nest_end(msg, nl_freq);
2506 if (i < sband->n_channels)
2507 state->chan_start = i + 2;
2509 state->chan_start = 0;
2510 nla_nest_end(msg, nl_freqs);
2513 nla_nest_end(msg, nl_band);
2516 /* start again here */
2517 if (state->chan_start)
2522 nla_nest_end(msg, nl_bands);
2524 if (band < NUM_NL80211_BANDS)
2525 state->band_start = band + 1;
2527 state->band_start = 0;
2529 /* if bands & channels are done, continue outside */
2530 if (state->band_start == 0 && state->chan_start == 0)
2531 state->split_start++;
2536 nl_cmds = nla_nest_start_noflag(msg,
2537 NL80211_ATTR_SUPPORTED_COMMANDS);
2539 goto nla_put_failure;
2541 i = nl80211_add_commands_unsplit(rdev, msg);
2543 goto nla_put_failure;
2545 CMD(crit_proto_start, CRIT_PROTOCOL_START);
2546 CMD(crit_proto_stop, CRIT_PROTOCOL_STOP);
2547 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)
2548 CMD(channel_switch, CHANNEL_SWITCH);
2549 CMD(set_qos_map, SET_QOS_MAP);
2550 if (rdev->wiphy.features &
2551 NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)
2552 CMD(add_tx_ts, ADD_TX_TS);
2553 CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST);
2554 CMD(update_connect_params, UPDATE_CONNECT_PARAMS);
2555 CMD(update_ft_ies, UPDATE_FT_IES);
2556 if (rdev->wiphy.sar_capa)
2557 CMD(set_sar_specs, SET_SAR_SPECS);
2561 nla_nest_end(msg, nl_cmds);
2562 state->split_start++;
2567 if (rdev->ops->remain_on_channel &&
2568 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) &&
2570 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
2571 rdev->wiphy.max_remain_on_channel_duration))
2572 goto nla_put_failure;
2574 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) &&
2575 nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK))
2576 goto nla_put_failure;
2578 state->split_start++;
2584 if (nl80211_send_wowlan(msg, rdev, state->split))
2585 goto nla_put_failure;
2586 state->split_start++;
2590 state->split_start++;
2594 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
2595 rdev->wiphy.software_iftypes))
2596 goto nla_put_failure;
2598 if (nl80211_put_iface_combinations(&rdev->wiphy, msg,
2600 goto nla_put_failure;
2602 state->split_start++;
2607 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) &&
2608 nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME,
2609 rdev->wiphy.ap_sme_capa))
2610 goto nla_put_failure;
2612 features = rdev->wiphy.features;
2614 * We can only add the per-channel limit information if the
2615 * dump is split, otherwise it makes it too big. Therefore
2616 * only advertise it in that case.
2619 features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS;
2620 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features))
2621 goto nla_put_failure;
2623 if (rdev->wiphy.ht_capa_mod_mask &&
2624 nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK,
2625 sizeof(*rdev->wiphy.ht_capa_mod_mask),
2626 rdev->wiphy.ht_capa_mod_mask))
2627 goto nla_put_failure;
2629 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME &&
2630 rdev->wiphy.max_acl_mac_addrs &&
2631 nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX,
2632 rdev->wiphy.max_acl_mac_addrs))
2633 goto nla_put_failure;
2636 * Any information below this point is only available to
2637 * applications that can deal with it being split. This
2638 * helps ensure that newly added capabilities don't break
2639 * older tools by overrunning their buffers.
2641 * We still increment split_start so that in the split
2642 * case we'll continue with more data in the next round,
2643 * but break unconditionally so unsplit data stops here.
2646 state->split_start++;
2648 state->split_start = 0;
2651 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes))
2652 goto nla_put_failure;
2654 if (nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS,
2655 rdev->wiphy.max_sched_scan_plans) ||
2656 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL,
2657 rdev->wiphy.max_sched_scan_plan_interval) ||
2658 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
2659 rdev->wiphy.max_sched_scan_plan_iterations))
2660 goto nla_put_failure;
2662 if (rdev->wiphy.extended_capabilities &&
2663 (nla_put(msg, NL80211_ATTR_EXT_CAPA,
2664 rdev->wiphy.extended_capabilities_len,
2665 rdev->wiphy.extended_capabilities) ||
2666 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
2667 rdev->wiphy.extended_capabilities_len,
2668 rdev->wiphy.extended_capabilities_mask)))
2669 goto nla_put_failure;
2671 if (rdev->wiphy.vht_capa_mod_mask &&
2672 nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK,
2673 sizeof(*rdev->wiphy.vht_capa_mod_mask),
2674 rdev->wiphy.vht_capa_mod_mask))
2675 goto nla_put_failure;
2677 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN,
2678 rdev->wiphy.perm_addr))
2679 goto nla_put_failure;
2681 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) &&
2682 nla_put(msg, NL80211_ATTR_MAC_MASK, ETH_ALEN,
2683 rdev->wiphy.addr_mask))
2684 goto nla_put_failure;
2686 if (rdev->wiphy.n_addresses > 1) {
2689 attr = nla_nest_start(msg, NL80211_ATTR_MAC_ADDRS);
2691 goto nla_put_failure;
2693 for (i = 0; i < rdev->wiphy.n_addresses; i++)
2694 if (nla_put(msg, i + 1, ETH_ALEN,
2695 rdev->wiphy.addresses[i].addr))
2696 goto nla_put_failure;
2698 nla_nest_end(msg, attr);
2701 state->split_start++;
2704 if (nl80211_send_coalesce(msg, rdev))
2705 goto nla_put_failure;
2707 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) &&
2708 (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) ||
2709 nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ)))
2710 goto nla_put_failure;
2712 if (rdev->wiphy.max_ap_assoc_sta &&
2713 nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA,
2714 rdev->wiphy.max_ap_assoc_sta))
2715 goto nla_put_failure;
2717 state->split_start++;
2720 if (rdev->wiphy.n_vendor_commands) {
2721 const struct nl80211_vendor_cmd_info *info;
2722 struct nlattr *nested;
2724 nested = nla_nest_start_noflag(msg,
2725 NL80211_ATTR_VENDOR_DATA);
2727 goto nla_put_failure;
2729 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
2730 info = &rdev->wiphy.vendor_commands[i].info;
2731 if (nla_put(msg, i + 1, sizeof(*info), info))
2732 goto nla_put_failure;
2734 nla_nest_end(msg, nested);
2737 if (rdev->wiphy.n_vendor_events) {
2738 const struct nl80211_vendor_cmd_info *info;
2739 struct nlattr *nested;
2741 nested = nla_nest_start_noflag(msg,
2742 NL80211_ATTR_VENDOR_EVENTS);
2744 goto nla_put_failure;
2746 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) {
2747 info = &rdev->wiphy.vendor_events[i];
2748 if (nla_put(msg, i + 1, sizeof(*info), info))
2749 goto nla_put_failure;
2751 nla_nest_end(msg, nested);
2753 state->split_start++;
2756 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH &&
2757 nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS,
2758 rdev->wiphy.max_num_csa_counters))
2759 goto nla_put_failure;
2761 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
2762 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
2763 goto nla_put_failure;
2765 if (rdev->wiphy.max_sched_scan_reqs &&
2766 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS,
2767 rdev->wiphy.max_sched_scan_reqs))
2768 goto nla_put_failure;
2770 if (nla_put(msg, NL80211_ATTR_EXT_FEATURES,
2771 sizeof(rdev->wiphy.ext_features),
2772 rdev->wiphy.ext_features))
2773 goto nla_put_failure;
2775 if (rdev->wiphy.bss_select_support) {
2776 struct nlattr *nested;
2777 u32 bss_select_support = rdev->wiphy.bss_select_support;
2779 nested = nla_nest_start_noflag(msg,
2780 NL80211_ATTR_BSS_SELECT);
2782 goto nla_put_failure;
2785 while (bss_select_support) {
2786 if ((bss_select_support & 1) &&
2787 nla_put_flag(msg, i))
2788 goto nla_put_failure;
2790 bss_select_support >>= 1;
2792 nla_nest_end(msg, nested);
2795 state->split_start++;
2798 if (rdev->wiphy.num_iftype_ext_capab &&
2799 rdev->wiphy.iftype_ext_capab) {
2800 struct nlattr *nested_ext_capab, *nested;
2802 nested = nla_nest_start_noflag(msg,
2803 NL80211_ATTR_IFTYPE_EXT_CAPA);
2805 goto nla_put_failure;
2807 for (i = state->capa_start;
2808 i < rdev->wiphy.num_iftype_ext_capab; i++) {
2809 const struct wiphy_iftype_ext_capab *capab;
2811 capab = &rdev->wiphy.iftype_ext_capab[i];
2813 nested_ext_capab = nla_nest_start_noflag(msg,
2815 if (!nested_ext_capab ||
2816 nla_put_u32(msg, NL80211_ATTR_IFTYPE,
2818 nla_put(msg, NL80211_ATTR_EXT_CAPA,
2819 capab->extended_capabilities_len,
2820 capab->extended_capabilities) ||
2821 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
2822 capab->extended_capabilities_len,
2823 capab->extended_capabilities_mask))
2824 goto nla_put_failure;
2826 nla_nest_end(msg, nested_ext_capab);
2830 nla_nest_end(msg, nested);
2831 if (i < rdev->wiphy.num_iftype_ext_capab) {
2832 state->capa_start = i + 1;
2837 if (nla_put_u32(msg, NL80211_ATTR_BANDS,
2838 rdev->wiphy.nan_supported_bands))
2839 goto nla_put_failure;
2841 if (wiphy_ext_feature_isset(&rdev->wiphy,
2842 NL80211_EXT_FEATURE_TXQS)) {
2843 struct cfg80211_txq_stats txqstats = {};
2846 res = rdev_get_txq_stats(rdev, NULL, &txqstats);
2848 !nl80211_put_txq_stats(msg, &txqstats,
2849 NL80211_ATTR_TXQ_STATS))
2850 goto nla_put_failure;
2852 if (nla_put_u32(msg, NL80211_ATTR_TXQ_LIMIT,
2853 rdev->wiphy.txq_limit))
2854 goto nla_put_failure;
2855 if (nla_put_u32(msg, NL80211_ATTR_TXQ_MEMORY_LIMIT,
2856 rdev->wiphy.txq_memory_limit))
2857 goto nla_put_failure;
2858 if (nla_put_u32(msg, NL80211_ATTR_TXQ_QUANTUM,
2859 rdev->wiphy.txq_quantum))
2860 goto nla_put_failure;
2863 state->split_start++;
2866 if (nl80211_send_pmsr_capa(rdev, msg))
2867 goto nla_put_failure;
2869 state->split_start++;
2872 if (rdev->wiphy.akm_suites &&
2873 nla_put(msg, NL80211_ATTR_AKM_SUITES,
2874 sizeof(u32) * rdev->wiphy.n_akm_suites,
2875 rdev->wiphy.akm_suites))
2876 goto nla_put_failure;
2878 if (nl80211_put_iftype_akm_suites(rdev, msg))
2879 goto nla_put_failure;
2881 if (nl80211_put_tid_config_support(rdev, msg))
2882 goto nla_put_failure;
2883 state->split_start++;
2886 if (nl80211_put_sar_specs(rdev, msg))
2887 goto nla_put_failure;
2889 if (nl80211_put_mbssid_support(&rdev->wiphy, msg))
2890 goto nla_put_failure;
2893 state->split_start = 0;
2897 genlmsg_end(msg, hdr);
2901 genlmsg_cancel(msg, hdr);
2905 static int nl80211_dump_wiphy_parse(struct sk_buff *skb,
2906 struct netlink_callback *cb,
2907 struct nl80211_dump_wiphy_state *state)
2909 struct nlattr **tb = kcalloc(NUM_NL80211_ATTR, sizeof(*tb), GFP_KERNEL);
2915 ret = nlmsg_parse_deprecated(cb->nlh,
2916 GENL_HDRLEN + nl80211_fam.hdrsize,
2917 tb, nl80211_fam.maxattr,
2918 nl80211_policy, NULL);
2919 /* ignore parse errors for backward compatibility */
2925 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP];
2926 if (tb[NL80211_ATTR_WIPHY])
2927 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
2928 if (tb[NL80211_ATTR_WDEV])
2929 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32;
2930 if (tb[NL80211_ATTR_IFINDEX]) {
2931 struct net_device *netdev;
2932 struct cfg80211_registered_device *rdev;
2933 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
2935 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx);
2940 if (netdev->ieee80211_ptr) {
2941 rdev = wiphy_to_rdev(
2942 netdev->ieee80211_ptr->wiphy);
2943 state->filter_wiphy = rdev->wiphy_idx;
2953 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
2956 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0];
2957 struct cfg80211_registered_device *rdev;
2961 state = kzalloc(sizeof(*state), GFP_KERNEL);
2966 state->filter_wiphy = -1;
2967 ret = nl80211_dump_wiphy_parse(skb, cb, state);
2973 cb->args[0] = (long)state;
2976 list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
2977 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
2979 if (++idx <= state->start)
2981 if (state->filter_wiphy != -1 &&
2982 state->filter_wiphy != rdev->wiphy_idx)
2984 /* attempt to fit multiple wiphy data chunks into the skb */
2986 ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY,
2988 NETLINK_CB(cb->skb).portid,
2990 NLM_F_MULTI, state);
2993 * If sending the wiphy data didn't fit (ENOBUFS
2994 * or EMSGSIZE returned), this SKB is still
2995 * empty (so it's not too big because another
2996 * wiphy dataset is already in the skb) and
2997 * we've not tried to adjust the dump allocation
2998 * yet ... then adjust the alloc size to be
2999 * bigger, and return 1 but with the empty skb.
3000 * This results in an empty message being RX'ed
3001 * in userspace, but that is ignored.
3003 * We can then retry with the larger buffer.
3005 if ((ret == -ENOBUFS || ret == -EMSGSIZE) &&
3006 !skb->len && !state->split &&
3007 cb->min_dump_alloc < 4096) {
3008 cb->min_dump_alloc = 4096;
3009 state->split_start = 0;
3016 } while (state->split_start > 0);
3026 static int nl80211_dump_wiphy_done(struct netlink_callback *cb)
3028 kfree((void *)cb->args[0]);
3032 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
3034 struct sk_buff *msg;
3035 struct cfg80211_registered_device *rdev = info->user_ptr[0];
3036 struct nl80211_dump_wiphy_state state = {};
3038 msg = nlmsg_new(4096, GFP_KERNEL);
3042 if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg,
3043 info->snd_portid, info->snd_seq, 0,
3049 return genlmsg_reply(msg, info);
3052 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
3053 [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 },
3054 [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 },
3055 [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 },
3056 [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 },
3057 [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 },
3060 static int parse_txq_params(struct nlattr *tb[],
3061 struct ieee80211_txq_params *txq_params)
3065 if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] ||
3066 !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
3067 !tb[NL80211_TXQ_ATTR_AIFS])
3070 ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]);
3071 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
3072 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
3073 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
3074 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
3076 if (ac >= NL80211_NUM_ACS)
3078 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS);
3082 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
3085 * You can only set the channel explicitly for some interfaces,
3086 * most have their channel managed via their respective
3087 * "establish a connection" command (connect, join, ...)
3089 * For AP/GO and mesh mode, the channel can be set with the
3090 * channel userspace API, but is only stored and passed to the
3091 * low-level driver when the AP starts or the mesh is joined.
3092 * This is for backward compatibility, userspace can also give
3093 * the channel in the start-ap or join-mesh commands instead.
3095 * Monitors are special as they are normally slaved to
3096 * whatever else is going on, so they have their own special
3097 * operation to set the monitor channel if possible.
3100 wdev->iftype == NL80211_IFTYPE_AP ||
3101 wdev->iftype == NL80211_IFTYPE_MESH_POINT ||
3102 wdev->iftype == NL80211_IFTYPE_MONITOR ||
3103 wdev->iftype == NL80211_IFTYPE_P2P_GO;
3106 int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
3107 struct genl_info *info,
3108 struct cfg80211_chan_def *chandef)
3110 struct netlink_ext_ack *extack = info->extack;
3111 struct nlattr **attrs = info->attrs;
3114 if (!attrs[NL80211_ATTR_WIPHY_FREQ])
3117 control_freq = MHZ_TO_KHZ(
3118 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
3119 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
3121 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
3123 memset(chandef, 0, sizeof(*chandef));
3124 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq);
3125 chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
3126 chandef->center_freq1 = KHZ_TO_MHZ(control_freq);
3127 chandef->freq1_offset = control_freq % 1000;
3128 chandef->center_freq2 = 0;
3130 /* Primary channel not allowed */
3131 if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) {
3132 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ],
3133 "Channel is disabled");
3137 if (attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
3138 enum nl80211_channel_type chantype;
3140 chantype = nla_get_u32(attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
3143 case NL80211_CHAN_NO_HT:
3144 case NL80211_CHAN_HT20:
3145 case NL80211_CHAN_HT40PLUS:
3146 case NL80211_CHAN_HT40MINUS:
3147 cfg80211_chandef_create(chandef, chandef->chan,
3149 /* user input for center_freq is incorrect */
3150 if (attrs[NL80211_ATTR_CENTER_FREQ1] &&
3151 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) {
3152 NL_SET_ERR_MSG_ATTR(extack,
3153 attrs[NL80211_ATTR_CENTER_FREQ1],
3154 "bad center frequency 1");
3157 /* center_freq2 must be zero */
3158 if (attrs[NL80211_ATTR_CENTER_FREQ2] &&
3159 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2])) {
3160 NL_SET_ERR_MSG_ATTR(extack,
3161 attrs[NL80211_ATTR_CENTER_FREQ2],
3162 "center frequency 2 can't be used");
3167 NL_SET_ERR_MSG_ATTR(extack,
3168 attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE],
3169 "invalid channel type");
3172 } else if (attrs[NL80211_ATTR_CHANNEL_WIDTH]) {
3174 nla_get_u32(attrs[NL80211_ATTR_CHANNEL_WIDTH]);
3175 if (attrs[NL80211_ATTR_CENTER_FREQ1]) {
3176 chandef->center_freq1 =
3177 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1]);
3178 if (attrs[NL80211_ATTR_CENTER_FREQ1_OFFSET])
3179 chandef->freq1_offset = nla_get_u32(
3180 attrs[NL80211_ATTR_CENTER_FREQ1_OFFSET]);
3182 chandef->freq1_offset = 0;
3184 if (attrs[NL80211_ATTR_CENTER_FREQ2])
3185 chandef->center_freq2 =
3186 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2]);
3189 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) {
3190 chandef->edmg.channels =
3191 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]);
3193 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG])
3194 chandef->edmg.bw_config =
3195 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]);
3197 chandef->edmg.bw_config = 0;
3198 chandef->edmg.channels = 0;
3201 if (!cfg80211_chandef_valid(chandef)) {
3202 NL_SET_ERR_MSG(extack, "invalid channel definition");
3206 if (!cfg80211_chandef_usable(&rdev->wiphy, chandef,
3207 IEEE80211_CHAN_DISABLED)) {
3208 NL_SET_ERR_MSG(extack, "(extension) channel is disabled");
3212 if ((chandef->width == NL80211_CHAN_WIDTH_5 ||
3213 chandef->width == NL80211_CHAN_WIDTH_10) &&
3214 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) {
3215 NL_SET_ERR_MSG(extack, "5/10 MHz not supported");
3222 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
3223 struct net_device *dev,
3224 struct genl_info *info)
3226 struct cfg80211_chan_def chandef;
3228 enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR;
3229 struct wireless_dev *wdev = NULL;
3232 wdev = dev->ieee80211_ptr;
3233 if (!nl80211_can_set_dev_channel(wdev))
3236 iftype = wdev->iftype;
3238 result = nl80211_parse_chandef(rdev, info, &chandef);
3243 case NL80211_IFTYPE_AP:
3244 case NL80211_IFTYPE_P2P_GO:
3245 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
3250 if (wdev->beacon_interval) {
3251 if (!dev || !rdev->ops->set_ap_chanwidth ||
3252 !(rdev->wiphy.features &
3253 NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) {
3258 /* Only allow dynamic channel width changes */
3259 if (chandef.chan != wdev->preset_chandef.chan) {
3263 result = rdev_set_ap_chanwidth(rdev, dev, &chandef);
3267 wdev->preset_chandef = chandef;
3270 case NL80211_IFTYPE_MESH_POINT:
3271 result = cfg80211_set_mesh_channel(rdev, wdev, &chandef);
3273 case NL80211_IFTYPE_MONITOR:
3274 result = cfg80211_set_monitor_channel(rdev, &chandef);
3283 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
3285 struct cfg80211_registered_device *rdev = info->user_ptr[0];
3286 struct net_device *netdev = info->user_ptr[1];
3288 return __nl80211_set_channel(rdev, netdev, info);
3291 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
3293 struct cfg80211_registered_device *rdev = NULL;
3294 struct net_device *netdev = NULL;
3295 struct wireless_dev *wdev;
3296 int result = 0, rem_txq_params = 0;
3297 struct nlattr *nl_txq_params;
3299 u8 retry_short = 0, retry_long = 0;
3300 u32 frag_threshold = 0, rts_threshold = 0;
3301 u8 coverage_class = 0;
3302 u32 txq_limit = 0, txq_memory_limit = 0, txq_quantum = 0;
3306 * Try to find the wiphy and netdev. Normally this
3307 * function shouldn't need the netdev, but this is
3308 * done for backward compatibility -- previously
3309 * setting the channel was done per wiphy, but now
3310 * it is per netdev. Previous userland like hostapd
3311 * also passed a netdev to set_wiphy, so that it is
3312 * possible to let that go to the right netdev!
3315 if (info->attrs[NL80211_ATTR_IFINDEX]) {
3316 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
3318 netdev = __dev_get_by_index(genl_info_net(info), ifindex);
3319 if (netdev && netdev->ieee80211_ptr)
3320 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy);
3326 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info),
3330 return PTR_ERR(rdev);
3336 wdev = netdev->ieee80211_ptr;
3338 wiphy_lock(&rdev->wiphy);
3341 * end workaround code, by now the rdev is available
3342 * and locked, and wdev may or may not be NULL.
3345 if (info->attrs[NL80211_ATTR_WIPHY_NAME])
3346 result = cfg80211_dev_rename(
3347 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
3353 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
3354 struct ieee80211_txq_params txq_params;
3355 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
3357 if (!rdev->ops->set_txq_params) {
3358 result = -EOPNOTSUPP;
3367 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3368 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
3373 if (!netif_running(netdev)) {
3378 nla_for_each_nested(nl_txq_params,
3379 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
3381 result = nla_parse_nested_deprecated(tb,
3382 NL80211_TXQ_ATTR_MAX,
3388 result = parse_txq_params(tb, &txq_params);
3392 result = rdev_set_txq_params(rdev, netdev,
3399 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
3400 result = __nl80211_set_channel(
3402 nl80211_can_set_dev_channel(wdev) ? netdev : NULL,
3408 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
3409 struct wireless_dev *txp_wdev = wdev;
3410 enum nl80211_tx_power_setting type;
3413 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER))
3416 if (!rdev->ops->set_tx_power) {
3417 result = -EOPNOTSUPP;
3421 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
3422 type = nla_get_u32(info->attrs[idx]);
3424 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
3425 (type != NL80211_TX_POWER_AUTOMATIC)) {
3430 if (type != NL80211_TX_POWER_AUTOMATIC) {
3431 idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
3432 mbm = nla_get_u32(info->attrs[idx]);
3435 result = rdev_set_tx_power(rdev, txp_wdev, type, mbm);
3440 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
3441 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
3444 if ((!rdev->wiphy.available_antennas_tx &&
3445 !rdev->wiphy.available_antennas_rx) ||
3446 !rdev->ops->set_antenna) {
3447 result = -EOPNOTSUPP;
3451 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
3452 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
3454 /* reject antenna configurations which don't match the
3455 * available antenna masks, except for the "all" mask */
3456 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
3457 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) {
3462 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
3463 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
3465 result = rdev_set_antenna(rdev, tx_ant, rx_ant);
3472 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
3473 retry_short = nla_get_u8(
3474 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
3476 changed |= WIPHY_PARAM_RETRY_SHORT;
3479 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
3480 retry_long = nla_get_u8(
3481 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
3483 changed |= WIPHY_PARAM_RETRY_LONG;
3486 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
3487 frag_threshold = nla_get_u32(
3488 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
3489 if (frag_threshold < 256) {
3494 if (frag_threshold != (u32) -1) {
3496 * Fragments (apart from the last one) are required to
3497 * have even length. Make the fragmentation code
3498 * simpler by stripping LSB should someone try to use
3499 * odd threshold value.
3501 frag_threshold &= ~0x1;
3503 changed |= WIPHY_PARAM_FRAG_THRESHOLD;
3506 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
3507 rts_threshold = nla_get_u32(
3508 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
3509 changed |= WIPHY_PARAM_RTS_THRESHOLD;
3512 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
3513 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) {
3518 coverage_class = nla_get_u8(
3519 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
3520 changed |= WIPHY_PARAM_COVERAGE_CLASS;
3523 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) {
3524 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) {
3525 result = -EOPNOTSUPP;
3529 changed |= WIPHY_PARAM_DYN_ACK;
3532 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) {
3533 if (!wiphy_ext_feature_isset(&rdev->wiphy,
3534 NL80211_EXT_FEATURE_TXQS)) {
3535 result = -EOPNOTSUPP;
3538 txq_limit = nla_get_u32(
3539 info->attrs[NL80211_ATTR_TXQ_LIMIT]);
3540 changed |= WIPHY_PARAM_TXQ_LIMIT;
3543 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) {
3544 if (!wiphy_ext_feature_isset(&rdev->wiphy,
3545 NL80211_EXT_FEATURE_TXQS)) {
3546 result = -EOPNOTSUPP;
3549 txq_memory_limit = nla_get_u32(
3550 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]);
3551 changed |= WIPHY_PARAM_TXQ_MEMORY_LIMIT;
3554 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) {
3555 if (!wiphy_ext_feature_isset(&rdev->wiphy,
3556 NL80211_EXT_FEATURE_TXQS)) {
3557 result = -EOPNOTSUPP;
3560 txq_quantum = nla_get_u32(
3561 info->attrs[NL80211_ATTR_TXQ_QUANTUM]);
3562 changed |= WIPHY_PARAM_TXQ_QUANTUM;
3566 u8 old_retry_short, old_retry_long;
3567 u32 old_frag_threshold, old_rts_threshold;
3568 u8 old_coverage_class;
3569 u32 old_txq_limit, old_txq_memory_limit, old_txq_quantum;
3571 if (!rdev->ops->set_wiphy_params) {
3572 result = -EOPNOTSUPP;
3576 old_retry_short = rdev->wiphy.retry_short;
3577 old_retry_long = rdev->wiphy.retry_long;
3578 old_frag_threshold = rdev->wiphy.frag_threshold;
3579 old_rts_threshold = rdev->wiphy.rts_threshold;
3580 old_coverage_class = rdev->wiphy.coverage_class;
3581 old_txq_limit = rdev->wiphy.txq_limit;
3582 old_txq_memory_limit = rdev->wiphy.txq_memory_limit;
3583 old_txq_quantum = rdev->wiphy.txq_quantum;
3585 if (changed & WIPHY_PARAM_RETRY_SHORT)
3586 rdev->wiphy.retry_short = retry_short;
3587 if (changed & WIPHY_PARAM_RETRY_LONG)
3588 rdev->wiphy.retry_long = retry_long;
3589 if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
3590 rdev->wiphy.frag_threshold = frag_threshold;
3591 if (changed & WIPHY_PARAM_RTS_THRESHOLD)
3592 rdev->wiphy.rts_threshold = rts_threshold;
3593 if (changed & WIPHY_PARAM_COVERAGE_CLASS)
3594 rdev->wiphy.coverage_class = coverage_class;
3595 if (changed & WIPHY_PARAM_TXQ_LIMIT)
3596 rdev->wiphy.txq_limit = txq_limit;
3597 if (changed & WIPHY_PARAM_TXQ_MEMORY_LIMIT)
3598 rdev->wiphy.txq_memory_limit = txq_memory_limit;
3599 if (changed & WIPHY_PARAM_TXQ_QUANTUM)
3600 rdev->wiphy.txq_quantum = txq_quantum;
3602 result = rdev_set_wiphy_params(rdev, changed);
3604 rdev->wiphy.retry_short = old_retry_short;
3605 rdev->wiphy.retry_long = old_retry_long;
3606 rdev->wiphy.frag_threshold = old_frag_threshold;
3607 rdev->wiphy.rts_threshold = old_rts_threshold;
3608 rdev->wiphy.coverage_class = old_coverage_class;
3609 rdev->wiphy.txq_limit = old_txq_limit;
3610 rdev->wiphy.txq_memory_limit = old_txq_memory_limit;
3611 rdev->wiphy.txq_quantum = old_txq_quantum;
3619 wiphy_unlock(&rdev->wiphy);
3623 static int nl80211_send_chandef(struct sk_buff *msg,
3624 const struct cfg80211_chan_def *chandef)
3626 if (WARN_ON(!cfg80211_chandef_valid(chandef)))
3629 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ,
3630 chandef->chan->center_freq))
3632 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET,
3633 chandef->chan->freq_offset))
3635 switch (chandef->width) {
3636 case NL80211_CHAN_WIDTH_20_NOHT:
3637 case NL80211_CHAN_WIDTH_20:
3638 case NL80211_CHAN_WIDTH_40:
3639 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
3640 cfg80211_get_chandef_type(chandef)))
3646 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width))
3648 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1))
3650 if (chandef->center_freq2 &&
3651 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2))
3656 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags,
3657 struct cfg80211_registered_device *rdev,
3658 struct wireless_dev *wdev,
3659 enum nl80211_commands cmd)
3661 struct net_device *dev = wdev->netdev;
3664 WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE &&
3665 cmd != NL80211_CMD_DEL_INTERFACE &&
3666 cmd != NL80211_CMD_SET_INTERFACE);
3668 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
3673 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
3674 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name)))
3675 goto nla_put_failure;
3677 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
3678 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) ||
3679 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
3680 NL80211_ATTR_PAD) ||
3681 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) ||
3682 nla_put_u32(msg, NL80211_ATTR_GENERATION,
3683 rdev->devlist_generation ^
3684 (cfg80211_rdev_list_generation << 2)) ||
3685 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr))
3686 goto nla_put_failure;
3688 if (rdev->ops->get_channel) {
3690 struct cfg80211_chan_def chandef = {};
3692 ret = rdev_get_channel(rdev, wdev, &chandef);
3694 if (nl80211_send_chandef(msg, &chandef))
3695 goto nla_put_failure;
3699 if (rdev->ops->get_tx_power) {
3702 ret = rdev_get_tx_power(rdev, wdev, &dbm);
3704 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
3706 goto nla_put_failure;
3710 switch (wdev->iftype) {
3711 case NL80211_IFTYPE_AP:
3712 if (wdev->ssid_len &&
3713 nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid))
3714 goto nla_put_failure_locked;
3716 case NL80211_IFTYPE_STATION:
3717 case NL80211_IFTYPE_P2P_CLIENT:
3718 case NL80211_IFTYPE_ADHOC: {
3719 const struct element *ssid_elem;
3721 if (!wdev->current_bss)
3724 ssid_elem = ieee80211_bss_get_elem(&wdev->current_bss->pub,
3727 nla_put(msg, NL80211_ATTR_SSID, ssid_elem->datalen,
3729 goto nla_put_failure_rcu_locked;
3739 if (rdev->ops->get_txq_stats) {
3740 struct cfg80211_txq_stats txqstats = {};
3741 int ret = rdev_get_txq_stats(rdev, wdev, &txqstats);
3744 !nl80211_put_txq_stats(msg, &txqstats,
3745 NL80211_ATTR_TXQ_STATS))
3746 goto nla_put_failure;
3749 genlmsg_end(msg, hdr);
3752 nla_put_failure_rcu_locked:
3754 nla_put_failure_locked:
3757 genlmsg_cancel(msg, hdr);
3761 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
3765 int wp_start = cb->args[0];
3766 int if_start = cb->args[1];
3767 int filter_wiphy = -1;
3768 struct cfg80211_registered_device *rdev;
3769 struct wireless_dev *wdev;
3774 struct nl80211_dump_wiphy_state state = {
3778 ret = nl80211_dump_wiphy_parse(skb, cb, &state);
3782 filter_wiphy = state.filter_wiphy;
3785 * if filtering, set cb->args[2] to +1 since 0 is the default
3786 * value needed to determine that parsing is necessary.
3788 if (filter_wiphy >= 0)
3789 cb->args[2] = filter_wiphy + 1;
3792 } else if (cb->args[2] > 0) {
3793 filter_wiphy = cb->args[2] - 1;
3796 list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
3797 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
3799 if (wp_idx < wp_start) {
3804 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx)
3809 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
3810 if (if_idx < if_start) {
3814 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid,
3815 cb->nlh->nlmsg_seq, NLM_F_MULTI,
3817 NL80211_CMD_NEW_INTERFACE) < 0) {
3826 cb->args[0] = wp_idx;
3827 cb->args[1] = if_idx;
3836 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
3838 struct sk_buff *msg;
3839 struct cfg80211_registered_device *rdev = info->user_ptr[0];
3840 struct wireless_dev *wdev = info->user_ptr[1];
3842 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3846 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
3847 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) {
3852 return genlmsg_reply(msg, info);
3855 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = {
3856 [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG },
3857 [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG },
3858 [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG },
3859 [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
3860 [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
3861 [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG },
3864 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
3866 struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1];
3874 if (nla_parse_nested_deprecated(flags, NL80211_MNTR_FLAG_MAX, nla, mntr_flags_policy, NULL))
3877 for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
3879 *mntrflags |= (1<<flag);
3881 *mntrflags |= MONITOR_FLAG_CHANGED;
3886 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev,
3887 enum nl80211_iftype type,
3888 struct genl_info *info,
3889 struct vif_params *params)
3891 bool change = false;
3894 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
3895 if (type != NL80211_IFTYPE_MONITOR)
3898 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
3906 if (params->flags & MONITOR_FLAG_ACTIVE &&
3907 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
3910 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) {
3911 const u8 *mumimo_groups;
3912 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
3914 if (type != NL80211_IFTYPE_MONITOR)
3917 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
3921 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]);
3923 /* bits 0 and 63 are reserved and must be zero */
3924 if ((mumimo_groups[0] & BIT(0)) ||
3925 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7)))
3928 params->vht_mumimo_groups = mumimo_groups;
3932 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) {
3933 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
3935 if (type != NL80211_IFTYPE_MONITOR)
3938 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
3941 params->vht_mumimo_follow_addr =
3942 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]);
3946 return change ? 1 : 0;
3949 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev,
3950 struct net_device *netdev, u8 use_4addr,
3951 enum nl80211_iftype iftype)
3954 if (netdev && netif_is_bridge_port(netdev))
3960 case NL80211_IFTYPE_AP_VLAN:
3961 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP)
3964 case NL80211_IFTYPE_STATION:
3965 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION)
3975 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
3977 struct cfg80211_registered_device *rdev = info->user_ptr[0];
3978 struct vif_params params;
3980 enum nl80211_iftype otype, ntype;
3981 struct net_device *dev = info->user_ptr[1];
3982 bool change = false;
3984 memset(¶ms, 0, sizeof(params));
3986 otype = ntype = dev->ieee80211_ptr->iftype;
3988 if (info->attrs[NL80211_ATTR_IFTYPE]) {
3989 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
3994 if (info->attrs[NL80211_ATTR_MESH_ID]) {
3995 struct wireless_dev *wdev = dev->ieee80211_ptr;
3997 if (ntype != NL80211_IFTYPE_MESH_POINT)
3999 if (netif_running(dev))
4003 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
4004 IEEE80211_MAX_MESH_ID_LEN);
4005 wdev->mesh_id_up_len =
4006 nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
4007 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
4008 wdev->mesh_id_up_len);
4012 if (info->attrs[NL80211_ATTR_4ADDR]) {
4013 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
4015 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype);
4019 params.use_4addr = -1;
4022 err = nl80211_parse_mon_options(rdev, ntype, info, ¶ms);
4029 err = cfg80211_change_iface(rdev, dev, ntype, ¶ms);
4033 if (!err && params.use_4addr != -1)
4034 dev->ieee80211_ptr->use_4addr = params.use_4addr;
4036 if (change && !err) {
4037 struct wireless_dev *wdev = dev->ieee80211_ptr;
4039 nl80211_notify_iface(rdev, wdev, NL80211_CMD_SET_INTERFACE);
4045 static int _nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
4047 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4048 struct vif_params params;
4049 struct wireless_dev *wdev;
4050 struct sk_buff *msg;
4052 enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
4054 memset(¶ms, 0, sizeof(params));
4056 if (!info->attrs[NL80211_ATTR_IFNAME])
4059 if (info->attrs[NL80211_ATTR_IFTYPE])
4060 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
4062 if (!rdev->ops->add_virtual_intf)
4065 if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN ||
4066 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) &&
4067 info->attrs[NL80211_ATTR_MAC]) {
4068 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC],
4070 if (!is_valid_ether_addr(params.macaddr))
4071 return -EADDRNOTAVAIL;
4074 if (info->attrs[NL80211_ATTR_4ADDR]) {
4075 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
4076 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type);
4081 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0))
4084 err = nl80211_parse_mon_options(rdev, type, info, ¶ms);
4088 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
4092 wdev = rdev_add_virtual_intf(rdev,
4093 nla_data(info->attrs[NL80211_ATTR_IFNAME]),
4094 NET_NAME_USER, type, ¶ms);
4095 if (WARN_ON(!wdev)) {
4098 } else if (IS_ERR(wdev)) {
4100 return PTR_ERR(wdev);
4103 if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
4104 wdev->owner_nlportid = info->snd_portid;
4107 case NL80211_IFTYPE_MESH_POINT:
4108 if (!info->attrs[NL80211_ATTR_MESH_ID])
4111 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
4112 IEEE80211_MAX_MESH_ID_LEN);
4113 wdev->mesh_id_up_len =
4114 nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
4115 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
4116 wdev->mesh_id_up_len);
4119 case NL80211_IFTYPE_NAN:
4120 case NL80211_IFTYPE_P2P_DEVICE:
4122 * P2P Device and NAN do not have a netdev, so don't go
4123 * through the netdev notifier and must be added here
4125 cfg80211_init_wdev(wdev);
4126 cfg80211_register_wdev(rdev, wdev);
4132 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
4133 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) {
4138 return genlmsg_reply(msg, info);
4141 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
4143 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4146 /* to avoid failing a new interface creation due to pending removal */
4147 cfg80211_destroy_ifaces(rdev);
4149 wiphy_lock(&rdev->wiphy);
4150 ret = _nl80211_new_interface(skb, info);
4151 wiphy_unlock(&rdev->wiphy);
4156 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
4158 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4159 struct wireless_dev *wdev = info->user_ptr[1];
4161 if (!rdev->ops->del_virtual_intf)
4165 * We hold RTNL, so this is safe, without RTNL opencount cannot
4166 * reach 0, and thus the rdev cannot be deleted.
4168 * We need to do it for the dev_close(), since that will call
4169 * the netdev notifiers, and we need to acquire the mutex there
4170 * but don't know if we get there from here or from some other
4171 * place (e.g. "ip link set ... down").
4173 mutex_unlock(&rdev->wiphy.mtx);
4176 * If we remove a wireless device without a netdev then clear
4177 * user_ptr[1] so that nl80211_post_doit won't dereference it
4178 * to check if it needs to do dev_put(). Otherwise it crashes
4179 * since the wdev has been freed, unlike with a netdev where
4180 * we need the dev_put() for the netdev to really be freed.
4183 info->user_ptr[1] = NULL;
4185 dev_close(wdev->netdev);
4187 mutex_lock(&rdev->wiphy.mtx);
4189 return rdev_del_virtual_intf(rdev, wdev);
4192 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info)
4194 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4195 struct net_device *dev = info->user_ptr[1];
4198 if (!info->attrs[NL80211_ATTR_NOACK_MAP])
4201 if (!rdev->ops->set_noack_map)
4204 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]);
4206 return rdev_set_noack_map(rdev, dev, noack_map);
4209 struct get_key_cookie {
4210 struct sk_buff *msg;
4215 static void get_key_callback(void *c, struct key_params *params)
4218 struct get_key_cookie *cookie = c;
4221 nla_put(cookie->msg, NL80211_ATTR_KEY_DATA,
4222 params->key_len, params->key)) ||
4224 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ,
4225 params->seq_len, params->seq)) ||
4227 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER,
4229 goto nla_put_failure;
4231 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY);
4233 goto nla_put_failure;
4236 nla_put(cookie->msg, NL80211_KEY_DATA,
4237 params->key_len, params->key)) ||
4239 nla_put(cookie->msg, NL80211_KEY_SEQ,
4240 params->seq_len, params->seq)) ||
4242 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER,
4244 goto nla_put_failure;
4246 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx))
4247 goto nla_put_failure;
4249 nla_nest_end(cookie->msg, key);
4256 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
4258 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4260 struct net_device *dev = info->user_ptr[1];
4262 const u8 *mac_addr = NULL;
4264 struct get_key_cookie cookie = {
4268 struct sk_buff *msg;
4269 bool bigtk_support = false;
4271 if (wiphy_ext_feature_isset(&rdev->wiphy,
4272 NL80211_EXT_FEATURE_BEACON_PROTECTION))
4273 bigtk_support = true;
4275 if ((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_STATION ||
4276 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_CLIENT) &&
4277 wiphy_ext_feature_isset(&rdev->wiphy,
4278 NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT))
4279 bigtk_support = true;
4281 if (info->attrs[NL80211_ATTR_KEY_IDX]) {
4282 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
4284 if (key_idx >= 6 && key_idx <= 7 && !bigtk_support) {
4285 GENL_SET_ERR_MSG(info, "BIGTK not supported");
4290 if (info->attrs[NL80211_ATTR_MAC])
4291 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4293 pairwise = !!mac_addr;
4294 if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
4295 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
4297 if (kt != NL80211_KEYTYPE_GROUP &&
4298 kt != NL80211_KEYTYPE_PAIRWISE)
4300 pairwise = kt == NL80211_KEYTYPE_PAIRWISE;
4303 if (!rdev->ops->get_key)
4306 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
4309 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
4313 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
4314 NL80211_CMD_NEW_KEY);
4316 goto nla_put_failure;
4319 cookie.idx = key_idx;
4321 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
4322 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx))
4323 goto nla_put_failure;
4325 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
4326 goto nla_put_failure;
4328 err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie,
4335 goto nla_put_failure;
4337 genlmsg_end(msg, hdr);
4338 return genlmsg_reply(msg, info);
4347 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
4349 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4350 struct key_parse key;
4352 struct net_device *dev = info->user_ptr[1];
4354 err = nl80211_parse_key(info, &key);
4361 /* Only support setting default key and
4362 * Extended Key ID action NL80211_KEY_SET_TX.
4364 if (!key.def && !key.defmgmt && !key.defbeacon &&
4365 !(key.p.mode == NL80211_KEY_SET_TX))
4368 wdev_lock(dev->ieee80211_ptr);
4371 if (!rdev->ops->set_default_key) {
4376 err = nl80211_key_allowed(dev->ieee80211_ptr);
4380 err = rdev_set_default_key(rdev, dev, key.idx,
4381 key.def_uni, key.def_multi);
4386 #ifdef CONFIG_CFG80211_WEXT
4387 dev->ieee80211_ptr->wext.default_key = key.idx;
4389 } else if (key.defmgmt) {
4390 if (key.def_uni || !key.def_multi) {
4395 if (!rdev->ops->set_default_mgmt_key) {
4400 err = nl80211_key_allowed(dev->ieee80211_ptr);
4404 err = rdev_set_default_mgmt_key(rdev, dev, key.idx);
4408 #ifdef CONFIG_CFG80211_WEXT
4409 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx;
4411 } else if (key.defbeacon) {
4412 if (key.def_uni || !key.def_multi) {
4417 if (!rdev->ops->set_default_beacon_key) {
4422 err = nl80211_key_allowed(dev->ieee80211_ptr);
4426 err = rdev_set_default_beacon_key(rdev, dev, key.idx);
4429 } else if (key.p.mode == NL80211_KEY_SET_TX &&
4430 wiphy_ext_feature_isset(&rdev->wiphy,
4431 NL80211_EXT_FEATURE_EXT_KEY_ID)) {
4432 u8 *mac_addr = NULL;
4434 if (info->attrs[NL80211_ATTR_MAC])
4435 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4437 if (!mac_addr || key.idx < 0 || key.idx > 1) {
4442 err = rdev_add_key(rdev, dev, key.idx,
4443 NL80211_KEYTYPE_PAIRWISE,
4449 wdev_unlock(dev->ieee80211_ptr);
4454 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
4456 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4458 struct net_device *dev = info->user_ptr[1];
4459 struct key_parse key;
4460 const u8 *mac_addr = NULL;
4462 err = nl80211_parse_key(info, &key);
4467 GENL_SET_ERR_MSG(info, "no key");
4471 if (info->attrs[NL80211_ATTR_MAC])
4472 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4474 if (key.type == -1) {
4476 key.type = NL80211_KEYTYPE_PAIRWISE;
4478 key.type = NL80211_KEYTYPE_GROUP;
4482 if (key.type != NL80211_KEYTYPE_PAIRWISE &&
4483 key.type != NL80211_KEYTYPE_GROUP) {
4484 GENL_SET_ERR_MSG(info, "key type not pairwise or group");
4488 if (key.type == NL80211_KEYTYPE_GROUP &&
4489 info->attrs[NL80211_ATTR_VLAN_ID])
4490 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
4492 if (!rdev->ops->add_key)
4495 if (cfg80211_validate_key_settings(rdev, &key.p, key.idx,
4496 key.type == NL80211_KEYTYPE_PAIRWISE,
4498 GENL_SET_ERR_MSG(info, "key setting validation failed");
4502 wdev_lock(dev->ieee80211_ptr);
4503 err = nl80211_key_allowed(dev->ieee80211_ptr);
4505 GENL_SET_ERR_MSG(info, "key not allowed");
4507 err = rdev_add_key(rdev, dev, key.idx,
4508 key.type == NL80211_KEYTYPE_PAIRWISE,
4511 GENL_SET_ERR_MSG(info, "key addition failed");
4513 wdev_unlock(dev->ieee80211_ptr);
4518 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
4520 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4522 struct net_device *dev = info->user_ptr[1];
4523 u8 *mac_addr = NULL;
4524 struct key_parse key;
4526 err = nl80211_parse_key(info, &key);
4530 if (info->attrs[NL80211_ATTR_MAC])
4531 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4533 if (key.type == -1) {
4535 key.type = NL80211_KEYTYPE_PAIRWISE;
4537 key.type = NL80211_KEYTYPE_GROUP;
4541 if (key.type != NL80211_KEYTYPE_PAIRWISE &&
4542 key.type != NL80211_KEYTYPE_GROUP)
4545 if (!cfg80211_valid_key_idx(rdev, key.idx,
4546 key.type == NL80211_KEYTYPE_PAIRWISE))
4549 if (!rdev->ops->del_key)
4552 wdev_lock(dev->ieee80211_ptr);
4553 err = nl80211_key_allowed(dev->ieee80211_ptr);
4555 if (key.type == NL80211_KEYTYPE_GROUP && mac_addr &&
4556 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
4560 err = rdev_del_key(rdev, dev, key.idx,
4561 key.type == NL80211_KEYTYPE_PAIRWISE,
4564 #ifdef CONFIG_CFG80211_WEXT
4566 if (key.idx == dev->ieee80211_ptr->wext.default_key)
4567 dev->ieee80211_ptr->wext.default_key = -1;
4568 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key)
4569 dev->ieee80211_ptr->wext.default_mgmt_key = -1;
4572 wdev_unlock(dev->ieee80211_ptr);
4577 /* This function returns an error or the number of nested attributes */
4578 static int validate_acl_mac_addrs(struct nlattr *nl_attr)
4580 struct nlattr *attr;
4581 int n_entries = 0, tmp;
4583 nla_for_each_nested(attr, nl_attr, tmp) {
4584 if (nla_len(attr) != ETH_ALEN)
4594 * This function parses ACL information and allocates memory for ACL data.
4595 * On successful return, the calling function is responsible to free the
4596 * ACL buffer returned by this function.
4598 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy,
4599 struct genl_info *info)
4601 enum nl80211_acl_policy acl_policy;
4602 struct nlattr *attr;
4603 struct cfg80211_acl_data *acl;
4604 int i = 0, n_entries, tmp;
4606 if (!wiphy->max_acl_mac_addrs)
4607 return ERR_PTR(-EOPNOTSUPP);
4609 if (!info->attrs[NL80211_ATTR_ACL_POLICY])
4610 return ERR_PTR(-EINVAL);
4612 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]);
4613 if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED &&
4614 acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED)
4615 return ERR_PTR(-EINVAL);
4617 if (!info->attrs[NL80211_ATTR_MAC_ADDRS])
4618 return ERR_PTR(-EINVAL);
4620 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]);
4622 return ERR_PTR(n_entries);
4624 if (n_entries > wiphy->max_acl_mac_addrs)
4625 return ERR_PTR(-ENOTSUPP);
4627 acl = kzalloc(struct_size(acl, mac_addrs, n_entries), GFP_KERNEL);
4629 return ERR_PTR(-ENOMEM);
4631 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) {
4632 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN);
4636 acl->n_acl_entries = n_entries;
4637 acl->acl_policy = acl_policy;
4642 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info)
4644 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4645 struct net_device *dev = info->user_ptr[1];
4646 struct cfg80211_acl_data *acl;
4649 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
4650 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4653 if (!dev->ieee80211_ptr->beacon_interval)
4656 acl = parse_acl_data(&rdev->wiphy, info);
4658 return PTR_ERR(acl);
4660 err = rdev_set_mac_acl(rdev, dev, acl);
4667 static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
4668 u8 *rates, u8 rates_len)
4673 for (i = 0; i < rates_len; i++) {
4674 int rate = (rates[i] & 0x7f) * 5;
4677 for (ridx = 0; ridx < sband->n_bitrates; ridx++) {
4678 struct ieee80211_rate *srate =
4679 &sband->bitrates[ridx];
4680 if (rate == srate->bitrate) {
4685 if (ridx == sband->n_bitrates)
4686 return 0; /* rate not found */
4692 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband,
4693 u8 *rates, u8 rates_len,
4694 u8 mcs[IEEE80211_HT_MCS_MASK_LEN])
4698 memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN);
4700 for (i = 0; i < rates_len; i++) {
4703 ridx = rates[i] / 8;
4704 rbit = BIT(rates[i] % 8);
4706 /* check validity */
4707 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN))
4710 /* check availability */
4711 ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN);
4712 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit)
4721 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map)
4725 switch (vht_mcs_map) {
4726 case IEEE80211_VHT_MCS_NOT_SUPPORTED:
4728 case IEEE80211_VHT_MCS_SUPPORT_0_7:
4731 case IEEE80211_VHT_MCS_SUPPORT_0_8:
4734 case IEEE80211_VHT_MCS_SUPPORT_0_9:
4744 static void vht_build_mcs_mask(u16 vht_mcs_map,
4745 u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
4749 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
4750 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03);
4755 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband,
4756 struct nl80211_txrate_vht *txrate,
4757 u16 mcs[NL80211_VHT_NSS_MAX])
4759 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
4760 u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {};
4763 if (!sband->vht_cap.vht_supported)
4766 memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX);
4768 /* Build vht_mcs_mask from VHT capabilities */
4769 vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask);
4771 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
4772 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
4773 mcs[i] = txrate->mcs[i];
4781 static u16 he_mcs_map_to_mcs_mask(u8 he_mcs_map)
4783 switch (he_mcs_map) {
4784 case IEEE80211_HE_MCS_NOT_SUPPORTED:
4786 case IEEE80211_HE_MCS_SUPPORT_0_7:
4788 case IEEE80211_HE_MCS_SUPPORT_0_9:
4790 case IEEE80211_HE_MCS_SUPPORT_0_11:
4798 static void he_build_mcs_mask(u16 he_mcs_map,
4799 u16 he_mcs_mask[NL80211_HE_NSS_MAX])
4803 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
4804 he_mcs_mask[nss] = he_mcs_map_to_mcs_mask(he_mcs_map & 0x03);
4809 static u16 he_get_txmcsmap(struct genl_info *info,
4810 const struct ieee80211_sta_he_cap *he_cap)
4812 struct net_device *dev = info->user_ptr[1];
4813 struct wireless_dev *wdev = dev->ieee80211_ptr;
4816 switch (wdev->chandef.width) {
4817 case NL80211_CHAN_WIDTH_80P80:
4818 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80;
4820 case NL80211_CHAN_WIDTH_160:
4821 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160;
4824 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80;
4827 return le16_to_cpu(tx_mcs);
4830 static bool he_set_mcs_mask(struct genl_info *info,
4831 struct wireless_dev *wdev,
4832 struct ieee80211_supported_band *sband,
4833 struct nl80211_txrate_he *txrate,
4834 u16 mcs[NL80211_HE_NSS_MAX])
4836 const struct ieee80211_sta_he_cap *he_cap;
4837 u16 tx_mcs_mask[NL80211_HE_NSS_MAX] = {};
4841 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype);
4845 memset(mcs, 0, sizeof(u16) * NL80211_HE_NSS_MAX);
4847 tx_mcs_map = he_get_txmcsmap(info, he_cap);
4849 /* Build he_mcs_mask from HE capabilities */
4850 he_build_mcs_mask(tx_mcs_map, tx_mcs_mask);
4852 for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
4853 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
4854 mcs[i] = txrate->mcs[i];
4862 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
4863 struct nlattr *attrs[],
4864 enum nl80211_attrs attr,
4865 struct cfg80211_bitrate_mask *mask,
4866 struct net_device *dev,
4867 bool default_all_enabled)
4869 struct nlattr *tb[NL80211_TXRATE_MAX + 1];
4870 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4871 struct wireless_dev *wdev = dev->ieee80211_ptr;
4873 struct nlattr *tx_rates;
4874 struct ieee80211_supported_band *sband;
4875 u16 vht_tx_mcs_map, he_tx_mcs_map;
4877 memset(mask, 0, sizeof(*mask));
4878 /* Default to all rates enabled */
4879 for (i = 0; i < NUM_NL80211_BANDS; i++) {
4880 const struct ieee80211_sta_he_cap *he_cap;
4882 if (!default_all_enabled)
4885 sband = rdev->wiphy.bands[i];
4890 mask->control[i].legacy = (1 << sband->n_bitrates) - 1;
4891 memcpy(mask->control[i].ht_mcs,
4892 sband->ht_cap.mcs.rx_mask,
4893 sizeof(mask->control[i].ht_mcs));
4895 if (sband->vht_cap.vht_supported) {
4896 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
4897 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs);
4900 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype);
4904 he_tx_mcs_map = he_get_txmcsmap(info, he_cap);
4905 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs);
4907 mask->control[i].he_gi = 0xFF;
4908 mask->control[i].he_ltf = 0xFF;
4911 /* if no rates are given set it back to the defaults */
4915 /* The nested attribute uses enum nl80211_band as the index. This maps
4916 * directly to the enum nl80211_band values used in cfg80211.
4918 BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
4919 nla_for_each_nested(tx_rates, attrs[attr], rem) {
4920 enum nl80211_band band = nla_type(tx_rates);
4923 if (band < 0 || band >= NUM_NL80211_BANDS)
4925 sband = rdev->wiphy.bands[band];
4928 err = nla_parse_nested_deprecated(tb, NL80211_TXRATE_MAX,
4930 nl80211_txattr_policy,
4934 if (tb[NL80211_TXRATE_LEGACY]) {
4935 mask->control[band].legacy = rateset_to_mask(
4937 nla_data(tb[NL80211_TXRATE_LEGACY]),
4938 nla_len(tb[NL80211_TXRATE_LEGACY]));
4939 if ((mask->control[band].legacy == 0) &&
4940 nla_len(tb[NL80211_TXRATE_LEGACY]))
4943 if (tb[NL80211_TXRATE_HT]) {
4944 if (!ht_rateset_to_mask(
4946 nla_data(tb[NL80211_TXRATE_HT]),
4947 nla_len(tb[NL80211_TXRATE_HT]),
4948 mask->control[band].ht_mcs))
4952 if (tb[NL80211_TXRATE_VHT]) {
4953 if (!vht_set_mcs_mask(
4955 nla_data(tb[NL80211_TXRATE_VHT]),
4956 mask->control[band].vht_mcs))
4960 if (tb[NL80211_TXRATE_GI]) {
4961 mask->control[band].gi =
4962 nla_get_u8(tb[NL80211_TXRATE_GI]);
4963 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI)
4966 if (tb[NL80211_TXRATE_HE] &&
4967 !he_set_mcs_mask(info, wdev, sband,
4968 nla_data(tb[NL80211_TXRATE_HE]),
4969 mask->control[band].he_mcs))
4972 if (tb[NL80211_TXRATE_HE_GI])
4973 mask->control[band].he_gi =
4974 nla_get_u8(tb[NL80211_TXRATE_HE_GI]);
4975 if (tb[NL80211_TXRATE_HE_LTF])
4976 mask->control[band].he_ltf =
4977 nla_get_u8(tb[NL80211_TXRATE_HE_LTF]);
4979 if (mask->control[band].legacy == 0) {
4980 /* don't allow empty legacy rates if HT, VHT or HE
4981 * are not even supported.
4983 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported ||
4984 rdev->wiphy.bands[band]->vht_cap.vht_supported ||
4985 ieee80211_get_he_iftype_cap(sband, wdev->iftype)))
4988 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4989 if (mask->control[band].ht_mcs[i])
4992 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4993 if (mask->control[band].vht_mcs[i])
4996 for (i = 0; i < NL80211_HE_NSS_MAX; i++)
4997 if (mask->control[band].he_mcs[i])
5000 /* legacy and mcs rates may not be both empty */
5009 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev,
5010 enum nl80211_band band,
5011 struct cfg80211_bitrate_mask *beacon_rate)
5013 u32 count_ht, count_vht, count_he, i;
5014 u32 rate = beacon_rate->control[band].legacy;
5016 /* Allow only one rate */
5017 if (hweight32(rate) > 1)
5021 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
5022 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) {
5024 } else if (beacon_rate->control[band].ht_mcs[i]) {
5029 if (count_ht && rate)
5034 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
5035 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) {
5037 } else if (beacon_rate->control[band].vht_mcs[i]) {
5042 if (count_vht && rate)
5047 for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
5048 if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) {
5050 } else if (beacon_rate->control[band].he_mcs[i]) {
5055 if (count_he && rate)
5059 if ((count_ht && count_vht && count_he) ||
5060 (!rate && !count_ht && !count_vht && !count_he))
5064 !wiphy_ext_feature_isset(&rdev->wiphy,
5065 NL80211_EXT_FEATURE_BEACON_RATE_LEGACY))
5068 !wiphy_ext_feature_isset(&rdev->wiphy,
5069 NL80211_EXT_FEATURE_BEACON_RATE_HT))
5072 !wiphy_ext_feature_isset(&rdev->wiphy,
5073 NL80211_EXT_FEATURE_BEACON_RATE_VHT))
5076 !wiphy_ext_feature_isset(&rdev->wiphy,
5077 NL80211_EXT_FEATURE_BEACON_RATE_HE))
5083 static int nl80211_parse_mbssid_config(struct wiphy *wiphy,
5084 struct net_device *dev,
5085 struct nlattr *attrs,
5086 struct cfg80211_mbssid_config *config,
5089 struct nlattr *tb[NL80211_MBSSID_CONFIG_ATTR_MAX + 1];
5091 if (!wiphy->mbssid_max_interfaces)
5094 if (nla_parse_nested(tb, NL80211_MBSSID_CONFIG_ATTR_MAX, attrs, NULL,
5096 !tb[NL80211_MBSSID_CONFIG_ATTR_INDEX])
5099 config->ema = nla_get_flag(tb[NL80211_MBSSID_CONFIG_ATTR_EMA]);
5101 if (!wiphy->ema_max_profile_periodicity)
5104 if (num_elems > wiphy->ema_max_profile_periodicity)
5108 config->index = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]);
5109 if (config->index >= wiphy->mbssid_max_interfaces ||
5110 (!config->index && !num_elems))
5113 if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]) {
5115 nla_get_u32(tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]);
5117 if ((!config->index && tx_ifindex != dev->ifindex) ||
5118 (config->index && tx_ifindex == dev->ifindex))
5121 if (tx_ifindex != dev->ifindex) {
5122 struct net_device *tx_netdev =
5123 dev_get_by_index(wiphy_net(wiphy), tx_ifindex);
5125 if (!tx_netdev || !tx_netdev->ieee80211_ptr ||
5126 tx_netdev->ieee80211_ptr->wiphy != wiphy ||
5127 tx_netdev->ieee80211_ptr->iftype !=
5128 NL80211_IFTYPE_AP) {
5133 config->tx_wdev = tx_netdev->ieee80211_ptr;
5135 config->tx_wdev = dev->ieee80211_ptr;
5137 } else if (!config->index) {
5138 config->tx_wdev = dev->ieee80211_ptr;
5146 static struct cfg80211_mbssid_elems *
5147 nl80211_parse_mbssid_elems(struct wiphy *wiphy, struct nlattr *attrs)
5149 struct nlattr *nl_elems;
5150 struct cfg80211_mbssid_elems *elems;
5152 u8 i = 0, num_elems = 0;
5154 if (!wiphy->mbssid_max_interfaces)
5155 return ERR_PTR(-EINVAL);
5157 nla_for_each_nested(nl_elems, attrs, rem_elems)
5160 elems = kzalloc(struct_size(elems, elem, num_elems), GFP_KERNEL);
5162 return ERR_PTR(-ENOMEM);
5164 nla_for_each_nested(nl_elems, attrs, rem_elems) {
5165 elems->elem[i].data = nla_data(nl_elems);
5166 elems->elem[i].len = nla_len(nl_elems);
5169 elems->cnt = num_elems;
5173 static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev,
5174 struct nlattr *attrs[],
5175 struct cfg80211_beacon_data *bcn)
5177 bool haveinfo = false;
5180 memset(bcn, 0, sizeof(*bcn));
5182 if (attrs[NL80211_ATTR_BEACON_HEAD]) {
5183 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]);
5184 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]);
5190 if (attrs[NL80211_ATTR_BEACON_TAIL]) {
5191 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]);
5192 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]);
5199 if (attrs[NL80211_ATTR_IE]) {
5200 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]);
5201 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]);
5204 if (attrs[NL80211_ATTR_IE_PROBE_RESP]) {
5205 bcn->proberesp_ies =
5206 nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]);
5207 bcn->proberesp_ies_len =
5208 nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]);
5211 if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) {
5212 bcn->assocresp_ies =
5213 nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
5214 bcn->assocresp_ies_len =
5215 nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
5218 if (attrs[NL80211_ATTR_PROBE_RESP]) {
5219 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]);
5220 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]);
5223 if (attrs[NL80211_ATTR_FTM_RESPONDER]) {
5224 struct nlattr *tb[NL80211_FTM_RESP_ATTR_MAX + 1];
5226 err = nla_parse_nested_deprecated(tb,
5227 NL80211_FTM_RESP_ATTR_MAX,
5228 attrs[NL80211_ATTR_FTM_RESPONDER],
5233 if (tb[NL80211_FTM_RESP_ATTR_ENABLED] &&
5234 wiphy_ext_feature_isset(&rdev->wiphy,
5235 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER))
5236 bcn->ftm_responder = 1;
5240 if (tb[NL80211_FTM_RESP_ATTR_LCI]) {
5241 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]);
5242 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]);
5245 if (tb[NL80211_FTM_RESP_ATTR_CIVICLOC]) {
5246 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]);
5247 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]);
5250 bcn->ftm_responder = -1;
5253 if (attrs[NL80211_ATTR_MBSSID_ELEMS]) {
5254 struct cfg80211_mbssid_elems *mbssid =
5255 nl80211_parse_mbssid_elems(&rdev->wiphy,
5256 attrs[NL80211_ATTR_MBSSID_ELEMS]);
5259 return PTR_ERR(mbssid);
5261 bcn->mbssid_ies = mbssid;
5267 static int nl80211_parse_he_obss_pd(struct nlattr *attrs,
5268 struct ieee80211_he_obss_pd *he_obss_pd)
5270 struct nlattr *tb[NL80211_HE_OBSS_PD_ATTR_MAX + 1];
5273 err = nla_parse_nested(tb, NL80211_HE_OBSS_PD_ATTR_MAX, attrs,
5274 he_obss_pd_policy, NULL);
5278 if (!tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL])
5281 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]);
5283 if (tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET])
5284 he_obss_pd->min_offset =
5285 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]);
5286 if (tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET])
5287 he_obss_pd->max_offset =
5288 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]);
5289 if (tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET])
5290 he_obss_pd->non_srg_max_offset =
5291 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]);
5293 if (he_obss_pd->min_offset > he_obss_pd->max_offset)
5296 if (tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP])
5297 memcpy(he_obss_pd->bss_color_bitmap,
5298 nla_data(tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]),
5299 sizeof(he_obss_pd->bss_color_bitmap));
5301 if (tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP])
5302 memcpy(he_obss_pd->partial_bssid_bitmap,
5303 nla_data(tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]),
5304 sizeof(he_obss_pd->partial_bssid_bitmap));
5306 he_obss_pd->enable = true;
5311 static int nl80211_parse_he_bss_color(struct nlattr *attrs,
5312 struct cfg80211_he_bss_color *he_bss_color)
5314 struct nlattr *tb[NL80211_HE_BSS_COLOR_ATTR_MAX + 1];
5317 err = nla_parse_nested(tb, NL80211_HE_BSS_COLOR_ATTR_MAX, attrs,
5318 he_bss_color_policy, NULL);
5322 if (!tb[NL80211_HE_BSS_COLOR_ATTR_COLOR])
5325 he_bss_color->color =
5326 nla_get_u8(tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]);
5327 he_bss_color->enabled =
5328 !nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_DISABLED]);
5329 he_bss_color->partial =
5330 nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_PARTIAL]);
5335 static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev,
5336 struct nlattr *attrs,
5337 struct cfg80211_ap_settings *params)
5339 struct nlattr *tb[NL80211_FILS_DISCOVERY_ATTR_MAX + 1];
5341 struct cfg80211_fils_discovery *fd = ¶ms->fils_discovery;
5343 if (!wiphy_ext_feature_isset(&rdev->wiphy,
5344 NL80211_EXT_FEATURE_FILS_DISCOVERY))
5347 ret = nla_parse_nested(tb, NL80211_FILS_DISCOVERY_ATTR_MAX, attrs,
5352 if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] ||
5353 !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] ||
5354 !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL])
5357 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]);
5358 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]);
5359 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]);
5360 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]);
5366 nl80211_parse_unsol_bcast_probe_resp(struct cfg80211_registered_device *rdev,
5367 struct nlattr *attrs,
5368 struct cfg80211_ap_settings *params)
5370 struct nlattr *tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1];
5372 struct cfg80211_unsol_bcast_probe_resp *presp =
5373 ¶ms->unsol_bcast_probe_resp;
5375 if (!wiphy_ext_feature_isset(&rdev->wiphy,
5376 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP))
5379 ret = nla_parse_nested(tb, NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX,
5384 if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] ||
5385 !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL])
5388 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]);
5389 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]);
5390 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]);
5394 static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params,
5395 const struct element *rates)
5402 for (i = 0; i < rates->datalen; i++) {
5403 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
5404 params->ht_required = true;
5405 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY)
5406 params->vht_required = true;
5407 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HE_PHY)
5408 params->he_required = true;
5409 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_SAE_H2E)
5410 params->sae_h2e_required = true;
5415 * Since the nl80211 API didn't include, from the beginning, attributes about
5416 * HT/VHT requirements/capabilities, we parse them out of the IEs for the
5417 * benefit of drivers that rebuild IEs in the firmware.
5419 static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params)
5421 const struct cfg80211_beacon_data *bcn = ¶ms->beacon;
5422 size_t ies_len = bcn->tail_len;
5423 const u8 *ies = bcn->tail;
5424 const struct element *rates;
5425 const struct element *cap;
5427 rates = cfg80211_find_elem(WLAN_EID_SUPP_RATES, ies, ies_len);
5428 nl80211_check_ap_rate_selectors(params, rates);
5430 rates = cfg80211_find_elem(WLAN_EID_EXT_SUPP_RATES, ies, ies_len);
5431 nl80211_check_ap_rate_selectors(params, rates);
5433 cap = cfg80211_find_elem(WLAN_EID_HT_CAPABILITY, ies, ies_len);
5434 if (cap && cap->datalen >= sizeof(*params->ht_cap))
5435 params->ht_cap = (void *)cap->data;
5436 cap = cfg80211_find_elem(WLAN_EID_VHT_CAPABILITY, ies, ies_len);
5437 if (cap && cap->datalen >= sizeof(*params->vht_cap))
5438 params->vht_cap = (void *)cap->data;
5439 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_CAPABILITY, ies, ies_len);
5440 if (cap && cap->datalen >= sizeof(*params->he_cap) + 1)
5441 params->he_cap = (void *)(cap->data + 1);
5442 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ies, ies_len);
5443 if (cap && cap->datalen >= sizeof(*params->he_oper) + 1)
5444 params->he_oper = (void *)(cap->data + 1);
5447 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
5448 struct cfg80211_ap_settings *params)
5450 struct wireless_dev *wdev;
5453 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
5454 if (wdev->iftype != NL80211_IFTYPE_AP &&
5455 wdev->iftype != NL80211_IFTYPE_P2P_GO)
5458 if (!wdev->preset_chandef.chan)
5461 params->chandef = wdev->preset_chandef;
5469 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
5470 enum nl80211_auth_type auth_type,
5471 enum nl80211_commands cmd)
5473 if (auth_type > NL80211_AUTHTYPE_MAX)
5477 case NL80211_CMD_AUTHENTICATE:
5478 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
5479 auth_type == NL80211_AUTHTYPE_SAE)
5481 if (!wiphy_ext_feature_isset(&rdev->wiphy,
5482 NL80211_EXT_FEATURE_FILS_STA) &&
5483 (auth_type == NL80211_AUTHTYPE_FILS_SK ||
5484 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
5485 auth_type == NL80211_AUTHTYPE_FILS_PK))
5488 case NL80211_CMD_CONNECT:
5489 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
5490 !wiphy_ext_feature_isset(&rdev->wiphy,
5491 NL80211_EXT_FEATURE_SAE_OFFLOAD) &&
5492 auth_type == NL80211_AUTHTYPE_SAE)
5495 /* FILS with SK PFS or PK not supported yet */
5496 if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
5497 auth_type == NL80211_AUTHTYPE_FILS_PK)
5499 if (!wiphy_ext_feature_isset(
5501 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
5502 auth_type == NL80211_AUTHTYPE_FILS_SK)
5505 case NL80211_CMD_START_AP:
5506 if (!wiphy_ext_feature_isset(&rdev->wiphy,
5507 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP) &&
5508 auth_type == NL80211_AUTHTYPE_SAE)
5510 /* FILS not supported yet */
5511 if (auth_type == NL80211_AUTHTYPE_FILS_SK ||
5512 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
5513 auth_type == NL80211_AUTHTYPE_FILS_PK)
5521 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
5523 struct cfg80211_registered_device *rdev = info->user_ptr[0];
5524 struct net_device *dev = info->user_ptr[1];
5525 struct wireless_dev *wdev = dev->ieee80211_ptr;
5526 struct cfg80211_ap_settings *params;
5529 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
5530 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5533 if (!rdev->ops->start_ap)
5536 if (wdev->beacon_interval)
5539 /* these are required for START_AP */
5540 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
5541 !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
5542 !info->attrs[NL80211_ATTR_BEACON_HEAD])
5545 params = kzalloc(sizeof(*params), GFP_KERNEL);
5549 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon);
5553 params->beacon_interval =
5554 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
5555 params->dtim_period =
5556 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
5558 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype,
5559 params->beacon_interval);
5564 * In theory, some of these attributes should be required here
5565 * but since they were not used when the command was originally
5566 * added, keep them optional for old user space programs to let
5567 * them continue to work with drivers that do not need the
5568 * additional information -- drivers must check!
5570 if (info->attrs[NL80211_ATTR_SSID]) {
5571 params->ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
5573 nla_len(info->attrs[NL80211_ATTR_SSID]);
5574 if (params->ssid_len == 0) {
5580 if (info->attrs[NL80211_ATTR_HIDDEN_SSID])
5581 params->hidden_ssid = nla_get_u32(
5582 info->attrs[NL80211_ATTR_HIDDEN_SSID]);
5584 params->privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
5586 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
5587 params->auth_type = nla_get_u32(
5588 info->attrs[NL80211_ATTR_AUTH_TYPE]);
5589 if (!nl80211_valid_auth_type(rdev, params->auth_type,
5590 NL80211_CMD_START_AP)) {
5595 params->auth_type = NL80211_AUTHTYPE_AUTOMATIC;
5597 err = nl80211_crypto_settings(rdev, info, ¶ms->crypto,
5598 NL80211_MAX_NR_CIPHER_SUITES);
5602 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) {
5603 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) {
5607 params->inactivity_timeout = nla_get_u16(
5608 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]);
5611 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
5612 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
5616 params->p2p_ctwindow =
5617 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
5618 if (params->p2p_ctwindow != 0 &&
5619 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) {
5625 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
5628 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
5632 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
5633 params->p2p_opp_ps = tmp;
5634 if (params->p2p_opp_ps != 0 &&
5635 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) {
5641 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
5642 err = nl80211_parse_chandef(rdev, info, ¶ms->chandef);
5645 } else if (wdev->preset_chandef.chan) {
5646 params->chandef = wdev->preset_chandef;
5647 } else if (!nl80211_get_ap_channel(rdev, params)) {
5652 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms->chandef,
5658 if (info->attrs[NL80211_ATTR_TX_RATES]) {
5659 err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
5660 NL80211_ATTR_TX_RATES,
5661 ¶ms->beacon_rate,
5666 err = validate_beacon_tx_rate(rdev, params->chandef.chan->band,
5667 ¶ms->beacon_rate);
5672 if (info->attrs[NL80211_ATTR_SMPS_MODE]) {
5674 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]);
5675 switch (params->smps_mode) {
5676 case NL80211_SMPS_OFF:
5678 case NL80211_SMPS_STATIC:
5679 if (!(rdev->wiphy.features &
5680 NL80211_FEATURE_STATIC_SMPS)) {
5685 case NL80211_SMPS_DYNAMIC:
5686 if (!(rdev->wiphy.features &
5687 NL80211_FEATURE_DYNAMIC_SMPS)) {
5697 params->smps_mode = NL80211_SMPS_OFF;
5700 params->pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
5701 if (params->pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) {
5706 if (info->attrs[NL80211_ATTR_ACL_POLICY]) {
5707 params->acl = parse_acl_data(&rdev->wiphy, info);
5708 if (IS_ERR(params->acl)) {
5709 err = PTR_ERR(params->acl);
5715 params->twt_responder =
5716 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]);
5718 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) {
5719 err = nl80211_parse_he_obss_pd(
5720 info->attrs[NL80211_ATTR_HE_OBSS_PD],
5721 ¶ms->he_obss_pd);
5726 if (info->attrs[NL80211_ATTR_HE_BSS_COLOR]) {
5727 err = nl80211_parse_he_bss_color(
5728 info->attrs[NL80211_ATTR_HE_BSS_COLOR],
5729 ¶ms->he_bss_color);
5734 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) {
5735 err = nl80211_parse_fils_discovery(rdev,
5736 info->attrs[NL80211_ATTR_FILS_DISCOVERY],
5742 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) {
5743 err = nl80211_parse_unsol_bcast_probe_resp(
5744 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP],
5750 if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) {
5751 err = nl80211_parse_mbssid_config(&rdev->wiphy, dev,
5752 info->attrs[NL80211_ATTR_MBSSID_CONFIG],
5753 ¶ms->mbssid_config,
5754 params->beacon.mbssid_ies ?
5755 params->beacon.mbssid_ies->cnt :
5761 nl80211_calculate_ap_params(params);
5763 if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS])
5764 params->flags = nla_get_u32(
5765 info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]);
5766 else if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])
5767 params->flags |= NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT;
5770 err = rdev_start_ap(rdev, dev, params);
5772 wdev->preset_chandef = params->chandef;
5773 wdev->beacon_interval = params->beacon_interval;
5774 wdev->chandef = params->chandef;
5775 wdev->ssid_len = params->ssid_len;
5776 memcpy(wdev->ssid, params->ssid, wdev->ssid_len);
5778 if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
5779 wdev->conn_owner_nlportid = info->snd_portid;
5785 kfree(params->beacon.mbssid_ies);
5786 if (params->mbssid_config.tx_wdev &&
5787 params->mbssid_config.tx_wdev->netdev &&
5788 params->mbssid_config.tx_wdev->netdev != dev)
5789 dev_put(params->mbssid_config.tx_wdev->netdev);
5795 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
5797 struct cfg80211_registered_device *rdev = info->user_ptr[0];
5798 struct net_device *dev = info->user_ptr[1];
5799 struct wireless_dev *wdev = dev->ieee80211_ptr;
5800 struct cfg80211_beacon_data params;
5803 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
5804 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5807 if (!rdev->ops->change_beacon)
5810 if (!wdev->beacon_interval)
5813 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms);
5818 err = rdev_change_beacon(rdev, dev, ¶ms);
5822 kfree(params.mbssid_ies);
5826 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info)
5828 struct cfg80211_registered_device *rdev = info->user_ptr[0];
5829 struct net_device *dev = info->user_ptr[1];
5831 return cfg80211_stop_ap(rdev, dev, false);
5834 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
5835 [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG },
5836 [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
5837 [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
5838 [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
5839 [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG },
5840 [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG },
5843 static int parse_station_flags(struct genl_info *info,
5844 enum nl80211_iftype iftype,
5845 struct station_parameters *params)
5847 struct nlattr *flags[NL80211_STA_FLAG_MAX + 1];
5852 * Try parsing the new attribute first so userspace
5853 * can specify both for older kernels.
5855 nla = info->attrs[NL80211_ATTR_STA_FLAGS2];
5857 struct nl80211_sta_flag_update *sta_flags;
5859 sta_flags = nla_data(nla);
5860 params->sta_flags_mask = sta_flags->mask;
5861 params->sta_flags_set = sta_flags->set;
5862 params->sta_flags_set &= params->sta_flags_mask;
5863 if ((params->sta_flags_mask |
5864 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID))
5869 /* if present, parse the old attribute */
5871 nla = info->attrs[NL80211_ATTR_STA_FLAGS];
5875 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack))
5879 * Only allow certain flags for interface types so that
5880 * other attributes are silently ignored. Remember that
5881 * this is backward compatibility code with old userspace
5882 * and shouldn't be hit in other cases anyway.
5885 case NL80211_IFTYPE_AP:
5886 case NL80211_IFTYPE_AP_VLAN:
5887 case NL80211_IFTYPE_P2P_GO:
5888 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
5889 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
5890 BIT(NL80211_STA_FLAG_WME) |
5891 BIT(NL80211_STA_FLAG_MFP);
5893 case NL80211_IFTYPE_P2P_CLIENT:
5894 case NL80211_IFTYPE_STATION:
5895 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
5896 BIT(NL80211_STA_FLAG_TDLS_PEER);
5898 case NL80211_IFTYPE_MESH_POINT:
5899 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
5900 BIT(NL80211_STA_FLAG_MFP) |
5901 BIT(NL80211_STA_FLAG_AUTHORIZED);
5907 for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) {
5909 params->sta_flags_set |= (1<<flag);
5911 /* no longer support new API additions in old API */
5912 if (flag > NL80211_STA_FLAG_MAX_OLD_API)
5920 bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, int attr)
5922 struct nlattr *rate;
5925 enum nl80211_rate_info rate_flg;
5927 rate = nla_nest_start_noflag(msg, attr);
5931 /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
5932 bitrate = cfg80211_calculate_bitrate(info);
5933 /* report 16-bit bitrate only if we can */
5934 bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0;
5936 nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate))
5938 if (bitrate_compat > 0 &&
5939 nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat))
5943 case RATE_INFO_BW_5:
5944 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH;
5946 case RATE_INFO_BW_10:
5947 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH;
5952 case RATE_INFO_BW_20:
5955 case RATE_INFO_BW_40:
5956 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH;
5958 case RATE_INFO_BW_80:
5959 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH;
5961 case RATE_INFO_BW_160:
5962 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH;
5964 case RATE_INFO_BW_HE_RU:
5966 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS));
5968 case RATE_INFO_BW_320:
5969 rate_flg = NL80211_RATE_INFO_320_MHZ_WIDTH;
5971 case RATE_INFO_BW_EHT_RU:
5973 WARN_ON(!(info->flags & RATE_INFO_FLAGS_EHT_MCS));
5977 if (rate_flg && nla_put_flag(msg, rate_flg))
5980 if (info->flags & RATE_INFO_FLAGS_MCS) {
5981 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs))
5983 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
5984 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
5986 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) {
5987 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs))
5989 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss))
5991 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
5992 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
5994 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) {
5995 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs))
5997 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss))
5999 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi))
6001 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm))
6003 if (info->bw == RATE_INFO_BW_HE_RU &&
6004 nla_put_u8(msg, NL80211_RATE_INFO_HE_RU_ALLOC,
6007 } else if (info->flags & RATE_INFO_FLAGS_EHT_MCS) {
6008 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_MCS, info->mcs))
6010 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss))
6012 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi))
6014 if (info->bw == RATE_INFO_BW_EHT_RU &&
6015 nla_put_u8(msg, NL80211_RATE_INFO_EHT_RU_ALLOC,
6016 info->eht_ru_alloc))
6020 nla_nest_end(msg, rate);
6024 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal,
6033 attr = nla_nest_start_noflag(msg, id);
6037 for (i = 0; i < IEEE80211_MAX_CHAINS; i++) {
6038 if (!(mask & BIT(i)))
6041 if (nla_put_u8(msg, i, signal[i]))
6045 nla_nest_end(msg, attr);
6050 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
6052 struct cfg80211_registered_device *rdev,
6053 struct net_device *dev,
6054 const u8 *mac_addr, struct station_info *sinfo)
6057 struct nlattr *sinfoattr, *bss_param;
6059 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
6061 cfg80211_sinfo_release_content(sinfo);
6065 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
6066 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
6067 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation))
6068 goto nla_put_failure;
6070 sinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_STA_INFO);
6072 goto nla_put_failure;
6074 #define PUT_SINFO(attr, memb, type) do { \
6075 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \
6076 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \
6077 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \
6079 goto nla_put_failure; \
6081 #define PUT_SINFO_U64(attr, memb) do { \
6082 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \
6083 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \
6084 sinfo->memb, NL80211_STA_INFO_PAD)) \
6085 goto nla_put_failure; \
6088 PUT_SINFO(CONNECTED_TIME, connected_time, u32);
6089 PUT_SINFO(INACTIVE_TIME, inactive_time, u32);
6090 PUT_SINFO_U64(ASSOC_AT_BOOTTIME, assoc_at);
6092 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) |
6093 BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) &&
6094 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES,
6095 (u32)sinfo->rx_bytes))
6096 goto nla_put_failure;
6098 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) |
6099 BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) &&
6100 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES,
6101 (u32)sinfo->tx_bytes))
6102 goto nla_put_failure;
6104 PUT_SINFO_U64(RX_BYTES64, rx_bytes);
6105 PUT_SINFO_U64(TX_BYTES64, tx_bytes);
6106 PUT_SINFO(LLID, llid, u16);
6107 PUT_SINFO(PLID, plid, u16);
6108 PUT_SINFO(PLINK_STATE, plink_state, u8);
6109 PUT_SINFO_U64(RX_DURATION, rx_duration);
6110 PUT_SINFO_U64(TX_DURATION, tx_duration);
6112 if (wiphy_ext_feature_isset(&rdev->wiphy,
6113 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
6114 PUT_SINFO(AIRTIME_WEIGHT, airtime_weight, u16);
6116 switch (rdev->wiphy.signal_type) {
6117 case CFG80211_SIGNAL_TYPE_MBM:
6118 PUT_SINFO(SIGNAL, signal, u8);
6119 PUT_SINFO(SIGNAL_AVG, signal_avg, u8);
6124 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) {
6125 if (!nl80211_put_signal(msg, sinfo->chains,
6126 sinfo->chain_signal,
6127 NL80211_STA_INFO_CHAIN_SIGNAL))
6128 goto nla_put_failure;
6130 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) {
6131 if (!nl80211_put_signal(msg, sinfo->chains,
6132 sinfo->chain_signal_avg,
6133 NL80211_STA_INFO_CHAIN_SIGNAL_AVG))
6134 goto nla_put_failure;
6136 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) {
6137 if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
6138 NL80211_STA_INFO_TX_BITRATE))
6139 goto nla_put_failure;
6141 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) {
6142 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate,
6143 NL80211_STA_INFO_RX_BITRATE))
6144 goto nla_put_failure;
6147 PUT_SINFO(RX_PACKETS, rx_packets, u32);
6148 PUT_SINFO(TX_PACKETS, tx_packets, u32);
6149 PUT_SINFO(TX_RETRIES, tx_retries, u32);
6150 PUT_SINFO(TX_FAILED, tx_failed, u32);
6151 PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32);
6152 PUT_SINFO(AIRTIME_LINK_METRIC, airtime_link_metric, u32);
6153 PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32);
6154 PUT_SINFO(LOCAL_PM, local_pm, u32);
6155 PUT_SINFO(PEER_PM, peer_pm, u32);
6156 PUT_SINFO(NONPEER_PM, nonpeer_pm, u32);
6157 PUT_SINFO(CONNECTED_TO_GATE, connected_to_gate, u8);
6158 PUT_SINFO(CONNECTED_TO_AS, connected_to_as, u8);
6160 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) {
6161 bss_param = nla_nest_start_noflag(msg,
6162 NL80211_STA_INFO_BSS_PARAM);
6164 goto nla_put_failure;
6166 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) &&
6167 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) ||
6168 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) &&
6169 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) ||
6170 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) &&
6171 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) ||
6172 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD,
6173 sinfo->bss_param.dtim_period) ||
6174 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL,
6175 sinfo->bss_param.beacon_interval))
6176 goto nla_put_failure;
6178 nla_nest_end(msg, bss_param);
6180 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) &&
6181 nla_put(msg, NL80211_STA_INFO_STA_FLAGS,
6182 sizeof(struct nl80211_sta_flag_update),
6184 goto nla_put_failure;
6186 PUT_SINFO_U64(T_OFFSET, t_offset);
6187 PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc);
6188 PUT_SINFO_U64(BEACON_RX, rx_beacon);
6189 PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
6190 PUT_SINFO(RX_MPDUS, rx_mpdu_count, u32);
6191 PUT_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32);
6192 if (wiphy_ext_feature_isset(&rdev->wiphy,
6193 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) {
6194 PUT_SINFO(ACK_SIGNAL, ack_signal, u8);
6195 PUT_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8);
6199 #undef PUT_SINFO_U64
6201 if (sinfo->pertid) {
6202 struct nlattr *tidsattr;
6205 tidsattr = nla_nest_start_noflag(msg,
6206 NL80211_STA_INFO_TID_STATS);
6208 goto nla_put_failure;
6210 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) {
6211 struct cfg80211_tid_stats *tidstats;
6212 struct nlattr *tidattr;
6214 tidstats = &sinfo->pertid[tid];
6216 if (!tidstats->filled)
6219 tidattr = nla_nest_start_noflag(msg, tid + 1);
6221 goto nla_put_failure;
6223 #define PUT_TIDVAL_U64(attr, memb) do { \
6224 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \
6225 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \
6226 tidstats->memb, NL80211_TID_STATS_PAD)) \
6227 goto nla_put_failure; \
6230 PUT_TIDVAL_U64(RX_MSDU, rx_msdu);
6231 PUT_TIDVAL_U64(TX_MSDU, tx_msdu);
6232 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries);
6233 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed);
6235 #undef PUT_TIDVAL_U64
6236 if ((tidstats->filled &
6237 BIT(NL80211_TID_STATS_TXQ_STATS)) &&
6238 !nl80211_put_txq_stats(msg, &tidstats->txq_stats,
6239 NL80211_TID_STATS_TXQ_STATS))
6240 goto nla_put_failure;
6242 nla_nest_end(msg, tidattr);
6245 nla_nest_end(msg, tidsattr);
6248 nla_nest_end(msg, sinfoattr);
6250 if (sinfo->assoc_req_ies_len &&
6251 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len,
6252 sinfo->assoc_req_ies))
6253 goto nla_put_failure;
6255 cfg80211_sinfo_release_content(sinfo);
6256 genlmsg_end(msg, hdr);
6260 cfg80211_sinfo_release_content(sinfo);
6261 genlmsg_cancel(msg, hdr);
6265 static int nl80211_dump_station(struct sk_buff *skb,
6266 struct netlink_callback *cb)
6268 struct station_info sinfo;
6269 struct cfg80211_registered_device *rdev;
6270 struct wireless_dev *wdev;
6271 u8 mac_addr[ETH_ALEN];
6272 int sta_idx = cb->args[2];
6275 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL);
6278 /* nl80211_prepare_wdev_dump acquired it in the successful case */
6279 __acquire(&rdev->wiphy.mtx);
6281 if (!wdev->netdev) {
6286 if (!rdev->ops->dump_station) {
6292 memset(&sinfo, 0, sizeof(sinfo));
6293 err = rdev_dump_station(rdev, wdev->netdev, sta_idx,
6300 if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION,
6301 NETLINK_CB(cb->skb).portid,
6302 cb->nlh->nlmsg_seq, NLM_F_MULTI,
6303 rdev, wdev->netdev, mac_addr,
6311 cb->args[2] = sta_idx;
6314 wiphy_unlock(&rdev->wiphy);
6319 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
6321 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6322 struct net_device *dev = info->user_ptr[1];
6323 struct station_info sinfo;
6324 struct sk_buff *msg;
6325 u8 *mac_addr = NULL;
6328 memset(&sinfo, 0, sizeof(sinfo));
6330 if (!info->attrs[NL80211_ATTR_MAC])
6333 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
6335 if (!rdev->ops->get_station)
6338 err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
6342 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
6344 cfg80211_sinfo_release_content(&sinfo);
6348 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION,
6349 info->snd_portid, info->snd_seq, 0,
6350 rdev, dev, mac_addr, &sinfo) < 0) {
6355 return genlmsg_reply(msg, info);
6358 int cfg80211_check_station_change(struct wiphy *wiphy,
6359 struct station_parameters *params,
6360 enum cfg80211_station_type statype)
6362 if (params->listen_interval != -1 &&
6363 statype != CFG80211_STA_AP_CLIENT_UNASSOC)
6366 if (params->support_p2p_ps != -1 &&
6367 statype != CFG80211_STA_AP_CLIENT_UNASSOC)
6371 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) &&
6372 statype != CFG80211_STA_AP_CLIENT_UNASSOC)
6375 /* When you run into this, adjust the code below for the new flag */
6376 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
6379 case CFG80211_STA_MESH_PEER_KERNEL:
6380 case CFG80211_STA_MESH_PEER_USER:
6382 * No ignoring the TDLS flag here -- the userspace mesh
6383 * code doesn't have the bug of including TDLS in the
6386 if (params->sta_flags_mask &
6387 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
6388 BIT(NL80211_STA_FLAG_MFP) |
6389 BIT(NL80211_STA_FLAG_AUTHORIZED)))
6392 case CFG80211_STA_TDLS_PEER_SETUP:
6393 case CFG80211_STA_TDLS_PEER_ACTIVE:
6394 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
6396 /* ignore since it can't change */
6397 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
6400 /* disallow mesh-specific things */
6401 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION)
6403 if (params->local_pm)
6405 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
6409 if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
6410 statype != CFG80211_STA_TDLS_PEER_ACTIVE) {
6411 /* TDLS can't be set, ... */
6412 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
6415 * ... but don't bother the driver with it. This works around
6416 * a hostapd/wpa_supplicant issue -- it always includes the
6417 * TLDS_PEER flag in the mask even for AP mode.
6419 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
6422 if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
6423 statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
6424 /* reject other things that can't change */
6425 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD)
6427 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY)
6429 if (params->supported_rates)
6431 if (params->ext_capab || params->ht_capa || params->vht_capa ||
6432 params->he_capa || params->eht_capa)
6436 if (statype != CFG80211_STA_AP_CLIENT &&
6437 statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
6443 case CFG80211_STA_AP_MLME_CLIENT:
6444 /* Use this only for authorizing/unauthorizing a station */
6445 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)))
6448 case CFG80211_STA_AP_CLIENT:
6449 case CFG80211_STA_AP_CLIENT_UNASSOC:
6450 /* accept only the listed bits */
6451 if (params->sta_flags_mask &
6452 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
6453 BIT(NL80211_STA_FLAG_AUTHENTICATED) |
6454 BIT(NL80211_STA_FLAG_ASSOCIATED) |
6455 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
6456 BIT(NL80211_STA_FLAG_WME) |
6457 BIT(NL80211_STA_FLAG_MFP)))
6460 /* but authenticated/associated only if driver handles it */
6461 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
6462 params->sta_flags_mask &
6463 (BIT(NL80211_STA_FLAG_AUTHENTICATED) |
6464 BIT(NL80211_STA_FLAG_ASSOCIATED)))
6467 case CFG80211_STA_IBSS:
6468 case CFG80211_STA_AP_STA:
6469 /* reject any changes other than AUTHORIZED */
6470 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
6473 case CFG80211_STA_TDLS_PEER_SETUP:
6474 /* reject any changes other than AUTHORIZED or WME */
6475 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
6476 BIT(NL80211_STA_FLAG_WME)))
6478 /* force (at least) rates when authorizing */
6479 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) &&
6480 !params->supported_rates)
6483 case CFG80211_STA_TDLS_PEER_ACTIVE:
6484 /* reject any changes */
6486 case CFG80211_STA_MESH_PEER_KERNEL:
6487 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
6490 case CFG80211_STA_MESH_PEER_USER:
6491 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION &&
6492 params->plink_action != NL80211_PLINK_ACTION_BLOCK)
6498 * Older kernel versions ignored this attribute entirely, so don't
6499 * reject attempts to update it but mark it as unused instead so the
6500 * driver won't look at the data.
6502 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC &&
6503 statype != CFG80211_STA_TDLS_PEER_SETUP)
6504 params->opmode_notif_used = false;
6508 EXPORT_SYMBOL(cfg80211_check_station_change);
6511 * Get vlan interface making sure it is running and on the right wiphy.
6513 static struct net_device *get_vlan(struct genl_info *info,
6514 struct cfg80211_registered_device *rdev)
6516 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN];
6517 struct net_device *v;
6523 v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr));
6525 return ERR_PTR(-ENODEV);
6527 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) {
6532 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
6533 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
6534 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
6539 if (!netif_running(v)) {
6547 return ERR_PTR(ret);
6550 static const struct nla_policy
6551 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = {
6552 [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 },
6553 [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 },
6556 static int nl80211_parse_sta_wme(struct genl_info *info,
6557 struct station_parameters *params)
6559 struct nlattr *tb[NL80211_STA_WME_MAX + 1];
6563 /* parse WME attributes if present */
6564 if (!info->attrs[NL80211_ATTR_STA_WME])
6567 nla = info->attrs[NL80211_ATTR_STA_WME];
6568 err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla,
6569 nl80211_sta_wme_policy,
6574 if (tb[NL80211_STA_WME_UAPSD_QUEUES])
6575 params->uapsd_queues = nla_get_u8(
6576 tb[NL80211_STA_WME_UAPSD_QUEUES]);
6577 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK)
6580 if (tb[NL80211_STA_WME_MAX_SP])
6581 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]);
6583 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK)
6586 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD;
6591 static int nl80211_parse_sta_channel_info(struct genl_info *info,
6592 struct station_parameters *params)
6594 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
6595 params->supported_channels =
6596 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
6597 params->supported_channels_len =
6598 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
6600 * Need to include at least one (first channel, number of
6601 * channels) tuple for each subband (checked in policy),
6602 * and must have proper tuples for the rest of the data as well.
6604 if (params->supported_channels_len % 2)
6608 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
6609 params->supported_oper_classes =
6610 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
6611 params->supported_oper_classes_len =
6612 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
6617 static int nl80211_set_station_tdls(struct genl_info *info,
6618 struct station_parameters *params)
6621 /* Dummy STA entry gets updated once the peer capabilities are known */
6622 if (info->attrs[NL80211_ATTR_PEER_AID])
6623 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
6624 if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
6626 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
6627 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
6629 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
6630 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) {
6632 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
6633 params->he_capa_len =
6634 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
6636 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) {
6638 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
6639 params->eht_capa_len =
6640 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
6642 if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_capa,
6643 (const u8 *)params->eht_capa,
6644 params->eht_capa_len))
6649 err = nl80211_parse_sta_channel_info(info, params);
6653 return nl80211_parse_sta_wme(info, params);
6656 static int nl80211_parse_sta_txpower_setting(struct genl_info *info,
6657 struct station_parameters *params)
6659 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6662 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) {
6663 if (!rdev->ops->set_tx_power ||
6664 !wiphy_ext_feature_isset(&rdev->wiphy,
6665 NL80211_EXT_FEATURE_STA_TX_PWR))
6668 idx = NL80211_ATTR_STA_TX_POWER_SETTING;
6669 params->txpwr.type = nla_get_u8(info->attrs[idx]);
6671 if (params->txpwr.type == NL80211_TX_POWER_LIMITED) {
6672 idx = NL80211_ATTR_STA_TX_POWER;
6674 if (info->attrs[idx])
6675 params->txpwr.power =
6676 nla_get_s16(info->attrs[idx]);
6680 params->sta_modify_mask |= STATION_PARAM_APPLY_STA_TXPOWER;
6686 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
6688 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6689 struct net_device *dev = info->user_ptr[1];
6690 struct station_parameters params;
6694 memset(¶ms, 0, sizeof(params));
6696 if (!rdev->ops->change_station)
6700 * AID and listen_interval properties can be set only for unassociated
6701 * station. Include these parameters here and will check them in
6702 * cfg80211_check_station_change().
6704 if (info->attrs[NL80211_ATTR_STA_AID])
6705 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
6707 if (info->attrs[NL80211_ATTR_VLAN_ID])
6708 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
6710 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
6711 params.listen_interval =
6712 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
6714 params.listen_interval = -1;
6716 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS])
6717 params.support_p2p_ps =
6718 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
6720 params.support_p2p_ps = -1;
6722 if (!info->attrs[NL80211_ATTR_MAC])
6725 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
6727 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
6728 params.supported_rates =
6729 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
6730 params.supported_rates_len =
6731 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
6734 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
6736 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
6737 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
6740 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
6742 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
6743 params.ext_capab_len =
6744 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
6747 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms))
6750 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
6751 params.plink_action =
6752 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
6754 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) {
6755 params.plink_state =
6756 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]);
6757 if (info->attrs[NL80211_ATTR_MESH_PEER_AID])
6758 params.peer_aid = nla_get_u16(
6759 info->attrs[NL80211_ATTR_MESH_PEER_AID]);
6760 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE;
6763 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE])
6764 params.local_pm = nla_get_u32(
6765 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]);
6767 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
6768 params.opmode_notif_used = true;
6769 params.opmode_notif =
6770 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
6773 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY])
6774 params.he_6ghz_capa =
6775 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]);
6777 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT])
6778 params.airtime_weight =
6779 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]);
6781 if (params.airtime_weight &&
6782 !wiphy_ext_feature_isset(&rdev->wiphy,
6783 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
6786 err = nl80211_parse_sta_txpower_setting(info, ¶ms);
6790 /* Include parameters for TDLS peer (will check later) */
6791 err = nl80211_set_station_tdls(info, ¶ms);
6795 params.vlan = get_vlan(info, rdev);
6796 if (IS_ERR(params.vlan))
6797 return PTR_ERR(params.vlan);
6799 switch (dev->ieee80211_ptr->iftype) {
6800 case NL80211_IFTYPE_AP:
6801 case NL80211_IFTYPE_AP_VLAN:
6802 case NL80211_IFTYPE_P2P_GO:
6803 case NL80211_IFTYPE_P2P_CLIENT:
6804 case NL80211_IFTYPE_STATION:
6805 case NL80211_IFTYPE_ADHOC:
6806 case NL80211_IFTYPE_MESH_POINT:
6813 /* driver will call cfg80211_check_station_change() */
6814 err = rdev_change_station(rdev, dev, mac_addr, ¶ms);
6817 dev_put(params.vlan);
6822 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
6824 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6826 struct net_device *dev = info->user_ptr[1];
6827 struct station_parameters params;
6828 u8 *mac_addr = NULL;
6829 u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
6830 BIT(NL80211_STA_FLAG_ASSOCIATED);
6832 memset(¶ms, 0, sizeof(params));
6834 if (!rdev->ops->add_station)
6837 if (!info->attrs[NL80211_ATTR_MAC])
6840 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
6843 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
6846 if (!info->attrs[NL80211_ATTR_STA_AID] &&
6847 !info->attrs[NL80211_ATTR_PEER_AID])
6850 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
6851 params.supported_rates =
6852 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
6853 params.supported_rates_len =
6854 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
6855 params.listen_interval =
6856 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
6858 if (info->attrs[NL80211_ATTR_VLAN_ID])
6859 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
6861 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
6862 params.support_p2p_ps =
6863 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
6866 * if not specified, assume it's supported for P2P GO interface,
6867 * and is NOT supported for AP interface
6869 params.support_p2p_ps =
6870 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO;
6873 if (info->attrs[NL80211_ATTR_PEER_AID])
6874 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
6876 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
6878 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
6880 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
6881 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
6884 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
6886 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
6887 params.ext_capab_len =
6888 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
6891 if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
6893 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
6895 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
6897 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
6899 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) {
6901 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
6902 params.he_capa_len =
6903 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
6905 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) {
6907 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
6908 params.eht_capa_len =
6909 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
6911 if (!ieee80211_eht_capa_size_ok((const u8 *)params.he_capa,
6912 (const u8 *)params.eht_capa,
6913 params.eht_capa_len))
6918 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY])
6919 params.he_6ghz_capa =
6920 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]);
6922 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
6923 params.opmode_notif_used = true;
6924 params.opmode_notif =
6925 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
6928 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
6929 params.plink_action =
6930 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
6932 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT])
6933 params.airtime_weight =
6934 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]);
6936 if (params.airtime_weight &&
6937 !wiphy_ext_feature_isset(&rdev->wiphy,
6938 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
6941 err = nl80211_parse_sta_txpower_setting(info, ¶ms);
6945 err = nl80211_parse_sta_channel_info(info, ¶ms);
6949 err = nl80211_parse_sta_wme(info, ¶ms);
6953 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms))
6956 /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT
6957 * as userspace might just pass through the capabilities from the IEs
6958 * directly, rather than enforcing this restriction and returning an
6959 * error in this case.
6961 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) {
6962 params.ht_capa = NULL;
6963 params.vht_capa = NULL;
6965 /* HE and EHT require WME */
6966 if (params.he_capa_len || params.he_6ghz_capa ||
6967 params.eht_capa_len)
6971 /* Ensure that HT/VHT capabilities are not set for 6 GHz HE STA */
6972 if (params.he_6ghz_capa && (params.ht_capa || params.vht_capa))
6975 /* When you run into this, adjust the code below for the new flag */
6976 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
6978 switch (dev->ieee80211_ptr->iftype) {
6979 case NL80211_IFTYPE_AP:
6980 case NL80211_IFTYPE_AP_VLAN:
6981 case NL80211_IFTYPE_P2P_GO:
6982 /* ignore WME attributes if iface/sta is not capable */
6983 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) ||
6984 !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME)))
6985 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
6987 /* TDLS peers cannot be added */
6988 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
6989 info->attrs[NL80211_ATTR_PEER_AID])
6991 /* but don't bother the driver with it */
6992 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
6994 /* allow authenticated/associated only if driver handles it */
6995 if (!(rdev->wiphy.features &
6996 NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
6997 params.sta_flags_mask & auth_assoc)
7000 /* Older userspace, or userspace wanting to be compatible with
7001 * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth
7002 * and assoc flags in the mask, but assumes the station will be
7003 * added as associated anyway since this was the required driver
7004 * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was
7006 * In order to not bother drivers with this quirk in the API
7007 * set the flags in both the mask and set for new stations in
7010 if (!(params.sta_flags_mask & auth_assoc)) {
7011 params.sta_flags_mask |= auth_assoc;
7012 params.sta_flags_set |= auth_assoc;
7015 /* must be last in here for error handling */
7016 params.vlan = get_vlan(info, rdev);
7017 if (IS_ERR(params.vlan))
7018 return PTR_ERR(params.vlan);
7020 case NL80211_IFTYPE_MESH_POINT:
7021 /* ignore uAPSD data */
7022 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
7024 /* associated is disallowed */
7025 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED))
7027 /* TDLS peers cannot be added */
7028 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
7029 info->attrs[NL80211_ATTR_PEER_AID])
7032 case NL80211_IFTYPE_STATION:
7033 case NL80211_IFTYPE_P2P_CLIENT:
7034 /* ignore uAPSD data */
7035 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
7037 /* these are disallowed */
7038 if (params.sta_flags_mask &
7039 (BIT(NL80211_STA_FLAG_ASSOCIATED) |
7040 BIT(NL80211_STA_FLAG_AUTHENTICATED)))
7042 /* Only TDLS peers can be added */
7043 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
7045 /* Can only add if TDLS ... */
7046 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS))
7048 /* ... with external setup is supported */
7049 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP))
7052 * Older wpa_supplicant versions always mark the TDLS peer
7053 * as authorized, but it shouldn't yet be.
7055 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED);
7061 /* be aware of params.vlan when changing code here */
7063 err = rdev_add_station(rdev, dev, mac_addr, ¶ms);
7065 dev_put(params.vlan);
7069 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
7071 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7072 struct net_device *dev = info->user_ptr[1];
7073 struct station_del_parameters params;
7075 memset(¶ms, 0, sizeof(params));
7077 if (info->attrs[NL80211_ATTR_MAC])
7078 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]);
7080 switch (dev->ieee80211_ptr->iftype) {
7081 case NL80211_IFTYPE_AP:
7082 case NL80211_IFTYPE_AP_VLAN:
7083 case NL80211_IFTYPE_MESH_POINT:
7084 case NL80211_IFTYPE_P2P_GO:
7085 /* always accept these */
7087 case NL80211_IFTYPE_ADHOC:
7088 /* conditionally accept */
7089 if (wiphy_ext_feature_isset(&rdev->wiphy,
7090 NL80211_EXT_FEATURE_DEL_IBSS_STA))
7097 if (!rdev->ops->del_station)
7100 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) {
7102 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]);
7103 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 &&
7104 params.subtype != IEEE80211_STYPE_DEAUTH >> 4)
7107 /* Default to Deauthentication frame */
7108 params.subtype = IEEE80211_STYPE_DEAUTH >> 4;
7111 if (info->attrs[NL80211_ATTR_REASON_CODE]) {
7112 params.reason_code =
7113 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
7114 if (params.reason_code == 0)
7115 return -EINVAL; /* 0 is reserved */
7117 /* Default to reason code 2 */
7118 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID;
7121 return rdev_del_station(rdev, dev, ¶ms);
7124 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq,
7125 int flags, struct net_device *dev,
7126 u8 *dst, u8 *next_hop,
7127 struct mpath_info *pinfo)
7130 struct nlattr *pinfoattr;
7132 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH);
7136 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
7137 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) ||
7138 nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) ||
7139 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation))
7140 goto nla_put_failure;
7142 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MPATH_INFO);
7144 goto nla_put_failure;
7145 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) &&
7146 nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN,
7148 goto nla_put_failure;
7149 if (((pinfo->filled & MPATH_INFO_SN) &&
7150 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) ||
7151 ((pinfo->filled & MPATH_INFO_METRIC) &&
7152 nla_put_u32(msg, NL80211_MPATH_INFO_METRIC,
7154 ((pinfo->filled & MPATH_INFO_EXPTIME) &&
7155 nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME,
7157 ((pinfo->filled & MPATH_INFO_FLAGS) &&
7158 nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS,
7160 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) &&
7161 nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
7162 pinfo->discovery_timeout)) ||
7163 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) &&
7164 nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES,
7165 pinfo->discovery_retries)) ||
7166 ((pinfo->filled & MPATH_INFO_HOP_COUNT) &&
7167 nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT,
7168 pinfo->hop_count)) ||
7169 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) &&
7170 nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE,
7171 pinfo->path_change_count)))
7172 goto nla_put_failure;
7174 nla_nest_end(msg, pinfoattr);
7176 genlmsg_end(msg, hdr);
7180 genlmsg_cancel(msg, hdr);
7184 static int nl80211_dump_mpath(struct sk_buff *skb,
7185 struct netlink_callback *cb)
7187 struct mpath_info pinfo;
7188 struct cfg80211_registered_device *rdev;
7189 struct wireless_dev *wdev;
7191 u8 next_hop[ETH_ALEN];
7192 int path_idx = cb->args[2];
7195 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL);
7198 /* nl80211_prepare_wdev_dump acquired it in the successful case */
7199 __acquire(&rdev->wiphy.mtx);
7201 if (!rdev->ops->dump_mpath) {
7206 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
7212 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst,
7219 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
7220 cb->nlh->nlmsg_seq, NLM_F_MULTI,
7221 wdev->netdev, dst, next_hop,
7229 cb->args[2] = path_idx;
7232 wiphy_unlock(&rdev->wiphy);
7236 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
7238 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7240 struct net_device *dev = info->user_ptr[1];
7241 struct mpath_info pinfo;
7242 struct sk_buff *msg;
7244 u8 next_hop[ETH_ALEN];
7246 memset(&pinfo, 0, sizeof(pinfo));
7248 if (!info->attrs[NL80211_ATTR_MAC])
7251 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
7253 if (!rdev->ops->get_mpath)
7256 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
7259 err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo);
7263 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7267 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
7268 dev, dst, next_hop, &pinfo) < 0) {
7273 return genlmsg_reply(msg, info);
7276 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
7278 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7279 struct net_device *dev = info->user_ptr[1];
7281 u8 *next_hop = NULL;
7283 if (!info->attrs[NL80211_ATTR_MAC])
7286 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
7289 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
7290 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
7292 if (!rdev->ops->change_mpath)
7295 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
7298 return rdev_change_mpath(rdev, dev, dst, next_hop);
7301 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
7303 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7304 struct net_device *dev = info->user_ptr[1];
7306 u8 *next_hop = NULL;
7308 if (!info->attrs[NL80211_ATTR_MAC])
7311 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
7314 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
7315 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
7317 if (!rdev->ops->add_mpath)
7320 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
7323 return rdev_add_mpath(rdev, dev, dst, next_hop);
7326 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
7328 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7329 struct net_device *dev = info->user_ptr[1];
7332 if (info->attrs[NL80211_ATTR_MAC])
7333 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
7335 if (!rdev->ops->del_mpath)
7338 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
7341 return rdev_del_mpath(rdev, dev, dst);
7344 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info)
7346 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7348 struct net_device *dev = info->user_ptr[1];
7349 struct mpath_info pinfo;
7350 struct sk_buff *msg;
7354 memset(&pinfo, 0, sizeof(pinfo));
7356 if (!info->attrs[NL80211_ATTR_MAC])
7359 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
7361 if (!rdev->ops->get_mpp)
7364 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
7367 err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo);
7371 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7375 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
7376 dev, dst, mpp, &pinfo) < 0) {
7381 return genlmsg_reply(msg, info);
7384 static int nl80211_dump_mpp(struct sk_buff *skb,
7385 struct netlink_callback *cb)
7387 struct mpath_info pinfo;
7388 struct cfg80211_registered_device *rdev;
7389 struct wireless_dev *wdev;
7392 int path_idx = cb->args[2];
7395 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL);
7398 /* nl80211_prepare_wdev_dump acquired it in the successful case */
7399 __acquire(&rdev->wiphy.mtx);
7401 if (!rdev->ops->dump_mpp) {
7406 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
7412 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst,
7419 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
7420 cb->nlh->nlmsg_seq, NLM_F_MULTI,
7421 wdev->netdev, dst, mpp,
7429 cb->args[2] = path_idx;
7432 wiphy_unlock(&rdev->wiphy);
7436 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
7438 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7439 struct net_device *dev = info->user_ptr[1];
7440 struct wireless_dev *wdev = dev->ieee80211_ptr;
7441 struct bss_parameters params;
7444 memset(¶ms, 0, sizeof(params));
7445 /* default to not changing parameters */
7446 params.use_cts_prot = -1;
7447 params.use_short_preamble = -1;
7448 params.use_short_slot_time = -1;
7449 params.ap_isolate = -1;
7450 params.ht_opmode = -1;
7451 params.p2p_ctwindow = -1;
7452 params.p2p_opp_ps = -1;
7454 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
7455 params.use_cts_prot =
7456 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
7457 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE])
7458 params.use_short_preamble =
7459 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
7460 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME])
7461 params.use_short_slot_time =
7462 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
7463 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
7464 params.basic_rates =
7465 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
7466 params.basic_rates_len =
7467 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
7469 if (info->attrs[NL80211_ATTR_AP_ISOLATE])
7470 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]);
7471 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE])
7473 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]);
7475 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
7476 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
7478 params.p2p_ctwindow =
7479 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
7480 if (params.p2p_ctwindow != 0 &&
7481 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
7485 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
7488 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
7490 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
7491 params.p2p_opp_ps = tmp;
7492 if (params.p2p_opp_ps &&
7493 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
7497 if (!rdev->ops->change_bss)
7500 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
7501 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
7505 err = rdev_change_bss(rdev, dev, ¶ms);
7511 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
7515 enum nl80211_user_reg_hint_type user_reg_hint_type;
7519 * You should only get this when cfg80211 hasn't yet initialized
7520 * completely when built-in to the kernel right between the time
7521 * window between nl80211_init() and regulatory_init(), if that is
7524 if (unlikely(!rcu_access_pointer(cfg80211_regdomain)))
7525 return -EINPROGRESS;
7527 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE])
7528 user_reg_hint_type =
7529 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]);
7531 user_reg_hint_type = NL80211_USER_REG_HINT_USER;
7533 switch (user_reg_hint_type) {
7534 case NL80211_USER_REG_HINT_USER:
7535 case NL80211_USER_REG_HINT_CELL_BASE:
7536 if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
7539 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
7540 return regulatory_hint_user(data, user_reg_hint_type);
7541 case NL80211_USER_REG_HINT_INDOOR:
7542 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
7543 owner_nlportid = info->snd_portid;
7544 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR];
7550 return regulatory_hint_indoor(is_indoor, owner_nlportid);
7556 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info)
7558 return reg_reload_regdb();
7561 static int nl80211_get_mesh_config(struct sk_buff *skb,
7562 struct genl_info *info)
7564 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7565 struct net_device *dev = info->user_ptr[1];
7566 struct wireless_dev *wdev = dev->ieee80211_ptr;
7567 struct mesh_config cur_params;
7570 struct nlattr *pinfoattr;
7571 struct sk_buff *msg;
7573 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
7576 if (!rdev->ops->get_mesh_config)
7580 /* If not connected, get default parameters */
7581 if (!wdev->mesh_id_len)
7582 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params));
7584 err = rdev_get_mesh_config(rdev, dev, &cur_params);
7590 /* Draw up a netlink message to send back */
7591 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7594 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
7595 NL80211_CMD_GET_MESH_CONFIG);
7598 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MESH_CONFIG);
7600 goto nla_put_failure;
7601 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
7602 nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT,
7603 cur_params.dot11MeshRetryTimeout) ||
7604 nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT,
7605 cur_params.dot11MeshConfirmTimeout) ||
7606 nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT,
7607 cur_params.dot11MeshHoldingTimeout) ||
7608 nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
7609 cur_params.dot11MeshMaxPeerLinks) ||
7610 nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES,
7611 cur_params.dot11MeshMaxRetries) ||
7612 nla_put_u8(msg, NL80211_MESHCONF_TTL,
7613 cur_params.dot11MeshTTL) ||
7614 nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL,
7615 cur_params.element_ttl) ||
7616 nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
7617 cur_params.auto_open_plinks) ||
7618 nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
7619 cur_params.dot11MeshNbrOffsetMaxNeighbor) ||
7620 nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
7621 cur_params.dot11MeshHWMPmaxPREQretries) ||
7622 nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME,
7623 cur_params.path_refresh_time) ||
7624 nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
7625 cur_params.min_discovery_timeout) ||
7626 nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
7627 cur_params.dot11MeshHWMPactivePathTimeout) ||
7628 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
7629 cur_params.dot11MeshHWMPpreqMinInterval) ||
7630 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
7631 cur_params.dot11MeshHWMPperrMinInterval) ||
7632 nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
7633 cur_params.dot11MeshHWMPnetDiameterTraversalTime) ||
7634 nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE,
7635 cur_params.dot11MeshHWMPRootMode) ||
7636 nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
7637 cur_params.dot11MeshHWMPRannInterval) ||
7638 nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
7639 cur_params.dot11MeshGateAnnouncementProtocol) ||
7640 nla_put_u8(msg, NL80211_MESHCONF_FORWARDING,
7641 cur_params.dot11MeshForwarding) ||
7642 nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD,
7643 cur_params.rssi_threshold) ||
7644 nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE,
7645 cur_params.ht_opmode) ||
7646 nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
7647 cur_params.dot11MeshHWMPactivePathToRootTimeout) ||
7648 nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
7649 cur_params.dot11MeshHWMProotInterval) ||
7650 nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
7651 cur_params.dot11MeshHWMPconfirmationInterval) ||
7652 nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE,
7653 cur_params.power_mode) ||
7654 nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW,
7655 cur_params.dot11MeshAwakeWindowDuration) ||
7656 nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT,
7657 cur_params.plink_timeout) ||
7658 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE,
7659 cur_params.dot11MeshConnectedToMeshGate) ||
7660 nla_put_u8(msg, NL80211_MESHCONF_NOLEARN,
7661 cur_params.dot11MeshNolearn) ||
7662 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_AS,
7663 cur_params.dot11MeshConnectedToAuthServer))
7664 goto nla_put_failure;
7665 nla_nest_end(msg, pinfoattr);
7666 genlmsg_end(msg, hdr);
7667 return genlmsg_reply(msg, info);
7675 static const struct nla_policy
7676 nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = {
7677 [NL80211_MESHCONF_RETRY_TIMEOUT] =
7678 NLA_POLICY_RANGE(NLA_U16, 1, 255),
7679 [NL80211_MESHCONF_CONFIRM_TIMEOUT] =
7680 NLA_POLICY_RANGE(NLA_U16, 1, 255),
7681 [NL80211_MESHCONF_HOLDING_TIMEOUT] =
7682 NLA_POLICY_RANGE(NLA_U16, 1, 255),
7683 [NL80211_MESHCONF_MAX_PEER_LINKS] =
7684 NLA_POLICY_RANGE(NLA_U16, 0, 255),
7685 [NL80211_MESHCONF_MAX_RETRIES] = NLA_POLICY_MAX(NLA_U8, 16),
7686 [NL80211_MESHCONF_TTL] = NLA_POLICY_MIN(NLA_U8, 1),
7687 [NL80211_MESHCONF_ELEMENT_TTL] = NLA_POLICY_MIN(NLA_U8, 1),
7688 [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = NLA_POLICY_MAX(NLA_U8, 1),
7689 [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] =
7690 NLA_POLICY_RANGE(NLA_U32, 1, 255),
7691 [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 },
7692 [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 },
7693 [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = NLA_POLICY_MIN(NLA_U16, 1),
7694 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
7695 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] =
7696 NLA_POLICY_MIN(NLA_U16, 1),
7697 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] =
7698 NLA_POLICY_MIN(NLA_U16, 1),
7699 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] =
7700 NLA_POLICY_MIN(NLA_U16, 1),
7701 [NL80211_MESHCONF_HWMP_ROOTMODE] = NLA_POLICY_MAX(NLA_U8, 4),
7702 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] =
7703 NLA_POLICY_MIN(NLA_U16, 1),
7704 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = NLA_POLICY_MAX(NLA_U8, 1),
7705 [NL80211_MESHCONF_FORWARDING] = NLA_POLICY_MAX(NLA_U8, 1),
7706 [NL80211_MESHCONF_RSSI_THRESHOLD] =
7707 NLA_POLICY_RANGE(NLA_S32, -255, 0),
7708 [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 },
7709 [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 },
7710 [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] =
7711 NLA_POLICY_MIN(NLA_U16, 1),
7712 [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] =
7713 NLA_POLICY_MIN(NLA_U16, 1),
7714 [NL80211_MESHCONF_POWER_MODE] =
7715 NLA_POLICY_RANGE(NLA_U32,
7716 NL80211_MESH_POWER_ACTIVE,
7717 NL80211_MESH_POWER_MAX),
7718 [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 },
7719 [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 },
7720 [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
7721 [NL80211_MESHCONF_NOLEARN] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
7722 [NL80211_MESHCONF_CONNECTED_TO_AS] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
7725 static const struct nla_policy
7726 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
7727 [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 },
7728 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
7729 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
7730 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
7731 [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 },
7732 [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG },
7733 [NL80211_MESH_SETUP_IE] =
7734 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
7735 IEEE80211_MAX_DATA_LEN),
7736 [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG },
7739 static int nl80211_parse_mesh_config(struct genl_info *info,
7740 struct mesh_config *cfg,
7743 struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1];
7747 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, mask, attr, fn) \
7750 cfg->param = fn(tb[attr]); \
7751 mask |= BIT((attr) - 1); \
7755 if (!info->attrs[NL80211_ATTR_MESH_CONFIG])
7757 if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack))
7760 /* This makes sure that there aren't more than 32 mesh config
7761 * parameters (otherwise our bitfield scheme would not work.) */
7762 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
7764 /* Fill in the params struct */
7765 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, mask,
7766 NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16);
7767 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, mask,
7768 NL80211_MESHCONF_CONFIRM_TIMEOUT,
7770 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, mask,
7771 NL80211_MESHCONF_HOLDING_TIMEOUT,
7773 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, mask,
7774 NL80211_MESHCONF_MAX_PEER_LINKS,
7776 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, mask,
7777 NL80211_MESHCONF_MAX_RETRIES, nla_get_u8);
7778 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, mask,
7779 NL80211_MESHCONF_TTL, nla_get_u8);
7780 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, mask,
7781 NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8);
7782 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, mask,
7783 NL80211_MESHCONF_AUTO_OPEN_PLINKS,
7785 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor,
7787 NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
7789 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, mask,
7790 NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
7792 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, mask,
7793 NL80211_MESHCONF_PATH_REFRESH_TIME,
7795 if (mask & BIT(NL80211_MESHCONF_PATH_REFRESH_TIME) &&
7796 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535))
7798 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, mask,
7799 NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
7801 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout,
7803 NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
7805 if (mask & BIT(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT) &&
7806 (cfg->dot11MeshHWMPactivePathTimeout < 1 ||
7807 cfg->dot11MeshHWMPactivePathTimeout > 65535))
7809 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, mask,
7810 NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
7812 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, mask,
7813 NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
7815 FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
7816 dot11MeshHWMPnetDiameterTraversalTime, mask,
7817 NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
7819 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, mask,
7820 NL80211_MESHCONF_HWMP_ROOTMODE, nla_get_u8);
7821 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, mask,
7822 NL80211_MESHCONF_HWMP_RANN_INTERVAL,
7824 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshGateAnnouncementProtocol,
7825 mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
7827 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, mask,
7828 NL80211_MESHCONF_FORWARDING, nla_get_u8);
7829 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask,
7830 NL80211_MESHCONF_RSSI_THRESHOLD,
7832 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask,
7833 NL80211_MESHCONF_CONNECTED_TO_GATE,
7835 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToAuthServer, mask,
7836 NL80211_MESHCONF_CONNECTED_TO_AS,
7839 * Check HT operation mode based on
7840 * IEEE 802.11-2016 9.4.2.57 HT Operation element.
7842 if (tb[NL80211_MESHCONF_HT_OPMODE]) {
7843 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]);
7845 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION |
7846 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT |
7847 IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
7850 /* NON_HT_STA bit is reserved, but some programs set it */
7851 ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT;
7853 cfg->ht_opmode = ht_opmode;
7854 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1));
7856 FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
7857 dot11MeshHWMPactivePathToRootTimeout, mask,
7858 NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
7860 if (mask & BIT(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT) &&
7861 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 ||
7862 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535))
7864 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, mask,
7865 NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
7867 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPconfirmationInterval,
7869 NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
7871 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, mask,
7872 NL80211_MESHCONF_POWER_MODE, nla_get_u32);
7873 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, mask,
7874 NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16);
7875 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, mask,
7876 NL80211_MESHCONF_PLINK_TIMEOUT, nla_get_u32);
7877 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNolearn, mask,
7878 NL80211_MESHCONF_NOLEARN, nla_get_u8);
7884 #undef FILL_IN_MESH_PARAM_IF_SET
7887 static int nl80211_parse_mesh_setup(struct genl_info *info,
7888 struct mesh_setup *setup)
7890 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7891 struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1];
7893 if (!info->attrs[NL80211_ATTR_MESH_SETUP])
7895 if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack))
7898 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])
7899 setup->sync_method =
7900 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ?
7901 IEEE80211_SYNC_METHOD_VENDOR :
7902 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET;
7904 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])
7905 setup->path_sel_proto =
7906 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ?
7907 IEEE80211_PATH_PROTOCOL_VENDOR :
7908 IEEE80211_PATH_PROTOCOL_HWMP;
7910 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])
7911 setup->path_metric =
7912 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ?
7913 IEEE80211_PATH_METRIC_VENDOR :
7914 IEEE80211_PATH_METRIC_AIRTIME;
7916 if (tb[NL80211_MESH_SETUP_IE]) {
7917 struct nlattr *ieattr =
7918 tb[NL80211_MESH_SETUP_IE];
7919 setup->ie = nla_data(ieattr);
7920 setup->ie_len = nla_len(ieattr);
7922 if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] &&
7923 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM))
7925 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]);
7926 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]);
7927 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]);
7928 if (setup->is_secure)
7929 setup->user_mpm = true;
7931 if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) {
7932 if (!setup->user_mpm)
7935 nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]);
7941 static int nl80211_update_mesh_config(struct sk_buff *skb,
7942 struct genl_info *info)
7944 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7945 struct net_device *dev = info->user_ptr[1];
7946 struct wireless_dev *wdev = dev->ieee80211_ptr;
7947 struct mesh_config cfg;
7951 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
7954 if (!rdev->ops->update_mesh_config)
7957 err = nl80211_parse_mesh_config(info, &cfg, &mask);
7962 if (!wdev->mesh_id_len)
7966 err = rdev_update_mesh_config(rdev, dev, mask, &cfg);
7973 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom,
7974 struct sk_buff *msg)
7976 struct nlattr *nl_reg_rules;
7979 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) ||
7980 (regdom->dfs_region &&
7981 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region)))
7982 goto nla_put_failure;
7984 nl_reg_rules = nla_nest_start_noflag(msg, NL80211_ATTR_REG_RULES);
7986 goto nla_put_failure;
7988 for (i = 0; i < regdom->n_reg_rules; i++) {
7989 struct nlattr *nl_reg_rule;
7990 const struct ieee80211_reg_rule *reg_rule;
7991 const struct ieee80211_freq_range *freq_range;
7992 const struct ieee80211_power_rule *power_rule;
7993 unsigned int max_bandwidth_khz;
7995 reg_rule = ®dom->reg_rules[i];
7996 freq_range = ®_rule->freq_range;
7997 power_rule = ®_rule->power_rule;
7999 nl_reg_rule = nla_nest_start_noflag(msg, i);
8001 goto nla_put_failure;
8003 max_bandwidth_khz = freq_range->max_bandwidth_khz;
8004 if (!max_bandwidth_khz)
8005 max_bandwidth_khz = reg_get_max_bandwidth(regdom,
8008 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS,
8010 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START,
8011 freq_range->start_freq_khz) ||
8012 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END,
8013 freq_range->end_freq_khz) ||
8014 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW,
8015 max_bandwidth_khz) ||
8016 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
8017 power_rule->max_antenna_gain) ||
8018 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP,
8019 power_rule->max_eirp) ||
8020 nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME,
8021 reg_rule->dfs_cac_ms))
8022 goto nla_put_failure;
8024 nla_nest_end(msg, nl_reg_rule);
8027 nla_nest_end(msg, nl_reg_rules);
8034 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info)
8036 const struct ieee80211_regdomain *regdom = NULL;
8037 struct cfg80211_registered_device *rdev;
8038 struct wiphy *wiphy = NULL;
8039 struct sk_buff *msg;
8040 int err = -EMSGSIZE;
8043 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
8047 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8048 NL80211_CMD_GET_REG);
8054 if (info->attrs[NL80211_ATTR_WIPHY]) {
8057 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
8059 err = PTR_ERR(rdev);
8060 goto nla_put_failure;
8063 wiphy = &rdev->wiphy;
8064 self_managed = wiphy->regulatory_flags &
8065 REGULATORY_WIPHY_SELF_MANAGED;
8069 regdom = get_wiphy_regdom(wiphy);
8071 /* a self-managed-reg device must have a private regdom */
8072 if (WARN_ON(!regdom && self_managed)) {
8074 goto nla_put_failure_rcu;
8078 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
8079 goto nla_put_failure_rcu;
8084 if (!wiphy && reg_last_request_cell_base() &&
8085 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
8086 NL80211_USER_REG_HINT_CELL_BASE))
8087 goto nla_put_failure_rcu;
8090 regdom = rcu_dereference(cfg80211_regdomain);
8092 if (nl80211_put_regdom(regdom, msg))
8093 goto nla_put_failure_rcu;
8097 genlmsg_end(msg, hdr);
8099 return genlmsg_reply(msg, info);
8101 nla_put_failure_rcu:
8110 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb,
8111 u32 seq, int flags, struct wiphy *wiphy,
8112 const struct ieee80211_regdomain *regdom)
8114 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
8115 NL80211_CMD_GET_REG);
8120 genl_dump_check_consistent(cb, hdr);
8122 if (nl80211_put_regdom(regdom, msg))
8123 goto nla_put_failure;
8125 if (!wiphy && reg_last_request_cell_base() &&
8126 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
8127 NL80211_USER_REG_HINT_CELL_BASE))
8128 goto nla_put_failure;
8131 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
8132 goto nla_put_failure;
8134 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
8135 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
8136 goto nla_put_failure;
8138 genlmsg_end(msg, hdr);
8142 genlmsg_cancel(msg, hdr);
8146 static int nl80211_get_reg_dump(struct sk_buff *skb,
8147 struct netlink_callback *cb)
8149 const struct ieee80211_regdomain *regdom = NULL;
8150 struct cfg80211_registered_device *rdev;
8151 int err, reg_idx, start = cb->args[2];
8155 if (cfg80211_regdomain && start == 0) {
8156 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
8158 rcu_dereference(cfg80211_regdomain));
8163 /* the global regdom is idx 0 */
8165 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
8166 regdom = get_wiphy_regdom(&rdev->wiphy);
8170 if (++reg_idx <= start)
8173 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
8174 NLM_F_MULTI, &rdev->wiphy, regdom);
8181 cb->args[2] = reg_idx;
8188 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
8189 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
8190 [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 },
8191 [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 },
8192 [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 },
8193 [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 },
8194 [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 },
8195 [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 },
8196 [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 },
8199 static int parse_reg_rule(struct nlattr *tb[],
8200 struct ieee80211_reg_rule *reg_rule)
8202 struct ieee80211_freq_range *freq_range = ®_rule->freq_range;
8203 struct ieee80211_power_rule *power_rule = ®_rule->power_rule;
8205 if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
8207 if (!tb[NL80211_ATTR_FREQ_RANGE_START])
8209 if (!tb[NL80211_ATTR_FREQ_RANGE_END])
8211 if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
8213 if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
8216 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
8218 freq_range->start_freq_khz =
8219 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
8220 freq_range->end_freq_khz =
8221 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
8222 freq_range->max_bandwidth_khz =
8223 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
8225 power_rule->max_eirp =
8226 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
8228 if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
8229 power_rule->max_antenna_gain =
8230 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
8232 if (tb[NL80211_ATTR_DFS_CAC_TIME])
8233 reg_rule->dfs_cac_ms =
8234 nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]);
8239 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
8241 struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
8242 struct nlattr *nl_reg_rule;
8244 int rem_reg_rules, r;
8245 u32 num_rules = 0, rule_idx = 0;
8246 enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET;
8247 struct ieee80211_regdomain *rd;
8249 if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
8252 if (!info->attrs[NL80211_ATTR_REG_RULES])
8255 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
8257 if (info->attrs[NL80211_ATTR_DFS_REGION])
8258 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]);
8260 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
8263 if (num_rules > NL80211_MAX_SUPP_REG_RULES)
8268 if (!reg_is_valid_request(alpha2)) {
8273 rd = kzalloc(struct_size(rd, reg_rules, num_rules), GFP_KERNEL);
8279 rd->n_reg_rules = num_rules;
8280 rd->alpha2[0] = alpha2[0];
8281 rd->alpha2[1] = alpha2[1];
8284 * Disable DFS master mode if the DFS region was
8285 * not supported or known on this kernel.
8287 if (reg_supported_dfs_region(dfs_region))
8288 rd->dfs_region = dfs_region;
8290 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
8292 r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX,
8293 nl_reg_rule, reg_rule_policy,
8297 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
8303 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) {
8309 r = set_regdom(rd, REGD_SOURCE_CRDA);
8310 /* set_regdom takes ownership of rd */
8318 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */
8320 static int validate_scan_freqs(struct nlattr *freqs)
8322 struct nlattr *attr1, *attr2;
8323 int n_channels = 0, tmp1, tmp2;
8325 nla_for_each_nested(attr1, freqs, tmp1)
8326 if (nla_len(attr1) != sizeof(u32))
8329 nla_for_each_nested(attr1, freqs, tmp1) {
8332 * Some hardware has a limited channel list for
8333 * scanning, and it is pretty much nonsensical
8334 * to scan for a channel twice, so disallow that
8335 * and don't require drivers to check that the
8336 * channel list they get isn't longer than what
8337 * they can scan, as long as they can scan all
8338 * the channels they registered at once.
8340 nla_for_each_nested(attr2, freqs, tmp2)
8341 if (attr1 != attr2 &&
8342 nla_get_u32(attr1) == nla_get_u32(attr2))
8349 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b)
8351 return b < NUM_NL80211_BANDS && wiphy->bands[b];
8354 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy,
8355 struct cfg80211_bss_selection *bss_select)
8357 struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1];
8358 struct nlattr *nest;
8363 /* only process one nested attribute */
8364 nest = nla_data(nla);
8365 if (!nla_ok(nest, nla_len(nest)))
8368 err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX,
8369 nest, nl80211_bss_select_policy,
8374 /* only one attribute may be given */
8375 for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) {
8383 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID;
8385 if (attr[NL80211_BSS_SELECT_ATTR_RSSI])
8386 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI;
8388 if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) {
8389 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF;
8390 bss_select->param.band_pref =
8391 nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]);
8392 if (!is_band_valid(wiphy, bss_select->param.band_pref))
8396 if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) {
8397 struct nl80211_bss_select_rssi_adjust *adj_param;
8399 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]);
8400 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST;
8401 bss_select->param.adjust.band = adj_param->band;
8402 bss_select->param.adjust.delta = adj_param->delta;
8403 if (!is_band_valid(wiphy, bss_select->param.adjust.band))
8407 /* user-space did not provide behaviour attribute */
8408 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID)
8411 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour)))
8417 int nl80211_parse_random_mac(struct nlattr **attrs,
8418 u8 *mac_addr, u8 *mac_addr_mask)
8422 if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) {
8423 eth_zero_addr(mac_addr);
8424 eth_zero_addr(mac_addr_mask);
8426 mac_addr_mask[0] = 0x3;
8431 /* need both or none */
8432 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK])
8435 memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN);
8436 memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN);
8438 /* don't allow or configure an mcast address */
8439 if (!is_multicast_ether_addr(mac_addr_mask) ||
8440 is_multicast_ether_addr(mac_addr))
8444 * allow users to pass a MAC address that has bits set outside
8445 * of the mask, but don't bother drivers with having to deal
8448 for (i = 0; i < ETH_ALEN; i++)
8449 mac_addr[i] &= mac_addr_mask[i];
8454 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev)
8456 ASSERT_WDEV_LOCK(wdev);
8458 if (!cfg80211_beaconing_iface_active(wdev))
8461 if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR))
8464 return regulatory_pre_cac_allowed(wdev->wiphy);
8467 static bool nl80211_check_scan_feat(struct wiphy *wiphy, u32 flags, u32 flag,
8468 enum nl80211_ext_feature_index feat)
8470 if (!(flags & flag))
8472 if (wiphy_ext_feature_isset(wiphy, feat))
8478 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev,
8479 void *request, struct nlattr **attrs,
8482 u8 *mac_addr, *mac_addr_mask;
8484 enum nl80211_feature_flags randomness_flag;
8486 if (!attrs[NL80211_ATTR_SCAN_FLAGS])
8489 if (is_sched_scan) {
8490 struct cfg80211_sched_scan_request *req = request;
8492 randomness_flag = wdev ?
8493 NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR :
8494 NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
8495 flags = &req->flags;
8496 mac_addr = req->mac_addr;
8497 mac_addr_mask = req->mac_addr_mask;
8499 struct cfg80211_scan_request *req = request;
8501 randomness_flag = NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
8502 flags = &req->flags;
8503 mac_addr = req->mac_addr;
8504 mac_addr_mask = req->mac_addr_mask;
8507 *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]);
8509 if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
8510 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) ||
8511 !nl80211_check_scan_feat(wiphy, *flags,
8512 NL80211_SCAN_FLAG_LOW_SPAN,
8513 NL80211_EXT_FEATURE_LOW_SPAN_SCAN) ||
8514 !nl80211_check_scan_feat(wiphy, *flags,
8515 NL80211_SCAN_FLAG_LOW_POWER,
8516 NL80211_EXT_FEATURE_LOW_POWER_SCAN) ||
8517 !nl80211_check_scan_feat(wiphy, *flags,
8518 NL80211_SCAN_FLAG_HIGH_ACCURACY,
8519 NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN) ||
8520 !nl80211_check_scan_feat(wiphy, *flags,
8521 NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME,
8522 NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME) ||
8523 !nl80211_check_scan_feat(wiphy, *flags,
8524 NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP,
8525 NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP) ||
8526 !nl80211_check_scan_feat(wiphy, *flags,
8527 NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION,
8528 NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) ||
8529 !nl80211_check_scan_feat(wiphy, *flags,
8530 NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE,
8531 NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE) ||
8532 !nl80211_check_scan_feat(wiphy, *flags,
8533 NL80211_SCAN_FLAG_RANDOM_SN,
8534 NL80211_EXT_FEATURE_SCAN_RANDOM_SN) ||
8535 !nl80211_check_scan_feat(wiphy, *flags,
8536 NL80211_SCAN_FLAG_MIN_PREQ_CONTENT,
8537 NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT))
8540 if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
8543 if (!(wiphy->features & randomness_flag) ||
8544 (wdev && wdev->current_bss))
8547 err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask);
8555 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
8557 struct cfg80211_registered_device *rdev = info->user_ptr[0];
8558 struct wireless_dev *wdev = info->user_ptr[1];
8559 struct cfg80211_scan_request *request;
8560 struct nlattr *scan_freqs = NULL;
8561 bool scan_freqs_khz = false;
8562 struct nlattr *attr;
8563 struct wiphy *wiphy;
8564 int err, tmp, n_ssids = 0, n_channels, i;
8567 wiphy = &rdev->wiphy;
8569 if (wdev->iftype == NL80211_IFTYPE_NAN)
8572 if (!rdev->ops->scan)
8575 if (rdev->scan_req || rdev->scan_msg)
8578 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) {
8579 if (!wiphy_ext_feature_isset(wiphy,
8580 NL80211_EXT_FEATURE_SCAN_FREQ_KHZ))
8582 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ];
8583 scan_freqs_khz = true;
8584 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES])
8585 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES];
8588 n_channels = validate_scan_freqs(scan_freqs);
8592 n_channels = ieee80211_get_num_supported_channels(wiphy);
8595 if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
8596 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
8599 if (n_ssids > wiphy->max_scan_ssids)
8602 if (info->attrs[NL80211_ATTR_IE])
8603 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8607 if (ie_len > wiphy->max_scan_ie_len)
8610 request = kzalloc(sizeof(*request)
8611 + sizeof(*request->ssids) * n_ssids
8612 + sizeof(*request->channels) * n_channels
8613 + ie_len, GFP_KERNEL);
8618 request->ssids = (void *)&request->channels[n_channels];
8619 request->n_ssids = n_ssids;
8622 request->ie = (void *)(request->ssids + n_ssids);
8624 request->ie = (void *)(request->channels + n_channels);
8629 /* user specified, bail out if channel not found */
8630 nla_for_each_nested(attr, scan_freqs, tmp) {
8631 struct ieee80211_channel *chan;
8632 int freq = nla_get_u32(attr);
8634 if (!scan_freqs_khz)
8635 freq = MHZ_TO_KHZ(freq);
8637 chan = ieee80211_get_channel_khz(wiphy, freq);
8643 /* ignore disabled channels */
8644 if (chan->flags & IEEE80211_CHAN_DISABLED)
8647 request->channels[i] = chan;
8651 enum nl80211_band band;
8654 for (band = 0; band < NUM_NL80211_BANDS; band++) {
8657 if (!wiphy->bands[band])
8659 for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
8660 struct ieee80211_channel *chan;
8662 chan = &wiphy->bands[band]->channels[j];
8664 if (chan->flags & IEEE80211_CHAN_DISABLED)
8667 request->channels[i] = chan;
8678 request->n_channels = i;
8681 if (!cfg80211_off_channel_oper_allowed(wdev)) {
8682 struct ieee80211_channel *chan;
8684 if (request->n_channels != 1) {
8690 chan = request->channels[0];
8691 if (chan->center_freq != wdev->chandef.chan->center_freq) {
8701 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
8702 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
8706 request->ssids[i].ssid_len = nla_len(attr);
8707 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
8712 if (info->attrs[NL80211_ATTR_IE]) {
8713 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8714 memcpy((void *)request->ie,
8715 nla_data(info->attrs[NL80211_ATTR_IE]),
8719 for (i = 0; i < NUM_NL80211_BANDS; i++)
8720 if (wiphy->bands[i])
8722 (1 << wiphy->bands[i]->n_bitrates) - 1;
8724 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) {
8725 nla_for_each_nested(attr,
8726 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES],
8728 enum nl80211_band band = nla_type(attr);
8730 if (band < 0 || band >= NUM_NL80211_BANDS) {
8735 if (!wiphy->bands[band])
8738 err = ieee80211_get_ratemask(wiphy->bands[band],
8741 &request->rates[band]);
8747 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) {
8749 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]);
8750 request->duration_mandatory =
8751 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]);
8754 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs,
8760 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
8762 /* Initial implementation used NL80211_ATTR_MAC to set the specific
8763 * BSSID to scan for. This was problematic because that same attribute
8764 * was already used for another purpose (local random MAC address). The
8765 * NL80211_ATTR_BSSID attribute was added to fix this. For backwards
8766 * compatibility with older userspace components, also use the
8767 * NL80211_ATTR_MAC value here if it can be determined to be used for
8768 * the specific BSSID use case instead of the random MAC address
8769 * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use).
8771 if (info->attrs[NL80211_ATTR_BSSID])
8772 memcpy(request->bssid,
8773 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN);
8774 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) &&
8775 info->attrs[NL80211_ATTR_MAC])
8776 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]),
8779 eth_broadcast_addr(request->bssid);
8781 request->wdev = wdev;
8782 request->wiphy = &rdev->wiphy;
8783 request->scan_start = jiffies;
8785 rdev->scan_req = request;
8786 err = cfg80211_scan(rdev);
8791 nl80211_send_scan_start(rdev, wdev);
8792 dev_hold(wdev->netdev);
8797 rdev->scan_req = NULL;
8803 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info)
8805 struct cfg80211_registered_device *rdev = info->user_ptr[0];
8806 struct wireless_dev *wdev = info->user_ptr[1];
8808 if (!rdev->ops->abort_scan)
8814 if (!rdev->scan_req)
8817 rdev_abort_scan(rdev, wdev);
8822 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans,
8823 struct cfg80211_sched_scan_request *request,
8824 struct nlattr **attrs)
8826 int tmp, err, i = 0;
8827 struct nlattr *attr;
8829 if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
8833 * If scan plans are not specified,
8834 * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this
8835 * case one scan plan will be set with the specified scan
8836 * interval and infinite number of iterations.
8838 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]);
8842 request->scan_plans[0].interval =
8843 DIV_ROUND_UP(interval, MSEC_PER_SEC);
8844 if (!request->scan_plans[0].interval)
8847 if (request->scan_plans[0].interval >
8848 wiphy->max_sched_scan_plan_interval)
8849 request->scan_plans[0].interval =
8850 wiphy->max_sched_scan_plan_interval;
8855 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) {
8856 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1];
8858 if (WARN_ON(i >= n_plans))
8861 err = nla_parse_nested_deprecated(plan,
8862 NL80211_SCHED_SCAN_PLAN_MAX,
8863 attr, nl80211_plan_policy,
8868 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL])
8871 request->scan_plans[i].interval =
8872 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]);
8873 if (!request->scan_plans[i].interval ||
8874 request->scan_plans[i].interval >
8875 wiphy->max_sched_scan_plan_interval)
8878 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) {
8879 request->scan_plans[i].iterations =
8880 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]);
8881 if (!request->scan_plans[i].iterations ||
8882 (request->scan_plans[i].iterations >
8883 wiphy->max_sched_scan_plan_iterations))
8885 } else if (i < n_plans - 1) {
8887 * All scan plans but the last one must specify
8888 * a finite number of iterations
8897 * The last scan plan must not specify the number of
8898 * iterations, it is supposed to run infinitely
8900 if (request->scan_plans[n_plans - 1].iterations)
8907 nl80211_parse_sched_scan_per_band_rssi(struct wiphy *wiphy,
8908 struct cfg80211_match_set *match_sets,
8909 struct nlattr *tb_band_rssi,
8912 struct nlattr *attr;
8913 int i, tmp, ret = 0;
8915 if (!wiphy_ext_feature_isset(wiphy,
8916 NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD)) {
8920 for (i = 0; i < NUM_NL80211_BANDS; i++)
8921 match_sets->per_band_rssi_thold[i] =
8922 NL80211_SCAN_RSSI_THOLD_OFF;
8926 for (i = 0; i < NUM_NL80211_BANDS; i++)
8927 match_sets->per_band_rssi_thold[i] = rssi_thold;
8929 nla_for_each_nested(attr, tb_band_rssi, tmp) {
8930 enum nl80211_band band = nla_type(attr);
8932 if (band < 0 || band >= NUM_NL80211_BANDS)
8935 match_sets->per_band_rssi_thold[band] = nla_get_s32(attr);
8941 static struct cfg80211_sched_scan_request *
8942 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
8943 struct nlattr **attrs, int max_match_sets)
8945 struct cfg80211_sched_scan_request *request;
8946 struct nlattr *attr;
8947 int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0;
8948 enum nl80211_band band;
8950 struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1];
8951 s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF;
8953 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
8954 n_channels = validate_scan_freqs(
8955 attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
8957 return ERR_PTR(-EINVAL);
8959 n_channels = ieee80211_get_num_supported_channels(wiphy);
8962 if (attrs[NL80211_ATTR_SCAN_SSIDS])
8963 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
8967 if (n_ssids > wiphy->max_sched_scan_ssids)
8968 return ERR_PTR(-EINVAL);
8971 * First, count the number of 'real' matchsets. Due to an issue with
8972 * the old implementation, matchsets containing only the RSSI attribute
8973 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default'
8974 * RSSI for all matchsets, rather than their own matchset for reporting
8975 * all APs with a strong RSSI. This is needed to be compatible with
8976 * older userspace that treated a matchset with only the RSSI as the
8977 * global RSSI for all other matchsets - if there are other matchsets.
8979 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
8980 nla_for_each_nested(attr,
8981 attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
8983 struct nlattr *rssi;
8985 err = nla_parse_nested_deprecated(tb,
8986 NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
8988 nl80211_match_policy,
8991 return ERR_PTR(err);
8993 /* SSID and BSSID are mutually exclusive */
8994 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] &&
8995 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID])
8996 return ERR_PTR(-EINVAL);
8998 /* add other standalone attributes here */
8999 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] ||
9000 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) {
9004 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
9006 default_match_rssi = nla_get_s32(rssi);
9010 /* However, if there's no other matchset, add the RSSI one */
9011 if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
9014 if (n_match_sets > max_match_sets)
9015 return ERR_PTR(-EINVAL);
9017 if (attrs[NL80211_ATTR_IE])
9018 ie_len = nla_len(attrs[NL80211_ATTR_IE]);
9022 if (ie_len > wiphy->max_sched_scan_ie_len)
9023 return ERR_PTR(-EINVAL);
9025 if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
9027 * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since
9028 * each scan plan already specifies its own interval
9030 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
9031 return ERR_PTR(-EINVAL);
9033 nla_for_each_nested(attr,
9034 attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp)
9038 * The scan interval attribute is kept for backward
9039 * compatibility. If no scan plans are specified and sched scan
9040 * interval is specified, one scan plan will be set with this
9041 * scan interval and infinite number of iterations.
9043 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
9044 return ERR_PTR(-EINVAL);
9049 if (!n_plans || n_plans > wiphy->max_sched_scan_plans)
9050 return ERR_PTR(-EINVAL);
9052 if (!wiphy_ext_feature_isset(
9053 wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) &&
9054 (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] ||
9055 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]))
9056 return ERR_PTR(-EINVAL);
9058 request = kzalloc(sizeof(*request)
9059 + sizeof(*request->ssids) * n_ssids
9060 + sizeof(*request->match_sets) * n_match_sets
9061 + sizeof(*request->scan_plans) * n_plans
9062 + sizeof(*request->channels) * n_channels
9063 + ie_len, GFP_KERNEL);
9065 return ERR_PTR(-ENOMEM);
9068 request->ssids = (void *)&request->channels[n_channels];
9069 request->n_ssids = n_ssids;
9072 request->ie = (void *)(request->ssids + n_ssids);
9074 request->ie = (void *)(request->channels + n_channels);
9079 request->match_sets = (void *)(request->ie + ie_len);
9081 request->match_sets =
9082 (void *)(request->ssids + n_ssids);
9084 request->match_sets =
9085 (void *)(request->channels + n_channels);
9087 request->n_match_sets = n_match_sets;
9090 request->scan_plans = (void *)(request->match_sets +
9092 else if (request->ie)
9093 request->scan_plans = (void *)(request->ie + ie_len);
9095 request->scan_plans = (void *)(request->ssids + n_ssids);
9097 request->scan_plans = (void *)(request->channels + n_channels);
9099 request->n_scan_plans = n_plans;
9102 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
9103 /* user specified, bail out if channel not found */
9104 nla_for_each_nested(attr,
9105 attrs[NL80211_ATTR_SCAN_FREQUENCIES],
9107 struct ieee80211_channel *chan;
9109 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
9116 /* ignore disabled channels */
9117 if (chan->flags & IEEE80211_CHAN_DISABLED)
9120 request->channels[i] = chan;
9125 for (band = 0; band < NUM_NL80211_BANDS; band++) {
9128 if (!wiphy->bands[band])
9130 for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
9131 struct ieee80211_channel *chan;
9133 chan = &wiphy->bands[band]->channels[j];
9135 if (chan->flags & IEEE80211_CHAN_DISABLED)
9138 request->channels[i] = chan;
9149 request->n_channels = i;
9153 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
9155 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
9159 request->ssids[i].ssid_len = nla_len(attr);
9160 memcpy(request->ssids[i].ssid, nla_data(attr),
9167 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
9168 nla_for_each_nested(attr,
9169 attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
9171 struct nlattr *ssid, *bssid, *rssi;
9173 err = nla_parse_nested_deprecated(tb,
9174 NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
9176 nl80211_match_policy,
9180 ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
9181 bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID];
9183 if (!ssid && !bssid) {
9188 if (WARN_ON(i >= n_match_sets)) {
9189 /* this indicates a programming error,
9190 * the loop above should have verified
9198 memcpy(request->match_sets[i].ssid.ssid,
9199 nla_data(ssid), nla_len(ssid));
9200 request->match_sets[i].ssid.ssid_len =
9204 memcpy(request->match_sets[i].bssid,
9205 nla_data(bssid), ETH_ALEN);
9207 /* special attribute - old implementation w/a */
9208 request->match_sets[i].rssi_thold = default_match_rssi;
9209 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
9211 request->match_sets[i].rssi_thold =
9214 /* Parse per band RSSI attribute */
9215 err = nl80211_parse_sched_scan_per_band_rssi(wiphy,
9216 &request->match_sets[i],
9217 tb[NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI],
9218 request->match_sets[i].rssi_thold);
9225 /* there was no other matchset, so the RSSI one is alone */
9226 if (i == 0 && n_match_sets)
9227 request->match_sets[0].rssi_thold = default_match_rssi;
9229 request->min_rssi_thold = INT_MAX;
9230 for (i = 0; i < n_match_sets; i++)
9231 request->min_rssi_thold =
9232 min(request->match_sets[i].rssi_thold,
9233 request->min_rssi_thold);
9235 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF;
9239 request->ie_len = ie_len;
9240 memcpy((void *)request->ie,
9241 nla_data(attrs[NL80211_ATTR_IE]),
9245 err = nl80211_check_scan_flags(wiphy, wdev, request, attrs, true);
9249 if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY])
9251 nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]);
9253 if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) {
9254 request->relative_rssi = nla_get_s8(
9255 attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]);
9256 request->relative_rssi_set = true;
9259 if (request->relative_rssi_set &&
9260 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) {
9261 struct nl80211_bss_select_rssi_adjust *rssi_adjust;
9263 rssi_adjust = nla_data(
9264 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]);
9265 request->rssi_adjust.band = rssi_adjust->band;
9266 request->rssi_adjust.delta = rssi_adjust->delta;
9267 if (!is_band_valid(wiphy, request->rssi_adjust.band)) {
9273 err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs);
9277 request->scan_start = jiffies;
9283 return ERR_PTR(err);
9286 static int nl80211_start_sched_scan(struct sk_buff *skb,
9287 struct genl_info *info)
9289 struct cfg80211_registered_device *rdev = info->user_ptr[0];
9290 struct net_device *dev = info->user_ptr[1];
9291 struct wireless_dev *wdev = dev->ieee80211_ptr;
9292 struct cfg80211_sched_scan_request *sched_scan_req;
9296 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start)
9299 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI];
9300 err = cfg80211_sched_scan_req_possible(rdev, want_multi);
9304 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev,
9306 rdev->wiphy.max_match_sets);
9308 err = PTR_ERR_OR_ZERO(sched_scan_req);
9312 /* leave request id zero for legacy request
9313 * or if driver does not support multi-scheduled scan
9315 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1)
9316 sched_scan_req->reqid = cfg80211_assign_cookie(rdev);
9318 err = rdev_sched_scan_start(rdev, dev, sched_scan_req);
9322 sched_scan_req->dev = dev;
9323 sched_scan_req->wiphy = &rdev->wiphy;
9325 if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
9326 sched_scan_req->owner_nlportid = info->snd_portid;
9328 cfg80211_add_sched_scan_req(rdev, sched_scan_req);
9330 nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN);
9334 kfree(sched_scan_req);
9339 static int nl80211_stop_sched_scan(struct sk_buff *skb,
9340 struct genl_info *info)
9342 struct cfg80211_sched_scan_request *req;
9343 struct cfg80211_registered_device *rdev = info->user_ptr[0];
9346 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop)
9349 if (info->attrs[NL80211_ATTR_COOKIE]) {
9350 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
9351 return __cfg80211_stop_sched_scan(rdev, cookie, false);
9354 req = list_first_or_null_rcu(&rdev->sched_scan_req_list,
9355 struct cfg80211_sched_scan_request,
9357 if (!req || req->reqid ||
9358 (req->owner_nlportid &&
9359 req->owner_nlportid != info->snd_portid))
9362 return cfg80211_stop_sched_scan_req(rdev, req, false);
9365 static int nl80211_start_radar_detection(struct sk_buff *skb,
9366 struct genl_info *info)
9368 struct cfg80211_registered_device *rdev = info->user_ptr[0];
9369 struct net_device *dev = info->user_ptr[1];
9370 struct wireless_dev *wdev = dev->ieee80211_ptr;
9371 struct wiphy *wiphy = wdev->wiphy;
9372 struct cfg80211_chan_def chandef;
9373 enum nl80211_dfs_regions dfs_region;
9374 unsigned int cac_time_ms;
9377 flush_delayed_work(&rdev->dfs_update_channels_wk);
9381 dfs_region = reg_get_dfs_region(wiphy);
9382 if (dfs_region == NL80211_DFS_UNSET)
9385 err = nl80211_parse_chandef(rdev, info, &chandef);
9389 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype);
9398 if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) {
9403 if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) {
9404 err = cfg80211_start_background_radar_detection(rdev, wdev,
9409 if (netif_carrier_ok(dev)) {
9414 if (wdev->cac_started) {
9419 /* CAC start is offloaded to HW and can't be started manually */
9420 if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) {
9425 if (!rdev->ops->start_radar_detection) {
9430 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef);
9431 if (WARN_ON(!cac_time_ms))
9432 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
9434 err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms);
9436 wdev->chandef = chandef;
9437 wdev->cac_started = true;
9438 wdev->cac_start_time = jiffies;
9439 wdev->cac_time_ms = cac_time_ms;
9442 wiphy_unlock(wiphy);
9447 static int nl80211_notify_radar_detection(struct sk_buff *skb,
9448 struct genl_info *info)
9450 struct cfg80211_registered_device *rdev = info->user_ptr[0];
9451 struct net_device *dev = info->user_ptr[1];
9452 struct wireless_dev *wdev = dev->ieee80211_ptr;
9453 struct wiphy *wiphy = wdev->wiphy;
9454 struct cfg80211_chan_def chandef;
9455 enum nl80211_dfs_regions dfs_region;
9458 dfs_region = reg_get_dfs_region(wiphy);
9459 if (dfs_region == NL80211_DFS_UNSET) {
9460 GENL_SET_ERR_MSG(info,
9461 "DFS Region is not set. Unexpected Radar indication");
9465 err = nl80211_parse_chandef(rdev, info, &chandef);
9467 GENL_SET_ERR_MSG(info, "Unable to extract chandef info");
9471 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype);
9473 GENL_SET_ERR_MSG(info, "chandef is invalid");
9478 GENL_SET_ERR_MSG(info,
9479 "Unexpected Radar indication for chandef/iftype");
9483 /* Do not process this notification if radar is already detected
9484 * by kernel on this channel, and return success.
9486 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE)
9489 cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_UNAVAILABLE);
9491 cfg80211_sched_dfs_chan_update(rdev);
9493 rdev->radar_chandef = chandef;
9495 /* Propagate this notification to other radios as well */
9496 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk);
9501 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
9503 struct cfg80211_registered_device *rdev = info->user_ptr[0];
9504 struct net_device *dev = info->user_ptr[1];
9505 struct wireless_dev *wdev = dev->ieee80211_ptr;
9506 struct cfg80211_csa_settings params;
9507 struct nlattr **csa_attrs = NULL;
9509 bool need_new_beacon = false;
9510 bool need_handle_dfs_flag = true;
9514 if (!rdev->ops->channel_switch ||
9515 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
9518 switch (dev->ieee80211_ptr->iftype) {
9519 case NL80211_IFTYPE_AP:
9520 case NL80211_IFTYPE_P2P_GO:
9521 need_new_beacon = true;
9522 /* For all modes except AP the handle_dfs flag needs to be
9523 * supplied to tell the kernel that userspace will handle radar
9524 * events when they happen. Otherwise a switch to a channel
9525 * requiring DFS will be rejected.
9527 need_handle_dfs_flag = false;
9529 /* useless if AP is not running */
9530 if (!wdev->beacon_interval)
9533 case NL80211_IFTYPE_ADHOC:
9534 if (!wdev->ssid_len)
9537 case NL80211_IFTYPE_MESH_POINT:
9538 if (!wdev->mesh_id_len)
9545 memset(¶ms, 0, sizeof(params));
9546 params.beacon_csa.ftm_responder = -1;
9548 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
9549 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT])
9552 /* only important for AP, IBSS and mesh create IEs internally */
9553 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES])
9556 /* Even though the attribute is u32, the specification says
9557 * u8, so let's make sure we don't overflow.
9559 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]);
9563 params.count = cs_count;
9565 if (!need_new_beacon)
9568 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after);
9572 csa_attrs = kcalloc(NL80211_ATTR_MAX + 1, sizeof(*csa_attrs),
9579 err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX,
9580 info->attrs[NL80211_ATTR_CSA_IES],
9581 nl80211_policy, info->extack);
9585 err = nl80211_parse_beacon(rdev, csa_attrs, ¶ms.beacon_csa);
9589 if (!csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]) {
9594 len = nla_len(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]);
9595 if (!len || (len % sizeof(u16))) {
9600 params.n_counter_offsets_beacon = len / sizeof(u16);
9601 if (rdev->wiphy.max_num_csa_counters &&
9602 (params.n_counter_offsets_beacon >
9603 rdev->wiphy.max_num_csa_counters)) {
9608 params.counter_offsets_beacon =
9609 nla_data(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]);
9611 /* sanity checks - counters should fit and be the same */
9612 for (i = 0; i < params.n_counter_offsets_beacon; i++) {
9613 u16 offset = params.counter_offsets_beacon[i];
9615 if (offset >= params.beacon_csa.tail_len) {
9620 if (params.beacon_csa.tail[offset] != params.count) {
9626 if (csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP]) {
9627 len = nla_len(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP]);
9628 if (!len || (len % sizeof(u16))) {
9633 params.n_counter_offsets_presp = len / sizeof(u16);
9634 if (rdev->wiphy.max_num_csa_counters &&
9635 (params.n_counter_offsets_presp >
9636 rdev->wiphy.max_num_csa_counters)) {
9641 params.counter_offsets_presp =
9642 nla_data(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP]);
9644 /* sanity checks - counters should fit and be the same */
9645 for (i = 0; i < params.n_counter_offsets_presp; i++) {
9646 u16 offset = params.counter_offsets_presp[i];
9648 if (offset >= params.beacon_csa.probe_resp_len) {
9653 if (params.beacon_csa.probe_resp[offset] !=
9662 err = nl80211_parse_chandef(rdev, info, ¶ms.chandef);
9666 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef,
9672 err = cfg80211_chandef_dfs_required(wdev->wiphy,
9679 params.radar_required = true;
9680 if (need_handle_dfs_flag &&
9681 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) {
9687 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
9688 params.block_tx = true;
9691 err = rdev_channel_switch(rdev, dev, ¶ms);
9695 kfree(params.beacon_after.mbssid_ies);
9696 kfree(params.beacon_csa.mbssid_ies);
9701 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
9703 struct cfg80211_registered_device *rdev,
9704 struct wireless_dev *wdev,
9705 struct cfg80211_internal_bss *intbss)
9707 struct cfg80211_bss *res = &intbss->pub;
9708 const struct cfg80211_bss_ies *ies;
9712 ASSERT_WDEV_LOCK(wdev);
9714 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
9715 NL80211_CMD_NEW_SCAN_RESULTS);
9719 genl_dump_check_consistent(cb, hdr);
9721 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation))
9722 goto nla_put_failure;
9724 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex))
9725 goto nla_put_failure;
9726 if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
9728 goto nla_put_failure;
9730 bss = nla_nest_start_noflag(msg, NL80211_ATTR_BSS);
9732 goto nla_put_failure;
9733 if ((!is_zero_ether_addr(res->bssid) &&
9734 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid)))
9735 goto nla_put_failure;
9738 /* indicate whether we have probe response data or not */
9739 if (rcu_access_pointer(res->proberesp_ies) &&
9740 nla_put_flag(msg, NL80211_BSS_PRESP_DATA))
9741 goto fail_unlock_rcu;
9743 /* this pointer prefers to be pointed to probe response data
9744 * but is always valid
9746 ies = rcu_dereference(res->ies);
9748 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf,
9750 goto fail_unlock_rcu;
9751 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS,
9752 ies->len, ies->data))
9753 goto fail_unlock_rcu;
9756 /* and this pointer is always (unless driver didn't know) beacon data */
9757 ies = rcu_dereference(res->beacon_ies);
9758 if (ies && ies->from_beacon) {
9759 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf,
9761 goto fail_unlock_rcu;
9762 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES,
9763 ies->len, ies->data))
9764 goto fail_unlock_rcu;
9768 if (res->beacon_interval &&
9769 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval))
9770 goto nla_put_failure;
9771 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) ||
9772 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) ||
9773 nla_put_u32(msg, NL80211_BSS_FREQUENCY_OFFSET,
9774 res->channel->freq_offset) ||
9775 nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) ||
9776 nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO,
9777 jiffies_to_msecs(jiffies - intbss->ts)))
9778 goto nla_put_failure;
9780 if (intbss->parent_tsf &&
9781 (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF,
9782 intbss->parent_tsf, NL80211_BSS_PAD) ||
9783 nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN,
9784 intbss->parent_bssid)))
9785 goto nla_put_failure;
9787 if (intbss->ts_boottime &&
9788 nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME,
9789 intbss->ts_boottime, NL80211_BSS_PAD))
9790 goto nla_put_failure;
9792 if (!nl80211_put_signal(msg, intbss->pub.chains,
9793 intbss->pub.chain_signal,
9794 NL80211_BSS_CHAIN_SIGNAL))
9795 goto nla_put_failure;
9797 switch (rdev->wiphy.signal_type) {
9798 case CFG80211_SIGNAL_TYPE_MBM:
9799 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal))
9800 goto nla_put_failure;
9802 case CFG80211_SIGNAL_TYPE_UNSPEC:
9803 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal))
9804 goto nla_put_failure;
9810 switch (wdev->iftype) {
9811 case NL80211_IFTYPE_P2P_CLIENT:
9812 case NL80211_IFTYPE_STATION:
9813 if (intbss == wdev->current_bss &&
9814 nla_put_u32(msg, NL80211_BSS_STATUS,
9815 NL80211_BSS_STATUS_ASSOCIATED))
9816 goto nla_put_failure;
9818 case NL80211_IFTYPE_ADHOC:
9819 if (intbss == wdev->current_bss &&
9820 nla_put_u32(msg, NL80211_BSS_STATUS,
9821 NL80211_BSS_STATUS_IBSS_JOINED))
9822 goto nla_put_failure;
9828 nla_nest_end(msg, bss);
9830 genlmsg_end(msg, hdr);
9836 genlmsg_cancel(msg, hdr);
9840 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb)
9842 struct cfg80211_registered_device *rdev;
9843 struct cfg80211_internal_bss *scan;
9844 struct wireless_dev *wdev;
9845 int start = cb->args[2], idx = 0;
9848 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL);
9851 /* nl80211_prepare_wdev_dump acquired it in the successful case */
9852 __acquire(&rdev->wiphy.mtx);
9855 spin_lock_bh(&rdev->bss_lock);
9858 * dump_scan will be called multiple times to break up the scan results
9859 * into multiple messages. It is unlikely that any more bss-es will be
9860 * expired after the first call, so only call only call this on the
9861 * first dump_scan invocation.
9864 cfg80211_bss_expire(rdev);
9866 cb->seq = rdev->bss_generation;
9868 list_for_each_entry(scan, &rdev->bss_list, list) {
9871 if (nl80211_send_bss(skb, cb,
9872 cb->nlh->nlmsg_seq, NLM_F_MULTI,
9873 rdev, wdev, scan) < 0) {
9879 spin_unlock_bh(&rdev->bss_lock);
9883 wiphy_unlock(&rdev->wiphy);
9888 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq,
9889 int flags, struct net_device *dev,
9890 bool allow_radio_stats,
9891 struct survey_info *survey)
9894 struct nlattr *infoattr;
9896 /* skip radio stats if userspace didn't request them */
9897 if (!survey->channel && !allow_radio_stats)
9900 hdr = nl80211hdr_put(msg, portid, seq, flags,
9901 NL80211_CMD_NEW_SURVEY_RESULTS);
9905 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
9906 goto nla_put_failure;
9908 infoattr = nla_nest_start_noflag(msg, NL80211_ATTR_SURVEY_INFO);
9910 goto nla_put_failure;
9912 if (survey->channel &&
9913 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY,
9914 survey->channel->center_freq))
9915 goto nla_put_failure;
9917 if (survey->channel && survey->channel->freq_offset &&
9918 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY_OFFSET,
9919 survey->channel->freq_offset))
9920 goto nla_put_failure;
9922 if ((survey->filled & SURVEY_INFO_NOISE_DBM) &&
9923 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise))
9924 goto nla_put_failure;
9925 if ((survey->filled & SURVEY_INFO_IN_USE) &&
9926 nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE))
9927 goto nla_put_failure;
9928 if ((survey->filled & SURVEY_INFO_TIME) &&
9929 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME,
9930 survey->time, NL80211_SURVEY_INFO_PAD))
9931 goto nla_put_failure;
9932 if ((survey->filled & SURVEY_INFO_TIME_BUSY) &&
9933 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY,
9934 survey->time_busy, NL80211_SURVEY_INFO_PAD))
9935 goto nla_put_failure;
9936 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) &&
9937 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY,
9938 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD))
9939 goto nla_put_failure;
9940 if ((survey->filled & SURVEY_INFO_TIME_RX) &&
9941 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX,
9942 survey->time_rx, NL80211_SURVEY_INFO_PAD))
9943 goto nla_put_failure;
9944 if ((survey->filled & SURVEY_INFO_TIME_TX) &&
9945 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX,
9946 survey->time_tx, NL80211_SURVEY_INFO_PAD))
9947 goto nla_put_failure;
9948 if ((survey->filled & SURVEY_INFO_TIME_SCAN) &&
9949 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN,
9950 survey->time_scan, NL80211_SURVEY_INFO_PAD))
9951 goto nla_put_failure;
9952 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) &&
9953 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BSS_RX,
9954 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD))
9955 goto nla_put_failure;
9957 nla_nest_end(msg, infoattr);
9959 genlmsg_end(msg, hdr);
9963 genlmsg_cancel(msg, hdr);
9967 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
9969 struct nlattr **attrbuf;
9970 struct survey_info survey;
9971 struct cfg80211_registered_device *rdev;
9972 struct wireless_dev *wdev;
9973 int survey_idx = cb->args[2];
9977 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), GFP_KERNEL);
9981 res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf);
9986 /* nl80211_prepare_wdev_dump acquired it in the successful case */
9987 __acquire(&rdev->wiphy.mtx);
9989 /* prepare_wdev_dump parsed the attributes */
9990 radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
9992 if (!wdev->netdev) {
9997 if (!rdev->ops->dump_survey) {
10003 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey);
10004 if (res == -ENOENT)
10009 /* don't send disabled channels, but do send non-channel data */
10010 if (survey.channel &&
10011 survey.channel->flags & IEEE80211_CHAN_DISABLED) {
10016 if (nl80211_send_survey(skb,
10017 NETLINK_CB(cb->skb).portid,
10018 cb->nlh->nlmsg_seq, NLM_F_MULTI,
10019 wdev->netdev, radio_stats, &survey) < 0)
10025 cb->args[2] = survey_idx;
10029 wiphy_unlock(&rdev->wiphy);
10033 static bool nl80211_valid_wpa_versions(u32 wpa_versions)
10035 return !(wpa_versions & ~(NL80211_WPA_VERSION_1 |
10036 NL80211_WPA_VERSION_2 |
10037 NL80211_WPA_VERSION_3));
10040 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
10042 struct cfg80211_registered_device *rdev = info->user_ptr[0];
10043 struct net_device *dev = info->user_ptr[1];
10044 struct ieee80211_channel *chan;
10045 const u8 *bssid, *ssid, *ie = NULL, *auth_data = NULL;
10046 int err, ssid_len, ie_len = 0, auth_data_len = 0;
10047 enum nl80211_auth_type auth_type;
10048 struct key_parse key;
10049 bool local_state_change;
10052 if (!info->attrs[NL80211_ATTR_MAC])
10055 if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
10058 if (!info->attrs[NL80211_ATTR_SSID])
10061 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
10064 err = nl80211_parse_key(info, &key);
10068 if (key.idx >= 0) {
10069 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP)
10071 if (!key.p.key || !key.p.key_len)
10073 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 ||
10074 key.p.key_len != WLAN_KEY_LEN_WEP40) &&
10075 (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 ||
10076 key.p.key_len != WLAN_KEY_LEN_WEP104))
10085 if (key.idx >= 0) {
10089 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) {
10090 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) {
10099 if (!rdev->ops->auth)
10100 return -EOPNOTSUPP;
10102 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
10103 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
10104 return -EOPNOTSUPP;
10106 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
10107 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
10108 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
10110 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
10112 chan = nl80211_get_valid_chan(&rdev->wiphy, freq);
10116 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
10117 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
10119 if (info->attrs[NL80211_ATTR_IE]) {
10120 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
10121 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
10124 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
10125 if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE))
10128 if ((auth_type == NL80211_AUTHTYPE_SAE ||
10129 auth_type == NL80211_AUTHTYPE_FILS_SK ||
10130 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
10131 auth_type == NL80211_AUTHTYPE_FILS_PK) &&
10132 !info->attrs[NL80211_ATTR_AUTH_DATA])
10135 if (info->attrs[NL80211_ATTR_AUTH_DATA]) {
10136 if (auth_type != NL80211_AUTHTYPE_SAE &&
10137 auth_type != NL80211_AUTHTYPE_FILS_SK &&
10138 auth_type != NL80211_AUTHTYPE_FILS_SK_PFS &&
10139 auth_type != NL80211_AUTHTYPE_FILS_PK)
10141 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
10142 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
10145 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
10148 * Since we no longer track auth state, ignore
10149 * requests to only change local state.
10151 if (local_state_change)
10154 wdev_lock(dev->ieee80211_ptr);
10155 err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
10156 ssid, ssid_len, ie, ie_len,
10157 key.p.key, key.p.key_len, key.idx,
10158 auth_data, auth_data_len);
10159 wdev_unlock(dev->ieee80211_ptr);
10163 static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev,
10164 struct genl_info *info)
10166 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
10167 GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set");
10171 if (!rdev->ops->tx_control_port ||
10172 !wiphy_ext_feature_isset(&rdev->wiphy,
10173 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211))
10174 return -EOPNOTSUPP;
10179 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
10180 struct genl_info *info,
10181 struct cfg80211_crypto_settings *settings,
10184 memset(settings, 0, sizeof(*settings));
10186 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
10188 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
10191 proto = nla_get_u16(
10192 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
10193 settings->control_port_ethertype = cpu_to_be16(proto);
10194 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
10195 proto != ETH_P_PAE)
10197 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT])
10198 settings->control_port_no_encrypt = true;
10200 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE);
10202 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
10203 int r = validate_pae_over_nl80211(rdev, info);
10208 settings->control_port_over_nl80211 = true;
10210 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH])
10211 settings->control_port_no_preauth = true;
10214 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
10218 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
10219 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
10220 settings->n_ciphers_pairwise = len / sizeof(u32);
10222 if (len % sizeof(u32))
10225 if (settings->n_ciphers_pairwise > cipher_limit)
10228 memcpy(settings->ciphers_pairwise, data, len);
10230 for (i = 0; i < settings->n_ciphers_pairwise; i++)
10231 if (!cfg80211_supported_cipher_suite(
10233 settings->ciphers_pairwise[i]))
10237 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
10238 settings->cipher_group =
10239 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
10240 if (!cfg80211_supported_cipher_suite(&rdev->wiphy,
10241 settings->cipher_group))
10245 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) {
10246 settings->wpa_versions =
10247 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
10248 if (!nl80211_valid_wpa_versions(settings->wpa_versions))
10252 if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
10256 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
10257 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
10258 settings->n_akm_suites = len / sizeof(u32);
10260 if (len % sizeof(u32))
10263 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
10266 memcpy(settings->akm_suites, data, len);
10269 if (info->attrs[NL80211_ATTR_PMK]) {
10270 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN)
10272 if (!wiphy_ext_feature_isset(&rdev->wiphy,
10273 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) &&
10274 !wiphy_ext_feature_isset(&rdev->wiphy,
10275 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK))
10277 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]);
10280 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) {
10281 if (!wiphy_ext_feature_isset(&rdev->wiphy,
10282 NL80211_EXT_FEATURE_SAE_OFFLOAD) &&
10283 !wiphy_ext_feature_isset(&rdev->wiphy,
10284 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP))
10286 settings->sae_pwd =
10287 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
10288 settings->sae_pwd_len =
10289 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
10292 if (info->attrs[NL80211_ATTR_SAE_PWE])
10293 settings->sae_pwe =
10294 nla_get_u8(info->attrs[NL80211_ATTR_SAE_PWE]);
10296 settings->sae_pwe = NL80211_SAE_PWE_UNSPECIFIED;
10301 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
10303 struct cfg80211_registered_device *rdev = info->user_ptr[0];
10304 struct net_device *dev = info->user_ptr[1];
10305 struct ieee80211_channel *chan;
10306 struct cfg80211_assoc_request req = {};
10307 const u8 *bssid, *ssid;
10308 int err, ssid_len = 0;
10311 if (dev->ieee80211_ptr->conn_owner_nlportid &&
10312 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
10315 if (!info->attrs[NL80211_ATTR_MAC] ||
10316 !info->attrs[NL80211_ATTR_SSID] ||
10317 !info->attrs[NL80211_ATTR_WIPHY_FREQ])
10320 if (!rdev->ops->assoc)
10321 return -EOPNOTSUPP;
10323 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
10324 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
10325 return -EOPNOTSUPP;
10327 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
10329 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
10330 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
10332 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
10333 chan = nl80211_get_valid_chan(&rdev->wiphy, freq);
10337 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
10338 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
10340 if (info->attrs[NL80211_ATTR_IE]) {
10341 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
10342 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
10345 if (info->attrs[NL80211_ATTR_USE_MFP]) {
10346 enum nl80211_mfp mfp =
10347 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
10348 if (mfp == NL80211_MFP_REQUIRED)
10349 req.use_mfp = true;
10350 else if (mfp != NL80211_MFP_NO)
10354 if (info->attrs[NL80211_ATTR_PREV_BSSID])
10355 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
10357 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
10358 req.flags |= ASSOC_REQ_DISABLE_HT;
10360 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
10361 memcpy(&req.ht_capa_mask,
10362 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
10363 sizeof(req.ht_capa_mask));
10365 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
10366 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
10368 memcpy(&req.ht_capa,
10369 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
10370 sizeof(req.ht_capa));
10373 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
10374 req.flags |= ASSOC_REQ_DISABLE_VHT;
10376 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE]))
10377 req.flags |= ASSOC_REQ_DISABLE_HE;
10379 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
10380 memcpy(&req.vht_capa_mask,
10381 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
10382 sizeof(req.vht_capa_mask));
10384 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
10385 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
10387 memcpy(&req.vht_capa,
10388 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
10389 sizeof(req.vht_capa));
10392 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
10393 if (!((rdev->wiphy.features &
10394 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
10395 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
10396 !wiphy_ext_feature_isset(&rdev->wiphy,
10397 NL80211_EXT_FEATURE_RRM))
10399 req.flags |= ASSOC_REQ_USE_RRM;
10402 if (info->attrs[NL80211_ATTR_FILS_KEK]) {
10403 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]);
10404 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]);
10405 if (!info->attrs[NL80211_ATTR_FILS_NONCES])
10408 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]);
10411 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) {
10412 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY])
10414 memcpy(&req.s1g_capa_mask,
10415 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]),
10416 sizeof(req.s1g_capa_mask));
10419 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) {
10420 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK])
10422 memcpy(&req.s1g_capa,
10423 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]),
10424 sizeof(req.s1g_capa));
10427 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
10429 wdev_lock(dev->ieee80211_ptr);
10431 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid,
10432 ssid, ssid_len, &req);
10434 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
10435 dev->ieee80211_ptr->conn_owner_nlportid =
10437 memcpy(dev->ieee80211_ptr->disconnect_bssid,
10441 wdev_unlock(dev->ieee80211_ptr);
10447 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
10449 struct cfg80211_registered_device *rdev = info->user_ptr[0];
10450 struct net_device *dev = info->user_ptr[1];
10451 const u8 *ie = NULL, *bssid;
10452 int ie_len = 0, err;
10454 bool local_state_change;
10456 if (dev->ieee80211_ptr->conn_owner_nlportid &&
10457 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
10460 if (!info->attrs[NL80211_ATTR_MAC])
10463 if (!info->attrs[NL80211_ATTR_REASON_CODE])
10466 if (!rdev->ops->deauth)
10467 return -EOPNOTSUPP;
10469 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
10470 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
10471 return -EOPNOTSUPP;
10473 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
10475 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
10476 if (reason_code == 0) {
10477 /* Reason Code 0 is reserved */
10481 if (info->attrs[NL80211_ATTR_IE]) {
10482 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
10483 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
10486 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
10488 wdev_lock(dev->ieee80211_ptr);
10489 err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code,
10490 local_state_change);
10491 wdev_unlock(dev->ieee80211_ptr);
10495 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
10497 struct cfg80211_registered_device *rdev = info->user_ptr[0];
10498 struct net_device *dev = info->user_ptr[1];
10499 const u8 *ie = NULL, *bssid;
10500 int ie_len = 0, err;
10502 bool local_state_change;
10504 if (dev->ieee80211_ptr->conn_owner_nlportid &&
10505 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
10508 if (!info->attrs[NL80211_ATTR_MAC])
10511 if (!info->attrs[NL80211_ATTR_REASON_CODE])
10514 if (!rdev->ops->disassoc)
10515 return -EOPNOTSUPP;
10517 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
10518 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
10519 return -EOPNOTSUPP;
10521 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
10523 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
10524 if (reason_code == 0) {
10525 /* Reason Code 0 is reserved */
10529 if (info->attrs[NL80211_ATTR_IE]) {
10530 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
10531 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
10534 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
10536 wdev_lock(dev->ieee80211_ptr);
10537 err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code,
10538 local_state_change);
10539 wdev_unlock(dev->ieee80211_ptr);
10544 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev,
10545 int mcast_rate[NUM_NL80211_BANDS],
10548 struct wiphy *wiphy = &rdev->wiphy;
10549 bool found = false;
10552 for (band = 0; band < NUM_NL80211_BANDS; band++) {
10553 struct ieee80211_supported_band *sband;
10555 sband = wiphy->bands[band];
10559 for (i = 0; i < sband->n_bitrates; i++) {
10560 if (sband->bitrates[i].bitrate == rateval) {
10561 mcast_rate[band] = i + 1;
10571 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
10573 struct cfg80211_registered_device *rdev = info->user_ptr[0];
10574 struct net_device *dev = info->user_ptr[1];
10575 struct cfg80211_ibss_params ibss;
10576 struct wiphy *wiphy;
10577 struct cfg80211_cached_keys *connkeys = NULL;
10580 memset(&ibss, 0, sizeof(ibss));
10582 if (!info->attrs[NL80211_ATTR_SSID] ||
10583 !nla_len(info->attrs[NL80211_ATTR_SSID]))
10586 ibss.beacon_interval = 100;
10588 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL])
10589 ibss.beacon_interval =
10590 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
10592 err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC,
10593 ibss.beacon_interval);
10597 if (!rdev->ops->join_ibss)
10598 return -EOPNOTSUPP;
10600 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
10601 return -EOPNOTSUPP;
10603 wiphy = &rdev->wiphy;
10605 if (info->attrs[NL80211_ATTR_MAC]) {
10606 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
10608 if (!is_valid_ether_addr(ibss.bssid))
10611 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
10612 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
10614 if (info->attrs[NL80211_ATTR_IE]) {
10615 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
10616 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
10619 err = nl80211_parse_chandef(rdev, info, &ibss.chandef);
10623 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef,
10624 NL80211_IFTYPE_ADHOC))
10627 switch (ibss.chandef.width) {
10628 case NL80211_CHAN_WIDTH_5:
10629 case NL80211_CHAN_WIDTH_10:
10630 case NL80211_CHAN_WIDTH_20_NOHT:
10632 case NL80211_CHAN_WIDTH_20:
10633 case NL80211_CHAN_WIDTH_40:
10634 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
10637 case NL80211_CHAN_WIDTH_80:
10638 case NL80211_CHAN_WIDTH_80P80:
10639 case NL80211_CHAN_WIDTH_160:
10640 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
10642 if (!wiphy_ext_feature_isset(&rdev->wiphy,
10643 NL80211_EXT_FEATURE_VHT_IBSS))
10646 case NL80211_CHAN_WIDTH_320:
10652 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
10653 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
10655 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
10657 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
10659 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
10660 struct ieee80211_supported_band *sband =
10661 wiphy->bands[ibss.chandef.chan->band];
10663 err = ieee80211_get_ratemask(sband, rates, n_rates,
10664 &ibss.basic_rates);
10669 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
10670 memcpy(&ibss.ht_capa_mask,
10671 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
10672 sizeof(ibss.ht_capa_mask));
10674 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
10675 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
10677 memcpy(&ibss.ht_capa,
10678 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
10679 sizeof(ibss.ht_capa));
10682 if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
10683 !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate,
10684 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
10687 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
10688 bool no_ht = false;
10690 connkeys = nl80211_parse_connkeys(rdev, info, &no_ht);
10691 if (IS_ERR(connkeys))
10692 return PTR_ERR(connkeys);
10694 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) &&
10696 kfree_sensitive(connkeys);
10701 ibss.control_port =
10702 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]);
10704 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
10705 int r = validate_pae_over_nl80211(rdev, info);
10708 kfree_sensitive(connkeys);
10712 ibss.control_port_over_nl80211 = true;
10715 ibss.userspace_handles_dfs =
10716 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
10718 wdev_lock(dev->ieee80211_ptr);
10719 err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
10721 kfree_sensitive(connkeys);
10722 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
10723 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
10724 wdev_unlock(dev->ieee80211_ptr);
10729 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
10731 struct cfg80211_registered_device *rdev = info->user_ptr[0];
10732 struct net_device *dev = info->user_ptr[1];
10734 if (!rdev->ops->leave_ibss)
10735 return -EOPNOTSUPP;
10737 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
10738 return -EOPNOTSUPP;
10740 return cfg80211_leave_ibss(rdev, dev, false);
10743 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info)
10745 struct cfg80211_registered_device *rdev = info->user_ptr[0];
10746 struct net_device *dev = info->user_ptr[1];
10747 int mcast_rate[NUM_NL80211_BANDS];
10751 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
10752 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
10753 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB)
10754 return -EOPNOTSUPP;
10756 if (!rdev->ops->set_mcast_rate)
10757 return -EOPNOTSUPP;
10759 memset(mcast_rate, 0, sizeof(mcast_rate));
10761 if (!info->attrs[NL80211_ATTR_MCAST_RATE])
10764 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
10765 if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate))
10768 err = rdev_set_mcast_rate(rdev, dev, mcast_rate);
10773 static struct sk_buff *
10774 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
10775 struct wireless_dev *wdev, int approxlen,
10776 u32 portid, u32 seq, enum nl80211_commands cmd,
10777 enum nl80211_attrs attr,
10778 const struct nl80211_vendor_cmd_info *info,
10781 struct sk_buff *skb;
10783 struct nlattr *data;
10785 skb = nlmsg_new(approxlen + 100, gfp);
10789 hdr = nl80211hdr_put(skb, portid, seq, 0, cmd);
10795 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
10796 goto nla_put_failure;
10799 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID,
10801 goto nla_put_failure;
10802 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD,
10804 goto nla_put_failure;
10808 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
10809 wdev_id(wdev), NL80211_ATTR_PAD))
10810 goto nla_put_failure;
10811 if (wdev->netdev &&
10812 nla_put_u32(skb, NL80211_ATTR_IFINDEX,
10813 wdev->netdev->ifindex))
10814 goto nla_put_failure;
10817 data = nla_nest_start_noflag(skb, attr);
10819 goto nla_put_failure;
10821 ((void **)skb->cb)[0] = rdev;
10822 ((void **)skb->cb)[1] = hdr;
10823 ((void **)skb->cb)[2] = data;
10832 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
10833 struct wireless_dev *wdev,
10834 enum nl80211_commands cmd,
10835 enum nl80211_attrs attr,
10836 unsigned int portid,
10837 int vendor_event_idx,
10838 int approxlen, gfp_t gfp)
10840 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
10841 const struct nl80211_vendor_cmd_info *info;
10844 case NL80211_CMD_TESTMODE:
10845 if (WARN_ON(vendor_event_idx != -1))
10849 case NL80211_CMD_VENDOR:
10850 if (WARN_ON(vendor_event_idx < 0 ||
10851 vendor_event_idx >= wiphy->n_vendor_events))
10853 info = &wiphy->vendor_events[vendor_event_idx];
10860 return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, portid, 0,
10861 cmd, attr, info, gfp);
10863 EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
10865 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
10867 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
10868 void *hdr = ((void **)skb->cb)[1];
10869 struct nlmsghdr *nlhdr = nlmsg_hdr(skb);
10870 struct nlattr *data = ((void **)skb->cb)[2];
10871 enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
10873 /* clear CB data for netlink core to own from now on */
10874 memset(skb->cb, 0, sizeof(skb->cb));
10876 nla_nest_end(skb, data);
10877 genlmsg_end(skb, hdr);
10879 if (nlhdr->nlmsg_pid) {
10880 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb,
10883 if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
10884 mcgrp = NL80211_MCGRP_VENDOR;
10886 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
10887 skb, 0, mcgrp, gfp);
10890 EXPORT_SYMBOL(__cfg80211_send_event_skb);
10892 #ifdef CONFIG_NL80211_TESTMODE
10893 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
10895 struct cfg80211_registered_device *rdev = info->user_ptr[0];
10896 struct wireless_dev *wdev;
10899 lockdep_assert_held(&rdev->wiphy.mtx);
10901 wdev = __cfg80211_wdev_from_attrs(rdev, genl_info_net(info),
10904 if (!rdev->ops->testmode_cmd)
10905 return -EOPNOTSUPP;
10907 if (IS_ERR(wdev)) {
10908 err = PTR_ERR(wdev);
10909 if (err != -EINVAL)
10912 } else if (wdev->wiphy != &rdev->wiphy) {
10916 if (!info->attrs[NL80211_ATTR_TESTDATA])
10919 rdev->cur_cmd_info = info;
10920 err = rdev_testmode_cmd(rdev, wdev,
10921 nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
10922 nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
10923 rdev->cur_cmd_info = NULL;
10928 static int nl80211_testmode_dump(struct sk_buff *skb,
10929 struct netlink_callback *cb)
10931 struct cfg80211_registered_device *rdev;
10932 struct nlattr **attrbuf = NULL;
10942 * 0 is a valid index, but not valid for args[0],
10943 * so we need to offset by 1.
10945 phy_idx = cb->args[0] - 1;
10947 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
10953 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf),
10960 err = nlmsg_parse_deprecated(cb->nlh,
10961 GENL_HDRLEN + nl80211_fam.hdrsize,
10962 attrbuf, nl80211_fam.maxattr,
10963 nl80211_policy, NULL);
10967 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
10968 if (IS_ERR(rdev)) {
10969 err = PTR_ERR(rdev);
10972 phy_idx = rdev->wiphy_idx;
10974 if (attrbuf[NL80211_ATTR_TESTDATA])
10975 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA];
10979 data = nla_data((void *)cb->args[1]);
10980 data_len = nla_len((void *)cb->args[1]);
10983 if (!rdev->ops->testmode_dump) {
10989 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
10990 cb->nlh->nlmsg_seq, NLM_F_MULTI,
10991 NL80211_CMD_TESTMODE);
10992 struct nlattr *tmdata;
10997 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) {
10998 genlmsg_cancel(skb, hdr);
11002 tmdata = nla_nest_start_noflag(skb, NL80211_ATTR_TESTDATA);
11004 genlmsg_cancel(skb, hdr);
11007 err = rdev_testmode_dump(rdev, skb, cb, data, data_len);
11008 nla_nest_end(skb, tmdata);
11010 if (err == -ENOBUFS || err == -ENOENT) {
11011 genlmsg_cancel(skb, hdr);
11014 genlmsg_cancel(skb, hdr);
11018 genlmsg_end(skb, hdr);
11023 cb->args[0] = phy_idx + 1;
11031 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
11033 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11034 struct net_device *dev = info->user_ptr[1];
11035 struct cfg80211_connect_params connect;
11036 struct wiphy *wiphy;
11037 struct cfg80211_cached_keys *connkeys = NULL;
11041 memset(&connect, 0, sizeof(connect));
11043 if (!info->attrs[NL80211_ATTR_SSID] ||
11044 !nla_len(info->attrs[NL80211_ATTR_SSID]))
11047 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
11048 connect.auth_type =
11049 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
11050 if (!nl80211_valid_auth_type(rdev, connect.auth_type,
11051 NL80211_CMD_CONNECT))
11054 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
11056 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
11058 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] &&
11059 !wiphy_ext_feature_isset(&rdev->wiphy,
11060 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
11062 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS];
11064 err = nl80211_crypto_settings(rdev, info, &connect.crypto,
11065 NL80211_MAX_NR_CIPHER_SUITES);
11069 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
11070 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
11071 return -EOPNOTSUPP;
11073 wiphy = &rdev->wiphy;
11075 connect.bg_scan_period = -1;
11076 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] &&
11077 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) {
11078 connect.bg_scan_period =
11079 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]);
11082 if (info->attrs[NL80211_ATTR_MAC])
11083 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
11084 else if (info->attrs[NL80211_ATTR_MAC_HINT])
11085 connect.bssid_hint =
11086 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]);
11087 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
11088 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
11090 if (info->attrs[NL80211_ATTR_IE]) {
11091 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
11092 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
11095 if (info->attrs[NL80211_ATTR_USE_MFP]) {
11096 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
11097 if (connect.mfp == NL80211_MFP_OPTIONAL &&
11098 !wiphy_ext_feature_isset(&rdev->wiphy,
11099 NL80211_EXT_FEATURE_MFP_OPTIONAL))
11100 return -EOPNOTSUPP;
11102 connect.mfp = NL80211_MFP_NO;
11105 if (info->attrs[NL80211_ATTR_PREV_BSSID])
11106 connect.prev_bssid =
11107 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
11109 if (info->attrs[NL80211_ATTR_WIPHY_FREQ])
11110 freq = MHZ_TO_KHZ(nla_get_u32(
11111 info->attrs[NL80211_ATTR_WIPHY_FREQ]));
11112 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
11114 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
11117 connect.channel = nl80211_get_valid_chan(wiphy, freq);
11118 if (!connect.channel)
11120 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) {
11121 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]);
11122 freq = MHZ_TO_KHZ(freq);
11123 connect.channel_hint = nl80211_get_valid_chan(wiphy, freq);
11124 if (!connect.channel_hint)
11128 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) {
11129 connect.edmg.channels =
11130 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]);
11132 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG])
11133 connect.edmg.bw_config =
11134 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]);
11137 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
11138 connkeys = nl80211_parse_connkeys(rdev, info, NULL);
11139 if (IS_ERR(connkeys))
11140 return PTR_ERR(connkeys);
11143 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
11144 connect.flags |= ASSOC_REQ_DISABLE_HT;
11146 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
11147 memcpy(&connect.ht_capa_mask,
11148 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
11149 sizeof(connect.ht_capa_mask));
11151 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
11152 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
11153 kfree_sensitive(connkeys);
11156 memcpy(&connect.ht_capa,
11157 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
11158 sizeof(connect.ht_capa));
11161 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
11162 connect.flags |= ASSOC_REQ_DISABLE_VHT;
11164 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE]))
11165 connect.flags |= ASSOC_REQ_DISABLE_HE;
11167 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
11168 memcpy(&connect.vht_capa_mask,
11169 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
11170 sizeof(connect.vht_capa_mask));
11172 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
11173 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
11174 kfree_sensitive(connkeys);
11177 memcpy(&connect.vht_capa,
11178 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
11179 sizeof(connect.vht_capa));
11182 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
11183 if (!((rdev->wiphy.features &
11184 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
11185 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
11186 !wiphy_ext_feature_isset(&rdev->wiphy,
11187 NL80211_EXT_FEATURE_RRM)) {
11188 kfree_sensitive(connkeys);
11191 connect.flags |= ASSOC_REQ_USE_RRM;
11194 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
11195 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) {
11196 kfree_sensitive(connkeys);
11197 return -EOPNOTSUPP;
11200 if (info->attrs[NL80211_ATTR_BSS_SELECT]) {
11201 /* bss selection makes no sense if bssid is set */
11202 if (connect.bssid) {
11203 kfree_sensitive(connkeys);
11207 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT],
11208 wiphy, &connect.bss_select);
11210 kfree_sensitive(connkeys);
11215 if (wiphy_ext_feature_isset(&rdev->wiphy,
11216 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
11217 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
11218 info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
11219 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
11220 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
11221 connect.fils_erp_username =
11222 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
11223 connect.fils_erp_username_len =
11224 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
11225 connect.fils_erp_realm =
11226 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
11227 connect.fils_erp_realm_len =
11228 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
11229 connect.fils_erp_next_seq_num =
11231 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
11232 connect.fils_erp_rrk =
11233 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
11234 connect.fils_erp_rrk_len =
11235 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
11236 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
11237 info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
11238 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
11239 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
11240 kfree_sensitive(connkeys);
11244 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) {
11245 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
11246 kfree_sensitive(connkeys);
11247 GENL_SET_ERR_MSG(info,
11248 "external auth requires connection ownership");
11251 connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT;
11254 wdev_lock(dev->ieee80211_ptr);
11256 err = cfg80211_connect(rdev, dev, &connect, connkeys,
11257 connect.prev_bssid);
11259 kfree_sensitive(connkeys);
11261 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
11262 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
11264 memcpy(dev->ieee80211_ptr->disconnect_bssid,
11265 connect.bssid, ETH_ALEN);
11267 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid);
11270 wdev_unlock(dev->ieee80211_ptr);
11275 static int nl80211_update_connect_params(struct sk_buff *skb,
11276 struct genl_info *info)
11278 struct cfg80211_connect_params connect = {};
11279 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11280 struct net_device *dev = info->user_ptr[1];
11281 struct wireless_dev *wdev = dev->ieee80211_ptr;
11282 bool fils_sk_offload;
11287 if (!rdev->ops->update_connect_params)
11288 return -EOPNOTSUPP;
11290 if (info->attrs[NL80211_ATTR_IE]) {
11291 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
11292 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
11293 changed |= UPDATE_ASSOC_IES;
11296 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy,
11297 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD);
11300 * when driver supports fils-sk offload all attributes must be
11301 * provided. So the else covers "fils-sk-not-all" and
11302 * "no-fils-sk-any".
11304 if (fils_sk_offload &&
11305 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
11306 info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
11307 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
11308 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
11309 connect.fils_erp_username =
11310 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
11311 connect.fils_erp_username_len =
11312 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
11313 connect.fils_erp_realm =
11314 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
11315 connect.fils_erp_realm_len =
11316 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
11317 connect.fils_erp_next_seq_num =
11319 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
11320 connect.fils_erp_rrk =
11321 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
11322 connect.fils_erp_rrk_len =
11323 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
11324 changed |= UPDATE_FILS_ERP_INFO;
11325 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
11326 info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
11327 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
11328 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
11332 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
11333 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
11334 if (!nl80211_valid_auth_type(rdev, auth_type,
11335 NL80211_CMD_CONNECT))
11338 if (auth_type == NL80211_AUTHTYPE_FILS_SK &&
11339 fils_sk_offload && !(changed & UPDATE_FILS_ERP_INFO))
11342 connect.auth_type = auth_type;
11343 changed |= UPDATE_AUTH_TYPE;
11346 wdev_lock(dev->ieee80211_ptr);
11347 if (!wdev->current_bss)
11350 ret = rdev_update_connect_params(rdev, dev, &connect, changed);
11351 wdev_unlock(dev->ieee80211_ptr);
11356 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
11358 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11359 struct net_device *dev = info->user_ptr[1];
11363 if (dev->ieee80211_ptr->conn_owner_nlportid &&
11364 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
11367 if (!info->attrs[NL80211_ATTR_REASON_CODE])
11368 reason = WLAN_REASON_DEAUTH_LEAVING;
11370 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
11375 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
11376 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
11377 return -EOPNOTSUPP;
11379 wdev_lock(dev->ieee80211_ptr);
11380 ret = cfg80211_disconnect(rdev, dev, reason, true);
11381 wdev_unlock(dev->ieee80211_ptr);
11385 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
11387 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11391 if (info->attrs[NL80211_ATTR_PID]) {
11392 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
11394 net = get_net_ns_by_pid(pid);
11395 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) {
11396 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]);
11398 net = get_net_ns_by_fd(fd);
11404 return PTR_ERR(net);
11408 /* check if anything to do */
11409 if (!net_eq(wiphy_net(&rdev->wiphy), net))
11410 err = cfg80211_switch_netns(rdev, net);
11416 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
11418 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11419 int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev,
11420 struct cfg80211_pmksa *pmksa) = NULL;
11421 struct net_device *dev = info->user_ptr[1];
11422 struct cfg80211_pmksa pmksa;
11424 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
11426 if (!info->attrs[NL80211_ATTR_PMKID])
11429 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
11431 if (info->attrs[NL80211_ATTR_MAC]) {
11432 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
11433 } else if (info->attrs[NL80211_ATTR_SSID] &&
11434 info->attrs[NL80211_ATTR_FILS_CACHE_ID] &&
11435 (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA ||
11436 info->attrs[NL80211_ATTR_PMK])) {
11437 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
11438 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
11440 nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]);
11444 if (info->attrs[NL80211_ATTR_PMK]) {
11445 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
11446 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
11449 if (info->attrs[NL80211_ATTR_PMK_LIFETIME])
11450 pmksa.pmk_lifetime =
11451 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]);
11453 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD])
11454 pmksa.pmk_reauth_threshold =
11456 info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]);
11458 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
11459 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT &&
11460 !(dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP &&
11461 wiphy_ext_feature_isset(&rdev->wiphy,
11462 NL80211_EXT_FEATURE_AP_PMKSA_CACHING)))
11463 return -EOPNOTSUPP;
11465 switch (info->genlhdr->cmd) {
11466 case NL80211_CMD_SET_PMKSA:
11467 rdev_ops = rdev->ops->set_pmksa;
11469 case NL80211_CMD_DEL_PMKSA:
11470 rdev_ops = rdev->ops->del_pmksa;
11478 return -EOPNOTSUPP;
11480 return rdev_ops(&rdev->wiphy, dev, &pmksa);
11483 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
11485 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11486 struct net_device *dev = info->user_ptr[1];
11488 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
11489 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
11490 return -EOPNOTSUPP;
11492 if (!rdev->ops->flush_pmksa)
11493 return -EOPNOTSUPP;
11495 return rdev_flush_pmksa(rdev, dev);
11498 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
11500 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11501 struct net_device *dev = info->user_ptr[1];
11502 u8 action_code, dialog_token;
11503 u32 peer_capability = 0;
11508 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
11509 !rdev->ops->tdls_mgmt)
11510 return -EOPNOTSUPP;
11512 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] ||
11513 !info->attrs[NL80211_ATTR_STATUS_CODE] ||
11514 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] ||
11515 !info->attrs[NL80211_ATTR_IE] ||
11516 !info->attrs[NL80211_ATTR_MAC])
11519 peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
11520 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
11521 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
11522 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
11523 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]);
11524 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
11526 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
11528 return rdev_tdls_mgmt(rdev, dev, peer, action_code,
11529 dialog_token, status_code, peer_capability,
11531 nla_data(info->attrs[NL80211_ATTR_IE]),
11532 nla_len(info->attrs[NL80211_ATTR_IE]));
11535 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info)
11537 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11538 struct net_device *dev = info->user_ptr[1];
11539 enum nl80211_tdls_operation operation;
11542 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
11543 !rdev->ops->tdls_oper)
11544 return -EOPNOTSUPP;
11546 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] ||
11547 !info->attrs[NL80211_ATTR_MAC])
11550 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]);
11551 peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
11553 return rdev_tdls_oper(rdev, dev, peer, operation);
11556 static int nl80211_remain_on_channel(struct sk_buff *skb,
11557 struct genl_info *info)
11559 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11560 struct wireless_dev *wdev = info->user_ptr[1];
11561 struct cfg80211_chan_def chandef;
11562 const struct cfg80211_chan_def *compat_chandef;
11563 struct sk_buff *msg;
11569 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
11570 !info->attrs[NL80211_ATTR_DURATION])
11573 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
11575 if (!rdev->ops->remain_on_channel ||
11576 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL))
11577 return -EOPNOTSUPP;
11580 * We should be on that channel for at least a minimum amount of
11581 * time (10ms) but no longer than the driver supports.
11583 if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
11584 duration > rdev->wiphy.max_remain_on_channel_duration)
11587 err = nl80211_parse_chandef(rdev, info, &chandef);
11592 if (!cfg80211_off_channel_oper_allowed(wdev) &&
11593 !cfg80211_chandef_identical(&wdev->chandef, &chandef)) {
11594 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef,
11596 if (compat_chandef != &chandef) {
11603 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11607 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11608 NL80211_CMD_REMAIN_ON_CHANNEL);
11614 err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
11615 duration, &cookie);
11620 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
11622 goto nla_put_failure;
11624 genlmsg_end(msg, hdr);
11626 return genlmsg_reply(msg, info);
11635 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
11636 struct genl_info *info)
11638 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11639 struct wireless_dev *wdev = info->user_ptr[1];
11642 if (!info->attrs[NL80211_ATTR_COOKIE])
11645 if (!rdev->ops->cancel_remain_on_channel)
11646 return -EOPNOTSUPP;
11648 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
11650 return rdev_cancel_remain_on_channel(rdev, wdev, cookie);
11653 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
11654 struct genl_info *info)
11656 struct cfg80211_bitrate_mask mask;
11657 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11658 struct net_device *dev = info->user_ptr[1];
11661 if (!rdev->ops->set_bitrate_mask)
11662 return -EOPNOTSUPP;
11664 err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
11665 NL80211_ATTR_TX_RATES, &mask,
11670 return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
11673 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
11675 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11676 struct wireless_dev *wdev = info->user_ptr[1];
11677 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
11679 if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
11682 if (info->attrs[NL80211_ATTR_FRAME_TYPE])
11683 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
11685 switch (wdev->iftype) {
11686 case NL80211_IFTYPE_STATION:
11687 case NL80211_IFTYPE_ADHOC:
11688 case NL80211_IFTYPE_P2P_CLIENT:
11689 case NL80211_IFTYPE_AP:
11690 case NL80211_IFTYPE_AP_VLAN:
11691 case NL80211_IFTYPE_MESH_POINT:
11692 case NL80211_IFTYPE_P2P_GO:
11693 case NL80211_IFTYPE_P2P_DEVICE:
11695 case NL80211_IFTYPE_NAN:
11697 return -EOPNOTSUPP;
11700 /* not much point in registering if we can't reply */
11701 if (!rdev->ops->mgmt_tx)
11702 return -EOPNOTSUPP;
11704 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] &&
11705 !wiphy_ext_feature_isset(&rdev->wiphy,
11706 NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS)) {
11707 GENL_SET_ERR_MSG(info,
11708 "multicast RX registrations are not supported");
11709 return -EOPNOTSUPP;
11712 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type,
11713 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
11714 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]),
11715 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST],
11719 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
11721 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11722 struct wireless_dev *wdev = info->user_ptr[1];
11723 struct cfg80211_chan_def chandef;
11727 struct sk_buff *msg = NULL;
11728 struct cfg80211_mgmt_tx_params params = {
11729 .dont_wait_for_ack =
11730 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK],
11733 if (!info->attrs[NL80211_ATTR_FRAME])
11736 if (!rdev->ops->mgmt_tx)
11737 return -EOPNOTSUPP;
11739 switch (wdev->iftype) {
11740 case NL80211_IFTYPE_P2P_DEVICE:
11741 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
11744 case NL80211_IFTYPE_STATION:
11745 case NL80211_IFTYPE_ADHOC:
11746 case NL80211_IFTYPE_P2P_CLIENT:
11747 case NL80211_IFTYPE_AP:
11748 case NL80211_IFTYPE_AP_VLAN:
11749 case NL80211_IFTYPE_MESH_POINT:
11750 case NL80211_IFTYPE_P2P_GO:
11752 case NL80211_IFTYPE_NAN:
11754 return -EOPNOTSUPP;
11757 if (info->attrs[NL80211_ATTR_DURATION]) {
11758 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
11760 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
11763 * We should wait on the channel for at least a minimum amount
11764 * of time (10ms) but no longer than the driver supports.
11766 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
11767 params.wait > rdev->wiphy.max_remain_on_channel_duration)
11771 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
11773 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
11776 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
11778 /* get the channel if any has been specified, otherwise pass NULL to
11779 * the driver. The latter will use the current one
11781 chandef.chan = NULL;
11782 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
11783 err = nl80211_parse_chandef(rdev, info, &chandef);
11788 if (!chandef.chan && params.offchan)
11792 if (params.offchan && !cfg80211_off_channel_oper_allowed(wdev)) {
11798 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
11799 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
11801 if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) {
11802 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
11805 if (len % sizeof(u16))
11808 params.n_csa_offsets = len / sizeof(u16);
11809 params.csa_offsets =
11810 nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
11812 /* check that all the offsets fit the frame */
11813 for (i = 0; i < params.n_csa_offsets; i++) {
11814 if (params.csa_offsets[i] >= params.len)
11819 if (!params.dont_wait_for_ack) {
11820 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11824 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11825 NL80211_CMD_FRAME);
11832 params.chan = chandef.chan;
11833 err = cfg80211_mlme_mgmt_tx(rdev, wdev, ¶ms, &cookie);
11838 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
11840 goto nla_put_failure;
11842 genlmsg_end(msg, hdr);
11843 return genlmsg_reply(msg, info);
11855 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
11857 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11858 struct wireless_dev *wdev = info->user_ptr[1];
11861 if (!info->attrs[NL80211_ATTR_COOKIE])
11864 if (!rdev->ops->mgmt_tx_cancel_wait)
11865 return -EOPNOTSUPP;
11867 switch (wdev->iftype) {
11868 case NL80211_IFTYPE_STATION:
11869 case NL80211_IFTYPE_ADHOC:
11870 case NL80211_IFTYPE_P2P_CLIENT:
11871 case NL80211_IFTYPE_AP:
11872 case NL80211_IFTYPE_AP_VLAN:
11873 case NL80211_IFTYPE_P2P_GO:
11874 case NL80211_IFTYPE_P2P_DEVICE:
11876 case NL80211_IFTYPE_NAN:
11878 return -EOPNOTSUPP;
11881 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
11883 return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie);
11886 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
11888 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11889 struct wireless_dev *wdev;
11890 struct net_device *dev = info->user_ptr[1];
11895 if (!info->attrs[NL80211_ATTR_PS_STATE])
11898 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
11900 wdev = dev->ieee80211_ptr;
11902 if (!rdev->ops->set_power_mgmt)
11903 return -EOPNOTSUPP;
11905 state = (ps_state == NL80211_PS_ENABLED) ? true : false;
11907 if (state == wdev->ps)
11910 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout);
11916 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
11918 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11919 enum nl80211_ps_state ps_state;
11920 struct wireless_dev *wdev;
11921 struct net_device *dev = info->user_ptr[1];
11922 struct sk_buff *msg;
11926 wdev = dev->ieee80211_ptr;
11928 if (!rdev->ops->set_power_mgmt)
11929 return -EOPNOTSUPP;
11931 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11935 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11936 NL80211_CMD_GET_POWER_SAVE);
11943 ps_state = NL80211_PS_ENABLED;
11945 ps_state = NL80211_PS_DISABLED;
11947 if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state))
11948 goto nla_put_failure;
11950 genlmsg_end(msg, hdr);
11951 return genlmsg_reply(msg, info);
11960 static const struct nla_policy
11961 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
11962 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY },
11963 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 },
11964 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
11965 [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
11966 [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
11967 [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
11968 [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 },
11971 static int nl80211_set_cqm_txe(struct genl_info *info,
11972 u32 rate, u32 pkts, u32 intvl)
11974 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11975 struct net_device *dev = info->user_ptr[1];
11976 struct wireless_dev *wdev = dev->ieee80211_ptr;
11978 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL)
11981 if (!rdev->ops->set_cqm_txe_config)
11982 return -EOPNOTSUPP;
11984 if (wdev->iftype != NL80211_IFTYPE_STATION &&
11985 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
11986 return -EOPNOTSUPP;
11988 return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl);
11991 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
11992 struct net_device *dev)
11994 struct wireless_dev *wdev = dev->ieee80211_ptr;
11995 s32 last, low, high;
11997 int i, n, low_index;
12000 /* RSSI reporting disabled? */
12001 if (!wdev->cqm_config)
12002 return rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0);
12005 * Obtain current RSSI value if possible, if not and no RSSI threshold
12006 * event has been received yet, we should receive an event after a
12007 * connection is established and enough beacons received to calculate
12010 if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss &&
12011 rdev->ops->get_station) {
12012 struct station_info sinfo = {};
12015 mac_addr = wdev->current_bss->pub.bssid;
12017 err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
12021 cfg80211_sinfo_release_content(&sinfo);
12022 if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG))
12023 wdev->cqm_config->last_rssi_event_value =
12024 (s8) sinfo.rx_beacon_signal_avg;
12027 last = wdev->cqm_config->last_rssi_event_value;
12028 hyst = wdev->cqm_config->rssi_hyst;
12029 n = wdev->cqm_config->n_rssi_thresholds;
12031 for (i = 0; i < n; i++) {
12032 i = array_index_nospec(i, n);
12033 if (last < wdev->cqm_config->rssi_thresholds[i])
12038 if (low_index >= 0) {
12039 low_index = array_index_nospec(low_index, n);
12040 low = wdev->cqm_config->rssi_thresholds[low_index] - hyst;
12045 i = array_index_nospec(i, n);
12046 high = wdev->cqm_config->rssi_thresholds[i] + hyst - 1;
12051 return rdev_set_cqm_rssi_range_config(rdev, dev, low, high);
12054 static int nl80211_set_cqm_rssi(struct genl_info *info,
12055 const s32 *thresholds, int n_thresholds,
12058 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12059 struct net_device *dev = info->user_ptr[1];
12060 struct wireless_dev *wdev = dev->ieee80211_ptr;
12062 s32 prev = S32_MIN;
12064 /* Check all values negative and sorted */
12065 for (i = 0; i < n_thresholds; i++) {
12066 if (thresholds[i] > 0 || thresholds[i] <= prev)
12069 prev = thresholds[i];
12072 if (wdev->iftype != NL80211_IFTYPE_STATION &&
12073 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
12074 return -EOPNOTSUPP;
12077 cfg80211_cqm_config_free(wdev);
12080 if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) {
12081 if (n_thresholds == 0 || thresholds[0] == 0) /* Disabling */
12082 return rdev_set_cqm_rssi_config(rdev, dev, 0, 0);
12084 return rdev_set_cqm_rssi_config(rdev, dev,
12085 thresholds[0], hysteresis);
12088 if (!wiphy_ext_feature_isset(&rdev->wiphy,
12089 NL80211_EXT_FEATURE_CQM_RSSI_LIST))
12090 return -EOPNOTSUPP;
12092 if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */
12096 if (n_thresholds) {
12097 struct cfg80211_cqm_config *cqm_config;
12099 cqm_config = kzalloc(struct_size(cqm_config, rssi_thresholds,
12107 cqm_config->rssi_hyst = hysteresis;
12108 cqm_config->n_rssi_thresholds = n_thresholds;
12109 memcpy(cqm_config->rssi_thresholds, thresholds,
12110 flex_array_size(cqm_config, rssi_thresholds,
12113 wdev->cqm_config = cqm_config;
12116 err = cfg80211_cqm_rssi_update(rdev, dev);
12124 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
12126 struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1];
12127 struct nlattr *cqm;
12130 cqm = info->attrs[NL80211_ATTR_CQM];
12134 err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm,
12135 nl80211_attr_cqm_policy,
12140 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
12141 attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
12142 const s32 *thresholds =
12143 nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
12144 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
12145 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
12150 return nl80211_set_cqm_rssi(info, thresholds, len / 4,
12154 if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
12155 attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
12156 attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
12157 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
12158 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
12159 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
12161 return nl80211_set_cqm_txe(info, rate, pkts, intvl);
12167 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info)
12169 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12170 struct net_device *dev = info->user_ptr[1];
12171 struct ocb_setup setup = {};
12174 err = nl80211_parse_chandef(rdev, info, &setup.chandef);
12178 return cfg80211_join_ocb(rdev, dev, &setup);
12181 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info)
12183 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12184 struct net_device *dev = info->user_ptr[1];
12186 return cfg80211_leave_ocb(rdev, dev);
12189 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
12191 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12192 struct net_device *dev = info->user_ptr[1];
12193 struct mesh_config cfg;
12194 struct mesh_setup setup;
12197 /* start with default */
12198 memcpy(&cfg, &default_mesh_config, sizeof(cfg));
12199 memcpy(&setup, &default_mesh_setup, sizeof(setup));
12201 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
12202 /* and parse parameters if given */
12203 err = nl80211_parse_mesh_config(info, &cfg, NULL);
12208 if (!info->attrs[NL80211_ATTR_MESH_ID] ||
12209 !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
12212 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
12213 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
12215 if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
12216 !nl80211_parse_mcast_rate(rdev, setup.mcast_rate,
12217 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
12220 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
12221 setup.beacon_interval =
12222 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
12224 err = cfg80211_validate_beacon_int(rdev,
12225 NL80211_IFTYPE_MESH_POINT,
12226 setup.beacon_interval);
12231 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
12232 setup.dtim_period =
12233 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
12234 if (setup.dtim_period < 1 || setup.dtim_period > 100)
12238 if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
12239 /* parse additional setup parameters if given */
12240 err = nl80211_parse_mesh_setup(info, &setup);
12245 if (setup.user_mpm)
12246 cfg.auto_open_plinks = false;
12248 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
12249 err = nl80211_parse_chandef(rdev, info, &setup.chandef);
12253 /* __cfg80211_join_mesh() will sort it out */
12254 setup.chandef.chan = NULL;
12257 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
12258 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
12260 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
12261 struct ieee80211_supported_band *sband;
12263 if (!setup.chandef.chan)
12266 sband = rdev->wiphy.bands[setup.chandef.chan->band];
12268 err = ieee80211_get_ratemask(sband, rates, n_rates,
12269 &setup.basic_rates);
12274 if (info->attrs[NL80211_ATTR_TX_RATES]) {
12275 err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
12276 NL80211_ATTR_TX_RATES,
12277 &setup.beacon_rate,
12282 if (!setup.chandef.chan)
12285 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band,
12286 &setup.beacon_rate);
12291 setup.userspace_handles_dfs =
12292 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
12294 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
12295 int r = validate_pae_over_nl80211(rdev, info);
12300 setup.control_port_over_nl80211 = true;
12303 wdev_lock(dev->ieee80211_ptr);
12304 err = __cfg80211_join_mesh(rdev, dev, &setup, &cfg);
12305 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER])
12306 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
12307 wdev_unlock(dev->ieee80211_ptr);
12312 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
12314 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12315 struct net_device *dev = info->user_ptr[1];
12317 return cfg80211_leave_mesh(rdev, dev);
12321 static int nl80211_send_wowlan_patterns(struct sk_buff *msg,
12322 struct cfg80211_registered_device *rdev)
12324 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config;
12325 struct nlattr *nl_pats, *nl_pat;
12328 if (!wowlan->n_patterns)
12331 nl_pats = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN);
12335 for (i = 0; i < wowlan->n_patterns; i++) {
12336 nl_pat = nla_nest_start_noflag(msg, i + 1);
12339 pat_len = wowlan->patterns[i].pattern_len;
12340 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8),
12341 wowlan->patterns[i].mask) ||
12342 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
12343 wowlan->patterns[i].pattern) ||
12344 nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
12345 wowlan->patterns[i].pkt_offset))
12347 nla_nest_end(msg, nl_pat);
12349 nla_nest_end(msg, nl_pats);
12354 static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
12355 struct cfg80211_wowlan_tcp *tcp)
12357 struct nlattr *nl_tcp;
12362 nl_tcp = nla_nest_start_noflag(msg,
12363 NL80211_WOWLAN_TRIG_TCP_CONNECTION);
12367 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) ||
12368 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) ||
12369 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) ||
12370 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) ||
12371 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) ||
12372 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
12373 tcp->payload_len, tcp->payload) ||
12374 nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
12375 tcp->data_interval) ||
12376 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
12377 tcp->wake_len, tcp->wake_data) ||
12378 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK,
12379 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask))
12382 if (tcp->payload_seq.len &&
12383 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
12384 sizeof(tcp->payload_seq), &tcp->payload_seq))
12387 if (tcp->payload_tok.len &&
12388 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
12389 sizeof(tcp->payload_tok) + tcp->tokens_size,
12390 &tcp->payload_tok))
12393 nla_nest_end(msg, nl_tcp);
12398 static int nl80211_send_wowlan_nd(struct sk_buff *msg,
12399 struct cfg80211_sched_scan_request *req)
12401 struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan;
12407 nd = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_NET_DETECT);
12411 if (req->n_scan_plans == 1 &&
12412 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL,
12413 req->scan_plans[0].interval * 1000))
12416 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay))
12419 if (req->relative_rssi_set) {
12420 struct nl80211_bss_select_rssi_adjust rssi_adjust;
12422 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI,
12423 req->relative_rssi))
12426 rssi_adjust.band = req->rssi_adjust.band;
12427 rssi_adjust.delta = req->rssi_adjust.delta;
12428 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST,
12429 sizeof(rssi_adjust), &rssi_adjust))
12433 freqs = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES);
12437 for (i = 0; i < req->n_channels; i++) {
12438 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
12442 nla_nest_end(msg, freqs);
12444 if (req->n_match_sets) {
12445 matches = nla_nest_start_noflag(msg,
12446 NL80211_ATTR_SCHED_SCAN_MATCH);
12450 for (i = 0; i < req->n_match_sets; i++) {
12451 match = nla_nest_start_noflag(msg, i);
12455 if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
12456 req->match_sets[i].ssid.ssid_len,
12457 req->match_sets[i].ssid.ssid))
12459 nla_nest_end(msg, match);
12461 nla_nest_end(msg, matches);
12464 scan_plans = nla_nest_start_noflag(msg, NL80211_ATTR_SCHED_SCAN_PLANS);
12468 for (i = 0; i < req->n_scan_plans; i++) {
12469 scan_plan = nla_nest_start_noflag(msg, i + 1);
12473 if (nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL,
12474 req->scan_plans[i].interval) ||
12475 (req->scan_plans[i].iterations &&
12476 nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS,
12477 req->scan_plans[i].iterations)))
12479 nla_nest_end(msg, scan_plan);
12481 nla_nest_end(msg, scan_plans);
12483 nla_nest_end(msg, nd);
12488 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
12490 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12491 struct sk_buff *msg;
12493 u32 size = NLMSG_DEFAULT_SIZE;
12495 if (!rdev->wiphy.wowlan)
12496 return -EOPNOTSUPP;
12498 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) {
12499 /* adjust size to have room for all the data */
12500 size += rdev->wiphy.wowlan_config->tcp->tokens_size +
12501 rdev->wiphy.wowlan_config->tcp->payload_len +
12502 rdev->wiphy.wowlan_config->tcp->wake_len +
12503 rdev->wiphy.wowlan_config->tcp->wake_len / 8;
12506 msg = nlmsg_new(size, GFP_KERNEL);
12510 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
12511 NL80211_CMD_GET_WOWLAN);
12513 goto nla_put_failure;
12515 if (rdev->wiphy.wowlan_config) {
12516 struct nlattr *nl_wowlan;
12518 nl_wowlan = nla_nest_start_noflag(msg,
12519 NL80211_ATTR_WOWLAN_TRIGGERS);
12521 goto nla_put_failure;
12523 if ((rdev->wiphy.wowlan_config->any &&
12524 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
12525 (rdev->wiphy.wowlan_config->disconnect &&
12526 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
12527 (rdev->wiphy.wowlan_config->magic_pkt &&
12528 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
12529 (rdev->wiphy.wowlan_config->gtk_rekey_failure &&
12530 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
12531 (rdev->wiphy.wowlan_config->eap_identity_req &&
12532 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
12533 (rdev->wiphy.wowlan_config->four_way_handshake &&
12534 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
12535 (rdev->wiphy.wowlan_config->rfkill_release &&
12536 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
12537 goto nla_put_failure;
12539 if (nl80211_send_wowlan_patterns(msg, rdev))
12540 goto nla_put_failure;
12542 if (nl80211_send_wowlan_tcp(msg,
12543 rdev->wiphy.wowlan_config->tcp))
12544 goto nla_put_failure;
12546 if (nl80211_send_wowlan_nd(
12548 rdev->wiphy.wowlan_config->nd_config))
12549 goto nla_put_failure;
12551 nla_nest_end(msg, nl_wowlan);
12554 genlmsg_end(msg, hdr);
12555 return genlmsg_reply(msg, info);
12562 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev,
12563 struct nlattr *attr,
12564 struct cfg80211_wowlan *trig)
12566 struct nlattr *tb[NUM_NL80211_WOWLAN_TCP];
12567 struct cfg80211_wowlan_tcp *cfg;
12568 struct nl80211_wowlan_tcp_data_token *tok = NULL;
12569 struct nl80211_wowlan_tcp_data_seq *seq = NULL;
12571 u32 data_size, wake_size, tokens_size = 0, wake_mask_size;
12574 if (!rdev->wiphy.wowlan->tcp)
12577 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr,
12578 nl80211_wowlan_tcp_policy, NULL);
12582 if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] ||
12583 !tb[NL80211_WOWLAN_TCP_DST_IPV4] ||
12584 !tb[NL80211_WOWLAN_TCP_DST_MAC] ||
12585 !tb[NL80211_WOWLAN_TCP_DST_PORT] ||
12586 !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] ||
12587 !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] ||
12588 !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] ||
12589 !tb[NL80211_WOWLAN_TCP_WAKE_MASK])
12592 data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]);
12593 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max)
12596 if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) >
12597 rdev->wiphy.wowlan->tcp->data_interval_max ||
12598 nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0)
12601 wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]);
12602 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max)
12605 wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]);
12606 if (wake_mask_size != DIV_ROUND_UP(wake_size, 8))
12609 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) {
12610 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
12612 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
12613 tokens_size = tokln - sizeof(*tok);
12615 if (!tok->len || tokens_size % tok->len)
12617 if (!rdev->wiphy.wowlan->tcp->tok)
12619 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len)
12621 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len)
12623 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize)
12625 if (tok->offset + tok->len > data_size)
12629 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) {
12630 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]);
12631 if (!rdev->wiphy.wowlan->tcp->seq)
12633 if (seq->len == 0 || seq->len > 4)
12635 if (seq->len + seq->offset > data_size)
12639 size = sizeof(*cfg);
12641 size += wake_size + wake_mask_size;
12642 size += tokens_size;
12644 cfg = kzalloc(size, GFP_KERNEL);
12647 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]);
12648 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]);
12649 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]),
12651 if (tb[NL80211_WOWLAN_TCP_SRC_PORT])
12652 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]);
12656 /* allocate a socket and port for it and use it */
12657 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM,
12658 IPPROTO_TCP, &cfg->sock, 1);
12663 if (inet_csk_get_port(cfg->sock->sk, port)) {
12664 sock_release(cfg->sock);
12666 return -EADDRINUSE;
12668 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num;
12674 cfg->src_port = port;
12677 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]);
12678 cfg->payload_len = data_size;
12679 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size;
12680 memcpy((void *)cfg->payload,
12681 nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]),
12684 cfg->payload_seq = *seq;
12685 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]);
12686 cfg->wake_len = wake_size;
12687 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size;
12688 memcpy((void *)cfg->wake_data,
12689 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]),
12691 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size +
12692 data_size + wake_size;
12693 memcpy((void *)cfg->wake_mask,
12694 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]),
12697 cfg->tokens_size = tokens_size;
12698 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size);
12706 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev,
12707 const struct wiphy_wowlan_support *wowlan,
12708 struct nlattr *attr,
12709 struct cfg80211_wowlan *trig)
12711 struct nlattr **tb;
12714 tb = kcalloc(NUM_NL80211_ATTR, sizeof(*tb), GFP_KERNEL);
12718 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) {
12723 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr,
12724 nl80211_policy, NULL);
12728 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb,
12729 wowlan->max_nd_match_sets);
12730 err = PTR_ERR_OR_ZERO(trig->nd_config);
12732 trig->nd_config = NULL;
12739 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
12741 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12742 struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG];
12743 struct cfg80211_wowlan new_triggers = {};
12744 struct cfg80211_wowlan *ntrig;
12745 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan;
12747 bool prev_enabled = rdev->wiphy.wowlan_config;
12748 bool regular = false;
12751 return -EOPNOTSUPP;
12753 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) {
12754 cfg80211_rdev_free_wowlan(rdev);
12755 rdev->wiphy.wowlan_config = NULL;
12759 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG,
12760 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS],
12761 nl80211_wowlan_policy, info->extack);
12765 if (tb[NL80211_WOWLAN_TRIG_ANY]) {
12766 if (!(wowlan->flags & WIPHY_WOWLAN_ANY))
12768 new_triggers.any = true;
12771 if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) {
12772 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT))
12774 new_triggers.disconnect = true;
12778 if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) {
12779 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT))
12781 new_triggers.magic_pkt = true;
12785 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED])
12788 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) {
12789 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE))
12791 new_triggers.gtk_rekey_failure = true;
12795 if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) {
12796 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ))
12798 new_triggers.eap_identity_req = true;
12802 if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) {
12803 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE))
12805 new_triggers.four_way_handshake = true;
12809 if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) {
12810 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE))
12812 new_triggers.rfkill_release = true;
12816 if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) {
12817 struct nlattr *pat;
12818 int n_patterns = 0;
12819 int rem, pat_len, mask_len, pkt_offset;
12820 struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
12824 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
12827 if (n_patterns > wowlan->n_patterns)
12830 new_triggers.patterns = kcalloc(n_patterns,
12831 sizeof(new_triggers.patterns[0]),
12833 if (!new_triggers.patterns)
12836 new_triggers.n_patterns = n_patterns;
12839 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
12843 err = nla_parse_nested_deprecated(pat_tb,
12844 MAX_NL80211_PKTPAT,
12846 nl80211_packet_pattern_policy,
12852 if (!pat_tb[NL80211_PKTPAT_MASK] ||
12853 !pat_tb[NL80211_PKTPAT_PATTERN])
12855 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
12856 mask_len = DIV_ROUND_UP(pat_len, 8);
12857 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
12859 if (pat_len > wowlan->pattern_max_len ||
12860 pat_len < wowlan->pattern_min_len)
12863 if (!pat_tb[NL80211_PKTPAT_OFFSET])
12866 pkt_offset = nla_get_u32(
12867 pat_tb[NL80211_PKTPAT_OFFSET]);
12868 if (pkt_offset > wowlan->max_pkt_offset)
12870 new_triggers.patterns[i].pkt_offset = pkt_offset;
12872 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
12877 new_triggers.patterns[i].mask = mask_pat;
12878 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
12880 mask_pat += mask_len;
12881 new_triggers.patterns[i].pattern = mask_pat;
12882 new_triggers.patterns[i].pattern_len = pat_len;
12884 nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
12890 if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) {
12892 err = nl80211_parse_wowlan_tcp(
12893 rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION],
12899 if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) {
12901 err = nl80211_parse_wowlan_nd(
12902 rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT],
12908 /* The 'any' trigger means the device continues operating more or less
12909 * as in its normal operation mode and wakes up the host on most of the
12910 * normal interrupts (like packet RX, ...)
12911 * It therefore makes little sense to combine with the more constrained
12912 * wakeup trigger modes.
12914 if (new_triggers.any && regular) {
12919 ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL);
12924 cfg80211_rdev_free_wowlan(rdev);
12925 rdev->wiphy.wowlan_config = ntrig;
12928 if (rdev->ops->set_wakeup &&
12929 prev_enabled != !!rdev->wiphy.wowlan_config)
12930 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config);
12934 for (i = 0; i < new_triggers.n_patterns; i++)
12935 kfree(new_triggers.patterns[i].mask);
12936 kfree(new_triggers.patterns);
12937 if (new_triggers.tcp && new_triggers.tcp->sock)
12938 sock_release(new_triggers.tcp->sock);
12939 kfree(new_triggers.tcp);
12940 kfree(new_triggers.nd_config);
12945 static int nl80211_send_coalesce_rules(struct sk_buff *msg,
12946 struct cfg80211_registered_device *rdev)
12948 struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules;
12950 struct cfg80211_coalesce_rules *rule;
12952 if (!rdev->coalesce->n_rules)
12955 nl_rules = nla_nest_start_noflag(msg, NL80211_ATTR_COALESCE_RULE);
12959 for (i = 0; i < rdev->coalesce->n_rules; i++) {
12960 nl_rule = nla_nest_start_noflag(msg, i + 1);
12964 rule = &rdev->coalesce->rules[i];
12965 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY,
12969 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION,
12973 nl_pats = nla_nest_start_noflag(msg,
12974 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN);
12978 for (j = 0; j < rule->n_patterns; j++) {
12979 nl_pat = nla_nest_start_noflag(msg, j + 1);
12982 pat_len = rule->patterns[j].pattern_len;
12983 if (nla_put(msg, NL80211_PKTPAT_MASK,
12984 DIV_ROUND_UP(pat_len, 8),
12985 rule->patterns[j].mask) ||
12986 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
12987 rule->patterns[j].pattern) ||
12988 nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
12989 rule->patterns[j].pkt_offset))
12991 nla_nest_end(msg, nl_pat);
12993 nla_nest_end(msg, nl_pats);
12994 nla_nest_end(msg, nl_rule);
12996 nla_nest_end(msg, nl_rules);
13001 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info)
13003 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13004 struct sk_buff *msg;
13007 if (!rdev->wiphy.coalesce)
13008 return -EOPNOTSUPP;
13010 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13014 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
13015 NL80211_CMD_GET_COALESCE);
13017 goto nla_put_failure;
13019 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev))
13020 goto nla_put_failure;
13022 genlmsg_end(msg, hdr);
13023 return genlmsg_reply(msg, info);
13030 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev)
13032 struct cfg80211_coalesce *coalesce = rdev->coalesce;
13034 struct cfg80211_coalesce_rules *rule;
13039 for (i = 0; i < coalesce->n_rules; i++) {
13040 rule = &coalesce->rules[i];
13041 for (j = 0; j < rule->n_patterns; j++)
13042 kfree(rule->patterns[j].mask);
13043 kfree(rule->patterns);
13045 kfree(coalesce->rules);
13047 rdev->coalesce = NULL;
13050 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,
13051 struct nlattr *rule,
13052 struct cfg80211_coalesce_rules *new_rule)
13055 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
13056 struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat;
13057 int rem, pat_len, mask_len, pkt_offset, n_patterns = 0;
13058 struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
13060 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX,
13061 rule, nl80211_coalesce_policy, NULL);
13065 if (tb[NL80211_ATTR_COALESCE_RULE_DELAY])
13067 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]);
13068 if (new_rule->delay > coalesce->max_delay)
13071 if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION])
13072 new_rule->condition =
13073 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]);
13075 if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN])
13078 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
13081 if (n_patterns > coalesce->n_patterns)
13084 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]),
13086 if (!new_rule->patterns)
13089 new_rule->n_patterns = n_patterns;
13092 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
13096 err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT,
13098 nl80211_packet_pattern_policy,
13103 if (!pat_tb[NL80211_PKTPAT_MASK] ||
13104 !pat_tb[NL80211_PKTPAT_PATTERN])
13106 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
13107 mask_len = DIV_ROUND_UP(pat_len, 8);
13108 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
13110 if (pat_len > coalesce->pattern_max_len ||
13111 pat_len < coalesce->pattern_min_len)
13114 if (!pat_tb[NL80211_PKTPAT_OFFSET])
13117 pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]);
13118 if (pkt_offset > coalesce->max_pkt_offset)
13120 new_rule->patterns[i].pkt_offset = pkt_offset;
13122 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
13126 new_rule->patterns[i].mask = mask_pat;
13127 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
13130 mask_pat += mask_len;
13131 new_rule->patterns[i].pattern = mask_pat;
13132 new_rule->patterns[i].pattern_len = pat_len;
13133 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
13141 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info)
13143 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13144 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
13145 struct cfg80211_coalesce new_coalesce = {};
13146 struct cfg80211_coalesce *n_coalesce;
13147 int err, rem_rule, n_rules = 0, i, j;
13148 struct nlattr *rule;
13149 struct cfg80211_coalesce_rules *tmp_rule;
13151 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce)
13152 return -EOPNOTSUPP;
13154 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) {
13155 cfg80211_rdev_free_coalesce(rdev);
13156 rdev_set_coalesce(rdev, NULL);
13160 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
13163 if (n_rules > coalesce->n_rules)
13166 new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]),
13168 if (!new_coalesce.rules)
13171 new_coalesce.n_rules = n_rules;
13174 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
13176 err = nl80211_parse_coalesce_rule(rdev, rule,
13177 &new_coalesce.rules[i]);
13184 err = rdev_set_coalesce(rdev, &new_coalesce);
13188 n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL);
13193 cfg80211_rdev_free_coalesce(rdev);
13194 rdev->coalesce = n_coalesce;
13198 for (i = 0; i < new_coalesce.n_rules; i++) {
13199 tmp_rule = &new_coalesce.rules[i];
13200 for (j = 0; j < tmp_rule->n_patterns; j++)
13201 kfree(tmp_rule->patterns[j].mask);
13202 kfree(tmp_rule->patterns);
13204 kfree(new_coalesce.rules);
13209 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
13211 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13212 struct net_device *dev = info->user_ptr[1];
13213 struct wireless_dev *wdev = dev->ieee80211_ptr;
13214 struct nlattr *tb[NUM_NL80211_REKEY_DATA];
13215 struct cfg80211_gtk_rekey_data rekey_data = {};
13218 if (!info->attrs[NL80211_ATTR_REKEY_DATA])
13221 err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA,
13222 info->attrs[NL80211_ATTR_REKEY_DATA],
13223 nl80211_rekey_policy, info->extack);
13227 if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] ||
13228 !tb[NL80211_REKEY_DATA_KCK])
13230 if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN &&
13231 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK &&
13232 nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KEK_EXT_LEN))
13234 if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN &&
13235 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK &&
13236 nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KCK_EXT_LEN))
13239 rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]);
13240 rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]);
13241 rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]);
13242 rekey_data.kek_len = nla_len(tb[NL80211_REKEY_DATA_KEK]);
13243 rekey_data.kck_len = nla_len(tb[NL80211_REKEY_DATA_KCK]);
13244 if (tb[NL80211_REKEY_DATA_AKM])
13245 rekey_data.akm = nla_get_u32(tb[NL80211_REKEY_DATA_AKM]);
13248 if (!wdev->current_bss) {
13253 if (!rdev->ops->set_rekey_data) {
13258 err = rdev_set_rekey_data(rdev, dev, &rekey_data);
13264 static int nl80211_register_unexpected_frame(struct sk_buff *skb,
13265 struct genl_info *info)
13267 struct net_device *dev = info->user_ptr[1];
13268 struct wireless_dev *wdev = dev->ieee80211_ptr;
13270 if (wdev->iftype != NL80211_IFTYPE_AP &&
13271 wdev->iftype != NL80211_IFTYPE_P2P_GO)
13274 if (wdev->ap_unexpected_nlportid)
13277 wdev->ap_unexpected_nlportid = info->snd_portid;
13281 static int nl80211_probe_client(struct sk_buff *skb,
13282 struct genl_info *info)
13284 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13285 struct net_device *dev = info->user_ptr[1];
13286 struct wireless_dev *wdev = dev->ieee80211_ptr;
13287 struct sk_buff *msg;
13293 if (wdev->iftype != NL80211_IFTYPE_AP &&
13294 wdev->iftype != NL80211_IFTYPE_P2P_GO)
13295 return -EOPNOTSUPP;
13297 if (!info->attrs[NL80211_ATTR_MAC])
13300 if (!rdev->ops->probe_client)
13301 return -EOPNOTSUPP;
13303 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13307 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
13308 NL80211_CMD_PROBE_CLIENT);
13314 addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
13316 err = rdev_probe_client(rdev, dev, addr, &cookie);
13320 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
13322 goto nla_put_failure;
13324 genlmsg_end(msg, hdr);
13326 return genlmsg_reply(msg, info);
13335 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info)
13337 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13338 struct cfg80211_beacon_registration *reg, *nreg;
13341 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS))
13342 return -EOPNOTSUPP;
13344 nreg = kzalloc(sizeof(*nreg), GFP_KERNEL);
13348 /* First, check if already registered. */
13349 spin_lock_bh(&rdev->beacon_registrations_lock);
13350 list_for_each_entry(reg, &rdev->beacon_registrations, list) {
13351 if (reg->nlportid == info->snd_portid) {
13356 /* Add it to the list */
13357 nreg->nlportid = info->snd_portid;
13358 list_add(&nreg->list, &rdev->beacon_registrations);
13360 spin_unlock_bh(&rdev->beacon_registrations_lock);
13364 spin_unlock_bh(&rdev->beacon_registrations_lock);
13369 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
13371 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13372 struct wireless_dev *wdev = info->user_ptr[1];
13375 if (!rdev->ops->start_p2p_device)
13376 return -EOPNOTSUPP;
13378 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
13379 return -EOPNOTSUPP;
13381 if (wdev_running(wdev))
13384 if (rfkill_blocked(rdev->wiphy.rfkill))
13387 err = rdev_start_p2p_device(rdev, wdev);
13391 wdev->is_running = true;
13397 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info)
13399 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13400 struct wireless_dev *wdev = info->user_ptr[1];
13402 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
13403 return -EOPNOTSUPP;
13405 if (!rdev->ops->stop_p2p_device)
13406 return -EOPNOTSUPP;
13408 cfg80211_stop_p2p_device(rdev, wdev);
13413 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
13415 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13416 struct wireless_dev *wdev = info->user_ptr[1];
13417 struct cfg80211_nan_conf conf = {};
13420 if (wdev->iftype != NL80211_IFTYPE_NAN)
13421 return -EOPNOTSUPP;
13423 if (wdev_running(wdev))
13426 if (rfkill_blocked(rdev->wiphy.rfkill))
13429 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF])
13433 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
13435 if (info->attrs[NL80211_ATTR_BANDS]) {
13436 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
13438 if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
13439 return -EOPNOTSUPP;
13441 if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
13444 conf.bands = bands;
13447 err = rdev_start_nan(rdev, wdev, &conf);
13451 wdev->is_running = true;
13457 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info)
13459 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13460 struct wireless_dev *wdev = info->user_ptr[1];
13462 if (wdev->iftype != NL80211_IFTYPE_NAN)
13463 return -EOPNOTSUPP;
13465 cfg80211_stop_nan(rdev, wdev);
13470 static int validate_nan_filter(struct nlattr *filter_attr)
13472 struct nlattr *attr;
13473 int len = 0, n_entries = 0, rem;
13475 nla_for_each_nested(attr, filter_attr, rem) {
13476 len += nla_len(attr);
13486 static int handle_nan_filter(struct nlattr *attr_filter,
13487 struct cfg80211_nan_func *func,
13490 struct nlattr *attr;
13491 int n_entries, rem, i;
13492 struct cfg80211_nan_func_filter *filter;
13494 n_entries = validate_nan_filter(attr_filter);
13498 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters));
13500 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL);
13505 nla_for_each_nested(attr, attr_filter, rem) {
13506 filter[i].filter = nla_memdup(attr, GFP_KERNEL);
13507 if (!filter[i].filter)
13510 filter[i].len = nla_len(attr);
13514 func->num_tx_filters = n_entries;
13515 func->tx_filters = filter;
13517 func->num_rx_filters = n_entries;
13518 func->rx_filters = filter;
13525 nla_for_each_nested(attr, attr_filter, rem) {
13526 kfree(filter[i].filter);
13533 static int nl80211_nan_add_func(struct sk_buff *skb,
13534 struct genl_info *info)
13536 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13537 struct wireless_dev *wdev = info->user_ptr[1];
13538 struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr;
13539 struct cfg80211_nan_func *func;
13540 struct sk_buff *msg = NULL;
13544 if (wdev->iftype != NL80211_IFTYPE_NAN)
13545 return -EOPNOTSUPP;
13547 if (!wdev_running(wdev))
13550 if (!info->attrs[NL80211_ATTR_NAN_FUNC])
13553 err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX,
13554 info->attrs[NL80211_ATTR_NAN_FUNC],
13555 nl80211_nan_func_policy,
13560 func = kzalloc(sizeof(*func), GFP_KERNEL);
13564 func->cookie = cfg80211_assign_cookie(rdev);
13566 if (!tb[NL80211_NAN_FUNC_TYPE]) {
13572 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]);
13574 if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) {
13579 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]),
13580 sizeof(func->service_id));
13582 func->close_range =
13583 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]);
13585 if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) {
13586 func->serv_spec_info_len =
13587 nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]);
13588 func->serv_spec_info =
13589 kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]),
13590 func->serv_spec_info_len,
13592 if (!func->serv_spec_info) {
13598 if (tb[NL80211_NAN_FUNC_TTL])
13599 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]);
13601 switch (func->type) {
13602 case NL80211_NAN_FUNC_PUBLISH:
13603 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) {
13608 func->publish_type =
13609 nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]);
13610 func->publish_bcast =
13611 nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]);
13613 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) &&
13614 func->publish_bcast) {
13619 case NL80211_NAN_FUNC_SUBSCRIBE:
13620 func->subscribe_active =
13621 nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]);
13623 case NL80211_NAN_FUNC_FOLLOW_UP:
13624 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] ||
13625 !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] ||
13626 !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) {
13631 func->followup_id =
13632 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]);
13633 func->followup_reqid =
13634 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]);
13635 memcpy(func->followup_dest.addr,
13636 nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]),
13637 sizeof(func->followup_dest.addr));
13648 if (tb[NL80211_NAN_FUNC_SRF]) {
13649 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR];
13651 err = nla_parse_nested_deprecated(srf_tb,
13652 NL80211_NAN_SRF_ATTR_MAX,
13653 tb[NL80211_NAN_FUNC_SRF],
13654 nl80211_nan_srf_policy,
13659 func->srf_include =
13660 nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]);
13662 if (srf_tb[NL80211_NAN_SRF_BF]) {
13663 if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] ||
13664 !srf_tb[NL80211_NAN_SRF_BF_IDX]) {
13670 nla_len(srf_tb[NL80211_NAN_SRF_BF]);
13672 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]),
13673 func->srf_bf_len, GFP_KERNEL);
13674 if (!func->srf_bf) {
13680 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]);
13682 struct nlattr *attr, *mac_attr =
13683 srf_tb[NL80211_NAN_SRF_MAC_ADDRS];
13684 int n_entries, rem, i = 0;
13691 n_entries = validate_acl_mac_addrs(mac_attr);
13692 if (n_entries <= 0) {
13697 func->srf_num_macs = n_entries;
13699 kcalloc(n_entries, sizeof(*func->srf_macs),
13701 if (!func->srf_macs) {
13706 nla_for_each_nested(attr, mac_attr, rem)
13707 memcpy(func->srf_macs[i++].addr, nla_data(attr),
13708 sizeof(*func->srf_macs));
13712 if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) {
13713 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER],
13719 if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) {
13720 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER],
13726 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13732 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
13733 NL80211_CMD_ADD_NAN_FUNCTION);
13734 /* This can't really happen - we just allocated 4KB */
13735 if (WARN_ON(!hdr)) {
13740 err = rdev_add_nan_func(rdev, wdev, func);
13743 cfg80211_free_nan_func(func);
13748 /* propagate the instance id and cookie to userspace */
13749 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie,
13751 goto nla_put_failure;
13753 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC);
13755 goto nla_put_failure;
13757 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID,
13758 func->instance_id))
13759 goto nla_put_failure;
13761 nla_nest_end(msg, func_attr);
13763 genlmsg_end(msg, hdr);
13764 return genlmsg_reply(msg, info);
13771 static int nl80211_nan_del_func(struct sk_buff *skb,
13772 struct genl_info *info)
13774 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13775 struct wireless_dev *wdev = info->user_ptr[1];
13778 if (wdev->iftype != NL80211_IFTYPE_NAN)
13779 return -EOPNOTSUPP;
13781 if (!wdev_running(wdev))
13784 if (!info->attrs[NL80211_ATTR_COOKIE])
13787 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
13789 rdev_del_nan_func(rdev, wdev, cookie);
13794 static int nl80211_nan_change_config(struct sk_buff *skb,
13795 struct genl_info *info)
13797 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13798 struct wireless_dev *wdev = info->user_ptr[1];
13799 struct cfg80211_nan_conf conf = {};
13802 if (wdev->iftype != NL80211_IFTYPE_NAN)
13803 return -EOPNOTSUPP;
13805 if (!wdev_running(wdev))
13808 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) {
13810 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
13811 if (conf.master_pref <= 1 || conf.master_pref == 255)
13814 changed |= CFG80211_NAN_CONF_CHANGED_PREF;
13817 if (info->attrs[NL80211_ATTR_BANDS]) {
13818 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
13820 if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
13821 return -EOPNOTSUPP;
13823 if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
13826 conf.bands = bands;
13827 changed |= CFG80211_NAN_CONF_CHANGED_BANDS;
13833 return rdev_nan_change_conf(rdev, wdev, &conf, changed);
13836 void cfg80211_nan_match(struct wireless_dev *wdev,
13837 struct cfg80211_nan_match_params *match, gfp_t gfp)
13839 struct wiphy *wiphy = wdev->wiphy;
13840 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
13841 struct nlattr *match_attr, *local_func_attr, *peer_func_attr;
13842 struct sk_buff *msg;
13845 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr))
13848 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13852 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH);
13858 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13859 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
13860 wdev->netdev->ifindex)) ||
13861 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
13863 goto nla_put_failure;
13865 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie,
13866 NL80211_ATTR_PAD) ||
13867 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr))
13868 goto nla_put_failure;
13870 match_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_MATCH);
13872 goto nla_put_failure;
13874 local_func_attr = nla_nest_start_noflag(msg,
13875 NL80211_NAN_MATCH_FUNC_LOCAL);
13876 if (!local_func_attr)
13877 goto nla_put_failure;
13879 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id))
13880 goto nla_put_failure;
13882 nla_nest_end(msg, local_func_attr);
13884 peer_func_attr = nla_nest_start_noflag(msg,
13885 NL80211_NAN_MATCH_FUNC_PEER);
13886 if (!peer_func_attr)
13887 goto nla_put_failure;
13889 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) ||
13890 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id))
13891 goto nla_put_failure;
13893 if (match->info && match->info_len &&
13894 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len,
13896 goto nla_put_failure;
13898 nla_nest_end(msg, peer_func_attr);
13899 nla_nest_end(msg, match_attr);
13900 genlmsg_end(msg, hdr);
13902 if (!wdev->owner_nlportid)
13903 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
13904 msg, 0, NL80211_MCGRP_NAN, gfp);
13906 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
13907 wdev->owner_nlportid);
13914 EXPORT_SYMBOL(cfg80211_nan_match);
13916 void cfg80211_nan_func_terminated(struct wireless_dev *wdev,
13918 enum nl80211_nan_func_term_reason reason,
13919 u64 cookie, gfp_t gfp)
13921 struct wiphy *wiphy = wdev->wiphy;
13922 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
13923 struct sk_buff *msg;
13924 struct nlattr *func_attr;
13927 if (WARN_ON(!inst_id))
13930 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13934 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION);
13940 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13941 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
13942 wdev->netdev->ifindex)) ||
13943 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
13945 goto nla_put_failure;
13947 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
13949 goto nla_put_failure;
13951 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC);
13953 goto nla_put_failure;
13955 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) ||
13956 nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason))
13957 goto nla_put_failure;
13959 nla_nest_end(msg, func_attr);
13960 genlmsg_end(msg, hdr);
13962 if (!wdev->owner_nlportid)
13963 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
13964 msg, 0, NL80211_MCGRP_NAN, gfp);
13966 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
13967 wdev->owner_nlportid);
13974 EXPORT_SYMBOL(cfg80211_nan_func_terminated);
13976 static int nl80211_get_protocol_features(struct sk_buff *skb,
13977 struct genl_info *info)
13980 struct sk_buff *msg;
13982 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13986 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
13987 NL80211_CMD_GET_PROTOCOL_FEATURES);
13989 goto nla_put_failure;
13991 if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES,
13992 NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP))
13993 goto nla_put_failure;
13995 genlmsg_end(msg, hdr);
13996 return genlmsg_reply(msg, info);
14003 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info)
14005 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14006 struct cfg80211_update_ft_ies_params ft_params;
14007 struct net_device *dev = info->user_ptr[1];
14009 if (!rdev->ops->update_ft_ies)
14010 return -EOPNOTSUPP;
14012 if (!info->attrs[NL80211_ATTR_MDID] ||
14013 !info->attrs[NL80211_ATTR_IE])
14016 memset(&ft_params, 0, sizeof(ft_params));
14017 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]);
14018 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
14019 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
14021 return rdev_update_ft_ies(rdev, dev, &ft_params);
14024 static int nl80211_crit_protocol_start(struct sk_buff *skb,
14025 struct genl_info *info)
14027 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14028 struct wireless_dev *wdev = info->user_ptr[1];
14029 enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC;
14033 if (!rdev->ops->crit_proto_start)
14034 return -EOPNOTSUPP;
14036 if (WARN_ON(!rdev->ops->crit_proto_stop))
14039 if (rdev->crit_proto_nlportid)
14042 /* determine protocol if provided */
14043 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID])
14044 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]);
14046 if (proto >= NUM_NL80211_CRIT_PROTO)
14049 /* timeout must be provided */
14050 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION])
14054 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
14056 ret = rdev_crit_proto_start(rdev, wdev, proto, duration);
14058 rdev->crit_proto_nlportid = info->snd_portid;
14063 static int nl80211_crit_protocol_stop(struct sk_buff *skb,
14064 struct genl_info *info)
14066 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14067 struct wireless_dev *wdev = info->user_ptr[1];
14069 if (!rdev->ops->crit_proto_stop)
14070 return -EOPNOTSUPP;
14072 if (rdev->crit_proto_nlportid) {
14073 rdev->crit_proto_nlportid = 0;
14074 rdev_crit_proto_stop(rdev, wdev);
14079 static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd,
14080 struct nlattr *attr,
14081 struct netlink_ext_ack *extack)
14083 if (vcmd->policy == VENDOR_CMD_RAW_DATA) {
14084 if (attr->nla_type & NLA_F_NESTED) {
14085 NL_SET_ERR_MSG_ATTR(extack, attr,
14086 "unexpected nested data");
14093 if (!(attr->nla_type & NLA_F_NESTED)) {
14094 NL_SET_ERR_MSG_ATTR(extack, attr, "expected nested data");
14098 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack);
14101 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
14103 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14104 struct wireless_dev *wdev =
14105 __cfg80211_wdev_from_attrs(rdev, genl_info_net(info),
14110 if (!rdev->wiphy.vendor_commands)
14111 return -EOPNOTSUPP;
14113 if (IS_ERR(wdev)) {
14114 err = PTR_ERR(wdev);
14115 if (err != -EINVAL)
14118 } else if (wdev->wiphy != &rdev->wiphy) {
14122 if (!info->attrs[NL80211_ATTR_VENDOR_ID] ||
14123 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD])
14126 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]);
14127 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]);
14128 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
14129 const struct wiphy_vendor_command *vcmd;
14133 vcmd = &rdev->wiphy.vendor_commands[i];
14135 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
14138 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
14139 WIPHY_VENDOR_CMD_NEED_NETDEV)) {
14142 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
14146 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
14147 if (!wdev_running(wdev))
14155 return -EOPNOTSUPP;
14157 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
14158 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
14159 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
14161 err = nl80211_vendor_check_policy(vcmd,
14162 info->attrs[NL80211_ATTR_VENDOR_DATA],
14168 rdev->cur_cmd_info = info;
14169 err = vcmd->doit(&rdev->wiphy, wdev, data, len);
14170 rdev->cur_cmd_info = NULL;
14174 return -EOPNOTSUPP;
14177 static int nl80211_prepare_vendor_dump(struct sk_buff *skb,
14178 struct netlink_callback *cb,
14179 struct cfg80211_registered_device **rdev,
14180 struct wireless_dev **wdev)
14182 struct nlattr **attrbuf;
14188 unsigned int data_len = 0;
14191 /* subtract the 1 again here */
14192 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
14193 struct wireless_dev *tmp;
14197 *rdev = wiphy_to_rdev(wiphy);
14201 list_for_each_entry(tmp, &wiphy->wdev_list, list) {
14202 if (tmp->identifier == cb->args[1] - 1) {
14209 /* keep rtnl locked in successful case */
14213 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), GFP_KERNEL);
14217 err = nlmsg_parse_deprecated(cb->nlh,
14218 GENL_HDRLEN + nl80211_fam.hdrsize,
14219 attrbuf, nl80211_fam.maxattr,
14220 nl80211_policy, NULL);
14224 if (!attrbuf[NL80211_ATTR_VENDOR_ID] ||
14225 !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) {
14230 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf);
14234 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
14235 if (IS_ERR(*rdev)) {
14236 err = PTR_ERR(*rdev);
14240 vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]);
14241 subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
14243 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) {
14244 const struct wiphy_vendor_command *vcmd;
14246 vcmd = &(*rdev)->wiphy.vendor_commands[i];
14248 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
14251 if (!vcmd->dumpit) {
14260 if (vcmd_idx < 0) {
14265 if (attrbuf[NL80211_ATTR_VENDOR_DATA]) {
14266 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]);
14267 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]);
14269 err = nl80211_vendor_check_policy(
14270 &(*rdev)->wiphy.vendor_commands[vcmd_idx],
14271 attrbuf[NL80211_ATTR_VENDOR_DATA],
14277 /* 0 is the first index - add 1 to parse only once */
14278 cb->args[0] = (*rdev)->wiphy_idx + 1;
14279 /* add 1 to know if it was NULL */
14280 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0;
14281 cb->args[2] = vcmd_idx;
14282 cb->args[3] = (unsigned long)data;
14283 cb->args[4] = data_len;
14285 /* keep rtnl locked in successful case */
14292 static int nl80211_vendor_cmd_dump(struct sk_buff *skb,
14293 struct netlink_callback *cb)
14295 struct cfg80211_registered_device *rdev;
14296 struct wireless_dev *wdev;
14297 unsigned int vcmd_idx;
14298 const struct wiphy_vendor_command *vcmd;
14302 struct nlattr *vendor_data;
14305 err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev);
14309 vcmd_idx = cb->args[2];
14310 data = (void *)cb->args[3];
14311 data_len = cb->args[4];
14312 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx];
14314 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
14315 WIPHY_VENDOR_CMD_NEED_NETDEV)) {
14320 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
14326 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
14327 if (!wdev_running(wdev)) {
14335 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
14336 cb->nlh->nlmsg_seq, NLM_F_MULTI,
14337 NL80211_CMD_VENDOR);
14341 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14342 (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
14344 NL80211_ATTR_PAD))) {
14345 genlmsg_cancel(skb, hdr);
14349 vendor_data = nla_nest_start_noflag(skb,
14350 NL80211_ATTR_VENDOR_DATA);
14351 if (!vendor_data) {
14352 genlmsg_cancel(skb, hdr);
14356 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len,
14357 (unsigned long *)&cb->args[5]);
14358 nla_nest_end(skb, vendor_data);
14360 if (err == -ENOBUFS || err == -ENOENT) {
14361 genlmsg_cancel(skb, hdr);
14363 } else if (err <= 0) {
14364 genlmsg_cancel(skb, hdr);
14368 genlmsg_end(skb, hdr);
14377 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
14378 enum nl80211_commands cmd,
14379 enum nl80211_attrs attr,
14382 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14384 if (WARN_ON(!rdev->cur_cmd_info))
14387 return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen,
14388 rdev->cur_cmd_info->snd_portid,
14389 rdev->cur_cmd_info->snd_seq,
14390 cmd, attr, NULL, GFP_KERNEL);
14392 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb);
14394 int cfg80211_vendor_cmd_reply(struct sk_buff *skb)
14396 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
14397 void *hdr = ((void **)skb->cb)[1];
14398 struct nlattr *data = ((void **)skb->cb)[2];
14400 /* clear CB data for netlink core to own from now on */
14401 memset(skb->cb, 0, sizeof(skb->cb));
14403 if (WARN_ON(!rdev->cur_cmd_info)) {
14408 nla_nest_end(skb, data);
14409 genlmsg_end(skb, hdr);
14410 return genlmsg_reply(skb, rdev->cur_cmd_info);
14412 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply);
14414 unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy)
14416 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14418 if (WARN_ON(!rdev->cur_cmd_info))
14421 return rdev->cur_cmd_info->snd_portid;
14423 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_get_sender);
14425 static int nl80211_set_qos_map(struct sk_buff *skb,
14426 struct genl_info *info)
14428 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14429 struct cfg80211_qos_map *qos_map = NULL;
14430 struct net_device *dev = info->user_ptr[1];
14431 u8 *pos, len, num_des, des_len, des;
14434 if (!rdev->ops->set_qos_map)
14435 return -EOPNOTSUPP;
14437 if (info->attrs[NL80211_ATTR_QOS_MAP]) {
14438 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]);
14439 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]);
14444 qos_map = kzalloc(sizeof(struct cfg80211_qos_map), GFP_KERNEL);
14448 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1;
14450 des_len = num_des *
14451 sizeof(struct cfg80211_dscp_exception);
14452 memcpy(qos_map->dscp_exception, pos, des_len);
14453 qos_map->num_des = num_des;
14454 for (des = 0; des < num_des; des++) {
14455 if (qos_map->dscp_exception[des].up > 7) {
14462 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN);
14465 wdev_lock(dev->ieee80211_ptr);
14466 ret = nl80211_key_allowed(dev->ieee80211_ptr);
14468 ret = rdev_set_qos_map(rdev, dev, qos_map);
14469 wdev_unlock(dev->ieee80211_ptr);
14475 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info)
14477 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14478 struct net_device *dev = info->user_ptr[1];
14479 struct wireless_dev *wdev = dev->ieee80211_ptr;
14482 u16 admitted_time = 0;
14485 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION))
14486 return -EOPNOTSUPP;
14488 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] ||
14489 !info->attrs[NL80211_ATTR_USER_PRIO])
14492 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
14493 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]);
14495 /* WMM uses TIDs 0-7 even for TSPEC */
14496 if (tsid >= IEEE80211_FIRST_TSPEC_TSID) {
14497 /* TODO: handle 802.11 TSPEC/admission control
14498 * need more attributes for that (e.g. BA session requirement);
14499 * change the WMM adminssion test above to allow both then
14504 peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
14506 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) {
14508 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]);
14509 if (!admitted_time)
14514 switch (wdev->iftype) {
14515 case NL80211_IFTYPE_STATION:
14516 case NL80211_IFTYPE_P2P_CLIENT:
14517 if (wdev->current_bss)
14526 err = rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time);
14533 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info)
14535 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14536 struct net_device *dev = info->user_ptr[1];
14537 struct wireless_dev *wdev = dev->ieee80211_ptr;
14542 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC])
14545 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
14546 peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
14549 err = rdev_del_tx_ts(rdev, dev, tsid, peer);
14555 static int nl80211_tdls_channel_switch(struct sk_buff *skb,
14556 struct genl_info *info)
14558 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14559 struct net_device *dev = info->user_ptr[1];
14560 struct wireless_dev *wdev = dev->ieee80211_ptr;
14561 struct cfg80211_chan_def chandef = {};
14566 if (!rdev->ops->tdls_channel_switch ||
14567 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
14568 return -EOPNOTSUPP;
14570 switch (dev->ieee80211_ptr->iftype) {
14571 case NL80211_IFTYPE_STATION:
14572 case NL80211_IFTYPE_P2P_CLIENT:
14575 return -EOPNOTSUPP;
14578 if (!info->attrs[NL80211_ATTR_MAC] ||
14579 !info->attrs[NL80211_ATTR_OPER_CLASS])
14582 err = nl80211_parse_chandef(rdev, info, &chandef);
14587 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012
14588 * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the
14589 * specification is not defined for them.
14591 if (chandef.chan->band == NL80211_BAND_2GHZ &&
14592 chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
14593 chandef.width != NL80211_CHAN_WIDTH_20)
14596 /* we will be active on the TDLS link */
14597 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
14601 /* don't allow switching to DFS channels */
14602 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype))
14605 addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
14606 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]);
14609 err = rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef);
14615 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb,
14616 struct genl_info *info)
14618 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14619 struct net_device *dev = info->user_ptr[1];
14620 struct wireless_dev *wdev = dev->ieee80211_ptr;
14623 if (!rdev->ops->tdls_channel_switch ||
14624 !rdev->ops->tdls_cancel_channel_switch ||
14625 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
14626 return -EOPNOTSUPP;
14628 switch (dev->ieee80211_ptr->iftype) {
14629 case NL80211_IFTYPE_STATION:
14630 case NL80211_IFTYPE_P2P_CLIENT:
14633 return -EOPNOTSUPP;
14636 if (!info->attrs[NL80211_ATTR_MAC])
14639 addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
14642 rdev_tdls_cancel_channel_switch(rdev, dev, addr);
14648 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb,
14649 struct genl_info *info)
14651 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14652 struct net_device *dev = info->user_ptr[1];
14653 struct wireless_dev *wdev = dev->ieee80211_ptr;
14654 const struct nlattr *nla;
14657 if (!rdev->ops->set_multicast_to_unicast)
14658 return -EOPNOTSUPP;
14660 if (wdev->iftype != NL80211_IFTYPE_AP &&
14661 wdev->iftype != NL80211_IFTYPE_P2P_GO)
14662 return -EOPNOTSUPP;
14664 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED];
14665 enabled = nla_get_flag(nla);
14667 return rdev_set_multicast_to_unicast(rdev, dev, enabled);
14670 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info)
14672 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14673 struct net_device *dev = info->user_ptr[1];
14674 struct wireless_dev *wdev = dev->ieee80211_ptr;
14675 struct cfg80211_pmk_conf pmk_conf = {};
14678 if (wdev->iftype != NL80211_IFTYPE_STATION &&
14679 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
14680 return -EOPNOTSUPP;
14682 if (!wiphy_ext_feature_isset(&rdev->wiphy,
14683 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
14684 return -EOPNOTSUPP;
14686 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK])
14690 if (!wdev->current_bss) {
14695 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
14696 if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) {
14701 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
14702 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
14703 if (pmk_conf.pmk_len != WLAN_PMK_LEN &&
14704 pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) {
14709 if (info->attrs[NL80211_ATTR_PMKR0_NAME])
14710 pmk_conf.pmk_r0_name =
14711 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]);
14713 ret = rdev_set_pmk(rdev, dev, &pmk_conf);
14719 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info)
14721 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14722 struct net_device *dev = info->user_ptr[1];
14723 struct wireless_dev *wdev = dev->ieee80211_ptr;
14727 if (wdev->iftype != NL80211_IFTYPE_STATION &&
14728 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
14729 return -EOPNOTSUPP;
14731 if (!wiphy_ext_feature_isset(&rdev->wiphy,
14732 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
14733 return -EOPNOTSUPP;
14735 if (!info->attrs[NL80211_ATTR_MAC])
14739 aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
14740 ret = rdev_del_pmk(rdev, dev, aa);
14746 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info)
14748 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14749 struct net_device *dev = info->user_ptr[1];
14750 struct cfg80211_external_auth_params params;
14752 if (!rdev->ops->external_auth)
14753 return -EOPNOTSUPP;
14755 if (!info->attrs[NL80211_ATTR_SSID] &&
14756 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
14757 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
14760 if (!info->attrs[NL80211_ATTR_BSSID])
14763 if (!info->attrs[NL80211_ATTR_STATUS_CODE])
14766 memset(¶ms, 0, sizeof(params));
14768 if (info->attrs[NL80211_ATTR_SSID]) {
14769 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
14770 if (params.ssid.ssid_len == 0)
14772 memcpy(params.ssid.ssid,
14773 nla_data(info->attrs[NL80211_ATTR_SSID]),
14774 params.ssid.ssid_len);
14777 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]),
14780 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
14782 if (info->attrs[NL80211_ATTR_PMKID])
14783 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
14785 return rdev_external_auth(rdev, dev, ¶ms);
14788 static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info)
14790 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK];
14791 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14792 struct net_device *dev = info->user_ptr[1];
14793 struct wireless_dev *wdev = dev->ieee80211_ptr;
14802 if (!wiphy_ext_feature_isset(&rdev->wiphy,
14803 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211))
14804 return -EOPNOTSUPP;
14806 if (!rdev->ops->tx_control_port)
14807 return -EOPNOTSUPP;
14809 if (!info->attrs[NL80211_ATTR_FRAME] ||
14810 !info->attrs[NL80211_ATTR_MAC] ||
14811 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
14812 GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing");
14818 switch (wdev->iftype) {
14819 case NL80211_IFTYPE_AP:
14820 case NL80211_IFTYPE_P2P_GO:
14821 case NL80211_IFTYPE_MESH_POINT:
14823 case NL80211_IFTYPE_ADHOC:
14824 case NL80211_IFTYPE_STATION:
14825 case NL80211_IFTYPE_P2P_CLIENT:
14826 if (wdev->current_bss)
14837 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
14838 len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
14839 dest = nla_data(info->attrs[NL80211_ATTR_MAC]);
14840 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
14842 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]);
14844 err = rdev_tx_control_port(rdev, dev, buf, len,
14845 dest, cpu_to_be16(proto), noencrypt,
14846 dont_wait_for_ack ? NULL : &cookie);
14847 if (!err && !dont_wait_for_ack)
14848 nl_set_extack_cookie_u64(info->extack, cookie);
14855 static int nl80211_get_ftm_responder_stats(struct sk_buff *skb,
14856 struct genl_info *info)
14858 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14859 struct net_device *dev = info->user_ptr[1];
14860 struct wireless_dev *wdev = dev->ieee80211_ptr;
14861 struct cfg80211_ftm_responder_stats ftm_stats = {};
14862 struct sk_buff *msg;
14864 struct nlattr *ftm_stats_attr;
14867 if (wdev->iftype != NL80211_IFTYPE_AP || !wdev->beacon_interval)
14868 return -EOPNOTSUPP;
14870 err = rdev_get_ftm_responder_stats(rdev, dev, &ftm_stats);
14874 if (!ftm_stats.filled)
14877 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
14881 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
14882 NL80211_CMD_GET_FTM_RESPONDER_STATS);
14884 goto nla_put_failure;
14886 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
14887 goto nla_put_failure;
14889 ftm_stats_attr = nla_nest_start_noflag(msg,
14890 NL80211_ATTR_FTM_RESPONDER_STATS);
14891 if (!ftm_stats_attr)
14892 goto nla_put_failure;
14894 #define SET_FTM(field, name, type) \
14895 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \
14896 nla_put_ ## type(msg, NL80211_FTM_STATS_ ## name, \
14897 ftm_stats.field)) \
14898 goto nla_put_failure; } while (0)
14899 #define SET_FTM_U64(field, name) \
14900 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \
14901 nla_put_u64_64bit(msg, NL80211_FTM_STATS_ ## name, \
14902 ftm_stats.field, NL80211_FTM_STATS_PAD)) \
14903 goto nla_put_failure; } while (0)
14905 SET_FTM(success_num, SUCCESS_NUM, u32);
14906 SET_FTM(partial_num, PARTIAL_NUM, u32);
14907 SET_FTM(failed_num, FAILED_NUM, u32);
14908 SET_FTM(asap_num, ASAP_NUM, u32);
14909 SET_FTM(non_asap_num, NON_ASAP_NUM, u32);
14910 SET_FTM_U64(total_duration_ms, TOTAL_DURATION_MSEC);
14911 SET_FTM(unknown_triggers_num, UNKNOWN_TRIGGERS_NUM, u32);
14912 SET_FTM(reschedule_requests_num, RESCHEDULE_REQUESTS_NUM, u32);
14913 SET_FTM(out_of_window_triggers_num, OUT_OF_WINDOW_TRIGGERS_NUM, u32);
14916 nla_nest_end(msg, ftm_stats_attr);
14918 genlmsg_end(msg, hdr);
14919 return genlmsg_reply(msg, info);
14926 static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info)
14928 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14929 struct cfg80211_update_owe_info owe_info;
14930 struct net_device *dev = info->user_ptr[1];
14932 if (!rdev->ops->update_owe_info)
14933 return -EOPNOTSUPP;
14935 if (!info->attrs[NL80211_ATTR_STATUS_CODE] ||
14936 !info->attrs[NL80211_ATTR_MAC])
14939 memset(&owe_info, 0, sizeof(owe_info));
14940 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
14941 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN);
14943 if (info->attrs[NL80211_ATTR_IE]) {
14944 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
14945 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
14948 return rdev_update_owe_info(rdev, dev, &owe_info);
14951 static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info)
14953 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14954 struct net_device *dev = info->user_ptr[1];
14955 struct wireless_dev *wdev = dev->ieee80211_ptr;
14956 struct station_info sinfo = {};
14962 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station)
14963 return -EOPNOTSUPP;
14965 if (!info->attrs[NL80211_ATTR_MAC] ||
14966 !info->attrs[NL80211_ATTR_FRAME]) {
14967 GENL_SET_ERR_MSG(info, "Frame or MAC missing");
14971 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
14972 return -EOPNOTSUPP;
14974 dest = nla_data(info->attrs[NL80211_ATTR_MAC]);
14975 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
14976 len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
14978 if (len < sizeof(struct ethhdr))
14981 if (!ether_addr_equal(buf, dest) || is_multicast_ether_addr(buf) ||
14982 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr))
14985 err = rdev_get_station(rdev, dev, dest, &sinfo);
14989 cfg80211_sinfo_release_content(&sinfo);
14991 return rdev_probe_mesh_link(rdev, dev, dest, buf, len);
14994 static int parse_tid_conf(struct cfg80211_registered_device *rdev,
14995 struct nlattr *attrs[], struct net_device *dev,
14996 struct cfg80211_tid_cfg *tid_conf,
14997 struct genl_info *info, const u8 *peer)
14999 struct netlink_ext_ack *extack = info->extack;
15003 if (!attrs[NL80211_TID_CONFIG_ATTR_TIDS])
15006 tid_conf->config_override =
15007 nla_get_flag(attrs[NL80211_TID_CONFIG_ATTR_OVERRIDE]);
15008 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]);
15010 if (tid_conf->config_override) {
15011 if (rdev->ops->reset_tid_config) {
15012 err = rdev_reset_tid_config(rdev, dev, peer,
15021 if (attrs[NL80211_TID_CONFIG_ATTR_NOACK]) {
15022 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK);
15024 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_NOACK]);
15027 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]) {
15028 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT);
15029 tid_conf->retry_short =
15030 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]);
15032 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count)
15036 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]) {
15037 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG);
15038 tid_conf->retry_long =
15039 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]);
15041 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count)
15045 if (attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]) {
15046 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL);
15048 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]);
15051 if (attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]) {
15052 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL);
15054 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]);
15057 if (attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]) {
15058 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL);
15060 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]);
15063 if (attrs[NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE]) {
15064 u32 idx = NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE, attr;
15066 tid_conf->txrate_type = nla_get_u8(attrs[idx]);
15068 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) {
15069 attr = NL80211_TID_CONFIG_ATTR_TX_RATE;
15070 err = nl80211_parse_tx_bitrate_mask(info, attrs, attr,
15071 &tid_conf->txrate_mask, dev,
15076 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE);
15078 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE);
15082 mask = rdev->wiphy.tid_config_support.peer;
15084 mask = rdev->wiphy.tid_config_support.vif;
15086 if (tid_conf->mask & ~mask) {
15087 NL_SET_ERR_MSG(extack, "unsupported TID configuration");
15094 static int nl80211_set_tid_config(struct sk_buff *skb,
15095 struct genl_info *info)
15097 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15098 struct nlattr *attrs[NL80211_TID_CONFIG_ATTR_MAX + 1];
15099 struct net_device *dev = info->user_ptr[1];
15100 struct cfg80211_tid_config *tid_config;
15101 struct nlattr *tid;
15102 int conf_idx = 0, rem_conf;
15106 if (!info->attrs[NL80211_ATTR_TID_CONFIG])
15109 if (!rdev->ops->set_tid_config)
15110 return -EOPNOTSUPP;
15112 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG],
15116 tid_config = kzalloc(struct_size(tid_config, tid_conf, num_conf),
15121 tid_config->n_tid_conf = num_conf;
15123 if (info->attrs[NL80211_ATTR_MAC])
15124 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
15126 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG],
15128 ret = nla_parse_nested(attrs, NL80211_TID_CONFIG_ATTR_MAX,
15134 ret = parse_tid_conf(rdev, attrs, dev,
15135 &tid_config->tid_conf[conf_idx],
15136 info, tid_config->peer);
15143 ret = rdev_set_tid_config(rdev, dev, tid_config);
15150 static int nl80211_color_change(struct sk_buff *skb, struct genl_info *info)
15152 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15153 struct cfg80211_color_change_settings params = {};
15154 struct net_device *dev = info->user_ptr[1];
15155 struct wireless_dev *wdev = dev->ieee80211_ptr;
15156 struct nlattr **tb;
15160 if (!rdev->ops->color_change)
15161 return -EOPNOTSUPP;
15163 if (!wiphy_ext_feature_isset(&rdev->wiphy,
15164 NL80211_EXT_FEATURE_BSS_COLOR))
15165 return -EOPNOTSUPP;
15167 if (wdev->iftype != NL80211_IFTYPE_AP)
15168 return -EOPNOTSUPP;
15170 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] ||
15171 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] ||
15172 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS])
15175 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]);
15176 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]);
15178 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_next);
15182 tb = kcalloc(NL80211_ATTR_MAX + 1, sizeof(*tb), GFP_KERNEL);
15186 err = nla_parse_nested(tb, NL80211_ATTR_MAX,
15187 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS],
15188 nl80211_policy, info->extack);
15192 err = nl80211_parse_beacon(rdev, tb, ¶ms.beacon_color_change);
15196 if (!tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) {
15201 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) != sizeof(u16)) {
15206 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]);
15207 if (offset >= params.beacon_color_change.tail_len) {
15212 if (params.beacon_color_change.tail[offset] != params.count) {
15217 params.counter_offset_beacon = offset;
15219 if (tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) {
15220 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) !=
15226 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]);
15227 if (offset >= params.beacon_color_change.probe_resp_len) {
15232 if (params.beacon_color_change.probe_resp[offset] !=
15238 params.counter_offset_presp = offset;
15242 err = rdev_color_change(rdev, dev, ¶ms);
15246 kfree(params.beacon_next.mbssid_ies);
15247 kfree(params.beacon_color_change.mbssid_ies);
15252 static int nl80211_set_fils_aad(struct sk_buff *skb,
15253 struct genl_info *info)
15255 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15256 struct net_device *dev = info->user_ptr[1];
15257 struct cfg80211_fils_aad fils_aad = {};
15260 if (!info->attrs[NL80211_ATTR_MAC] ||
15261 !info->attrs[NL80211_ATTR_FILS_KEK] ||
15262 !info->attrs[NL80211_ATTR_FILS_NONCES])
15265 fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]);
15266 fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]);
15267 fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]);
15268 nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]);
15269 fils_aad.snonce = nonces;
15270 fils_aad.anonce = nonces + FILS_NONCE_LEN;
15272 return rdev_set_fils_aad(rdev, dev, &fils_aad);
15275 #define NL80211_FLAG_NEED_WIPHY 0x01
15276 #define NL80211_FLAG_NEED_NETDEV 0x02
15277 #define NL80211_FLAG_NEED_RTNL 0x04
15278 #define NL80211_FLAG_CHECK_NETDEV_UP 0x08
15279 #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\
15280 NL80211_FLAG_CHECK_NETDEV_UP)
15281 #define NL80211_FLAG_NEED_WDEV 0x10
15282 /* If a netdev is associated, it must be UP, P2P must be started */
15283 #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\
15284 NL80211_FLAG_CHECK_NETDEV_UP)
15285 #define NL80211_FLAG_CLEAR_SKB 0x20
15286 #define NL80211_FLAG_NO_WIPHY_MTX 0x40
15288 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
15289 struct genl_info *info)
15291 struct cfg80211_registered_device *rdev = NULL;
15292 struct wireless_dev *wdev;
15293 struct net_device *dev;
15296 if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) {
15297 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
15298 if (IS_ERR(rdev)) {
15300 return PTR_ERR(rdev);
15302 info->user_ptr[0] = rdev;
15303 } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV ||
15304 ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
15305 wdev = __cfg80211_wdev_from_attrs(NULL, genl_info_net(info),
15307 if (IS_ERR(wdev)) {
15309 return PTR_ERR(wdev);
15312 dev = wdev->netdev;
15313 rdev = wiphy_to_rdev(wdev->wiphy);
15315 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) {
15321 info->user_ptr[1] = dev;
15323 info->user_ptr[1] = wdev;
15326 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
15327 !wdev_running(wdev)) {
15333 info->user_ptr[0] = rdev;
15336 if (rdev && !(ops->internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) {
15337 wiphy_lock(&rdev->wiphy);
15338 /* we keep the mutex locked until post_doit */
15339 __release(&rdev->wiphy.mtx);
15341 if (!(ops->internal_flags & NL80211_FLAG_NEED_RTNL))
15347 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
15348 struct genl_info *info)
15350 if (info->user_ptr[1]) {
15351 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
15352 struct wireless_dev *wdev = info->user_ptr[1];
15354 dev_put(wdev->netdev);
15356 dev_put(info->user_ptr[1]);
15360 if (info->user_ptr[0] &&
15361 !(ops->internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) {
15362 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15364 /* we kept the mutex locked since pre_doit */
15365 __acquire(&rdev->wiphy.mtx);
15366 wiphy_unlock(&rdev->wiphy);
15369 if (ops->internal_flags & NL80211_FLAG_NEED_RTNL)
15372 /* If needed, clear the netlink message payload from the SKB
15373 * as it might contain key data that shouldn't stick around on
15374 * the heap after the SKB is freed. The netlink message header
15375 * is still needed for further processing, so leave it intact.
15377 if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) {
15378 struct nlmsghdr *nlh = nlmsg_hdr(skb);
15380 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh));
15384 static int nl80211_set_sar_sub_specs(struct cfg80211_registered_device *rdev,
15385 struct cfg80211_sar_specs *sar_specs,
15386 struct nlattr *spec[], int index)
15388 u32 range_index, i;
15390 if (!sar_specs || !spec)
15393 if (!spec[NL80211_SAR_ATTR_SPECS_POWER] ||
15394 !spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX])
15397 range_index = nla_get_u32(spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]);
15399 /* check if range_index exceeds num_freq_ranges */
15400 if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges)
15403 /* check if range_index duplicates */
15404 for (i = 0; i < index; i++) {
15405 if (sar_specs->sub_specs[i].freq_range_index == range_index)
15409 sar_specs->sub_specs[index].power =
15410 nla_get_s32(spec[NL80211_SAR_ATTR_SPECS_POWER]);
15412 sar_specs->sub_specs[index].freq_range_index = range_index;
15417 static int nl80211_set_sar_specs(struct sk_buff *skb, struct genl_info *info)
15419 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15420 struct nlattr *spec[NL80211_SAR_ATTR_SPECS_MAX + 1];
15421 struct nlattr *tb[NL80211_SAR_ATTR_MAX + 1];
15422 struct cfg80211_sar_specs *sar_spec;
15423 enum nl80211_sar_type type;
15424 struct nlattr *spec_list;
15428 if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs)
15429 return -EOPNOTSUPP;
15431 if (!info->attrs[NL80211_ATTR_SAR_SPEC])
15434 nla_parse_nested(tb, NL80211_SAR_ATTR_MAX,
15435 info->attrs[NL80211_ATTR_SAR_SPEC],
15438 if (!tb[NL80211_SAR_ATTR_TYPE] || !tb[NL80211_SAR_ATTR_SPECS])
15441 type = nla_get_u32(tb[NL80211_SAR_ATTR_TYPE]);
15442 if (type != rdev->wiphy.sar_capa->type)
15446 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem)
15449 if (specs > rdev->wiphy.sar_capa->num_freq_ranges)
15452 sar_spec = kzalloc(struct_size(sar_spec, sub_specs, specs), GFP_KERNEL);
15456 sar_spec->type = type;
15458 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) {
15459 nla_parse_nested(spec, NL80211_SAR_ATTR_SPECS_MAX,
15460 spec_list, NULL, NULL);
15463 case NL80211_SAR_TYPE_POWER:
15464 if (nl80211_set_sar_sub_specs(rdev, sar_spec,
15477 sar_spec->num_sub_specs = specs;
15479 rdev->cur_cmd_info = info;
15480 err = rdev_set_sar_specs(rdev, sar_spec);
15481 rdev->cur_cmd_info = NULL;
15487 static const struct genl_ops nl80211_ops[] = {
15489 .cmd = NL80211_CMD_GET_WIPHY,
15490 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15491 .doit = nl80211_get_wiphy,
15492 .dumpit = nl80211_dump_wiphy,
15493 .done = nl80211_dump_wiphy_done,
15494 /* can be retrieved by unprivileged users */
15495 .internal_flags = NL80211_FLAG_NEED_WIPHY,
15499 static const struct genl_small_ops nl80211_small_ops[] = {
15501 .cmd = NL80211_CMD_SET_WIPHY,
15502 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15503 .doit = nl80211_set_wiphy,
15504 .flags = GENL_UNS_ADMIN_PERM,
15507 .cmd = NL80211_CMD_GET_INTERFACE,
15508 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15509 .doit = nl80211_get_interface,
15510 .dumpit = nl80211_dump_interface,
15511 /* can be retrieved by unprivileged users */
15512 .internal_flags = NL80211_FLAG_NEED_WDEV,
15515 .cmd = NL80211_CMD_SET_INTERFACE,
15516 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15517 .doit = nl80211_set_interface,
15518 .flags = GENL_UNS_ADMIN_PERM,
15519 .internal_flags = NL80211_FLAG_NEED_NETDEV |
15520 NL80211_FLAG_NEED_RTNL,
15523 .cmd = NL80211_CMD_NEW_INTERFACE,
15524 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15525 .doit = nl80211_new_interface,
15526 .flags = GENL_UNS_ADMIN_PERM,
15527 .internal_flags = NL80211_FLAG_NEED_WIPHY |
15528 NL80211_FLAG_NEED_RTNL |
15529 /* we take the wiphy mutex later ourselves */
15530 NL80211_FLAG_NO_WIPHY_MTX,
15533 .cmd = NL80211_CMD_DEL_INTERFACE,
15534 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15535 .doit = nl80211_del_interface,
15536 .flags = GENL_UNS_ADMIN_PERM,
15537 .internal_flags = NL80211_FLAG_NEED_WDEV |
15538 NL80211_FLAG_NEED_RTNL,
15541 .cmd = NL80211_CMD_GET_KEY,
15542 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15543 .doit = nl80211_get_key,
15544 .flags = GENL_UNS_ADMIN_PERM,
15545 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15548 .cmd = NL80211_CMD_SET_KEY,
15549 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15550 .doit = nl80211_set_key,
15551 .flags = GENL_UNS_ADMIN_PERM,
15552 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
15553 NL80211_FLAG_CLEAR_SKB,
15556 .cmd = NL80211_CMD_NEW_KEY,
15557 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15558 .doit = nl80211_new_key,
15559 .flags = GENL_UNS_ADMIN_PERM,
15560 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
15561 NL80211_FLAG_CLEAR_SKB,
15564 .cmd = NL80211_CMD_DEL_KEY,
15565 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15566 .doit = nl80211_del_key,
15567 .flags = GENL_UNS_ADMIN_PERM,
15568 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15571 .cmd = NL80211_CMD_SET_BEACON,
15572 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15573 .flags = GENL_UNS_ADMIN_PERM,
15574 .doit = nl80211_set_beacon,
15575 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15578 .cmd = NL80211_CMD_START_AP,
15579 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15580 .flags = GENL_UNS_ADMIN_PERM,
15581 .doit = nl80211_start_ap,
15582 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15585 .cmd = NL80211_CMD_STOP_AP,
15586 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15587 .flags = GENL_UNS_ADMIN_PERM,
15588 .doit = nl80211_stop_ap,
15589 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15592 .cmd = NL80211_CMD_GET_STATION,
15593 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15594 .doit = nl80211_get_station,
15595 .dumpit = nl80211_dump_station,
15596 .internal_flags = NL80211_FLAG_NEED_NETDEV,
15599 .cmd = NL80211_CMD_SET_STATION,
15600 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15601 .doit = nl80211_set_station,
15602 .flags = GENL_UNS_ADMIN_PERM,
15603 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15606 .cmd = NL80211_CMD_NEW_STATION,
15607 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15608 .doit = nl80211_new_station,
15609 .flags = GENL_UNS_ADMIN_PERM,
15610 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15613 .cmd = NL80211_CMD_DEL_STATION,
15614 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15615 .doit = nl80211_del_station,
15616 .flags = GENL_UNS_ADMIN_PERM,
15617 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15620 .cmd = NL80211_CMD_GET_MPATH,
15621 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15622 .doit = nl80211_get_mpath,
15623 .dumpit = nl80211_dump_mpath,
15624 .flags = GENL_UNS_ADMIN_PERM,
15625 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15628 .cmd = NL80211_CMD_GET_MPP,
15629 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15630 .doit = nl80211_get_mpp,
15631 .dumpit = nl80211_dump_mpp,
15632 .flags = GENL_UNS_ADMIN_PERM,
15633 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15636 .cmd = NL80211_CMD_SET_MPATH,
15637 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15638 .doit = nl80211_set_mpath,
15639 .flags = GENL_UNS_ADMIN_PERM,
15640 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15643 .cmd = NL80211_CMD_NEW_MPATH,
15644 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15645 .doit = nl80211_new_mpath,
15646 .flags = GENL_UNS_ADMIN_PERM,
15647 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15650 .cmd = NL80211_CMD_DEL_MPATH,
15651 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15652 .doit = nl80211_del_mpath,
15653 .flags = GENL_UNS_ADMIN_PERM,
15654 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15657 .cmd = NL80211_CMD_SET_BSS,
15658 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15659 .doit = nl80211_set_bss,
15660 .flags = GENL_UNS_ADMIN_PERM,
15661 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15664 .cmd = NL80211_CMD_GET_REG,
15665 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15666 .doit = nl80211_get_reg_do,
15667 .dumpit = nl80211_get_reg_dump,
15668 .internal_flags = 0,
15669 /* can be retrieved by unprivileged users */
15671 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
15673 .cmd = NL80211_CMD_SET_REG,
15674 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15675 .doit = nl80211_set_reg,
15676 .flags = GENL_ADMIN_PERM,
15677 .internal_flags = 0,
15681 .cmd = NL80211_CMD_REQ_SET_REG,
15682 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15683 .doit = nl80211_req_set_reg,
15684 .flags = GENL_ADMIN_PERM,
15687 .cmd = NL80211_CMD_RELOAD_REGDB,
15688 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15689 .doit = nl80211_reload_regdb,
15690 .flags = GENL_ADMIN_PERM,
15693 .cmd = NL80211_CMD_GET_MESH_CONFIG,
15694 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15695 .doit = nl80211_get_mesh_config,
15696 /* can be retrieved by unprivileged users */
15697 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15700 .cmd = NL80211_CMD_SET_MESH_CONFIG,
15701 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15702 .doit = nl80211_update_mesh_config,
15703 .flags = GENL_UNS_ADMIN_PERM,
15704 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15707 .cmd = NL80211_CMD_TRIGGER_SCAN,
15708 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15709 .doit = nl80211_trigger_scan,
15710 .flags = GENL_UNS_ADMIN_PERM,
15711 .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
15714 .cmd = NL80211_CMD_ABORT_SCAN,
15715 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15716 .doit = nl80211_abort_scan,
15717 .flags = GENL_UNS_ADMIN_PERM,
15718 .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
15721 .cmd = NL80211_CMD_GET_SCAN,
15722 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15723 .dumpit = nl80211_dump_scan,
15726 .cmd = NL80211_CMD_START_SCHED_SCAN,
15727 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15728 .doit = nl80211_start_sched_scan,
15729 .flags = GENL_UNS_ADMIN_PERM,
15730 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15733 .cmd = NL80211_CMD_STOP_SCHED_SCAN,
15734 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15735 .doit = nl80211_stop_sched_scan,
15736 .flags = GENL_UNS_ADMIN_PERM,
15737 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15740 .cmd = NL80211_CMD_AUTHENTICATE,
15741 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15742 .doit = nl80211_authenticate,
15743 .flags = GENL_UNS_ADMIN_PERM,
15744 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
15746 NL80211_FLAG_CLEAR_SKB,
15749 .cmd = NL80211_CMD_ASSOCIATE,
15750 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15751 .doit = nl80211_associate,
15752 .flags = GENL_UNS_ADMIN_PERM,
15753 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
15755 NL80211_FLAG_CLEAR_SKB,
15758 .cmd = NL80211_CMD_DEAUTHENTICATE,
15759 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15760 .doit = nl80211_deauthenticate,
15761 .flags = GENL_UNS_ADMIN_PERM,
15762 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15765 .cmd = NL80211_CMD_DISASSOCIATE,
15766 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15767 .doit = nl80211_disassociate,
15768 .flags = GENL_UNS_ADMIN_PERM,
15769 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15772 .cmd = NL80211_CMD_JOIN_IBSS,
15773 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15774 .doit = nl80211_join_ibss,
15775 .flags = GENL_UNS_ADMIN_PERM,
15776 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15779 .cmd = NL80211_CMD_LEAVE_IBSS,
15780 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15781 .doit = nl80211_leave_ibss,
15782 .flags = GENL_UNS_ADMIN_PERM,
15783 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15785 #ifdef CONFIG_NL80211_TESTMODE
15787 .cmd = NL80211_CMD_TESTMODE,
15788 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15789 .doit = nl80211_testmode_do,
15790 .dumpit = nl80211_testmode_dump,
15791 .flags = GENL_UNS_ADMIN_PERM,
15792 .internal_flags = NL80211_FLAG_NEED_WIPHY,
15796 .cmd = NL80211_CMD_CONNECT,
15797 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15798 .doit = nl80211_connect,
15799 .flags = GENL_UNS_ADMIN_PERM,
15800 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
15802 NL80211_FLAG_CLEAR_SKB,
15805 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS,
15806 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15807 .doit = nl80211_update_connect_params,
15808 .flags = GENL_ADMIN_PERM,
15809 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
15811 NL80211_FLAG_CLEAR_SKB,
15814 .cmd = NL80211_CMD_DISCONNECT,
15815 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15816 .doit = nl80211_disconnect,
15817 .flags = GENL_UNS_ADMIN_PERM,
15818 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15821 .cmd = NL80211_CMD_SET_WIPHY_NETNS,
15822 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15823 .doit = nl80211_wiphy_netns,
15824 .flags = GENL_UNS_ADMIN_PERM,
15825 .internal_flags = NL80211_FLAG_NEED_WIPHY |
15826 NL80211_FLAG_NEED_RTNL |
15827 NL80211_FLAG_NO_WIPHY_MTX,
15830 .cmd = NL80211_CMD_GET_SURVEY,
15831 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15832 .dumpit = nl80211_dump_survey,
15835 .cmd = NL80211_CMD_SET_PMKSA,
15836 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15837 .doit = nl80211_setdel_pmksa,
15838 .flags = GENL_UNS_ADMIN_PERM,
15839 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
15841 NL80211_FLAG_CLEAR_SKB,
15844 .cmd = NL80211_CMD_DEL_PMKSA,
15845 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15846 .doit = nl80211_setdel_pmksa,
15847 .flags = GENL_UNS_ADMIN_PERM,
15848 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15851 .cmd = NL80211_CMD_FLUSH_PMKSA,
15852 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15853 .doit = nl80211_flush_pmksa,
15854 .flags = GENL_UNS_ADMIN_PERM,
15855 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15858 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
15859 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15860 .doit = nl80211_remain_on_channel,
15861 .flags = GENL_UNS_ADMIN_PERM,
15862 .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
15865 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
15866 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15867 .doit = nl80211_cancel_remain_on_channel,
15868 .flags = GENL_UNS_ADMIN_PERM,
15869 .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
15872 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
15873 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15874 .doit = nl80211_set_tx_bitrate_mask,
15875 .flags = GENL_UNS_ADMIN_PERM,
15876 .internal_flags = NL80211_FLAG_NEED_NETDEV,
15879 .cmd = NL80211_CMD_REGISTER_FRAME,
15880 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15881 .doit = nl80211_register_mgmt,
15882 .flags = GENL_UNS_ADMIN_PERM,
15883 .internal_flags = NL80211_FLAG_NEED_WDEV,
15886 .cmd = NL80211_CMD_FRAME,
15887 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15888 .doit = nl80211_tx_mgmt,
15889 .flags = GENL_UNS_ADMIN_PERM,
15890 .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
15893 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
15894 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15895 .doit = nl80211_tx_mgmt_cancel_wait,
15896 .flags = GENL_UNS_ADMIN_PERM,
15897 .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
15900 .cmd = NL80211_CMD_SET_POWER_SAVE,
15901 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15902 .doit = nl80211_set_power_save,
15903 .flags = GENL_UNS_ADMIN_PERM,
15904 .internal_flags = NL80211_FLAG_NEED_NETDEV,
15907 .cmd = NL80211_CMD_GET_POWER_SAVE,
15908 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15909 .doit = nl80211_get_power_save,
15910 /* can be retrieved by unprivileged users */
15911 .internal_flags = NL80211_FLAG_NEED_NETDEV,
15914 .cmd = NL80211_CMD_SET_CQM,
15915 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15916 .doit = nl80211_set_cqm,
15917 .flags = GENL_UNS_ADMIN_PERM,
15918 .internal_flags = NL80211_FLAG_NEED_NETDEV,
15921 .cmd = NL80211_CMD_SET_CHANNEL,
15922 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15923 .doit = nl80211_set_channel,
15924 .flags = GENL_UNS_ADMIN_PERM,
15925 .internal_flags = NL80211_FLAG_NEED_NETDEV,
15928 .cmd = NL80211_CMD_JOIN_MESH,
15929 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15930 .doit = nl80211_join_mesh,
15931 .flags = GENL_UNS_ADMIN_PERM,
15932 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15935 .cmd = NL80211_CMD_LEAVE_MESH,
15936 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15937 .doit = nl80211_leave_mesh,
15938 .flags = GENL_UNS_ADMIN_PERM,
15939 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15942 .cmd = NL80211_CMD_JOIN_OCB,
15943 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15944 .doit = nl80211_join_ocb,
15945 .flags = GENL_UNS_ADMIN_PERM,
15946 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15949 .cmd = NL80211_CMD_LEAVE_OCB,
15950 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15951 .doit = nl80211_leave_ocb,
15952 .flags = GENL_UNS_ADMIN_PERM,
15953 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15957 .cmd = NL80211_CMD_GET_WOWLAN,
15958 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15959 .doit = nl80211_get_wowlan,
15960 /* can be retrieved by unprivileged users */
15961 .internal_flags = NL80211_FLAG_NEED_WIPHY,
15964 .cmd = NL80211_CMD_SET_WOWLAN,
15965 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15966 .doit = nl80211_set_wowlan,
15967 .flags = GENL_UNS_ADMIN_PERM,
15968 .internal_flags = NL80211_FLAG_NEED_WIPHY,
15972 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
15973 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15974 .doit = nl80211_set_rekey_data,
15975 .flags = GENL_UNS_ADMIN_PERM,
15976 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
15978 NL80211_FLAG_CLEAR_SKB,
15981 .cmd = NL80211_CMD_TDLS_MGMT,
15982 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15983 .doit = nl80211_tdls_mgmt,
15984 .flags = GENL_UNS_ADMIN_PERM,
15985 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15988 .cmd = NL80211_CMD_TDLS_OPER,
15989 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15990 .doit = nl80211_tdls_oper,
15991 .flags = GENL_UNS_ADMIN_PERM,
15992 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
15995 .cmd = NL80211_CMD_UNEXPECTED_FRAME,
15996 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
15997 .doit = nl80211_register_unexpected_frame,
15998 .flags = GENL_UNS_ADMIN_PERM,
15999 .internal_flags = NL80211_FLAG_NEED_NETDEV,
16002 .cmd = NL80211_CMD_PROBE_CLIENT,
16003 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16004 .doit = nl80211_probe_client,
16005 .flags = GENL_UNS_ADMIN_PERM,
16006 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16009 .cmd = NL80211_CMD_REGISTER_BEACONS,
16010 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16011 .doit = nl80211_register_beacons,
16012 .flags = GENL_UNS_ADMIN_PERM,
16013 .internal_flags = NL80211_FLAG_NEED_WIPHY,
16016 .cmd = NL80211_CMD_SET_NOACK_MAP,
16017 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16018 .doit = nl80211_set_noack_map,
16019 .flags = GENL_UNS_ADMIN_PERM,
16020 .internal_flags = NL80211_FLAG_NEED_NETDEV,
16023 .cmd = NL80211_CMD_START_P2P_DEVICE,
16024 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16025 .doit = nl80211_start_p2p_device,
16026 .flags = GENL_UNS_ADMIN_PERM,
16027 .internal_flags = NL80211_FLAG_NEED_WDEV |
16028 NL80211_FLAG_NEED_RTNL,
16031 .cmd = NL80211_CMD_STOP_P2P_DEVICE,
16032 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16033 .doit = nl80211_stop_p2p_device,
16034 .flags = GENL_UNS_ADMIN_PERM,
16035 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
16036 NL80211_FLAG_NEED_RTNL,
16039 .cmd = NL80211_CMD_START_NAN,
16040 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16041 .doit = nl80211_start_nan,
16042 .flags = GENL_ADMIN_PERM,
16043 .internal_flags = NL80211_FLAG_NEED_WDEV |
16044 NL80211_FLAG_NEED_RTNL,
16047 .cmd = NL80211_CMD_STOP_NAN,
16048 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16049 .doit = nl80211_stop_nan,
16050 .flags = GENL_ADMIN_PERM,
16051 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
16052 NL80211_FLAG_NEED_RTNL,
16055 .cmd = NL80211_CMD_ADD_NAN_FUNCTION,
16056 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16057 .doit = nl80211_nan_add_func,
16058 .flags = GENL_ADMIN_PERM,
16059 .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
16062 .cmd = NL80211_CMD_DEL_NAN_FUNCTION,
16063 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16064 .doit = nl80211_nan_del_func,
16065 .flags = GENL_ADMIN_PERM,
16066 .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
16069 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG,
16070 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16071 .doit = nl80211_nan_change_config,
16072 .flags = GENL_ADMIN_PERM,
16073 .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
16076 .cmd = NL80211_CMD_SET_MCAST_RATE,
16077 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16078 .doit = nl80211_set_mcast_rate,
16079 .flags = GENL_UNS_ADMIN_PERM,
16080 .internal_flags = NL80211_FLAG_NEED_NETDEV,
16083 .cmd = NL80211_CMD_SET_MAC_ACL,
16084 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16085 .doit = nl80211_set_mac_acl,
16086 .flags = GENL_UNS_ADMIN_PERM,
16087 .internal_flags = NL80211_FLAG_NEED_NETDEV,
16090 .cmd = NL80211_CMD_RADAR_DETECT,
16091 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16092 .doit = nl80211_start_radar_detection,
16093 .flags = GENL_UNS_ADMIN_PERM,
16094 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
16095 NL80211_FLAG_NO_WIPHY_MTX,
16098 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
16099 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16100 .doit = nl80211_get_protocol_features,
16103 .cmd = NL80211_CMD_UPDATE_FT_IES,
16104 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16105 .doit = nl80211_update_ft_ies,
16106 .flags = GENL_UNS_ADMIN_PERM,
16107 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16110 .cmd = NL80211_CMD_CRIT_PROTOCOL_START,
16111 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16112 .doit = nl80211_crit_protocol_start,
16113 .flags = GENL_UNS_ADMIN_PERM,
16114 .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
16117 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
16118 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16119 .doit = nl80211_crit_protocol_stop,
16120 .flags = GENL_UNS_ADMIN_PERM,
16121 .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
16124 .cmd = NL80211_CMD_GET_COALESCE,
16125 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16126 .doit = nl80211_get_coalesce,
16127 .internal_flags = NL80211_FLAG_NEED_WIPHY,
16130 .cmd = NL80211_CMD_SET_COALESCE,
16131 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16132 .doit = nl80211_set_coalesce,
16133 .flags = GENL_UNS_ADMIN_PERM,
16134 .internal_flags = NL80211_FLAG_NEED_WIPHY,
16137 .cmd = NL80211_CMD_CHANNEL_SWITCH,
16138 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16139 .doit = nl80211_channel_switch,
16140 .flags = GENL_UNS_ADMIN_PERM,
16141 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16144 .cmd = NL80211_CMD_VENDOR,
16145 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16146 .doit = nl80211_vendor_cmd,
16147 .dumpit = nl80211_vendor_cmd_dump,
16148 .flags = GENL_UNS_ADMIN_PERM,
16149 .internal_flags = NL80211_FLAG_NEED_WIPHY |
16151 NL80211_FLAG_CLEAR_SKB,
16154 .cmd = NL80211_CMD_SET_QOS_MAP,
16155 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16156 .doit = nl80211_set_qos_map,
16157 .flags = GENL_UNS_ADMIN_PERM,
16158 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16161 .cmd = NL80211_CMD_ADD_TX_TS,
16162 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16163 .doit = nl80211_add_tx_ts,
16164 .flags = GENL_UNS_ADMIN_PERM,
16165 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16168 .cmd = NL80211_CMD_DEL_TX_TS,
16169 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16170 .doit = nl80211_del_tx_ts,
16171 .flags = GENL_UNS_ADMIN_PERM,
16172 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16175 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH,
16176 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16177 .doit = nl80211_tdls_channel_switch,
16178 .flags = GENL_UNS_ADMIN_PERM,
16179 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16182 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
16183 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16184 .doit = nl80211_tdls_cancel_channel_switch,
16185 .flags = GENL_UNS_ADMIN_PERM,
16186 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16189 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST,
16190 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16191 .doit = nl80211_set_multicast_to_unicast,
16192 .flags = GENL_UNS_ADMIN_PERM,
16193 .internal_flags = NL80211_FLAG_NEED_NETDEV,
16196 .cmd = NL80211_CMD_SET_PMK,
16197 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16198 .doit = nl80211_set_pmk,
16199 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
16201 NL80211_FLAG_CLEAR_SKB,
16204 .cmd = NL80211_CMD_DEL_PMK,
16205 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16206 .doit = nl80211_del_pmk,
16207 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16210 .cmd = NL80211_CMD_EXTERNAL_AUTH,
16211 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16212 .doit = nl80211_external_auth,
16213 .flags = GENL_ADMIN_PERM,
16214 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16217 .cmd = NL80211_CMD_CONTROL_PORT_FRAME,
16218 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16219 .doit = nl80211_tx_control_port,
16220 .flags = GENL_UNS_ADMIN_PERM,
16221 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16224 .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS,
16225 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16226 .doit = nl80211_get_ftm_responder_stats,
16227 .internal_flags = NL80211_FLAG_NEED_NETDEV,
16230 .cmd = NL80211_CMD_PEER_MEASUREMENT_START,
16231 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16232 .doit = nl80211_pmsr_start,
16233 .flags = GENL_UNS_ADMIN_PERM,
16234 .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
16237 .cmd = NL80211_CMD_NOTIFY_RADAR,
16238 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16239 .doit = nl80211_notify_radar_detection,
16240 .flags = GENL_UNS_ADMIN_PERM,
16241 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16244 .cmd = NL80211_CMD_UPDATE_OWE_INFO,
16245 .doit = nl80211_update_owe_info,
16246 .flags = GENL_ADMIN_PERM,
16247 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16250 .cmd = NL80211_CMD_PROBE_MESH_LINK,
16251 .doit = nl80211_probe_mesh_link,
16252 .flags = GENL_UNS_ADMIN_PERM,
16253 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16256 .cmd = NL80211_CMD_SET_TID_CONFIG,
16257 .doit = nl80211_set_tid_config,
16258 .flags = GENL_UNS_ADMIN_PERM,
16259 .internal_flags = NL80211_FLAG_NEED_NETDEV,
16262 .cmd = NL80211_CMD_SET_SAR_SPECS,
16263 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16264 .doit = nl80211_set_sar_specs,
16265 .flags = GENL_UNS_ADMIN_PERM,
16266 .internal_flags = NL80211_FLAG_NEED_WIPHY |
16267 NL80211_FLAG_NEED_RTNL,
16270 .cmd = NL80211_CMD_COLOR_CHANGE_REQUEST,
16271 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16272 .doit = nl80211_color_change,
16273 .flags = GENL_UNS_ADMIN_PERM,
16274 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
16275 NL80211_FLAG_NEED_RTNL,
16278 .cmd = NL80211_CMD_SET_FILS_AAD,
16279 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16280 .doit = nl80211_set_fils_aad,
16281 .flags = GENL_UNS_ADMIN_PERM,
16282 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
16286 static struct genl_family nl80211_fam __ro_after_init = {
16287 .name = NL80211_GENL_NAME, /* have users key off the name instead */
16288 .hdrsize = 0, /* no private header */
16289 .version = 1, /* no particular meaning now */
16290 .maxattr = NL80211_ATTR_MAX,
16291 .policy = nl80211_policy,
16293 .pre_doit = nl80211_pre_doit,
16294 .post_doit = nl80211_post_doit,
16295 .module = THIS_MODULE,
16296 .ops = nl80211_ops,
16297 .n_ops = ARRAY_SIZE(nl80211_ops),
16298 .small_ops = nl80211_small_ops,
16299 .n_small_ops = ARRAY_SIZE(nl80211_small_ops),
16300 .mcgrps = nl80211_mcgrps,
16301 .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps),
16302 .parallel_ops = true,
16305 /* notification functions */
16307 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
16308 enum nl80211_commands cmd)
16310 struct sk_buff *msg;
16311 struct nl80211_dump_wiphy_state state = {};
16313 WARN_ON(cmd != NL80211_CMD_NEW_WIPHY &&
16314 cmd != NL80211_CMD_DEL_WIPHY);
16316 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
16320 if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) {
16325 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16326 NL80211_MCGRP_CONFIG, GFP_KERNEL);
16329 void nl80211_notify_iface(struct cfg80211_registered_device *rdev,
16330 struct wireless_dev *wdev,
16331 enum nl80211_commands cmd)
16333 struct sk_buff *msg;
16335 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
16339 if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, cmd) < 0) {
16344 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16345 NL80211_MCGRP_CONFIG, GFP_KERNEL);
16348 static int nl80211_add_scan_req(struct sk_buff *msg,
16349 struct cfg80211_registered_device *rdev)
16351 struct cfg80211_scan_request *req = rdev->scan_req;
16352 struct nlattr *nest;
16354 struct cfg80211_scan_info *info;
16359 nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS);
16361 goto nla_put_failure;
16362 for (i = 0; i < req->n_ssids; i++) {
16363 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid))
16364 goto nla_put_failure;
16366 nla_nest_end(msg, nest);
16368 if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) {
16369 nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQ_KHZ);
16371 goto nla_put_failure;
16372 for (i = 0; i < req->n_channels; i++) {
16373 if (nla_put_u32(msg, i,
16374 ieee80211_channel_to_khz(req->channels[i])))
16375 goto nla_put_failure;
16377 nla_nest_end(msg, nest);
16379 nest = nla_nest_start_noflag(msg,
16380 NL80211_ATTR_SCAN_FREQUENCIES);
16382 goto nla_put_failure;
16383 for (i = 0; i < req->n_channels; i++) {
16384 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
16385 goto nla_put_failure;
16387 nla_nest_end(msg, nest);
16391 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie))
16392 goto nla_put_failure;
16395 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags))
16396 goto nla_put_failure;
16398 info = rdev->int_scan_req ? &rdev->int_scan_req->info :
16399 &rdev->scan_req->info;
16400 if (info->scan_start_tsf &&
16401 (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF,
16402 info->scan_start_tsf, NL80211_BSS_PAD) ||
16403 nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN,
16405 goto nla_put_failure;
16412 static int nl80211_prep_scan_msg(struct sk_buff *msg,
16413 struct cfg80211_registered_device *rdev,
16414 struct wireless_dev *wdev,
16415 u32 portid, u32 seq, int flags,
16420 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
16424 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16425 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
16426 wdev->netdev->ifindex)) ||
16427 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
16429 goto nla_put_failure;
16431 /* ignore errors and send incomplete event anyway */
16432 nl80211_add_scan_req(msg, rdev);
16434 genlmsg_end(msg, hdr);
16438 genlmsg_cancel(msg, hdr);
16443 nl80211_prep_sched_scan_msg(struct sk_buff *msg,
16444 struct cfg80211_sched_scan_request *req, u32 cmd)
16448 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
16452 if (nla_put_u32(msg, NL80211_ATTR_WIPHY,
16453 wiphy_to_rdev(req->wiphy)->wiphy_idx) ||
16454 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) ||
16455 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid,
16457 goto nla_put_failure;
16459 genlmsg_end(msg, hdr);
16463 genlmsg_cancel(msg, hdr);
16467 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
16468 struct wireless_dev *wdev)
16470 struct sk_buff *msg;
16472 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
16476 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
16477 NL80211_CMD_TRIGGER_SCAN) < 0) {
16482 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16483 NL80211_MCGRP_SCAN, GFP_KERNEL);
16486 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
16487 struct wireless_dev *wdev, bool aborted)
16489 struct sk_buff *msg;
16491 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
16495 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
16496 aborted ? NL80211_CMD_SCAN_ABORTED :
16497 NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
16505 /* send message created by nl80211_build_scan_msg() */
16506 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev,
16507 struct sk_buff *msg)
16512 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16513 NL80211_MCGRP_SCAN, GFP_KERNEL);
16516 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd)
16518 struct sk_buff *msg;
16520 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
16524 if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) {
16529 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0,
16530 NL80211_MCGRP_SCAN, GFP_KERNEL);
16533 static bool nl80211_reg_change_event_fill(struct sk_buff *msg,
16534 struct regulatory_request *request)
16536 /* Userspace can always count this one always being set */
16537 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator))
16538 goto nla_put_failure;
16540 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') {
16541 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
16542 NL80211_REGDOM_TYPE_WORLD))
16543 goto nla_put_failure;
16544 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') {
16545 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
16546 NL80211_REGDOM_TYPE_CUSTOM_WORLD))
16547 goto nla_put_failure;
16548 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
16549 request->intersect) {
16550 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
16551 NL80211_REGDOM_TYPE_INTERSECTION))
16552 goto nla_put_failure;
16554 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
16555 NL80211_REGDOM_TYPE_COUNTRY) ||
16556 nla_put_string(msg, NL80211_ATTR_REG_ALPHA2,
16558 goto nla_put_failure;
16561 if (request->wiphy_idx != WIPHY_IDX_INVALID) {
16562 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx);
16565 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx))
16566 goto nla_put_failure;
16569 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
16570 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
16571 goto nla_put_failure;
16581 * This can happen on global regulatory changes or device specific settings
16582 * based on custom regulatory domains.
16584 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id,
16585 struct regulatory_request *request)
16587 struct sk_buff *msg;
16590 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
16594 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id);
16596 goto nla_put_failure;
16598 if (!nl80211_reg_change_event_fill(msg, request))
16599 goto nla_put_failure;
16601 genlmsg_end(msg, hdr);
16604 genlmsg_multicast_allns(&nl80211_fam, msg, 0,
16605 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
16614 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
16615 struct net_device *netdev,
16616 const u8 *buf, size_t len,
16617 enum nl80211_commands cmd, gfp_t gfp,
16618 int uapsd_queues, const u8 *req_ies,
16619 size_t req_ies_len, bool reconnect)
16621 struct sk_buff *msg;
16624 msg = nlmsg_new(100 + len + req_ies_len, gfp);
16628 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
16634 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16635 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
16636 nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
16638 nla_put(msg, NL80211_ATTR_REQ_IE, req_ies_len, req_ies)))
16639 goto nla_put_failure;
16641 if (reconnect && nla_put_flag(msg, NL80211_ATTR_RECONNECT_REQUESTED))
16642 goto nla_put_failure;
16644 if (uapsd_queues >= 0) {
16645 struct nlattr *nla_wmm =
16646 nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME);
16648 goto nla_put_failure;
16650 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES,
16652 goto nla_put_failure;
16654 nla_nest_end(msg, nla_wmm);
16657 genlmsg_end(msg, hdr);
16659 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16660 NL80211_MCGRP_MLME, gfp);
16667 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
16668 struct net_device *netdev, const u8 *buf,
16669 size_t len, gfp_t gfp)
16671 nl80211_send_mlme_event(rdev, netdev, buf, len,
16672 NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0,
16676 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
16677 struct net_device *netdev, const u8 *buf,
16678 size_t len, gfp_t gfp, int uapsd_queues,
16679 const u8 *req_ies, size_t req_ies_len)
16681 nl80211_send_mlme_event(rdev, netdev, buf, len,
16682 NL80211_CMD_ASSOCIATE, gfp, uapsd_queues,
16683 req_ies, req_ies_len, false);
16686 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
16687 struct net_device *netdev, const u8 *buf,
16688 size_t len, bool reconnect, gfp_t gfp)
16690 nl80211_send_mlme_event(rdev, netdev, buf, len,
16691 NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0,
16695 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
16696 struct net_device *netdev, const u8 *buf,
16697 size_t len, bool reconnect, gfp_t gfp)
16699 nl80211_send_mlme_event(rdev, netdev, buf, len,
16700 NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0,
16704 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
16707 struct wireless_dev *wdev = dev->ieee80211_ptr;
16708 struct wiphy *wiphy = wdev->wiphy;
16709 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
16710 const struct ieee80211_mgmt *mgmt = (void *)buf;
16713 if (WARN_ON(len < 2))
16716 if (ieee80211_is_deauth(mgmt->frame_control)) {
16717 cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE;
16718 } else if (ieee80211_is_disassoc(mgmt->frame_control)) {
16719 cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
16720 } else if (ieee80211_is_beacon(mgmt->frame_control)) {
16721 if (wdev->unprot_beacon_reported &&
16722 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000)
16724 cmd = NL80211_CMD_UNPROT_BEACON;
16725 wdev->unprot_beacon_reported = jiffies;
16730 trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
16731 nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1,
16734 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
16736 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
16737 struct net_device *netdev, int cmd,
16738 const u8 *addr, gfp_t gfp)
16740 struct sk_buff *msg;
16743 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
16747 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
16753 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16754 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
16755 nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
16756 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
16757 goto nla_put_failure;
16759 genlmsg_end(msg, hdr);
16761 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16762 NL80211_MCGRP_MLME, gfp);
16769 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
16770 struct net_device *netdev, const u8 *addr,
16773 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
16777 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
16778 struct net_device *netdev, const u8 *addr,
16781 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
16785 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
16786 struct net_device *netdev,
16787 struct cfg80211_connect_resp_params *cr,
16790 struct sk_buff *msg;
16793 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len +
16794 cr->fils.kek_len + cr->fils.pmk_len +
16795 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp);
16799 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
16805 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16806 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
16808 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) ||
16809 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE,
16810 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE :
16813 (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
16814 nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON,
16815 cr->timeout_reason))) ||
16817 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) ||
16819 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len,
16821 (cr->fils.update_erp_next_seq_num &&
16822 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
16823 cr->fils.erp_next_seq_num)) ||
16824 (cr->status == WLAN_STATUS_SUCCESS &&
16826 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len,
16829 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) ||
16831 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid)))))
16832 goto nla_put_failure;
16834 genlmsg_end(msg, hdr);
16836 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16837 NL80211_MCGRP_MLME, gfp);
16844 void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
16845 struct net_device *netdev,
16846 struct cfg80211_roam_info *info, gfp_t gfp)
16848 struct sk_buff *msg;
16850 const u8 *bssid = info->bss ? info->bss->bssid : info->bssid;
16852 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len +
16853 info->fils.kek_len + info->fils.pmk_len +
16854 (info->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp);
16858 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
16864 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16865 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
16866 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) ||
16868 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len,
16871 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len,
16873 (info->fils.update_erp_next_seq_num &&
16874 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
16875 info->fils.erp_next_seq_num)) ||
16877 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len,
16878 info->fils.kek)) ||
16880 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) ||
16881 (info->fils.pmkid &&
16882 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid)))
16883 goto nla_put_failure;
16885 genlmsg_end(msg, hdr);
16887 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16888 NL80211_MCGRP_MLME, gfp);
16895 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
16896 struct net_device *netdev, const u8 *bssid)
16898 struct sk_buff *msg;
16901 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
16905 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED);
16911 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16912 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
16913 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
16914 goto nla_put_failure;
16916 genlmsg_end(msg, hdr);
16918 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16919 NL80211_MCGRP_MLME, GFP_KERNEL);
16926 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
16927 struct net_device *netdev, u16 reason,
16928 const u8 *ie, size_t ie_len, bool from_ap)
16930 struct sk_buff *msg;
16933 msg = nlmsg_new(100 + ie_len, GFP_KERNEL);
16937 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
16943 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16944 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
16946 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) ||
16948 nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) ||
16949 (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie)))
16950 goto nla_put_failure;
16952 genlmsg_end(msg, hdr);
16954 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16955 NL80211_MCGRP_MLME, GFP_KERNEL);
16962 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
16963 struct net_device *netdev, const u8 *bssid,
16966 struct sk_buff *msg;
16969 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
16973 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
16979 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16980 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
16981 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
16982 goto nla_put_failure;
16984 genlmsg_end(msg, hdr);
16986 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16987 NL80211_MCGRP_MLME, gfp);
16994 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
16995 const u8 *ie, u8 ie_len,
16996 int sig_dbm, gfp_t gfp)
16998 struct wireless_dev *wdev = dev->ieee80211_ptr;
16999 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
17000 struct sk_buff *msg;
17003 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
17006 trace_cfg80211_notify_new_peer_candidate(dev, addr);
17008 msg = nlmsg_new(100 + ie_len, gfp);
17012 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
17018 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17019 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
17020 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
17022 nla_put(msg, NL80211_ATTR_IE, ie_len, ie)) ||
17024 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)))
17025 goto nla_put_failure;
17027 genlmsg_end(msg, hdr);
17029 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
17030 NL80211_MCGRP_MLME, gfp);
17036 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
17038 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
17039 struct net_device *netdev, const u8 *addr,
17040 enum nl80211_key_type key_type, int key_id,
17041 const u8 *tsc, gfp_t gfp)
17043 struct sk_buff *msg;
17046 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
17050 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
17056 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17057 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
17058 (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) ||
17059 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) ||
17061 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) ||
17062 (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc)))
17063 goto nla_put_failure;
17065 genlmsg_end(msg, hdr);
17067 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
17068 NL80211_MCGRP_MLME, gfp);
17075 void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
17076 struct ieee80211_channel *channel_before,
17077 struct ieee80211_channel *channel_after)
17079 struct sk_buff *msg;
17081 struct nlattr *nl_freq;
17083 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
17087 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
17094 * Since we are applying the beacon hint to a wiphy we know its
17095 * wiphy_idx is valid
17097 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
17098 goto nla_put_failure;
17101 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_BEFORE);
17103 goto nla_put_failure;
17105 if (nl80211_msg_put_channel(msg, wiphy, channel_before, false))
17106 goto nla_put_failure;
17107 nla_nest_end(msg, nl_freq);
17110 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_AFTER);
17112 goto nla_put_failure;
17114 if (nl80211_msg_put_channel(msg, wiphy, channel_after, false))
17115 goto nla_put_failure;
17116 nla_nest_end(msg, nl_freq);
17118 genlmsg_end(msg, hdr);
17121 genlmsg_multicast_allns(&nl80211_fam, msg, 0,
17122 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
17131 static void nl80211_send_remain_on_chan_event(
17132 int cmd, struct cfg80211_registered_device *rdev,
17133 struct wireless_dev *wdev, u64 cookie,
17134 struct ieee80211_channel *chan,
17135 unsigned int duration, gfp_t gfp)
17137 struct sk_buff *msg;
17140 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
17144 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
17150 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17151 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
17152 wdev->netdev->ifindex)) ||
17153 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
17154 NL80211_ATTR_PAD) ||
17155 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) ||
17156 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
17157 NL80211_CHAN_NO_HT) ||
17158 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
17160 goto nla_put_failure;
17162 if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL &&
17163 nla_put_u32(msg, NL80211_ATTR_DURATION, duration))
17164 goto nla_put_failure;
17166 genlmsg_end(msg, hdr);
17168 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
17169 NL80211_MCGRP_MLME, gfp);
17176 void cfg80211_assoc_comeback(struct net_device *netdev,
17177 struct cfg80211_bss *bss, u32 timeout)
17179 struct wireless_dev *wdev = netdev->ieee80211_ptr;
17180 struct wiphy *wiphy = wdev->wiphy;
17181 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17182 struct sk_buff *msg;
17185 trace_cfg80211_assoc_comeback(wdev, bss->bssid, timeout);
17187 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
17191 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ASSOC_COMEBACK);
17197 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17198 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
17199 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bss->bssid) ||
17200 nla_put_u32(msg, NL80211_ATTR_TIMEOUT, timeout))
17201 goto nla_put_failure;
17203 genlmsg_end(msg, hdr);
17205 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
17206 NL80211_MCGRP_MLME, GFP_KERNEL);
17212 EXPORT_SYMBOL(cfg80211_assoc_comeback);
17214 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
17215 struct ieee80211_channel *chan,
17216 unsigned int duration, gfp_t gfp)
17218 struct wiphy *wiphy = wdev->wiphy;
17219 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17221 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
17222 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
17223 rdev, wdev, cookie, chan,
17226 EXPORT_SYMBOL(cfg80211_ready_on_channel);
17228 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
17229 struct ieee80211_channel *chan,
17232 struct wiphy *wiphy = wdev->wiphy;
17233 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17235 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
17236 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
17237 rdev, wdev, cookie, chan, 0, gfp);
17239 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
17241 void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie,
17242 struct ieee80211_channel *chan,
17245 struct wiphy *wiphy = wdev->wiphy;
17246 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17248 trace_cfg80211_tx_mgmt_expired(wdev, cookie, chan);
17249 nl80211_send_remain_on_chan_event(NL80211_CMD_FRAME_WAIT_CANCEL,
17250 rdev, wdev, cookie, chan, 0, gfp);
17252 EXPORT_SYMBOL(cfg80211_tx_mgmt_expired);
17254 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
17255 struct station_info *sinfo, gfp_t gfp)
17257 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
17258 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17259 struct sk_buff *msg;
17261 trace_cfg80211_new_sta(dev, mac_addr, sinfo);
17263 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
17267 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0,
17268 rdev, dev, mac_addr, sinfo) < 0) {
17273 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
17274 NL80211_MCGRP_MLME, gfp);
17276 EXPORT_SYMBOL(cfg80211_new_sta);
17278 void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
17279 struct station_info *sinfo, gfp_t gfp)
17281 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
17282 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17283 struct sk_buff *msg;
17284 struct station_info empty_sinfo = {};
17287 sinfo = &empty_sinfo;
17289 trace_cfg80211_del_sta(dev, mac_addr);
17291 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
17293 cfg80211_sinfo_release_content(sinfo);
17297 if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0,
17298 rdev, dev, mac_addr, sinfo) < 0) {
17303 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
17304 NL80211_MCGRP_MLME, gfp);
17306 EXPORT_SYMBOL(cfg80211_del_sta_sinfo);
17308 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
17309 enum nl80211_connect_failed_reason reason,
17312 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
17313 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17314 struct sk_buff *msg;
17317 msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
17321 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
17327 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
17328 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
17329 nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
17330 goto nla_put_failure;
17332 genlmsg_end(msg, hdr);
17334 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
17335 NL80211_MCGRP_MLME, gfp);
17341 EXPORT_SYMBOL(cfg80211_conn_failed);
17343 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
17344 const u8 *addr, gfp_t gfp)
17346 struct wireless_dev *wdev = dev->ieee80211_ptr;
17347 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
17348 struct sk_buff *msg;
17350 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid);
17355 msg = nlmsg_new(100, gfp);
17359 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
17365 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17366 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
17367 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
17368 goto nla_put_failure;
17370 genlmsg_end(msg, hdr);
17371 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
17379 bool cfg80211_rx_spurious_frame(struct net_device *dev,
17380 const u8 *addr, gfp_t gfp)
17382 struct wireless_dev *wdev = dev->ieee80211_ptr;
17385 trace_cfg80211_rx_spurious_frame(dev, addr);
17387 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
17388 wdev->iftype != NL80211_IFTYPE_P2P_GO)) {
17389 trace_cfg80211_return_bool(false);
17392 ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME,
17394 trace_cfg80211_return_bool(ret);
17397 EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
17399 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
17400 const u8 *addr, gfp_t gfp)
17402 struct wireless_dev *wdev = dev->ieee80211_ptr;
17405 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr);
17407 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
17408 wdev->iftype != NL80211_IFTYPE_P2P_GO &&
17409 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
17410 trace_cfg80211_return_bool(false);
17413 ret = __nl80211_unexpected_frame(dev,
17414 NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
17416 trace_cfg80211_return_bool(ret);
17419 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
17421 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
17422 struct wireless_dev *wdev, u32 nlportid,
17423 int freq, int sig_dbm,
17424 const u8 *buf, size_t len, u32 flags, gfp_t gfp)
17426 struct net_device *netdev = wdev->netdev;
17427 struct sk_buff *msg;
17430 msg = nlmsg_new(100 + len, gfp);
17434 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
17440 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17441 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
17442 netdev->ifindex)) ||
17443 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
17444 NL80211_ATTR_PAD) ||
17445 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(freq)) ||
17446 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, freq % 1000) ||
17448 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
17449 nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
17451 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags)))
17452 goto nla_put_failure;
17454 genlmsg_end(msg, hdr);
17456 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
17463 static void nl80211_frame_tx_status(struct wireless_dev *wdev, u64 cookie,
17464 const u8 *buf, size_t len, bool ack,
17465 gfp_t gfp, enum nl80211_commands command)
17467 struct wiphy *wiphy = wdev->wiphy;
17468 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17469 struct net_device *netdev = wdev->netdev;
17470 struct sk_buff *msg;
17473 if (command == NL80211_CMD_FRAME_TX_STATUS)
17474 trace_cfg80211_mgmt_tx_status(wdev, cookie, ack);
17476 trace_cfg80211_control_port_tx_status(wdev, cookie, ack);
17478 msg = nlmsg_new(100 + len, gfp);
17482 hdr = nl80211hdr_put(msg, 0, 0, 0, command);
17488 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17489 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
17490 netdev->ifindex)) ||
17491 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
17492 NL80211_ATTR_PAD) ||
17493 nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
17494 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
17495 NL80211_ATTR_PAD) ||
17496 (ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
17497 goto nla_put_failure;
17499 genlmsg_end(msg, hdr);
17501 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
17502 NL80211_MCGRP_MLME, gfp);
17509 void cfg80211_control_port_tx_status(struct wireless_dev *wdev, u64 cookie,
17510 const u8 *buf, size_t len, bool ack,
17513 nl80211_frame_tx_status(wdev, cookie, buf, len, ack, gfp,
17514 NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS);
17516 EXPORT_SYMBOL(cfg80211_control_port_tx_status);
17518 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
17519 const u8 *buf, size_t len, bool ack, gfp_t gfp)
17521 nl80211_frame_tx_status(wdev, cookie, buf, len, ack, gfp,
17522 NL80211_CMD_FRAME_TX_STATUS);
17524 EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
17526 static int __nl80211_rx_control_port(struct net_device *dev,
17527 struct sk_buff *skb,
17528 bool unencrypted, gfp_t gfp)
17530 struct wireless_dev *wdev = dev->ieee80211_ptr;
17531 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
17532 struct ethhdr *ehdr = eth_hdr(skb);
17533 const u8 *addr = ehdr->h_source;
17534 u16 proto = be16_to_cpu(skb->protocol);
17535 struct sk_buff *msg;
17537 struct nlattr *frame;
17539 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid);
17544 msg = nlmsg_new(100 + skb->len, gfp);
17548 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONTROL_PORT_FRAME);
17554 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17555 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
17556 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
17557 NL80211_ATTR_PAD) ||
17558 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
17559 nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) ||
17560 (unencrypted && nla_put_flag(msg,
17561 NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT)))
17562 goto nla_put_failure;
17564 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len);
17566 goto nla_put_failure;
17568 skb_copy_bits(skb, 0, nla_data(frame), skb->len);
17569 genlmsg_end(msg, hdr);
17571 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
17578 bool cfg80211_rx_control_port(struct net_device *dev,
17579 struct sk_buff *skb, bool unencrypted)
17583 trace_cfg80211_rx_control_port(dev, skb, unencrypted);
17584 ret = __nl80211_rx_control_port(dev, skb, unencrypted, GFP_ATOMIC);
17585 trace_cfg80211_return_bool(ret == 0);
17588 EXPORT_SYMBOL(cfg80211_rx_control_port);
17590 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev,
17591 const char *mac, gfp_t gfp)
17593 struct wireless_dev *wdev = dev->ieee80211_ptr;
17594 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
17595 struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
17601 cb = (void **)msg->cb;
17603 cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
17609 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17610 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
17611 goto nla_put_failure;
17613 if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
17614 goto nla_put_failure;
17616 cb[1] = nla_nest_start_noflag(msg, NL80211_ATTR_CQM);
17618 goto nla_put_failure;
17628 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp)
17630 void **cb = (void **)msg->cb;
17631 struct cfg80211_registered_device *rdev = cb[2];
17633 nla_nest_end(msg, cb[1]);
17634 genlmsg_end(msg, cb[0]);
17636 memset(msg->cb, 0, sizeof(msg->cb));
17638 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
17639 NL80211_MCGRP_MLME, gfp);
17642 void cfg80211_cqm_rssi_notify(struct net_device *dev,
17643 enum nl80211_cqm_rssi_threshold_event rssi_event,
17644 s32 rssi_level, gfp_t gfp)
17646 struct sk_buff *msg;
17647 struct wireless_dev *wdev = dev->ieee80211_ptr;
17648 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
17650 trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level);
17652 if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
17653 rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
17656 if (wdev->cqm_config) {
17657 wdev->cqm_config->last_rssi_event_value = rssi_level;
17659 cfg80211_cqm_rssi_update(rdev, dev);
17661 if (rssi_level == 0)
17662 rssi_level = wdev->cqm_config->last_rssi_event_value;
17665 msg = cfg80211_prepare_cqm(dev, NULL, gfp);
17669 if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
17671 goto nla_put_failure;
17673 if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL,
17675 goto nla_put_failure;
17677 cfg80211_send_cqm(msg, gfp);
17684 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
17686 void cfg80211_cqm_txe_notify(struct net_device *dev,
17687 const u8 *peer, u32 num_packets,
17688 u32 rate, u32 intvl, gfp_t gfp)
17690 struct sk_buff *msg;
17692 msg = cfg80211_prepare_cqm(dev, peer, gfp);
17696 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets))
17697 goto nla_put_failure;
17699 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate))
17700 goto nla_put_failure;
17702 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl))
17703 goto nla_put_failure;
17705 cfg80211_send_cqm(msg, gfp);
17711 EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
17713 void cfg80211_cqm_pktloss_notify(struct net_device *dev,
17714 const u8 *peer, u32 num_packets, gfp_t gfp)
17716 struct sk_buff *msg;
17718 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
17720 msg = cfg80211_prepare_cqm(dev, peer, gfp);
17724 if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets))
17725 goto nla_put_failure;
17727 cfg80211_send_cqm(msg, gfp);
17733 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
17735 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp)
17737 struct sk_buff *msg;
17739 msg = cfg80211_prepare_cqm(dev, NULL, gfp);
17743 if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT))
17744 goto nla_put_failure;
17746 cfg80211_send_cqm(msg, gfp);
17752 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify);
17754 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
17755 struct net_device *netdev, const u8 *bssid,
17756 const u8 *replay_ctr, gfp_t gfp)
17758 struct sk_buff *msg;
17759 struct nlattr *rekey_attr;
17762 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
17766 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD);
17772 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17773 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
17774 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
17775 goto nla_put_failure;
17777 rekey_attr = nla_nest_start_noflag(msg, NL80211_ATTR_REKEY_DATA);
17779 goto nla_put_failure;
17781 if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR,
17782 NL80211_REPLAY_CTR_LEN, replay_ctr))
17783 goto nla_put_failure;
17785 nla_nest_end(msg, rekey_attr);
17787 genlmsg_end(msg, hdr);
17789 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
17790 NL80211_MCGRP_MLME, gfp);
17797 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
17798 const u8 *replay_ctr, gfp_t gfp)
17800 struct wireless_dev *wdev = dev->ieee80211_ptr;
17801 struct wiphy *wiphy = wdev->wiphy;
17802 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17804 trace_cfg80211_gtk_rekey_notify(dev, bssid);
17805 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
17807 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
17810 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
17811 struct net_device *netdev, int index,
17812 const u8 *bssid, bool preauth, gfp_t gfp)
17814 struct sk_buff *msg;
17815 struct nlattr *attr;
17818 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
17822 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE);
17828 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17829 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
17830 goto nla_put_failure;
17832 attr = nla_nest_start_noflag(msg, NL80211_ATTR_PMKSA_CANDIDATE);
17834 goto nla_put_failure;
17836 if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) ||
17837 nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) ||
17839 nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH)))
17840 goto nla_put_failure;
17842 nla_nest_end(msg, attr);
17844 genlmsg_end(msg, hdr);
17846 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
17847 NL80211_MCGRP_MLME, gfp);
17854 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
17855 const u8 *bssid, bool preauth, gfp_t gfp)
17857 struct wireless_dev *wdev = dev->ieee80211_ptr;
17858 struct wiphy *wiphy = wdev->wiphy;
17859 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17861 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
17862 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
17864 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
17866 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
17867 struct net_device *netdev,
17868 struct cfg80211_chan_def *chandef,
17870 enum nl80211_commands notif,
17871 u8 count, bool quiet)
17873 struct sk_buff *msg;
17876 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
17880 hdr = nl80211hdr_put(msg, 0, 0, 0, notif);
17886 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
17887 goto nla_put_failure;
17889 if (nl80211_send_chandef(msg, chandef))
17890 goto nla_put_failure;
17892 if (notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) {
17893 if (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count))
17894 goto nla_put_failure;
17896 nla_put_flag(msg, NL80211_ATTR_CH_SWITCH_BLOCK_TX))
17897 goto nla_put_failure;
17900 genlmsg_end(msg, hdr);
17902 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
17903 NL80211_MCGRP_MLME, gfp);
17910 void cfg80211_ch_switch_notify(struct net_device *dev,
17911 struct cfg80211_chan_def *chandef)
17913 struct wireless_dev *wdev = dev->ieee80211_ptr;
17914 struct wiphy *wiphy = wdev->wiphy;
17915 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17917 ASSERT_WDEV_LOCK(wdev);
17919 trace_cfg80211_ch_switch_notify(dev, chandef);
17921 wdev->chandef = *chandef;
17922 wdev->preset_chandef = *chandef;
17924 if ((wdev->iftype == NL80211_IFTYPE_STATION ||
17925 wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) &&
17926 !WARN_ON(!wdev->current_bss))
17927 cfg80211_update_assoc_bss_entry(wdev, chandef->chan);
17929 cfg80211_sched_dfs_chan_update(rdev);
17931 nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
17932 NL80211_CMD_CH_SWITCH_NOTIFY, 0, false);
17934 EXPORT_SYMBOL(cfg80211_ch_switch_notify);
17936 void cfg80211_ch_switch_started_notify(struct net_device *dev,
17937 struct cfg80211_chan_def *chandef,
17938 u8 count, bool quiet)
17940 struct wireless_dev *wdev = dev->ieee80211_ptr;
17941 struct wiphy *wiphy = wdev->wiphy;
17942 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17944 trace_cfg80211_ch_switch_started_notify(dev, chandef);
17946 nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
17947 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY,
17950 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
17952 int cfg80211_bss_color_notify(struct net_device *dev, gfp_t gfp,
17953 enum nl80211_commands cmd, u8 count,
17956 struct wireless_dev *wdev = dev->ieee80211_ptr;
17957 struct wiphy *wiphy = wdev->wiphy;
17958 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17959 struct sk_buff *msg;
17962 ASSERT_WDEV_LOCK(wdev);
17964 trace_cfg80211_bss_color_notify(dev, cmd, count, color_bitmap);
17966 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
17970 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
17972 goto nla_put_failure;
17974 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
17975 goto nla_put_failure;
17977 if (cmd == NL80211_CMD_COLOR_CHANGE_STARTED &&
17978 nla_put_u32(msg, NL80211_ATTR_COLOR_CHANGE_COUNT, count))
17979 goto nla_put_failure;
17981 if (cmd == NL80211_CMD_OBSS_COLOR_COLLISION &&
17982 nla_put_u64_64bit(msg, NL80211_ATTR_OBSS_COLOR_BITMAP,
17983 color_bitmap, NL80211_ATTR_PAD))
17984 goto nla_put_failure;
17986 genlmsg_end(msg, hdr);
17988 return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
17989 msg, 0, NL80211_MCGRP_MLME, gfp);
17995 EXPORT_SYMBOL(cfg80211_bss_color_notify);
17998 nl80211_radar_notify(struct cfg80211_registered_device *rdev,
17999 const struct cfg80211_chan_def *chandef,
18000 enum nl80211_radar_event event,
18001 struct net_device *netdev, gfp_t gfp)
18003 struct sk_buff *msg;
18006 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
18010 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT);
18016 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
18017 goto nla_put_failure;
18019 /* NOP and radar events don't need a netdev parameter */
18021 struct wireless_dev *wdev = netdev->ieee80211_ptr;
18023 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
18024 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
18026 goto nla_put_failure;
18029 if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
18030 goto nla_put_failure;
18032 if (nl80211_send_chandef(msg, chandef))
18033 goto nla_put_failure;
18035 genlmsg_end(msg, hdr);
18037 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
18038 NL80211_MCGRP_MLME, gfp);
18045 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac,
18046 struct sta_opmode_info *sta_opmode,
18049 struct sk_buff *msg;
18050 struct wireless_dev *wdev = dev->ieee80211_ptr;
18051 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
18057 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
18061 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED);
18067 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
18068 goto nla_put_failure;
18070 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
18071 goto nla_put_failure;
18073 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
18074 goto nla_put_failure;
18076 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) &&
18077 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode))
18078 goto nla_put_failure;
18080 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) &&
18081 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw))
18082 goto nla_put_failure;
18084 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) &&
18085 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss))
18086 goto nla_put_failure;
18088 genlmsg_end(msg, hdr);
18090 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
18091 NL80211_MCGRP_MLME, gfp);
18098 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify);
18100 void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
18101 u64 cookie, bool acked, s32 ack_signal,
18102 bool is_valid_ack_signal, gfp_t gfp)
18104 struct wireless_dev *wdev = dev->ieee80211_ptr;
18105 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
18106 struct sk_buff *msg;
18109 trace_cfg80211_probe_status(dev, addr, cookie, acked);
18111 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
18116 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT);
18122 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
18123 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
18124 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
18125 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
18126 NL80211_ATTR_PAD) ||
18127 (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) ||
18128 (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL,
18130 goto nla_put_failure;
18132 genlmsg_end(msg, hdr);
18134 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
18135 NL80211_MCGRP_MLME, gfp);
18141 EXPORT_SYMBOL(cfg80211_probe_status);
18143 void cfg80211_report_obss_beacon_khz(struct wiphy *wiphy, const u8 *frame,
18144 size_t len, int freq, int sig_dbm)
18146 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
18147 struct sk_buff *msg;
18149 struct cfg80211_beacon_registration *reg;
18151 trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm);
18153 spin_lock_bh(&rdev->beacon_registrations_lock);
18154 list_for_each_entry(reg, &rdev->beacon_registrations, list) {
18155 msg = nlmsg_new(len + 100, GFP_ATOMIC);
18157 spin_unlock_bh(&rdev->beacon_registrations_lock);
18161 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
18163 goto nla_put_failure;
18165 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
18167 (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ,
18168 KHZ_TO_MHZ(freq)) ||
18169 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET,
18172 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
18173 nla_put(msg, NL80211_ATTR_FRAME, len, frame))
18174 goto nla_put_failure;
18176 genlmsg_end(msg, hdr);
18178 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid);
18180 spin_unlock_bh(&rdev->beacon_registrations_lock);
18184 spin_unlock_bh(&rdev->beacon_registrations_lock);
18187 EXPORT_SYMBOL(cfg80211_report_obss_beacon_khz);
18190 static int cfg80211_net_detect_results(struct sk_buff *msg,
18191 struct cfg80211_wowlan_wakeup *wakeup)
18193 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect;
18194 struct nlattr *nl_results, *nl_match, *nl_freqs;
18197 nl_results = nla_nest_start_noflag(msg,
18198 NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS);
18202 for (i = 0; i < nd->n_matches; i++) {
18203 struct cfg80211_wowlan_nd_match *match = nd->matches[i];
18205 nl_match = nla_nest_start_noflag(msg, i);
18209 /* The SSID attribute is optional in nl80211, but for
18210 * simplicity reasons it's always present in the
18211 * cfg80211 structure. If a driver can't pass the
18212 * SSID, that needs to be changed. A zero length SSID
18213 * is still a valid SSID (wildcard), so it cannot be
18214 * used for this purpose.
18216 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len,
18217 match->ssid.ssid)) {
18218 nla_nest_cancel(msg, nl_match);
18222 if (match->n_channels) {
18223 nl_freqs = nla_nest_start_noflag(msg,
18224 NL80211_ATTR_SCAN_FREQUENCIES);
18226 nla_nest_cancel(msg, nl_match);
18230 for (j = 0; j < match->n_channels; j++) {
18231 if (nla_put_u32(msg, j, match->channels[j])) {
18232 nla_nest_cancel(msg, nl_freqs);
18233 nla_nest_cancel(msg, nl_match);
18238 nla_nest_end(msg, nl_freqs);
18241 nla_nest_end(msg, nl_match);
18245 nla_nest_end(msg, nl_results);
18249 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
18250 struct cfg80211_wowlan_wakeup *wakeup,
18253 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
18254 struct sk_buff *msg;
18258 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup);
18261 size += wakeup->packet_present_len;
18263 msg = nlmsg_new(size, gfp);
18267 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN);
18271 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
18272 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
18276 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
18277 wdev->netdev->ifindex))
18281 struct nlattr *reasons;
18283 reasons = nla_nest_start_noflag(msg,
18284 NL80211_ATTR_WOWLAN_TRIGGERS);
18288 if (wakeup->disconnect &&
18289 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT))
18291 if (wakeup->magic_pkt &&
18292 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT))
18294 if (wakeup->gtk_rekey_failure &&
18295 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE))
18297 if (wakeup->eap_identity_req &&
18298 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST))
18300 if (wakeup->four_way_handshake &&
18301 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE))
18303 if (wakeup->rfkill_release &&
18304 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))
18307 if (wakeup->pattern_idx >= 0 &&
18308 nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
18309 wakeup->pattern_idx))
18312 if (wakeup->tcp_match &&
18313 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH))
18316 if (wakeup->tcp_connlost &&
18317 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST))
18320 if (wakeup->tcp_nomoretokens &&
18322 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS))
18325 if (wakeup->packet) {
18326 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211;
18327 u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN;
18329 if (!wakeup->packet_80211) {
18331 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023;
18333 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN;
18336 if (wakeup->packet_len &&
18337 nla_put_u32(msg, len_attr, wakeup->packet_len))
18340 if (nla_put(msg, pkt_attr, wakeup->packet_present_len,
18345 if (wakeup->net_detect &&
18346 cfg80211_net_detect_results(msg, wakeup))
18349 nla_nest_end(msg, reasons);
18352 genlmsg_end(msg, hdr);
18354 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
18355 NL80211_MCGRP_MLME, gfp);
18361 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup);
18364 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
18365 enum nl80211_tdls_operation oper,
18366 u16 reason_code, gfp_t gfp)
18368 struct wireless_dev *wdev = dev->ieee80211_ptr;
18369 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
18370 struct sk_buff *msg;
18373 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper,
18376 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
18380 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER);
18386 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
18387 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
18388 nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) ||
18389 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) ||
18390 (reason_code > 0 &&
18391 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code)))
18392 goto nla_put_failure;
18394 genlmsg_end(msg, hdr);
18396 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
18397 NL80211_MCGRP_MLME, gfp);
18403 EXPORT_SYMBOL(cfg80211_tdls_oper_request);
18405 static int nl80211_netlink_notify(struct notifier_block * nb,
18406 unsigned long state,
18409 struct netlink_notify *notify = _notify;
18410 struct cfg80211_registered_device *rdev;
18411 struct wireless_dev *wdev;
18412 struct cfg80211_beacon_registration *reg, *tmp;
18414 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC)
18415 return NOTIFY_DONE;
18419 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
18420 struct cfg80211_sched_scan_request *sched_scan_req;
18422 list_for_each_entry_rcu(sched_scan_req,
18423 &rdev->sched_scan_req_list,
18425 if (sched_scan_req->owner_nlportid == notify->portid) {
18426 sched_scan_req->nl_owner_dead = true;
18427 schedule_work(&rdev->sched_scan_stop_wk);
18431 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) {
18432 cfg80211_mlme_unregister_socket(wdev, notify->portid);
18434 if (wdev->owner_nlportid == notify->portid) {
18435 wdev->nl_owner_dead = true;
18436 schedule_work(&rdev->destroy_work);
18437 } else if (wdev->conn_owner_nlportid == notify->portid) {
18438 schedule_work(&wdev->disconnect_wk);
18441 cfg80211_release_pmsr(wdev, notify->portid);
18444 spin_lock_bh(&rdev->beacon_registrations_lock);
18445 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations,
18447 if (reg->nlportid == notify->portid) {
18448 list_del(®->list);
18453 spin_unlock_bh(&rdev->beacon_registrations_lock);
18459 * It is possible that the user space process that is controlling the
18460 * indoor setting disappeared, so notify the regulatory core.
18462 regulatory_netlink_notify(notify->portid);
18466 static struct notifier_block nl80211_netlink_notifier = {
18467 .notifier_call = nl80211_netlink_notify,
18470 void cfg80211_ft_event(struct net_device *netdev,
18471 struct cfg80211_ft_event_params *ft_event)
18473 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
18474 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
18475 struct sk_buff *msg;
18478 trace_cfg80211_ft_event(wiphy, netdev, ft_event);
18480 if (!ft_event->target_ap)
18483 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len,
18488 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT);
18492 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
18493 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
18494 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap))
18497 if (ft_event->ies &&
18498 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies))
18500 if (ft_event->ric_ies &&
18501 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len,
18502 ft_event->ric_ies))
18505 genlmsg_end(msg, hdr);
18507 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
18508 NL80211_MCGRP_MLME, GFP_KERNEL);
18513 EXPORT_SYMBOL(cfg80211_ft_event);
18515 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp)
18517 struct cfg80211_registered_device *rdev;
18518 struct sk_buff *msg;
18522 rdev = wiphy_to_rdev(wdev->wiphy);
18523 if (!rdev->crit_proto_nlportid)
18526 nlportid = rdev->crit_proto_nlportid;
18527 rdev->crit_proto_nlportid = 0;
18529 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
18533 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP);
18535 goto nla_put_failure;
18537 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
18538 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
18540 goto nla_put_failure;
18542 genlmsg_end(msg, hdr);
18544 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
18550 EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
18552 void nl80211_send_ap_stopped(struct wireless_dev *wdev)
18554 struct wiphy *wiphy = wdev->wiphy;
18555 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
18556 struct sk_buff *msg;
18559 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
18563 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP);
18567 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
18568 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) ||
18569 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
18573 genlmsg_end(msg, hdr);
18575 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
18576 NL80211_MCGRP_MLME, GFP_KERNEL);
18582 int cfg80211_external_auth_request(struct net_device *dev,
18583 struct cfg80211_external_auth_params *params,
18586 struct wireless_dev *wdev = dev->ieee80211_ptr;
18587 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
18588 struct sk_buff *msg;
18591 if (!wdev->conn_owner_nlportid)
18594 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
18598 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH);
18600 goto nla_put_failure;
18602 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
18603 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
18604 nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) ||
18605 nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION,
18607 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) ||
18608 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len,
18609 params->ssid.ssid))
18610 goto nla_put_failure;
18612 genlmsg_end(msg, hdr);
18613 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
18614 wdev->conn_owner_nlportid);
18621 EXPORT_SYMBOL(cfg80211_external_auth_request);
18623 void cfg80211_update_owe_info_event(struct net_device *netdev,
18624 struct cfg80211_update_owe_info *owe_info,
18627 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
18628 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
18629 struct sk_buff *msg;
18632 trace_cfg80211_update_owe_info_event(wiphy, netdev, owe_info);
18634 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
18638 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_OWE_INFO);
18640 goto nla_put_failure;
18642 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
18643 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
18644 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer))
18645 goto nla_put_failure;
18647 if (!owe_info->ie_len ||
18648 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie))
18649 goto nla_put_failure;
18651 genlmsg_end(msg, hdr);
18653 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
18654 NL80211_MCGRP_MLME, gfp);
18658 genlmsg_cancel(msg, hdr);
18661 EXPORT_SYMBOL(cfg80211_update_owe_info_event);
18663 /* initialisation/exit functions */
18665 int __init nl80211_init(void)
18669 err = genl_register_family(&nl80211_fam);
18673 err = netlink_register_notifier(&nl80211_netlink_notifier);
18679 genl_unregister_family(&nl80211_fam);
18683 void nl80211_exit(void)
18685 netlink_unregister_notifier(&nl80211_netlink_notifier);
18686 genl_unregister_family(&nl80211_fam);