xref: /linux/net/wireless/nl80211.c (revision 945a670236a7effaba57ed5ccf5dabf673002ef3)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * This is the new netlink-based wireless configuration interface.
4  *
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-2026 Intel Corporation
9  */
10 
11 #include <linux/if.h>
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 <linux/random.h>
25 #include <net/net_namespace.h>
26 #include <net/genetlink.h>
27 #include <net/cfg80211.h>
28 #include <net/sock.h>
29 #include <net/inet_connection_sock.h>
30 #include "core.h"
31 #include "nl80211.h"
32 #include "reg.h"
33 #include "rdev-ops.h"
34 
35 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
36 				   struct genl_info *info,
37 				   struct cfg80211_crypto_settings *settings,
38 				   int cipher_limit);
39 
40 /* the netlink family */
41 static struct genl_family nl80211_fam;
42 
43 /* multicast groups */
44 enum nl80211_multicast_groups {
45 	NL80211_MCGRP_CONFIG,
46 	NL80211_MCGRP_SCAN,
47 	NL80211_MCGRP_REGULATORY,
48 	NL80211_MCGRP_MLME,
49 	NL80211_MCGRP_VENDOR,
50 	NL80211_MCGRP_NAN,
51 	NL80211_MCGRP_TESTMODE /* keep last - ifdef! */
52 };
53 
54 static const struct genl_multicast_group nl80211_mcgrps[] = {
55 	[NL80211_MCGRP_CONFIG] = { .name = NL80211_MULTICAST_GROUP_CONFIG },
56 	[NL80211_MCGRP_SCAN] = { .name = NL80211_MULTICAST_GROUP_SCAN },
57 	[NL80211_MCGRP_REGULATORY] = { .name = NL80211_MULTICAST_GROUP_REG },
58 	[NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME },
59 	[NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR },
60 	[NL80211_MCGRP_NAN] = { .name = NL80211_MULTICAST_GROUP_NAN },
61 #ifdef CONFIG_NL80211_TESTMODE
62 	[NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE }
63 #endif
64 };
65 
66 /* returns ERR_PTR values */
67 static struct wireless_dev *
68 __cfg80211_wdev_from_attrs(struct cfg80211_registered_device *rdev,
69 			   struct net *netns, struct nlattr **attrs)
70 {
71 	struct wireless_dev *result = NULL;
72 	bool have_ifidx = attrs[NL80211_ATTR_IFINDEX];
73 	bool have_wdev_id = attrs[NL80211_ATTR_WDEV];
74 	u64 wdev_id = 0;
75 	int wiphy_idx = -1;
76 	int ifidx = -1;
77 
78 	if (!have_ifidx && !have_wdev_id)
79 		return ERR_PTR(-EINVAL);
80 
81 	if (have_ifidx)
82 		ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
83 	if (have_wdev_id) {
84 		wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
85 		wiphy_idx = wdev_id >> 32;
86 	}
87 
88 	if (rdev) {
89 		struct wireless_dev *wdev;
90 
91 		lockdep_assert_held(&rdev->wiphy.mtx);
92 
93 		list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
94 			if (have_ifidx && wdev->netdev &&
95 			    wdev->netdev->ifindex == ifidx) {
96 				result = wdev;
97 				break;
98 			}
99 			if (have_wdev_id && wdev->identifier == (u32)wdev_id) {
100 				result = wdev;
101 				break;
102 			}
103 		}
104 
105 		return result ?: ERR_PTR(-ENODEV);
106 	}
107 
108 	ASSERT_RTNL();
109 
110 	for_each_rdev(rdev) {
111 		struct wireless_dev *wdev;
112 
113 		if (wiphy_net(&rdev->wiphy) != netns)
114 			continue;
115 
116 		if (have_wdev_id && rdev->wiphy_idx != wiphy_idx)
117 			continue;
118 
119 		list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
120 			if (have_ifidx && wdev->netdev &&
121 			    wdev->netdev->ifindex == ifidx) {
122 				result = wdev;
123 				break;
124 			}
125 			if (have_wdev_id && wdev->identifier == (u32)wdev_id) {
126 				result = wdev;
127 				break;
128 			}
129 		}
130 
131 		if (result)
132 			break;
133 	}
134 
135 	if (result)
136 		return result;
137 	return ERR_PTR(-ENODEV);
138 }
139 
140 static struct cfg80211_registered_device *
141 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs)
142 {
143 	struct cfg80211_registered_device *rdev = NULL, *tmp;
144 	struct net_device *netdev;
145 
146 	ASSERT_RTNL();
147 
148 	if (!attrs[NL80211_ATTR_WIPHY] &&
149 	    !attrs[NL80211_ATTR_IFINDEX] &&
150 	    !attrs[NL80211_ATTR_WDEV])
151 		return ERR_PTR(-EINVAL);
152 
153 	if (attrs[NL80211_ATTR_WIPHY])
154 		rdev = cfg80211_rdev_by_wiphy_idx(
155 				nla_get_u32(attrs[NL80211_ATTR_WIPHY]));
156 
157 	if (attrs[NL80211_ATTR_WDEV]) {
158 		u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
159 		struct wireless_dev *wdev;
160 		bool found = false;
161 
162 		tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32);
163 		if (tmp) {
164 			/* make sure wdev exists */
165 			list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) {
166 				if (wdev->identifier != (u32)wdev_id)
167 					continue;
168 				found = true;
169 				break;
170 			}
171 
172 			if (!found)
173 				tmp = NULL;
174 
175 			if (rdev && tmp != rdev)
176 				return ERR_PTR(-EINVAL);
177 			rdev = tmp;
178 		}
179 	}
180 
181 	if (attrs[NL80211_ATTR_IFINDEX]) {
182 		int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
183 
184 		netdev = __dev_get_by_index(netns, ifindex);
185 		if (netdev) {
186 			if (netdev->ieee80211_ptr)
187 				tmp = wiphy_to_rdev(
188 					netdev->ieee80211_ptr->wiphy);
189 			else
190 				tmp = NULL;
191 
192 			/* not wireless device -- return error */
193 			if (!tmp)
194 				return ERR_PTR(-EINVAL);
195 
196 			/* mismatch -- return error */
197 			if (rdev && tmp != rdev)
198 				return ERR_PTR(-EINVAL);
199 
200 			rdev = tmp;
201 		}
202 	}
203 
204 	if (!rdev)
205 		return ERR_PTR(-ENODEV);
206 
207 	if (netns != wiphy_net(&rdev->wiphy))
208 		return ERR_PTR(-ENODEV);
209 
210 	return rdev;
211 }
212 
213 /*
214  * This function returns a pointer to the driver
215  * that the genl_info item that is passed refers to.
216  *
217  * The result of this can be a PTR_ERR and hence must
218  * be checked with IS_ERR() for errors.
219  */
220 static struct cfg80211_registered_device *
221 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info)
222 {
223 	return __cfg80211_rdev_from_attrs(netns, info->attrs);
224 }
225 
226 static int validate_beacon_head(const struct nlattr *attr,
227 				struct netlink_ext_ack *extack)
228 {
229 	const u8 *data = nla_data(attr);
230 	unsigned int len = nla_len(attr);
231 	const struct element *elem;
232 	const struct ieee80211_mgmt *mgmt = (void *)data;
233 	const struct ieee80211_ext *ext;
234 	unsigned int fixedlen, hdrlen;
235 	bool s1g_bcn;
236 
237 	if (len < offsetofend(typeof(*mgmt), frame_control))
238 		goto err;
239 
240 	s1g_bcn = ieee80211_is_s1g_beacon(mgmt->frame_control);
241 	if (s1g_bcn) {
242 		ext = (struct ieee80211_ext *)mgmt;
243 		fixedlen =
244 			offsetof(struct ieee80211_ext, u.s1g_beacon.variable) +
245 			ieee80211_s1g_optional_len(ext->frame_control);
246 		hdrlen = offsetof(struct ieee80211_ext, u.s1g_beacon);
247 	} else {
248 		fixedlen = offsetof(struct ieee80211_mgmt,
249 				    u.beacon.variable);
250 		hdrlen = offsetof(struct ieee80211_mgmt, u.beacon);
251 	}
252 
253 	if (len < fixedlen)
254 		goto err;
255 
256 	if (ieee80211_hdrlen(mgmt->frame_control) != hdrlen)
257 		goto err;
258 
259 	data += fixedlen;
260 	len -= fixedlen;
261 
262 	for_each_element(elem, data, len) {
263 		/* nothing */
264 	}
265 
266 	if (for_each_element_completed(elem, data, len))
267 		return 0;
268 
269 err:
270 	NL_SET_ERR_MSG_ATTR(extack, attr, "malformed beacon head");
271 	return -EINVAL;
272 }
273 
274 static int validate_ie_attr(const struct nlattr *attr,
275 			    struct netlink_ext_ack *extack)
276 {
277 	const u8 *data = nla_data(attr);
278 	unsigned int len = nla_len(attr);
279 	const struct element *elem;
280 
281 	for_each_element(elem, data, len) {
282 		/* nothing */
283 	}
284 
285 	if (for_each_element_completed(elem, data, len))
286 		return 0;
287 
288 	NL_SET_ERR_MSG_ATTR(extack, attr, "malformed information elements");
289 	return -EINVAL;
290 }
291 
292 static int validate_he_capa(const struct nlattr *attr,
293 			    struct netlink_ext_ack *extack)
294 {
295 	if (!ieee80211_he_capa_size_ok(nla_data(attr), nla_len(attr)))
296 		return -EINVAL;
297 
298 	return 0;
299 }
300 
301 static int validate_supported_selectors(const struct nlattr *attr,
302 					struct netlink_ext_ack *extack)
303 {
304 	const u8 *supported_selectors = nla_data(attr);
305 	u8 supported_selectors_len = nla_len(attr);
306 
307 	/* The top bit must not be set as it is not part of the selector */
308 	for (int i = 0; i < supported_selectors_len; i++) {
309 		if (supported_selectors[i] & 0x80)
310 			return -EINVAL;
311 	}
312 
313 	return 0;
314 }
315 
316 static int validate_nan_cluster_id(const struct nlattr *attr,
317 				   struct netlink_ext_ack *extack)
318 {
319 	const u8 *data = nla_data(attr);
320 	unsigned int len = nla_len(attr);
321 	static const u8 cluster_id_prefix[4] = {0x50, 0x6f, 0x9a, 0x1};
322 
323 	if (len != ETH_ALEN) {
324 		NL_SET_ERR_MSG_ATTR(extack, attr, "bad cluster id length");
325 		return -EINVAL;
326 	}
327 
328 	if (memcmp(data, cluster_id_prefix, sizeof(cluster_id_prefix))) {
329 		NL_SET_ERR_MSG_ATTR(extack, attr, "invalid cluster id prefix");
330 		return -EINVAL;
331 	}
332 
333 	return 0;
334 }
335 
336 static int validate_nan_avail_blob(const struct nlattr *attr,
337 				   struct netlink_ext_ack *extack)
338 {
339 	const u8 *data = nla_data(attr);
340 	unsigned int len = nla_len(attr);
341 	u16 attr_len;
342 
343 	/* Need at least: Attr ID (1) + Length (2) */
344 	if (len < 3) {
345 		NL_SET_ERR_MSG_FMT(extack,
346 				   "NAN Availability: Too short (need at least 3 bytes, have %u)",
347 				   len);
348 		return -EINVAL;
349 	}
350 
351 	if (data[0] != 0x12) {
352 		NL_SET_ERR_MSG_FMT(extack,
353 				   "NAN Availability: Invalid Attribute ID 0x%02x (expected 0x12)",
354 				   data[0]);
355 		return -EINVAL;
356 	}
357 
358 	attr_len = get_unaligned_le16(&data[1]);
359 
360 	if (attr_len != len - 3) {
361 		NL_SET_ERR_MSG_FMT(extack,
362 				   "NAN Availability: Length field (%u) doesn't match data length (%u)",
363 				   attr_len, len - 3);
364 		return -EINVAL;
365 	}
366 
367 	return 0;
368 }
369 
370 static int validate_nan_ulw(const struct nlattr *attr,
371 			    struct netlink_ext_ack *extack)
372 {
373 	const u8 *data = nla_data(attr);
374 	unsigned int len = nla_len(attr);
375 	unsigned int pos = 0;
376 
377 	while (pos < len) {
378 		u16 attr_len;
379 
380 		/* Need at least: Attr ID (1) + Length (2) */
381 		if (pos + 3 > len) {
382 			NL_SET_ERR_MSG_FMT(extack,
383 					   "ULW: Incomplete header (need 3 bytes, have %u)",
384 					   len - pos);
385 			return -EINVAL;
386 		}
387 
388 		if (data[pos] != 0x17) {
389 			NL_SET_ERR_MSG_FMT(extack,
390 					   "ULW: Invalid Attribute ID 0x%02x (expected 0x17)",
391 					   data[pos]);
392 			return -EINVAL;
393 		}
394 		pos++;
395 
396 		/* Length is in little-endian format */
397 		attr_len = get_unaligned_le16(&data[pos]);
398 		pos += 2;
399 
400 		/*
401 		 * Check if length is one of the valid values: 16 (no
402 		 * channel/band entry included), 18 (band entry included),
403 		 * 21 (channel entry included without Auxiliary channel bitmap),
404 		 * or 23 (channel entry included with Auxiliary channel bitmap).
405 		 */
406 		if (attr_len != 16 && attr_len != 18 && attr_len != 21 &&
407 		    attr_len != 23) {
408 			NL_SET_ERR_MSG_FMT(extack,
409 					   "ULW: Invalid length %u (must be 16, 18, 21, or 23)",
410 					   attr_len);
411 			return -EINVAL;
412 		}
413 
414 		if (pos + attr_len > len) {
415 			NL_SET_ERR_MSG_FMT(extack,
416 					   "ULW: Length field (%u) exceeds remaining data (%u)",
417 					   attr_len, len - pos);
418 			return -EINVAL;
419 		}
420 
421 		pos += attr_len;
422 	}
423 
424 	return 0;
425 }
426 
427 static int validate_uhr_capa(const struct nlattr *attr,
428 			     struct netlink_ext_ack *extack)
429 {
430 	const u8 *data = nla_data(attr);
431 	unsigned int len = nla_len(attr);
432 
433 	if (!ieee80211_uhr_capa_size_ok(data, len, false))
434 		return -EINVAL;
435 	return 0;
436 }
437 
438 static int validate_uhr_operation(const struct nlattr *attr,
439 				  struct netlink_ext_ack *extack)
440 {
441 	const u8 *data = nla_data(attr);
442 	unsigned int len = nla_len(attr);
443 
444 	if (!ieee80211_uhr_oper_size_ok(data, len, false))
445 		return -EINVAL;
446 	return 0;
447 }
448 
449 /* policy for the attributes */
450 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR];
451 
452 static const struct nla_policy
453 nl80211_ftm_responder_policy[NL80211_FTM_RESP_ATTR_MAX + 1] = {
454 	[NL80211_FTM_RESP_ATTR_ENABLED] = { .type = NLA_FLAG, },
455 	[NL80211_FTM_RESP_ATTR_LCI] = { .type = NLA_BINARY,
456 					.len = U8_MAX },
457 	[NL80211_FTM_RESP_ATTR_CIVICLOC] = { .type = NLA_BINARY,
458 					     .len = U8_MAX },
459 };
460 
461 static const struct nla_policy
462 nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX + 1] = {
463 	[NL80211_PMSR_FTM_REQ_ATTR_ASAP] = { .type = NLA_FLAG },
464 	[NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE] =
465 		NLA_POLICY_RANGE(NLA_U32, NL80211_PREAMBLE_LEGACY,
466 				 NL80211_PREAMBLE_HE),
467 	[NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP] =
468 		NLA_POLICY_MAX(NLA_U8, 15),
469 	[NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD] = { .type = NLA_U16 },
470 	[NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION] =
471 		NLA_POLICY_MAX(NLA_U8, 15),
472 	[NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST] = { .type = NLA_U8 },
473 	[NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES] = { .type = NLA_U8 },
474 	[NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI] = { .type = NLA_FLAG },
475 	[NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG },
476 	[NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED] = { .type = NLA_FLAG },
477 	[NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED] = { .type = NLA_FLAG },
478 	[NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK] = { .type = NLA_FLAG },
479 	[NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR] = { .type = NLA_U8 },
480 	[NL80211_PMSR_FTM_REQ_ATTR_RSTA] = { .type = NLA_FLAG },
481 	[NL80211_PMSR_FTM_REQ_ATTR_MIN_TIME_BETWEEN_MEASUREMENTS] = {
482 		.type = NLA_U32
483 	},
484 	[NL80211_PMSR_FTM_REQ_ATTR_MAX_TIME_BETWEEN_MEASUREMENTS] = {
485 		.type = NLA_U32
486 	},
487 	[NL80211_PMSR_FTM_REQ_ATTR_NOMINAL_TIME] = { .type = NLA_U32 },
488 	[NL80211_PMSR_FTM_REQ_ATTR_AW_DURATION] = NLA_POLICY_MAX(NLA_U32, 255),
489 	[NL80211_PMSR_FTM_REQ_ATTR_NUM_MEASUREMENTS] = { .type = NLA_U32 },
490 	[NL80211_PMSR_FTM_REQ_ATTR_INGRESS] = { .type = NLA_U64 },
491 	[NL80211_PMSR_FTM_REQ_ATTR_EGRESS] = { .type = NLA_U64 },
492 	[NL80211_PMSR_FTM_REQ_ATTR_PD_SUPPRESS_RESULTS] = { .type = NLA_FLAG },
493 };
494 
495 static const struct nla_policy
496 nl80211_pmsr_req_data_policy[NL80211_PMSR_TYPE_MAX + 1] = {
497 	[NL80211_PMSR_TYPE_FTM] =
498 		NLA_POLICY_NESTED(nl80211_pmsr_ftm_req_attr_policy),
499 };
500 
501 static const struct nla_policy
502 nl80211_pmsr_req_attr_policy[NL80211_PMSR_REQ_ATTR_MAX + 1] = {
503 	[NL80211_PMSR_REQ_ATTR_DATA] =
504 		NLA_POLICY_NESTED(nl80211_pmsr_req_data_policy),
505 	[NL80211_PMSR_REQ_ATTR_GET_AP_TSF] = { .type = NLA_FLAG },
506 };
507 
508 static const struct nla_policy
509 nl80211_pmsr_peer_attr_policy[NL80211_PMSR_PEER_ATTR_MAX + 1] = {
510 	[NL80211_PMSR_PEER_ATTR_ADDR] = NLA_POLICY_ETH_ADDR,
511 	[NL80211_PMSR_PEER_ATTR_CHAN] = NLA_POLICY_NESTED(nl80211_policy),
512 	[NL80211_PMSR_PEER_ATTR_REQ] =
513 		NLA_POLICY_NESTED(nl80211_pmsr_req_attr_policy),
514 	[NL80211_PMSR_PEER_ATTR_RESP] = { .type = NLA_REJECT },
515 	[NL80211_PMSR_PEER_ATTR_REQ_TYPE] =
516 		NLA_POLICY_MAX(NLA_U32, NL80211_PMSR_FTM_REQ_TYPE_MAX),
517 };
518 
519 static const struct nla_policy
520 nl80211_pmsr_attr_policy[NL80211_PMSR_ATTR_MAX + 1] = {
521 	[NL80211_PMSR_ATTR_MAX_PEERS] = { .type = NLA_REJECT },
522 	[NL80211_PMSR_ATTR_REPORT_AP_TSF] = { .type = NLA_REJECT },
523 	[NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR] = { .type = NLA_REJECT },
524 	[NL80211_PMSR_ATTR_TYPE_CAPA] = { .type = NLA_REJECT },
525 	[NL80211_PMSR_ATTR_PEERS] =
526 		NLA_POLICY_NESTED_ARRAY(nl80211_pmsr_peer_attr_policy),
527 };
528 
529 static const struct nla_policy
530 he_obss_pd_policy[NL80211_HE_OBSS_PD_ATTR_MAX + 1] = {
531 	[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET] =
532 		NLA_POLICY_RANGE(NLA_U8, 1, 20),
533 	[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET] =
534 		NLA_POLICY_RANGE(NLA_U8, 1, 20),
535 	[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET] =
536 		NLA_POLICY_RANGE(NLA_U8, 1, 20),
537 	[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP] =
538 		NLA_POLICY_EXACT_LEN(8),
539 	[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP] =
540 		NLA_POLICY_EXACT_LEN(8),
541 	[NL80211_HE_OBSS_PD_ATTR_SR_CTRL] = { .type = NLA_U8 },
542 };
543 
544 static const struct nla_policy
545 he_bss_color_policy[NL80211_HE_BSS_COLOR_ATTR_MAX + 1] = {
546 	[NL80211_HE_BSS_COLOR_ATTR_COLOR] = NLA_POLICY_RANGE(NLA_U8, 1, 63),
547 	[NL80211_HE_BSS_COLOR_ATTR_DISABLED] = { .type = NLA_FLAG },
548 	[NL80211_HE_BSS_COLOR_ATTR_PARTIAL] = { .type = NLA_FLAG },
549 };
550 
551 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
552 	[NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY,
553 				    .len = NL80211_MAX_SUPP_RATES },
554 	[NL80211_TXRATE_HT] = { .type = NLA_BINARY,
555 				.len = NL80211_MAX_SUPP_HT_RATES },
556 	[NL80211_TXRATE_VHT] = NLA_POLICY_EXACT_LEN_WARN(sizeof(struct nl80211_txrate_vht)),
557 	[NL80211_TXRATE_GI] = { .type = NLA_U8 },
558 	[NL80211_TXRATE_HE] = NLA_POLICY_EXACT_LEN(sizeof(struct nl80211_txrate_he)),
559 	[NL80211_TXRATE_HE_GI] =  NLA_POLICY_RANGE(NLA_U8,
560 						   NL80211_RATE_INFO_HE_GI_0_8,
561 						   NL80211_RATE_INFO_HE_GI_3_2),
562 	[NL80211_TXRATE_HE_LTF] = NLA_POLICY_RANGE(NLA_U8,
563 						   NL80211_RATE_INFO_HE_1XLTF,
564 						   NL80211_RATE_INFO_HE_4XLTF),
565 	[NL80211_TXRATE_EHT] = NLA_POLICY_EXACT_LEN(sizeof(struct nl80211_txrate_eht)),
566 	[NL80211_TXRATE_EHT_GI] =  NLA_POLICY_RANGE(NLA_U8,
567 						   NL80211_RATE_INFO_EHT_GI_0_8,
568 						   NL80211_RATE_INFO_EHT_GI_3_2),
569 	[NL80211_TXRATE_EHT_LTF] = NLA_POLICY_RANGE(NLA_U8,
570 						   NL80211_RATE_INFO_EHT_1XLTF,
571 						   NL80211_RATE_INFO_EHT_8XLTF),
572 
573 };
574 
575 static const struct nla_policy
576 nl80211_tid_config_attr_policy[NL80211_TID_CONFIG_ATTR_MAX + 1] = {
577 	[NL80211_TID_CONFIG_ATTR_VIF_SUPP] = { .type = NLA_U64 },
578 	[NL80211_TID_CONFIG_ATTR_PEER_SUPP] = { .type = NLA_U64 },
579 	[NL80211_TID_CONFIG_ATTR_OVERRIDE] = { .type = NLA_FLAG },
580 	[NL80211_TID_CONFIG_ATTR_TIDS] = NLA_POLICY_RANGE(NLA_U16, 1, 0xff),
581 	[NL80211_TID_CONFIG_ATTR_NOACK] =
582 			NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE),
583 	[NL80211_TID_CONFIG_ATTR_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1),
584 	[NL80211_TID_CONFIG_ATTR_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1),
585 	[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL] =
586 			NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE),
587 	[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL] =
588 			NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE),
589 	[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL] =
590 			NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE),
591 	[NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE] =
592 			NLA_POLICY_MAX(NLA_U8, NL80211_TX_RATE_FIXED),
593 	[NL80211_TID_CONFIG_ATTR_TX_RATE] =
594 			NLA_POLICY_NESTED(nl80211_txattr_policy),
595 };
596 
597 static const struct nla_policy
598 nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = {
599 	[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] = NLA_POLICY_MAX(NLA_U32, 10000),
600 	[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] = NLA_POLICY_MAX(NLA_U32, 10000),
601 	[NL80211_FILS_DISCOVERY_ATTR_TMPL] =
602 			NLA_POLICY_RANGE(NLA_BINARY,
603 					 NL80211_FILS_DISCOVERY_TMPL_MIN_LEN,
604 					 IEEE80211_MAX_DATA_LEN),
605 };
606 
607 static const struct nla_policy
608 nl80211_unsol_bcast_probe_resp_policy[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1] = {
609 	[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] = NLA_POLICY_MAX(NLA_U32, 20),
610 	[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL] = { .type = NLA_BINARY,
611 						       .len = IEEE80211_MAX_DATA_LEN }
612 };
613 
614 static const struct nla_policy
615 sar_specs_policy[NL80211_SAR_ATTR_SPECS_MAX + 1] = {
616 	[NL80211_SAR_ATTR_SPECS_POWER] = { .type = NLA_S32 },
617 	[NL80211_SAR_ATTR_SPECS_RANGE_INDEX] = {.type = NLA_U32 },
618 };
619 
620 static const struct nla_policy
621 sar_policy[NL80211_SAR_ATTR_MAX + 1] = {
622 	[NL80211_SAR_ATTR_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_SAR_TYPE),
623 	[NL80211_SAR_ATTR_SPECS] = NLA_POLICY_NESTED_ARRAY(sar_specs_policy),
624 };
625 
626 static const struct nla_policy
627 nl80211_mbssid_config_policy[NL80211_MBSSID_CONFIG_ATTR_MAX + 1] = {
628 	[NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES] = NLA_POLICY_MIN(NLA_U8, 2),
629 	[NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY] =
630 						NLA_POLICY_MIN(NLA_U8, 1),
631 	[NL80211_MBSSID_CONFIG_ATTR_INDEX] = { .type = NLA_U8 },
632 	[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX] = { .type = NLA_U32 },
633 	[NL80211_MBSSID_CONFIG_ATTR_EMA] = { .type = NLA_FLAG },
634 	[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID] =
635 		NLA_POLICY_RANGE(NLA_U8, 0, IEEE80211_MLD_MAX_NUM_LINKS - 1),
636 };
637 
638 static const struct nla_policy
639 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = {
640 	[NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 },
641 	[NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 },
642 };
643 
644 static const struct nla_policy
645 nl80211_s1g_short_beacon[NL80211_S1G_SHORT_BEACON_ATTR_MAX + 1] = {
646 	[NL80211_S1G_SHORT_BEACON_ATTR_HEAD] =
647 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head,
648 				       IEEE80211_MAX_DATA_LEN),
649 	[NL80211_S1G_SHORT_BEACON_ATTR_TAIL] =
650 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
651 				       IEEE80211_MAX_DATA_LEN),
652 };
653 
654 static const struct nla_policy
655 nl80211_nan_band_conf_policy[NL80211_NAN_BAND_CONF_ATTR_MAX + 1] = {
656 	[NL80211_NAN_BAND_CONF_BAND] = NLA_POLICY_MAX(NLA_U8,
657 						      NUM_NL80211_BANDS - 1),
658 	[NL80211_NAN_BAND_CONF_FREQ] = { .type = NLA_U16 },
659 	[NL80211_NAN_BAND_CONF_RSSI_CLOSE] = NLA_POLICY_MIN(NLA_S8, -59),
660 	[NL80211_NAN_BAND_CONF_RSSI_MIDDLE] = NLA_POLICY_MIN(NLA_S8, -74),
661 	[NL80211_NAN_BAND_CONF_WAKE_DW] = NLA_POLICY_MAX(NLA_U8, 5),
662 	[NL80211_NAN_BAND_CONF_DISABLE_SCAN] = { .type = NLA_FLAG },
663 };
664 
665 static const struct nla_policy
666 nl80211_nan_peer_map_policy[NL80211_NAN_PEER_MAP_ATTR_MAX + 1] = {
667 	[NL80211_NAN_PEER_MAP_ATTR_MAP_ID] = NLA_POLICY_MAX(NLA_U8, 15),
668 	[NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS] =
669 		NLA_POLICY_EXACT_LEN(CFG80211_NAN_SCHED_NUM_TIME_SLOTS),
670 };
671 
672 static const struct nla_policy
673 nl80211_nan_conf_policy[NL80211_NAN_CONF_ATTR_MAX + 1] = {
674 	[NL80211_NAN_CONF_CLUSTER_ID] =
675 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_nan_cluster_id,
676 				       ETH_ALEN),
677 	[NL80211_NAN_CONF_EXTRA_ATTRS] = { .type = NLA_BINARY,
678 					   .len = IEEE80211_MAX_DATA_LEN},
679 	[NL80211_NAN_CONF_VENDOR_ELEMS] =
680 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
681 				       IEEE80211_MAX_DATA_LEN),
682 	[NL80211_NAN_CONF_BAND_CONFIGS] =
683 		NLA_POLICY_NESTED_ARRAY(nl80211_nan_band_conf_policy),
684 	[NL80211_NAN_CONF_SCAN_PERIOD] = { .type = NLA_U16 },
685 	[NL80211_NAN_CONF_SCAN_DWELL_TIME] = NLA_POLICY_RANGE(NLA_U16, 50, 512),
686 	[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL] =
687 		NLA_POLICY_RANGE(NLA_U8, 50, 200),
688 	[NL80211_NAN_CONF_NOTIFY_DW] = { .type = NLA_FLAG },
689 };
690 
691 static const struct netlink_range_validation nl80211_punct_bitmap_range = {
692 	.min = 0,
693 	.max = 0xffff,
694 };
695 
696 static const struct netlink_range_validation q_range = {
697 	.max = INT_MAX,
698 };
699 
700 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
701 	[0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD },
702 	[NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
703 	[NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
704 				      .len = 20-1 },
705 	[NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED },
706 
707 	[NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 },
708 	[NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 },
709 	[NL80211_ATTR_WIPHY_EDMG_CHANNELS] = NLA_POLICY_RANGE(NLA_U8,
710 						NL80211_EDMG_CHANNELS_MIN,
711 						NL80211_EDMG_CHANNELS_MAX),
712 	[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG] = NLA_POLICY_RANGE(NLA_U8,
713 						NL80211_EDMG_BW_CONFIG_MIN,
714 						NL80211_EDMG_BW_CONFIG_MAX),
715 
716 	[NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 },
717 	[NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 },
718 	[NL80211_ATTR_CENTER_FREQ1_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999),
719 	[NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 },
720 
721 	[NL80211_ATTR_WIPHY_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1),
722 	[NL80211_ATTR_WIPHY_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1),
723 	[NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 },
724 	[NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 },
725 	[NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 },
726 	[NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG },
727 
728 	[NL80211_ATTR_IFTYPE] = NLA_POLICY_MAX(NLA_U32, NL80211_IFTYPE_MAX),
729 	[NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
730 	[NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
731 
732 	[NL80211_ATTR_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
733 	[NL80211_ATTR_PREV_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
734 
735 	[NL80211_ATTR_KEY] = { .type = NLA_NESTED, },
736 	[NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
737 				    .len = WLAN_MAX_KEY_LEN },
738 	[NL80211_ATTR_KEY_IDX] = NLA_POLICY_MAX(NLA_U8, 7),
739 	[NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 },
740 	[NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG },
741 	[NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
742 	[NL80211_ATTR_KEY_TYPE] =
743 		NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES),
744 
745 	[NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 },
746 	[NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 },
747 	[NL80211_ATTR_BEACON_HEAD] =
748 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head,
749 				       IEEE80211_MAX_DATA_LEN),
750 	[NL80211_ATTR_BEACON_TAIL] =
751 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
752 				       IEEE80211_MAX_DATA_LEN),
753 	[NL80211_ATTR_STA_AID] =
754 		NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
755 	[NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED },
756 	[NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 },
757 	[NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY,
758 					       .len = NL80211_MAX_SUPP_RATES },
759 	[NL80211_ATTR_STA_PLINK_ACTION] =
760 		NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1),
761 	[NL80211_ATTR_STA_TX_POWER_SETTING] =
762 		NLA_POLICY_RANGE(NLA_U8,
763 				 NL80211_TX_POWER_AUTOMATIC,
764 				 NL80211_TX_POWER_FIXED),
765 	[NL80211_ATTR_STA_TX_POWER] = { .type = NLA_S16 },
766 	[NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 },
767 	[NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
768 	[NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
769 				   .len = IEEE80211_MAX_MESH_ID_LEN },
770 	[NL80211_ATTR_MPATH_NEXT_HOP] = NLA_POLICY_ETH_ADDR_COMPAT,
771 
772 	/* allow 3 for NUL-termination, we used to declare this NLA_STRING */
773 	[NL80211_ATTR_REG_ALPHA2] = NLA_POLICY_RANGE(NLA_BINARY, 2, 3),
774 	[NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
775 
776 	[NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
777 	[NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
778 	[NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
779 	[NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY,
780 					   .len = NL80211_MAX_SUPP_RATES },
781 	[NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 },
782 
783 	[NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED },
784 	[NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG },
785 
786 	[NL80211_ATTR_HT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_HT_CAPABILITY_LEN),
787 
788 	[NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
789 	[NL80211_ATTR_IE] = NLA_POLICY_VALIDATE_FN(NLA_BINARY,
790 						   validate_ie_attr,
791 						   IEEE80211_MAX_DATA_LEN),
792 	[NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
793 	[NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
794 
795 	[NL80211_ATTR_SSID] = { .type = NLA_BINARY,
796 				.len = IEEE80211_MAX_SSID_LEN },
797 	[NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
798 	[NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
799 	[NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
800 	[NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
801 	[NL80211_ATTR_USE_MFP] = NLA_POLICY_RANGE(NLA_U32,
802 						  NL80211_MFP_NO,
803 						  NL80211_MFP_OPTIONAL),
804 	[NL80211_ATTR_STA_FLAGS2] =
805 		NLA_POLICY_EXACT_LEN_WARN(sizeof(struct nl80211_sta_flag_update)),
806 	[NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
807 	[NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 },
808 	[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG },
809 	[NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG },
810 	[NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG },
811 	[NL80211_ATTR_STATUS_CODE] = { .type = NLA_U16 },
812 	[NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 },
813 	[NL80211_ATTR_WPA_VERSIONS] =
814 		NLA_POLICY_RANGE(NLA_U32, 0,
815 				 NL80211_WPA_VERSION_1 |
816 				 NL80211_WPA_VERSION_2 |
817 				 NL80211_WPA_VERSION_3),
818 	[NL80211_ATTR_PID] = { .type = NLA_U32 },
819 	[NL80211_ATTR_4ADDR] = { .type = NLA_U8 },
820 	[NL80211_ATTR_PMKID] = NLA_POLICY_EXACT_LEN_WARN(WLAN_PMKID_LEN),
821 	[NL80211_ATTR_DURATION] = { .type = NLA_U32 },
822 	[NL80211_ATTR_COOKIE] = { .type = NLA_U64 },
823 	[NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED },
824 	[NL80211_ATTR_FRAME] = { .type = NLA_BINARY,
825 				 .len = IEEE80211_MAX_DATA_LEN },
826 	[NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, },
827 	[NL80211_ATTR_PS_STATE] = NLA_POLICY_RANGE(NLA_U32,
828 						   NL80211_PS_DISABLED,
829 						   NL80211_PS_ENABLED),
830 	[NL80211_ATTR_CQM] = { .type = NLA_NESTED, },
831 	[NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG },
832 	[NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 },
833 	[NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
834 	[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
835 	[NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
836 	[NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 },
837 	[NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 },
838 	[NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 },
839 	[NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG },
840 	[NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
841 	[NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED },
842 	[NL80211_ATTR_STA_PLINK_STATE] =
843 		NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1),
844 	[NL80211_ATTR_MEASUREMENT_DURATION] = { .type = NLA_U16 },
845 	[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY] = { .type = NLA_FLAG },
846 	[NL80211_ATTR_MESH_PEER_AID] =
847 		NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
848 	[NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 },
849 	[NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED },
850 	[NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED },
851 	[NL80211_ATTR_HIDDEN_SSID] =
852 		NLA_POLICY_RANGE(NLA_U32,
853 				 NL80211_HIDDEN_SSID_NOT_IN_USE,
854 				 NL80211_HIDDEN_SSID_ZERO_CONTENTS),
855 	[NL80211_ATTR_IE_PROBE_RESP] =
856 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
857 				       IEEE80211_MAX_DATA_LEN),
858 	[NL80211_ATTR_IE_ASSOC_RESP] =
859 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
860 				       IEEE80211_MAX_DATA_LEN),
861 	[NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG },
862 	[NL80211_ATTR_STA_WME] = NLA_POLICY_NESTED(nl80211_sta_wme_policy),
863 	[NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED },
864 	[NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG },
865 	[NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 },
866 	[NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 },
867 	[NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 },
868 	[NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG },
869 	[NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG },
870 	[NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG },
871 	[NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
872 	[NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
873 				      .len = IEEE80211_MAX_DATA_LEN },
874 	[NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 },
875 	[NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG },
876 	[NL80211_ATTR_HT_CAPABILITY_MASK] = {
877 		.len = NL80211_HT_CAPABILITY_LEN
878 	},
879 	[NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 },
880 	[NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 },
881 	[NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 },
882 	[NL80211_ATTR_WDEV] = { .type = NLA_U64 },
883 	[NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 },
884 
885 	/* need to include at least Auth Transaction and Status Code */
886 	[NL80211_ATTR_AUTH_DATA] = NLA_POLICY_MIN_LEN(4),
887 
888 	[NL80211_ATTR_VHT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_VHT_CAPABILITY_LEN),
889 	[NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
890 	[NL80211_ATTR_P2P_CTWINDOW] = NLA_POLICY_MAX(NLA_U8, 127),
891 	[NL80211_ATTR_P2P_OPPPS] = NLA_POLICY_MAX(NLA_U8, 1),
892 	[NL80211_ATTR_LOCAL_MESH_POWER_MODE] =
893 		NLA_POLICY_RANGE(NLA_U32,
894 				 NL80211_MESH_POWER_UNKNOWN + 1,
895 				 NL80211_MESH_POWER_MAX),
896 	[NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 },
897 	[NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
898 	[NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
899 	[NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, },
900 	[NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, },
901 	[NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG },
902 	[NL80211_ATTR_VHT_CAPABILITY_MASK] = {
903 		.len = NL80211_VHT_CAPABILITY_LEN,
904 	},
905 	[NL80211_ATTR_MDID] = { .type = NLA_U16 },
906 	[NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
907 				  .len = IEEE80211_MAX_DATA_LEN },
908 	[NL80211_ATTR_CRIT_PROT_ID] = { .type = NLA_U16 },
909 	[NL80211_ATTR_MAX_CRIT_PROT_DURATION] =
910 		NLA_POLICY_MAX(NLA_U16, NL80211_CRIT_PROTO_MAX_DURATION),
911 	[NL80211_ATTR_PEER_AID] =
912 		NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
913 	[NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 },
914 	[NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG },
915 	[NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
916 	[NL80211_ATTR_CNTDWN_OFFS_BEACON] = { .type = NLA_BINARY },
917 	[NL80211_ATTR_CNTDWN_OFFS_PRESP] = { .type = NLA_BINARY },
918 	[NL80211_ATTR_STA_SUPPORTED_CHANNELS] = NLA_POLICY_MIN_LEN(2),
919 	/*
920 	 * The value of the Length field of the Supported Operating
921 	 * Classes element is between 2 and 253.
922 	 */
923 	[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] =
924 		NLA_POLICY_RANGE(NLA_BINARY, 2, 253),
925 	[NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG },
926 	[NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 },
927 	[NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 },
928 	[NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 },
929 	[NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
930 	[NL80211_ATTR_QOS_MAP] = NLA_POLICY_RANGE(NLA_BINARY,
931 						  IEEE80211_QOS_MAP_LEN_MIN,
932 						  IEEE80211_QOS_MAP_LEN_MAX),
933 	[NL80211_ATTR_MAC_HINT] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
934 	[NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 },
935 	[NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 },
936 	[NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG },
937 	[NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY },
938 	[NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG },
939 	[NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1),
940 	[NL80211_ATTR_USER_PRIO] =
941 		NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1),
942 	[NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 },
943 	[NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 },
944 	[NL80211_ATTR_OPER_CLASS] = { .type = NLA_U8 },
945 	[NL80211_ATTR_MAC_MASK] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
946 	[NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG },
947 	[NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 },
948 	[NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 },
949 	[NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG },
950 	[NL80211_ATTR_PBSS] = { .type = NLA_FLAG },
951 	[NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED },
952 	[NL80211_ATTR_STA_SUPPORT_P2P_PS] =
953 		NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1),
954 	[NL80211_ATTR_MU_MIMO_GROUP_DATA] = {
955 		.len = VHT_MUMIMO_GROUPS_DATA_LEN
956 	},
957 	[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
958 	[NL80211_ATTR_NAN_MASTER_PREF] = NLA_POLICY_MIN(NLA_U8, 1),
959 	[NL80211_ATTR_BANDS] = { .type = NLA_U32 },
960 	[NL80211_ATTR_NAN_CONFIG] = NLA_POLICY_NESTED(nl80211_nan_conf_policy),
961 	[NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED },
962 	[NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY,
963 				    .len = FILS_MAX_KEK_LEN },
964 	[NL80211_ATTR_FILS_NONCES] = NLA_POLICY_EXACT_LEN_WARN(2 * FILS_NONCE_LEN),
965 	[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, },
966 	[NL80211_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
967 	[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 },
968 	[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = {
969 		.len = sizeof(struct nl80211_bss_select_rssi_adjust)
970 	},
971 	[NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 },
972 	[NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY,
973 					     .len = FILS_ERP_MAX_USERNAME_LEN },
974 	[NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY,
975 					  .len = FILS_ERP_MAX_REALM_LEN },
976 	[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 },
977 	[NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY,
978 					.len = FILS_ERP_MAX_RRK_LEN },
979 	[NL80211_ATTR_FILS_CACHE_ID] = NLA_POLICY_EXACT_LEN_WARN(2),
980 	[NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN },
981 	[NL80211_ATTR_PMKR0_NAME] = NLA_POLICY_EXACT_LEN(WLAN_PMK_NAME_LEN),
982 	[NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG },
983 	[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG },
984 
985 	[NL80211_ATTR_TXQ_LIMIT] = { .type = NLA_U32 },
986 	[NL80211_ATTR_TXQ_MEMORY_LIMIT] = { .type = NLA_U32 },
987 	[NL80211_ATTR_TXQ_QUANTUM] = NLA_POLICY_FULL_RANGE(NLA_U32, &q_range),
988 	[NL80211_ATTR_HE_CAPABILITY] =
989 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_he_capa,
990 				       NL80211_HE_MAX_CAPABILITY_LEN),
991 	[NL80211_ATTR_FTM_RESPONDER] =
992 		NLA_POLICY_NESTED(nl80211_ftm_responder_policy),
993 	[NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1),
994 	[NL80211_ATTR_PEER_MEASUREMENTS] =
995 		NLA_POLICY_NESTED(nl80211_pmsr_attr_policy),
996 	[NL80211_ATTR_AIRTIME_WEIGHT] = NLA_POLICY_MIN(NLA_U16, 1),
997 	[NL80211_ATTR_SAE_PASSWORD] = { .type = NLA_BINARY,
998 					.len = SAE_PASSWORD_MAX_LEN },
999 	[NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG },
1000 	[NL80211_ATTR_HE_OBSS_PD] = NLA_POLICY_NESTED(he_obss_pd_policy),
1001 	[NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2),
1002 	[NL80211_ATTR_HE_BSS_COLOR] = NLA_POLICY_NESTED(he_bss_color_policy),
1003 	[NL80211_ATTR_TID_CONFIG] =
1004 		NLA_POLICY_NESTED_ARRAY(nl80211_tid_config_attr_policy),
1005 	[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH] = { .type = NLA_FLAG },
1006 	[NL80211_ATTR_PMK_LIFETIME] = NLA_POLICY_MIN(NLA_U32, 1),
1007 	[NL80211_ATTR_PMK_REAUTH_THRESHOLD] = NLA_POLICY_RANGE(NLA_U8, 1, 100),
1008 	[NL80211_ATTR_RECEIVE_MULTICAST] = { .type = NLA_FLAG },
1009 	[NL80211_ATTR_WIPHY_FREQ_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999),
1010 	[NL80211_ATTR_SCAN_FREQ_KHZ] = { .type = NLA_NESTED },
1011 	[NL80211_ATTR_HE_6GHZ_CAPABILITY] =
1012 		NLA_POLICY_EXACT_LEN(sizeof(struct ieee80211_he_6ghz_capa)),
1013 	[NL80211_ATTR_FILS_DISCOVERY] =
1014 		NLA_POLICY_NESTED(nl80211_fils_discovery_policy),
1015 	[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP] =
1016 		NLA_POLICY_NESTED(nl80211_unsol_bcast_probe_resp_policy),
1017 	[NL80211_ATTR_S1G_CAPABILITY] =
1018 		NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN),
1019 	[NL80211_ATTR_S1G_CAPABILITY_MASK] =
1020 		NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN),
1021 	[NL80211_ATTR_SAE_PWE] =
1022 		NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK,
1023 				 NL80211_SAE_PWE_BOTH),
1024 	[NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT },
1025 	[NL80211_ATTR_SAR_SPEC] = NLA_POLICY_NESTED(sar_policy),
1026 	[NL80211_ATTR_DISABLE_HE] = { .type = NLA_FLAG },
1027 	[NL80211_ATTR_OBSS_COLOR_BITMAP] = { .type = NLA_U64 },
1028 	[NL80211_ATTR_COLOR_CHANGE_COUNT] = { .type = NLA_U8 },
1029 	[NL80211_ATTR_COLOR_CHANGE_COLOR] = { .type = NLA_U8 },
1030 	[NL80211_ATTR_COLOR_CHANGE_ELEMS] = NLA_POLICY_NESTED(nl80211_policy),
1031 	[NL80211_ATTR_MBSSID_CONFIG] =
1032 			NLA_POLICY_NESTED(nl80211_mbssid_config_policy),
1033 	[NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED },
1034 	[NL80211_ATTR_RADAR_BACKGROUND] = { .type = NLA_FLAG },
1035 	[NL80211_ATTR_AP_SETTINGS_FLAGS] = { .type = NLA_U32 },
1036 	[NL80211_ATTR_EHT_CAPABILITY] =
1037 		NLA_POLICY_RANGE(NLA_BINARY,
1038 				 NL80211_EHT_MIN_CAPABILITY_LEN,
1039 				 NL80211_EHT_MAX_CAPABILITY_LEN),
1040 	[NL80211_ATTR_DISABLE_EHT] = { .type = NLA_FLAG },
1041 	[NL80211_ATTR_MLO_LINKS] =
1042 		NLA_POLICY_NESTED_ARRAY(nl80211_policy),
1043 	[NL80211_ATTR_MLO_LINK_ID] =
1044 		NLA_POLICY_RANGE(NLA_U8, 0, IEEE80211_MLD_MAX_NUM_LINKS - 1),
1045 	[NL80211_ATTR_MLD_ADDR] = NLA_POLICY_EXACT_LEN(ETH_ALEN),
1046 	[NL80211_ATTR_MLO_SUPPORT] = { .type = NLA_FLAG },
1047 	[NL80211_ATTR_MAX_NUM_AKM_SUITES] = { .type = NLA_REJECT },
1048 	[NL80211_ATTR_EML_CAPABILITY] = { .type = NLA_U16 },
1049 	[NL80211_ATTR_PUNCT_BITMAP] =
1050 		NLA_POLICY_FULL_RANGE(NLA_U32, &nl80211_punct_bitmap_range),
1051 
1052 	[NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS] = { .type = NLA_U16 },
1053 	[NL80211_ATTR_HW_TIMESTAMP_ENABLED] = { .type = NLA_FLAG },
1054 	[NL80211_ATTR_EMA_RNR_ELEMS] = { .type = NLA_NESTED },
1055 	[NL80211_ATTR_MLO_LINK_DISABLED] = { .type = NLA_FLAG },
1056 	[NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA] = { .type = NLA_FLAG },
1057 	[NL80211_ATTR_MLO_TTLM_DLINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8),
1058 	[NL80211_ATTR_MLO_TTLM_ULINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8),
1059 	[NL80211_ATTR_ASSOC_SPP_AMSDU] = { .type = NLA_FLAG },
1060 	[NL80211_ATTR_VIF_RADIO_MASK] = { .type = NLA_U32 },
1061 	[NL80211_ATTR_SUPPORTED_SELECTORS] =
1062 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_supported_selectors,
1063 				       NL80211_MAX_SUPP_SELECTORS),
1064 	[NL80211_ATTR_MLO_RECONF_REM_LINKS] = { .type = NLA_U16 },
1065 	[NL80211_ATTR_EPCS] = { .type = NLA_FLAG },
1066 	[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS] = { .type = NLA_U16 },
1067 	[NL80211_ATTR_WIPHY_RADIO_INDEX] = { .type = NLA_U8 },
1068 	[NL80211_ATTR_S1G_LONG_BEACON_PERIOD] = NLA_POLICY_MIN(NLA_U8, 2),
1069 	[NL80211_ATTR_S1G_SHORT_BEACON] =
1070 		NLA_POLICY_NESTED(nl80211_s1g_short_beacon),
1071 	[NL80211_ATTR_BSS_PARAM] = { .type = NLA_FLAG },
1072 	[NL80211_ATTR_S1G_PRIMARY_2MHZ] = { .type = NLA_FLAG },
1073 	[NL80211_ATTR_EPP_PEER] = { .type = NLA_FLAG },
1074 	[NL80211_ATTR_UHR_CAPABILITY] =
1075 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_uhr_capa, 255),
1076 	[NL80211_ATTR_DISABLE_UHR] = { .type = NLA_FLAG },
1077 	[NL80211_ATTR_UHR_OPERATION] =
1078 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_uhr_operation),
1079 	[NL80211_ATTR_NAN_CHANNEL] = NLA_POLICY_NESTED(nl80211_policy),
1080 	[NL80211_ATTR_NAN_CHANNEL_ENTRY] = NLA_POLICY_EXACT_LEN(6),
1081 	[NL80211_ATTR_NAN_RX_NSS] = { .type = NLA_U8 },
1082 	[NL80211_ATTR_NAN_TIME_SLOTS] =
1083 		NLA_POLICY_EXACT_LEN(CFG80211_NAN_SCHED_NUM_TIME_SLOTS),
1084 	[NL80211_ATTR_NAN_AVAIL_BLOB] =
1085 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_nan_avail_blob),
1086 	[NL80211_ATTR_NAN_SCHED_DEFERRED] = { .type = NLA_FLAG },
1087 	[NL80211_ATTR_NAN_NMI_MAC] = NLA_POLICY_ETH_ADDR,
1088 	[NL80211_ATTR_NAN_ULW] =
1089 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_nan_ulw),
1090 	[NL80211_ATTR_NAN_COMMITTED_DW] = { .type = NLA_U16 },
1091 	[NL80211_ATTR_NAN_SEQ_ID] = { .type = NLA_U8 },
1092 	[NL80211_ATTR_NAN_MAX_CHAN_SWITCH_TIME] = { .type = NLA_U16 },
1093 	[NL80211_ATTR_NAN_PEER_MAPS] =
1094 		NLA_POLICY_NESTED_ARRAY(nl80211_nan_peer_map_policy),
1095 	[NL80211_ATTR_NPCA_PRIMARY_FREQ] = { .type = NLA_U32 },
1096 	[NL80211_ATTR_NPCA_PUNCT_BITMAP] =
1097 		NLA_POLICY_FULL_RANGE(NLA_U32, &nl80211_punct_bitmap_range),
1098 };
1099 
1100 /* policy for the key attributes */
1101 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
1102 	[NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
1103 	[NL80211_KEY_IDX] = { .type = NLA_U8 },
1104 	[NL80211_KEY_CIPHER] = { .type = NLA_U32 },
1105 	[NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
1106 	[NL80211_KEY_DEFAULT] = { .type = NLA_FLAG },
1107 	[NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG },
1108 	[NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
1109 	[NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
1110 	[NL80211_KEY_MODE] = NLA_POLICY_RANGE(NLA_U8, 0, NL80211_KEY_SET_TX),
1111 	[NL80211_KEY_LTF_SEED] = {
1112 		.type = NLA_BINARY,
1113 		.len = WLAN_MAX_SECURE_LTF_KEYSEED_LEN,
1114 	},
1115 };
1116 
1117 /* policy for the key default flags */
1118 static const struct nla_policy
1119 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = {
1120 	[NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG },
1121 	[NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG },
1122 };
1123 
1124 #ifdef CONFIG_PM
1125 /* policy for WoWLAN attributes */
1126 static const struct nla_policy
1127 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = {
1128 	[NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG },
1129 	[NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG },
1130 	[NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG },
1131 	[NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED },
1132 	[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG },
1133 	[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG },
1134 	[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG },
1135 	[NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG },
1136 	[NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED },
1137 	[NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED },
1138 };
1139 
1140 static const struct nla_policy
1141 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = {
1142 	[NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 },
1143 	[NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 },
1144 	[NL80211_WOWLAN_TCP_DST_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
1145 	[NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 },
1146 	[NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 },
1147 	[NL80211_WOWLAN_TCP_DATA_PAYLOAD] = NLA_POLICY_MIN_LEN(1),
1148 	[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = {
1149 		.len = sizeof(struct nl80211_wowlan_tcp_data_seq)
1150 	},
1151 	[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = {
1152 		.len = sizeof(struct nl80211_wowlan_tcp_data_token)
1153 	},
1154 	[NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 },
1155 	[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = NLA_POLICY_MIN_LEN(1),
1156 	[NL80211_WOWLAN_TCP_WAKE_MASK] = NLA_POLICY_MIN_LEN(1),
1157 };
1158 #endif /* CONFIG_PM */
1159 
1160 /* policy for coalesce rule attributes */
1161 static const struct nla_policy
1162 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = {
1163 	[NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 },
1164 	[NL80211_ATTR_COALESCE_RULE_CONDITION] =
1165 		NLA_POLICY_RANGE(NLA_U32,
1166 				 NL80211_COALESCE_CONDITION_MATCH,
1167 				 NL80211_COALESCE_CONDITION_NO_MATCH),
1168 	[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED },
1169 };
1170 
1171 /* policy for GTK rekey offload attributes */
1172 static const struct nla_policy
1173 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
1174 	[NL80211_REKEY_DATA_KEK] = {
1175 		.type = NLA_BINARY,
1176 		.len = NL80211_KEK_EXT_LEN
1177 	},
1178 	[NL80211_REKEY_DATA_KCK] = {
1179 		.type = NLA_BINARY,
1180 		.len = NL80211_KCK_EXT_LEN_32
1181 	},
1182 	[NL80211_REKEY_DATA_REPLAY_CTR] = NLA_POLICY_EXACT_LEN(NL80211_REPLAY_CTR_LEN),
1183 	[NL80211_REKEY_DATA_AKM] = { .type = NLA_U32 },
1184 };
1185 
1186 static const struct nla_policy
1187 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = {
1188 	[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY,
1189 						 .len = IEEE80211_MAX_SSID_LEN },
1190 	[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
1191 	[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 },
1192 };
1193 
1194 static const struct nla_policy
1195 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = {
1196 	[NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 },
1197 	[NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 },
1198 };
1199 
1200 static const struct nla_policy
1201 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = {
1202 	[NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG },
1203 	[NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 },
1204 	[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = {
1205 		.len = sizeof(struct nl80211_bss_select_rssi_adjust)
1206 	},
1207 };
1208 
1209 /* policy for NAN function attributes */
1210 static const struct nla_policy
1211 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = {
1212 	[NL80211_NAN_FUNC_TYPE] =
1213 		NLA_POLICY_MAX(NLA_U8, NL80211_NAN_FUNC_MAX_TYPE),
1214 	[NL80211_NAN_FUNC_SERVICE_ID] = {
1215 				    .len = NL80211_NAN_FUNC_SERVICE_ID_LEN },
1216 	[NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 },
1217 	[NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG },
1218 	[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG },
1219 	[NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 },
1220 	[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 },
1221 	[NL80211_NAN_FUNC_FOLLOW_UP_DEST] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
1222 	[NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG },
1223 	[NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 },
1224 	[NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY,
1225 			.len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN },
1226 	[NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED },
1227 	[NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED },
1228 	[NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED },
1229 	[NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 },
1230 	[NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 },
1231 };
1232 
1233 /* policy for Service Response Filter attributes */
1234 static const struct nla_policy
1235 nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = {
1236 	[NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG },
1237 	[NL80211_NAN_SRF_BF] = { .type = NLA_BINARY,
1238 				 .len =  NL80211_NAN_FUNC_SRF_MAX_LEN },
1239 	[NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 },
1240 	[NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED },
1241 };
1242 
1243 /* policy for packet pattern attributes */
1244 static const struct nla_policy
1245 nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = {
1246 	[NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, },
1247 	[NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, },
1248 	[NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 },
1249 };
1250 
1251 static int nl80211_prepare_wdev_dump(struct netlink_callback *cb,
1252 				     struct cfg80211_registered_device **rdev,
1253 				     struct wireless_dev **wdev,
1254 				     struct nlattr **attrbuf)
1255 {
1256 	int err;
1257 
1258 	if (!cb->args[0]) {
1259 		struct nlattr **attrbuf_free = NULL;
1260 
1261 		if (!attrbuf) {
1262 			attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR);
1263 			if (!attrbuf)
1264 				return -ENOMEM;
1265 			attrbuf_free = attrbuf;
1266 		}
1267 
1268 		err = nlmsg_parse_deprecated(cb->nlh,
1269 					     GENL_HDRLEN + nl80211_fam.hdrsize,
1270 					     attrbuf, nl80211_fam.maxattr,
1271 					     nl80211_policy, NULL);
1272 		if (err) {
1273 			kfree(attrbuf_free);
1274 			return err;
1275 		}
1276 
1277 		rtnl_lock();
1278 		*wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk),
1279 						   attrbuf);
1280 		kfree(attrbuf_free);
1281 		if (IS_ERR(*wdev)) {
1282 			rtnl_unlock();
1283 			return PTR_ERR(*wdev);
1284 		}
1285 		*rdev = wiphy_to_rdev((*wdev)->wiphy);
1286 		mutex_lock(&(*rdev)->wiphy.mtx);
1287 		rtnl_unlock();
1288 		/* 0 is the first index - add 1 to parse only once */
1289 		cb->args[0] = (*rdev)->wiphy_idx + 1;
1290 		cb->args[1] = (*wdev)->identifier;
1291 	} else {
1292 		/* subtract the 1 again here */
1293 		struct wiphy *wiphy;
1294 		struct wireless_dev *tmp;
1295 
1296 		rtnl_lock();
1297 		wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
1298 		if (!wiphy) {
1299 			rtnl_unlock();
1300 			return -ENODEV;
1301 		}
1302 
1303 		/*
1304 		 * The first invocation validated the wdev's netns against
1305 		 * the caller via __cfg80211_wdev_from_attrs(). The wiphy
1306 		 * may have moved netns between dumpit invocations (via
1307 		 * NL80211_CMD_SET_WIPHY_NETNS), so re-check here.
1308 		 */
1309 		if (!net_eq(wiphy_net(wiphy), sock_net(cb->skb->sk))) {
1310 			rtnl_unlock();
1311 			return -ENODEV;
1312 		}
1313 
1314 		*rdev = wiphy_to_rdev(wiphy);
1315 		*wdev = NULL;
1316 
1317 		list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) {
1318 			if (tmp->identifier == cb->args[1]) {
1319 				*wdev = tmp;
1320 				break;
1321 			}
1322 		}
1323 
1324 		if (!*wdev) {
1325 			rtnl_unlock();
1326 			return -ENODEV;
1327 		}
1328 		mutex_lock(&(*rdev)->wiphy.mtx);
1329 		rtnl_unlock();
1330 	}
1331 
1332 	return 0;
1333 }
1334 
1335 /* message building helper */
1336 void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
1337 		     int flags, u8 cmd)
1338 {
1339 	/* since there is no private header just add the generic one */
1340 	return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd);
1341 }
1342 
1343 static int nl80211_msg_put_wmm_rules(struct sk_buff *msg,
1344 				     const struct ieee80211_reg_rule *rule)
1345 {
1346 	int j;
1347 	struct nlattr *nl_wmm_rules =
1348 		nla_nest_start_noflag(msg, NL80211_FREQUENCY_ATTR_WMM);
1349 
1350 	if (!nl_wmm_rules)
1351 		goto nla_put_failure;
1352 
1353 	for (j = 0; j < IEEE80211_NUM_ACS; j++) {
1354 		struct nlattr *nl_wmm_rule = nla_nest_start_noflag(msg, j);
1355 
1356 		if (!nl_wmm_rule)
1357 			goto nla_put_failure;
1358 
1359 		if (nla_put_u16(msg, NL80211_WMMR_CW_MIN,
1360 				rule->wmm_rule.client[j].cw_min) ||
1361 		    nla_put_u16(msg, NL80211_WMMR_CW_MAX,
1362 				rule->wmm_rule.client[j].cw_max) ||
1363 		    nla_put_u8(msg, NL80211_WMMR_AIFSN,
1364 			       rule->wmm_rule.client[j].aifsn) ||
1365 		    nla_put_u16(msg, NL80211_WMMR_TXOP,
1366 			        rule->wmm_rule.client[j].cot))
1367 			goto nla_put_failure;
1368 
1369 		nla_nest_end(msg, nl_wmm_rule);
1370 	}
1371 	nla_nest_end(msg, nl_wmm_rules);
1372 
1373 	return 0;
1374 
1375 nla_put_failure:
1376 	return -ENOBUFS;
1377 }
1378 
1379 static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy,
1380 				   struct ieee80211_channel *chan,
1381 				   bool large)
1382 {
1383 	/* Some channels must be completely excluded from the
1384 	 * list to protect old user-space tools from breaking
1385 	 */
1386 	if (!large && chan->flags &
1387 	    (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ))
1388 		return 0;
1389 	if (!large && chan->freq_offset)
1390 		return 0;
1391 
1392 	if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ,
1393 			chan->center_freq))
1394 		goto nla_put_failure;
1395 
1396 	if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset))
1397 		goto nla_put_failure;
1398 
1399 	if ((chan->flags & IEEE80211_CHAN_PSD) &&
1400 	    nla_put_s8(msg, NL80211_FREQUENCY_ATTR_PSD, chan->psd))
1401 		goto nla_put_failure;
1402 
1403 	if ((chan->flags & IEEE80211_CHAN_DISABLED) &&
1404 	    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED))
1405 		goto nla_put_failure;
1406 	if (chan->flags & IEEE80211_CHAN_NO_IR) {
1407 		if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR))
1408 			goto nla_put_failure;
1409 		if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS))
1410 			goto nla_put_failure;
1411 	}
1412 	if (chan->flags & IEEE80211_CHAN_RADAR) {
1413 		if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
1414 			goto nla_put_failure;
1415 		if (large) {
1416 			u32 time;
1417 
1418 			time = elapsed_jiffies_msecs(chan->dfs_state_entered);
1419 
1420 			if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE,
1421 					chan->dfs_state))
1422 				goto nla_put_failure;
1423 			if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME,
1424 					time))
1425 				goto nla_put_failure;
1426 			if (nla_put_u32(msg,
1427 					NL80211_FREQUENCY_ATTR_DFS_CAC_TIME,
1428 					chan->dfs_cac_ms))
1429 				goto nla_put_failure;
1430 		}
1431 	}
1432 
1433 	if (large) {
1434 		if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
1435 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
1436 			goto nla_put_failure;
1437 		if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) &&
1438 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS))
1439 			goto nla_put_failure;
1440 		if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) &&
1441 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ))
1442 			goto nla_put_failure;
1443 		if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) &&
1444 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ))
1445 			goto nla_put_failure;
1446 		if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) &&
1447 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY))
1448 			goto nla_put_failure;
1449 		if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) &&
1450 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT))
1451 			goto nla_put_failure;
1452 		if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) &&
1453 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ))
1454 			goto nla_put_failure;
1455 		if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) &&
1456 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ))
1457 			goto nla_put_failure;
1458 		if ((chan->flags & IEEE80211_CHAN_NO_HE) &&
1459 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HE))
1460 			goto nla_put_failure;
1461 		if ((chan->flags & IEEE80211_CHAN_NO_320MHZ) &&
1462 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_320MHZ))
1463 			goto nla_put_failure;
1464 		if ((chan->flags & IEEE80211_CHAN_NO_EHT) &&
1465 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_EHT))
1466 			goto nla_put_failure;
1467 		if ((chan->flags & IEEE80211_CHAN_DFS_CONCURRENT) &&
1468 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DFS_CONCURRENT))
1469 			goto nla_put_failure;
1470 		if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT) &&
1471 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_6GHZ_VLP_CLIENT))
1472 			goto nla_put_failure;
1473 		if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT) &&
1474 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_6GHZ_AFC_CLIENT))
1475 			goto nla_put_failure;
1476 		if ((chan->flags & IEEE80211_CHAN_CAN_MONITOR) &&
1477 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_CAN_MONITOR))
1478 			goto nla_put_failure;
1479 		if ((chan->flags & IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP) &&
1480 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_ALLOW_6GHZ_VLP_AP))
1481 			goto nla_put_failure;
1482 		if ((chan->flags & IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY) &&
1483 		    nla_put_flag(msg,
1484 				 NL80211_FREQUENCY_ATTR_ALLOW_20MHZ_ACTIVITY))
1485 			goto nla_put_failure;
1486 		if ((chan->flags & IEEE80211_CHAN_NO_4MHZ) &&
1487 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_4MHZ))
1488 			goto nla_put_failure;
1489 		if ((chan->flags & IEEE80211_CHAN_NO_8MHZ) &&
1490 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_8MHZ))
1491 			goto nla_put_failure;
1492 		if ((chan->flags & IEEE80211_CHAN_NO_16MHZ) &&
1493 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_16MHZ))
1494 			goto nla_put_failure;
1495 		if ((chan->flags & IEEE80211_CHAN_S1G_NO_PRIMARY) &&
1496 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_S1G_NO_PRIMARY))
1497 			goto nla_put_failure;
1498 		if ((chan->flags & IEEE80211_CHAN_NO_UHR) &&
1499 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_UHR))
1500 			goto nla_put_failure;
1501 		if (chan->cac_start_time &&
1502 		    nla_put_u64_64bit(msg,
1503 				      NL80211_FREQUENCY_ATTR_CAC_START_TIME,
1504 				      chan->cac_start_time,
1505 				      NL80211_FREQUENCY_ATTR_PAD))
1506 			goto nla_put_failure;
1507 	}
1508 
1509 	if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
1510 			DBM_TO_MBM(chan->max_power)))
1511 		goto nla_put_failure;
1512 
1513 	if (large) {
1514 		const struct ieee80211_reg_rule *rule =
1515 			freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq));
1516 
1517 		if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) {
1518 			if (nl80211_msg_put_wmm_rules(msg, rule))
1519 				goto nla_put_failure;
1520 		}
1521 	}
1522 
1523 	return 0;
1524 
1525  nla_put_failure:
1526 	return -ENOBUFS;
1527 }
1528 
1529 static bool nl80211_put_txq_stats(struct sk_buff *msg,
1530 				  struct cfg80211_txq_stats *txqstats,
1531 				  int attrtype)
1532 {
1533 	struct nlattr *txqattr;
1534 
1535 #define PUT_TXQVAL_U32(attr, memb) do {					  \
1536 	if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) &&	  \
1537 	    nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \
1538 		return false;						  \
1539 	} while (0)
1540 
1541 	txqattr = nla_nest_start_noflag(msg, attrtype);
1542 	if (!txqattr)
1543 		return false;
1544 
1545 	PUT_TXQVAL_U32(BACKLOG_BYTES, backlog_bytes);
1546 	PUT_TXQVAL_U32(BACKLOG_PACKETS, backlog_packets);
1547 	PUT_TXQVAL_U32(FLOWS, flows);
1548 	PUT_TXQVAL_U32(DROPS, drops);
1549 	PUT_TXQVAL_U32(ECN_MARKS, ecn_marks);
1550 	PUT_TXQVAL_U32(OVERLIMIT, overlimit);
1551 	PUT_TXQVAL_U32(OVERMEMORY, overmemory);
1552 	PUT_TXQVAL_U32(COLLISIONS, collisions);
1553 	PUT_TXQVAL_U32(TX_BYTES, tx_bytes);
1554 	PUT_TXQVAL_U32(TX_PACKETS, tx_packets);
1555 	PUT_TXQVAL_U32(MAX_FLOWS, max_flows);
1556 	nla_nest_end(msg, txqattr);
1557 
1558 #undef PUT_TXQVAL_U32
1559 	return true;
1560 }
1561 
1562 /* netlink command implementations */
1563 
1564 /**
1565  * nl80211_link_id - return link ID
1566  * @attrs: attributes to look at
1567  *
1568  * Returns: the link ID or 0 if not given
1569  *
1570  * Note this function doesn't do any validation of the link
1571  * ID validity wrt. links that were actually added, so it must
1572  * be called only from ops with %NL80211_FLAG_MLO_VALID_LINK_ID
1573  * or if additional validation is done.
1574  */
1575 static unsigned int nl80211_link_id(struct nlattr **attrs)
1576 {
1577 	struct nlattr *linkid = attrs[NL80211_ATTR_MLO_LINK_ID];
1578 
1579 	return nla_get_u8_default(linkid, 0);
1580 }
1581 
1582 static int nl80211_link_id_or_invalid(struct nlattr **attrs)
1583 {
1584 	struct nlattr *linkid = attrs[NL80211_ATTR_MLO_LINK_ID];
1585 
1586 	if (!linkid)
1587 		return -1;
1588 
1589 	return nla_get_u8(linkid);
1590 }
1591 
1592 struct key_parse {
1593 	struct key_params p;
1594 	int idx;
1595 	int type;
1596 	bool def, defmgmt, defbeacon;
1597 	bool def_uni, def_multi;
1598 };
1599 
1600 static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key,
1601 				 struct key_parse *k)
1602 {
1603 	struct nlattr *tb[NL80211_KEY_MAX + 1];
1604 	int err = nla_parse_nested_deprecated(tb, NL80211_KEY_MAX, key,
1605 					      nl80211_key_policy,
1606 					      info->extack);
1607 	if (err)
1608 		return err;
1609 
1610 	k->def = !!tb[NL80211_KEY_DEFAULT];
1611 	k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT];
1612 	k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON];
1613 
1614 	if (k->def) {
1615 		k->def_uni = true;
1616 		k->def_multi = true;
1617 	}
1618 	if (k->defmgmt || k->defbeacon)
1619 		k->def_multi = true;
1620 
1621 	if (tb[NL80211_KEY_IDX])
1622 		k->idx = nla_get_u8(tb[NL80211_KEY_IDX]);
1623 
1624 	if (tb[NL80211_KEY_DATA]) {
1625 		k->p.key = nla_data(tb[NL80211_KEY_DATA]);
1626 		k->p.key_len = nla_len(tb[NL80211_KEY_DATA]);
1627 	}
1628 
1629 	if (tb[NL80211_KEY_SEQ]) {
1630 		k->p.seq = nla_data(tb[NL80211_KEY_SEQ]);
1631 		k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]);
1632 	}
1633 
1634 	if (tb[NL80211_KEY_CIPHER])
1635 		k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]);
1636 
1637 	if (tb[NL80211_KEY_TYPE])
1638 		k->type = nla_get_u32(tb[NL80211_KEY_TYPE]);
1639 
1640 	if (tb[NL80211_KEY_DEFAULT_TYPES]) {
1641 		struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
1642 
1643 		err = nla_parse_nested_deprecated(kdt,
1644 						  NUM_NL80211_KEY_DEFAULT_TYPES - 1,
1645 						  tb[NL80211_KEY_DEFAULT_TYPES],
1646 						  nl80211_key_default_policy,
1647 						  info->extack);
1648 		if (err)
1649 			return err;
1650 
1651 		k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
1652 		k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
1653 	}
1654 
1655 	if (tb[NL80211_KEY_MODE])
1656 		k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]);
1657 
1658 	if (tb[NL80211_KEY_LTF_SEED]) {
1659 		k->p.ltf_keyseed = nla_data(tb[NL80211_KEY_LTF_SEED]);
1660 		k->p.ltf_keyseed_len = nla_len(tb[NL80211_KEY_LTF_SEED]);
1661 	}
1662 
1663 	return 0;
1664 }
1665 
1666 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
1667 {
1668 	if (info->attrs[NL80211_ATTR_KEY_DATA]) {
1669 		k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
1670 		k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
1671 	}
1672 
1673 	if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
1674 		k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
1675 		k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
1676 	}
1677 
1678 	if (info->attrs[NL80211_ATTR_KEY_IDX])
1679 		k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
1680 
1681 	if (info->attrs[NL80211_ATTR_KEY_CIPHER])
1682 		k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
1683 
1684 	k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
1685 	k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
1686 
1687 	if (k->def) {
1688 		k->def_uni = true;
1689 		k->def_multi = true;
1690 	}
1691 	if (k->defmgmt)
1692 		k->def_multi = true;
1693 
1694 	if (info->attrs[NL80211_ATTR_KEY_TYPE])
1695 		k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
1696 
1697 	if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
1698 		struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
1699 		int err = nla_parse_nested_deprecated(kdt,
1700 						      NUM_NL80211_KEY_DEFAULT_TYPES - 1,
1701 						      info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
1702 						      nl80211_key_default_policy,
1703 						      info->extack);
1704 		if (err)
1705 			return err;
1706 
1707 		k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
1708 		k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
1709 	}
1710 
1711 	return 0;
1712 }
1713 
1714 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
1715 {
1716 	int err;
1717 
1718 	memset(k, 0, sizeof(*k));
1719 	k->idx = -1;
1720 	k->type = -1;
1721 
1722 	if (info->attrs[NL80211_ATTR_KEY])
1723 		err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k);
1724 	else
1725 		err = nl80211_parse_key_old(info, k);
1726 
1727 	if (err)
1728 		return err;
1729 
1730 	if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) +
1731 	    (k->defbeacon ? 1 : 0) > 1) {
1732 		GENL_SET_ERR_MSG(info,
1733 				 "key with multiple default flags is invalid");
1734 		return -EINVAL;
1735 	}
1736 
1737 	if (k->defmgmt || k->defbeacon) {
1738 		if (k->def_uni || !k->def_multi) {
1739 			GENL_SET_ERR_MSG(info,
1740 					 "defmgmt/defbeacon key must be mcast");
1741 			return -EINVAL;
1742 		}
1743 	}
1744 
1745 	if (k->idx != -1) {
1746 		if (k->defmgmt) {
1747 			if (k->idx < 4 || k->idx > 5) {
1748 				GENL_SET_ERR_MSG(info,
1749 						 "defmgmt key idx not 4 or 5");
1750 				return -EINVAL;
1751 			}
1752 		} else if (k->defbeacon) {
1753 			if (k->idx < 6 || k->idx > 7) {
1754 				GENL_SET_ERR_MSG(info,
1755 						 "defbeacon key idx not 6 or 7");
1756 				return -EINVAL;
1757 			}
1758 		} else if (k->def) {
1759 			if (k->idx < 0 || k->idx > 3) {
1760 				GENL_SET_ERR_MSG(info, "def key idx not 0-3");
1761 				return -EINVAL;
1762 			}
1763 		} else {
1764 			if (k->idx < 0 || k->idx > 7) {
1765 				GENL_SET_ERR_MSG(info, "key idx not 0-7");
1766 				return -EINVAL;
1767 			}
1768 		}
1769 	}
1770 
1771 	return 0;
1772 }
1773 
1774 static struct cfg80211_cached_keys *
1775 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
1776 		       struct wireless_dev *wdev,
1777 		       struct genl_info *info, bool *no_ht)
1778 {
1779 	struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS];
1780 	struct key_parse parse;
1781 	struct nlattr *key;
1782 	struct cfg80211_cached_keys *result;
1783 	int rem, err, def = 0;
1784 	bool have_key = false;
1785 
1786 	nla_for_each_nested(key, keys, rem) {
1787 		have_key = true;
1788 		break;
1789 	}
1790 
1791 	if (!have_key)
1792 		return NULL;
1793 
1794 	result = kzalloc_obj(*result);
1795 	if (!result)
1796 		return ERR_PTR(-ENOMEM);
1797 
1798 	result->def = -1;
1799 
1800 	nla_for_each_nested(key, keys, rem) {
1801 		memset(&parse, 0, sizeof(parse));
1802 		parse.idx = -1;
1803 
1804 		err = nl80211_parse_key_new(info, key, &parse);
1805 		if (err)
1806 			goto error;
1807 		err = -EINVAL;
1808 		if (!parse.p.key)
1809 			goto error;
1810 		if (parse.idx < 0 || parse.idx > 3) {
1811 			GENL_SET_ERR_MSG(info, "key index out of range [0-3]");
1812 			goto error;
1813 		}
1814 		if (parse.def) {
1815 			if (def) {
1816 				GENL_SET_ERR_MSG(info,
1817 						 "only one key can be default");
1818 				goto error;
1819 			}
1820 			def = 1;
1821 			result->def = parse.idx;
1822 			if (!parse.def_uni || !parse.def_multi)
1823 				goto error;
1824 		} else if (parse.defmgmt)
1825 			goto error;
1826 		err = cfg80211_validate_key_settings(rdev, wdev, &parse.p,
1827 						     parse.idx, false, NULL);
1828 		if (err)
1829 			goto error;
1830 		if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 &&
1831 		    parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) {
1832 			GENL_SET_ERR_MSG(info, "connect key must be WEP");
1833 			err = -EINVAL;
1834 			goto error;
1835 		}
1836 		result->params[parse.idx].cipher = parse.p.cipher;
1837 		result->params[parse.idx].key_len = parse.p.key_len;
1838 		result->params[parse.idx].key = result->data[parse.idx];
1839 		memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len);
1840 
1841 		/* must be WEP key if we got here */
1842 		if (no_ht)
1843 			*no_ht = true;
1844 	}
1845 
1846 	if (result->def < 0) {
1847 		err = -EINVAL;
1848 		GENL_SET_ERR_MSG(info, "need a default/TX key");
1849 		goto error;
1850 	}
1851 
1852 	return result;
1853  error:
1854 	kfree_sensitive(result);
1855 	return ERR_PTR(err);
1856 }
1857 
1858 static int nl80211_key_allowed(struct wireless_dev *wdev)
1859 {
1860 	lockdep_assert_wiphy(wdev->wiphy);
1861 
1862 	switch (wdev->iftype) {
1863 	case NL80211_IFTYPE_AP:
1864 	case NL80211_IFTYPE_AP_VLAN:
1865 	case NL80211_IFTYPE_P2P_GO:
1866 	case NL80211_IFTYPE_MESH_POINT:
1867 		break;
1868 	case NL80211_IFTYPE_ADHOC:
1869 		if (wdev->u.ibss.current_bss)
1870 			return 0;
1871 		return -ENOLINK;
1872 	case NL80211_IFTYPE_STATION:
1873 	case NL80211_IFTYPE_P2P_CLIENT:
1874 		if (wdev->connected ||
1875 		    (wiphy_ext_feature_isset(wdev->wiphy,
1876 					     NL80211_EXT_FEATURE_ASSOC_FRAME_ENCRYPTION)))
1877 			return 0;
1878 		return -ENOLINK;
1879 	case NL80211_IFTYPE_NAN:
1880 	case NL80211_IFTYPE_NAN_DATA:
1881 		if (wiphy_ext_feature_isset(wdev->wiphy,
1882 					    NL80211_EXT_FEATURE_SECURE_NAN))
1883 			return 0;
1884 		return -EINVAL;
1885 	case NL80211_IFTYPE_PD:
1886 		if (wiphy_ext_feature_isset(wdev->wiphy,
1887 					    NL80211_EXT_FEATURE_SECURE_RTT))
1888 			return 0;
1889 		return -EINVAL;
1890 	case NL80211_IFTYPE_UNSPECIFIED:
1891 	case NL80211_IFTYPE_OCB:
1892 	case NL80211_IFTYPE_MONITOR:
1893 	case NL80211_IFTYPE_P2P_DEVICE:
1894 	case NL80211_IFTYPE_WDS:
1895 	case NUM_NL80211_IFTYPES:
1896 		return -EINVAL;
1897 	}
1898 
1899 	return 0;
1900 }
1901 
1902 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy,
1903 							u32 freq)
1904 {
1905 	struct ieee80211_channel *chan;
1906 
1907 	chan = ieee80211_get_channel_khz(wiphy, freq);
1908 	if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
1909 		return NULL;
1910 	return chan;
1911 }
1912 
1913 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
1914 {
1915 	struct nlattr *nl_modes = nla_nest_start_noflag(msg, attr);
1916 	int i;
1917 
1918 	if (!nl_modes)
1919 		goto nla_put_failure;
1920 
1921 	i = 0;
1922 	while (ifmodes) {
1923 		if ((ifmodes & 1) && nla_put_flag(msg, i))
1924 			goto nla_put_failure;
1925 		ifmodes >>= 1;
1926 		i++;
1927 	}
1928 
1929 	nla_nest_end(msg, nl_modes);
1930 	return 0;
1931 
1932 nla_put_failure:
1933 	return -ENOBUFS;
1934 }
1935 
1936 static int nl80211_put_ifcomb_data(struct sk_buff *msg, bool large, int idx,
1937 				   const struct ieee80211_iface_combination *c,
1938 				   u16 nested)
1939 {
1940 	struct nlattr *nl_combi, *nl_limits;
1941 	int i;
1942 
1943 	nl_combi = nla_nest_start_noflag(msg, idx | nested);
1944 	if (!nl_combi)
1945 		goto nla_put_failure;
1946 
1947 	nl_limits = nla_nest_start_noflag(msg, NL80211_IFACE_COMB_LIMITS |
1948 					       nested);
1949 	if (!nl_limits)
1950 		goto nla_put_failure;
1951 
1952 	for (i = 0; i < c->n_limits; i++) {
1953 		struct nlattr *nl_limit;
1954 
1955 		nl_limit = nla_nest_start_noflag(msg, i + 1);
1956 		if (!nl_limit)
1957 			goto nla_put_failure;
1958 		if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, c->limits[i].max))
1959 			goto nla_put_failure;
1960 		if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
1961 					c->limits[i].types))
1962 			goto nla_put_failure;
1963 		nla_nest_end(msg, nl_limit);
1964 	}
1965 
1966 	nla_nest_end(msg, nl_limits);
1967 
1968 	if (c->beacon_int_infra_match &&
1969 	    nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
1970 		goto nla_put_failure;
1971 	if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
1972 			c->num_different_channels) ||
1973 	    nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
1974 			c->max_interfaces))
1975 		goto nla_put_failure;
1976 	if (large &&
1977 	    (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
1978 			c->radar_detect_widths) ||
1979 	     nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
1980 			c->radar_detect_regions)))
1981 		goto nla_put_failure;
1982 	if (c->beacon_int_min_gcd &&
1983 	    nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD,
1984 			c->beacon_int_min_gcd))
1985 		goto nla_put_failure;
1986 
1987 	nla_nest_end(msg, nl_combi);
1988 
1989 	return 0;
1990 nla_put_failure:
1991 	return -ENOBUFS;
1992 }
1993 
1994 static int nl80211_put_iface_combinations(struct wiphy *wiphy,
1995 					  struct sk_buff *msg,
1996 					  int attr, int radio,
1997 					  bool large, u16 nested)
1998 {
1999 	const struct ieee80211_iface_combination *c;
2000 	struct nlattr *nl_combis;
2001 	int i, n;
2002 
2003 	nl_combis = nla_nest_start_noflag(msg, attr | nested);
2004 	if (!nl_combis)
2005 		goto nla_put_failure;
2006 
2007 	if (radio >= 0) {
2008 		c = wiphy->radio[0].iface_combinations;
2009 		n = wiphy->radio[0].n_iface_combinations;
2010 	} else {
2011 		c = wiphy->iface_combinations;
2012 		n = wiphy->n_iface_combinations;
2013 	}
2014 	for (i = 0; i < n; i++)
2015 		if (nl80211_put_ifcomb_data(msg, large, i + 1, &c[i], nested))
2016 			goto nla_put_failure;
2017 
2018 	nla_nest_end(msg, nl_combis);
2019 
2020 	return 0;
2021 nla_put_failure:
2022 	return -ENOBUFS;
2023 }
2024 
2025 #ifdef CONFIG_PM
2026 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev,
2027 					struct sk_buff *msg)
2028 {
2029 	const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp;
2030 	struct nlattr *nl_tcp;
2031 
2032 	if (!tcp)
2033 		return 0;
2034 
2035 	nl_tcp = nla_nest_start_noflag(msg,
2036 				       NL80211_WOWLAN_TRIG_TCP_CONNECTION);
2037 	if (!nl_tcp)
2038 		return -ENOBUFS;
2039 
2040 	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
2041 			tcp->data_payload_max))
2042 		return -ENOBUFS;
2043 
2044 	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
2045 			tcp->data_payload_max))
2046 		return -ENOBUFS;
2047 
2048 	if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ))
2049 		return -ENOBUFS;
2050 
2051 	if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
2052 				sizeof(*tcp->tok), tcp->tok))
2053 		return -ENOBUFS;
2054 
2055 	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
2056 			tcp->data_interval_max))
2057 		return -ENOBUFS;
2058 
2059 	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
2060 			tcp->wake_payload_max))
2061 		return -ENOBUFS;
2062 
2063 	nla_nest_end(msg, nl_tcp);
2064 	return 0;
2065 }
2066 
2067 static int nl80211_send_wowlan(struct sk_buff *msg,
2068 			       struct cfg80211_registered_device *rdev,
2069 			       bool large)
2070 {
2071 	struct nlattr *nl_wowlan;
2072 
2073 	if (!rdev->wiphy.wowlan)
2074 		return 0;
2075 
2076 	nl_wowlan = nla_nest_start_noflag(msg,
2077 					  NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED);
2078 	if (!nl_wowlan)
2079 		return -ENOBUFS;
2080 
2081 	if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) &&
2082 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
2083 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) &&
2084 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
2085 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) &&
2086 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
2087 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) &&
2088 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) ||
2089 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
2090 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
2091 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) &&
2092 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
2093 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) &&
2094 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
2095 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) &&
2096 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
2097 		return -ENOBUFS;
2098 
2099 	if (rdev->wiphy.wowlan->n_patterns) {
2100 		struct nl80211_pattern_support pat = {
2101 			.max_patterns = rdev->wiphy.wowlan->n_patterns,
2102 			.min_pattern_len = rdev->wiphy.wowlan->pattern_min_len,
2103 			.max_pattern_len = rdev->wiphy.wowlan->pattern_max_len,
2104 			.max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset,
2105 		};
2106 
2107 		if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
2108 			    sizeof(pat), &pat))
2109 			return -ENOBUFS;
2110 	}
2111 
2112 	if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) &&
2113 	    nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT,
2114 			rdev->wiphy.wowlan->max_nd_match_sets))
2115 		return -ENOBUFS;
2116 
2117 	if (large && nl80211_send_wowlan_tcp_caps(rdev, msg))
2118 		return -ENOBUFS;
2119 
2120 	nla_nest_end(msg, nl_wowlan);
2121 
2122 	return 0;
2123 }
2124 #endif
2125 
2126 static int nl80211_send_coalesce(struct sk_buff *msg,
2127 				 struct cfg80211_registered_device *rdev)
2128 {
2129 	struct nl80211_coalesce_rule_support rule;
2130 
2131 	if (!rdev->wiphy.coalesce)
2132 		return 0;
2133 
2134 	rule.max_rules = rdev->wiphy.coalesce->n_rules;
2135 	rule.max_delay = rdev->wiphy.coalesce->max_delay;
2136 	rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns;
2137 	rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len;
2138 	rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len;
2139 	rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset;
2140 
2141 	if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule))
2142 		return -ENOBUFS;
2143 
2144 	return 0;
2145 }
2146 
2147 static int
2148 nl80211_send_iftype_data(struct sk_buff *msg,
2149 			 const struct ieee80211_supported_band *sband,
2150 			 const struct ieee80211_sband_iftype_data *iftdata)
2151 {
2152 	const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap;
2153 	const struct ieee80211_sta_eht_cap *eht_cap = &iftdata->eht_cap;
2154 	const struct ieee80211_sta_uhr_cap *uhr_cap = &iftdata->uhr_cap;
2155 
2156 	if (nl80211_put_iftypes(msg, NL80211_BAND_IFTYPE_ATTR_IFTYPES,
2157 				iftdata->types_mask))
2158 		return -ENOBUFS;
2159 
2160 	if (he_cap->has_he) {
2161 		if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC,
2162 			    sizeof(he_cap->he_cap_elem.mac_cap_info),
2163 			    he_cap->he_cap_elem.mac_cap_info) ||
2164 		    nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY,
2165 			    sizeof(he_cap->he_cap_elem.phy_cap_info),
2166 			    he_cap->he_cap_elem.phy_cap_info) ||
2167 		    nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET,
2168 			    sizeof(he_cap->he_mcs_nss_supp),
2169 			    &he_cap->he_mcs_nss_supp) ||
2170 		    nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE,
2171 			    sizeof(he_cap->ppe_thres), he_cap->ppe_thres))
2172 			return -ENOBUFS;
2173 	}
2174 
2175 	if (eht_cap->has_eht && he_cap->has_he) {
2176 		u8 mcs_nss_size, ppe_thresh_size;
2177 		u16 ppe_thres_hdr;
2178 		bool is_ap;
2179 
2180 		is_ap = iftdata->types_mask & BIT(NL80211_IFTYPE_AP) ||
2181 			iftdata->types_mask & BIT(NL80211_IFTYPE_P2P_GO);
2182 
2183 		mcs_nss_size =
2184 			ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
2185 						   &eht_cap->eht_cap_elem,
2186 						   is_ap);
2187 
2188 		ppe_thres_hdr = get_unaligned_le16(&eht_cap->eht_ppe_thres[0]);
2189 		ppe_thresh_size =
2190 			ieee80211_eht_ppe_size(ppe_thres_hdr,
2191 					       eht_cap->eht_cap_elem.phy_cap_info);
2192 
2193 		if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC,
2194 			    sizeof(eht_cap->eht_cap_elem.mac_cap_info),
2195 			    eht_cap->eht_cap_elem.mac_cap_info) ||
2196 		    nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY,
2197 			    sizeof(eht_cap->eht_cap_elem.phy_cap_info),
2198 			    eht_cap->eht_cap_elem.phy_cap_info) ||
2199 		    nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET,
2200 			    mcs_nss_size, &eht_cap->eht_mcs_nss_supp) ||
2201 		    nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE,
2202 			    ppe_thresh_size, eht_cap->eht_ppe_thres))
2203 			return -ENOBUFS;
2204 	}
2205 
2206 	if (uhr_cap->has_uhr) {
2207 		if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_UHR_CAP_MAC,
2208 			    sizeof(uhr_cap->mac), &uhr_cap->mac) ||
2209 		    nla_put(msg, NL80211_BAND_IFTYPE_ATTR_UHR_CAP_PHY,
2210 			    sizeof(uhr_cap->phy), &uhr_cap->phy))
2211 			return -ENOBUFS;
2212 	}
2213 
2214 	if (sband->band == NL80211_BAND_6GHZ &&
2215 	    nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA,
2216 		    sizeof(iftdata->he_6ghz_capa),
2217 		    &iftdata->he_6ghz_capa))
2218 		return -ENOBUFS;
2219 
2220 	if (iftdata->vendor_elems.data && iftdata->vendor_elems.len &&
2221 	    nla_put(msg, NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS,
2222 		    iftdata->vendor_elems.len, iftdata->vendor_elems.data))
2223 		return -ENOBUFS;
2224 
2225 	return 0;
2226 }
2227 
2228 static int nl80211_send_band_rateinfo(struct sk_buff *msg,
2229 				      struct ieee80211_supported_band *sband,
2230 				      bool large)
2231 {
2232 	struct nlattr *nl_rates, *nl_rate;
2233 	struct ieee80211_rate *rate;
2234 	int i;
2235 
2236 	/* add HT info */
2237 	if (sband->ht_cap.ht_supported &&
2238 	    (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET,
2239 		     sizeof(sband->ht_cap.mcs),
2240 		     &sband->ht_cap.mcs) ||
2241 	     nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA,
2242 			 sband->ht_cap.cap) ||
2243 	     nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
2244 			sband->ht_cap.ampdu_factor) ||
2245 	     nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
2246 			sband->ht_cap.ampdu_density)))
2247 		return -ENOBUFS;
2248 
2249 	/* add VHT info */
2250 	if (sband->vht_cap.vht_supported &&
2251 	    (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET,
2252 		     sizeof(sband->vht_cap.vht_mcs),
2253 		     &sband->vht_cap.vht_mcs) ||
2254 	     nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA,
2255 			 sband->vht_cap.cap)))
2256 		return -ENOBUFS;
2257 
2258 	if (large && sband->n_iftype_data) {
2259 		struct nlattr *nl_iftype_data =
2260 			nla_nest_start_noflag(msg,
2261 					      NL80211_BAND_ATTR_IFTYPE_DATA);
2262 		const struct ieee80211_sband_iftype_data *iftd;
2263 		int err;
2264 
2265 		if (!nl_iftype_data)
2266 			return -ENOBUFS;
2267 
2268 		for_each_sband_iftype_data(sband, i, iftd) {
2269 			struct nlattr *iftdata;
2270 
2271 			iftdata = nla_nest_start_noflag(msg, i + 1);
2272 			if (!iftdata)
2273 				return -ENOBUFS;
2274 
2275 			err = nl80211_send_iftype_data(msg, sband, iftd);
2276 			if (err)
2277 				return err;
2278 
2279 			nla_nest_end(msg, iftdata);
2280 		}
2281 
2282 		nla_nest_end(msg, nl_iftype_data);
2283 	}
2284 
2285 	/* add EDMG info */
2286 	if (large && sband->edmg_cap.channels &&
2287 	    (nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_CHANNELS,
2288 		       sband->edmg_cap.channels) ||
2289 	    nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_BW_CONFIG,
2290 		       sband->edmg_cap.bw_config)))
2291 
2292 		return -ENOBUFS;
2293 
2294 	/* add bitrates */
2295 	nl_rates = nla_nest_start_noflag(msg, NL80211_BAND_ATTR_RATES);
2296 	if (!nl_rates)
2297 		return -ENOBUFS;
2298 
2299 	for (i = 0; i < sband->n_bitrates; i++) {
2300 		nl_rate = nla_nest_start_noflag(msg, i);
2301 		if (!nl_rate)
2302 			return -ENOBUFS;
2303 
2304 		rate = &sband->bitrates[i];
2305 		if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE,
2306 				rate->bitrate))
2307 			return -ENOBUFS;
2308 		if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) &&
2309 		    nla_put_flag(msg,
2310 				 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE))
2311 			return -ENOBUFS;
2312 
2313 		nla_nest_end(msg, nl_rate);
2314 	}
2315 
2316 	nla_nest_end(msg, nl_rates);
2317 
2318 	/* S1G capabilities */
2319 	if (sband->band == NL80211_BAND_S1GHZ && sband->s1g_cap.s1g &&
2320 	    (nla_put(msg, NL80211_BAND_ATTR_S1G_CAPA,
2321 		     sizeof(sband->s1g_cap.cap),
2322 		     sband->s1g_cap.cap) ||
2323 	     nla_put(msg, NL80211_BAND_ATTR_S1G_MCS_NSS_SET,
2324 		     sizeof(sband->s1g_cap.nss_mcs),
2325 		     sband->s1g_cap.nss_mcs)))
2326 		return -ENOBUFS;
2327 
2328 	return 0;
2329 }
2330 
2331 static int
2332 nl80211_send_mgmt_stypes(struct sk_buff *msg,
2333 			 const struct ieee80211_txrx_stypes *mgmt_stypes)
2334 {
2335 	u16 stypes;
2336 	struct nlattr *nl_ftypes, *nl_ifs;
2337 	enum nl80211_iftype ift;
2338 	int i;
2339 
2340 	if (!mgmt_stypes)
2341 		return 0;
2342 
2343 	nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_TX_FRAME_TYPES);
2344 	if (!nl_ifs)
2345 		return -ENOBUFS;
2346 
2347 	for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
2348 		nl_ftypes = nla_nest_start_noflag(msg, ift);
2349 		if (!nl_ftypes)
2350 			return -ENOBUFS;
2351 		i = 0;
2352 		stypes = mgmt_stypes[ift].tx;
2353 		while (stypes) {
2354 			if ((stypes & 1) &&
2355 			    nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
2356 					(i << 4) | IEEE80211_FTYPE_MGMT))
2357 				return -ENOBUFS;
2358 			stypes >>= 1;
2359 			i++;
2360 		}
2361 		nla_nest_end(msg, nl_ftypes);
2362 	}
2363 
2364 	nla_nest_end(msg, nl_ifs);
2365 
2366 	nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_RX_FRAME_TYPES);
2367 	if (!nl_ifs)
2368 		return -ENOBUFS;
2369 
2370 	for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
2371 		nl_ftypes = nla_nest_start_noflag(msg, ift);
2372 		if (!nl_ftypes)
2373 			return -ENOBUFS;
2374 		i = 0;
2375 		stypes = mgmt_stypes[ift].rx;
2376 		while (stypes) {
2377 			if ((stypes & 1) &&
2378 			    nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
2379 					(i << 4) | IEEE80211_FTYPE_MGMT))
2380 				return -ENOBUFS;
2381 			stypes >>= 1;
2382 			i++;
2383 		}
2384 		nla_nest_end(msg, nl_ftypes);
2385 	}
2386 	nla_nest_end(msg, nl_ifs);
2387 
2388 	return 0;
2389 }
2390 
2391 #define CMD(op, n)							\
2392 	 do {								\
2393 		if (rdev->ops->op) {					\
2394 			i++;						\
2395 			if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) 	\
2396 				goto nla_put_failure;			\
2397 		}							\
2398 	} while (0)
2399 
2400 static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev,
2401 					struct sk_buff *msg)
2402 {
2403 	int i = 0;
2404 
2405 	/*
2406 	 * do *NOT* add anything into this function, new things need to be
2407 	 * advertised only to new versions of userspace that can deal with
2408 	 * the split (and they can't possibly care about new features...
2409 	 */
2410 	CMD(add_virtual_intf, NEW_INTERFACE);
2411 	CMD(change_virtual_intf, SET_INTERFACE);
2412 	CMD(add_key, NEW_KEY);
2413 	CMD(start_ap, START_AP);
2414 	CMD(add_station, NEW_STATION);
2415 	CMD(add_mpath, NEW_MPATH);
2416 	CMD(update_mesh_config, SET_MESH_CONFIG);
2417 	CMD(change_bss, SET_BSS);
2418 	CMD(auth, AUTHENTICATE);
2419 	CMD(assoc, ASSOCIATE);
2420 	CMD(deauth, DEAUTHENTICATE);
2421 	CMD(disassoc, DISASSOCIATE);
2422 	CMD(join_ibss, JOIN_IBSS);
2423 	CMD(join_mesh, JOIN_MESH);
2424 	CMD(set_pmksa, SET_PMKSA);
2425 	CMD(del_pmksa, DEL_PMKSA);
2426 	CMD(flush_pmksa, FLUSH_PMKSA);
2427 	if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)
2428 		CMD(remain_on_channel, REMAIN_ON_CHANNEL);
2429 	CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
2430 	CMD(mgmt_tx, FRAME);
2431 	CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL);
2432 	if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) {
2433 		i++;
2434 		if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS))
2435 			goto nla_put_failure;
2436 	}
2437 	if (rdev->ops->set_monitor_channel || rdev->ops->start_ap ||
2438 	    rdev->ops->join_mesh) {
2439 		i++;
2440 		if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL))
2441 			goto nla_put_failure;
2442 	}
2443 	if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) {
2444 		CMD(tdls_mgmt, TDLS_MGMT);
2445 		CMD(tdls_oper, TDLS_OPER);
2446 	}
2447 	if (rdev->wiphy.max_sched_scan_reqs)
2448 		CMD(sched_scan_start, START_SCHED_SCAN);
2449 	CMD(probe_client, PROBE_CLIENT);
2450 	CMD(set_noack_map, SET_NOACK_MAP);
2451 	if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) {
2452 		i++;
2453 		if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS))
2454 			goto nla_put_failure;
2455 	}
2456 	CMD(start_p2p_device, START_P2P_DEVICE);
2457 	CMD(set_mcast_rate, SET_MCAST_RATE);
2458 #ifdef CONFIG_NL80211_TESTMODE
2459 	CMD(testmode_cmd, TESTMODE);
2460 #endif
2461 
2462 	if (rdev->ops->connect || rdev->ops->auth) {
2463 		i++;
2464 		if (nla_put_u32(msg, i, NL80211_CMD_CONNECT))
2465 			goto nla_put_failure;
2466 	}
2467 
2468 	if (rdev->ops->disconnect || rdev->ops->deauth) {
2469 		i++;
2470 		if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT))
2471 			goto nla_put_failure;
2472 	}
2473 
2474 	return i;
2475  nla_put_failure:
2476 	return -ENOBUFS;
2477 }
2478 
2479 static int
2480 nl80211_send_pmsr_ftm_capa(const struct cfg80211_pmsr_capabilities *cap,
2481 			   struct sk_buff *msg)
2482 {
2483 	struct nlattr *ftm;
2484 
2485 	if (!cap->ftm.supported)
2486 		return 0;
2487 
2488 	ftm = nla_nest_start_noflag(msg, NL80211_PMSR_TYPE_FTM);
2489 	if (!ftm)
2490 		return -ENOBUFS;
2491 
2492 	if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP))
2493 		return -ENOBUFS;
2494 	if (cap->ftm.non_asap &&
2495 	    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP))
2496 		return -ENOBUFS;
2497 	if (cap->ftm.request_lci &&
2498 	    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI))
2499 		return -ENOBUFS;
2500 	if (cap->ftm.request_civicloc &&
2501 	    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC))
2502 		return -ENOBUFS;
2503 	if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES,
2504 			cap->ftm.preambles))
2505 		return -ENOBUFS;
2506 	if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS,
2507 			cap->ftm.bandwidths))
2508 		return -ENOBUFS;
2509 	if (cap->ftm.max_bursts_exponent >= 0 &&
2510 	    nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT,
2511 			cap->ftm.max_bursts_exponent))
2512 		return -ENOBUFS;
2513 	if (cap->ftm.max_ftms_per_burst &&
2514 	    nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST,
2515 			cap->ftm.max_ftms_per_burst))
2516 		return -ENOBUFS;
2517 	if (cap->ftm.trigger_based &&
2518 	    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED))
2519 		return -ENOBUFS;
2520 	if (cap->ftm.non_trigger_based &&
2521 	    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED))
2522 		return -ENOBUFS;
2523 	if (cap->ftm.support_6ghz &&
2524 	    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_6GHZ_SUPPORT))
2525 		return -ENOBUFS;
2526 	if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TX_LTF_REP,
2527 			cap->ftm.max_tx_ltf_rep))
2528 		return -ENOBUFS;
2529 	if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_RX_LTF_REP,
2530 			cap->ftm.max_rx_ltf_rep))
2531 		return -ENOBUFS;
2532 	if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TX_STS,
2533 			cap->ftm.max_tx_sts))
2534 		return -ENOBUFS;
2535 	if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_RX_STS,
2536 			cap->ftm.max_rx_sts))
2537 		return -ENOBUFS;
2538 	if (cap->ftm.max_total_ltf_tx > 0 &&
2539 	    nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TOTAL_LTF_TX,
2540 			cap->ftm.max_total_ltf_tx))
2541 		return -ENOBUFS;
2542 	if (cap->ftm.max_total_ltf_rx > 0 &&
2543 	    nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TOTAL_LTF_RX,
2544 			cap->ftm.max_total_ltf_rx))
2545 		return -ENOBUFS;
2546 
2547 	if (cap->ftm.ista.support_ntb || cap->ftm.ista.support_tb ||
2548 	    cap->ftm.ista.support_edca) {
2549 		struct nlattr *ista_caps;
2550 
2551 		ista_caps = nla_nest_start_noflag(msg,
2552 						  NL80211_PMSR_FTM_CAPA_ATTR_ISTA_CAPS);
2553 		if (!ista_caps)
2554 			return -ENOBUFS;
2555 		if (cap->ftm.ista.support_ntb &&
2556 		    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_NTB))
2557 			return -ENOBUFS;
2558 		if (cap->ftm.ista.support_tb &&
2559 		    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_TB))
2560 			return -ENOBUFS;
2561 		if (cap->ftm.ista.support_edca &&
2562 		    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_EDCA))
2563 			return -ENOBUFS;
2564 		if (cap->ftm.ista.max_peers &&
2565 		    nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEER_ISTA_ROLE,
2566 				cap->ftm.ista.max_peers))
2567 			return -ENOBUFS;
2568 		nla_nest_end(msg, ista_caps);
2569 	}
2570 
2571 	if (cap->ftm.rsta.support_ntb || cap->ftm.rsta.support_tb ||
2572 	    cap->ftm.rsta.support_edca) {
2573 		struct nlattr *rsta_caps;
2574 
2575 		/*
2576 		 * Set the generic RSTA_SUPPORT flag if any of the specific
2577 		 * ranging modes is supported to maintain the backward
2578 		 * compatibility.
2579 		 */
2580 		if (nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_RSTA_SUPPORT))
2581 			return -ENOBUFS;
2582 
2583 		rsta_caps = nla_nest_start_noflag(msg,
2584 						  NL80211_PMSR_FTM_CAPA_ATTR_RSTA_CAPS);
2585 		if (!rsta_caps)
2586 			return -ENOBUFS;
2587 		if (cap->ftm.rsta.support_ntb &&
2588 		    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_NTB))
2589 			return -ENOBUFS;
2590 		if (cap->ftm.rsta.support_tb &&
2591 		    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_TB))
2592 			return -ENOBUFS;
2593 		if (cap->ftm.rsta.support_edca &&
2594 		    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_EDCA))
2595 			return -ENOBUFS;
2596 		if (cap->ftm.rsta.max_peers &&
2597 		    nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEER_RSTA_ROLE,
2598 				cap->ftm.rsta.max_peers))
2599 			return -ENOBUFS;
2600 		nla_nest_end(msg, rsta_caps);
2601 	}
2602 
2603 	if (cap->ftm.max_no_of_tx_antennas &&
2604 	    nla_put_u8(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_NUM_TX_ANTENNAS,
2605 		       cap->ftm.max_no_of_tx_antennas))
2606 		return -ENOBUFS;
2607 
2608 	if (cap->ftm.max_no_of_rx_antennas &&
2609 	    nla_put_u8(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_NUM_RX_ANTENNAS,
2610 		       cap->ftm.max_no_of_rx_antennas))
2611 		return -ENOBUFS;
2612 
2613 	if (cap->ftm.min_allowed_ranging_interval_edca &&
2614 	    nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MIN_INTERVAL_EDCA,
2615 			cap->ftm.min_allowed_ranging_interval_edca))
2616 		return -ENOBUFS;
2617 
2618 	if (cap->ftm.min_allowed_ranging_interval_ntb &&
2619 	    nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MIN_INTERVAL_NTB,
2620 			cap->ftm.min_allowed_ranging_interval_ntb))
2621 		return -ENOBUFS;
2622 
2623 	if (cap->ftm.type.infra_support || cap->ftm.type.pd_support) {
2624 		struct nlattr *pd_caps;
2625 
2626 		pd_caps = nla_nest_start_noflag(msg,
2627 						NL80211_PMSR_FTM_CAPA_ATTR_TYPE_CAPS);
2628 		if (!pd_caps)
2629 			return -ENOBUFS;
2630 
2631 		if (cap->ftm.type.infra_support &&
2632 		    nla_put_flag(msg, NL80211_PMSR_FTM_TYPE_CAPA_ATTR_INFRA_SUPPORT))
2633 			return -ENOBUFS;
2634 
2635 		if (cap->ftm.type.pd_support &&
2636 		    nla_put_flag(msg, NL80211_PMSR_FTM_TYPE_CAPA_ATTR_PD_SUPPORT))
2637 			return -ENOBUFS;
2638 
2639 		nla_nest_end(msg, pd_caps);
2640 	}
2641 
2642 	if (cap->ftm.concurrent_ista_rsta_support &&
2643 	    nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_CONCURRENT_ISTA_RSTA_SUPPORT))
2644 		return -ENOBUFS;
2645 
2646 	if (cap->ftm.type.pd_support) {
2647 		if (cap->ftm.pd_preambles &&
2648 		    nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PD_PREAMBLES,
2649 				cap->ftm.pd_preambles))
2650 			return -ENOBUFS;
2651 		if (cap->ftm.pd_bandwidths &&
2652 		    nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PD_BANDWIDTHS,
2653 				cap->ftm.pd_bandwidths))
2654 			return -ENOBUFS;
2655 	}
2656 
2657 	nla_nest_end(msg, ftm);
2658 	return 0;
2659 }
2660 
2661 static int nl80211_send_pmsr_capa(struct cfg80211_registered_device *rdev,
2662 				  struct sk_buff *msg)
2663 {
2664 	const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa;
2665 	struct nlattr *pmsr, *caps;
2666 
2667 	if (!cap)
2668 		return 0;
2669 
2670 	/*
2671 	 * we don't need to clean up anything here since the caller
2672 	 * will genlmsg_cancel() if we fail
2673 	 */
2674 
2675 	pmsr = nla_nest_start_noflag(msg, NL80211_ATTR_PEER_MEASUREMENTS);
2676 	if (!pmsr)
2677 		return -ENOBUFS;
2678 
2679 	if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers))
2680 		return -ENOBUFS;
2681 
2682 	if (cap->report_ap_tsf &&
2683 	    nla_put_flag(msg, NL80211_PMSR_ATTR_REPORT_AP_TSF))
2684 		return -ENOBUFS;
2685 
2686 	if (cap->randomize_mac_addr &&
2687 	    nla_put_flag(msg, NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR))
2688 		return -ENOBUFS;
2689 
2690 	caps = nla_nest_start_noflag(msg, NL80211_PMSR_ATTR_TYPE_CAPA);
2691 	if (!caps)
2692 		return -ENOBUFS;
2693 
2694 	if (nl80211_send_pmsr_ftm_capa(cap, msg))
2695 		return -ENOBUFS;
2696 
2697 	nla_nest_end(msg, caps);
2698 	nla_nest_end(msg, pmsr);
2699 
2700 	return 0;
2701 }
2702 
2703 static int
2704 nl80211_put_iftype_akm_suites(struct cfg80211_registered_device *rdev,
2705 			      struct sk_buff *msg)
2706 {
2707 	int i;
2708 	struct nlattr *nested, *nested_akms;
2709 	const struct wiphy_iftype_akm_suites *iftype_akms;
2710 
2711 	if (!rdev->wiphy.num_iftype_akm_suites ||
2712 	    !rdev->wiphy.iftype_akm_suites)
2713 		return 0;
2714 
2715 	nested = nla_nest_start(msg, NL80211_ATTR_IFTYPE_AKM_SUITES);
2716 	if (!nested)
2717 		return -ENOBUFS;
2718 
2719 	for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) {
2720 		nested_akms = nla_nest_start(msg, i + 1);
2721 		if (!nested_akms)
2722 			return -ENOBUFS;
2723 
2724 		iftype_akms = &rdev->wiphy.iftype_akm_suites[i];
2725 
2726 		if (nl80211_put_iftypes(msg, NL80211_IFTYPE_AKM_ATTR_IFTYPES,
2727 					iftype_akms->iftypes_mask))
2728 			return -ENOBUFS;
2729 
2730 		if (nla_put(msg, NL80211_IFTYPE_AKM_ATTR_SUITES,
2731 			    sizeof(u32) * iftype_akms->n_akm_suites,
2732 			    iftype_akms->akm_suites)) {
2733 			return -ENOBUFS;
2734 		}
2735 		nla_nest_end(msg, nested_akms);
2736 	}
2737 
2738 	nla_nest_end(msg, nested);
2739 
2740 	return 0;
2741 }
2742 
2743 static int
2744 nl80211_put_tid_config_support(struct cfg80211_registered_device *rdev,
2745 			       struct sk_buff *msg)
2746 {
2747 	struct nlattr *supp;
2748 
2749 	if (!rdev->wiphy.tid_config_support.vif &&
2750 	    !rdev->wiphy.tid_config_support.peer)
2751 		return 0;
2752 
2753 	supp = nla_nest_start(msg, NL80211_ATTR_TID_CONFIG);
2754 	if (!supp)
2755 		return -ENOSPC;
2756 
2757 	if (rdev->wiphy.tid_config_support.vif &&
2758 	    nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_VIF_SUPP,
2759 			      rdev->wiphy.tid_config_support.vif,
2760 			      NL80211_TID_CONFIG_ATTR_PAD))
2761 		goto fail;
2762 
2763 	if (rdev->wiphy.tid_config_support.peer &&
2764 	    nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_PEER_SUPP,
2765 			      rdev->wiphy.tid_config_support.peer,
2766 			      NL80211_TID_CONFIG_ATTR_PAD))
2767 		goto fail;
2768 
2769 	/* for now we just use the same value ... makes more sense */
2770 	if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_SHORT,
2771 		       rdev->wiphy.tid_config_support.max_retry))
2772 		goto fail;
2773 	if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_LONG,
2774 		       rdev->wiphy.tid_config_support.max_retry))
2775 		goto fail;
2776 
2777 	nla_nest_end(msg, supp);
2778 
2779 	return 0;
2780 fail:
2781 	nla_nest_cancel(msg, supp);
2782 	return -ENOBUFS;
2783 }
2784 
2785 static int
2786 nl80211_put_sar_specs(struct cfg80211_registered_device *rdev,
2787 		      struct sk_buff *msg)
2788 {
2789 	struct nlattr *sar_capa, *specs, *sub_freq_range;
2790 	u8 num_freq_ranges;
2791 	int i;
2792 
2793 	if (!rdev->wiphy.sar_capa)
2794 		return 0;
2795 
2796 	num_freq_ranges = rdev->wiphy.sar_capa->num_freq_ranges;
2797 
2798 	sar_capa = nla_nest_start(msg, NL80211_ATTR_SAR_SPEC);
2799 	if (!sar_capa)
2800 		return -ENOSPC;
2801 
2802 	if (nla_put_u32(msg, NL80211_SAR_ATTR_TYPE, rdev->wiphy.sar_capa->type))
2803 		goto fail;
2804 
2805 	specs = nla_nest_start(msg, NL80211_SAR_ATTR_SPECS);
2806 	if (!specs)
2807 		goto fail;
2808 
2809 	/* report supported freq_ranges */
2810 	for (i = 0; i < num_freq_ranges; i++) {
2811 		sub_freq_range = nla_nest_start(msg, i + 1);
2812 		if (!sub_freq_range)
2813 			goto fail;
2814 
2815 		if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_START_FREQ,
2816 				rdev->wiphy.sar_capa->freq_ranges[i].start_freq))
2817 			goto fail;
2818 
2819 		if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_END_FREQ,
2820 				rdev->wiphy.sar_capa->freq_ranges[i].end_freq))
2821 			goto fail;
2822 
2823 		nla_nest_end(msg, sub_freq_range);
2824 	}
2825 
2826 	nla_nest_end(msg, specs);
2827 	nla_nest_end(msg, sar_capa);
2828 
2829 	return 0;
2830 fail:
2831 	nla_nest_cancel(msg, sar_capa);
2832 	return -ENOBUFS;
2833 }
2834 
2835 static int nl80211_put_mbssid_support(struct wiphy *wiphy, struct sk_buff *msg)
2836 {
2837 	struct nlattr *config;
2838 
2839 	if (!wiphy->mbssid_max_interfaces)
2840 		return 0;
2841 
2842 	config = nla_nest_start(msg, NL80211_ATTR_MBSSID_CONFIG);
2843 	if (!config)
2844 		return -ENOBUFS;
2845 
2846 	if (nla_put_u8(msg, NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES,
2847 		       wiphy->mbssid_max_interfaces))
2848 		goto fail;
2849 
2850 	if (wiphy->ema_max_profile_periodicity &&
2851 	    nla_put_u8(msg,
2852 		       NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY,
2853 		       wiphy->ema_max_profile_periodicity))
2854 		goto fail;
2855 
2856 	nla_nest_end(msg, config);
2857 	return 0;
2858 
2859 fail:
2860 	nla_nest_cancel(msg, config);
2861 	return -ENOBUFS;
2862 }
2863 
2864 static int nl80211_put_radio(struct wiphy *wiphy, struct sk_buff *msg, int idx)
2865 {
2866 	const struct wiphy_radio *r = &wiphy->radio[idx];
2867 	const struct wiphy_radio_cfg *rcfg = &wiphy->radio_cfg[idx];
2868 	struct nlattr *radio, *freq;
2869 	int i;
2870 
2871 	radio = nla_nest_start(msg, idx);
2872 	if (!radio)
2873 		return -ENOBUFS;
2874 
2875 	if (nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_INDEX, idx))
2876 		goto nla_put_failure;
2877 
2878 	if (rcfg->rts_threshold &&
2879 	    nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_RTS_THRESHOLD,
2880 			rcfg->rts_threshold))
2881 		goto nla_put_failure;
2882 
2883 	if (r->antenna_mask &&
2884 	    nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_ANTENNA_MASK,
2885 			r->antenna_mask))
2886 		goto nla_put_failure;
2887 
2888 	for (i = 0; i < r->n_freq_range; i++) {
2889 		const struct wiphy_radio_freq_range *range = &r->freq_range[i];
2890 
2891 		freq = nla_nest_start(msg, NL80211_WIPHY_RADIO_ATTR_FREQ_RANGE);
2892 		if (!freq)
2893 			goto nla_put_failure;
2894 
2895 		if (nla_put_u32(msg, NL80211_WIPHY_RADIO_FREQ_ATTR_START,
2896 				range->start_freq) ||
2897 		    nla_put_u32(msg, NL80211_WIPHY_RADIO_FREQ_ATTR_END,
2898 				range->end_freq))
2899 			goto nla_put_failure;
2900 
2901 		nla_nest_end(msg, freq);
2902 	}
2903 
2904 	for (i = 0; i < r->n_iface_combinations; i++)
2905 		if (nl80211_put_ifcomb_data(msg, true,
2906 					    NL80211_WIPHY_RADIO_ATTR_INTERFACE_COMBINATION,
2907 					    &r->iface_combinations[i],
2908 					    NLA_F_NESTED))
2909 			goto nla_put_failure;
2910 
2911 	nla_nest_end(msg, radio);
2912 
2913 	return 0;
2914 
2915 nla_put_failure:
2916 	return -ENOBUFS;
2917 }
2918 
2919 static int nl80211_put_radios(struct wiphy *wiphy, struct sk_buff *msg)
2920 {
2921 	struct nlattr *radios;
2922 	int i;
2923 
2924 	if (!wiphy->n_radio)
2925 		return 0;
2926 
2927 	radios = nla_nest_start(msg, NL80211_ATTR_WIPHY_RADIOS);
2928 	if (!radios)
2929 		return -ENOBUFS;
2930 
2931 	for (i = 0; i < wiphy->n_radio; i++)
2932 		if (nl80211_put_radio(wiphy, msg, i))
2933 			goto fail;
2934 
2935 	nla_nest_end(msg, radios);
2936 
2937 	if (nl80211_put_iface_combinations(wiphy, msg,
2938 					   NL80211_ATTR_WIPHY_INTERFACE_COMBINATIONS,
2939 					   -1, true, NLA_F_NESTED))
2940 		return -ENOBUFS;
2941 
2942 	return 0;
2943 
2944 fail:
2945 	nla_nest_cancel(msg, radios);
2946 	return -ENOBUFS;
2947 }
2948 
2949 static int nl80211_put_nan_phy_cap(struct wiphy *wiphy, struct sk_buff *msg)
2950 {
2951 	struct nlattr *nl_phy_cap;
2952 	const struct ieee80211_sta_ht_cap *ht_cap;
2953 	const struct ieee80211_sta_vht_cap *vht_cap;
2954 	const struct ieee80211_sta_he_cap *he_cap;
2955 
2956 	if (!cfg80211_iftype_allowed(wiphy, NL80211_IFTYPE_NAN_DATA, false, 0))
2957 		return 0;
2958 
2959 	ht_cap = &wiphy->nan_capa.phy.ht;
2960 	vht_cap = &wiphy->nan_capa.phy.vht;
2961 	he_cap = &wiphy->nan_capa.phy.he;
2962 
2963 	/* HT is mandatory */
2964 	if (WARN_ON(!ht_cap->ht_supported))
2965 		return 0;
2966 
2967 	nl_phy_cap = nla_nest_start_noflag(msg, NL80211_NAN_CAPA_PHY);
2968 	if (!nl_phy_cap)
2969 		return -ENOBUFS;
2970 
2971 	if (nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HT_MCS_SET,
2972 		    sizeof(ht_cap->mcs), &ht_cap->mcs) ||
2973 	    nla_put_u16(msg, NL80211_NAN_PHY_CAP_ATTR_HT_CAPA, ht_cap->cap) ||
2974 	    nla_put_u8(msg, NL80211_NAN_PHY_CAP_ATTR_HT_AMPDU_FACTOR,
2975 		       ht_cap->ampdu_factor) ||
2976 	    nla_put_u8(msg, NL80211_NAN_PHY_CAP_ATTR_HT_AMPDU_DENSITY,
2977 		       ht_cap->ampdu_density))
2978 		goto fail;
2979 
2980 	if (vht_cap->vht_supported) {
2981 		if (nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_VHT_MCS_SET,
2982 			    sizeof(vht_cap->vht_mcs), &vht_cap->vht_mcs) ||
2983 		    nla_put_u32(msg, NL80211_NAN_PHY_CAP_ATTR_VHT_CAPA,
2984 				vht_cap->cap))
2985 			goto fail;
2986 	}
2987 
2988 	if (he_cap->has_he) {
2989 		if (nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HE_MAC,
2990 			    sizeof(he_cap->he_cap_elem.mac_cap_info),
2991 			    he_cap->he_cap_elem.mac_cap_info) ||
2992 		    nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HE_PHY,
2993 			    sizeof(he_cap->he_cap_elem.phy_cap_info),
2994 			    he_cap->he_cap_elem.phy_cap_info) ||
2995 		    nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HE_MCS_SET,
2996 			    sizeof(he_cap->he_mcs_nss_supp),
2997 			    &he_cap->he_mcs_nss_supp) ||
2998 		    nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HE_PPE,
2999 			    sizeof(he_cap->ppe_thres), he_cap->ppe_thres))
3000 			goto fail;
3001 	}
3002 
3003 	nla_nest_end(msg, nl_phy_cap);
3004 	return 0;
3005 
3006 fail:
3007 	nla_nest_cancel(msg, nl_phy_cap);
3008 	return -ENOBUFS;
3009 }
3010 
3011 static int nl80211_put_nan_capa(struct wiphy *wiphy, struct sk_buff *msg)
3012 {
3013 	struct nlattr *nan_caps;
3014 
3015 	nan_caps = nla_nest_start(msg, NL80211_ATTR_NAN_CAPABILITIES);
3016 	if (!nan_caps)
3017 		return -ENOBUFS;
3018 
3019 	if (wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_CONFIGURABLE_SYNC &&
3020 	    nla_put_flag(msg, NL80211_NAN_CAPA_CONFIGURABLE_SYNC))
3021 		goto fail;
3022 
3023 	if ((wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE) &&
3024 	    nla_put_flag(msg, NL80211_NAN_CAPA_USERSPACE_DE))
3025 		goto fail;
3026 
3027 	if (nla_put_u8(msg, NL80211_NAN_CAPA_OP_MODE,
3028 		       wiphy->nan_capa.op_mode) ||
3029 	    nla_put_u8(msg, NL80211_NAN_CAPA_NUM_ANTENNAS,
3030 		       wiphy->nan_capa.n_antennas) ||
3031 	    nla_put_u16(msg, NL80211_NAN_CAPA_MAX_CHANNEL_SWITCH_TIME,
3032 			wiphy->nan_capa.max_channel_switch_time) ||
3033 	    nla_put_u8(msg, NL80211_NAN_CAPA_CAPABILITIES,
3034 		       wiphy->nan_capa.dev_capabilities))
3035 		goto fail;
3036 
3037 	if (nl80211_put_nan_phy_cap(wiphy, msg))
3038 		goto fail;
3039 
3040 	nla_nest_end(msg, nan_caps);
3041 
3042 	return 0;
3043 
3044 fail:
3045 	nla_nest_cancel(msg, nan_caps);
3046 	return -ENOBUFS;
3047 }
3048 
3049 struct nl80211_dump_wiphy_state {
3050 	s64 filter_wiphy;
3051 	long start;
3052 	long split_start, band_start, chan_start, capa_start;
3053 	bool split;
3054 };
3055 
3056 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
3057 			      enum nl80211_commands cmd,
3058 			      struct sk_buff *msg, u32 portid, u32 seq,
3059 			      int flags, struct nl80211_dump_wiphy_state *state)
3060 {
3061 	void *hdr;
3062 	struct nlattr *nl_bands, *nl_band;
3063 	struct nlattr *nl_freqs, *nl_freq;
3064 	struct nlattr *nl_cmds;
3065 	enum nl80211_band band;
3066 	struct ieee80211_channel *chan;
3067 	int i;
3068 	const struct ieee80211_txrx_stypes *mgmt_stypes =
3069 				rdev->wiphy.mgmt_stypes;
3070 	u32 features;
3071 
3072 	hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
3073 	if (!hdr)
3074 		return -ENOBUFS;
3075 
3076 	if (WARN_ON(!state))
3077 		return -EINVAL;
3078 
3079 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
3080 	    nla_put_string(msg, NL80211_ATTR_WIPHY_NAME,
3081 			   wiphy_name(&rdev->wiphy)) ||
3082 	    nla_put_u32(msg, NL80211_ATTR_GENERATION,
3083 			cfg80211_rdev_list_generation))
3084 		goto nla_put_failure;
3085 
3086 	if (cmd != NL80211_CMD_NEW_WIPHY)
3087 		goto finish;
3088 
3089 	switch (state->split_start) {
3090 	case 0:
3091 		if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
3092 			       rdev->wiphy.retry_short) ||
3093 		    nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
3094 			       rdev->wiphy.retry_long) ||
3095 		    nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
3096 				rdev->wiphy.frag_threshold) ||
3097 		    nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
3098 				rdev->wiphy.rts_threshold) ||
3099 		    nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS,
3100 			       rdev->wiphy.coverage_class) ||
3101 		    nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
3102 			       rdev->wiphy.max_scan_ssids) ||
3103 		    nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
3104 			       rdev->wiphy.max_sched_scan_ssids) ||
3105 		    nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
3106 				rdev->wiphy.max_scan_ie_len) ||
3107 		    nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
3108 				rdev->wiphy.max_sched_scan_ie_len) ||
3109 		    nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS,
3110 			       rdev->wiphy.max_match_sets))
3111 			goto nla_put_failure;
3112 
3113 		if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) &&
3114 		    nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN))
3115 			goto nla_put_failure;
3116 		if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
3117 		    nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH))
3118 			goto nla_put_failure;
3119 		if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) &&
3120 		    nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD))
3121 			goto nla_put_failure;
3122 		if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) &&
3123 		    nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT))
3124 			goto nla_put_failure;
3125 		if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) &&
3126 		    nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT))
3127 			goto nla_put_failure;
3128 		if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) &&
3129 		    nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP))
3130 			goto nla_put_failure;
3131 		state->split_start++;
3132 		if (state->split)
3133 			break;
3134 		fallthrough;
3135 	case 1:
3136 		if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES,
3137 			    sizeof(u32) * rdev->wiphy.n_cipher_suites,
3138 			    rdev->wiphy.cipher_suites))
3139 			goto nla_put_failure;
3140 
3141 		if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS,
3142 			       rdev->wiphy.max_num_pmkids))
3143 			goto nla_put_failure;
3144 
3145 		if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
3146 		    nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE))
3147 			goto nla_put_failure;
3148 
3149 		if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
3150 				rdev->wiphy.available_antennas_tx) ||
3151 		    nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
3152 				rdev->wiphy.available_antennas_rx))
3153 			goto nla_put_failure;
3154 
3155 		if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) &&
3156 		    nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD,
3157 				rdev->wiphy.probe_resp_offload))
3158 			goto nla_put_failure;
3159 
3160 		if ((rdev->wiphy.available_antennas_tx ||
3161 		     rdev->wiphy.available_antennas_rx) &&
3162 		    rdev->ops->get_antenna) {
3163 			u32 tx_ant = 0, rx_ant = 0;
3164 			int res;
3165 
3166 			res = rdev_get_antenna(rdev, -1, &tx_ant, &rx_ant);
3167 			if (!res) {
3168 				if (nla_put_u32(msg,
3169 						NL80211_ATTR_WIPHY_ANTENNA_TX,
3170 						tx_ant) ||
3171 				    nla_put_u32(msg,
3172 						NL80211_ATTR_WIPHY_ANTENNA_RX,
3173 						rx_ant))
3174 					goto nla_put_failure;
3175 			}
3176 		}
3177 
3178 		state->split_start++;
3179 		if (state->split)
3180 			break;
3181 		fallthrough;
3182 	case 2:
3183 		if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
3184 					rdev->wiphy.interface_modes))
3185 				goto nla_put_failure;
3186 		state->split_start++;
3187 		if (state->split)
3188 			break;
3189 		fallthrough;
3190 	case 3:
3191 		nl_bands = nla_nest_start_noflag(msg,
3192 						 NL80211_ATTR_WIPHY_BANDS);
3193 		if (!nl_bands)
3194 			goto nla_put_failure;
3195 
3196 		for (band = state->band_start;
3197 		     band < (state->split ?
3198 				NUM_NL80211_BANDS :
3199 				NL80211_BAND_60GHZ + 1);
3200 		     band++) {
3201 			struct ieee80211_supported_band *sband;
3202 
3203 			/* omit higher bands for ancient software */
3204 			if (band > NL80211_BAND_5GHZ && !state->split)
3205 				break;
3206 
3207 			sband = rdev->wiphy.bands[band];
3208 
3209 			if (!sband)
3210 				continue;
3211 
3212 			nl_band = nla_nest_start_noflag(msg, band);
3213 			if (!nl_band)
3214 				goto nla_put_failure;
3215 
3216 			switch (state->chan_start) {
3217 			case 0:
3218 				if (nl80211_send_band_rateinfo(msg, sband,
3219 							       state->split))
3220 					goto nla_put_failure;
3221 				state->chan_start++;
3222 				if (state->split)
3223 					break;
3224 				fallthrough;
3225 			default:
3226 				/* add frequencies */
3227 				nl_freqs = nla_nest_start_noflag(msg,
3228 								 NL80211_BAND_ATTR_FREQS);
3229 				if (!nl_freqs)
3230 					goto nla_put_failure;
3231 
3232 				for (i = state->chan_start - 1;
3233 				     i < sband->n_channels;
3234 				     i++) {
3235 					nl_freq = nla_nest_start_noflag(msg,
3236 									i);
3237 					if (!nl_freq)
3238 						goto nla_put_failure;
3239 
3240 					chan = &sband->channels[i];
3241 
3242 					if (nl80211_msg_put_channel(
3243 							msg, &rdev->wiphy, chan,
3244 							state->split))
3245 						goto nla_put_failure;
3246 
3247 					nla_nest_end(msg, nl_freq);
3248 					if (state->split)
3249 						break;
3250 				}
3251 				if (i < sband->n_channels)
3252 					state->chan_start = i + 2;
3253 				else
3254 					state->chan_start = 0;
3255 				nla_nest_end(msg, nl_freqs);
3256 			}
3257 
3258 			nla_nest_end(msg, nl_band);
3259 
3260 			if (state->split) {
3261 				/* start again here */
3262 				if (state->chan_start)
3263 					band--;
3264 				break;
3265 			}
3266 		}
3267 		nla_nest_end(msg, nl_bands);
3268 
3269 		if (band < NUM_NL80211_BANDS)
3270 			state->band_start = band + 1;
3271 		else
3272 			state->band_start = 0;
3273 
3274 		/* if bands & channels are done, continue outside */
3275 		if (state->band_start == 0 && state->chan_start == 0)
3276 			state->split_start++;
3277 		if (state->split)
3278 			break;
3279 		fallthrough;
3280 	case 4:
3281 		nl_cmds = nla_nest_start_noflag(msg,
3282 						NL80211_ATTR_SUPPORTED_COMMANDS);
3283 		if (!nl_cmds)
3284 			goto nla_put_failure;
3285 
3286 		i = nl80211_add_commands_unsplit(rdev, msg);
3287 		if (i < 0)
3288 			goto nla_put_failure;
3289 		if (state->split) {
3290 			CMD(crit_proto_start, CRIT_PROTOCOL_START);
3291 			CMD(crit_proto_stop, CRIT_PROTOCOL_STOP);
3292 			if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)
3293 				CMD(channel_switch, CHANNEL_SWITCH);
3294 			CMD(set_qos_map, SET_QOS_MAP);
3295 			if (rdev->wiphy.features &
3296 					NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)
3297 				CMD(add_tx_ts, ADD_TX_TS);
3298 			CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST);
3299 			CMD(update_connect_params, UPDATE_CONNECT_PARAMS);
3300 			CMD(update_ft_ies, UPDATE_FT_IES);
3301 			if (rdev->wiphy.sar_capa)
3302 				CMD(set_sar_specs, SET_SAR_SPECS);
3303 			CMD(assoc_ml_reconf, ASSOC_MLO_RECONF);
3304 		}
3305 #undef CMD
3306 
3307 		nla_nest_end(msg, nl_cmds);
3308 		state->split_start++;
3309 		if (state->split)
3310 			break;
3311 		fallthrough;
3312 	case 5:
3313 		if (rdev->ops->remain_on_channel &&
3314 		    (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) &&
3315 		    nla_put_u32(msg,
3316 				NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
3317 				rdev->wiphy.max_remain_on_channel_duration))
3318 			goto nla_put_failure;
3319 
3320 		if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) &&
3321 		    nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK))
3322 			goto nla_put_failure;
3323 
3324 		state->split_start++;
3325 		if (state->split)
3326 			break;
3327 		fallthrough;
3328 	case 6:
3329 #ifdef CONFIG_PM
3330 		if (nl80211_send_wowlan(msg, rdev, state->split))
3331 			goto nla_put_failure;
3332 		state->split_start++;
3333 		if (state->split)
3334 			break;
3335 #else
3336 		state->split_start++;
3337 #endif
3338 		fallthrough;
3339 	case 7:
3340 		if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
3341 					rdev->wiphy.software_iftypes))
3342 			goto nla_put_failure;
3343 
3344 		if (nl80211_put_iface_combinations(&rdev->wiphy, msg,
3345 						   NL80211_ATTR_INTERFACE_COMBINATIONS,
3346 						   rdev->wiphy.n_radio ? 0 : -1,
3347 						   state->split, 0))
3348 			goto nla_put_failure;
3349 
3350 		state->split_start++;
3351 		if (state->split)
3352 			break;
3353 		fallthrough;
3354 	case 8:
3355 		if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) &&
3356 		    nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME,
3357 				rdev->wiphy.ap_sme_capa))
3358 			goto nla_put_failure;
3359 
3360 		features = rdev->wiphy.features;
3361 		/*
3362 		 * We can only add the per-channel limit information if the
3363 		 * dump is split, otherwise it makes it too big. Therefore
3364 		 * only advertise it in that case.
3365 		 */
3366 		if (state->split)
3367 			features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS;
3368 		if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features))
3369 			goto nla_put_failure;
3370 
3371 		if (rdev->wiphy.ht_capa_mod_mask &&
3372 		    nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK,
3373 			    sizeof(*rdev->wiphy.ht_capa_mod_mask),
3374 			    rdev->wiphy.ht_capa_mod_mask))
3375 			goto nla_put_failure;
3376 
3377 		if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME &&
3378 		    rdev->wiphy.max_acl_mac_addrs &&
3379 		    nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX,
3380 				rdev->wiphy.max_acl_mac_addrs))
3381 			goto nla_put_failure;
3382 
3383 		/*
3384 		 * Any information below this point is only available to
3385 		 * applications that can deal with it being split. This
3386 		 * helps ensure that newly added capabilities don't break
3387 		 * older tools by overrunning their buffers.
3388 		 *
3389 		 * We still increment split_start so that in the split
3390 		 * case we'll continue with more data in the next round,
3391 		 * but break unconditionally so unsplit data stops here.
3392 		 */
3393 		if (state->split)
3394 			state->split_start++;
3395 		else
3396 			state->split_start = 0;
3397 		break;
3398 	case 9:
3399 		if (nl80211_send_mgmt_stypes(msg, mgmt_stypes))
3400 			goto nla_put_failure;
3401 
3402 		if (nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS,
3403 				rdev->wiphy.max_sched_scan_plans) ||
3404 		    nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL,
3405 				rdev->wiphy.max_sched_scan_plan_interval) ||
3406 		    nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
3407 				rdev->wiphy.max_sched_scan_plan_iterations))
3408 			goto nla_put_failure;
3409 
3410 		if (rdev->wiphy.extended_capabilities &&
3411 		    (nla_put(msg, NL80211_ATTR_EXT_CAPA,
3412 			     rdev->wiphy.extended_capabilities_len,
3413 			     rdev->wiphy.extended_capabilities) ||
3414 		     nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
3415 			     rdev->wiphy.extended_capabilities_len,
3416 			     rdev->wiphy.extended_capabilities_mask)))
3417 			goto nla_put_failure;
3418 
3419 		if (rdev->wiphy.vht_capa_mod_mask &&
3420 		    nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK,
3421 			    sizeof(*rdev->wiphy.vht_capa_mod_mask),
3422 			    rdev->wiphy.vht_capa_mod_mask))
3423 			goto nla_put_failure;
3424 
3425 		if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN,
3426 			    rdev->wiphy.perm_addr))
3427 			goto nla_put_failure;
3428 
3429 		if (!is_zero_ether_addr(rdev->wiphy.addr_mask) &&
3430 		    nla_put(msg, NL80211_ATTR_MAC_MASK, ETH_ALEN,
3431 			    rdev->wiphy.addr_mask))
3432 			goto nla_put_failure;
3433 
3434 		if (rdev->wiphy.n_addresses > 1) {
3435 			void *attr;
3436 
3437 			attr = nla_nest_start(msg, NL80211_ATTR_MAC_ADDRS);
3438 			if (!attr)
3439 				goto nla_put_failure;
3440 
3441 			for (i = 0; i < rdev->wiphy.n_addresses; i++)
3442 				if (nla_put(msg, i + 1, ETH_ALEN,
3443 					    rdev->wiphy.addresses[i].addr))
3444 					goto nla_put_failure;
3445 
3446 			nla_nest_end(msg, attr);
3447 		}
3448 
3449 		state->split_start++;
3450 		break;
3451 	case 10:
3452 		if (nl80211_send_coalesce(msg, rdev))
3453 			goto nla_put_failure;
3454 
3455 		if (rdev->wiphy.max_ap_assoc_sta &&
3456 		    nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA,
3457 				rdev->wiphy.max_ap_assoc_sta))
3458 			goto nla_put_failure;
3459 
3460 		state->split_start++;
3461 		break;
3462 	case 11:
3463 		if (rdev->wiphy.n_vendor_commands) {
3464 			const struct nl80211_vendor_cmd_info *info;
3465 			struct nlattr *nested;
3466 
3467 			nested = nla_nest_start_noflag(msg,
3468 						       NL80211_ATTR_VENDOR_DATA);
3469 			if (!nested)
3470 				goto nla_put_failure;
3471 
3472 			for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
3473 				info = &rdev->wiphy.vendor_commands[i].info;
3474 				if (nla_put(msg, i + 1, sizeof(*info), info))
3475 					goto nla_put_failure;
3476 			}
3477 			nla_nest_end(msg, nested);
3478 		}
3479 
3480 		if (rdev->wiphy.n_vendor_events) {
3481 			const struct nl80211_vendor_cmd_info *info;
3482 			struct nlattr *nested;
3483 
3484 			nested = nla_nest_start_noflag(msg,
3485 						       NL80211_ATTR_VENDOR_EVENTS);
3486 			if (!nested)
3487 				goto nla_put_failure;
3488 
3489 			for (i = 0; i < rdev->wiphy.n_vendor_events; i++) {
3490 				info = &rdev->wiphy.vendor_events[i];
3491 				if (nla_put(msg, i + 1, sizeof(*info), info))
3492 					goto nla_put_failure;
3493 			}
3494 			nla_nest_end(msg, nested);
3495 		}
3496 		state->split_start++;
3497 		break;
3498 	case 12:
3499 		if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH &&
3500 		    nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS,
3501 			       rdev->wiphy.max_num_csa_counters))
3502 			goto nla_put_failure;
3503 
3504 		if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
3505 		    nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
3506 			goto nla_put_failure;
3507 
3508 		if (rdev->wiphy.max_sched_scan_reqs &&
3509 		    nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS,
3510 				rdev->wiphy.max_sched_scan_reqs))
3511 			goto nla_put_failure;
3512 
3513 		if (nla_put(msg, NL80211_ATTR_EXT_FEATURES,
3514 			    sizeof(rdev->wiphy.ext_features),
3515 			    rdev->wiphy.ext_features))
3516 			goto nla_put_failure;
3517 
3518 		if (rdev->wiphy.bss_param_support) {
3519 			struct nlattr *nested;
3520 			u32 parsup = rdev->wiphy.bss_param_support;
3521 
3522 			nested = nla_nest_start(msg, NL80211_ATTR_BSS_PARAM);
3523 			if (!nested)
3524 				goto nla_put_failure;
3525 
3526 			if ((parsup & WIPHY_BSS_PARAM_CTS_PROT) &&
3527 			    nla_put_flag(msg, NL80211_ATTR_BSS_CTS_PROT))
3528 				goto nla_put_failure;
3529 			if ((parsup & WIPHY_BSS_PARAM_SHORT_PREAMBLE) &&
3530 			    nla_put_flag(msg, NL80211_ATTR_BSS_SHORT_PREAMBLE))
3531 				goto nla_put_failure;
3532 			if ((parsup & WIPHY_BSS_PARAM_SHORT_SLOT_TIME) &&
3533 			    nla_put_flag(msg, NL80211_ATTR_BSS_SHORT_SLOT_TIME))
3534 				goto nla_put_failure;
3535 			if ((parsup & WIPHY_BSS_PARAM_BASIC_RATES) &&
3536 			    nla_put_flag(msg, NL80211_ATTR_BSS_BASIC_RATES))
3537 				goto nla_put_failure;
3538 			if ((parsup & WIPHY_BSS_PARAM_AP_ISOLATE) &&
3539 			    nla_put_flag(msg, NL80211_ATTR_AP_ISOLATE))
3540 				goto nla_put_failure;
3541 			if ((parsup & WIPHY_BSS_PARAM_HT_OPMODE) &&
3542 			    nla_put_flag(msg, NL80211_ATTR_BSS_HT_OPMODE))
3543 				goto nla_put_failure;
3544 			if ((parsup & WIPHY_BSS_PARAM_P2P_CTWINDOW) &&
3545 			    nla_put_flag(msg, NL80211_ATTR_P2P_CTWINDOW))
3546 				goto nla_put_failure;
3547 			if ((parsup & WIPHY_BSS_PARAM_P2P_OPPPS) &&
3548 			    nla_put_flag(msg, NL80211_ATTR_P2P_OPPPS))
3549 				goto nla_put_failure;
3550 			nla_nest_end(msg, nested);
3551 		}
3552 		if (rdev->wiphy.bss_select_support) {
3553 			struct nlattr *nested;
3554 			u32 bss_select_support = rdev->wiphy.bss_select_support;
3555 
3556 			nested = nla_nest_start_noflag(msg,
3557 						       NL80211_ATTR_BSS_SELECT);
3558 			if (!nested)
3559 				goto nla_put_failure;
3560 
3561 			i = 0;
3562 			while (bss_select_support) {
3563 				if ((bss_select_support & 1) &&
3564 				    nla_put_flag(msg, i))
3565 					goto nla_put_failure;
3566 				i++;
3567 				bss_select_support >>= 1;
3568 			}
3569 			nla_nest_end(msg, nested);
3570 		}
3571 
3572 		state->split_start++;
3573 		break;
3574 	case 13:
3575 		if (rdev->wiphy.num_iftype_ext_capab &&
3576 		    rdev->wiphy.iftype_ext_capab) {
3577 			struct nlattr *nested_ext_capab, *nested;
3578 
3579 			nested = nla_nest_start_noflag(msg,
3580 						       NL80211_ATTR_IFTYPE_EXT_CAPA);
3581 			if (!nested)
3582 				goto nla_put_failure;
3583 
3584 			for (i = state->capa_start;
3585 			     i < rdev->wiphy.num_iftype_ext_capab; i++) {
3586 				const struct wiphy_iftype_ext_capab *capab;
3587 
3588 				capab = &rdev->wiphy.iftype_ext_capab[i];
3589 
3590 				nested_ext_capab = nla_nest_start_noflag(msg,
3591 									 i);
3592 				if (!nested_ext_capab ||
3593 				    nla_put_u32(msg, NL80211_ATTR_IFTYPE,
3594 						capab->iftype) ||
3595 				    nla_put(msg, NL80211_ATTR_EXT_CAPA,
3596 					    capab->extended_capabilities_len,
3597 					    capab->extended_capabilities) ||
3598 				    nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
3599 					    capab->extended_capabilities_len,
3600 					    capab->extended_capabilities_mask))
3601 					goto nla_put_failure;
3602 
3603 				if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO &&
3604 				    (nla_put_u16(msg,
3605 						 NL80211_ATTR_EML_CAPABILITY,
3606 						 capab->eml_capabilities) ||
3607 				     nla_put_u16(msg,
3608 						 NL80211_ATTR_MLD_CAPA_AND_OPS,
3609 						 capab->mld_capa_and_ops)))
3610 					goto nla_put_failure;
3611 				if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO &&
3612 				    capab->ext_mld_capa_and_ops &&
3613 				    nla_put_u16(msg,
3614 						NL80211_ATTR_EXT_MLD_CAPA_AND_OPS,
3615 						capab->ext_mld_capa_and_ops))
3616 					goto nla_put_failure;
3617 
3618 				nla_nest_end(msg, nested_ext_capab);
3619 				if (state->split)
3620 					break;
3621 			}
3622 			nla_nest_end(msg, nested);
3623 			if (i < rdev->wiphy.num_iftype_ext_capab) {
3624 				state->capa_start = i + 1;
3625 				break;
3626 			}
3627 		}
3628 
3629 		if (nla_put_u32(msg, NL80211_ATTR_BANDS,
3630 				rdev->wiphy.nan_supported_bands))
3631 			goto nla_put_failure;
3632 
3633 		if (wiphy_ext_feature_isset(&rdev->wiphy,
3634 					    NL80211_EXT_FEATURE_TXQS)) {
3635 			struct cfg80211_txq_stats txqstats = {};
3636 			int res;
3637 
3638 			res = rdev_get_txq_stats(rdev, NULL, &txqstats);
3639 			if (!res &&
3640 			    !nl80211_put_txq_stats(msg, &txqstats,
3641 						   NL80211_ATTR_TXQ_STATS))
3642 				goto nla_put_failure;
3643 
3644 			if (nla_put_u32(msg, NL80211_ATTR_TXQ_LIMIT,
3645 					rdev->wiphy.txq_limit))
3646 				goto nla_put_failure;
3647 			if (nla_put_u32(msg, NL80211_ATTR_TXQ_MEMORY_LIMIT,
3648 					rdev->wiphy.txq_memory_limit))
3649 				goto nla_put_failure;
3650 			if (nla_put_u32(msg, NL80211_ATTR_TXQ_QUANTUM,
3651 					rdev->wiphy.txq_quantum))
3652 				goto nla_put_failure;
3653 		}
3654 
3655 		state->split_start++;
3656 		break;
3657 	case 14:
3658 		if (nl80211_send_pmsr_capa(rdev, msg))
3659 			goto nla_put_failure;
3660 
3661 		state->split_start++;
3662 		break;
3663 	case 15:
3664 		if (rdev->wiphy.akm_suites &&
3665 		    nla_put(msg, NL80211_ATTR_AKM_SUITES,
3666 			    sizeof(u32) * rdev->wiphy.n_akm_suites,
3667 			    rdev->wiphy.akm_suites))
3668 			goto nla_put_failure;
3669 
3670 		if (nl80211_put_iftype_akm_suites(rdev, msg))
3671 			goto nla_put_failure;
3672 
3673 		if (nl80211_put_tid_config_support(rdev, msg))
3674 			goto nla_put_failure;
3675 		state->split_start++;
3676 		break;
3677 	case 16:
3678 		if (nl80211_put_sar_specs(rdev, msg))
3679 			goto nla_put_failure;
3680 
3681 		if (nl80211_put_mbssid_support(&rdev->wiphy, msg))
3682 			goto nla_put_failure;
3683 
3684 		if (nla_put_u16(msg, NL80211_ATTR_MAX_NUM_AKM_SUITES,
3685 				rdev->wiphy.max_num_akm_suites))
3686 			goto nla_put_failure;
3687 
3688 		if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)
3689 			nla_put_flag(msg, NL80211_ATTR_MLO_SUPPORT);
3690 
3691 		if (rdev->wiphy.hw_timestamp_max_peers &&
3692 		    nla_put_u16(msg, NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS,
3693 				rdev->wiphy.hw_timestamp_max_peers))
3694 			goto nla_put_failure;
3695 
3696 		state->split_start++;
3697 		break;
3698 	case 17:
3699 		if (nl80211_put_radios(&rdev->wiphy, msg))
3700 			goto nla_put_failure;
3701 
3702 		state->split_start++;
3703 		break;
3704 	case 18:
3705 		if (nl80211_put_nan_capa(&rdev->wiphy, msg))
3706 			goto nla_put_failure;
3707 
3708 		/* done */
3709 		state->split_start = 0;
3710 		break;
3711 	}
3712  finish:
3713 	genlmsg_end(msg, hdr);
3714 	return 0;
3715 
3716  nla_put_failure:
3717 	genlmsg_cancel(msg, hdr);
3718 	return -EMSGSIZE;
3719 }
3720 
3721 static int nl80211_dump_wiphy_parse(struct sk_buff *skb,
3722 				    struct netlink_callback *cb,
3723 				    struct nl80211_dump_wiphy_state *state)
3724 {
3725 	struct nlattr **tb = kzalloc_objs(*tb, NUM_NL80211_ATTR);
3726 	int ret;
3727 
3728 	if (!tb)
3729 		return -ENOMEM;
3730 
3731 	ret = nlmsg_parse_deprecated(cb->nlh,
3732 				     GENL_HDRLEN + nl80211_fam.hdrsize,
3733 				     tb, nl80211_fam.maxattr,
3734 				     nl80211_policy, NULL);
3735 	/* ignore parse errors for backward compatibility */
3736 	if (ret) {
3737 		ret = 0;
3738 		goto out;
3739 	}
3740 
3741 	state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP];
3742 	if (tb[NL80211_ATTR_WIPHY])
3743 		state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
3744 	if (tb[NL80211_ATTR_WDEV])
3745 		state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32;
3746 	if (tb[NL80211_ATTR_IFINDEX]) {
3747 		struct net_device *netdev;
3748 		struct cfg80211_registered_device *rdev;
3749 		int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
3750 
3751 		netdev = __dev_get_by_index(sock_net(skb->sk), ifidx);
3752 		if (!netdev) {
3753 			ret = -ENODEV;
3754 			goto out;
3755 		}
3756 		if (netdev->ieee80211_ptr) {
3757 			rdev = wiphy_to_rdev(
3758 				netdev->ieee80211_ptr->wiphy);
3759 			state->filter_wiphy = rdev->wiphy_idx;
3760 		}
3761 	}
3762 
3763 	ret = 0;
3764 out:
3765 	kfree(tb);
3766 	return ret;
3767 }
3768 
3769 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
3770 {
3771 	int idx = 0, ret;
3772 	struct nl80211_dump_wiphy_state *state = (void *)cb->args[0];
3773 	struct cfg80211_registered_device *rdev;
3774 
3775 	rtnl_lock();
3776 	if (!state) {
3777 		state = kzalloc_obj(*state);
3778 		if (!state) {
3779 			rtnl_unlock();
3780 			return -ENOMEM;
3781 		}
3782 		state->filter_wiphy = -1;
3783 		ret = nl80211_dump_wiphy_parse(skb, cb, state);
3784 		if (ret) {
3785 			kfree(state);
3786 			rtnl_unlock();
3787 			return ret;
3788 		}
3789 		cb->args[0] = (long)state;
3790 	}
3791 
3792 	for_each_rdev(rdev) {
3793 		if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
3794 			continue;
3795 		if (++idx <= state->start)
3796 			continue;
3797 		if (state->filter_wiphy != -1 &&
3798 		    state->filter_wiphy != rdev->wiphy_idx)
3799 			continue;
3800 		wiphy_lock(&rdev->wiphy);
3801 		/* attempt to fit multiple wiphy data chunks into the skb */
3802 		do {
3803 			ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY,
3804 						 skb,
3805 						 NETLINK_CB(cb->skb).portid,
3806 						 cb->nlh->nlmsg_seq,
3807 						 NLM_F_MULTI, state);
3808 			if (ret < 0) {
3809 				/*
3810 				 * If sending the wiphy data didn't fit (ENOBUFS
3811 				 * or EMSGSIZE returned), this SKB is still
3812 				 * empty (so it's not too big because another
3813 				 * wiphy dataset is already in the skb) and
3814 				 * we've not tried to adjust the dump allocation
3815 				 * yet ... then adjust the alloc size to be
3816 				 * bigger, and return 1 but with the empty skb.
3817 				 * This results in an empty message being RX'ed
3818 				 * in userspace, but that is ignored.
3819 				 *
3820 				 * We can then retry with the larger buffer.
3821 				 */
3822 				if ((ret == -ENOBUFS || ret == -EMSGSIZE) &&
3823 				    !skb->len && !state->split &&
3824 				    cb->min_dump_alloc < 4096) {
3825 					cb->min_dump_alloc = 4096;
3826 					state->split_start = 0;
3827 					wiphy_unlock(&rdev->wiphy);
3828 					rtnl_unlock();
3829 					return 1;
3830 				}
3831 				idx--;
3832 				break;
3833 			}
3834 		} while (state->split_start > 0);
3835 		wiphy_unlock(&rdev->wiphy);
3836 		break;
3837 	}
3838 	rtnl_unlock();
3839 
3840 	state->start = idx;
3841 
3842 	return skb->len;
3843 }
3844 
3845 static int nl80211_dump_wiphy_done(struct netlink_callback *cb)
3846 {
3847 	kfree((void *)cb->args[0]);
3848 	return 0;
3849 }
3850 
3851 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
3852 {
3853 	struct sk_buff *msg;
3854 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
3855 	struct nl80211_dump_wiphy_state state = {};
3856 
3857 	msg = nlmsg_new(4096, GFP_KERNEL);
3858 	if (!msg)
3859 		return -ENOMEM;
3860 
3861 	if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg,
3862 			       info->snd_portid, info->snd_seq, 0,
3863 			       &state) < 0) {
3864 		nlmsg_free(msg);
3865 		return -ENOBUFS;
3866 	}
3867 
3868 	return genlmsg_reply(msg, info);
3869 }
3870 
3871 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
3872 	[NL80211_TXQ_ATTR_QUEUE]		= { .type = NLA_U8 },
3873 	[NL80211_TXQ_ATTR_TXOP]			= { .type = NLA_U16 },
3874 	[NL80211_TXQ_ATTR_CWMIN]		= { .type = NLA_U16 },
3875 	[NL80211_TXQ_ATTR_CWMAX]		= { .type = NLA_U16 },
3876 	[NL80211_TXQ_ATTR_AIFS]			= { .type = NLA_U8 },
3877 };
3878 
3879 static int parse_txq_params(struct nlattr *tb[],
3880 			    struct ieee80211_txq_params *txq_params)
3881 {
3882 	u8 ac;
3883 
3884 	if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] ||
3885 	    !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
3886 	    !tb[NL80211_TXQ_ATTR_AIFS])
3887 		return -EINVAL;
3888 
3889 	ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]);
3890 	txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
3891 	txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
3892 	txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
3893 	txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
3894 
3895 	if (ac >= NL80211_NUM_ACS)
3896 		return -EINVAL;
3897 	txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS);
3898 	return 0;
3899 }
3900 
3901 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
3902 {
3903 	/*
3904 	 * You can only set the channel explicitly for some interfaces,
3905 	 * most have their channel managed via their respective
3906 	 * "establish a connection" command (connect, join, ...)
3907 	 *
3908 	 * For AP/GO and mesh mode, the channel can be set with the
3909 	 * channel userspace API, but is only stored and passed to the
3910 	 * low-level driver when the AP starts or the mesh is joined.
3911 	 * This is for backward compatibility, userspace can also give
3912 	 * the channel in the start-ap or join-mesh commands instead.
3913 	 *
3914 	 * Monitors are special as they are normally slaved to
3915 	 * whatever else is going on, so they have their own special
3916 	 * operation to set the monitor channel if possible.
3917 	 */
3918 	return !wdev ||
3919 		wdev->iftype == NL80211_IFTYPE_AP ||
3920 		wdev->iftype == NL80211_IFTYPE_MESH_POINT ||
3921 		wdev->iftype == NL80211_IFTYPE_MONITOR ||
3922 		wdev->iftype == NL80211_IFTYPE_P2P_GO;
3923 }
3924 
3925 static int _nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
3926 				  struct netlink_ext_ack *extack,
3927 				  struct nlattr **attrs, bool monitor,
3928 				  struct cfg80211_chan_def *chandef,
3929 				  bool permit_npca)
3930 {
3931 	u32 control_freq;
3932 
3933 	if (!attrs[NL80211_ATTR_WIPHY_FREQ]) {
3934 		NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ],
3935 				    "Frequency is missing");
3936 		return -EINVAL;
3937 	}
3938 
3939 	control_freq = MHZ_TO_KHZ(
3940 			nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ]));
3941 	if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
3942 		control_freq +=
3943 		    nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
3944 
3945 	memset(chandef, 0, sizeof(*chandef));
3946 	chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq);
3947 	chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
3948 	chandef->center_freq1 = KHZ_TO_MHZ(control_freq);
3949 	chandef->freq1_offset = control_freq % 1000;
3950 	chandef->center_freq2 = 0;
3951 	chandef->s1g_primary_2mhz = false;
3952 
3953 	if (!chandef->chan) {
3954 		NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ],
3955 				    "Unknown channel");
3956 		return -EINVAL;
3957 	}
3958 
3959 	if (cfg80211_chandef_is_s1g(chandef))
3960 		chandef->width = NL80211_CHAN_WIDTH_1;
3961 
3962 	if (attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
3963 		enum nl80211_channel_type chantype;
3964 
3965 		chantype = nla_get_u32(attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
3966 
3967 		switch (chantype) {
3968 		case NL80211_CHAN_NO_HT:
3969 		case NL80211_CHAN_HT20:
3970 		case NL80211_CHAN_HT40PLUS:
3971 		case NL80211_CHAN_HT40MINUS:
3972 			if (chandef->chan->band == NL80211_BAND_60GHZ ||
3973 			    chandef->chan->band == NL80211_BAND_S1GHZ)
3974 				return -EINVAL;
3975 			cfg80211_chandef_create(chandef, chandef->chan,
3976 						chantype);
3977 			/* user input for center_freq is incorrect */
3978 			if (attrs[NL80211_ATTR_CENTER_FREQ1] &&
3979 			    chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) {
3980 				NL_SET_ERR_MSG_ATTR(extack,
3981 						    attrs[NL80211_ATTR_CENTER_FREQ1],
3982 						    "bad center frequency 1");
3983 				return -EINVAL;
3984 			}
3985 			/* center_freq2 must be zero */
3986 			if (attrs[NL80211_ATTR_CENTER_FREQ2] &&
3987 			    nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2])) {
3988 				NL_SET_ERR_MSG_ATTR(extack,
3989 						    attrs[NL80211_ATTR_CENTER_FREQ2],
3990 						    "center frequency 2 can't be used");
3991 				return -EINVAL;
3992 			}
3993 			break;
3994 		default:
3995 			NL_SET_ERR_MSG_ATTR(extack,
3996 					    attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE],
3997 					    "invalid channel type");
3998 			return -EINVAL;
3999 		}
4000 	} else if (attrs[NL80211_ATTR_CHANNEL_WIDTH]) {
4001 		chandef->width = nla_get_u32(attrs[NL80211_ATTR_CHANNEL_WIDTH]);
4002 		if (attrs[NL80211_ATTR_CENTER_FREQ1]) {
4003 			chandef->center_freq1 =
4004 				nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1]);
4005 			chandef->freq1_offset = nla_get_u32_default(
4006 				attrs[NL80211_ATTR_CENTER_FREQ1_OFFSET], 0);
4007 		}
4008 
4009 		if (attrs[NL80211_ATTR_CENTER_FREQ2])
4010 			chandef->center_freq2 =
4011 				nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2]);
4012 
4013 		chandef->s1g_primary_2mhz = nla_get_flag(
4014 			attrs[NL80211_ATTR_S1G_PRIMARY_2MHZ]);
4015 	}
4016 
4017 	if (attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) {
4018 		chandef->edmg.channels =
4019 		      nla_get_u8(attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]);
4020 
4021 		if (attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG])
4022 			chandef->edmg.bw_config =
4023 		     nla_get_u8(attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]);
4024 	} else {
4025 		chandef->edmg.bw_config = 0;
4026 		chandef->edmg.channels = 0;
4027 	}
4028 
4029 	if (attrs[NL80211_ATTR_PUNCT_BITMAP]) {
4030 		chandef->punctured =
4031 			nla_get_u32(attrs[NL80211_ATTR_PUNCT_BITMAP]);
4032 
4033 		if (chandef->punctured &&
4034 		    !wiphy_ext_feature_isset(&rdev->wiphy,
4035 					     NL80211_EXT_FEATURE_PUNCT)) {
4036 			NL_SET_ERR_MSG_ATTR(extack,
4037 					    attrs[NL80211_ATTR_WIPHY_FREQ],
4038 					    "driver doesn't support puncturing");
4039 			return -EINVAL;
4040 		}
4041 	}
4042 
4043 	if (attrs[NL80211_ATTR_NPCA_PRIMARY_FREQ]) {
4044 		if (!permit_npca) {
4045 			NL_SET_ERR_MSG_ATTR(extack,
4046 					    attrs[NL80211_ATTR_NPCA_PRIMARY_FREQ],
4047 					    "NPCA not supported");
4048 			return -EINVAL;
4049 		}
4050 
4051 		chandef->npca_chan =
4052 			ieee80211_get_channel(&rdev->wiphy,
4053 					      nla_get_u32(attrs[NL80211_ATTR_NPCA_PRIMARY_FREQ]));
4054 		if (!chandef->npca_chan) {
4055 			NL_SET_ERR_MSG_ATTR(extack,
4056 					    attrs[NL80211_ATTR_NPCA_PRIMARY_FREQ],
4057 					    "invalid NPCA primary channel");
4058 			return -EINVAL;
4059 		}
4060 
4061 		chandef->npca_punctured =
4062 			nla_get_u32_default(attrs[NL80211_ATTR_NPCA_PUNCT_BITMAP],
4063 					    chandef->punctured);
4064 	} else if (attrs[NL80211_ATTR_NPCA_PUNCT_BITMAP]) {
4065 		NL_SET_ERR_MSG_ATTR(extack,
4066 				    attrs[NL80211_ATTR_NPCA_PUNCT_BITMAP],
4067 				    "NPCA puncturing only valid with NPCA");
4068 		return -EINVAL;
4069 	}
4070 
4071 	if (!cfg80211_chandef_valid(chandef)) {
4072 		NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ],
4073 				    "invalid channel definition");
4074 		return -EINVAL;
4075 	}
4076 
4077 	if (!_cfg80211_chandef_usable(&rdev->wiphy, chandef,
4078 				      IEEE80211_CHAN_DISABLED,
4079 				      monitor ? IEEE80211_CHAN_CAN_MONITOR : 0)) {
4080 		NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ],
4081 				    "(extension) channel is disabled");
4082 		return -EINVAL;
4083 	}
4084 
4085 	if (chandef->width == NL80211_CHAN_WIDTH_5 ||
4086 	    chandef->width == NL80211_CHAN_WIDTH_10) {
4087 		NL_SET_ERR_MSG(extack, "5/10 MHz not supported any more");
4088 		return -EINVAL;
4089 	}
4090 
4091 	return 0;
4092 }
4093 
4094 int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
4095 			  struct netlink_ext_ack *extack,
4096 			  struct nlattr **attrs,
4097 			  struct cfg80211_chan_def *chandef,
4098 			  bool permit_npca)
4099 {
4100 	return _nl80211_parse_chandef(rdev, extack, attrs, false, chandef,
4101 				      permit_npca);
4102 }
4103 
4104 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
4105 				 struct net_device *dev,
4106 				 struct genl_info *info,
4107 				 int _link_id)
4108 {
4109 	struct cfg80211_chan_def chandef;
4110 	int result;
4111 	enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR;
4112 	struct wireless_dev *wdev = NULL;
4113 	int link_id = _link_id;
4114 	bool permit_npca;
4115 
4116 	if (dev)
4117 		wdev = dev->ieee80211_ptr;
4118 	if (!nl80211_can_set_dev_channel(wdev))
4119 		return -EOPNOTSUPP;
4120 	if (wdev)
4121 		iftype = wdev->iftype;
4122 
4123 	if (link_id < 0) {
4124 		if (wdev && wdev->valid_links)
4125 			return -EINVAL;
4126 		link_id = 0;
4127 	}
4128 
4129 	/* allow parsing it - will check on start_ap or below */
4130 	permit_npca = iftype == NL80211_IFTYPE_AP ||
4131 		      iftype == NL80211_IFTYPE_P2P_GO;
4132 
4133 	result = _nl80211_parse_chandef(rdev, info->extack, info->attrs,
4134 					iftype == NL80211_IFTYPE_MONITOR,
4135 					&chandef, permit_npca);
4136 	if (result)
4137 		return result;
4138 
4139 	switch (iftype) {
4140 	case NL80211_IFTYPE_AP:
4141 	case NL80211_IFTYPE_P2P_GO:
4142 		if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
4143 						   iftype))
4144 			return -EINVAL;
4145 		if (wdev->links[link_id].ap.beacon_interval) {
4146 			struct ieee80211_channel *cur_chan;
4147 
4148 			if (!dev || !rdev->ops->set_ap_chanwidth ||
4149 			    !(rdev->wiphy.features &
4150 			      NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE))
4151 				return -EBUSY;
4152 
4153 			/* Only allow dynamic channel width changes */
4154 			cur_chan = wdev->links[link_id].ap.chandef.npca_chan;
4155 			if (chandef.npca_chan != cur_chan)
4156 				return -EBUSY;
4157 			cur_chan = wdev->links[link_id].ap.chandef.chan;
4158 			if (chandef.chan != cur_chan)
4159 				return -EBUSY;
4160 
4161 			/* only allow this for regular channel widths */
4162 			switch (wdev->links[link_id].ap.chandef.width) {
4163 			case NL80211_CHAN_WIDTH_20_NOHT:
4164 			case NL80211_CHAN_WIDTH_20:
4165 			case NL80211_CHAN_WIDTH_40:
4166 			case NL80211_CHAN_WIDTH_80:
4167 			case NL80211_CHAN_WIDTH_80P80:
4168 			case NL80211_CHAN_WIDTH_160:
4169 			case NL80211_CHAN_WIDTH_320:
4170 				break;
4171 			default:
4172 				return -EINVAL;
4173 			}
4174 
4175 			switch (chandef.width) {
4176 			case NL80211_CHAN_WIDTH_20_NOHT:
4177 			case NL80211_CHAN_WIDTH_20:
4178 			case NL80211_CHAN_WIDTH_40:
4179 			case NL80211_CHAN_WIDTH_80:
4180 			case NL80211_CHAN_WIDTH_80P80:
4181 			case NL80211_CHAN_WIDTH_160:
4182 			case NL80211_CHAN_WIDTH_320:
4183 				break;
4184 			default:
4185 				return -EINVAL;
4186 			}
4187 
4188 			result = rdev_set_ap_chanwidth(rdev, dev, link_id,
4189 						       &chandef);
4190 			if (result)
4191 				return result;
4192 			wdev->links[link_id].ap.chandef = chandef;
4193 		} else {
4194 			wdev->u.ap.preset_chandef = chandef;
4195 		}
4196 		return 0;
4197 	case NL80211_IFTYPE_MESH_POINT:
4198 		return cfg80211_set_mesh_channel(rdev, wdev, &chandef);
4199 	case NL80211_IFTYPE_MONITOR:
4200 		return cfg80211_set_monitor_channel(rdev, dev, &chandef);
4201 	default:
4202 		break;
4203 	}
4204 
4205 	return -EINVAL;
4206 }
4207 
4208 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
4209 {
4210 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
4211 	int link_id = nl80211_link_id_or_invalid(info->attrs);
4212 	struct net_device *netdev = info->user_ptr[1];
4213 
4214 	return __nl80211_set_channel(rdev, netdev, info, link_id);
4215 }
4216 
4217 static int nl80211_set_wiphy_radio(struct genl_info *info,
4218 				   struct cfg80211_registered_device *rdev,
4219 				   int radio_idx)
4220 {
4221 	u32 rts_threshold = 0, old_rts, changed = 0;
4222 	int result;
4223 
4224 	if (!rdev->ops->set_wiphy_params)
4225 		return -EOPNOTSUPP;
4226 
4227 	if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
4228 		rts_threshold = nla_get_u32(
4229 				info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
4230 		changed |= WIPHY_PARAM_RTS_THRESHOLD;
4231 	}
4232 
4233 	old_rts = rdev->wiphy.radio_cfg[radio_idx].rts_threshold;
4234 
4235 	rdev->wiphy.radio_cfg[radio_idx].rts_threshold = rts_threshold;
4236 
4237 	result = rdev_set_wiphy_params(rdev, radio_idx, changed);
4238 	if (result)
4239 		rdev->wiphy.radio_cfg[radio_idx].rts_threshold = old_rts;
4240 
4241 	return 0;
4242 }
4243 
4244 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
4245 {
4246 	struct cfg80211_registered_device *rdev = NULL;
4247 	struct net_device *netdev = NULL;
4248 	struct wireless_dev *wdev;
4249 	int result = 0, rem_txq_params = 0;
4250 	struct nlattr *nl_txq_params;
4251 	u32 changed;
4252 	u8 retry_short = 0, retry_long = 0;
4253 	u32 frag_threshold = 0, rts_threshold = 0;
4254 	u8 coverage_class = 0;
4255 	u32 txq_limit = 0, txq_memory_limit = 0, txq_quantum = 0;
4256 	int radio_idx = -1;
4257 
4258 	rtnl_lock();
4259 	/*
4260 	 * Try to find the wiphy and netdev. Normally this
4261 	 * function shouldn't need the netdev, but this is
4262 	 * done for backward compatibility -- previously
4263 	 * setting the channel was done per wiphy, but now
4264 	 * it is per netdev. Previous userland like hostapd
4265 	 * also passed a netdev to set_wiphy, so that it is
4266 	 * possible to let that go to the right netdev!
4267 	 */
4268 
4269 	if (info->attrs[NL80211_ATTR_IFINDEX]) {
4270 		int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
4271 
4272 		netdev = __dev_get_by_index(genl_info_net(info), ifindex);
4273 		if (netdev && netdev->ieee80211_ptr)
4274 			rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy);
4275 		else
4276 			netdev = NULL;
4277 	}
4278 
4279 	if (!netdev) {
4280 		rdev = __cfg80211_rdev_from_attrs(genl_info_net(info),
4281 						  info->attrs);
4282 		if (IS_ERR(rdev)) {
4283 			rtnl_unlock();
4284 			return PTR_ERR(rdev);
4285 		}
4286 		wdev = NULL;
4287 		netdev = NULL;
4288 		result = 0;
4289 	} else
4290 		wdev = netdev->ieee80211_ptr;
4291 
4292 	guard(wiphy)(&rdev->wiphy);
4293 
4294 	/*
4295 	 * end workaround code, by now the rdev is available
4296 	 * and locked, and wdev may or may not be NULL.
4297 	 */
4298 
4299 	if (info->attrs[NL80211_ATTR_WIPHY_NAME])
4300 		result = cfg80211_dev_rename(
4301 			rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
4302 	rtnl_unlock();
4303 
4304 	if (result)
4305 		return result;
4306 
4307 	if (info->attrs[NL80211_ATTR_WIPHY_RADIO_INDEX]) {
4308 		/* Radio idx is not expected for non-multi radio wiphy */
4309 		if (rdev->wiphy.n_radio <= 0)
4310 			return -EINVAL;
4311 
4312 		radio_idx = nla_get_u8(
4313 				info->attrs[NL80211_ATTR_WIPHY_RADIO_INDEX]);
4314 		if (radio_idx >= rdev->wiphy.n_radio)
4315 			return -EINVAL;
4316 
4317 		return nl80211_set_wiphy_radio(info, rdev, radio_idx);
4318 	}
4319 
4320 	if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
4321 		struct ieee80211_txq_params txq_params;
4322 		struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
4323 
4324 		if (!rdev->ops->set_txq_params)
4325 			return -EOPNOTSUPP;
4326 
4327 		if (!netdev)
4328 			return -EINVAL;
4329 
4330 		if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
4331 		    netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4332 			return -EINVAL;
4333 
4334 		if (!netif_running(netdev))
4335 			return -ENETDOWN;
4336 
4337 		nla_for_each_nested(nl_txq_params,
4338 				    info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
4339 				    rem_txq_params) {
4340 			result = nla_parse_nested_deprecated(tb,
4341 							     NL80211_TXQ_ATTR_MAX,
4342 							     nl_txq_params,
4343 							     txq_params_policy,
4344 							     info->extack);
4345 			if (result)
4346 				return result;
4347 
4348 			result = parse_txq_params(tb, &txq_params);
4349 			if (result)
4350 				return result;
4351 
4352 			txq_params.link_id =
4353 				nl80211_link_id_or_invalid(info->attrs);
4354 
4355 			if (txq_params.link_id >= 0 &&
4356 			    !(netdev->ieee80211_ptr->valid_links &
4357 			      BIT(txq_params.link_id)))
4358 				result = -ENOLINK;
4359 			else if (txq_params.link_id >= 0 &&
4360 				 !netdev->ieee80211_ptr->valid_links)
4361 				result = -EINVAL;
4362 			else
4363 				result = rdev_set_txq_params(rdev, netdev,
4364 							     &txq_params);
4365 			if (result)
4366 				return result;
4367 		}
4368 	}
4369 
4370 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
4371 		int link_id = nl80211_link_id_or_invalid(info->attrs);
4372 
4373 		if (wdev) {
4374 			result = __nl80211_set_channel(
4375 				rdev,
4376 				nl80211_can_set_dev_channel(wdev) ? netdev : NULL,
4377 				info, link_id);
4378 		} else {
4379 			result = __nl80211_set_channel(rdev, netdev, info, link_id);
4380 		}
4381 
4382 		if (result)
4383 			return result;
4384 	}
4385 
4386 	if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
4387 		struct wireless_dev *txp_wdev = wdev;
4388 		enum nl80211_tx_power_setting type;
4389 		int idx, mbm = 0;
4390 
4391 		if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER))
4392 			txp_wdev = NULL;
4393 
4394 		if (!rdev->ops->set_tx_power)
4395 			return -EOPNOTSUPP;
4396 
4397 		idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
4398 		type = nla_get_u32(info->attrs[idx]);
4399 
4400 		if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
4401 		    (type != NL80211_TX_POWER_AUTOMATIC))
4402 			return -EINVAL;
4403 
4404 		if (type != NL80211_TX_POWER_AUTOMATIC) {
4405 			idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
4406 			mbm = nla_get_u32(info->attrs[idx]);
4407 		}
4408 
4409 		result = rdev_set_tx_power(rdev, txp_wdev, radio_idx, type,
4410 					   mbm);
4411 		if (result)
4412 			return result;
4413 	}
4414 
4415 	if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
4416 	    info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
4417 		u32 tx_ant, rx_ant;
4418 
4419 		if ((!rdev->wiphy.available_antennas_tx &&
4420 		     !rdev->wiphy.available_antennas_rx) ||
4421 		    !rdev->ops->set_antenna)
4422 			return -EOPNOTSUPP;
4423 
4424 		tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
4425 		rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
4426 
4427 		/* reject antenna configurations which don't match the
4428 		 * available antenna masks, except for the "all" mask */
4429 		if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
4430 		    (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx)))
4431 			return -EINVAL;
4432 
4433 		tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
4434 		rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
4435 
4436 		result = rdev_set_antenna(rdev, radio_idx, tx_ant, rx_ant);
4437 		if (result)
4438 			return result;
4439 	}
4440 
4441 	changed = 0;
4442 
4443 	if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
4444 		retry_short = nla_get_u8(
4445 			info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
4446 
4447 		changed |= WIPHY_PARAM_RETRY_SHORT;
4448 	}
4449 
4450 	if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
4451 		retry_long = nla_get_u8(
4452 			info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
4453 
4454 		changed |= WIPHY_PARAM_RETRY_LONG;
4455 	}
4456 
4457 	if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
4458 		frag_threshold = nla_get_u32(
4459 			info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
4460 		if (frag_threshold < 256)
4461 			return -EINVAL;
4462 
4463 		if (frag_threshold != (u32) -1) {
4464 			/*
4465 			 * Fragments (apart from the last one) are required to
4466 			 * have even length. Make the fragmentation code
4467 			 * simpler by stripping LSB should someone try to use
4468 			 * odd threshold value.
4469 			 */
4470 			frag_threshold &= ~0x1;
4471 		}
4472 		changed |= WIPHY_PARAM_FRAG_THRESHOLD;
4473 	}
4474 
4475 	if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
4476 		rts_threshold = nla_get_u32(
4477 			info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
4478 		changed |= WIPHY_PARAM_RTS_THRESHOLD;
4479 	}
4480 
4481 	if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
4482 		if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK])
4483 			return -EINVAL;
4484 
4485 		coverage_class = nla_get_u8(
4486 			info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
4487 		changed |= WIPHY_PARAM_COVERAGE_CLASS;
4488 	}
4489 
4490 	if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) {
4491 		if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION))
4492 			return -EOPNOTSUPP;
4493 
4494 		changed |= WIPHY_PARAM_DYN_ACK;
4495 	}
4496 
4497 	if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) {
4498 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
4499 					     NL80211_EXT_FEATURE_TXQS))
4500 			return -EOPNOTSUPP;
4501 
4502 		txq_limit = nla_get_u32(
4503 			info->attrs[NL80211_ATTR_TXQ_LIMIT]);
4504 		changed |= WIPHY_PARAM_TXQ_LIMIT;
4505 	}
4506 
4507 	if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) {
4508 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
4509 					     NL80211_EXT_FEATURE_TXQS))
4510 			return -EOPNOTSUPP;
4511 
4512 		txq_memory_limit = nla_get_u32(
4513 			info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]);
4514 		changed |= WIPHY_PARAM_TXQ_MEMORY_LIMIT;
4515 	}
4516 
4517 	if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) {
4518 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
4519 					     NL80211_EXT_FEATURE_TXQS))
4520 			return -EOPNOTSUPP;
4521 
4522 		txq_quantum = nla_get_u32(
4523 			info->attrs[NL80211_ATTR_TXQ_QUANTUM]);
4524 		changed |= WIPHY_PARAM_TXQ_QUANTUM;
4525 	}
4526 
4527 	if (changed) {
4528 		u8 old_retry_short, old_retry_long;
4529 		u32 old_frag_threshold, old_rts_threshold;
4530 		u8 old_coverage_class, i;
4531 		u32 old_txq_limit, old_txq_memory_limit, old_txq_quantum;
4532 		u32 *old_radio_rts_threshold = NULL;
4533 
4534 		if (!rdev->ops->set_wiphy_params)
4535 			return -EOPNOTSUPP;
4536 
4537 		if (rdev->wiphy.n_radio) {
4538 			old_radio_rts_threshold = kcalloc(rdev->wiphy.n_radio,
4539 							  sizeof(u32),
4540 							  GFP_KERNEL);
4541 			if (!old_radio_rts_threshold)
4542 				return -ENOMEM;
4543 		}
4544 
4545 		old_retry_short = rdev->wiphy.retry_short;
4546 		old_retry_long = rdev->wiphy.retry_long;
4547 		old_frag_threshold = rdev->wiphy.frag_threshold;
4548 		old_rts_threshold = rdev->wiphy.rts_threshold;
4549 		if (old_radio_rts_threshold) {
4550 			for (i = 0 ; i < rdev->wiphy.n_radio; i++)
4551 				old_radio_rts_threshold[i] =
4552 					rdev->wiphy.radio_cfg[i].rts_threshold;
4553 		}
4554 		old_coverage_class = rdev->wiphy.coverage_class;
4555 		old_txq_limit = rdev->wiphy.txq_limit;
4556 		old_txq_memory_limit = rdev->wiphy.txq_memory_limit;
4557 		old_txq_quantum = rdev->wiphy.txq_quantum;
4558 
4559 		if (changed & WIPHY_PARAM_RETRY_SHORT)
4560 			rdev->wiphy.retry_short = retry_short;
4561 		if (changed & WIPHY_PARAM_RETRY_LONG)
4562 			rdev->wiphy.retry_long = retry_long;
4563 		if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
4564 			rdev->wiphy.frag_threshold = frag_threshold;
4565 		if ((changed & WIPHY_PARAM_RTS_THRESHOLD) &&
4566 		    old_radio_rts_threshold) {
4567 			rdev->wiphy.rts_threshold = rts_threshold;
4568 			for (i = 0 ; i < rdev->wiphy.n_radio; i++)
4569 				rdev->wiphy.radio_cfg[i].rts_threshold =
4570 					rdev->wiphy.rts_threshold;
4571 		}
4572 		if (changed & WIPHY_PARAM_COVERAGE_CLASS)
4573 			rdev->wiphy.coverage_class = coverage_class;
4574 		if (changed & WIPHY_PARAM_TXQ_LIMIT)
4575 			rdev->wiphy.txq_limit = txq_limit;
4576 		if (changed & WIPHY_PARAM_TXQ_MEMORY_LIMIT)
4577 			rdev->wiphy.txq_memory_limit = txq_memory_limit;
4578 		if (changed & WIPHY_PARAM_TXQ_QUANTUM)
4579 			rdev->wiphy.txq_quantum = txq_quantum;
4580 
4581 		result = rdev_set_wiphy_params(rdev, radio_idx, changed);
4582 		if (result) {
4583 			rdev->wiphy.retry_short = old_retry_short;
4584 			rdev->wiphy.retry_long = old_retry_long;
4585 			rdev->wiphy.frag_threshold = old_frag_threshold;
4586 			rdev->wiphy.rts_threshold = old_rts_threshold;
4587 			if (old_radio_rts_threshold) {
4588 				for (i = 0 ; i < rdev->wiphy.n_radio; i++)
4589 					rdev->wiphy.radio_cfg[i].rts_threshold =
4590 						old_radio_rts_threshold[i];
4591 			}
4592 			rdev->wiphy.coverage_class = old_coverage_class;
4593 			rdev->wiphy.txq_limit = old_txq_limit;
4594 			rdev->wiphy.txq_memory_limit = old_txq_memory_limit;
4595 			rdev->wiphy.txq_quantum = old_txq_quantum;
4596 		}
4597 
4598 		kfree(old_radio_rts_threshold);
4599 		return result;
4600 	}
4601 
4602 	return 0;
4603 }
4604 
4605 int nl80211_send_chandef(struct sk_buff *msg, const struct cfg80211_chan_def *chandef)
4606 {
4607 	if (WARN_ON(!cfg80211_chandef_valid(chandef)))
4608 		return -EINVAL;
4609 
4610 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ,
4611 			chandef->chan->center_freq))
4612 		return -ENOBUFS;
4613 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET,
4614 			chandef->chan->freq_offset))
4615 		return -ENOBUFS;
4616 	switch (chandef->width) {
4617 	case NL80211_CHAN_WIDTH_20_NOHT:
4618 	case NL80211_CHAN_WIDTH_20:
4619 	case NL80211_CHAN_WIDTH_40:
4620 		if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
4621 				cfg80211_get_chandef_type(chandef)))
4622 			return -ENOBUFS;
4623 		break;
4624 	default:
4625 		break;
4626 	}
4627 	if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width))
4628 		return -ENOBUFS;
4629 	if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1))
4630 		return -ENOBUFS;
4631 	if (chandef->center_freq2 &&
4632 	    nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2))
4633 		return -ENOBUFS;
4634 	if (chandef->punctured &&
4635 	    nla_put_u32(msg, NL80211_ATTR_PUNCT_BITMAP, chandef->punctured))
4636 		return -ENOBUFS;
4637 	if (chandef->s1g_primary_2mhz &&
4638 	    nla_put_flag(msg, NL80211_ATTR_S1G_PRIMARY_2MHZ))
4639 		return -ENOBUFS;
4640 
4641 	if (chandef->npca_chan &&
4642 	    nla_put_u32(msg, NL80211_ATTR_NPCA_PRIMARY_FREQ,
4643 			chandef->npca_chan->center_freq))
4644 		return -ENOBUFS;
4645 	if (chandef->npca_punctured &&
4646 	    nla_put_u32(msg, NL80211_ATTR_NPCA_PUNCT_BITMAP,
4647 			chandef->npca_punctured))
4648 		return -ENOBUFS;
4649 
4650 	return 0;
4651 }
4652 EXPORT_SYMBOL(nl80211_send_chandef);
4653 
4654 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags,
4655 			      struct cfg80211_registered_device *rdev,
4656 			      struct wireless_dev *wdev,
4657 			      enum nl80211_commands cmd)
4658 {
4659 	struct net_device *dev = wdev->netdev;
4660 	void *hdr;
4661 
4662 	lockdep_assert_wiphy(&rdev->wiphy);
4663 
4664 	WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE &&
4665 		cmd != NL80211_CMD_DEL_INTERFACE &&
4666 		cmd != NL80211_CMD_SET_INTERFACE);
4667 
4668 	hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
4669 	if (!hdr)
4670 		return -1;
4671 
4672 	if (dev &&
4673 	    (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
4674 	     nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name)))
4675 		goto nla_put_failure;
4676 
4677 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
4678 	    nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) ||
4679 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
4680 			      NL80211_ATTR_PAD) ||
4681 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) ||
4682 	    nla_put_u32(msg, NL80211_ATTR_GENERATION,
4683 			rdev->devlist_generation ^
4684 			(cfg80211_rdev_list_generation << 2)) ||
4685 	    nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr) ||
4686 	    nla_put_u32(msg, NL80211_ATTR_VIF_RADIO_MASK, wdev->radio_mask))
4687 		goto nla_put_failure;
4688 
4689 	if (rdev->ops->get_channel && !wdev->valid_links) {
4690 		struct cfg80211_chan_def chandef = {};
4691 		int ret;
4692 
4693 		ret = rdev_get_channel(rdev, wdev, 0, &chandef);
4694 		if (ret == 0 && nl80211_send_chandef(msg, &chandef))
4695 			goto nla_put_failure;
4696 	}
4697 
4698 	if (rdev->ops->get_tx_power && !wdev->valid_links) {
4699 		int dbm, ret;
4700 
4701 		ret = rdev_get_tx_power(rdev, wdev, -1, 0, &dbm);
4702 		if (ret == 0 &&
4703 		    nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
4704 				DBM_TO_MBM(dbm)))
4705 			goto nla_put_failure;
4706 	}
4707 
4708 	switch (wdev->iftype) {
4709 	case NL80211_IFTYPE_AP:
4710 	case NL80211_IFTYPE_P2P_GO:
4711 		if (wdev->u.ap.ssid_len &&
4712 		    nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len,
4713 			    wdev->u.ap.ssid))
4714 			goto nla_put_failure;
4715 		break;
4716 	case NL80211_IFTYPE_STATION:
4717 	case NL80211_IFTYPE_P2P_CLIENT:
4718 		if (wdev->u.client.ssid_len &&
4719 		    nla_put(msg, NL80211_ATTR_SSID, wdev->u.client.ssid_len,
4720 			    wdev->u.client.ssid))
4721 			goto nla_put_failure;
4722 		break;
4723 	case NL80211_IFTYPE_ADHOC:
4724 		if (wdev->u.ibss.ssid_len &&
4725 		    nla_put(msg, NL80211_ATTR_SSID, wdev->u.ibss.ssid_len,
4726 			    wdev->u.ibss.ssid))
4727 			goto nla_put_failure;
4728 		break;
4729 	default:
4730 		/* nothing */
4731 		break;
4732 	}
4733 
4734 	if (rdev->ops->get_txq_stats) {
4735 		struct cfg80211_txq_stats txqstats = {};
4736 		int ret = rdev_get_txq_stats(rdev, wdev, &txqstats);
4737 
4738 		if (ret == 0 &&
4739 		    !nl80211_put_txq_stats(msg, &txqstats,
4740 					   NL80211_ATTR_TXQ_STATS))
4741 			goto nla_put_failure;
4742 	}
4743 
4744 	if (wdev->valid_links) {
4745 		unsigned int link_id;
4746 		struct nlattr *links = nla_nest_start(msg,
4747 						      NL80211_ATTR_MLO_LINKS);
4748 
4749 		if (!links)
4750 			goto nla_put_failure;
4751 
4752 		for_each_valid_link(wdev, link_id) {
4753 			struct nlattr *link = nla_nest_start(msg, link_id + 1);
4754 			struct cfg80211_chan_def chandef = {};
4755 			int ret;
4756 
4757 			if (!link)
4758 				goto nla_put_failure;
4759 
4760 			if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))
4761 				goto nla_put_failure;
4762 			if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN,
4763 				    wdev->links[link_id].addr))
4764 				goto nla_put_failure;
4765 
4766 			ret = rdev_get_channel(rdev, wdev, link_id, &chandef);
4767 			if (ret == 0 && nl80211_send_chandef(msg, &chandef))
4768 				goto nla_put_failure;
4769 
4770 			if (rdev->ops->get_tx_power) {
4771 				int dbm, ret;
4772 
4773 				ret = rdev_get_tx_power(rdev, wdev, -1, link_id, &dbm);
4774 				if (ret == 0 &&
4775 				    nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
4776 						DBM_TO_MBM(dbm)))
4777 					goto nla_put_failure;
4778 			}
4779 			nla_nest_end(msg, link);
4780 		}
4781 
4782 		nla_nest_end(msg, links);
4783 	}
4784 
4785 	genlmsg_end(msg, hdr);
4786 	return 0;
4787 
4788  nla_put_failure:
4789 	genlmsg_cancel(msg, hdr);
4790 	return -EMSGSIZE;
4791 }
4792 
4793 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
4794 {
4795 	int wp_idx = 0;
4796 	int if_idx = 0;
4797 	int wp_start = cb->args[0];
4798 	int if_start = cb->args[1];
4799 	int filter_wiphy = -1;
4800 	struct cfg80211_registered_device *rdev;
4801 	struct wireless_dev *wdev;
4802 	int ret;
4803 
4804 	rtnl_lock();
4805 	if (!cb->args[2]) {
4806 		struct nl80211_dump_wiphy_state state = {
4807 			.filter_wiphy = -1,
4808 		};
4809 
4810 		ret = nl80211_dump_wiphy_parse(skb, cb, &state);
4811 		if (ret)
4812 			goto out_unlock;
4813 
4814 		filter_wiphy = state.filter_wiphy;
4815 
4816 		/*
4817 		 * if filtering, set cb->args[2] to +1 since 0 is the default
4818 		 * value needed to determine that parsing is necessary.
4819 		 */
4820 		if (filter_wiphy >= 0)
4821 			cb->args[2] = filter_wiphy + 1;
4822 		else
4823 			cb->args[2] = -1;
4824 	} else if (cb->args[2] > 0) {
4825 		filter_wiphy = cb->args[2] - 1;
4826 	}
4827 
4828 	for_each_rdev(rdev) {
4829 		if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
4830 			continue;
4831 		if (wp_idx < wp_start) {
4832 			wp_idx++;
4833 			continue;
4834 		}
4835 
4836 		if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx)
4837 			continue;
4838 
4839 		if_idx = 0;
4840 
4841 		guard(wiphy)(&rdev->wiphy);
4842 
4843 		list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
4844 			if (if_idx < if_start) {
4845 				if_idx++;
4846 				continue;
4847 			}
4848 
4849 			if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid,
4850 					       cb->nlh->nlmsg_seq, NLM_F_MULTI,
4851 					       rdev, wdev,
4852 					       NL80211_CMD_NEW_INTERFACE) < 0)
4853 				goto out;
4854 
4855 			if_idx++;
4856 		}
4857 
4858 		if_start = 0;
4859 		wp_idx++;
4860 	}
4861  out:
4862 	cb->args[0] = wp_idx;
4863 	cb->args[1] = if_idx;
4864 
4865 	ret = skb->len;
4866  out_unlock:
4867 	rtnl_unlock();
4868 
4869 	return ret;
4870 }
4871 
4872 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
4873 {
4874 	struct sk_buff *msg;
4875 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
4876 	struct wireless_dev *wdev = info->user_ptr[1];
4877 
4878 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
4879 	if (!msg)
4880 		return -ENOMEM;
4881 
4882 	if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
4883 			       rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) {
4884 		nlmsg_free(msg);
4885 		return -ENOBUFS;
4886 	}
4887 
4888 	return genlmsg_reply(msg, info);
4889 }
4890 
4891 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = {
4892 	[NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG },
4893 	[NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG },
4894 	[NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG },
4895 	[NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
4896 	[NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
4897 	[NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG },
4898 	[NL80211_MNTR_FLAG_SKIP_TX] = { .type = NLA_FLAG },
4899 };
4900 
4901 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
4902 {
4903 	struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1];
4904 	int flag;
4905 
4906 	*mntrflags = 0;
4907 
4908 	if (!nla)
4909 		return -EINVAL;
4910 
4911 	if (nla_parse_nested_deprecated(flags, NL80211_MNTR_FLAG_MAX, nla, mntr_flags_policy, NULL))
4912 		return -EINVAL;
4913 
4914 	for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
4915 		if (flags[flag])
4916 			*mntrflags |= (1<<flag);
4917 
4918 	/* cooked monitor mode is incompatible with other modes */
4919 	if (*mntrflags & MONITOR_FLAG_COOK_FRAMES &&
4920 	    *mntrflags != MONITOR_FLAG_COOK_FRAMES)
4921 		return -EOPNOTSUPP;
4922 
4923 	*mntrflags |= MONITOR_FLAG_CHANGED;
4924 
4925 	return 0;
4926 }
4927 
4928 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev,
4929 				     enum nl80211_iftype type,
4930 				     struct genl_info *info,
4931 				     struct vif_params *params)
4932 {
4933 	bool change = false;
4934 	int err;
4935 
4936 	if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
4937 		if (type != NL80211_IFTYPE_MONITOR)
4938 			return -EINVAL;
4939 
4940 		err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
4941 					  &params->flags);
4942 		if (err)
4943 			return err;
4944 
4945 		change = true;
4946 	}
4947 
4948 	/* MONITOR_FLAG_COOK_FRAMES is deprecated, refuse cooperation */
4949 	if (params->flags & MONITOR_FLAG_COOK_FRAMES)
4950 		return -EOPNOTSUPP;
4951 
4952 	if (params->flags & MONITOR_FLAG_ACTIVE &&
4953 	    !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
4954 		return -EOPNOTSUPP;
4955 
4956 	if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) {
4957 		const u8 *mumimo_groups;
4958 		u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
4959 
4960 		if (type != NL80211_IFTYPE_MONITOR)
4961 			return -EINVAL;
4962 
4963 		if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
4964 			return -EOPNOTSUPP;
4965 
4966 		mumimo_groups =
4967 			nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]);
4968 
4969 		/* bits 0 and 63 are reserved and must be zero */
4970 		if ((mumimo_groups[0] & BIT(0)) ||
4971 		    (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7)))
4972 			return -EINVAL;
4973 
4974 		params->vht_mumimo_groups = mumimo_groups;
4975 		change = true;
4976 	}
4977 
4978 	if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) {
4979 		u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
4980 
4981 		if (type != NL80211_IFTYPE_MONITOR)
4982 			return -EINVAL;
4983 
4984 		if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
4985 			return -EOPNOTSUPP;
4986 
4987 		params->vht_mumimo_follow_addr =
4988 			nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]);
4989 		change = true;
4990 	}
4991 
4992 	return change ? 1 : 0;
4993 }
4994 
4995 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev,
4996 			       struct net_device *netdev, u8 use_4addr,
4997 			       enum nl80211_iftype iftype)
4998 {
4999 	if (!use_4addr) {
5000 		if (netdev && netif_is_bridge_port(netdev))
5001 			return -EBUSY;
5002 		return 0;
5003 	}
5004 
5005 	switch (iftype) {
5006 	case NL80211_IFTYPE_AP_VLAN:
5007 		if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP)
5008 			return 0;
5009 		break;
5010 	case NL80211_IFTYPE_STATION:
5011 		if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION)
5012 			return 0;
5013 		break;
5014 	default:
5015 		break;
5016 	}
5017 
5018 	return -EOPNOTSUPP;
5019 }
5020 
5021 static int nl80211_parse_vif_radio_mask(struct genl_info *info,
5022 					u32 *radio_mask)
5023 {
5024 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5025 	struct nlattr *attr = info->attrs[NL80211_ATTR_VIF_RADIO_MASK];
5026 	u32 mask, allowed;
5027 
5028 	if (!attr) {
5029 		*radio_mask = 0;
5030 		return 0;
5031 	}
5032 
5033 	allowed = BIT(rdev->wiphy.n_radio) - 1;
5034 	mask = nla_get_u32(attr);
5035 	if (mask & ~allowed)
5036 		return -EINVAL;
5037 	if (!mask)
5038 		mask = allowed;
5039 	*radio_mask = mask;
5040 
5041 	return 1;
5042 }
5043 
5044 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
5045 {
5046 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5047 	struct vif_params params;
5048 	int err;
5049 	enum nl80211_iftype otype, ntype;
5050 	struct net_device *dev = info->user_ptr[1];
5051 	struct wireless_dev *wdev = dev->ieee80211_ptr;
5052 	u32 radio_mask = 0;
5053 	bool change = false;
5054 
5055 	memset(&params, 0, sizeof(params));
5056 
5057 	otype = ntype = dev->ieee80211_ptr->iftype;
5058 
5059 	if (info->attrs[NL80211_ATTR_IFTYPE]) {
5060 		ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
5061 		if (otype != ntype)
5062 			change = true;
5063 	}
5064 
5065 	if (info->attrs[NL80211_ATTR_MESH_ID]) {
5066 		if (ntype != NL80211_IFTYPE_MESH_POINT)
5067 			return -EINVAL;
5068 		if (otype != NL80211_IFTYPE_MESH_POINT)
5069 			return -EINVAL;
5070 		if (netif_running(dev))
5071 			return -EBUSY;
5072 
5073 		wdev->u.mesh.id_up_len =
5074 			nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
5075 		memcpy(wdev->u.mesh.id,
5076 		       nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
5077 		       wdev->u.mesh.id_up_len);
5078 	}
5079 
5080 	if (info->attrs[NL80211_ATTR_4ADDR]) {
5081 		params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
5082 		change = true;
5083 		err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype);
5084 		if (err)
5085 			return err;
5086 	} else {
5087 		params.use_4addr = -1;
5088 	}
5089 
5090 	err = nl80211_parse_mon_options(rdev, ntype, info, &params);
5091 	if (err < 0)
5092 		return err;
5093 	if (err > 0)
5094 		change = true;
5095 
5096 	err = nl80211_parse_vif_radio_mask(info, &radio_mask);
5097 	if (err < 0)
5098 		return err;
5099 	if (err && netif_running(dev))
5100 		return -EBUSY;
5101 
5102 	if (change)
5103 		err = cfg80211_change_iface(rdev, dev, ntype, &params);
5104 	else
5105 		err = 0;
5106 
5107 	if (!err && params.use_4addr != -1)
5108 		dev->ieee80211_ptr->use_4addr = params.use_4addr;
5109 
5110 	if (radio_mask)
5111 		wdev->radio_mask = radio_mask;
5112 
5113 	if (change && !err)
5114 		nl80211_notify_iface(rdev, wdev, NL80211_CMD_SET_INTERFACE);
5115 
5116 	return err;
5117 }
5118 
5119 static int _nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
5120 {
5121 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5122 	struct vif_params params;
5123 	struct wireless_dev *wdev;
5124 	struct sk_buff *msg;
5125 	u32 radio_mask;
5126 	int err;
5127 	enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
5128 
5129 	memset(&params, 0, sizeof(params));
5130 
5131 	if (!info->attrs[NL80211_ATTR_IFNAME])
5132 		return -EINVAL;
5133 
5134 	if (info->attrs[NL80211_ATTR_IFTYPE])
5135 		type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
5136 
5137 	if (!rdev->ops->add_virtual_intf)
5138 		return -EOPNOTSUPP;
5139 
5140 	if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN ||
5141 	     type == NL80211_IFTYPE_PD ||
5142 	     rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) &&
5143 	    info->attrs[NL80211_ATTR_MAC]) {
5144 		nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC],
5145 			   ETH_ALEN);
5146 		if (!is_valid_ether_addr(params.macaddr))
5147 			return -EADDRNOTAVAIL;
5148 	}
5149 
5150 	if (info->attrs[NL80211_ATTR_4ADDR]) {
5151 		params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
5152 		err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type);
5153 		if (err)
5154 			return err;
5155 	}
5156 
5157 	if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0))
5158 		return -EOPNOTSUPP;
5159 
5160 	err = nl80211_parse_mon_options(rdev, type, info, &params);
5161 	if (err < 0)
5162 		return err;
5163 
5164 	err = nl80211_parse_vif_radio_mask(info, &radio_mask);
5165 	if (err < 0)
5166 		return err;
5167 
5168 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
5169 	if (!msg)
5170 		return -ENOMEM;
5171 
5172 	wdev = rdev_add_virtual_intf(rdev,
5173 				nla_data(info->attrs[NL80211_ATTR_IFNAME]),
5174 				NET_NAME_USER, type, &params);
5175 	if (WARN_ON(!wdev)) {
5176 		nlmsg_free(msg);
5177 		return -EPROTO;
5178 	} else if (IS_ERR(wdev)) {
5179 		nlmsg_free(msg);
5180 		return PTR_ERR(wdev);
5181 	}
5182 
5183 	if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
5184 		wdev->owner_nlportid = info->snd_portid;
5185 
5186 	switch (type) {
5187 	case NL80211_IFTYPE_MESH_POINT:
5188 		if (!info->attrs[NL80211_ATTR_MESH_ID])
5189 			break;
5190 		wdev->u.mesh.id_up_len =
5191 			nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
5192 		memcpy(wdev->u.mesh.id,
5193 		       nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
5194 		       wdev->u.mesh.id_up_len);
5195 		break;
5196 	case NL80211_IFTYPE_NAN:
5197 	case NL80211_IFTYPE_P2P_DEVICE:
5198 	case NL80211_IFTYPE_PD:
5199 		/*
5200 		 * P2P Device, NAN and PD do not have a netdev, so don't go
5201 		 * through the netdev notifier and must be added here
5202 		 */
5203 		cfg80211_init_wdev(wdev);
5204 		cfg80211_register_wdev(rdev, wdev);
5205 		break;
5206 	default:
5207 		break;
5208 	}
5209 
5210 	if (radio_mask)
5211 		wdev->radio_mask = radio_mask;
5212 
5213 	if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
5214 			       rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) {
5215 		nlmsg_free(msg);
5216 		return -ENOBUFS;
5217 	}
5218 
5219 	return genlmsg_reply(msg, info);
5220 }
5221 
5222 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
5223 {
5224 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5225 
5226 	/* to avoid failing a new interface creation due to pending removal */
5227 	cfg80211_destroy_ifaces(rdev);
5228 
5229 	guard(wiphy)(&rdev->wiphy);
5230 
5231 	return _nl80211_new_interface(skb, info);
5232 }
5233 
5234 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
5235 {
5236 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5237 	struct wireless_dev *wdev = info->user_ptr[1];
5238 
5239 	if (!rdev->ops->del_virtual_intf)
5240 		return -EOPNOTSUPP;
5241 
5242 	/*
5243 	 * We hold RTNL, so this is safe, without RTNL opencount cannot
5244 	 * reach 0, and thus the rdev cannot be deleted.
5245 	 *
5246 	 * We need to do it for the dev_close(), since that will call
5247 	 * the netdev notifiers, and we need to acquire the mutex there
5248 	 * but don't know if we get there from here or from some other
5249 	 * place (e.g. "ip link set ... down").
5250 	 */
5251 	mutex_unlock(&rdev->wiphy.mtx);
5252 
5253 	/*
5254 	 * If we remove a wireless device without a netdev then clear
5255 	 * user_ptr[1] so that nl80211_post_doit won't dereference it
5256 	 * to check if it needs to do dev_put(). Otherwise it crashes
5257 	 * since the wdev has been freed, unlike with a netdev where
5258 	 * we need the dev_put() for the netdev to really be freed.
5259 	 */
5260 	if (!wdev->netdev)
5261 		info->user_ptr[1] = NULL;
5262 	else
5263 		dev_close(wdev->netdev);
5264 
5265 	cfg80211_close_dependents(rdev, wdev);
5266 
5267 	mutex_lock(&rdev->wiphy.mtx);
5268 
5269 	return cfg80211_remove_virtual_intf(rdev, wdev);
5270 }
5271 
5272 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info)
5273 {
5274 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5275 	struct net_device *dev = info->user_ptr[1];
5276 	u16 noack_map;
5277 
5278 	if (!info->attrs[NL80211_ATTR_NOACK_MAP])
5279 		return -EINVAL;
5280 
5281 	if (!rdev->ops->set_noack_map)
5282 		return -EOPNOTSUPP;
5283 
5284 	noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]);
5285 
5286 	return rdev_set_noack_map(rdev, dev, noack_map);
5287 }
5288 
5289 static int nl80211_validate_key_link_id(struct genl_info *info,
5290 					struct wireless_dev *wdev,
5291 					int link_id, bool pairwise)
5292 {
5293 	if (pairwise) {
5294 		if (link_id != -1) {
5295 			GENL_SET_ERR_MSG(info,
5296 					 "link ID not allowed for pairwise key");
5297 			return -EINVAL;
5298 		}
5299 
5300 		return 0;
5301 	}
5302 
5303 	if (wdev->valid_links) {
5304 		if (link_id == -1) {
5305 			GENL_SET_ERR_MSG(info,
5306 					 "link ID must be set for MLO group key");
5307 			return -EINVAL;
5308 		}
5309 		if (!(wdev->valid_links & BIT(link_id))) {
5310 			GENL_SET_ERR_MSG(info, "invalid link ID for MLO group key");
5311 			return -EINVAL;
5312 		}
5313 	} else if (link_id != -1) {
5314 		GENL_SET_ERR_MSG(info, "link ID not allowed for non-MLO group key");
5315 		return -EINVAL;
5316 	}
5317 
5318 	return 0;
5319 }
5320 
5321 struct get_key_cookie {
5322 	struct sk_buff *msg;
5323 	int error;
5324 	int idx;
5325 };
5326 
5327 static void get_key_callback(void *c, struct key_params *params)
5328 {
5329 	struct nlattr *key;
5330 	struct get_key_cookie *cookie = c;
5331 
5332 	if ((params->seq &&
5333 	     nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ,
5334 		     params->seq_len, params->seq)) ||
5335 	    (params->cipher &&
5336 	     nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER,
5337 			 params->cipher)))
5338 		goto nla_put_failure;
5339 
5340 	key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY);
5341 	if (!key)
5342 		goto nla_put_failure;
5343 
5344 	if ((params->seq &&
5345 	     nla_put(cookie->msg, NL80211_KEY_SEQ,
5346 		     params->seq_len, params->seq)) ||
5347 	    (params->cipher &&
5348 	     nla_put_u32(cookie->msg, NL80211_KEY_CIPHER,
5349 			 params->cipher)))
5350 		goto nla_put_failure;
5351 
5352 	if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx))
5353 		goto nla_put_failure;
5354 
5355 	nla_nest_end(cookie->msg, key);
5356 
5357 	return;
5358  nla_put_failure:
5359 	cookie->error = 1;
5360 }
5361 
5362 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
5363 {
5364 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5365 	int err;
5366 	struct wireless_dev *wdev = info->user_ptr[1];
5367 	u8 key_idx = 0;
5368 	const u8 *mac_addr = NULL;
5369 	bool pairwise;
5370 	struct get_key_cookie cookie = {
5371 		.error = 0,
5372 	};
5373 	void *hdr;
5374 	struct sk_buff *msg;
5375 	bool bigtk_support = false;
5376 	int link_id = nl80211_link_id_or_invalid(info->attrs);
5377 
5378 	if (wiphy_ext_feature_isset(&rdev->wiphy,
5379 				    NL80211_EXT_FEATURE_BEACON_PROTECTION))
5380 		bigtk_support = true;
5381 
5382 	if ((wdev->iftype == NL80211_IFTYPE_STATION ||
5383 	     wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) &&
5384 	    wiphy_ext_feature_isset(&rdev->wiphy,
5385 				    NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT))
5386 		bigtk_support = true;
5387 
5388 	if (info->attrs[NL80211_ATTR_KEY_IDX]) {
5389 		key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
5390 
5391 		if (key_idx >= 6 && key_idx <= 7 && !bigtk_support) {
5392 			GENL_SET_ERR_MSG(info, "BIGTK not supported");
5393 			return -EINVAL;
5394 		}
5395 	}
5396 
5397 	if (info->attrs[NL80211_ATTR_MAC])
5398 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
5399 
5400 	pairwise = !!mac_addr;
5401 	if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
5402 		u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
5403 
5404 		if (kt != NL80211_KEYTYPE_GROUP &&
5405 		    kt != NL80211_KEYTYPE_PAIRWISE)
5406 			return -EINVAL;
5407 		pairwise = kt == NL80211_KEYTYPE_PAIRWISE;
5408 	}
5409 
5410 	if (!rdev->ops->get_key)
5411 		return -EOPNOTSUPP;
5412 
5413 	if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
5414 		return -ENOENT;
5415 
5416 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
5417 	if (!msg)
5418 		return -ENOMEM;
5419 
5420 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
5421 			     NL80211_CMD_NEW_KEY);
5422 	if (!hdr)
5423 		goto nla_put_failure;
5424 
5425 	cookie.msg = msg;
5426 	cookie.idx = key_idx;
5427 
5428 	if ((wdev->netdev &&
5429 	     nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) ||
5430 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
5431 			      NL80211_ATTR_PAD) ||
5432 	    nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx))
5433 		goto nla_put_failure;
5434 	if (mac_addr &&
5435 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
5436 		goto nla_put_failure;
5437 
5438 	err = nl80211_validate_key_link_id(info, wdev, link_id, pairwise);
5439 	if (err)
5440 		goto free_msg;
5441 
5442 	err = rdev_get_key(rdev, wdev, link_id, key_idx, pairwise, mac_addr,
5443 			   &cookie, get_key_callback);
5444 
5445 	if (err)
5446 		goto free_msg;
5447 
5448 	if (cookie.error)
5449 		goto nla_put_failure;
5450 
5451 	genlmsg_end(msg, hdr);
5452 	return genlmsg_reply(msg, info);
5453 
5454  nla_put_failure:
5455 	err = -ENOBUFS;
5456  free_msg:
5457 	nlmsg_free(msg);
5458 	return err;
5459 }
5460 
5461 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
5462 {
5463 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5464 	struct key_parse key;
5465 	int err;
5466 	struct wireless_dev *wdev = info->user_ptr[1];
5467 	int link_id = nl80211_link_id_or_invalid(info->attrs);
5468 
5469 	err = nl80211_parse_key(info, &key);
5470 	if (err)
5471 		return err;
5472 
5473 	if (key.idx < 0)
5474 		return -EINVAL;
5475 
5476 	/* Only support setting default key and
5477 	 * Extended Key ID action NL80211_KEY_SET_TX.
5478 	 */
5479 	if (!key.def && !key.defmgmt && !key.defbeacon &&
5480 	    !(key.p.mode == NL80211_KEY_SET_TX))
5481 		return -EINVAL;
5482 
5483 	if (key.def) {
5484 		if (!rdev->ops->set_default_key)
5485 			return -EOPNOTSUPP;
5486 
5487 		if (!wdev->netdev)
5488 			return -EINVAL;
5489 
5490 		err = nl80211_key_allowed(wdev);
5491 		if (err)
5492 			return err;
5493 
5494 		err = nl80211_validate_key_link_id(info, wdev, link_id, false);
5495 		if (err)
5496 			return err;
5497 
5498 		err = rdev_set_default_key(rdev, wdev->netdev, link_id, key.idx,
5499 					   key.def_uni, key.def_multi);
5500 
5501 		if (err)
5502 			return err;
5503 
5504 #ifdef CONFIG_CFG80211_WEXT
5505 		wdev->wext.default_key = key.idx;
5506 #endif
5507 		return 0;
5508 	} else if (key.defmgmt) {
5509 		if (key.def_uni || !key.def_multi)
5510 			return -EINVAL;
5511 
5512 		if (!rdev->ops->set_default_mgmt_key)
5513 			return -EOPNOTSUPP;
5514 
5515 		err = nl80211_key_allowed(wdev);
5516 		if (err)
5517 			return err;
5518 
5519 		err = nl80211_validate_key_link_id(info, wdev, link_id, false);
5520 		if (err)
5521 			return err;
5522 
5523 		err = rdev_set_default_mgmt_key(rdev, wdev, link_id, key.idx);
5524 		if (err)
5525 			return err;
5526 
5527 #ifdef CONFIG_CFG80211_WEXT
5528 		wdev->wext.default_mgmt_key = key.idx;
5529 #endif
5530 		return 0;
5531 	} else if (key.defbeacon) {
5532 		if (key.def_uni || !key.def_multi)
5533 			return -EINVAL;
5534 
5535 		if (!rdev->ops->set_default_beacon_key)
5536 			return -EOPNOTSUPP;
5537 
5538 		err = nl80211_key_allowed(wdev);
5539 		if (err)
5540 			return err;
5541 
5542 		err = nl80211_validate_key_link_id(info, wdev, link_id, false);
5543 		if (err)
5544 			return err;
5545 
5546 		return rdev_set_default_beacon_key(rdev, wdev, link_id,
5547 						   key.idx);
5548 	} else if (key.p.mode == NL80211_KEY_SET_TX &&
5549 		   wiphy_ext_feature_isset(&rdev->wiphy,
5550 					   NL80211_EXT_FEATURE_EXT_KEY_ID)) {
5551 		u8 *mac_addr = NULL;
5552 
5553 		if (info->attrs[NL80211_ATTR_MAC])
5554 			mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
5555 
5556 		if (!mac_addr || key.idx < 0 || key.idx > 1)
5557 			return -EINVAL;
5558 
5559 		err = nl80211_validate_key_link_id(info, wdev, link_id, true);
5560 		if (err)
5561 			return err;
5562 
5563 		return rdev_add_key(rdev, wdev, link_id, key.idx,
5564 				    NL80211_KEYTYPE_PAIRWISE,
5565 				    mac_addr, &key.p);
5566 	}
5567 
5568 	return -EINVAL;
5569 }
5570 
5571 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
5572 {
5573 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5574 	int err;
5575 	struct wireless_dev *wdev = info->user_ptr[1];
5576 	struct key_parse key;
5577 	const u8 *mac_addr = NULL;
5578 	int link_id = nl80211_link_id_or_invalid(info->attrs);
5579 
5580 	err = nl80211_parse_key(info, &key);
5581 	if (err)
5582 		return err;
5583 
5584 	if (!key.p.key) {
5585 		GENL_SET_ERR_MSG(info, "no key");
5586 		return -EINVAL;
5587 	}
5588 
5589 	if (info->attrs[NL80211_ATTR_MAC])
5590 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
5591 
5592 	if (key.type == -1) {
5593 		if (mac_addr)
5594 			key.type = NL80211_KEYTYPE_PAIRWISE;
5595 		else
5596 			key.type = NL80211_KEYTYPE_GROUP;
5597 	}
5598 
5599 	/* for now */
5600 	if (key.type != NL80211_KEYTYPE_PAIRWISE &&
5601 	    key.type != NL80211_KEYTYPE_GROUP) {
5602 		GENL_SET_ERR_MSG(info, "key type not pairwise or group");
5603 		return -EINVAL;
5604 	}
5605 
5606 	if (key.type == NL80211_KEYTYPE_GROUP &&
5607 	    info->attrs[NL80211_ATTR_VLAN_ID])
5608 		key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
5609 
5610 	if (!rdev->ops->add_key)
5611 		return -EOPNOTSUPP;
5612 
5613 	if (cfg80211_validate_key_settings(rdev, wdev, &key.p, key.idx,
5614 					   key.type == NL80211_KEYTYPE_PAIRWISE,
5615 					   mac_addr)) {
5616 		GENL_SET_ERR_MSG(info, "key setting validation failed");
5617 		return -EINVAL;
5618 	}
5619 
5620 	err = nl80211_key_allowed(wdev);
5621 	if (err)
5622 		GENL_SET_ERR_MSG(info, "key not allowed");
5623 
5624 	if (!err)
5625 		err = nl80211_validate_key_link_id(info, wdev, link_id,
5626 				key.type == NL80211_KEYTYPE_PAIRWISE);
5627 
5628 	if (!err) {
5629 		err = rdev_add_key(rdev, wdev, link_id, key.idx,
5630 				   key.type == NL80211_KEYTYPE_PAIRWISE,
5631 				    mac_addr, &key.p);
5632 		if (err)
5633 			GENL_SET_ERR_MSG(info, "key addition failed");
5634 	}
5635 
5636 	return err;
5637 }
5638 
5639 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
5640 {
5641 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5642 	int err;
5643 	struct wireless_dev *wdev = info->user_ptr[1];
5644 	u8 *mac_addr = NULL;
5645 	struct key_parse key;
5646 	int link_id = nl80211_link_id_or_invalid(info->attrs);
5647 
5648 	err = nl80211_parse_key(info, &key);
5649 	if (err)
5650 		return err;
5651 
5652 	if (info->attrs[NL80211_ATTR_MAC])
5653 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
5654 
5655 	if (key.type == -1) {
5656 		if (mac_addr)
5657 			key.type = NL80211_KEYTYPE_PAIRWISE;
5658 		else
5659 			key.type = NL80211_KEYTYPE_GROUP;
5660 	}
5661 
5662 	/* for now */
5663 	if (key.type != NL80211_KEYTYPE_PAIRWISE &&
5664 	    key.type != NL80211_KEYTYPE_GROUP)
5665 		return -EINVAL;
5666 
5667 	if (!cfg80211_valid_key_idx(rdev, key.idx,
5668 				    key.type == NL80211_KEYTYPE_PAIRWISE))
5669 		return -EINVAL;
5670 
5671 	if (!rdev->ops->del_key)
5672 		return -EOPNOTSUPP;
5673 
5674 	err = nl80211_key_allowed(wdev);
5675 
5676 	if (key.type == NL80211_KEYTYPE_GROUP && mac_addr &&
5677 	    !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
5678 		err = -ENOENT;
5679 
5680 	if (!err)
5681 		err = nl80211_validate_key_link_id(info, wdev, link_id,
5682 				key.type == NL80211_KEYTYPE_PAIRWISE);
5683 
5684 	if (!err)
5685 		err = rdev_del_key(rdev, wdev, link_id, key.idx,
5686 				   key.type == NL80211_KEYTYPE_PAIRWISE,
5687 				   mac_addr);
5688 
5689 #ifdef CONFIG_CFG80211_WEXT
5690 	if (!err) {
5691 		if (key.idx == wdev->wext.default_key)
5692 			wdev->wext.default_key = -1;
5693 		else if (key.idx == wdev->wext.default_mgmt_key)
5694 			wdev->wext.default_mgmt_key = -1;
5695 	}
5696 #endif
5697 
5698 	return err;
5699 }
5700 
5701 /* This function returns an error or the number of nested attributes */
5702 static int validate_acl_mac_addrs(struct nlattr *nl_attr)
5703 {
5704 	struct nlattr *attr;
5705 	int n_entries = 0, tmp;
5706 
5707 	nla_for_each_nested(attr, nl_attr, tmp) {
5708 		if (nla_len(attr) != ETH_ALEN)
5709 			return -EINVAL;
5710 
5711 		n_entries++;
5712 	}
5713 
5714 	return n_entries;
5715 }
5716 
5717 /*
5718  * This function parses ACL information and allocates memory for ACL data.
5719  * On successful return, the calling function is responsible to free the
5720  * ACL buffer returned by this function.
5721  */
5722 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy,
5723 						struct genl_info *info)
5724 {
5725 	enum nl80211_acl_policy acl_policy;
5726 	struct nlattr *attr;
5727 	struct cfg80211_acl_data *acl;
5728 	int i = 0, n_entries, tmp;
5729 
5730 	if (!wiphy->max_acl_mac_addrs)
5731 		return ERR_PTR(-EOPNOTSUPP);
5732 
5733 	if (!info->attrs[NL80211_ATTR_ACL_POLICY])
5734 		return ERR_PTR(-EINVAL);
5735 
5736 	acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]);
5737 	if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED &&
5738 	    acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED)
5739 		return ERR_PTR(-EINVAL);
5740 
5741 	if (!info->attrs[NL80211_ATTR_MAC_ADDRS])
5742 		return ERR_PTR(-EINVAL);
5743 
5744 	n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]);
5745 	if (n_entries < 0)
5746 		return ERR_PTR(n_entries);
5747 
5748 	if (n_entries > wiphy->max_acl_mac_addrs)
5749 		return ERR_PTR(-EOPNOTSUPP);
5750 
5751 	acl = kzalloc_flex(*acl, mac_addrs, n_entries);
5752 	if (!acl)
5753 		return ERR_PTR(-ENOMEM);
5754 	acl->n_acl_entries = n_entries;
5755 
5756 	nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) {
5757 		memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN);
5758 		i++;
5759 	}
5760 	acl->acl_policy = acl_policy;
5761 
5762 	return acl;
5763 }
5764 
5765 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info)
5766 {
5767 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5768 	struct net_device *dev = info->user_ptr[1];
5769 	struct cfg80211_acl_data *acl;
5770 	int err;
5771 
5772 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
5773 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5774 		return -EOPNOTSUPP;
5775 
5776 	if (!dev->ieee80211_ptr->links[0].ap.beacon_interval)
5777 		return -EINVAL;
5778 
5779 	acl = parse_acl_data(&rdev->wiphy, info);
5780 	if (IS_ERR(acl))
5781 		return PTR_ERR(acl);
5782 
5783 	err = rdev_set_mac_acl(rdev, dev, acl);
5784 
5785 	kfree(acl);
5786 
5787 	return err;
5788 }
5789 
5790 static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
5791 			   u8 *rates, u8 rates_len)
5792 {
5793 	u8 i;
5794 	u32 mask = 0;
5795 
5796 	for (i = 0; i < rates_len; i++) {
5797 		int rate = (rates[i] & 0x7f) * 5;
5798 		int ridx;
5799 
5800 		for (ridx = 0; ridx < sband->n_bitrates; ridx++) {
5801 			struct ieee80211_rate *srate =
5802 				&sband->bitrates[ridx];
5803 			if (rate == srate->bitrate) {
5804 				mask |= 1 << ridx;
5805 				break;
5806 			}
5807 		}
5808 		if (ridx == sband->n_bitrates)
5809 			return 0; /* rate not found */
5810 	}
5811 
5812 	return mask;
5813 }
5814 
5815 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband,
5816 			       u8 *rates, u8 rates_len,
5817 			       u8 mcs[IEEE80211_HT_MCS_MASK_LEN])
5818 {
5819 	u8 i;
5820 
5821 	memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN);
5822 
5823 	for (i = 0; i < rates_len; i++) {
5824 		int ridx, rbit;
5825 
5826 		ridx = rates[i] / 8;
5827 		rbit = BIT(rates[i] % 8);
5828 
5829 		/* check validity */
5830 		if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN))
5831 			return false;
5832 
5833 		/* check availability */
5834 		ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN);
5835 		if (sband->ht_cap.mcs.rx_mask[ridx] & rbit)
5836 			mcs[ridx] |= rbit;
5837 		else
5838 			return false;
5839 	}
5840 
5841 	return true;
5842 }
5843 
5844 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map)
5845 {
5846 	u16 mcs_mask = 0;
5847 
5848 	switch (vht_mcs_map) {
5849 	case IEEE80211_VHT_MCS_NOT_SUPPORTED:
5850 		break;
5851 	case IEEE80211_VHT_MCS_SUPPORT_0_7:
5852 		mcs_mask = 0x00FF;
5853 		break;
5854 	case IEEE80211_VHT_MCS_SUPPORT_0_8:
5855 		mcs_mask = 0x01FF;
5856 		break;
5857 	case IEEE80211_VHT_MCS_SUPPORT_0_9:
5858 		mcs_mask = 0x03FF;
5859 		break;
5860 	default:
5861 		break;
5862 	}
5863 
5864 	return mcs_mask;
5865 }
5866 
5867 static void vht_build_mcs_mask(u16 vht_mcs_map,
5868 			       u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
5869 {
5870 	u8 nss;
5871 
5872 	for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
5873 		vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03);
5874 		vht_mcs_map >>= 2;
5875 	}
5876 }
5877 
5878 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband,
5879 			     struct nl80211_txrate_vht *txrate,
5880 			     u16 mcs[NL80211_VHT_NSS_MAX])
5881 {
5882 	u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
5883 	u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {};
5884 	u8 i;
5885 
5886 	if (!sband->vht_cap.vht_supported)
5887 		return false;
5888 
5889 	memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX);
5890 
5891 	/* Build vht_mcs_mask from VHT capabilities */
5892 	vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask);
5893 
5894 	for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
5895 		if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
5896 			mcs[i] = txrate->mcs[i];
5897 		else
5898 			return false;
5899 	}
5900 
5901 	return true;
5902 }
5903 
5904 static u16 he_mcs_map_to_mcs_mask(u8 he_mcs_map)
5905 {
5906 	switch (he_mcs_map) {
5907 	case IEEE80211_HE_MCS_NOT_SUPPORTED:
5908 		return 0;
5909 	case IEEE80211_HE_MCS_SUPPORT_0_7:
5910 		return 0x00FF;
5911 	case IEEE80211_HE_MCS_SUPPORT_0_9:
5912 		return 0x03FF;
5913 	case IEEE80211_HE_MCS_SUPPORT_0_11:
5914 		return 0xFFF;
5915 	default:
5916 		break;
5917 	}
5918 	return 0;
5919 }
5920 
5921 static void he_build_mcs_mask(u16 he_mcs_map,
5922 			      u16 he_mcs_mask[NL80211_HE_NSS_MAX])
5923 {
5924 	u8 nss;
5925 
5926 	for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
5927 		he_mcs_mask[nss] = he_mcs_map_to_mcs_mask(he_mcs_map & 0x03);
5928 		he_mcs_map >>= 2;
5929 	}
5930 }
5931 
5932 static u16 he_get_txmcsmap(struct genl_info *info, unsigned int link_id,
5933 			   const struct ieee80211_sta_he_cap *he_cap)
5934 {
5935 	struct net_device *dev = info->user_ptr[1];
5936 	struct wireless_dev *wdev = dev->ieee80211_ptr;
5937 	struct cfg80211_chan_def *chandef;
5938 	__le16 tx_mcs;
5939 
5940 	chandef = wdev_chandef(wdev, link_id);
5941 	if (!chandef) {
5942 		/*
5943 		 * This is probably broken, but we never maintained
5944 		 * a chandef in these cases, so it always was.
5945 		 */
5946 		return le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
5947 	}
5948 
5949 	switch (chandef->width) {
5950 	case NL80211_CHAN_WIDTH_80P80:
5951 		tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80;
5952 		break;
5953 	case NL80211_CHAN_WIDTH_160:
5954 		tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160;
5955 		break;
5956 	default:
5957 		tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80;
5958 		break;
5959 	}
5960 
5961 	return le16_to_cpu(tx_mcs);
5962 }
5963 
5964 static bool he_set_mcs_mask(struct genl_info *info,
5965 			    struct wireless_dev *wdev,
5966 			    struct ieee80211_supported_band *sband,
5967 			    struct nl80211_txrate_he *txrate,
5968 			    u16 mcs[NL80211_HE_NSS_MAX],
5969 			    unsigned int link_id)
5970 {
5971 	const struct ieee80211_sta_he_cap *he_cap;
5972 	u16 tx_mcs_mask[NL80211_HE_NSS_MAX] = {};
5973 	u16 tx_mcs_map = 0;
5974 	u8 i;
5975 
5976 	he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype);
5977 	if (!he_cap)
5978 		return false;
5979 
5980 	memset(mcs, 0, sizeof(u16) * NL80211_HE_NSS_MAX);
5981 
5982 	tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap);
5983 
5984 	/* Build he_mcs_mask from HE capabilities */
5985 	he_build_mcs_mask(tx_mcs_map, tx_mcs_mask);
5986 
5987 	for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
5988 		if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
5989 			mcs[i] = txrate->mcs[i];
5990 		else
5991 			return false;
5992 	}
5993 
5994 	return true;
5995 }
5996 
5997 static void eht_build_mcs_mask(struct genl_info *info,
5998 			       const struct ieee80211_sta_eht_cap *eht_cap,
5999 			       u8 mcs_nss_len, u16 *mcs_mask)
6000 {
6001 	struct net_device *dev = info->user_ptr[1];
6002 	struct wireless_dev *wdev = dev->ieee80211_ptr;
6003 	u8 nss, mcs_7 = 0, mcs_9 = 0, mcs_11 = 0, mcs_13 = 0;
6004 	unsigned int link_id = nl80211_link_id(info->attrs);
6005 
6006 	if (mcs_nss_len == 4) {
6007 		const struct ieee80211_eht_mcs_nss_supp_20mhz_only *mcs =
6008 					&eht_cap->eht_mcs_nss_supp.only_20mhz;
6009 
6010 		mcs_7 = u8_get_bits(mcs->rx_tx_mcs7_max_nss,
6011 				    IEEE80211_EHT_MCS_NSS_TX);
6012 		mcs_9 = u8_get_bits(mcs->rx_tx_mcs9_max_nss,
6013 				    IEEE80211_EHT_MCS_NSS_TX);
6014 		mcs_11 = u8_get_bits(mcs->rx_tx_mcs11_max_nss,
6015 				     IEEE80211_EHT_MCS_NSS_TX);
6016 		mcs_13 = u8_get_bits(mcs->rx_tx_mcs13_max_nss,
6017 				     IEEE80211_EHT_MCS_NSS_TX);
6018 
6019 	} else {
6020 		const struct ieee80211_eht_mcs_nss_supp_bw *mcs;
6021 		enum nl80211_chan_width width;
6022 
6023 		switch (wdev->iftype) {
6024 		case NL80211_IFTYPE_ADHOC:
6025 			width = wdev->u.ibss.chandef.width;
6026 			break;
6027 		case NL80211_IFTYPE_MESH_POINT:
6028 			width = wdev->u.mesh.chandef.width;
6029 			break;
6030 		case NL80211_IFTYPE_OCB:
6031 			width = wdev->u.ocb.chandef.width;
6032 			break;
6033 		default:
6034 			if (wdev->valid_links)
6035 				width = wdev->links[link_id].ap.chandef.width;
6036 			else
6037 				width = wdev->u.ap.preset_chandef.width;
6038 			break;
6039 		}
6040 
6041 		switch (width) {
6042 		case NL80211_CHAN_WIDTH_320:
6043 			mcs = &eht_cap->eht_mcs_nss_supp.bw._320;
6044 			break;
6045 		case NL80211_CHAN_WIDTH_160:
6046 			mcs = &eht_cap->eht_mcs_nss_supp.bw._160;
6047 			break;
6048 		default:
6049 			mcs = &eht_cap->eht_mcs_nss_supp.bw._80;
6050 			break;
6051 		}
6052 
6053 		mcs_7 = u8_get_bits(mcs->rx_tx_mcs9_max_nss,
6054 				    IEEE80211_EHT_MCS_NSS_TX);
6055 		mcs_9 = u8_get_bits(mcs->rx_tx_mcs9_max_nss,
6056 				    IEEE80211_EHT_MCS_NSS_TX);
6057 		mcs_11 = u8_get_bits(mcs->rx_tx_mcs11_max_nss,
6058 				     IEEE80211_EHT_MCS_NSS_TX);
6059 		mcs_13 = u8_get_bits(mcs->rx_tx_mcs13_max_nss,
6060 				     IEEE80211_EHT_MCS_NSS_TX);
6061 	}
6062 
6063 	/* Enable MCS 14 for NSS 0 */
6064 	if (eht_cap->eht_cap_elem.phy_cap_info[6] &
6065 	    IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP)
6066 		mcs_mask[0] |= 0x4000;
6067 
6068 	/* Enable MCS 15 for NSS 0 */
6069 	mcs_mask[0] |= 0x8000;
6070 
6071 	for (nss = 0; nss < NL80211_EHT_NSS_MAX; nss++) {
6072 		if (!mcs_7)
6073 			continue;
6074 		mcs_mask[nss] |= 0x00FF;
6075 		mcs_7--;
6076 
6077 		if (!mcs_9)
6078 			continue;
6079 		mcs_mask[nss] |= 0x0300;
6080 		mcs_9--;
6081 
6082 		if (!mcs_11)
6083 			continue;
6084 		mcs_mask[nss] |= 0x0C00;
6085 		mcs_11--;
6086 
6087 		if (!mcs_13)
6088 			continue;
6089 		mcs_mask[nss] |= 0x3000;
6090 		mcs_13--;
6091 	}
6092 }
6093 
6094 static bool eht_set_mcs_mask(struct genl_info *info, struct wireless_dev *wdev,
6095 			     struct ieee80211_supported_band *sband,
6096 			     struct nl80211_txrate_eht *txrate,
6097 			     u16 mcs[NL80211_EHT_NSS_MAX])
6098 {
6099 	const struct ieee80211_sta_he_cap *he_cap;
6100 	const struct ieee80211_sta_eht_cap *eht_cap;
6101 	u16 tx_mcs_mask[NL80211_EHT_NSS_MAX] = { 0 };
6102 	u8 i, mcs_nss_len;
6103 
6104 	he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype);
6105 	if (!he_cap)
6106 		return false;
6107 
6108 	eht_cap = ieee80211_get_eht_iftype_cap(sband, wdev->iftype);
6109 	if (!eht_cap)
6110 		return false;
6111 
6112 	/* Checks for MCS 14 */
6113 	if (txrate->mcs[0] & 0x4000) {
6114 		if (sband->band != NL80211_BAND_6GHZ)
6115 			return false;
6116 
6117 		if (!(eht_cap->eht_cap_elem.phy_cap_info[6] &
6118 		      IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP))
6119 			return false;
6120 	}
6121 
6122 	mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
6123 						 &eht_cap->eht_cap_elem,
6124 						 wdev->iftype ==
6125 							NL80211_IFTYPE_STATION);
6126 
6127 	if (mcs_nss_len == 3) {
6128 		/* Supported iftypes for setting non-20 MHZ only EHT MCS */
6129 		switch (wdev->iftype) {
6130 		case NL80211_IFTYPE_ADHOC:
6131 		case NL80211_IFTYPE_AP:
6132 		case NL80211_IFTYPE_P2P_GO:
6133 		case NL80211_IFTYPE_MESH_POINT:
6134 		case NL80211_IFTYPE_OCB:
6135 			break;
6136 		default:
6137 			return false;
6138 		}
6139 	}
6140 
6141 	/* Build eht_mcs_mask from EHT and HE capabilities */
6142 	eht_build_mcs_mask(info, eht_cap, mcs_nss_len, tx_mcs_mask);
6143 
6144 	memset(mcs, 0, sizeof(u16) * NL80211_EHT_NSS_MAX);
6145 	for (i = 0; i < NL80211_EHT_NSS_MAX; i++) {
6146 		if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
6147 			mcs[i] = txrate->mcs[i];
6148 		else
6149 			return false;
6150 	}
6151 
6152 	return true;
6153 }
6154 
6155 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
6156 					 struct nlattr *attrs[],
6157 					 enum nl80211_attrs attr,
6158 					 struct cfg80211_bitrate_mask *mask,
6159 					 struct net_device *dev,
6160 					 bool default_all_enabled,
6161 					 unsigned int link_id)
6162 {
6163 	struct nlattr *tb[NL80211_TXRATE_MAX + 1];
6164 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
6165 	struct wireless_dev *wdev = dev->ieee80211_ptr;
6166 	int rem, i;
6167 	struct nlattr *tx_rates;
6168 	struct ieee80211_supported_band *sband;
6169 	u16 vht_tx_mcs_map, he_tx_mcs_map;
6170 
6171 	memset(mask, 0, sizeof(*mask));
6172 	/* Default to all rates enabled */
6173 	for (i = 0; i < NUM_NL80211_BANDS; i++) {
6174 		const struct ieee80211_sta_he_cap *he_cap;
6175 		const struct ieee80211_sta_eht_cap *eht_cap;
6176 		u8 mcs_nss_len;
6177 
6178 		if (!default_all_enabled)
6179 			break;
6180 
6181 		sband = rdev->wiphy.bands[i];
6182 
6183 		if (!sband)
6184 			continue;
6185 
6186 		mask->control[i].legacy = (1 << sband->n_bitrates) - 1;
6187 		memcpy(mask->control[i].ht_mcs,
6188 		       sband->ht_cap.mcs.rx_mask,
6189 		       sizeof(mask->control[i].ht_mcs));
6190 
6191 		if (sband->vht_cap.vht_supported) {
6192 			vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
6193 			vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs);
6194 		}
6195 
6196 		he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype);
6197 		if (!he_cap)
6198 			continue;
6199 
6200 		he_tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap);
6201 		he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs);
6202 
6203 		mask->control[i].he_gi = 0xFF;
6204 		mask->control[i].he_ltf = 0xFF;
6205 
6206 		eht_cap = ieee80211_get_eht_iftype_cap(sband, wdev->iftype);
6207 		if (!eht_cap)
6208 			continue;
6209 
6210 		mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
6211 							 &eht_cap->eht_cap_elem,
6212 							 wdev->iftype ==
6213 							 NL80211_IFTYPE_STATION);
6214 
6215 		eht_build_mcs_mask(info, eht_cap, mcs_nss_len,
6216 				   mask->control[i].eht_mcs);
6217 
6218 		mask->control[i].eht_gi = 0xFF;
6219 		mask->control[i].eht_ltf = 0xFF;
6220 	}
6221 
6222 	/* if no rates are given set it back to the defaults */
6223 	if (!attrs[attr])
6224 		goto out;
6225 
6226 	/* The nested attribute uses enum nl80211_band as the index. This maps
6227 	 * directly to the enum nl80211_band values used in cfg80211.
6228 	 */
6229 	BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
6230 	nla_for_each_nested(tx_rates, attrs[attr], rem) {
6231 		int band = nla_type(tx_rates);
6232 		int err;
6233 
6234 		if (band < 0 || band >= NUM_NL80211_BANDS)
6235 			return -EINVAL;
6236 		sband = rdev->wiphy.bands[band];
6237 		if (sband == NULL)
6238 			return -EINVAL;
6239 		err = nla_parse_nested_deprecated(tb, NL80211_TXRATE_MAX,
6240 						  tx_rates,
6241 						  nl80211_txattr_policy,
6242 						  info->extack);
6243 		if (err)
6244 			return err;
6245 		if (tb[NL80211_TXRATE_LEGACY]) {
6246 			mask->control[band].legacy = rateset_to_mask(
6247 				sband,
6248 				nla_data(tb[NL80211_TXRATE_LEGACY]),
6249 				nla_len(tb[NL80211_TXRATE_LEGACY]));
6250 			if ((mask->control[band].legacy == 0) &&
6251 			    nla_len(tb[NL80211_TXRATE_LEGACY]))
6252 				return -EINVAL;
6253 		}
6254 		if (tb[NL80211_TXRATE_HT]) {
6255 			if (!ht_rateset_to_mask(
6256 					sband,
6257 					nla_data(tb[NL80211_TXRATE_HT]),
6258 					nla_len(tb[NL80211_TXRATE_HT]),
6259 					mask->control[band].ht_mcs))
6260 				return -EINVAL;
6261 		}
6262 
6263 		if (tb[NL80211_TXRATE_VHT]) {
6264 			if (!vht_set_mcs_mask(
6265 					sband,
6266 					nla_data(tb[NL80211_TXRATE_VHT]),
6267 					mask->control[band].vht_mcs))
6268 				return -EINVAL;
6269 		}
6270 
6271 		if (tb[NL80211_TXRATE_GI]) {
6272 			mask->control[band].gi =
6273 				nla_get_u8(tb[NL80211_TXRATE_GI]);
6274 			if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI)
6275 				return -EINVAL;
6276 		}
6277 		if (tb[NL80211_TXRATE_HE] &&
6278 		    !he_set_mcs_mask(info, wdev, sband,
6279 				     nla_data(tb[NL80211_TXRATE_HE]),
6280 				     mask->control[band].he_mcs,
6281 				     link_id))
6282 			return -EINVAL;
6283 
6284 		if (tb[NL80211_TXRATE_HE_GI])
6285 			mask->control[band].he_gi =
6286 				nla_get_u8(tb[NL80211_TXRATE_HE_GI]);
6287 		if (tb[NL80211_TXRATE_HE_LTF])
6288 			mask->control[band].he_ltf =
6289 				nla_get_u8(tb[NL80211_TXRATE_HE_LTF]);
6290 
6291 		if (tb[NL80211_TXRATE_EHT] &&
6292 		    !eht_set_mcs_mask(info, wdev, sband,
6293 				      nla_data(tb[NL80211_TXRATE_EHT]),
6294 				      mask->control[band].eht_mcs))
6295 			return -EINVAL;
6296 
6297 		if (tb[NL80211_TXRATE_EHT_GI])
6298 			mask->control[band].eht_gi =
6299 				nla_get_u8(tb[NL80211_TXRATE_EHT_GI]);
6300 		if (tb[NL80211_TXRATE_EHT_LTF])
6301 			mask->control[band].eht_ltf =
6302 				nla_get_u8(tb[NL80211_TXRATE_EHT_LTF]);
6303 
6304 		if (mask->control[band].legacy == 0) {
6305 			/* don't allow empty legacy rates if HT, VHT, HE or EHT
6306 			 * are not even supported.
6307 			 */
6308 			if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported ||
6309 			      rdev->wiphy.bands[band]->vht_cap.vht_supported ||
6310 			      ieee80211_get_he_iftype_cap(sband, wdev->iftype) ||
6311 			      ieee80211_get_eht_iftype_cap(sband, wdev->iftype)))
6312 				return -EINVAL;
6313 
6314 			for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
6315 				if (mask->control[band].ht_mcs[i])
6316 					goto out;
6317 
6318 			for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
6319 				if (mask->control[band].vht_mcs[i])
6320 					goto out;
6321 
6322 			for (i = 0; i < NL80211_HE_NSS_MAX; i++)
6323 				if (mask->control[band].he_mcs[i])
6324 					goto out;
6325 
6326 			for (i = 0; i < NL80211_EHT_NSS_MAX; i++)
6327 				if (mask->control[band].eht_mcs[i])
6328 					goto out;
6329 
6330 			/* legacy and mcs rates may not be both empty */
6331 			return -EINVAL;
6332 		}
6333 	}
6334 
6335 out:
6336 	return 0;
6337 }
6338 
6339 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev,
6340 				   enum nl80211_band band,
6341 				   struct cfg80211_bitrate_mask *beacon_rate)
6342 {
6343 	u32 count_ht, count_vht, count_he, count_eht, i;
6344 	u32 rate = beacon_rate->control[band].legacy;
6345 
6346 	/* Allow only one rate */
6347 	if (hweight32(rate) > 1)
6348 		return -EINVAL;
6349 
6350 	count_ht = 0;
6351 	for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
6352 		if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) {
6353 			return -EINVAL;
6354 		} else if (beacon_rate->control[band].ht_mcs[i]) {
6355 			count_ht++;
6356 			if (count_ht > 1)
6357 				return -EINVAL;
6358 		}
6359 		if (count_ht && rate)
6360 			return -EINVAL;
6361 	}
6362 
6363 	count_vht = 0;
6364 	for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
6365 		if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) {
6366 			return -EINVAL;
6367 		} else if (beacon_rate->control[band].vht_mcs[i]) {
6368 			count_vht++;
6369 			if (count_vht > 1)
6370 				return -EINVAL;
6371 		}
6372 		if (count_vht && rate)
6373 			return -EINVAL;
6374 	}
6375 
6376 	count_he = 0;
6377 	for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
6378 		if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) {
6379 			return -EINVAL;
6380 		} else if (beacon_rate->control[band].he_mcs[i]) {
6381 			count_he++;
6382 			if (count_he > 1)
6383 				return -EINVAL;
6384 		}
6385 		if (count_he && rate)
6386 			return -EINVAL;
6387 	}
6388 
6389 	count_eht = 0;
6390 	for (i = 0; i < NL80211_EHT_NSS_MAX; i++) {
6391 		if (hweight16(beacon_rate->control[band].eht_mcs[i]) > 1) {
6392 			return -EINVAL;
6393 		} else if (beacon_rate->control[band].eht_mcs[i]) {
6394 			count_eht++;
6395 			if (count_eht > 1)
6396 				return -EINVAL;
6397 		}
6398 		if (count_eht && rate)
6399 			return -EINVAL;
6400 	}
6401 
6402 	if ((count_ht && count_vht && count_he && count_eht) ||
6403 	    (!rate && !count_ht && !count_vht && !count_he && !count_eht))
6404 		return -EINVAL;
6405 
6406 	if (rate &&
6407 	    !wiphy_ext_feature_isset(&rdev->wiphy,
6408 				     NL80211_EXT_FEATURE_BEACON_RATE_LEGACY))
6409 		return -EINVAL;
6410 	if (count_ht &&
6411 	    !wiphy_ext_feature_isset(&rdev->wiphy,
6412 				     NL80211_EXT_FEATURE_BEACON_RATE_HT))
6413 		return -EINVAL;
6414 	if (count_vht &&
6415 	    !wiphy_ext_feature_isset(&rdev->wiphy,
6416 				     NL80211_EXT_FEATURE_BEACON_RATE_VHT))
6417 		return -EINVAL;
6418 	if (count_he &&
6419 	    !wiphy_ext_feature_isset(&rdev->wiphy,
6420 				     NL80211_EXT_FEATURE_BEACON_RATE_HE))
6421 		return -EINVAL;
6422 
6423 	if (count_eht &&
6424 	    !wiphy_ext_feature_isset(&rdev->wiphy,
6425 				     NL80211_EXT_FEATURE_BEACON_RATE_EHT))
6426 		return -EINVAL;
6427 
6428 	return 0;
6429 }
6430 
6431 static int nl80211_parse_mbssid_config(struct wiphy *wiphy,
6432 				       struct net_device *dev,
6433 				       unsigned int link_id,
6434 				       struct nlattr *attrs,
6435 				       struct cfg80211_mbssid_config *config,
6436 				       u8 num_elems)
6437 {
6438 	struct nlattr *tb[NL80211_MBSSID_CONFIG_ATTR_MAX + 1];
6439 	int tx_link_id = -1;
6440 
6441 	if (!wiphy->mbssid_max_interfaces)
6442 		return -EOPNOTSUPP;
6443 
6444 	if (nla_parse_nested(tb, NL80211_MBSSID_CONFIG_ATTR_MAX, attrs, NULL,
6445 			     NULL) ||
6446 	    !tb[NL80211_MBSSID_CONFIG_ATTR_INDEX])
6447 		return -EINVAL;
6448 
6449 	config->ema = nla_get_flag(tb[NL80211_MBSSID_CONFIG_ATTR_EMA]);
6450 	if (config->ema) {
6451 		if (!wiphy->ema_max_profile_periodicity)
6452 			return -EOPNOTSUPP;
6453 
6454 		if (num_elems > wiphy->ema_max_profile_periodicity)
6455 			return -EINVAL;
6456 	}
6457 
6458 	config->index = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]);
6459 	if (config->index >= wiphy->mbssid_max_interfaces ||
6460 	    (!config->index && !num_elems))
6461 		return -EINVAL;
6462 
6463 	if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID])
6464 		tx_link_id = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]);
6465 
6466 	if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]) {
6467 		u32 tx_ifindex =
6468 			nla_get_u32(tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]);
6469 
6470 		if ((!config->index && tx_ifindex != dev->ifindex) ||
6471 		    (config->index && tx_ifindex == dev->ifindex))
6472 			return -EINVAL;
6473 
6474 		if (tx_ifindex != dev->ifindex) {
6475 			struct net_device *tx_netdev =
6476 				dev_get_by_index(wiphy_net(wiphy), tx_ifindex);
6477 
6478 			if (!tx_netdev || !tx_netdev->ieee80211_ptr ||
6479 			    tx_netdev->ieee80211_ptr->wiphy != wiphy ||
6480 			    tx_netdev->ieee80211_ptr->iftype !=
6481 							NL80211_IFTYPE_AP) {
6482 				dev_put(tx_netdev);
6483 				return -EINVAL;
6484 			}
6485 
6486 			config->tx_wdev = tx_netdev->ieee80211_ptr;
6487 			/* Caller should call dev_put(config->tx_wdev) from this point */
6488 
6489 			if (config->tx_wdev->valid_links) {
6490 				if (tx_link_id == -1 ||
6491 				    !(config->tx_wdev->valid_links & BIT(tx_link_id)))
6492 					return -ENOLINK;
6493 
6494 				config->tx_link_id = tx_link_id;
6495 			}
6496 		} else {
6497 			if (tx_link_id >= 0 && tx_link_id != link_id)
6498 				return -EINVAL;
6499 
6500 			config->tx_wdev = dev->ieee80211_ptr;
6501 		}
6502 	} else if (!config->index) {
6503 		if (tx_link_id >= 0 && tx_link_id != link_id)
6504 			return -EINVAL;
6505 
6506 		config->tx_wdev = dev->ieee80211_ptr;
6507 	} else {
6508 		return -EINVAL;
6509 	}
6510 
6511 	return 0;
6512 }
6513 
6514 static struct cfg80211_mbssid_elems *
6515 nl80211_parse_mbssid_elems(struct wiphy *wiphy, struct nlattr *attrs,
6516 			   struct netlink_ext_ack *extack)
6517 {
6518 	struct nlattr *nl_elems;
6519 	struct cfg80211_mbssid_elems *elems;
6520 	int rem_elems;
6521 	u8 i = 0, num_elems = 0;
6522 
6523 	if (!wiphy->mbssid_max_interfaces)
6524 		return ERR_PTR(-EINVAL);
6525 
6526 	nla_for_each_nested(nl_elems, attrs, rem_elems) {
6527 		int ret;
6528 
6529 		ret = validate_ie_attr(nl_elems, extack);
6530 		if (ret)
6531 			return ERR_PTR(ret);
6532 
6533 		if (num_elems >= 255)
6534 			return ERR_PTR(-EINVAL);
6535 		num_elems++;
6536 	}
6537 
6538 	elems = kzalloc_flex(*elems, elem, num_elems);
6539 	if (!elems)
6540 		return ERR_PTR(-ENOMEM);
6541 	elems->cnt = num_elems;
6542 
6543 	nla_for_each_nested(nl_elems, attrs, rem_elems) {
6544 		elems->elem[i].data = nla_data(nl_elems);
6545 		elems->elem[i].len = nla_len(nl_elems);
6546 		i++;
6547 	}
6548 	return elems;
6549 }
6550 
6551 static struct cfg80211_rnr_elems *
6552 nl80211_parse_rnr_elems(struct wiphy *wiphy, struct nlattr *attrs,
6553 			struct netlink_ext_ack *extack)
6554 {
6555 	struct nlattr *nl_elems;
6556 	struct cfg80211_rnr_elems *elems;
6557 	int rem_elems;
6558 	u8 i = 0, num_elems = 0;
6559 
6560 	nla_for_each_nested(nl_elems, attrs, rem_elems) {
6561 		int ret;
6562 
6563 		ret = validate_ie_attr(nl_elems, extack);
6564 		if (ret)
6565 			return ERR_PTR(ret);
6566 
6567 		if (num_elems >= 255)
6568 			return ERR_PTR(-EINVAL);
6569 
6570 		num_elems++;
6571 	}
6572 
6573 	elems = kzalloc_flex(*elems, elem, num_elems);
6574 	if (!elems)
6575 		return ERR_PTR(-ENOMEM);
6576 	elems->cnt = num_elems;
6577 
6578 	nla_for_each_nested(nl_elems, attrs, rem_elems) {
6579 		elems->elem[i].data = nla_data(nl_elems);
6580 		elems->elem[i].len = nla_len(nl_elems);
6581 		i++;
6582 	}
6583 	return elems;
6584 }
6585 
6586 static int nl80211_parse_he_bss_color(struct nlattr *attrs,
6587 				      struct cfg80211_he_bss_color *he_bss_color)
6588 {
6589 	struct nlattr *tb[NL80211_HE_BSS_COLOR_ATTR_MAX + 1];
6590 	int err;
6591 
6592 	err = nla_parse_nested(tb, NL80211_HE_BSS_COLOR_ATTR_MAX, attrs,
6593 			       he_bss_color_policy, NULL);
6594 	if (err)
6595 		return err;
6596 
6597 	if (!tb[NL80211_HE_BSS_COLOR_ATTR_COLOR])
6598 		return -EINVAL;
6599 
6600 	he_bss_color->color =
6601 		nla_get_u8(tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]);
6602 	he_bss_color->enabled =
6603 		!nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_DISABLED]);
6604 	he_bss_color->partial =
6605 		nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_PARTIAL]);
6606 
6607 	return 0;
6608 }
6609 
6610 static void nl80211_check_ap_rate_selectors(struct cfg80211_beacon_data *bcn,
6611 					    const struct element *rates)
6612 {
6613 	int i;
6614 
6615 	if (!rates)
6616 		return;
6617 
6618 	for (i = 0; i < rates->datalen; i++) {
6619 		if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
6620 			bcn->ht_required = true;
6621 		if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY)
6622 			bcn->vht_required = true;
6623 	}
6624 }
6625 
6626 /*
6627  * Since the nl80211 API didn't include, from the beginning, attributes about
6628  * HT/VHT/... operation, we parse them out of the elements and check for
6629  * validity for use by drivers/mac80211.
6630  */
6631 static int nl80211_calculate_ap_operation(struct nlattr *attrs[],
6632 					  struct cfg80211_beacon_data *bcn,
6633 					  struct netlink_ext_ack *extack)
6634 {
6635 	size_t ies_len = bcn->tail_len;
6636 	const u8 *ies = bcn->tail;
6637 	const struct element *rates;
6638 	const struct element *op;
6639 
6640 	rates = cfg80211_find_elem(WLAN_EID_SUPP_RATES, ies, ies_len);
6641 	nl80211_check_ap_rate_selectors(bcn, rates);
6642 
6643 	rates = cfg80211_find_elem(WLAN_EID_EXT_SUPP_RATES, ies, ies_len);
6644 	nl80211_check_ap_rate_selectors(bcn, rates);
6645 
6646 	op = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ies, ies_len);
6647 	if (op) {
6648 		if (op->datalen < sizeof(*bcn->he_oper) + 1) {
6649 			NL_SET_ERR_MSG(extack, "bad HE operation in beacon");
6650 			return -EINVAL;
6651 		}
6652 		bcn->he_oper = (void *)(op->data + 1);
6653 		/* takes extension ID into account */
6654 		if (op->datalen < ieee80211_he_oper_size((void *)bcn->he_oper)) {
6655 			NL_SET_ERR_MSG(extack, "bad HE operation in beacon");
6656 			return -EINVAL;
6657 		}
6658 	}
6659 
6660 	op = cfg80211_find_elem(WLAN_EID_HT_OPERATION, ies, ies_len);
6661 	if (op) {
6662 		if (op->datalen < sizeof(*bcn->ht_oper)) {
6663 			NL_SET_ERR_MSG(extack, "bad HT operation in beacon");
6664 			return -EINVAL;
6665 		}
6666 		bcn->ht_oper = (void *)op->data;
6667 	}
6668 
6669 	op = cfg80211_find_elem(WLAN_EID_VHT_OPERATION, ies, ies_len);
6670 	if (op) {
6671 		if (op->datalen < sizeof(*bcn->vht_oper)) {
6672 			NL_SET_ERR_MSG(extack, "bad VHT operation in beacon");
6673 			return -EINVAL;
6674 		}
6675 		bcn->vht_oper = (void *)op->data;
6676 	}
6677 
6678 	op = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_OPERATION, ies, ies_len);
6679 	if (op) {
6680 		if (!ieee80211_eht_oper_size_ok(op->data + 1,
6681 						op->datalen - 1)) {
6682 			NL_SET_ERR_MSG(extack, "bad EHT operation in beacon");
6683 			return -EINVAL;
6684 		}
6685 		bcn->eht_oper = (void *)(op->data + 1);
6686 	}
6687 
6688 	op = cfg80211_find_ext_elem(WLAN_EID_EXT_UHR_OPER, ies, ies_len);
6689 	if (op) {
6690 		/* need full UHR operation separately */
6691 		if (!attrs[NL80211_ATTR_UHR_OPERATION]) {
6692 			NL_SET_ERR_MSG(extack, "missing UHR operation");
6693 			return -EINVAL;
6694 		}
6695 		bcn->uhr_oper = nla_data(attrs[NL80211_ATTR_UHR_OPERATION]);
6696 	} else if (attrs[NL80211_ATTR_UHR_OPERATION]) {
6697 		NL_SET_ERR_MSG(extack, "unexpected UHR operation");
6698 		return -EINVAL;
6699 	}
6700 
6701 	return 0;
6702 }
6703 
6704 static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev,
6705 				struct nlattr *attrs[],
6706 				struct cfg80211_beacon_data *bcn,
6707 				struct ieee80211_channel *chan,
6708 				struct netlink_ext_ack *extack)
6709 {
6710 	bool haveinfo = false;
6711 	int err;
6712 
6713 	memset(bcn, 0, sizeof(*bcn));
6714 
6715 	bcn->link_id = nl80211_link_id(attrs);
6716 
6717 	if (attrs[NL80211_ATTR_BEACON_HEAD]) {
6718 		bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]);
6719 		bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]);
6720 		if (!bcn->head_len)
6721 			return -EINVAL;
6722 		haveinfo = true;
6723 	}
6724 
6725 	if (attrs[NL80211_ATTR_BEACON_TAIL]) {
6726 		bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]);
6727 		bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]);
6728 		haveinfo = true;
6729 	}
6730 
6731 	if (!haveinfo)
6732 		return -EINVAL;
6733 
6734 	if (attrs[NL80211_ATTR_IE]) {
6735 		bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]);
6736 		bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]);
6737 	}
6738 
6739 	if (attrs[NL80211_ATTR_IE_PROBE_RESP]) {
6740 		bcn->proberesp_ies =
6741 			nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]);
6742 		bcn->proberesp_ies_len =
6743 			nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]);
6744 	}
6745 
6746 	if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) {
6747 		bcn->assocresp_ies =
6748 			nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
6749 		bcn->assocresp_ies_len =
6750 			nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
6751 	}
6752 
6753 	if (attrs[NL80211_ATTR_PROBE_RESP]) {
6754 		bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]);
6755 		bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]);
6756 	}
6757 
6758 	if (attrs[NL80211_ATTR_FTM_RESPONDER]) {
6759 		struct nlattr *tb[NL80211_FTM_RESP_ATTR_MAX + 1];
6760 
6761 		err = nla_parse_nested_deprecated(tb,
6762 						  NL80211_FTM_RESP_ATTR_MAX,
6763 						  attrs[NL80211_ATTR_FTM_RESPONDER],
6764 						  NULL, NULL);
6765 		if (err)
6766 			return err;
6767 
6768 		if (tb[NL80211_FTM_RESP_ATTR_ENABLED] &&
6769 		    wiphy_ext_feature_isset(&rdev->wiphy,
6770 					    NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER))
6771 			bcn->ftm_responder = 1;
6772 		else
6773 			return -EOPNOTSUPP;
6774 
6775 		if (tb[NL80211_FTM_RESP_ATTR_LCI]) {
6776 			bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]);
6777 			bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]);
6778 		}
6779 
6780 		if (tb[NL80211_FTM_RESP_ATTR_CIVICLOC]) {
6781 			bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]);
6782 			bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]);
6783 		}
6784 	} else {
6785 		bcn->ftm_responder = -1;
6786 	}
6787 
6788 	if (attrs[NL80211_ATTR_HE_BSS_COLOR]) {
6789 		err = nl80211_parse_he_bss_color(attrs[NL80211_ATTR_HE_BSS_COLOR],
6790 						 &bcn->he_bss_color);
6791 		if (err)
6792 			return err;
6793 		bcn->he_bss_color_valid = true;
6794 	}
6795 
6796 	if (attrs[NL80211_ATTR_MBSSID_ELEMS]) {
6797 		struct cfg80211_mbssid_elems *mbssid =
6798 			nl80211_parse_mbssid_elems(&rdev->wiphy,
6799 						   attrs[NL80211_ATTR_MBSSID_ELEMS],
6800 						   extack);
6801 
6802 		if (IS_ERR(mbssid))
6803 			return PTR_ERR(mbssid);
6804 
6805 		bcn->mbssid_ies = mbssid;
6806 
6807 		if (bcn->mbssid_ies && attrs[NL80211_ATTR_EMA_RNR_ELEMS]) {
6808 			struct cfg80211_rnr_elems *rnr =
6809 				nl80211_parse_rnr_elems(&rdev->wiphy,
6810 							attrs[NL80211_ATTR_EMA_RNR_ELEMS],
6811 							extack);
6812 
6813 			if (IS_ERR(rnr))
6814 				return PTR_ERR(rnr);
6815 
6816 			if (rnr && rnr->cnt < bcn->mbssid_ies->cnt) {
6817 				kfree(rnr);
6818 				return -EINVAL;
6819 			}
6820 
6821 			bcn->rnr_ies = rnr;
6822 		}
6823 	}
6824 
6825 	err = nl80211_calculate_ap_operation(attrs, bcn, extack);
6826 	if (err)
6827 		return err;
6828 
6829 	if (bcn->he_oper && (chan->flags & IEEE80211_CHAN_NO_HE))
6830 		return -EOPNOTSUPP;
6831 
6832 	if (bcn->eht_oper && (chan->flags & IEEE80211_CHAN_NO_EHT))
6833 		return -EOPNOTSUPP;
6834 
6835 	if (bcn->uhr_oper && (chan->flags & IEEE80211_CHAN_NO_UHR))
6836 		return -EOPNOTSUPP;
6837 
6838 	return 0;
6839 }
6840 
6841 static int nl80211_parse_he_obss_pd(struct nlattr *attrs,
6842 				    struct ieee80211_he_obss_pd *he_obss_pd)
6843 {
6844 	struct nlattr *tb[NL80211_HE_OBSS_PD_ATTR_MAX + 1];
6845 	int err;
6846 
6847 	err = nla_parse_nested(tb, NL80211_HE_OBSS_PD_ATTR_MAX, attrs,
6848 			       he_obss_pd_policy, NULL);
6849 	if (err)
6850 		return err;
6851 
6852 	if (!tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL])
6853 		return -EINVAL;
6854 
6855 	he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]);
6856 
6857 	if (tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET])
6858 		he_obss_pd->min_offset =
6859 			nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]);
6860 	if (tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET])
6861 		he_obss_pd->max_offset =
6862 			nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]);
6863 	if (tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET])
6864 		he_obss_pd->non_srg_max_offset =
6865 			nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]);
6866 
6867 	if (he_obss_pd->min_offset > he_obss_pd->max_offset)
6868 		return -EINVAL;
6869 
6870 	if (tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP])
6871 		memcpy(he_obss_pd->bss_color_bitmap,
6872 		       nla_data(tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]),
6873 		       sizeof(he_obss_pd->bss_color_bitmap));
6874 
6875 	if (tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP])
6876 		memcpy(he_obss_pd->partial_bssid_bitmap,
6877 		       nla_data(tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]),
6878 		       sizeof(he_obss_pd->partial_bssid_bitmap));
6879 
6880 	he_obss_pd->enable = true;
6881 
6882 	return 0;
6883 }
6884 
6885 static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev,
6886 					struct nlattr *attrs,
6887 					struct cfg80211_fils_discovery *fd)
6888 {
6889 	struct nlattr *tb[NL80211_FILS_DISCOVERY_ATTR_MAX + 1];
6890 	int ret;
6891 
6892 	if (!wiphy_ext_feature_isset(&rdev->wiphy,
6893 				     NL80211_EXT_FEATURE_FILS_DISCOVERY))
6894 		return -EINVAL;
6895 
6896 	ret = nla_parse_nested(tb, NL80211_FILS_DISCOVERY_ATTR_MAX, attrs,
6897 			       NULL, NULL);
6898 	if (ret)
6899 		return ret;
6900 
6901 	if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] &&
6902 	    !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] &&
6903 	    !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]) {
6904 		fd->update = true;
6905 		return 0;
6906 	}
6907 
6908 	if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] ||
6909 	    !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] ||
6910 	    !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL])
6911 		return -EINVAL;
6912 
6913 	fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]);
6914 	fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]);
6915 	fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]);
6916 	fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]);
6917 	fd->update = true;
6918 	return 0;
6919 }
6920 
6921 static int
6922 nl80211_parse_unsol_bcast_probe_resp(struct cfg80211_registered_device *rdev,
6923 				     struct nlattr *attrs,
6924 				     struct cfg80211_unsol_bcast_probe_resp *presp)
6925 {
6926 	struct nlattr *tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1];
6927 	int ret;
6928 
6929 	if (!wiphy_ext_feature_isset(&rdev->wiphy,
6930 				     NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP))
6931 		return -EINVAL;
6932 
6933 	ret = nla_parse_nested(tb, NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX,
6934 			       attrs, NULL, NULL);
6935 	if (ret)
6936 		return ret;
6937 
6938 	if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] &&
6939 	    !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]) {
6940 		presp->update = true;
6941 		return 0;
6942 	}
6943 
6944 	if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] ||
6945 	    !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL])
6946 		return -EINVAL;
6947 
6948 	presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]);
6949 	presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]);
6950 	presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]);
6951 	presp->update = true;
6952 	return 0;
6953 }
6954 
6955 /*
6956  * Since the nl80211 API didn't include, from the beginning, attributes about
6957  * HT/VHT/... capabilities, we parse them out of the elements and check for
6958  * validity for use by drivers/mac80211.
6959  */
6960 static int nl80211_calculate_ap_capabilities(struct genl_info *info,
6961 					     struct cfg80211_ap_settings *params)
6962 {
6963 	size_t ies_len = params->beacon.tail_len;
6964 	const u8 *ies = params->beacon.tail;
6965 	const struct element *cap;
6966 
6967 	cap = cfg80211_find_elem(WLAN_EID_HT_CAPABILITY, ies, ies_len);
6968 	if (cap) {
6969 		if (cap->datalen < sizeof(*params->ht_cap)) {
6970 			GENL_SET_ERR_MSG(info, "bad HT capability in beacon");
6971 			return -EINVAL;
6972 		}
6973 		params->ht_cap = (void *)cap->data;
6974 	}
6975 
6976 	cap = cfg80211_find_elem(WLAN_EID_VHT_CAPABILITY, ies, ies_len);
6977 	if (cap) {
6978 		if (cap->datalen < sizeof(*params->vht_cap)) {
6979 			GENL_SET_ERR_MSG(info, "bad VHT capability in beacon");
6980 			return -EINVAL;
6981 		}
6982 		params->vht_cap = (void *)cap->data;
6983 	}
6984 
6985 	cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_CAPABILITY, ies, ies_len);
6986 	if (cap) {
6987 		if (cap->datalen < sizeof(*params->he_cap) + 1) {
6988 			GENL_SET_ERR_MSG(info, "bad HE capability in beacon");
6989 			return -EINVAL;
6990 		}
6991 		params->he_cap = (void *)(cap->data + 1);
6992 	}
6993 
6994 	cap = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_CAPABILITY, ies, ies_len);
6995 	if (cap) {
6996 		params->eht_cap = (void *)(cap->data + 1);
6997 		if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_cap,
6998 						(const u8 *)params->eht_cap,
6999 						cap->datalen - 1, true)) {
7000 			GENL_SET_ERR_MSG(info, "bad EHT capability in beacon");
7001 			return -EINVAL;
7002 		}
7003 	}
7004 
7005 	if (!!params->he_cap != !!params->beacon.he_oper)
7006 		return -EINVAL;
7007 
7008 	if (!!params->eht_cap != !!params->beacon.eht_oper)
7009 		return -EINVAL;
7010 
7011 	return 0;
7012 }
7013 
7014 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
7015 				   struct cfg80211_ap_settings *params)
7016 {
7017 	struct wireless_dev *wdev;
7018 
7019 	list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
7020 		if (wdev->iftype != NL80211_IFTYPE_AP &&
7021 		    wdev->iftype != NL80211_IFTYPE_P2P_GO)
7022 			continue;
7023 
7024 		if (!wdev->u.ap.preset_chandef.chan)
7025 			continue;
7026 
7027 		params->chandef = wdev->u.ap.preset_chandef;
7028 		return true;
7029 	}
7030 
7031 	return false;
7032 }
7033 
7034 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
7035 				    enum nl80211_auth_type auth_type,
7036 				    enum nl80211_commands cmd)
7037 {
7038 	if (auth_type > NL80211_AUTHTYPE_MAX)
7039 		return false;
7040 
7041 	switch (cmd) {
7042 	case NL80211_CMD_AUTHENTICATE:
7043 		if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
7044 		    auth_type == NL80211_AUTHTYPE_SAE)
7045 			return false;
7046 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
7047 					     NL80211_EXT_FEATURE_FILS_STA) &&
7048 		    (auth_type == NL80211_AUTHTYPE_FILS_SK ||
7049 		     auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
7050 		     auth_type == NL80211_AUTHTYPE_FILS_PK))
7051 			return false;
7052 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
7053 					     NL80211_EXT_FEATURE_EPPKE) &&
7054 		    auth_type == NL80211_AUTHTYPE_EPPKE)
7055 			return false;
7056 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
7057 					     NL80211_EXT_FEATURE_IEEE8021X_AUTH) &&
7058 		    auth_type == NL80211_AUTHTYPE_IEEE8021X)
7059 			return false;
7060 		return true;
7061 	case NL80211_CMD_CONNECT:
7062 		if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
7063 		    !wiphy_ext_feature_isset(&rdev->wiphy,
7064 					     NL80211_EXT_FEATURE_SAE_OFFLOAD) &&
7065 		    auth_type == NL80211_AUTHTYPE_SAE)
7066 			return false;
7067 
7068 		/* FILS with SK PFS or PK not supported yet */
7069 		if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
7070 		    auth_type == NL80211_AUTHTYPE_FILS_PK)
7071 			return false;
7072 		if (!wiphy_ext_feature_isset(
7073 			    &rdev->wiphy,
7074 			    NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
7075 		    auth_type == NL80211_AUTHTYPE_FILS_SK)
7076 			return false;
7077 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
7078 					     NL80211_EXT_FEATURE_EPPKE) &&
7079 		    auth_type == NL80211_AUTHTYPE_EPPKE)
7080 			return false;
7081 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
7082 					     NL80211_EXT_FEATURE_IEEE8021X_AUTH) &&
7083 		    auth_type == NL80211_AUTHTYPE_IEEE8021X)
7084 			return false;
7085 		return true;
7086 	case NL80211_CMD_START_AP:
7087 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
7088 					     NL80211_EXT_FEATURE_SAE_OFFLOAD_AP) &&
7089 		    auth_type == NL80211_AUTHTYPE_SAE)
7090 			return false;
7091 		/* FILS not supported yet */
7092 		if (auth_type == NL80211_AUTHTYPE_FILS_SK ||
7093 		    auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
7094 		    auth_type == NL80211_AUTHTYPE_FILS_PK)
7095 			return false;
7096 		return true;
7097 	default:
7098 		return false;
7099 	}
7100 }
7101 
7102 static void nl80211_send_ap_started(struct wireless_dev *wdev,
7103 				    unsigned int link_id)
7104 {
7105 	struct wiphy *wiphy = wdev->wiphy;
7106 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
7107 	struct sk_buff *msg;
7108 	void *hdr;
7109 
7110 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7111 	if (!msg)
7112 		return;
7113 
7114 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_START_AP);
7115 	if (!hdr)
7116 		goto out;
7117 
7118 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
7119 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) ||
7120 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
7121 			      NL80211_ATTR_PAD) ||
7122 	    (wdev->u.ap.ssid_len &&
7123 	     nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len,
7124 		     wdev->u.ap.ssid)) ||
7125 	    (wdev->valid_links &&
7126 	     nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)))
7127 		goto out;
7128 
7129 	genlmsg_end(msg, hdr);
7130 
7131 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
7132 				NL80211_MCGRP_MLME, GFP_KERNEL);
7133 	return;
7134 out:
7135 	nlmsg_free(msg);
7136 }
7137 
7138 static int
7139 nl80211_parse_s1g_short_beacon(struct cfg80211_registered_device *rdev,
7140 			       struct nlattr *attrs,
7141 			       struct cfg80211_s1g_short_beacon *sb)
7142 {
7143 	struct nlattr *tb[NL80211_S1G_SHORT_BEACON_ATTR_MAX + 1];
7144 	int ret;
7145 
7146 	if (!rdev->wiphy.bands[NL80211_BAND_S1GHZ])
7147 		return -EINVAL;
7148 
7149 	ret = nla_parse_nested(tb, NL80211_S1G_SHORT_BEACON_ATTR_MAX, attrs,
7150 			       NULL, NULL);
7151 	if (ret)
7152 		return ret;
7153 
7154 	/* Short beacon tail is optional (i.e might only include the TIM) */
7155 	if (!tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD])
7156 		return -EINVAL;
7157 
7158 	sb->short_head = nla_data(tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]);
7159 	sb->short_head_len = nla_len(tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]);
7160 	sb->short_tail_len = 0;
7161 
7162 	if (tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]) {
7163 		sb->short_tail =
7164 			nla_data(tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]);
7165 		sb->short_tail_len =
7166 			nla_len(tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]);
7167 	}
7168 
7169 	sb->update = true;
7170 	return 0;
7171 }
7172 
7173 static int nl80211_check_npca(struct cfg80211_registered_device *rdev,
7174 			      const struct cfg80211_chan_def *chandef,
7175 			      enum nl80211_iftype iftype,
7176 			      struct netlink_ext_ack *extack)
7177 {
7178 	const struct ieee80211_supported_band *sband;
7179 	const struct ieee80211_sta_uhr_cap *uhr_cap;
7180 
7181 	if (!chandef->npca_chan)
7182 		return 0;
7183 
7184 	sband = rdev->wiphy.bands[chandef->chan->band];
7185 	uhr_cap = ieee80211_get_uhr_iftype_cap(sband, iftype);
7186 
7187 	if (uhr_cap &&
7188 	    (uhr_cap->mac.mac_cap[0] & IEEE80211_UHR_MAC_CAP0_NPCA_SUPP))
7189 		return 0;
7190 
7191 	NL_SET_ERR_MSG(extack, "NPCA not supported");
7192 	return -EINVAL;
7193 }
7194 
7195 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
7196 {
7197 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
7198 	struct cfg80211_beaconing_check_config beacon_check = {};
7199 	unsigned int link_id = nl80211_link_id(info->attrs);
7200 	struct net_device *dev = info->user_ptr[1];
7201 	struct wireless_dev *wdev = dev->ieee80211_ptr;
7202 	struct cfg80211_ap_settings *params;
7203 	int err;
7204 
7205 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
7206 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
7207 		return -EOPNOTSUPP;
7208 
7209 	if (!rdev->ops->start_ap)
7210 		return -EOPNOTSUPP;
7211 
7212 	if (wdev->links[link_id].cac_started)
7213 		return -EBUSY;
7214 
7215 	if (wdev->links[link_id].ap.beacon_interval)
7216 		return -EALREADY;
7217 
7218 	/* these are required for START_AP */
7219 	if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
7220 	    !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
7221 	    !info->attrs[NL80211_ATTR_BEACON_HEAD])
7222 		return -EINVAL;
7223 
7224 	if (info->attrs[NL80211_ATTR_SMPS_MODE] &&
7225 	    nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]) != NL80211_SMPS_OFF)
7226 		return -EOPNOTSUPP;
7227 
7228 	params = kzalloc_obj(*params);
7229 	if (!params)
7230 		return -ENOMEM;
7231 
7232 	params->beacon_interval =
7233 		nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
7234 	params->dtim_period =
7235 		nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
7236 
7237 	err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype,
7238 					   params->beacon_interval);
7239 	if (err)
7240 		goto out;
7241 
7242 	/*
7243 	 * In theory, some of these attributes should be required here
7244 	 * but since they were not used when the command was originally
7245 	 * added, keep them optional for old user space programs to let
7246 	 * them continue to work with drivers that do not need the
7247 	 * additional information -- drivers must check!
7248 	 */
7249 	if (info->attrs[NL80211_ATTR_SSID]) {
7250 		params->ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
7251 		params->ssid_len =
7252 			nla_len(info->attrs[NL80211_ATTR_SSID]);
7253 		if (params->ssid_len == 0) {
7254 			err = -EINVAL;
7255 			goto out;
7256 		}
7257 
7258 		if (wdev->u.ap.ssid_len &&
7259 		    (wdev->u.ap.ssid_len != params->ssid_len ||
7260 		     memcmp(wdev->u.ap.ssid, params->ssid, params->ssid_len))) {
7261 			/* require identical SSID for MLO */
7262 			err = -EINVAL;
7263 			goto out;
7264 		}
7265 	} else if (wdev->valid_links) {
7266 		/* require SSID for MLO */
7267 		err = -EINVAL;
7268 		goto out;
7269 	}
7270 
7271 	if (info->attrs[NL80211_ATTR_HIDDEN_SSID])
7272 		params->hidden_ssid = nla_get_u32(
7273 			info->attrs[NL80211_ATTR_HIDDEN_SSID]);
7274 
7275 	params->privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
7276 
7277 	if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
7278 		params->auth_type = nla_get_u32(
7279 			info->attrs[NL80211_ATTR_AUTH_TYPE]);
7280 		if (!nl80211_valid_auth_type(rdev, params->auth_type,
7281 					     NL80211_CMD_START_AP)) {
7282 			err = -EINVAL;
7283 			goto out;
7284 		}
7285 	} else
7286 		params->auth_type = NL80211_AUTHTYPE_AUTOMATIC;
7287 
7288 	err = nl80211_crypto_settings(rdev, info, &params->crypto,
7289 				      NL80211_MAX_NR_CIPHER_SUITES);
7290 	if (err)
7291 		goto out;
7292 
7293 	if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) {
7294 		if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) {
7295 			err = -EOPNOTSUPP;
7296 			goto out;
7297 		}
7298 		params->inactivity_timeout = nla_get_u16(
7299 			info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]);
7300 	}
7301 
7302 	if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
7303 		if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
7304 			err = -EINVAL;
7305 			goto out;
7306 		}
7307 		params->p2p_ctwindow =
7308 			nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
7309 		if (params->p2p_ctwindow != 0 &&
7310 		    !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) {
7311 			err = -EINVAL;
7312 			goto out;
7313 		}
7314 	}
7315 
7316 	if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
7317 		u8 tmp;
7318 
7319 		if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
7320 			err = -EINVAL;
7321 			goto out;
7322 		}
7323 		tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
7324 		params->p2p_opp_ps = tmp;
7325 		if (params->p2p_opp_ps != 0 &&
7326 		    !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) {
7327 			err = -EINVAL;
7328 			goto out;
7329 		}
7330 	}
7331 
7332 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
7333 		err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
7334 					    &params->chandef, true);
7335 		if (err)
7336 			goto out;
7337 	} else if (wdev->valid_links) {
7338 		/* with MLD need to specify the channel configuration */
7339 		err = -EINVAL;
7340 		goto out;
7341 	} else if (wdev->u.ap.preset_chandef.chan) {
7342 		params->chandef = wdev->u.ap.preset_chandef;
7343 	} else if (!nl80211_get_ap_channel(rdev, params)) {
7344 		err = -EINVAL;
7345 		goto out;
7346 	}
7347 
7348 	err = nl80211_parse_beacon(rdev, info->attrs, &params->beacon,
7349 				   params->chandef.chan, info->extack);
7350 	if (err)
7351 		goto out;
7352 
7353 	err = nl80211_check_npca(rdev, &params->chandef, wdev->iftype,
7354 				 info->extack);
7355 	if (err)
7356 		goto out;
7357 
7358 	beacon_check.iftype = wdev->iftype;
7359 	beacon_check.relax = true;
7360 	beacon_check.reg_power =
7361 		cfg80211_get_6ghz_power_type(params->beacon.tail,
7362 					     params->beacon.tail_len, 0);
7363 	if (!cfg80211_reg_check_beaconing(&rdev->wiphy, &params->chandef,
7364 					  &beacon_check)) {
7365 		err = -EINVAL;
7366 		goto out;
7367 	}
7368 
7369 	if (info->attrs[NL80211_ATTR_TX_RATES]) {
7370 		err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
7371 						    NL80211_ATTR_TX_RATES,
7372 						    &params->beacon_rate,
7373 						    dev, false, link_id);
7374 		if (err)
7375 			goto out;
7376 
7377 		err = validate_beacon_tx_rate(rdev, params->chandef.chan->band,
7378 					      &params->beacon_rate);
7379 		if (err)
7380 			goto out;
7381 	}
7382 
7383 	params->pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
7384 	if (params->pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) {
7385 		err = -EOPNOTSUPP;
7386 		goto out;
7387 	}
7388 
7389 	if (info->attrs[NL80211_ATTR_ACL_POLICY]) {
7390 		params->acl = parse_acl_data(&rdev->wiphy, info);
7391 		if (IS_ERR(params->acl)) {
7392 			err = PTR_ERR(params->acl);
7393 			params->acl = NULL;
7394 			goto out;
7395 		}
7396 	}
7397 
7398 	params->twt_responder =
7399 		    nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]);
7400 
7401 	if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) {
7402 		err = nl80211_parse_he_obss_pd(
7403 					info->attrs[NL80211_ATTR_HE_OBSS_PD],
7404 					&params->he_obss_pd);
7405 		if (err)
7406 			goto out;
7407 	}
7408 
7409 	if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) {
7410 		err = nl80211_parse_fils_discovery(rdev,
7411 						   info->attrs[NL80211_ATTR_FILS_DISCOVERY],
7412 						   &params->fils_discovery);
7413 		if (err)
7414 			goto out;
7415 	}
7416 
7417 	if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) {
7418 		err = nl80211_parse_unsol_bcast_probe_resp(
7419 			rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP],
7420 			&params->unsol_bcast_probe_resp);
7421 		if (err)
7422 			goto out;
7423 	}
7424 
7425 	if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) {
7426 		err = nl80211_parse_mbssid_config(&rdev->wiphy, dev, link_id,
7427 						  info->attrs[NL80211_ATTR_MBSSID_CONFIG],
7428 						  &params->mbssid_config,
7429 						  params->beacon.mbssid_ies ?
7430 							params->beacon.mbssid_ies->cnt :
7431 							0);
7432 		if (err)
7433 			goto out;
7434 	}
7435 
7436 	if (!params->mbssid_config.ema && params->beacon.rnr_ies) {
7437 		err = -EINVAL;
7438 		goto out;
7439 	}
7440 
7441 	if (info->attrs[NL80211_ATTR_S1G_SHORT_BEACON]) {
7442 		if (!info->attrs[NL80211_ATTR_S1G_LONG_BEACON_PERIOD]) {
7443 			err = -EINVAL;
7444 			goto out;
7445 		}
7446 
7447 		params->s1g_long_beacon_period = nla_get_u8(
7448 			info->attrs[NL80211_ATTR_S1G_LONG_BEACON_PERIOD]);
7449 
7450 		err = nl80211_parse_s1g_short_beacon(
7451 			rdev, info->attrs[NL80211_ATTR_S1G_SHORT_BEACON],
7452 			&params->s1g_short_beacon);
7453 		if (err)
7454 			goto out;
7455 	}
7456 
7457 	err = nl80211_calculate_ap_capabilities(info, params);
7458 	if (err)
7459 		goto out;
7460 
7461 	if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS])
7462 		params->flags = nla_get_u32(
7463 			info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]);
7464 	else if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])
7465 		params->flags |= NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT;
7466 
7467 	if (wdev->conn_owner_nlportid &&
7468 	    info->attrs[NL80211_ATTR_SOCKET_OWNER] &&
7469 	    wdev->conn_owner_nlportid != info->snd_portid) {
7470 		err = -EINVAL;
7471 		goto out;
7472 	}
7473 
7474 	/* FIXME: validate MLO/link-id against driver capabilities */
7475 
7476 	err = rdev_start_ap(rdev, dev, params);
7477 	if (!err) {
7478 		wdev->links[link_id].ap.beacon_interval = params->beacon_interval;
7479 		wdev->links[link_id].ap.chandef = params->chandef;
7480 		wdev->u.ap.ssid_len = params->ssid_len;
7481 		memcpy(wdev->u.ap.ssid, params->ssid,
7482 		       params->ssid_len);
7483 
7484 		if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
7485 			wdev->conn_owner_nlportid = info->snd_portid;
7486 
7487 		nl80211_send_ap_started(wdev, link_id);
7488 	}
7489 out:
7490 	kfree(params->acl);
7491 	kfree(params->beacon.mbssid_ies);
7492 	if (params->mbssid_config.tx_wdev &&
7493 	    params->mbssid_config.tx_wdev->netdev &&
7494 	    params->mbssid_config.tx_wdev->netdev != dev)
7495 		dev_put(params->mbssid_config.tx_wdev->netdev);
7496 	kfree(params->beacon.rnr_ies);
7497 	kfree(params);
7498 
7499 	return err;
7500 }
7501 
7502 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
7503 {
7504 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
7505 	struct cfg80211_beaconing_check_config beacon_check = {};
7506 	unsigned int link_id = nl80211_link_id(info->attrs);
7507 	struct net_device *dev = info->user_ptr[1];
7508 	struct wireless_dev *wdev = dev->ieee80211_ptr;
7509 	struct cfg80211_ap_update *params;
7510 	struct nlattr *attr;
7511 	int err;
7512 
7513 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
7514 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
7515 		return -EOPNOTSUPP;
7516 
7517 	if (!rdev->ops->change_beacon)
7518 		return -EOPNOTSUPP;
7519 
7520 	if (!wdev->links[link_id].ap.beacon_interval)
7521 		return -EINVAL;
7522 
7523 	params = kzalloc_obj(*params);
7524 	if (!params)
7525 		return -ENOMEM;
7526 
7527 	err = nl80211_parse_beacon(rdev, info->attrs, &params->beacon,
7528 				   wdev->links[link_id].ap.chandef.chan,
7529 				   info->extack);
7530 	if (err)
7531 		goto out;
7532 
7533 	/* recheck beaconing is permitted with possibly changed power type */
7534 	beacon_check.iftype = wdev->iftype;
7535 	beacon_check.relax = true;
7536 	beacon_check.reg_power =
7537 		cfg80211_get_6ghz_power_type(params->beacon.tail,
7538 					     params->beacon.tail_len, 0);
7539 	if (!cfg80211_reg_check_beaconing(&rdev->wiphy,
7540 					  &wdev->links[link_id].ap.chandef,
7541 					  &beacon_check)) {
7542 		err = -EINVAL;
7543 		goto out;
7544 	}
7545 
7546 	attr = info->attrs[NL80211_ATTR_FILS_DISCOVERY];
7547 	if (attr) {
7548 		err = nl80211_parse_fils_discovery(rdev, attr,
7549 						   &params->fils_discovery);
7550 		if (err)
7551 			goto out;
7552 	}
7553 
7554 	attr = info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP];
7555 	if (attr) {
7556 		err = nl80211_parse_unsol_bcast_probe_resp(rdev, attr,
7557 							   &params->unsol_bcast_probe_resp);
7558 		if (err)
7559 			goto out;
7560 	}
7561 
7562 	attr = info->attrs[NL80211_ATTR_S1G_SHORT_BEACON];
7563 	if (attr) {
7564 		err = nl80211_parse_s1g_short_beacon(rdev, attr,
7565 						     &params->s1g_short_beacon);
7566 		if (err)
7567 			goto out;
7568 	}
7569 
7570 	err = rdev_change_beacon(rdev, dev, params);
7571 
7572 out:
7573 	kfree(params->beacon.mbssid_ies);
7574 	kfree(params->beacon.rnr_ies);
7575 	kfree(params);
7576 	return err;
7577 }
7578 
7579 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info)
7580 {
7581 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
7582 	unsigned int link_id = nl80211_link_id(info->attrs);
7583 	struct net_device *dev = info->user_ptr[1];
7584 
7585 	return cfg80211_stop_ap(rdev, dev, link_id, false);
7586 }
7587 
7588 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
7589 	[NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG },
7590 	[NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
7591 	[NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
7592 	[NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
7593 	[NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG },
7594 	[NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG },
7595 };
7596 
7597 static int parse_station_flags(struct genl_info *info,
7598 			       enum nl80211_iftype iftype,
7599 			       struct station_parameters *params)
7600 {
7601 	struct nlattr *flags[NL80211_STA_FLAG_MAX + 1];
7602 	struct nlattr *nla;
7603 	int flag;
7604 
7605 	/*
7606 	 * Try parsing the new attribute first so userspace
7607 	 * can specify both for older kernels.
7608 	 */
7609 	nla = info->attrs[NL80211_ATTR_STA_FLAGS2];
7610 	if (nla) {
7611 		struct nl80211_sta_flag_update *sta_flags;
7612 
7613 		sta_flags = nla_data(nla);
7614 		params->sta_flags_mask = sta_flags->mask;
7615 		params->sta_flags_set = sta_flags->set;
7616 		params->sta_flags_set &= params->sta_flags_mask;
7617 		if ((params->sta_flags_mask |
7618 		     params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID))
7619 			return -EINVAL;
7620 
7621 		if ((iftype == NL80211_IFTYPE_NAN ||
7622 		     iftype == NL80211_IFTYPE_NAN_DATA) &&
7623 		    params->sta_flags_mask &
7624 		    ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
7625 		      BIT(NL80211_STA_FLAG_ASSOCIATED) |
7626 		      BIT(NL80211_STA_FLAG_AUTHORIZED) |
7627 		      BIT(NL80211_STA_FLAG_MFP)))
7628 				return -EINVAL;
7629 
7630 		/* WME is always used in NAN */
7631 		if (iftype == NL80211_IFTYPE_NAN_DATA) {
7632 			/* but don't let userspace control it */
7633 			if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_WME))
7634 				return -EINVAL;
7635 
7636 			params->sta_flags_mask |= BIT(NL80211_STA_FLAG_WME);
7637 			params->sta_flags_set |= BIT(NL80211_STA_FLAG_WME);
7638 		}
7639 
7640 		return 0;
7641 	}
7642 
7643 	/* if present, parse the old attribute */
7644 
7645 	nla = info->attrs[NL80211_ATTR_STA_FLAGS];
7646 	if (!nla)
7647 		return 0;
7648 
7649 	if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack))
7650 		return -EINVAL;
7651 
7652 	/*
7653 	 * Only allow certain flags for interface types so that
7654 	 * other attributes are silently ignored. Remember that
7655 	 * this is backward compatibility code with old userspace
7656 	 * and shouldn't be hit in other cases anyway.
7657 	 */
7658 	switch (iftype) {
7659 	case NL80211_IFTYPE_AP:
7660 	case NL80211_IFTYPE_AP_VLAN:
7661 	case NL80211_IFTYPE_P2P_GO:
7662 		params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
7663 					 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
7664 					 BIT(NL80211_STA_FLAG_WME) |
7665 					 BIT(NL80211_STA_FLAG_MFP);
7666 		break;
7667 	case NL80211_IFTYPE_P2P_CLIENT:
7668 	case NL80211_IFTYPE_STATION:
7669 		params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
7670 					 BIT(NL80211_STA_FLAG_TDLS_PEER);
7671 		break;
7672 	case NL80211_IFTYPE_MESH_POINT:
7673 		params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
7674 					 BIT(NL80211_STA_FLAG_MFP) |
7675 					 BIT(NL80211_STA_FLAG_AUTHORIZED);
7676 		break;
7677 	default:
7678 		return -EINVAL;
7679 	}
7680 
7681 	for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) {
7682 		if (flags[flag]) {
7683 			params->sta_flags_set |= (1<<flag);
7684 
7685 			/* no longer support new API additions in old API */
7686 			if (flag > NL80211_STA_FLAG_MAX_OLD_API)
7687 				return -EINVAL;
7688 		}
7689 	}
7690 
7691 	return 0;
7692 }
7693 
7694 bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, int attr)
7695 {
7696 	struct nlattr *rate;
7697 	u32 bitrate;
7698 	u16 bitrate_compat;
7699 	enum nl80211_rate_info rate_flg;
7700 
7701 	rate = nla_nest_start_noflag(msg, attr);
7702 	if (!rate)
7703 		return false;
7704 
7705 	/* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
7706 	bitrate = cfg80211_calculate_bitrate(info);
7707 	/* report 16-bit bitrate only if we can */
7708 	bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0;
7709 	if (bitrate > 0 &&
7710 	    nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate))
7711 		return false;
7712 	if (bitrate_compat > 0 &&
7713 	    nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat))
7714 		return false;
7715 
7716 	switch (info->bw) {
7717 	case RATE_INFO_BW_1:
7718 		rate_flg = NL80211_RATE_INFO_1_MHZ_WIDTH;
7719 		break;
7720 	case RATE_INFO_BW_2:
7721 		rate_flg = NL80211_RATE_INFO_2_MHZ_WIDTH;
7722 		break;
7723 	case RATE_INFO_BW_4:
7724 		rate_flg = NL80211_RATE_INFO_4_MHZ_WIDTH;
7725 		break;
7726 	case RATE_INFO_BW_5:
7727 		rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH;
7728 		break;
7729 	case RATE_INFO_BW_8:
7730 		rate_flg = NL80211_RATE_INFO_8_MHZ_WIDTH;
7731 		break;
7732 	case RATE_INFO_BW_10:
7733 		rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH;
7734 		break;
7735 	case RATE_INFO_BW_16:
7736 		rate_flg = NL80211_RATE_INFO_16_MHZ_WIDTH;
7737 		break;
7738 	default:
7739 		WARN_ON(1);
7740 		fallthrough;
7741 	case RATE_INFO_BW_20:
7742 		rate_flg = 0;
7743 		break;
7744 	case RATE_INFO_BW_40:
7745 		rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH;
7746 		break;
7747 	case RATE_INFO_BW_80:
7748 		rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH;
7749 		break;
7750 	case RATE_INFO_BW_160:
7751 		rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH;
7752 		break;
7753 	case RATE_INFO_BW_HE_RU:
7754 		rate_flg = 0;
7755 		WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS));
7756 		break;
7757 	case RATE_INFO_BW_320:
7758 		rate_flg = NL80211_RATE_INFO_320_MHZ_WIDTH;
7759 		break;
7760 	case RATE_INFO_BW_EHT_RU:
7761 		rate_flg = 0;
7762 		WARN_ON(!(info->flags & RATE_INFO_FLAGS_EHT_MCS) &&
7763 			!(info->flags & RATE_INFO_FLAGS_UHR_MCS));
7764 		break;
7765 	}
7766 
7767 	if (rate_flg && nla_put_flag(msg, rate_flg))
7768 		return false;
7769 
7770 	if (info->flags & RATE_INFO_FLAGS_MCS) {
7771 		if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs))
7772 			return false;
7773 		if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
7774 		    nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
7775 			return false;
7776 	} else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) {
7777 		if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs))
7778 			return false;
7779 		if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss))
7780 			return false;
7781 		if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
7782 		    nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
7783 			return false;
7784 	} else if (info->flags & RATE_INFO_FLAGS_HE_MCS) {
7785 		if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs))
7786 			return false;
7787 		if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss))
7788 			return false;
7789 		if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi))
7790 			return false;
7791 		if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm))
7792 			return false;
7793 		if (info->bw == RATE_INFO_BW_HE_RU &&
7794 		    nla_put_u8(msg, NL80211_RATE_INFO_HE_RU_ALLOC,
7795 			       info->he_ru_alloc))
7796 			return false;
7797 	} else if (info->flags & RATE_INFO_FLAGS_S1G_MCS) {
7798 		if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_MCS, info->mcs))
7799 			return false;
7800 		if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_NSS, info->nss))
7801 			return false;
7802 		if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
7803 		    nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
7804 			return false;
7805 	} else if (info->flags & RATE_INFO_FLAGS_EHT_MCS) {
7806 		if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_MCS, info->mcs))
7807 			return false;
7808 		if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss))
7809 			return false;
7810 		if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi))
7811 			return false;
7812 		if (info->bw == RATE_INFO_BW_EHT_RU &&
7813 		    nla_put_u8(msg, NL80211_RATE_INFO_EHT_RU_ALLOC,
7814 			       info->eht_ru_alloc))
7815 			return false;
7816 	} else if (info->flags & RATE_INFO_FLAGS_UHR_MCS) {
7817 		if (nla_put_u8(msg, NL80211_RATE_INFO_UHR_MCS, info->mcs))
7818 			return false;
7819 		if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss))
7820 			return false;
7821 		if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi))
7822 			return false;
7823 		if (info->bw == RATE_INFO_BW_EHT_RU &&
7824 		    nla_put_u8(msg, NL80211_RATE_INFO_EHT_RU_ALLOC,
7825 			       info->eht_ru_alloc))
7826 			return false;
7827 		if (info->flags & RATE_INFO_FLAGS_UHR_ELR_MCS &&
7828 		    nla_put_flag(msg, NL80211_RATE_INFO_UHR_ELR))
7829 			return false;
7830 		if (info->flags & RATE_INFO_FLAGS_UHR_IM &&
7831 		    nla_put_flag(msg, NL80211_RATE_INFO_UHR_IM))
7832 			return false;
7833 	}
7834 
7835 	nla_nest_end(msg, rate);
7836 	return true;
7837 }
7838 
7839 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal,
7840 			       int id)
7841 {
7842 	void *attr;
7843 	int i = 0;
7844 
7845 	if (!mask)
7846 		return true;
7847 
7848 	attr = nla_nest_start_noflag(msg, id);
7849 	if (!attr)
7850 		return false;
7851 
7852 	for (i = 0; i < IEEE80211_MAX_CHAINS; i++) {
7853 		if (!(mask & BIT(i)))
7854 			continue;
7855 
7856 		if (nla_put_u8(msg, i, signal[i]))
7857 			return false;
7858 	}
7859 
7860 	nla_nest_end(msg, attr);
7861 
7862 	return true;
7863 }
7864 
7865 static int nl80211_fill_link_station(struct sk_buff *msg,
7866 				     struct cfg80211_registered_device *rdev,
7867 				     struct link_station_info *link_sinfo)
7868 {
7869 	struct nlattr *bss_param, *link_sinfoattr;
7870 
7871 #define PUT_LINK_SINFO(attr, memb, type) do {				\
7872 	BUILD_BUG_ON(sizeof(type) == sizeof(u64));			\
7873 	if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) &&	\
7874 	    nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr,		\
7875 			     link_sinfo->memb))				\
7876 		goto nla_put_failure;					\
7877 	} while (0)
7878 #define PUT_LINK_SINFO_U64(attr, memb) do {				\
7879 	if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) &&	\
7880 	    nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr,		\
7881 			      link_sinfo->memb, NL80211_STA_INFO_PAD))	\
7882 		goto nla_put_failure;					\
7883 	} while (0)
7884 
7885 	link_sinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_STA_INFO);
7886 	if (!link_sinfoattr)
7887 		goto nla_put_failure;
7888 
7889 	PUT_LINK_SINFO(INACTIVE_TIME, inactive_time, u32);
7890 
7891 	if (link_sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) |
7892 			     BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) &&
7893 	    nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES,
7894 			(u32)link_sinfo->rx_bytes))
7895 		goto nla_put_failure;
7896 
7897 	if (link_sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) |
7898 			     BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) &&
7899 	    nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES,
7900 			(u32)link_sinfo->tx_bytes))
7901 		goto nla_put_failure;
7902 
7903 	PUT_LINK_SINFO_U64(RX_BYTES64, rx_bytes);
7904 	PUT_LINK_SINFO_U64(TX_BYTES64, tx_bytes);
7905 	PUT_LINK_SINFO_U64(RX_DURATION, rx_duration);
7906 	PUT_LINK_SINFO_U64(TX_DURATION, tx_duration);
7907 
7908 	if (wiphy_ext_feature_isset(&rdev->wiphy,
7909 				    NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
7910 		PUT_LINK_SINFO(AIRTIME_WEIGHT, airtime_weight, u16);
7911 
7912 	switch (rdev->wiphy.signal_type) {
7913 	case CFG80211_SIGNAL_TYPE_MBM:
7914 		PUT_LINK_SINFO(SIGNAL, signal, u8);
7915 		PUT_LINK_SINFO(SIGNAL_AVG, signal_avg, u8);
7916 		break;
7917 	default:
7918 		break;
7919 	}
7920 	if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) {
7921 		if (!nl80211_put_signal(msg, link_sinfo->chains,
7922 					link_sinfo->chain_signal,
7923 					NL80211_STA_INFO_CHAIN_SIGNAL))
7924 			goto nla_put_failure;
7925 	}
7926 	if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) {
7927 		if (!nl80211_put_signal(msg, link_sinfo->chains,
7928 					link_sinfo->chain_signal_avg,
7929 					NL80211_STA_INFO_CHAIN_SIGNAL_AVG))
7930 			goto nla_put_failure;
7931 	}
7932 	if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) {
7933 		if (!nl80211_put_sta_rate(msg, &link_sinfo->txrate,
7934 					  NL80211_STA_INFO_TX_BITRATE))
7935 			goto nla_put_failure;
7936 	}
7937 	if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) {
7938 		if (!nl80211_put_sta_rate(msg, &link_sinfo->rxrate,
7939 					  NL80211_STA_INFO_RX_BITRATE))
7940 			goto nla_put_failure;
7941 	}
7942 
7943 	PUT_LINK_SINFO(RX_PACKETS, rx_packets, u32);
7944 	PUT_LINK_SINFO(TX_PACKETS, tx_packets, u32);
7945 	PUT_LINK_SINFO(TX_RETRIES, tx_retries, u32);
7946 	PUT_LINK_SINFO(TX_FAILED, tx_failed, u32);
7947 	PUT_LINK_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32);
7948 	PUT_LINK_SINFO(BEACON_LOSS, beacon_loss_count, u32);
7949 
7950 	if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) {
7951 		bss_param = nla_nest_start_noflag(msg,
7952 						  NL80211_STA_INFO_BSS_PARAM);
7953 		if (!bss_param)
7954 			goto nla_put_failure;
7955 
7956 		if (((link_sinfo->bss_param.flags &
7957 		      BSS_PARAM_FLAGS_CTS_PROT) &&
7958 		     nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) ||
7959 		    ((link_sinfo->bss_param.flags &
7960 		      BSS_PARAM_FLAGS_SHORT_PREAMBLE) &&
7961 		     nla_put_flag(msg,
7962 				  NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) ||
7963 		    ((link_sinfo->bss_param.flags &
7964 		      BSS_PARAM_FLAGS_SHORT_SLOT_TIME) &&
7965 		     nla_put_flag(msg,
7966 				  NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) ||
7967 		    nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD,
7968 			       link_sinfo->bss_param.dtim_period) ||
7969 		    nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL,
7970 				link_sinfo->bss_param.beacon_interval))
7971 			goto nla_put_failure;
7972 
7973 		nla_nest_end(msg, bss_param);
7974 	}
7975 
7976 	PUT_LINK_SINFO_U64(RX_DROP_MISC, rx_dropped_misc);
7977 	PUT_LINK_SINFO_U64(BEACON_RX, rx_beacon);
7978 	PUT_LINK_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
7979 	PUT_LINK_SINFO(RX_MPDUS, rx_mpdu_count, u32);
7980 	PUT_LINK_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32);
7981 	if (wiphy_ext_feature_isset(&rdev->wiphy,
7982 				    NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) {
7983 		PUT_LINK_SINFO(ACK_SIGNAL, ack_signal, u8);
7984 		PUT_LINK_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8);
7985 	}
7986 
7987 #undef PUT_LINK_SINFO
7988 #undef PUT_LINK_SINFO_U64
7989 
7990 	if (link_sinfo->pertid) {
7991 		struct nlattr *tidsattr;
7992 		int tid;
7993 
7994 		tidsattr = nla_nest_start_noflag(msg,
7995 						 NL80211_STA_INFO_TID_STATS);
7996 		if (!tidsattr)
7997 			goto nla_put_failure;
7998 
7999 		for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) {
8000 			struct cfg80211_tid_stats *tidstats;
8001 			struct nlattr *tidattr;
8002 
8003 			tidstats = &link_sinfo->pertid[tid];
8004 
8005 			if (!tidstats->filled)
8006 				continue;
8007 
8008 			tidattr = nla_nest_start_noflag(msg, tid + 1);
8009 			if (!tidattr)
8010 				goto nla_put_failure;
8011 
8012 #define PUT_TIDVAL_U64(attr, memb) do {					\
8013 	if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) &&	\
8014 	    nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr,		\
8015 			      tidstats->memb, NL80211_TID_STATS_PAD))	\
8016 		goto nla_put_failure;					\
8017 	} while (0)
8018 
8019 			PUT_TIDVAL_U64(RX_MSDU, rx_msdu);
8020 			PUT_TIDVAL_U64(TX_MSDU, tx_msdu);
8021 			PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries);
8022 			PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed);
8023 
8024 #undef PUT_TIDVAL_U64
8025 			if ((tidstats->filled &
8026 			     BIT(NL80211_TID_STATS_TXQ_STATS)) &&
8027 			    !nl80211_put_txq_stats(msg, &tidstats->txq_stats,
8028 						   NL80211_TID_STATS_TXQ_STATS))
8029 				goto nla_put_failure;
8030 
8031 			nla_nest_end(msg, tidattr);
8032 		}
8033 
8034 		nla_nest_end(msg, tidsattr);
8035 	}
8036 
8037 	nla_nest_end(msg, link_sinfoattr);
8038 	return 0;
8039 
8040 nla_put_failure:
8041 	return -EMSGSIZE;
8042 }
8043 
8044 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
8045 				u32 seq, int flags,
8046 				struct cfg80211_registered_device *rdev,
8047 				struct wireless_dev *wdev,
8048 				const u8 *mac_addr, struct station_info *sinfo,
8049 				bool link_stats)
8050 {
8051 	void *hdr;
8052 	struct nlattr *sinfoattr, *bss_param;
8053 	struct link_station_info *link_sinfo;
8054 	struct nlattr *links, *link;
8055 	int link_id;
8056 
8057 	hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
8058 	if (!hdr) {
8059 		cfg80211_sinfo_release_content(sinfo);
8060 		return -1;
8061 	}
8062 
8063 	if ((wdev->netdev &&
8064 	     nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) ||
8065 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
8066 			      NL80211_ATTR_PAD) ||
8067 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
8068 	    nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation))
8069 		goto nla_put_failure;
8070 
8071 	sinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_STA_INFO);
8072 	if (!sinfoattr)
8073 		goto nla_put_failure;
8074 
8075 #define PUT_SINFO(attr, memb, type) do {				\
8076 	BUILD_BUG_ON(sizeof(type) == sizeof(u64));			\
8077 	if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) &&	\
8078 	    nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr,		\
8079 			     sinfo->memb))				\
8080 		goto nla_put_failure;					\
8081 	} while (0)
8082 #define PUT_SINFO_U64(attr, memb) do {					\
8083 	if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) &&	\
8084 	    nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr,		\
8085 			      sinfo->memb, NL80211_STA_INFO_PAD))	\
8086 		goto nla_put_failure;					\
8087 	} while (0)
8088 
8089 	PUT_SINFO(CONNECTED_TIME, connected_time, u32);
8090 	PUT_SINFO(INACTIVE_TIME, inactive_time, u32);
8091 	PUT_SINFO_U64(ASSOC_AT_BOOTTIME, assoc_at);
8092 
8093 	if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) |
8094 			     BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) &&
8095 	    nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES,
8096 			(u32)sinfo->rx_bytes))
8097 		goto nla_put_failure;
8098 
8099 	if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) |
8100 			     BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) &&
8101 	    nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES,
8102 			(u32)sinfo->tx_bytes))
8103 		goto nla_put_failure;
8104 
8105 	PUT_SINFO_U64(RX_BYTES64, rx_bytes);
8106 	PUT_SINFO_U64(TX_BYTES64, tx_bytes);
8107 	PUT_SINFO_U64(RX_DURATION, rx_duration);
8108 	PUT_SINFO_U64(TX_DURATION, tx_duration);
8109 
8110 	if (wiphy_ext_feature_isset(&rdev->wiphy,
8111 				    NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
8112 		PUT_SINFO(AIRTIME_WEIGHT, airtime_weight, u16);
8113 
8114 	switch (rdev->wiphy.signal_type) {
8115 	case CFG80211_SIGNAL_TYPE_MBM:
8116 		PUT_SINFO(SIGNAL, signal, u8);
8117 		PUT_SINFO(SIGNAL_AVG, signal_avg, u8);
8118 		break;
8119 	default:
8120 		break;
8121 	}
8122 	if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) {
8123 		if (!nl80211_put_signal(msg, sinfo->chains,
8124 					sinfo->chain_signal,
8125 					NL80211_STA_INFO_CHAIN_SIGNAL))
8126 			goto nla_put_failure;
8127 	}
8128 	if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) {
8129 		if (!nl80211_put_signal(msg, sinfo->chains,
8130 					sinfo->chain_signal_avg,
8131 					NL80211_STA_INFO_CHAIN_SIGNAL_AVG))
8132 			goto nla_put_failure;
8133 	}
8134 	if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) {
8135 		if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
8136 					  NL80211_STA_INFO_TX_BITRATE))
8137 			goto nla_put_failure;
8138 	}
8139 	if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) {
8140 		if (!nl80211_put_sta_rate(msg, &sinfo->rxrate,
8141 					  NL80211_STA_INFO_RX_BITRATE))
8142 			goto nla_put_failure;
8143 	}
8144 
8145 	PUT_SINFO(RX_PACKETS, rx_packets, u32);
8146 	PUT_SINFO(TX_PACKETS, tx_packets, u32);
8147 	PUT_SINFO(TX_RETRIES, tx_retries, u32);
8148 	PUT_SINFO(TX_FAILED, tx_failed, u32);
8149 	PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32);
8150 	PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32);
8151 
8152 	PUT_SINFO(LLID, llid, u16);
8153 	PUT_SINFO(PLID, plid, u16);
8154 	PUT_SINFO(PLINK_STATE, plink_state, u8);
8155 	PUT_SINFO(AIRTIME_LINK_METRIC, airtime_link_metric, u32);
8156 	PUT_SINFO(LOCAL_PM, local_pm, u32);
8157 	PUT_SINFO(PEER_PM, peer_pm, u32);
8158 	PUT_SINFO(NONPEER_PM, nonpeer_pm, u32);
8159 	PUT_SINFO(CONNECTED_TO_GATE, connected_to_gate, u8);
8160 	PUT_SINFO(CONNECTED_TO_AS, connected_to_as, u8);
8161 	PUT_SINFO_U64(T_OFFSET, t_offset);
8162 
8163 	if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) {
8164 		bss_param = nla_nest_start_noflag(msg,
8165 						  NL80211_STA_INFO_BSS_PARAM);
8166 		if (!bss_param)
8167 			goto nla_put_failure;
8168 
8169 		if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) &&
8170 		     nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) ||
8171 		    ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) &&
8172 		     nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) ||
8173 		    ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) &&
8174 		     nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) ||
8175 		    nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD,
8176 			       sinfo->bss_param.dtim_period) ||
8177 		    nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL,
8178 				sinfo->bss_param.beacon_interval))
8179 			goto nla_put_failure;
8180 
8181 		nla_nest_end(msg, bss_param);
8182 	}
8183 	if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) &&
8184 	    nla_put(msg, NL80211_STA_INFO_STA_FLAGS,
8185 		    sizeof(struct nl80211_sta_flag_update),
8186 		    &sinfo->sta_flags))
8187 		goto nla_put_failure;
8188 
8189 	PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc);
8190 	PUT_SINFO_U64(BEACON_RX, rx_beacon);
8191 	PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
8192 	PUT_SINFO(RX_MPDUS, rx_mpdu_count, u32);
8193 	PUT_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32);
8194 	if (wiphy_ext_feature_isset(&rdev->wiphy,
8195 				    NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) {
8196 		PUT_SINFO(ACK_SIGNAL, ack_signal, u8);
8197 		PUT_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8);
8198 	}
8199 
8200 #undef PUT_SINFO
8201 #undef PUT_SINFO_U64
8202 
8203 	if (sinfo->pertid) {
8204 		struct nlattr *tidsattr;
8205 		int tid;
8206 
8207 		tidsattr = nla_nest_start_noflag(msg,
8208 						 NL80211_STA_INFO_TID_STATS);
8209 		if (!tidsattr)
8210 			goto nla_put_failure;
8211 
8212 		for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) {
8213 			struct cfg80211_tid_stats *tidstats;
8214 			struct nlattr *tidattr;
8215 
8216 			tidstats = &sinfo->pertid[tid];
8217 
8218 			if (!tidstats->filled)
8219 				continue;
8220 
8221 			tidattr = nla_nest_start_noflag(msg, tid + 1);
8222 			if (!tidattr)
8223 				goto nla_put_failure;
8224 
8225 #define PUT_TIDVAL_U64(attr, memb) do {					\
8226 	if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) &&	\
8227 	    nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr,		\
8228 			      tidstats->memb, NL80211_TID_STATS_PAD))	\
8229 		goto nla_put_failure;					\
8230 	} while (0)
8231 
8232 			PUT_TIDVAL_U64(RX_MSDU, rx_msdu);
8233 			PUT_TIDVAL_U64(TX_MSDU, tx_msdu);
8234 			PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries);
8235 			PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed);
8236 
8237 #undef PUT_TIDVAL_U64
8238 			if ((tidstats->filled &
8239 			     BIT(NL80211_TID_STATS_TXQ_STATS)) &&
8240 			    !nl80211_put_txq_stats(msg, &tidstats->txq_stats,
8241 						   NL80211_TID_STATS_TXQ_STATS))
8242 				goto nla_put_failure;
8243 
8244 			nla_nest_end(msg, tidattr);
8245 		}
8246 
8247 		nla_nest_end(msg, tidsattr);
8248 	}
8249 
8250 	nla_nest_end(msg, sinfoattr);
8251 
8252 	if (sinfo->assoc_req_ies_len &&
8253 	    nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len,
8254 		    sinfo->assoc_req_ies))
8255 		goto nla_put_failure;
8256 
8257 	if (sinfo->assoc_resp_ies_len &&
8258 	    nla_put(msg, NL80211_ATTR_RESP_IE, sinfo->assoc_resp_ies_len,
8259 		    sinfo->assoc_resp_ies))
8260 		goto nla_put_failure;
8261 
8262 	if (sinfo->mlo_params_valid) {
8263 		if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID,
8264 			       sinfo->assoc_link_id))
8265 			goto nla_put_failure;
8266 
8267 		if (!is_zero_ether_addr(sinfo->mld_addr) &&
8268 		    nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN,
8269 			    sinfo->mld_addr))
8270 			goto nla_put_failure;
8271 	}
8272 
8273 	if (link_stats && sinfo->valid_links) {
8274 		links = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS);
8275 		if (!links)
8276 			goto nla_put_failure;
8277 
8278 		for_each_valid_link(sinfo, link_id) {
8279 			link_sinfo = sinfo->links[link_id];
8280 
8281 			if (WARN_ON_ONCE(!link_sinfo))
8282 				continue;
8283 
8284 			if (!is_valid_ether_addr(link_sinfo->addr))
8285 				continue;
8286 
8287 			link = nla_nest_start(msg, link_id + 1);
8288 			if (!link)
8289 				goto nla_put_failure;
8290 
8291 			if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID,
8292 				       link_id))
8293 				goto nla_put_failure;
8294 
8295 			if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN,
8296 				    link_sinfo->addr))
8297 				goto nla_put_failure;
8298 
8299 			if (nl80211_fill_link_station(msg, rdev, link_sinfo))
8300 				goto nla_put_failure;
8301 
8302 			nla_nest_end(msg, link);
8303 		}
8304 		nla_nest_end(msg, links);
8305 	}
8306 
8307 	cfg80211_sinfo_release_content(sinfo);
8308 	genlmsg_end(msg, hdr);
8309 	return 0;
8310 
8311  nla_put_failure:
8312 	cfg80211_sinfo_release_content(sinfo);
8313 	genlmsg_cancel(msg, hdr);
8314 	return -EMSGSIZE;
8315 }
8316 
8317 static void cfg80211_sta_set_mld_sinfo(struct station_info *sinfo)
8318 {
8319 	struct link_station_info *link_sinfo;
8320 	int link_id, init = 0;
8321 	u32 link_inactive_time;
8322 
8323 	sinfo->signal = -99;
8324 
8325 	for_each_valid_link(sinfo, link_id) {
8326 		link_sinfo = sinfo->links[link_id];
8327 		if (!link_sinfo)
8328 			continue;
8329 
8330 		if ((link_sinfo->filled &
8331 		     BIT_ULL(NL80211_STA_INFO_TX_PACKETS))) {
8332 			sinfo->tx_packets += link_sinfo->tx_packets;
8333 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);
8334 		}
8335 
8336 		if ((link_sinfo->filled &
8337 		     BIT_ULL(NL80211_STA_INFO_RX_PACKETS))) {
8338 			sinfo->rx_packets += link_sinfo->rx_packets;
8339 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS);
8340 		}
8341 
8342 		if (link_sinfo->filled &
8343 		    (BIT_ULL(NL80211_STA_INFO_TX_BYTES) |
8344 		     BIT_ULL(NL80211_STA_INFO_TX_BYTES64))) {
8345 			sinfo->tx_bytes += link_sinfo->tx_bytes;
8346 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES);
8347 		}
8348 
8349 		if (link_sinfo->filled &
8350 		    (BIT_ULL(NL80211_STA_INFO_RX_BYTES) |
8351 		     BIT_ULL(NL80211_STA_INFO_TX_BYTES64))) {
8352 			sinfo->rx_bytes += link_sinfo->rx_bytes;
8353 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES);
8354 		}
8355 
8356 		if (link_sinfo->filled &
8357 		    BIT_ULL(NL80211_STA_INFO_TX_RETRIES)) {
8358 			sinfo->tx_retries += link_sinfo->tx_retries;
8359 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
8360 		}
8361 
8362 		if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_FAILED)) {
8363 			sinfo->tx_failed += link_sinfo->tx_failed;
8364 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
8365 		}
8366 
8367 		if (link_sinfo->filled &
8368 		    BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC)) {
8369 			sinfo->rx_dropped_misc += link_sinfo->rx_dropped_misc;
8370 			sinfo->filled |=
8371 				BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC);
8372 		}
8373 
8374 		if (link_sinfo->filled &
8375 		    BIT_ULL(NL80211_STA_INFO_BEACON_LOSS)) {
8376 			sinfo->beacon_loss_count +=
8377 				link_sinfo->beacon_loss_count;
8378 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_LOSS);
8379 		}
8380 
8381 		if (link_sinfo->filled &
8382 		    BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT)) {
8383 			sinfo->expected_throughput +=
8384 				link_sinfo->expected_throughput;
8385 			sinfo->filled |=
8386 				BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT);
8387 		}
8388 
8389 		if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_MPDUS)) {
8390 			sinfo->rx_mpdu_count += link_sinfo->rx_mpdu_count;
8391 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_MPDUS);
8392 		}
8393 
8394 		if (link_sinfo->filled &
8395 		    BIT_ULL(NL80211_STA_INFO_FCS_ERROR_COUNT)) {
8396 			sinfo->fcs_err_count += link_sinfo->fcs_err_count;
8397 			sinfo->filled |=
8398 				BIT_ULL(NL80211_STA_INFO_FCS_ERROR_COUNT);
8399 		}
8400 
8401 		if (link_sinfo->filled &
8402 		    BIT_ULL(NL80211_STA_INFO_BEACON_RX)) {
8403 			sinfo->rx_beacon += link_sinfo->rx_beacon;
8404 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_RX);
8405 		}
8406 
8407 		/* Update MLO signal, signal_avg as best among links */
8408 		if ((link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL)) &&
8409 		    link_sinfo->signal > sinfo->signal) {
8410 			sinfo->signal = link_sinfo->signal;
8411 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
8412 		}
8413 
8414 		if ((link_sinfo->filled &
8415 			BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG)) &&
8416 		    link_sinfo->signal_avg > sinfo->signal_avg) {
8417 			sinfo->signal_avg = link_sinfo->signal_avg;
8418 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
8419 		}
8420 
8421 		/* Update MLO inactive_time, bss_param based on least
8422 		 * value for corresponding field of link.
8423 		 */
8424 		if ((link_sinfo->filled &
8425 		     BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME)) &&
8426 		    (!init ||
8427 		     link_inactive_time > link_sinfo->inactive_time)) {
8428 			link_inactive_time = link_sinfo->inactive_time;
8429 			sinfo->inactive_time = link_sinfo->inactive_time;
8430 			sinfo->filled |= NL80211_STA_INFO_INACTIVE_TIME;
8431 		}
8432 
8433 		if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM) &&
8434 		    (!init ||
8435 		     sinfo->bss_param.dtim_period >
8436 		      link_sinfo->bss_param.dtim_period)) {
8437 			sinfo->bss_param.dtim_period =
8438 				link_sinfo->bss_param.dtim_period;
8439 			sinfo->filled |= NL80211_STA_BSS_PARAM_DTIM_PERIOD;
8440 			sinfo->bss_param.beacon_interval =
8441 				link_sinfo->bss_param.beacon_interval;
8442 			sinfo->filled |= NL80211_STA_BSS_PARAM_BEACON_INTERVAL;
8443 		}
8444 
8445 		/* Update MLO rates as per last updated link rate */
8446 		if ((link_sinfo->filled &
8447 		     BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) &&
8448 		    (!init ||
8449 		     link_inactive_time > link_sinfo->inactive_time)) {
8450 			sinfo->txrate = link_sinfo->txrate;
8451 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
8452 		}
8453 		if ((link_sinfo->filled &
8454 		     BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) &&
8455 		    (!init ||
8456 		     link_inactive_time > link_sinfo->inactive_time)) {
8457 			sinfo->rxrate = link_sinfo->rxrate;
8458 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
8459 		}
8460 
8461 		if (link_sinfo->filled &
8462 		    BIT_ULL(NL80211_STA_INFO_TX_DURATION) &&
8463 		    (!init ||
8464 		     link_inactive_time > link_sinfo->inactive_time)) {
8465 			sinfo->tx_duration += link_sinfo->tx_duration;
8466 			sinfo->filled |=
8467 				BIT_ULL(NL80211_STA_INFO_TX_DURATION);
8468 		}
8469 		if (link_sinfo->filled &
8470 		    BIT_ULL(NL80211_STA_INFO_RX_DURATION) &&
8471 		    (!init ||
8472 		     link_inactive_time > link_sinfo->inactive_time)) {
8473 			sinfo->rx_duration += link_sinfo->rx_duration;
8474 			sinfo->filled |=
8475 				BIT_ULL(NL80211_STA_INFO_RX_DURATION);
8476 		}
8477 		init++;
8478 
8479 		/* pertid stats accumulate for rx/tx fields */
8480 		if (sinfo->pertid) {
8481 			sinfo->pertid->rx_msdu +=
8482 				link_sinfo->pertid->rx_msdu;
8483 			sinfo->pertid->tx_msdu +=
8484 				link_sinfo->pertid->tx_msdu;
8485 			sinfo->pertid->tx_msdu_retries +=
8486 				link_sinfo->pertid->tx_msdu_retries;
8487 			sinfo->pertid->tx_msdu_failed +=
8488 				link_sinfo->pertid->tx_msdu_failed;
8489 
8490 			sinfo->pertid->filled |=
8491 				BIT(NL80211_TID_STATS_RX_MSDU) |
8492 				BIT(NL80211_TID_STATS_TX_MSDU) |
8493 				BIT(NL80211_TID_STATS_TX_MSDU_RETRIES) |
8494 				BIT(NL80211_TID_STATS_TX_MSDU_FAILED);
8495 		}
8496 	}
8497 
8498 	/* Reset sinfo->filled bits to exclude fields which don't make
8499 	 * much sense at the MLO level.
8500 	 */
8501 	sinfo->filled &= ~BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
8502 	sinfo->filled &= ~BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG);
8503 }
8504 
8505 static int nl80211_dump_station(struct sk_buff *skb,
8506 				struct netlink_callback *cb)
8507 {
8508 	struct station_info sinfo;
8509 	struct cfg80211_registered_device *rdev;
8510 	struct wireless_dev *wdev;
8511 	u8 mac_addr[ETH_ALEN];
8512 	int sta_idx = cb->args[2];
8513 	bool sinfo_alloc = false;
8514 	int err, i;
8515 
8516 	err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL);
8517 	if (err)
8518 		return err;
8519 	/* nl80211_prepare_wdev_dump acquired it in the successful case */
8520 	__acquire(&rdev->wiphy.mtx);
8521 
8522 	if (!wdev->netdev && wdev->iftype != NL80211_IFTYPE_NAN) {
8523 		err = -EINVAL;
8524 		goto out_err;
8525 	}
8526 
8527 	if (!rdev->ops->dump_station) {
8528 		err = -EOPNOTSUPP;
8529 		goto out_err;
8530 	}
8531 
8532 	while (1) {
8533 		memset(&sinfo, 0, sizeof(sinfo));
8534 
8535 		for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) {
8536 			sinfo.links[i] =
8537 				kzalloc_obj(*sinfo.links[0]);
8538 			if (!sinfo.links[i]) {
8539 				err = -ENOMEM;
8540 				goto out_err;
8541 			}
8542 			sinfo_alloc = true;
8543 		}
8544 
8545 		err = rdev_dump_station(rdev, wdev, sta_idx,
8546 					mac_addr, &sinfo);
8547 		if (err == -ENOENT)
8548 			break;
8549 		if (err)
8550 			goto out_err;
8551 
8552 		if (sinfo.valid_links)
8553 			cfg80211_sta_set_mld_sinfo(&sinfo);
8554 
8555 		/* reset the sinfo_alloc flag as nl80211_send_station()
8556 		 * always releases sinfo
8557 		 */
8558 		sinfo_alloc = false;
8559 
8560 		if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION,
8561 				NETLINK_CB(cb->skb).portid,
8562 				cb->nlh->nlmsg_seq, NLM_F_MULTI,
8563 				rdev, wdev, mac_addr,
8564 				&sinfo, false) < 0)
8565 			goto out;
8566 
8567 		sta_idx++;
8568 	}
8569 
8570  out:
8571 	cb->args[2] = sta_idx;
8572 	err = skb->len;
8573  out_err:
8574 	if (sinfo_alloc)
8575 		cfg80211_sinfo_release_content(&sinfo);
8576 	wiphy_unlock(&rdev->wiphy);
8577 
8578 	return err;
8579 }
8580 
8581 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
8582 {
8583 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8584 	struct wireless_dev *wdev = info->user_ptr[1];
8585 	struct station_info sinfo;
8586 	struct sk_buff *msg;
8587 	u8 *mac_addr = NULL;
8588 	int err, i;
8589 
8590 	memset(&sinfo, 0, sizeof(sinfo));
8591 
8592 	if (!wdev->netdev)
8593 		return -EINVAL;
8594 
8595 	if (!info->attrs[NL80211_ATTR_MAC])
8596 		return -EINVAL;
8597 
8598 	mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
8599 
8600 	if (!rdev->ops->get_station)
8601 		return -EOPNOTSUPP;
8602 
8603 	for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) {
8604 		sinfo.links[i] = kzalloc_obj(*sinfo.links[0]);
8605 		if (!sinfo.links[i]) {
8606 			cfg80211_sinfo_release_content(&sinfo);
8607 			return -ENOMEM;
8608 		}
8609 	}
8610 
8611 	err = rdev_get_station(rdev, wdev, mac_addr, &sinfo);
8612 	if (err) {
8613 		cfg80211_sinfo_release_content(&sinfo);
8614 		return err;
8615 	}
8616 
8617 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
8618 	if (!msg) {
8619 		cfg80211_sinfo_release_content(&sinfo);
8620 		return -ENOMEM;
8621 	}
8622 
8623 	if (sinfo.valid_links)
8624 		cfg80211_sta_set_mld_sinfo(&sinfo);
8625 
8626 	if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION,
8627 				 info->snd_portid, info->snd_seq, 0,
8628 				 rdev, wdev, mac_addr, &sinfo, false) < 0) {
8629 		nlmsg_free(msg);
8630 		return -ENOBUFS;
8631 	}
8632 
8633 	return genlmsg_reply(msg, info);
8634 }
8635 
8636 int cfg80211_check_station_change(struct wiphy *wiphy,
8637 				  struct station_parameters *params,
8638 				  enum cfg80211_station_type statype)
8639 {
8640 	if (params->listen_interval != -1 &&
8641 	    statype != CFG80211_STA_AP_CLIENT_UNASSOC)
8642 		return -EINVAL;
8643 
8644 	if (params->support_p2p_ps != -1 &&
8645 	    statype != CFG80211_STA_AP_CLIENT_UNASSOC)
8646 		return -EINVAL;
8647 
8648 	if (params->aid &&
8649 	    !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) &&
8650 	    statype != CFG80211_STA_AP_CLIENT_UNASSOC)
8651 		return -EINVAL;
8652 
8653 	/* When you run into this, adjust the code below for the new flag */
8654 	BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 8);
8655 
8656 	switch (statype) {
8657 	case CFG80211_STA_MESH_PEER_KERNEL:
8658 	case CFG80211_STA_MESH_PEER_USER:
8659 		/*
8660 		 * No ignoring the TDLS flag here -- the userspace mesh
8661 		 * code doesn't have the bug of including TDLS in the
8662 		 * mask everywhere.
8663 		 */
8664 		if (params->sta_flags_mask &
8665 				~(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
8666 				  BIT(NL80211_STA_FLAG_MFP) |
8667 				  BIT(NL80211_STA_FLAG_AUTHORIZED)))
8668 			return -EINVAL;
8669 		break;
8670 	case CFG80211_STA_TDLS_PEER_SETUP:
8671 	case CFG80211_STA_TDLS_PEER_ACTIVE:
8672 		if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
8673 			return -EINVAL;
8674 		/* ignore since it can't change */
8675 		params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
8676 		break;
8677 	default:
8678 		/* disallow mesh-specific things */
8679 		if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION)
8680 			return -EINVAL;
8681 		if (params->local_pm)
8682 			return -EINVAL;
8683 		if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
8684 			return -EINVAL;
8685 	}
8686 
8687 	if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
8688 	    statype != CFG80211_STA_TDLS_PEER_ACTIVE) {
8689 		/* TDLS can't be set, ... */
8690 		if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
8691 			return -EINVAL;
8692 		/*
8693 		 * ... but don't bother the driver with it. This works around
8694 		 * a hostapd/wpa_supplicant issue -- it always includes the
8695 		 * TLDS_PEER flag in the mask even for AP mode.
8696 		 */
8697 		params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
8698 	}
8699 
8700 	if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
8701 	    statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
8702 		/* reject other things that can't change */
8703 		if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD)
8704 			return -EINVAL;
8705 		if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY)
8706 			return -EINVAL;
8707 		if (params->link_sta_params.supported_rates)
8708 			return -EINVAL;
8709 		if (statype != CFG80211_STA_NAN_MGMT &&
8710 		    (params->link_sta_params.ht_capa ||
8711 		     params->link_sta_params.vht_capa ||
8712 		     params->link_sta_params.he_capa))
8713 			return -EINVAL;
8714 		if (params->ext_capab || params->link_sta_params.eht_capa ||
8715 		    params->link_sta_params.uhr_capa)
8716 			return -EINVAL;
8717 		if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU))
8718 			return -EINVAL;
8719 	}
8720 
8721 	if (statype != CFG80211_STA_AP_CLIENT &&
8722 	    statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
8723 		if (params->vlan)
8724 			return -EINVAL;
8725 	}
8726 
8727 	/* Accept EMLSR capabilities only for AP client before association */
8728 	if (statype != CFG80211_STA_AP_CLIENT_UNASSOC &&
8729 	    params->eml_cap_present)
8730 		return -EINVAL;
8731 
8732 	switch (statype) {
8733 	case CFG80211_STA_AP_MLME_CLIENT:
8734 		/* Use this only for authorizing/unauthorizing a station */
8735 		if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)))
8736 			return -EOPNOTSUPP;
8737 		break;
8738 	case CFG80211_STA_AP_CLIENT:
8739 	case CFG80211_STA_AP_CLIENT_UNASSOC:
8740 		/* accept only the listed bits */
8741 		if (params->sta_flags_mask &
8742 				~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
8743 				  BIT(NL80211_STA_FLAG_AUTHENTICATED) |
8744 				  BIT(NL80211_STA_FLAG_ASSOCIATED) |
8745 				  BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
8746 				  BIT(NL80211_STA_FLAG_WME) |
8747 				  BIT(NL80211_STA_FLAG_MFP) |
8748 				  BIT(NL80211_STA_FLAG_SPP_AMSDU)))
8749 			return -EINVAL;
8750 
8751 		/* but authenticated/associated only if driver handles it */
8752 		if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
8753 		    params->sta_flags_mask &
8754 				(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
8755 				 BIT(NL80211_STA_FLAG_ASSOCIATED)))
8756 			return -EINVAL;
8757 		break;
8758 	case CFG80211_STA_IBSS:
8759 	case CFG80211_STA_AP_STA:
8760 		/* reject any changes other than AUTHORIZED */
8761 		if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
8762 			return -EINVAL;
8763 		break;
8764 	case CFG80211_STA_TDLS_PEER_SETUP:
8765 		/* reject any changes other than AUTHORIZED or WME */
8766 		if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
8767 					       BIT(NL80211_STA_FLAG_WME)))
8768 			return -EINVAL;
8769 		/* force (at least) rates when authorizing */
8770 		if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) &&
8771 		    !params->link_sta_params.supported_rates)
8772 			return -EINVAL;
8773 		break;
8774 	case CFG80211_STA_TDLS_PEER_ACTIVE:
8775 		/* reject any changes */
8776 		return -EINVAL;
8777 	case CFG80211_STA_MESH_PEER_KERNEL:
8778 		if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
8779 			return -EINVAL;
8780 		break;
8781 	case CFG80211_STA_MESH_PEER_USER:
8782 		if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION &&
8783 		    params->plink_action != NL80211_PLINK_ACTION_BLOCK)
8784 			return -EINVAL;
8785 		break;
8786 	case CFG80211_STA_NAN_MGMT:
8787 		if (params->sta_flags_mask &
8788 		    ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
8789 		      BIT(NL80211_STA_FLAG_MFP)))
8790 			return -EINVAL;
8791 		break;
8792 	case CFG80211_STA_NAN_DATA:
8793 		if (params->sta_flags_mask &
8794 		    ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
8795 		      BIT(NL80211_STA_FLAG_MFP) |
8796 		      BIT(NL80211_STA_FLAG_WME)))
8797 			return -EINVAL;
8798 		break;
8799 	}
8800 
8801 	/*
8802 	 * Older kernel versions ignored this attribute entirely, so don't
8803 	 * reject attempts to update it but mark it as unused instead so the
8804 	 * driver won't look at the data.
8805 	 */
8806 	if (statype != CFG80211_STA_AP_CLIENT_UNASSOC &&
8807 	    statype != CFG80211_STA_TDLS_PEER_SETUP)
8808 		params->link_sta_params.opmode_notif_used = false;
8809 
8810 	return 0;
8811 }
8812 EXPORT_SYMBOL(cfg80211_check_station_change);
8813 
8814 /*
8815  * Get vlan interface making sure it is running and on the right wiphy.
8816  */
8817 static struct net_device *get_vlan(struct genl_info *info,
8818 				   struct cfg80211_registered_device *rdev)
8819 {
8820 	struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN];
8821 	struct net_device *v;
8822 	int ret;
8823 
8824 	if (!vlanattr)
8825 		return NULL;
8826 
8827 	v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr));
8828 	if (!v)
8829 		return ERR_PTR(-ENODEV);
8830 
8831 	if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) {
8832 		ret = -EINVAL;
8833 		goto error;
8834 	}
8835 
8836 	if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
8837 	    v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
8838 	    v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
8839 		ret = -EINVAL;
8840 		goto error;
8841 	}
8842 
8843 	if (!netif_running(v)) {
8844 		ret = -ENETDOWN;
8845 		goto error;
8846 	}
8847 
8848 	return v;
8849  error:
8850 	dev_put(v);
8851 	return ERR_PTR(ret);
8852 }
8853 
8854 static int nl80211_parse_sta_wme(struct genl_info *info,
8855 				 struct station_parameters *params)
8856 {
8857 	struct nlattr *tb[NL80211_STA_WME_MAX + 1];
8858 	struct nlattr *nla;
8859 	int err;
8860 
8861 	/* parse WME attributes if present */
8862 	if (!info->attrs[NL80211_ATTR_STA_WME])
8863 		return 0;
8864 
8865 	nla = info->attrs[NL80211_ATTR_STA_WME];
8866 	err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla,
8867 					  nl80211_sta_wme_policy,
8868 					  info->extack);
8869 	if (err)
8870 		return err;
8871 
8872 	if (tb[NL80211_STA_WME_UAPSD_QUEUES])
8873 		params->uapsd_queues = nla_get_u8(
8874 			tb[NL80211_STA_WME_UAPSD_QUEUES]);
8875 	if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK)
8876 		return -EINVAL;
8877 
8878 	if (tb[NL80211_STA_WME_MAX_SP])
8879 		params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]);
8880 
8881 	if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK)
8882 		return -EINVAL;
8883 
8884 	params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD;
8885 
8886 	return 0;
8887 }
8888 
8889 static int nl80211_parse_sta_channel_info(struct genl_info *info,
8890 				      struct station_parameters *params)
8891 {
8892 	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
8893 		params->supported_channels =
8894 		     nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
8895 		params->supported_channels_len =
8896 		     nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
8897 		/*
8898 		 * Need to include at least one (first channel, number of
8899 		 * channels) tuple for each subband (checked in policy),
8900 		 * and must have proper tuples for the rest of the data as well.
8901 		 */
8902 		if (params->supported_channels_len % 2)
8903 			return -EINVAL;
8904 	}
8905 
8906 	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
8907 		params->supported_oper_classes =
8908 		 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
8909 		params->supported_oper_classes_len =
8910 		  nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
8911 	}
8912 	return 0;
8913 }
8914 
8915 static int nl80211_set_station_tdls(struct genl_info *info,
8916 				    struct station_parameters *params)
8917 {
8918 	int err;
8919 	/* Dummy STA entry gets updated once the peer capabilities are known */
8920 	if (info->attrs[NL80211_ATTR_PEER_AID])
8921 		params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
8922 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
8923 		params->link_sta_params.ht_capa =
8924 			nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
8925 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
8926 		params->link_sta_params.vht_capa =
8927 			nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
8928 	if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) {
8929 		params->link_sta_params.he_capa =
8930 			nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
8931 		params->link_sta_params.he_capa_len =
8932 			nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
8933 
8934 		if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) {
8935 			params->link_sta_params.eht_capa =
8936 				nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
8937 			params->link_sta_params.eht_capa_len =
8938 				nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
8939 
8940 			if (!ieee80211_eht_capa_size_ok((const u8 *)params->link_sta_params.he_capa,
8941 							(const u8 *)params->link_sta_params.eht_capa,
8942 							params->link_sta_params.eht_capa_len,
8943 							false))
8944 				return -EINVAL;
8945 		}
8946 	}
8947 
8948 	if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) {
8949 		if (!params->link_sta_params.eht_capa)
8950 			return -EINVAL;
8951 
8952 		params->link_sta_params.uhr_capa =
8953 			nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]);
8954 		params->link_sta_params.uhr_capa_len =
8955 			nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]);
8956 	}
8957 
8958 	if (info->attrs[NL80211_ATTR_S1G_CAPABILITY])
8959 		params->link_sta_params.s1g_capa =
8960 			nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]);
8961 
8962 	err = nl80211_parse_sta_channel_info(info, params);
8963 	if (err)
8964 		return err;
8965 
8966 	return nl80211_parse_sta_wme(info, params);
8967 }
8968 
8969 static int nl80211_parse_sta_txpower_setting(struct genl_info *info,
8970 					     struct sta_txpwr *txpwr,
8971 					     bool *txpwr_set)
8972 {
8973 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8974 	int idx;
8975 
8976 	if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) {
8977 		if (!rdev->ops->set_tx_power ||
8978 		    !wiphy_ext_feature_isset(&rdev->wiphy,
8979 					 NL80211_EXT_FEATURE_STA_TX_PWR))
8980 			return -EOPNOTSUPP;
8981 
8982 		idx = NL80211_ATTR_STA_TX_POWER_SETTING;
8983 		txpwr->type = nla_get_u8(info->attrs[idx]);
8984 
8985 		if (txpwr->type == NL80211_TX_POWER_LIMITED) {
8986 			idx = NL80211_ATTR_STA_TX_POWER;
8987 
8988 			if (info->attrs[idx])
8989 				txpwr->power = nla_get_s16(info->attrs[idx]);
8990 			else
8991 				return -EINVAL;
8992 		}
8993 
8994 		*txpwr_set = true;
8995 	} else {
8996 		*txpwr_set = false;
8997 	}
8998 
8999 	return 0;
9000 }
9001 
9002 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
9003 {
9004 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9005 	struct wireless_dev *wdev = info->user_ptr[1];
9006 	struct net_device *dev = wdev->netdev;
9007 	struct station_parameters params;
9008 	u8 *mac_addr;
9009 	int err;
9010 
9011 	memset(&params, 0, sizeof(params));
9012 
9013 	if (!dev && wdev->iftype != NL80211_IFTYPE_NAN &&
9014 	    wdev->iftype != NL80211_IFTYPE_NAN_DATA)
9015 		return -EINVAL;
9016 
9017 	if (!rdev->ops->change_station)
9018 		return -EOPNOTSUPP;
9019 
9020 	/*
9021 	 * AID and listen_interval properties can be set only for unassociated
9022 	 * station. Include these parameters here and will check them in
9023 	 * cfg80211_check_station_change().
9024 	 */
9025 	if (info->attrs[NL80211_ATTR_STA_AID])
9026 		params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
9027 
9028 	if (info->attrs[NL80211_ATTR_VLAN_ID])
9029 		params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
9030 
9031 	if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
9032 		params.listen_interval =
9033 		     nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
9034 	else
9035 		params.listen_interval = -1;
9036 
9037 	if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS])
9038 		params.support_p2p_ps =
9039 			nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
9040 	else
9041 		params.support_p2p_ps = -1;
9042 
9043 	if (!info->attrs[NL80211_ATTR_MAC])
9044 		return -EINVAL;
9045 
9046 	params.link_sta_params.link_id =
9047 		nl80211_link_id_or_invalid(info->attrs);
9048 
9049 	if (info->attrs[NL80211_ATTR_MLD_ADDR]) {
9050 		/* If MLD_ADDR attribute is set then this is an MLD station
9051 		 * and the MLD_ADDR attribute holds the MLD address and the
9052 		 * MAC attribute holds for the LINK address.
9053 		 * In that case, the link_id is also expected to be valid.
9054 		 */
9055 		if (params.link_sta_params.link_id < 0)
9056 			return -EINVAL;
9057 
9058 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
9059 		params.link_sta_params.mld_mac = mac_addr;
9060 		params.link_sta_params.link_mac =
9061 			nla_data(info->attrs[NL80211_ATTR_MAC]);
9062 		if (!is_valid_ether_addr(params.link_sta_params.link_mac))
9063 			return -EINVAL;
9064 	} else {
9065 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
9066 	}
9067 
9068 
9069 	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
9070 		params.link_sta_params.supported_rates =
9071 			nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
9072 		params.link_sta_params.supported_rates_len =
9073 			nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
9074 	}
9075 
9076 	if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
9077 		params.capability =
9078 			nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
9079 		params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
9080 	}
9081 
9082 	if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
9083 		params.ext_capab =
9084 			nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
9085 		params.ext_capab_len =
9086 			nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
9087 	}
9088 
9089 	if (parse_station_flags(info, wdev->iftype, &params))
9090 		return -EINVAL;
9091 
9092 	if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
9093 		params.plink_action =
9094 			nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
9095 
9096 	if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) {
9097 		params.plink_state =
9098 			nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]);
9099 		if (info->attrs[NL80211_ATTR_MESH_PEER_AID])
9100 			params.peer_aid = nla_get_u16(
9101 				info->attrs[NL80211_ATTR_MESH_PEER_AID]);
9102 		params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE;
9103 	}
9104 
9105 	if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE])
9106 		params.local_pm = nla_get_u32(
9107 			info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]);
9108 
9109 	if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
9110 		params.link_sta_params.opmode_notif_used = true;
9111 		params.link_sta_params.opmode_notif =
9112 			nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
9113 	}
9114 
9115 	if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY])
9116 		params.link_sta_params.he_6ghz_capa =
9117 			nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]);
9118 
9119 	if (info->attrs[NL80211_ATTR_EML_CAPABILITY]) {
9120 		params.eml_cap_present = true;
9121 		params.eml_cap =
9122 			nla_get_u16(info->attrs[NL80211_ATTR_EML_CAPABILITY]);
9123 	}
9124 
9125 	if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT])
9126 		params.airtime_weight =
9127 			nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]);
9128 
9129 	if (params.airtime_weight &&
9130 	    !wiphy_ext_feature_isset(&rdev->wiphy,
9131 				     NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
9132 		return -EOPNOTSUPP;
9133 
9134 	err = nl80211_parse_sta_txpower_setting(info,
9135 						&params.link_sta_params.txpwr,
9136 						&params.link_sta_params.txpwr_set);
9137 	if (err)
9138 		return err;
9139 
9140 	/* Include parameters for TDLS peer (will check later) */
9141 	err = nl80211_set_station_tdls(info, &params);
9142 	if (err)
9143 		return err;
9144 
9145 	params.vlan = get_vlan(info, rdev);
9146 	if (IS_ERR(params.vlan))
9147 		return PTR_ERR(params.vlan);
9148 
9149 	switch (wdev->iftype) {
9150 	case NL80211_IFTYPE_AP:
9151 	case NL80211_IFTYPE_AP_VLAN:
9152 	case NL80211_IFTYPE_P2P_GO:
9153 	case NL80211_IFTYPE_P2P_CLIENT:
9154 	case NL80211_IFTYPE_STATION:
9155 	case NL80211_IFTYPE_ADHOC:
9156 	case NL80211_IFTYPE_MESH_POINT:
9157 	case NL80211_IFTYPE_NAN:
9158 	case NL80211_IFTYPE_NAN_DATA:
9159 		break;
9160 	default:
9161 		err = -EOPNOTSUPP;
9162 		goto out_put_vlan;
9163 	}
9164 
9165 	/* driver will call cfg80211_check_station_change() */
9166 	err = rdev_change_station(rdev, wdev, mac_addr, &params);
9167 
9168  out_put_vlan:
9169 	dev_put(params.vlan);
9170 
9171 	return err;
9172 }
9173 
9174 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
9175 {
9176 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9177 	int err;
9178 	struct wireless_dev *wdev = info->user_ptr[1];
9179 	struct net_device *dev = wdev->netdev;
9180 	struct station_parameters params;
9181 	u8 *mac_addr = NULL;
9182 	u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
9183 			 BIT(NL80211_STA_FLAG_ASSOCIATED);
9184 
9185 	memset(&params, 0, sizeof(params));
9186 
9187 	if (!dev && wdev->iftype != NL80211_IFTYPE_NAN)
9188 		return -EINVAL;
9189 
9190 	if (!rdev->ops->add_station)
9191 		return -EOPNOTSUPP;
9192 
9193 	if (!info->attrs[NL80211_ATTR_MAC])
9194 		return -EINVAL;
9195 
9196 	if (wdev->iftype == NL80211_IFTYPE_NAN ||
9197 	    wdev->iftype == NL80211_IFTYPE_NAN_DATA) {
9198 		if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
9199 			return -EINVAL;
9200 		if (wdev->iftype == NL80211_IFTYPE_NAN_DATA) {
9201 			if (!info->attrs[NL80211_ATTR_NAN_NMI_MAC])
9202 				return -EINVAL;
9203 
9204 			/* Only NMI stations receive the HT/VHT/HE capabilities */
9205 			if (info->attrs[NL80211_ATTR_HT_CAPABILITY] ||
9206 			    info->attrs[NL80211_ATTR_VHT_CAPABILITY] ||
9207 			    info->attrs[NL80211_ATTR_HE_CAPABILITY])
9208 				return -EINVAL;
9209 		}
9210 	} else {
9211 		if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
9212 			return -EINVAL;
9213 
9214 		if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
9215 			return -EINVAL;
9216 
9217 		if (!info->attrs[NL80211_ATTR_STA_AID] &&
9218 		    !info->attrs[NL80211_ATTR_PEER_AID])
9219 			return -EINVAL;
9220 	}
9221 
9222 	params.link_sta_params.link_id =
9223 		nl80211_link_id_or_invalid(info->attrs);
9224 
9225 	if (info->attrs[NL80211_ATTR_MLD_ADDR]) {
9226 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
9227 		params.link_sta_params.mld_mac = mac_addr;
9228 		params.link_sta_params.link_mac =
9229 			nla_data(info->attrs[NL80211_ATTR_MAC]);
9230 		if (!is_valid_ether_addr(params.link_sta_params.link_mac))
9231 			return -EINVAL;
9232 	} else {
9233 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
9234 	}
9235 
9236 	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
9237 		params.link_sta_params.supported_rates =
9238 			nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
9239 		params.link_sta_params.supported_rates_len =
9240 			nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
9241 	}
9242 
9243 	if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
9244 		params.listen_interval =
9245 			nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
9246 
9247 	if (info->attrs[NL80211_ATTR_VLAN_ID])
9248 		params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
9249 
9250 	if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
9251 		params.support_p2p_ps =
9252 			nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
9253 	} else {
9254 		/*
9255 		 * if not specified, assume it's supported for P2P GO interface,
9256 		 * and is NOT supported for AP interface
9257 		 */
9258 		params.support_p2p_ps =
9259 			wdev->iftype == NL80211_IFTYPE_P2P_GO;
9260 	}
9261 
9262 	if (info->attrs[NL80211_ATTR_PEER_AID])
9263 		params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
9264 	else if (info->attrs[NL80211_ATTR_STA_AID])
9265 		params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
9266 
9267 	if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
9268 		params.capability =
9269 			nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
9270 		params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
9271 	}
9272 
9273 	if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
9274 		params.ext_capab =
9275 			nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
9276 		params.ext_capab_len =
9277 			nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
9278 	}
9279 
9280 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
9281 		params.link_sta_params.ht_capa =
9282 			nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
9283 
9284 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
9285 		params.link_sta_params.vht_capa =
9286 			nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
9287 
9288 	if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) {
9289 		params.link_sta_params.he_capa =
9290 			nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
9291 		params.link_sta_params.he_capa_len =
9292 			nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
9293 
9294 		if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) {
9295 			params.link_sta_params.eht_capa =
9296 				nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
9297 			params.link_sta_params.eht_capa_len =
9298 				nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
9299 
9300 			if (!ieee80211_eht_capa_size_ok((const u8 *)params.link_sta_params.he_capa,
9301 							(const u8 *)params.link_sta_params.eht_capa,
9302 							params.link_sta_params.eht_capa_len,
9303 							false))
9304 				return -EINVAL;
9305 		}
9306 	}
9307 
9308 	if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) {
9309 		if (!params.link_sta_params.eht_capa)
9310 			return -EINVAL;
9311 
9312 		params.link_sta_params.uhr_capa =
9313 			nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]);
9314 		params.link_sta_params.uhr_capa_len =
9315 			nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]);
9316 	}
9317 
9318 	if (info->attrs[NL80211_ATTR_EML_CAPABILITY]) {
9319 		params.eml_cap_present = true;
9320 		params.eml_cap =
9321 			nla_get_u16(info->attrs[NL80211_ATTR_EML_CAPABILITY]);
9322 	}
9323 
9324 	if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY])
9325 		params.link_sta_params.he_6ghz_capa =
9326 			nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]);
9327 
9328 	if (info->attrs[NL80211_ATTR_S1G_CAPABILITY])
9329 		params.link_sta_params.s1g_capa =
9330 			nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]);
9331 
9332 	if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
9333 		params.link_sta_params.opmode_notif_used = true;
9334 		params.link_sta_params.opmode_notif =
9335 			nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
9336 	}
9337 
9338 	if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
9339 		params.plink_action =
9340 			nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
9341 
9342 	if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT])
9343 		params.airtime_weight =
9344 			nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]);
9345 
9346 	if (params.airtime_weight &&
9347 	    !wiphy_ext_feature_isset(&rdev->wiphy,
9348 				     NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
9349 		return -EOPNOTSUPP;
9350 
9351 	err = nl80211_parse_sta_txpower_setting(info,
9352 						&params.link_sta_params.txpwr,
9353 						&params.link_sta_params.txpwr_set);
9354 	if (err)
9355 		return err;
9356 
9357 	err = nl80211_parse_sta_channel_info(info, &params);
9358 	if (err)
9359 		return err;
9360 
9361 	err = nl80211_parse_sta_wme(info, &params);
9362 	if (err)
9363 		return err;
9364 
9365 	if (parse_station_flags(info, wdev->iftype, &params))
9366 		return -EINVAL;
9367 
9368 	/* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT
9369 	 * as userspace might just pass through the capabilities from the IEs
9370 	 * directly, rather than enforcing this restriction and returning an
9371 	 * error in this case.
9372 	 */
9373 	if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) {
9374 		params.link_sta_params.ht_capa = NULL;
9375 		params.link_sta_params.vht_capa = NULL;
9376 
9377 		/* HE, EHT and UHR require WME */
9378 		if (params.link_sta_params.he_capa_len ||
9379 		    params.link_sta_params.he_6ghz_capa ||
9380 		    params.link_sta_params.eht_capa_len ||
9381 		    params.link_sta_params.uhr_capa_len)
9382 			return -EINVAL;
9383 	}
9384 
9385 	if (wdev->iftype == NL80211_IFTYPE_NAN ||
9386 	    wdev->iftype == NL80211_IFTYPE_NAN_DATA) {
9387 		if (params.sta_modify_mask & STATION_PARAM_APPLY_UAPSD)
9388 			return -EINVAL;
9389 		/* NAN NMI station must be added in associated or authorized state */
9390 		if (!(params.sta_flags_set & (BIT(NL80211_STA_FLAG_ASSOCIATED) |
9391 					      BIT(NL80211_STA_FLAG_AUTHENTICATED))))
9392 			return -EINVAL;
9393 	}
9394 
9395 	/* Ensure that HT/VHT capabilities are not set for 6 GHz HE STA */
9396 	if (params.link_sta_params.he_6ghz_capa &&
9397 	    (params.link_sta_params.ht_capa || params.link_sta_params.vht_capa))
9398 		return -EINVAL;
9399 
9400 	/* When you run into this, adjust the code below for the new flag */
9401 	BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 8);
9402 
9403 	switch (wdev->iftype) {
9404 	case NL80211_IFTYPE_AP:
9405 	case NL80211_IFTYPE_AP_VLAN:
9406 	case NL80211_IFTYPE_P2P_GO:
9407 		/* ignore WME attributes if iface/sta is not capable */
9408 		if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) ||
9409 		    !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME)))
9410 			params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
9411 
9412 		/* TDLS peers cannot be added */
9413 		if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
9414 		    info->attrs[NL80211_ATTR_PEER_AID])
9415 			return -EINVAL;
9416 		/* but don't bother the driver with it */
9417 		params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
9418 
9419 		/* allow authenticated/associated only if driver handles it */
9420 		if (!(rdev->wiphy.features &
9421 				NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
9422 		    params.sta_flags_mask & auth_assoc)
9423 			return -EINVAL;
9424 
9425 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
9426 					     NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT) &&
9427 		    params.sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU))
9428 			return -EINVAL;
9429 
9430 		/* Older userspace, or userspace wanting to be compatible with
9431 		 * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth
9432 		 * and assoc flags in the mask, but assumes the station will be
9433 		 * added as associated anyway since this was the required driver
9434 		 * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was
9435 		 * introduced.
9436 		 * In order to not bother drivers with this quirk in the API
9437 		 * set the flags in both the mask and set for new stations in
9438 		 * this case.
9439 		 */
9440 		if (!(params.sta_flags_mask & auth_assoc)) {
9441 			params.sta_flags_mask |= auth_assoc;
9442 			params.sta_flags_set |= auth_assoc;
9443 		}
9444 
9445 		/* must be last in here for error handling */
9446 		params.vlan = get_vlan(info, rdev);
9447 		if (IS_ERR(params.vlan))
9448 			return PTR_ERR(params.vlan);
9449 		break;
9450 	case NL80211_IFTYPE_MESH_POINT:
9451 		/* ignore uAPSD data */
9452 		params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
9453 
9454 		/* associated is disallowed */
9455 		if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED))
9456 			return -EINVAL;
9457 		/* TDLS peers cannot be added */
9458 		if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
9459 		    info->attrs[NL80211_ATTR_PEER_AID])
9460 			return -EINVAL;
9461 		break;
9462 	case NL80211_IFTYPE_STATION:
9463 	case NL80211_IFTYPE_P2P_CLIENT:
9464 		/* ignore uAPSD data */
9465 		params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
9466 
9467 		/* these are disallowed */
9468 		if (params.sta_flags_mask &
9469 				(BIT(NL80211_STA_FLAG_ASSOCIATED) |
9470 				 BIT(NL80211_STA_FLAG_AUTHENTICATED)))
9471 			return -EINVAL;
9472 		/* Only TDLS peers can be added */
9473 		if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
9474 			return -EINVAL;
9475 		/* Can only add if TDLS ... */
9476 		if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS))
9477 			return -EOPNOTSUPP;
9478 		/* ... with external setup is supported */
9479 		if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP))
9480 			return -EOPNOTSUPP;
9481 		/*
9482 		 * Older wpa_supplicant versions always mark the TDLS peer
9483 		 * as authorized, but it shouldn't yet be.
9484 		 */
9485 		params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED);
9486 		break;
9487 	case NL80211_IFTYPE_NAN:
9488 		break;
9489 	case NL80211_IFTYPE_NAN_DATA:
9490 		params.nmi_mac = nla_data(info->attrs[NL80211_ATTR_NAN_NMI_MAC]);
9491 		break;
9492 	default:
9493 		return -EOPNOTSUPP;
9494 	}
9495 
9496 	/* be aware of params.vlan when changing code here */
9497 
9498 	if (wdev->valid_links) {
9499 		if (params.link_sta_params.link_id < 0) {
9500 			err = -EINVAL;
9501 			goto out;
9502 		}
9503 		if (!(wdev->valid_links & BIT(params.link_sta_params.link_id))) {
9504 			err = -ENOLINK;
9505 			goto out;
9506 		}
9507 	} else {
9508 		if (params.link_sta_params.link_id >= 0) {
9509 			err = -EINVAL;
9510 			goto out;
9511 		}
9512 	}
9513 
9514 	params.epp_peer =
9515 		nla_get_flag(info->attrs[NL80211_ATTR_EPP_PEER]);
9516 
9517 	err = rdev_add_station(rdev, wdev, mac_addr, &params);
9518 out:
9519 	dev_put(params.vlan);
9520 	return err;
9521 }
9522 
9523 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
9524 {
9525 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9526 	struct wireless_dev *wdev = info->user_ptr[1];
9527 	struct net_device *dev = wdev->netdev;
9528 	struct station_del_parameters params;
9529 	int link_id = nl80211_link_id_or_invalid(info->attrs);
9530 
9531 	memset(&params, 0, sizeof(params));
9532 
9533 	if (!dev && wdev->iftype != NL80211_IFTYPE_NAN)
9534 		return -EINVAL;
9535 
9536 	if (info->attrs[NL80211_ATTR_MAC])
9537 		params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]);
9538 
9539 	switch (wdev->iftype) {
9540 	case NL80211_IFTYPE_AP:
9541 	case NL80211_IFTYPE_AP_VLAN:
9542 	case NL80211_IFTYPE_MESH_POINT:
9543 	case NL80211_IFTYPE_P2P_GO:
9544 	case NL80211_IFTYPE_NAN:
9545 	case NL80211_IFTYPE_NAN_DATA:
9546 		/* always accept these */
9547 		break;
9548 	case NL80211_IFTYPE_ADHOC:
9549 		/* conditionally accept */
9550 		if (wiphy_ext_feature_isset(&rdev->wiphy,
9551 					    NL80211_EXT_FEATURE_DEL_IBSS_STA))
9552 			break;
9553 		return -EINVAL;
9554 	default:
9555 		return -EINVAL;
9556 	}
9557 
9558 	if (!rdev->ops->del_station)
9559 		return -EOPNOTSUPP;
9560 
9561 	if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) {
9562 		params.subtype =
9563 			nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]);
9564 		if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 &&
9565 		    params.subtype != IEEE80211_STYPE_DEAUTH >> 4)
9566 			return -EINVAL;
9567 	} else {
9568 		/* Default to Deauthentication frame */
9569 		params.subtype = IEEE80211_STYPE_DEAUTH >> 4;
9570 	}
9571 
9572 	if (info->attrs[NL80211_ATTR_REASON_CODE]) {
9573 		params.reason_code =
9574 			nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
9575 		if (params.reason_code == 0)
9576 			return -EINVAL; /* 0 is reserved */
9577 	} else {
9578 		/* Default to reason code 2 */
9579 		params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID;
9580 	}
9581 
9582 	/* Link ID not expected in case of non-ML operation */
9583 	if (!wdev->valid_links && link_id != -1)
9584 		return -EINVAL;
9585 
9586 	/* If given, a valid link ID should be passed during MLO */
9587 	if (wdev->valid_links && link_id >= 0 &&
9588 	    !(wdev->valid_links & BIT(link_id)))
9589 		return -EINVAL;
9590 
9591 	params.link_id = link_id;
9592 
9593 	return rdev_del_station(rdev, wdev, &params);
9594 }
9595 
9596 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq,
9597 				int flags, struct net_device *dev,
9598 				u8 *dst, u8 *next_hop,
9599 				struct mpath_info *pinfo)
9600 {
9601 	void *hdr;
9602 	struct nlattr *pinfoattr;
9603 
9604 	hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH);
9605 	if (!hdr)
9606 		return -1;
9607 
9608 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
9609 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) ||
9610 	    nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) ||
9611 	    nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation))
9612 		goto nla_put_failure;
9613 
9614 	pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MPATH_INFO);
9615 	if (!pinfoattr)
9616 		goto nla_put_failure;
9617 	if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) &&
9618 	    nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN,
9619 			pinfo->frame_qlen))
9620 		goto nla_put_failure;
9621 	if (((pinfo->filled & MPATH_INFO_SN) &&
9622 	     nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) ||
9623 	    ((pinfo->filled & MPATH_INFO_METRIC) &&
9624 	     nla_put_u32(msg, NL80211_MPATH_INFO_METRIC,
9625 			 pinfo->metric)) ||
9626 	    ((pinfo->filled & MPATH_INFO_EXPTIME) &&
9627 	     nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME,
9628 			 pinfo->exptime)) ||
9629 	    ((pinfo->filled & MPATH_INFO_FLAGS) &&
9630 	     nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS,
9631 			pinfo->flags)) ||
9632 	    ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) &&
9633 	     nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
9634 			 pinfo->discovery_timeout)) ||
9635 	    ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) &&
9636 	     nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES,
9637 			pinfo->discovery_retries)) ||
9638 	    ((pinfo->filled & MPATH_INFO_HOP_COUNT) &&
9639 	     nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT,
9640 			pinfo->hop_count)) ||
9641 	    ((pinfo->filled & MPATH_INFO_PATH_CHANGE) &&
9642 	     nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE,
9643 			 pinfo->path_change_count)))
9644 		goto nla_put_failure;
9645 
9646 	nla_nest_end(msg, pinfoattr);
9647 
9648 	genlmsg_end(msg, hdr);
9649 	return 0;
9650 
9651  nla_put_failure:
9652 	genlmsg_cancel(msg, hdr);
9653 	return -EMSGSIZE;
9654 }
9655 
9656 static int nl80211_dump_mpath(struct sk_buff *skb,
9657 			      struct netlink_callback *cb)
9658 {
9659 	struct mpath_info pinfo;
9660 	struct cfg80211_registered_device *rdev;
9661 	struct wireless_dev *wdev;
9662 	u8 dst[ETH_ALEN];
9663 	u8 next_hop[ETH_ALEN];
9664 	int path_idx = cb->args[2];
9665 	int err;
9666 
9667 	err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL);
9668 	if (err)
9669 		return err;
9670 	/* nl80211_prepare_wdev_dump acquired it in the successful case */
9671 	__acquire(&rdev->wiphy.mtx);
9672 
9673 	if (!rdev->ops->dump_mpath) {
9674 		err = -EOPNOTSUPP;
9675 		goto out_err;
9676 	}
9677 
9678 	if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
9679 		err = -EOPNOTSUPP;
9680 		goto out_err;
9681 	}
9682 
9683 	while (1) {
9684 		err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst,
9685 				      next_hop, &pinfo);
9686 		if (err == -ENOENT)
9687 			break;
9688 		if (err)
9689 			goto out_err;
9690 
9691 		if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
9692 				       cb->nlh->nlmsg_seq, NLM_F_MULTI,
9693 				       wdev->netdev, dst, next_hop,
9694 				       &pinfo) < 0)
9695 			goto out;
9696 
9697 		path_idx++;
9698 	}
9699 
9700  out:
9701 	cb->args[2] = path_idx;
9702 	err = skb->len;
9703  out_err:
9704 	wiphy_unlock(&rdev->wiphy);
9705 	return err;
9706 }
9707 
9708 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
9709 {
9710 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9711 	int err;
9712 	struct net_device *dev = info->user_ptr[1];
9713 	struct mpath_info pinfo;
9714 	struct sk_buff *msg;
9715 	u8 *dst = NULL;
9716 	u8 next_hop[ETH_ALEN];
9717 
9718 	memset(&pinfo, 0, sizeof(pinfo));
9719 
9720 	if (!info->attrs[NL80211_ATTR_MAC])
9721 		return -EINVAL;
9722 
9723 	dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
9724 
9725 	if (!rdev->ops->get_mpath)
9726 		return -EOPNOTSUPP;
9727 
9728 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
9729 		return -EOPNOTSUPP;
9730 
9731 	err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo);
9732 	if (err)
9733 		return err;
9734 
9735 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9736 	if (!msg)
9737 		return -ENOMEM;
9738 
9739 	if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
9740 				 dev, dst, next_hop, &pinfo) < 0) {
9741 		nlmsg_free(msg);
9742 		return -ENOBUFS;
9743 	}
9744 
9745 	return genlmsg_reply(msg, info);
9746 }
9747 
9748 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
9749 {
9750 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9751 	struct net_device *dev = info->user_ptr[1];
9752 	u8 *dst = NULL;
9753 	u8 *next_hop = NULL;
9754 
9755 	if (!info->attrs[NL80211_ATTR_MAC])
9756 		return -EINVAL;
9757 
9758 	if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
9759 		return -EINVAL;
9760 
9761 	dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
9762 	next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
9763 
9764 	if (!rdev->ops->change_mpath)
9765 		return -EOPNOTSUPP;
9766 
9767 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
9768 		return -EOPNOTSUPP;
9769 
9770 	return rdev_change_mpath(rdev, dev, dst, next_hop);
9771 }
9772 
9773 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
9774 {
9775 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9776 	struct net_device *dev = info->user_ptr[1];
9777 	u8 *dst = NULL;
9778 	u8 *next_hop = NULL;
9779 
9780 	if (!info->attrs[NL80211_ATTR_MAC])
9781 		return -EINVAL;
9782 
9783 	if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
9784 		return -EINVAL;
9785 
9786 	dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
9787 	next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
9788 
9789 	if (!rdev->ops->add_mpath)
9790 		return -EOPNOTSUPP;
9791 
9792 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
9793 		return -EOPNOTSUPP;
9794 
9795 	return rdev_add_mpath(rdev, dev, dst, next_hop);
9796 }
9797 
9798 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
9799 {
9800 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9801 	struct net_device *dev = info->user_ptr[1];
9802 	u8 *dst = NULL;
9803 
9804 	if (info->attrs[NL80211_ATTR_MAC])
9805 		dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
9806 
9807 	if (!rdev->ops->del_mpath)
9808 		return -EOPNOTSUPP;
9809 
9810 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
9811 		return -EOPNOTSUPP;
9812 
9813 	return rdev_del_mpath(rdev, dev, dst);
9814 }
9815 
9816 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info)
9817 {
9818 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9819 	int err;
9820 	struct net_device *dev = info->user_ptr[1];
9821 	struct mpath_info pinfo;
9822 	struct sk_buff *msg;
9823 	u8 *dst = NULL;
9824 	u8 mpp[ETH_ALEN];
9825 
9826 	memset(&pinfo, 0, sizeof(pinfo));
9827 
9828 	if (!info->attrs[NL80211_ATTR_MAC])
9829 		return -EINVAL;
9830 
9831 	dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
9832 
9833 	if (!rdev->ops->get_mpp)
9834 		return -EOPNOTSUPP;
9835 
9836 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
9837 		return -EOPNOTSUPP;
9838 
9839 	err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo);
9840 	if (err)
9841 		return err;
9842 
9843 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9844 	if (!msg)
9845 		return -ENOMEM;
9846 
9847 	if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
9848 			       dev, dst, mpp, &pinfo) < 0) {
9849 		nlmsg_free(msg);
9850 		return -ENOBUFS;
9851 	}
9852 
9853 	return genlmsg_reply(msg, info);
9854 }
9855 
9856 static int nl80211_dump_mpp(struct sk_buff *skb,
9857 			    struct netlink_callback *cb)
9858 {
9859 	struct mpath_info pinfo;
9860 	struct cfg80211_registered_device *rdev;
9861 	struct wireless_dev *wdev;
9862 	u8 dst[ETH_ALEN];
9863 	u8 mpp[ETH_ALEN];
9864 	int path_idx = cb->args[2];
9865 	int err;
9866 
9867 	err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL);
9868 	if (err)
9869 		return err;
9870 	/* nl80211_prepare_wdev_dump acquired it in the successful case */
9871 	__acquire(&rdev->wiphy.mtx);
9872 
9873 	if (!rdev->ops->dump_mpp) {
9874 		err = -EOPNOTSUPP;
9875 		goto out_err;
9876 	}
9877 
9878 	if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
9879 		err = -EOPNOTSUPP;
9880 		goto out_err;
9881 	}
9882 
9883 	while (1) {
9884 		err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst,
9885 				    mpp, &pinfo);
9886 		if (err == -ENOENT)
9887 			break;
9888 		if (err)
9889 			goto out_err;
9890 
9891 		if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
9892 				       cb->nlh->nlmsg_seq, NLM_F_MULTI,
9893 				       wdev->netdev, dst, mpp,
9894 				       &pinfo) < 0)
9895 			goto out;
9896 
9897 		path_idx++;
9898 	}
9899 
9900  out:
9901 	cb->args[2] = path_idx;
9902 	err = skb->len;
9903  out_err:
9904 	wiphy_unlock(&rdev->wiphy);
9905 	return err;
9906 }
9907 
9908 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
9909 {
9910 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9911 	struct net_device *dev = info->user_ptr[1];
9912 	struct bss_parameters params;
9913 	u32 bss_param_support = rdev->wiphy.bss_param_support;
9914 	u32 changed = 0;
9915 	bool strict;
9916 
9917 	memset(&params, 0, sizeof(params));
9918 	params.link_id = nl80211_link_id_or_invalid(info->attrs);
9919 	/* default to not changing parameters */
9920 	params.use_cts_prot = -1;
9921 	params.use_short_preamble = -1;
9922 	params.use_short_slot_time = -1;
9923 	params.ap_isolate = -1;
9924 	params.ht_opmode = -1;
9925 	params.p2p_ctwindow = -1;
9926 	params.p2p_opp_ps = -1;
9927 
9928 	strict = nla_get_flag(info->attrs[NL80211_ATTR_BSS_PARAM]);
9929 	if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) {
9930 		if (strict && !(bss_param_support & WIPHY_BSS_PARAM_CTS_PROT))
9931 			return -EINVAL;
9932 		params.use_cts_prot =
9933 		    nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
9934 		changed |= WIPHY_BSS_PARAM_CTS_PROT;
9935 	}
9936 	if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) {
9937 		if (strict &&
9938 		    !(bss_param_support & WIPHY_BSS_PARAM_SHORT_PREAMBLE))
9939 			return -EINVAL;
9940 		params.use_short_preamble =
9941 		    nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
9942 		changed |= WIPHY_BSS_PARAM_SHORT_PREAMBLE;
9943 	}
9944 	if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) {
9945 		if (strict &&
9946 		    !(bss_param_support & WIPHY_BSS_PARAM_SHORT_SLOT_TIME))
9947 			return -EINVAL;
9948 		params.use_short_slot_time =
9949 		    nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
9950 		changed |= WIPHY_BSS_PARAM_SHORT_SLOT_TIME;
9951 	}
9952 	if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
9953 		if (strict &&
9954 		    !(bss_param_support & WIPHY_BSS_PARAM_BASIC_RATES))
9955 			return -EINVAL;
9956 		params.basic_rates =
9957 			nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
9958 		params.basic_rates_len =
9959 			nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
9960 		changed |= WIPHY_BSS_PARAM_BASIC_RATES;
9961 	}
9962 	if (info->attrs[NL80211_ATTR_AP_ISOLATE]) {
9963 		if (strict && !(bss_param_support & WIPHY_BSS_PARAM_AP_ISOLATE))
9964 			return -EINVAL;
9965 		params.ap_isolate =
9966 			!!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]);
9967 		changed |= WIPHY_BSS_PARAM_AP_ISOLATE;
9968 	}
9969 	if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) {
9970 		if (strict && !(bss_param_support & WIPHY_BSS_PARAM_HT_OPMODE))
9971 			return -EINVAL;
9972 		params.ht_opmode =
9973 			nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]);
9974 		changed |= WIPHY_BSS_PARAM_HT_OPMODE;
9975 	}
9976 
9977 	if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
9978 		if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
9979 			return -EINVAL;
9980 		params.p2p_ctwindow =
9981 			nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
9982 		if (params.p2p_ctwindow != 0 &&
9983 		    !(bss_param_support & WIPHY_BSS_PARAM_P2P_CTWINDOW))
9984 			return -EINVAL;
9985 		changed |= WIPHY_BSS_PARAM_P2P_CTWINDOW;
9986 	}
9987 
9988 	if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
9989 		u8 tmp;
9990 
9991 		if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
9992 			return -EINVAL;
9993 		tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
9994 		if (tmp && !(bss_param_support & WIPHY_BSS_PARAM_P2P_OPPPS))
9995 			return -EINVAL;
9996 		params.p2p_opp_ps = tmp;
9997 		if (params.p2p_opp_ps &&
9998 		    !(rdev->wiphy.bss_param_support & WIPHY_BSS_PARAM_P2P_OPPPS))
9999 			return -EINVAL;
10000 	}
10001 
10002 	if (!rdev->ops->change_bss)
10003 		return -EOPNOTSUPP;
10004 
10005 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
10006 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
10007 		return -EOPNOTSUPP;
10008 
10009 	changed &= rdev->wiphy.bss_param_support;
10010 	if (!changed)
10011 		return 0;
10012 
10013 	return rdev_change_bss(rdev, dev, &params);
10014 }
10015 
10016 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
10017 {
10018 	char *data = NULL;
10019 	bool is_indoor;
10020 	enum nl80211_user_reg_hint_type user_reg_hint_type;
10021 	u32 owner_nlportid;
10022 
10023 	/*
10024 	 * You should only get this when cfg80211 hasn't yet initialized
10025 	 * completely when built-in to the kernel right between the time
10026 	 * window between nl80211_init() and regulatory_init(), if that is
10027 	 * even possible.
10028 	 */
10029 	if (unlikely(!rcu_access_pointer(cfg80211_regdomain)))
10030 		return -EINPROGRESS;
10031 
10032 	user_reg_hint_type =
10033 		nla_get_u32_default(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE],
10034 				    NL80211_USER_REG_HINT_USER);
10035 
10036 	switch (user_reg_hint_type) {
10037 	case NL80211_USER_REG_HINT_USER:
10038 	case NL80211_USER_REG_HINT_CELL_BASE:
10039 		if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
10040 			return -EINVAL;
10041 
10042 		data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
10043 		return regulatory_hint_user(data, user_reg_hint_type);
10044 	case NL80211_USER_REG_HINT_INDOOR:
10045 		if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
10046 			owner_nlportid = info->snd_portid;
10047 			is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR];
10048 		} else {
10049 			owner_nlportid = 0;
10050 			is_indoor = true;
10051 		}
10052 
10053 		regulatory_hint_indoor(is_indoor, owner_nlportid);
10054 		return 0;
10055 	default:
10056 		return -EINVAL;
10057 	}
10058 }
10059 
10060 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info)
10061 {
10062 	return reg_reload_regdb();
10063 }
10064 
10065 static int nl80211_get_mesh_config(struct sk_buff *skb,
10066 				   struct genl_info *info)
10067 {
10068 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10069 	struct net_device *dev = info->user_ptr[1];
10070 	struct wireless_dev *wdev = dev->ieee80211_ptr;
10071 	struct mesh_config cur_params;
10072 	int err = 0;
10073 	void *hdr;
10074 	struct nlattr *pinfoattr;
10075 	struct sk_buff *msg;
10076 
10077 	if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
10078 		return -EOPNOTSUPP;
10079 
10080 	if (!rdev->ops->get_mesh_config)
10081 		return -EOPNOTSUPP;
10082 
10083 	/* If not connected, get default parameters */
10084 	if (!wdev->u.mesh.id_len)
10085 		memcpy(&cur_params, &default_mesh_config, sizeof(cur_params));
10086 	else
10087 		err = rdev_get_mesh_config(rdev, dev, &cur_params);
10088 
10089 	if (err)
10090 		return err;
10091 
10092 	/* Draw up a netlink message to send back */
10093 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10094 	if (!msg)
10095 		return -ENOMEM;
10096 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10097 			     NL80211_CMD_GET_MESH_CONFIG);
10098 	if (!hdr)
10099 		goto out;
10100 	pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MESH_CONFIG);
10101 	if (!pinfoattr)
10102 		goto nla_put_failure;
10103 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10104 	    nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT,
10105 			cur_params.dot11MeshRetryTimeout) ||
10106 	    nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT,
10107 			cur_params.dot11MeshConfirmTimeout) ||
10108 	    nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT,
10109 			cur_params.dot11MeshHoldingTimeout) ||
10110 	    nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
10111 			cur_params.dot11MeshMaxPeerLinks) ||
10112 	    nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES,
10113 		       cur_params.dot11MeshMaxRetries) ||
10114 	    nla_put_u8(msg, NL80211_MESHCONF_TTL,
10115 		       cur_params.dot11MeshTTL) ||
10116 	    nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL,
10117 		       cur_params.element_ttl) ||
10118 	    nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
10119 		       cur_params.auto_open_plinks) ||
10120 	    nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
10121 			cur_params.dot11MeshNbrOffsetMaxNeighbor) ||
10122 	    nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
10123 		       cur_params.dot11MeshHWMPmaxPREQretries) ||
10124 	    nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME,
10125 			cur_params.path_refresh_time) ||
10126 	    nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
10127 			cur_params.min_discovery_timeout) ||
10128 	    nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
10129 			cur_params.dot11MeshHWMPactivePathTimeout) ||
10130 	    nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
10131 			cur_params.dot11MeshHWMPpreqMinInterval) ||
10132 	    nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
10133 			cur_params.dot11MeshHWMPperrMinInterval) ||
10134 	    nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
10135 			cur_params.dot11MeshHWMPnetDiameterTraversalTime) ||
10136 	    nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE,
10137 		       cur_params.dot11MeshHWMPRootMode) ||
10138 	    nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
10139 			cur_params.dot11MeshHWMPRannInterval) ||
10140 	    nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
10141 		       cur_params.dot11MeshGateAnnouncementProtocol) ||
10142 	    nla_put_u8(msg, NL80211_MESHCONF_FORWARDING,
10143 		       cur_params.dot11MeshForwarding) ||
10144 	    nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD,
10145 			cur_params.rssi_threshold) ||
10146 	    nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE,
10147 			cur_params.ht_opmode) ||
10148 	    nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
10149 			cur_params.dot11MeshHWMPactivePathToRootTimeout) ||
10150 	    nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
10151 			cur_params.dot11MeshHWMProotInterval) ||
10152 	    nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
10153 			cur_params.dot11MeshHWMPconfirmationInterval) ||
10154 	    nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE,
10155 			cur_params.power_mode) ||
10156 	    nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW,
10157 			cur_params.dot11MeshAwakeWindowDuration) ||
10158 	    nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT,
10159 			cur_params.plink_timeout) ||
10160 	    nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE,
10161 		       cur_params.dot11MeshConnectedToMeshGate) ||
10162 	    nla_put_u8(msg, NL80211_MESHCONF_NOLEARN,
10163 		       cur_params.dot11MeshNolearn) ||
10164 	    nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_AS,
10165 		       cur_params.dot11MeshConnectedToAuthServer))
10166 		goto nla_put_failure;
10167 	nla_nest_end(msg, pinfoattr);
10168 	genlmsg_end(msg, hdr);
10169 	return genlmsg_reply(msg, info);
10170 
10171  nla_put_failure:
10172  out:
10173 	nlmsg_free(msg);
10174 	return -ENOBUFS;
10175 }
10176 
10177 static const struct nla_policy
10178 nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = {
10179 	[NL80211_MESHCONF_RETRY_TIMEOUT] =
10180 		NLA_POLICY_RANGE(NLA_U16, 1, 255),
10181 	[NL80211_MESHCONF_CONFIRM_TIMEOUT] =
10182 		NLA_POLICY_RANGE(NLA_U16, 1, 255),
10183 	[NL80211_MESHCONF_HOLDING_TIMEOUT] =
10184 		NLA_POLICY_RANGE(NLA_U16, 1, 255),
10185 	[NL80211_MESHCONF_MAX_PEER_LINKS] =
10186 		NLA_POLICY_RANGE(NLA_U16, 0, 255),
10187 	[NL80211_MESHCONF_MAX_RETRIES] = NLA_POLICY_MAX(NLA_U8, 16),
10188 	[NL80211_MESHCONF_TTL] = NLA_POLICY_MIN(NLA_U8, 1),
10189 	[NL80211_MESHCONF_ELEMENT_TTL] = NLA_POLICY_MIN(NLA_U8, 1),
10190 	[NL80211_MESHCONF_AUTO_OPEN_PLINKS] = NLA_POLICY_MAX(NLA_U8, 1),
10191 	[NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] =
10192 		NLA_POLICY_RANGE(NLA_U32, 1, 255),
10193 	[NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 },
10194 	[NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 },
10195 	[NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = NLA_POLICY_MIN(NLA_U16, 1),
10196 	[NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
10197 	[NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] =
10198 		NLA_POLICY_MIN(NLA_U16, 1),
10199 	[NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] =
10200 		NLA_POLICY_MIN(NLA_U16, 1),
10201 	[NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] =
10202 		NLA_POLICY_MIN(NLA_U16, 1),
10203 	[NL80211_MESHCONF_HWMP_ROOTMODE] = NLA_POLICY_MAX(NLA_U8, 4),
10204 	[NL80211_MESHCONF_HWMP_RANN_INTERVAL] =
10205 		NLA_POLICY_MIN(NLA_U16, 1),
10206 	[NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = NLA_POLICY_MAX(NLA_U8, 1),
10207 	[NL80211_MESHCONF_FORWARDING] = NLA_POLICY_MAX(NLA_U8, 1),
10208 	[NL80211_MESHCONF_RSSI_THRESHOLD] =
10209 		NLA_POLICY_RANGE(NLA_S32, -255, 0),
10210 	[NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 },
10211 	[NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 },
10212 	[NL80211_MESHCONF_HWMP_ROOT_INTERVAL] =
10213 		NLA_POLICY_MIN(NLA_U16, 1),
10214 	[NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] =
10215 		NLA_POLICY_MIN(NLA_U16, 1),
10216 	[NL80211_MESHCONF_POWER_MODE] =
10217 		NLA_POLICY_RANGE(NLA_U32,
10218 				 NL80211_MESH_POWER_ACTIVE,
10219 				 NL80211_MESH_POWER_MAX),
10220 	[NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 },
10221 	[NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 },
10222 	[NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
10223 	[NL80211_MESHCONF_NOLEARN] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
10224 	[NL80211_MESHCONF_CONNECTED_TO_AS] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
10225 };
10226 
10227 static const struct nla_policy
10228 	nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
10229 	[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 },
10230 	[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
10231 	[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
10232 	[NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
10233 	[NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 },
10234 	[NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG },
10235 	[NL80211_MESH_SETUP_IE] =
10236 		NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
10237 				       IEEE80211_MAX_DATA_LEN),
10238 	[NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG },
10239 };
10240 
10241 static int nl80211_parse_mesh_config(struct genl_info *info,
10242 				     struct mesh_config *cfg,
10243 				     u32 *mask_out)
10244 {
10245 	struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1];
10246 	u32 mask = 0;
10247 	u16 ht_opmode;
10248 
10249 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, mask, attr, fn)	\
10250 do {									\
10251 	if (tb[attr]) {							\
10252 		cfg->param = fn(tb[attr]);				\
10253 		mask |= BIT((attr) - 1);				\
10254 	}								\
10255 } while (0)
10256 
10257 	if (!info->attrs[NL80211_ATTR_MESH_CONFIG])
10258 		return -EINVAL;
10259 	if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack))
10260 		return -EINVAL;
10261 
10262 	/* This makes sure that there aren't more than 32 mesh config
10263 	 * parameters (otherwise our bitfield scheme would not work.) */
10264 	BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
10265 
10266 	/* Fill in the params struct */
10267 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, mask,
10268 				  NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16);
10269 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, mask,
10270 				  NL80211_MESHCONF_CONFIRM_TIMEOUT,
10271 				  nla_get_u16);
10272 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, mask,
10273 				  NL80211_MESHCONF_HOLDING_TIMEOUT,
10274 				  nla_get_u16);
10275 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, mask,
10276 				  NL80211_MESHCONF_MAX_PEER_LINKS,
10277 				  nla_get_u16);
10278 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, mask,
10279 				  NL80211_MESHCONF_MAX_RETRIES, nla_get_u8);
10280 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, mask,
10281 				  NL80211_MESHCONF_TTL, nla_get_u8);
10282 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, mask,
10283 				  NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8);
10284 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, mask,
10285 				  NL80211_MESHCONF_AUTO_OPEN_PLINKS,
10286 				  nla_get_u8);
10287 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor,
10288 				  mask,
10289 				  NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
10290 				  nla_get_u32);
10291 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, mask,
10292 				  NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
10293 				  nla_get_u8);
10294 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, mask,
10295 				  NL80211_MESHCONF_PATH_REFRESH_TIME,
10296 				  nla_get_u32);
10297 	if (mask & BIT(NL80211_MESHCONF_PATH_REFRESH_TIME) &&
10298 	    (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535))
10299 		return -EINVAL;
10300 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, mask,
10301 				  NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
10302 				  nla_get_u16);
10303 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout,
10304 				  mask,
10305 				  NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
10306 				  nla_get_u32);
10307 	if (mask & BIT(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT) &&
10308 	    (cfg->dot11MeshHWMPactivePathTimeout < 1 ||
10309 	     cfg->dot11MeshHWMPactivePathTimeout > 65535))
10310 		return -EINVAL;
10311 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, mask,
10312 				  NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
10313 				  nla_get_u16);
10314 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, mask,
10315 				  NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
10316 				  nla_get_u16);
10317 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
10318 				  dot11MeshHWMPnetDiameterTraversalTime, mask,
10319 				  NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
10320 				  nla_get_u16);
10321 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, mask,
10322 				  NL80211_MESHCONF_HWMP_ROOTMODE, nla_get_u8);
10323 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, mask,
10324 				  NL80211_MESHCONF_HWMP_RANN_INTERVAL,
10325 				  nla_get_u16);
10326 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshGateAnnouncementProtocol,
10327 				  mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
10328 				  nla_get_u8);
10329 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, mask,
10330 				  NL80211_MESHCONF_FORWARDING, nla_get_u8);
10331 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask,
10332 				  NL80211_MESHCONF_RSSI_THRESHOLD,
10333 				  nla_get_s32);
10334 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask,
10335 				  NL80211_MESHCONF_CONNECTED_TO_GATE,
10336 				  nla_get_u8);
10337 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToAuthServer, mask,
10338 				  NL80211_MESHCONF_CONNECTED_TO_AS,
10339 				  nla_get_u8);
10340 	/*
10341 	 * Check HT operation mode based on
10342 	 * IEEE 802.11-2016 9.4.2.57 HT Operation element.
10343 	 */
10344 	if (tb[NL80211_MESHCONF_HT_OPMODE]) {
10345 		ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]);
10346 
10347 		if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION |
10348 				  IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT |
10349 				  IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
10350 			return -EINVAL;
10351 
10352 		/* NON_HT_STA bit is reserved, but some programs set it */
10353 		ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT;
10354 
10355 		cfg->ht_opmode = ht_opmode;
10356 		mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1));
10357 	}
10358 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
10359 				  dot11MeshHWMPactivePathToRootTimeout, mask,
10360 				  NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
10361 				  nla_get_u32);
10362 	if (mask & BIT(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT) &&
10363 	    (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 ||
10364 	     cfg->dot11MeshHWMPactivePathToRootTimeout > 65535))
10365 		return -EINVAL;
10366 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, mask,
10367 				  NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
10368 				  nla_get_u16);
10369 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPconfirmationInterval,
10370 				  mask,
10371 				  NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
10372 				  nla_get_u16);
10373 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, mask,
10374 				  NL80211_MESHCONF_POWER_MODE, nla_get_u32);
10375 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, mask,
10376 				  NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16);
10377 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, mask,
10378 				  NL80211_MESHCONF_PLINK_TIMEOUT, nla_get_u32);
10379 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNolearn, mask,
10380 				  NL80211_MESHCONF_NOLEARN, nla_get_u8);
10381 	if (mask_out)
10382 		*mask_out = mask;
10383 
10384 	return 0;
10385 
10386 #undef FILL_IN_MESH_PARAM_IF_SET
10387 }
10388 
10389 static int nl80211_parse_mesh_setup(struct genl_info *info,
10390 				     struct mesh_setup *setup)
10391 {
10392 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10393 	struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1];
10394 
10395 	if (!info->attrs[NL80211_ATTR_MESH_SETUP])
10396 		return -EINVAL;
10397 	if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack))
10398 		return -EINVAL;
10399 
10400 	if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])
10401 		setup->sync_method =
10402 		(nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ?
10403 		 IEEE80211_SYNC_METHOD_VENDOR :
10404 		 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET;
10405 
10406 	if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])
10407 		setup->path_sel_proto =
10408 		(nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ?
10409 		 IEEE80211_PATH_PROTOCOL_VENDOR :
10410 		 IEEE80211_PATH_PROTOCOL_HWMP;
10411 
10412 	if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])
10413 		setup->path_metric =
10414 		(nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ?
10415 		 IEEE80211_PATH_METRIC_VENDOR :
10416 		 IEEE80211_PATH_METRIC_AIRTIME;
10417 
10418 	if (tb[NL80211_MESH_SETUP_IE]) {
10419 		struct nlattr *ieattr =
10420 			tb[NL80211_MESH_SETUP_IE];
10421 		setup->ie = nla_data(ieattr);
10422 		setup->ie_len = nla_len(ieattr);
10423 	}
10424 	if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] &&
10425 	    !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM))
10426 		return -EINVAL;
10427 	setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]);
10428 	setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]);
10429 	setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]);
10430 	if (setup->is_secure)
10431 		setup->user_mpm = true;
10432 
10433 	if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) {
10434 		if (!setup->user_mpm)
10435 			return -EINVAL;
10436 		setup->auth_id =
10437 			nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]);
10438 	}
10439 
10440 	return 0;
10441 }
10442 
10443 static int nl80211_update_mesh_config(struct sk_buff *skb,
10444 				      struct genl_info *info)
10445 {
10446 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10447 	struct net_device *dev = info->user_ptr[1];
10448 	struct wireless_dev *wdev = dev->ieee80211_ptr;
10449 	struct mesh_config cfg = {};
10450 	u32 mask;
10451 	int err;
10452 
10453 	if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
10454 		return -EOPNOTSUPP;
10455 
10456 	if (!rdev->ops->update_mesh_config)
10457 		return -EOPNOTSUPP;
10458 
10459 	err = nl80211_parse_mesh_config(info, &cfg, &mask);
10460 	if (err)
10461 		return err;
10462 
10463 	if (!wdev->u.mesh.id_len)
10464 		err = -ENOLINK;
10465 
10466 	if (!err)
10467 		err = rdev_update_mesh_config(rdev, dev, mask, &cfg);
10468 
10469 	return err;
10470 }
10471 
10472 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom,
10473 			      struct sk_buff *msg)
10474 {
10475 	struct nlattr *nl_reg_rules;
10476 	unsigned int i;
10477 
10478 	if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) ||
10479 	    (regdom->dfs_region &&
10480 	     nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region)))
10481 		goto nla_put_failure;
10482 
10483 	nl_reg_rules = nla_nest_start_noflag(msg, NL80211_ATTR_REG_RULES);
10484 	if (!nl_reg_rules)
10485 		goto nla_put_failure;
10486 
10487 	for (i = 0; i < regdom->n_reg_rules; i++) {
10488 		struct nlattr *nl_reg_rule;
10489 		const struct ieee80211_reg_rule *reg_rule;
10490 		const struct ieee80211_freq_range *freq_range;
10491 		const struct ieee80211_power_rule *power_rule;
10492 		unsigned int max_bandwidth_khz;
10493 
10494 		reg_rule = &regdom->reg_rules[i];
10495 		freq_range = &reg_rule->freq_range;
10496 		power_rule = &reg_rule->power_rule;
10497 
10498 		nl_reg_rule = nla_nest_start_noflag(msg, i);
10499 		if (!nl_reg_rule)
10500 			goto nla_put_failure;
10501 
10502 		max_bandwidth_khz = freq_range->max_bandwidth_khz;
10503 		if (!max_bandwidth_khz)
10504 			max_bandwidth_khz = reg_get_max_bandwidth(regdom,
10505 								  reg_rule);
10506 
10507 		if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS,
10508 				reg_rule->flags) ||
10509 		    nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START,
10510 				freq_range->start_freq_khz) ||
10511 		    nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END,
10512 				freq_range->end_freq_khz) ||
10513 		    nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW,
10514 				max_bandwidth_khz) ||
10515 		    nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
10516 				power_rule->max_antenna_gain) ||
10517 		    nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP,
10518 				power_rule->max_eirp) ||
10519 		    nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME,
10520 				reg_rule->dfs_cac_ms))
10521 			goto nla_put_failure;
10522 
10523 		if ((reg_rule->flags & NL80211_RRF_PSD) &&
10524 		    nla_put_s8(msg, NL80211_ATTR_POWER_RULE_PSD,
10525 			       reg_rule->psd))
10526 			goto nla_put_failure;
10527 
10528 		nla_nest_end(msg, nl_reg_rule);
10529 	}
10530 
10531 	nla_nest_end(msg, nl_reg_rules);
10532 	return 0;
10533 
10534 nla_put_failure:
10535 	return -EMSGSIZE;
10536 }
10537 
10538 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info)
10539 {
10540 	const struct ieee80211_regdomain *regdom = NULL;
10541 	struct cfg80211_registered_device *rdev;
10542 	struct wiphy *wiphy = NULL;
10543 	struct sk_buff *msg;
10544 	int err = -EMSGSIZE;
10545 	void *hdr;
10546 
10547 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10548 	if (!msg)
10549 		return -ENOBUFS;
10550 
10551 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10552 			     NL80211_CMD_GET_REG);
10553 	if (!hdr)
10554 		goto put_failure;
10555 
10556 	rtnl_lock();
10557 
10558 	if (info->attrs[NL80211_ATTR_WIPHY]) {
10559 		bool self_managed;
10560 
10561 		rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
10562 		if (IS_ERR(rdev)) {
10563 			err = PTR_ERR(rdev);
10564 			goto nla_put_failure;
10565 		}
10566 
10567 		wiphy = &rdev->wiphy;
10568 		self_managed = wiphy->regulatory_flags &
10569 			       REGULATORY_WIPHY_SELF_MANAGED;
10570 
10571 		rcu_read_lock();
10572 
10573 		regdom = get_wiphy_regdom(wiphy);
10574 
10575 		/* a self-managed-reg device must have a private regdom */
10576 		if (WARN_ON(!regdom && self_managed)) {
10577 			err = -EINVAL;
10578 			goto nla_put_failure_rcu;
10579 		}
10580 
10581 		if (regdom &&
10582 		    nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
10583 			goto nla_put_failure_rcu;
10584 	} else {
10585 		rcu_read_lock();
10586 	}
10587 
10588 	if (!wiphy && reg_last_request_cell_base() &&
10589 	    nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
10590 			NL80211_USER_REG_HINT_CELL_BASE))
10591 		goto nla_put_failure_rcu;
10592 
10593 	if (!regdom)
10594 		regdom = rcu_dereference(cfg80211_regdomain);
10595 
10596 	if (nl80211_put_regdom(regdom, msg))
10597 		goto nla_put_failure_rcu;
10598 
10599 	rcu_read_unlock();
10600 
10601 	genlmsg_end(msg, hdr);
10602 	rtnl_unlock();
10603 	return genlmsg_reply(msg, info);
10604 
10605 nla_put_failure_rcu:
10606 	rcu_read_unlock();
10607 nla_put_failure:
10608 	rtnl_unlock();
10609 put_failure:
10610 	nlmsg_free(msg);
10611 	return err;
10612 }
10613 
10614 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb,
10615 			       u32 seq, int flags, struct wiphy *wiphy,
10616 			       const struct ieee80211_regdomain *regdom)
10617 {
10618 	void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
10619 				   NL80211_CMD_GET_REG);
10620 
10621 	if (!hdr)
10622 		return -1;
10623 
10624 	genl_dump_check_consistent(cb, hdr);
10625 
10626 	if (nl80211_put_regdom(regdom, msg))
10627 		goto nla_put_failure;
10628 
10629 	if (!wiphy && reg_last_request_cell_base() &&
10630 	    nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
10631 			NL80211_USER_REG_HINT_CELL_BASE))
10632 		goto nla_put_failure;
10633 
10634 	if (wiphy &&
10635 	    nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
10636 		goto nla_put_failure;
10637 
10638 	if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
10639 	    nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
10640 		goto nla_put_failure;
10641 
10642 	genlmsg_end(msg, hdr);
10643 	return 0;
10644 
10645 nla_put_failure:
10646 	genlmsg_cancel(msg, hdr);
10647 	return -EMSGSIZE;
10648 }
10649 
10650 static int nl80211_get_reg_dump(struct sk_buff *skb,
10651 				struct netlink_callback *cb)
10652 {
10653 	const struct ieee80211_regdomain *regdom = NULL;
10654 	struct cfg80211_registered_device *rdev;
10655 	int err, reg_idx, start = cb->args[2];
10656 
10657 	rcu_read_lock();
10658 
10659 	if (cfg80211_regdomain && start == 0) {
10660 		err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
10661 					  NLM_F_MULTI, NULL,
10662 					  rcu_dereference(cfg80211_regdomain));
10663 		if (err < 0)
10664 			goto out_err;
10665 	}
10666 
10667 	/* the global regdom is idx 0 */
10668 	reg_idx = 1;
10669 	list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
10670 		regdom = get_wiphy_regdom(&rdev->wiphy);
10671 		if (!regdom)
10672 			continue;
10673 
10674 		if (++reg_idx <= start)
10675 			continue;
10676 
10677 		err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
10678 					  NLM_F_MULTI, &rdev->wiphy, regdom);
10679 		if (err < 0) {
10680 			reg_idx--;
10681 			break;
10682 		}
10683 	}
10684 
10685 	cb->args[2] = reg_idx;
10686 	err = skb->len;
10687 out_err:
10688 	rcu_read_unlock();
10689 	return err;
10690 }
10691 
10692 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
10693 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
10694 	[NL80211_ATTR_REG_RULE_FLAGS]		= { .type = NLA_U32 },
10695 	[NL80211_ATTR_FREQ_RANGE_START]		= { .type = NLA_U32 },
10696 	[NL80211_ATTR_FREQ_RANGE_END]		= { .type = NLA_U32 },
10697 	[NL80211_ATTR_FREQ_RANGE_MAX_BW]	= { .type = NLA_U32 },
10698 	[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]	= { .type = NLA_U32 },
10699 	[NL80211_ATTR_POWER_RULE_MAX_EIRP]	= { .type = NLA_U32 },
10700 	[NL80211_ATTR_DFS_CAC_TIME]		= { .type = NLA_U32 },
10701 };
10702 
10703 static int parse_reg_rule(struct nlattr *tb[],
10704 	struct ieee80211_reg_rule *reg_rule)
10705 {
10706 	struct ieee80211_freq_range *freq_range = &reg_rule->freq_range;
10707 	struct ieee80211_power_rule *power_rule = &reg_rule->power_rule;
10708 
10709 	if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
10710 		return -EINVAL;
10711 	if (!tb[NL80211_ATTR_FREQ_RANGE_START])
10712 		return -EINVAL;
10713 	if (!tb[NL80211_ATTR_FREQ_RANGE_END])
10714 		return -EINVAL;
10715 	if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
10716 		return -EINVAL;
10717 	if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
10718 		return -EINVAL;
10719 
10720 	reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
10721 
10722 	freq_range->start_freq_khz =
10723 		nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
10724 	freq_range->end_freq_khz =
10725 		nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
10726 	freq_range->max_bandwidth_khz =
10727 		nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
10728 
10729 	power_rule->max_eirp =
10730 		nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
10731 
10732 	if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
10733 		power_rule->max_antenna_gain =
10734 			nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
10735 
10736 	if (tb[NL80211_ATTR_DFS_CAC_TIME])
10737 		reg_rule->dfs_cac_ms =
10738 			nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]);
10739 
10740 	return 0;
10741 }
10742 
10743 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
10744 {
10745 	struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
10746 	struct nlattr *nl_reg_rule;
10747 	char *alpha2;
10748 	int rem_reg_rules, r;
10749 	u32 num_rules = 0, rule_idx = 0;
10750 	enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET;
10751 	struct ieee80211_regdomain *rd;
10752 
10753 	if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
10754 		return -EINVAL;
10755 
10756 	if (!info->attrs[NL80211_ATTR_REG_RULES])
10757 		return -EINVAL;
10758 
10759 	alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
10760 
10761 	if (info->attrs[NL80211_ATTR_DFS_REGION])
10762 		dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]);
10763 
10764 	nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
10765 			    rem_reg_rules) {
10766 		num_rules++;
10767 		if (num_rules > NL80211_MAX_SUPP_REG_RULES)
10768 			return -EINVAL;
10769 	}
10770 
10771 	rtnl_lock();
10772 	if (!reg_is_valid_request(alpha2)) {
10773 		r = -EINVAL;
10774 		goto out;
10775 	}
10776 
10777 	rd = kzalloc_flex(*rd, reg_rules, num_rules);
10778 	if (!rd) {
10779 		r = -ENOMEM;
10780 		goto out;
10781 	}
10782 
10783 	rd->n_reg_rules = num_rules;
10784 	rd->alpha2[0] = alpha2[0];
10785 	rd->alpha2[1] = alpha2[1];
10786 
10787 	/*
10788 	 * Disable DFS master mode if the DFS region was
10789 	 * not supported or known on this kernel.
10790 	 */
10791 	if (reg_supported_dfs_region(dfs_region))
10792 		rd->dfs_region = dfs_region;
10793 
10794 	nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
10795 			    rem_reg_rules) {
10796 		r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX,
10797 						nl_reg_rule, reg_rule_policy,
10798 						info->extack);
10799 		if (r)
10800 			goto bad_reg;
10801 		r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
10802 		if (r)
10803 			goto bad_reg;
10804 
10805 		rule_idx++;
10806 
10807 		if (rule_idx > NL80211_MAX_SUPP_REG_RULES) {
10808 			r = -EINVAL;
10809 			goto bad_reg;
10810 		}
10811 	}
10812 
10813 	r = set_regdom(rd, REGD_SOURCE_CRDA);
10814 	/* set_regdom takes ownership of rd */
10815 	rd = NULL;
10816  bad_reg:
10817 	kfree(rd);
10818  out:
10819 	rtnl_unlock();
10820 	return r;
10821 }
10822 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */
10823 
10824 static int validate_scan_freqs(struct nlattr *freqs)
10825 {
10826 	struct nlattr *attr1, *attr2;
10827 	int n_channels = 0, tmp1, tmp2;
10828 
10829 	nla_for_each_nested(attr1, freqs, tmp1)
10830 		if (nla_len(attr1) != sizeof(u32))
10831 			return 0;
10832 
10833 	nla_for_each_nested(attr1, freqs, tmp1) {
10834 		n_channels++;
10835 		/*
10836 		 * Some hardware has a limited channel list for
10837 		 * scanning, and it is pretty much nonsensical
10838 		 * to scan for a channel twice, so disallow that
10839 		 * and don't require drivers to check that the
10840 		 * channel list they get isn't longer than what
10841 		 * they can scan, as long as they can scan all
10842 		 * the channels they registered at once.
10843 		 */
10844 		nla_for_each_nested(attr2, freqs, tmp2)
10845 			if (attr1 != attr2 &&
10846 			    nla_get_u32(attr1) == nla_get_u32(attr2))
10847 				return 0;
10848 	}
10849 
10850 	return n_channels;
10851 }
10852 
10853 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b)
10854 {
10855 	return b < NUM_NL80211_BANDS && wiphy->bands[b];
10856 }
10857 
10858 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy,
10859 			    struct cfg80211_bss_selection *bss_select)
10860 {
10861 	struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1];
10862 	struct nlattr *nest;
10863 	int err;
10864 	bool found = false;
10865 	int i;
10866 
10867 	/* only process one nested attribute */
10868 	nest = nla_data(nla);
10869 	if (!nla_ok(nest, nla_len(nest)))
10870 		return -EINVAL;
10871 
10872 	err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX,
10873 					  nest, nl80211_bss_select_policy,
10874 					  NULL);
10875 	if (err)
10876 		return err;
10877 
10878 	/* only one attribute may be given */
10879 	for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) {
10880 		if (attr[i]) {
10881 			if (found)
10882 				return -EINVAL;
10883 			found = true;
10884 		}
10885 	}
10886 
10887 	bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID;
10888 
10889 	if (attr[NL80211_BSS_SELECT_ATTR_RSSI])
10890 		bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI;
10891 
10892 	if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) {
10893 		bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF;
10894 		bss_select->param.band_pref =
10895 			nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]);
10896 		if (!is_band_valid(wiphy, bss_select->param.band_pref))
10897 			return -EINVAL;
10898 	}
10899 
10900 	if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) {
10901 		struct nl80211_bss_select_rssi_adjust *adj_param;
10902 
10903 		adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]);
10904 		bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST;
10905 		bss_select->param.adjust.band = adj_param->band;
10906 		bss_select->param.adjust.delta = adj_param->delta;
10907 		if (!is_band_valid(wiphy, bss_select->param.adjust.band))
10908 			return -EINVAL;
10909 	}
10910 
10911 	/* user-space did not provide behaviour attribute */
10912 	if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID)
10913 		return -EINVAL;
10914 
10915 	if (!(wiphy->bss_select_support & BIT(bss_select->behaviour)))
10916 		return -EINVAL;
10917 
10918 	return 0;
10919 }
10920 
10921 int nl80211_parse_random_mac(struct nlattr **attrs,
10922 			     u8 *mac_addr, u8 *mac_addr_mask)
10923 {
10924 	int i;
10925 
10926 	if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) {
10927 		eth_zero_addr(mac_addr);
10928 		eth_zero_addr(mac_addr_mask);
10929 		mac_addr[0] = 0x2;
10930 		mac_addr_mask[0] = 0x3;
10931 
10932 		return 0;
10933 	}
10934 
10935 	/* need both or none */
10936 	if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK])
10937 		return -EINVAL;
10938 
10939 	memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN);
10940 	memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN);
10941 
10942 	/* don't allow or configure an mcast address */
10943 	if (!is_multicast_ether_addr(mac_addr_mask) ||
10944 	    is_multicast_ether_addr(mac_addr))
10945 		return -EINVAL;
10946 
10947 	/*
10948 	 * allow users to pass a MAC address that has bits set outside
10949 	 * of the mask, but don't bother drivers with having to deal
10950 	 * with such bits
10951 	 */
10952 	for (i = 0; i < ETH_ALEN; i++)
10953 		mac_addr[i] &= mac_addr_mask[i];
10954 
10955 	return 0;
10956 }
10957 
10958 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev,
10959 					      struct ieee80211_channel *chan)
10960 {
10961 	unsigned int link_id;
10962 	bool all_ok = true;
10963 	int radio_idx;
10964 
10965 	lockdep_assert_wiphy(wdev->wiphy);
10966 
10967 	if (!cfg80211_wdev_channel_allowed(wdev, chan))
10968 		return false;
10969 
10970 	if (!cfg80211_beaconing_iface_active(wdev))
10971 		return true;
10972 
10973 	radio_idx = cfg80211_get_radio_idx_by_chan(wdev->wiphy, chan);
10974 
10975 	/*
10976 	 * FIXME: check if we have a free radio/link for chan
10977 	 *
10978 	 * This, as well as the FIXME below, requires knowing the link
10979 	 * capabilities of the hardware.
10980 	 */
10981 
10982 	/* we cannot leave radar channels */
10983 	for_each_valid_link(wdev, link_id) {
10984 		struct cfg80211_chan_def *chandef;
10985 		int link_radio_idx;
10986 
10987 		chandef = wdev_chandef(wdev, link_id);
10988 		if (!chandef || !chandef->chan)
10989 			continue;
10990 
10991 		if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR))
10992 			continue;
10993 
10994 		/*
10995 		 * chandef->chan is a radar channel. If the radio/link onto
10996 		 * which this radar channel falls is the same radio/link onto
10997 		 * which the input 'chan' falls, off-channel operation should
10998 		 * not be allowed. Hence, set 'all_ok' to false.
10999 		 */
11000 
11001 		link_radio_idx = cfg80211_get_radio_idx_by_chan(wdev->wiphy,
11002 								chandef->chan);
11003 		if (link_radio_idx == radio_idx) {
11004 			all_ok = false;
11005 			break;
11006 		}
11007 	}
11008 
11009 	if (all_ok)
11010 		return true;
11011 
11012 	return regulatory_pre_cac_allowed(wdev->wiphy);
11013 }
11014 
11015 static bool nl80211_check_scan_feat(struct wiphy *wiphy, u32 flags, u32 flag,
11016 				    enum nl80211_ext_feature_index feat)
11017 {
11018 	if (!(flags & flag))
11019 		return true;
11020 	if (wiphy_ext_feature_isset(wiphy, feat))
11021 		return true;
11022 	return false;
11023 }
11024 
11025 static int
11026 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev,
11027 			 struct nlattr **attrs, u8 *mac_addr, u8 *mac_addr_mask,
11028 			 u32 *flags, enum nl80211_feature_flags randomness_flag)
11029 {
11030 	if (!attrs[NL80211_ATTR_SCAN_FLAGS])
11031 		return 0;
11032 
11033 	*flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]);
11034 
11035 	if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
11036 	     !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) ||
11037 	    !nl80211_check_scan_feat(wiphy, *flags,
11038 				     NL80211_SCAN_FLAG_LOW_SPAN,
11039 				     NL80211_EXT_FEATURE_LOW_SPAN_SCAN) ||
11040 	    !nl80211_check_scan_feat(wiphy, *flags,
11041 				     NL80211_SCAN_FLAG_LOW_POWER,
11042 				     NL80211_EXT_FEATURE_LOW_POWER_SCAN) ||
11043 	    !nl80211_check_scan_feat(wiphy, *flags,
11044 				     NL80211_SCAN_FLAG_HIGH_ACCURACY,
11045 				     NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN) ||
11046 	    !nl80211_check_scan_feat(wiphy, *flags,
11047 				     NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME,
11048 				     NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME) ||
11049 	    !nl80211_check_scan_feat(wiphy, *flags,
11050 				     NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP,
11051 				     NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP) ||
11052 	    !nl80211_check_scan_feat(wiphy, *flags,
11053 				     NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION,
11054 				     NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) ||
11055 	    !nl80211_check_scan_feat(wiphy, *flags,
11056 				     NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE,
11057 				     NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE) ||
11058 	    !nl80211_check_scan_feat(wiphy, *flags,
11059 				     NL80211_SCAN_FLAG_RANDOM_SN,
11060 				     NL80211_EXT_FEATURE_SCAN_RANDOM_SN) ||
11061 	    !nl80211_check_scan_feat(wiphy, *flags,
11062 				     NL80211_SCAN_FLAG_MIN_PREQ_CONTENT,
11063 				     NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT))
11064 		return -EOPNOTSUPP;
11065 
11066 	if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
11067 		int err;
11068 
11069 		if (!(wiphy->features & randomness_flag) ||
11070 		    (wdev && wdev->connected))
11071 			return -EOPNOTSUPP;
11072 
11073 		err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask);
11074 		if (err)
11075 			return err;
11076 	}
11077 
11078 	return 0;
11079 }
11080 
11081 static int
11082 nl80211_check_scan_flags_sched(struct wiphy *wiphy, struct wireless_dev *wdev,
11083 			       struct nlattr **attrs,
11084 			       struct cfg80211_sched_scan_request *req)
11085 {
11086 	return nl80211_check_scan_flags(wiphy, wdev, attrs,
11087 					req->mac_addr, req->mac_addr_mask,
11088 					&req->flags,
11089 					wdev ? NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR :
11090 					       NL80211_FEATURE_ND_RANDOM_MAC_ADDR);
11091 }
11092 
11093 static int
11094 nl80211_check_scan_flags_reg(struct wiphy *wiphy, struct wireless_dev *wdev,
11095 			     struct nlattr **attrs,
11096 			     struct cfg80211_scan_request_int *req)
11097 {
11098 	return nl80211_check_scan_flags(wiphy, wdev, attrs,
11099 					req->req.mac_addr,
11100 					req->req.mac_addr_mask,
11101 					&req->req.flags,
11102 					NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR);
11103 }
11104 
11105 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
11106 {
11107 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
11108 	struct wireless_dev *wdev = info->user_ptr[1];
11109 	struct cfg80211_scan_request_int *request;
11110 	struct nlattr *scan_freqs = NULL;
11111 	bool scan_freqs_khz = false;
11112 	struct nlattr *attr;
11113 	struct wiphy *wiphy;
11114 	int err, tmp, n_ssids = 0, n_channels, i;
11115 	size_t ie_len, size;
11116 	size_t ssids_offset, ie_offset;
11117 
11118 	wiphy = &rdev->wiphy;
11119 
11120 	if (wdev->iftype == NL80211_IFTYPE_NAN ||
11121 	    wdev->iftype == NL80211_IFTYPE_PD)
11122 		return -EOPNOTSUPP;
11123 
11124 	if (!rdev->ops->scan)
11125 		return -EOPNOTSUPP;
11126 
11127 	if (rdev->scan_req || rdev->scan_msg)
11128 		return -EBUSY;
11129 
11130 	if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) {
11131 		if (!wiphy_ext_feature_isset(wiphy,
11132 					     NL80211_EXT_FEATURE_SCAN_FREQ_KHZ))
11133 			return -EOPNOTSUPP;
11134 		scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ];
11135 		scan_freqs_khz = true;
11136 	} else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES])
11137 		scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES];
11138 
11139 	if (scan_freqs) {
11140 		n_channels = validate_scan_freqs(scan_freqs);
11141 		if (!n_channels)
11142 			return -EINVAL;
11143 	} else {
11144 		n_channels = ieee80211_get_num_supported_channels(wiphy);
11145 	}
11146 
11147 	if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
11148 		nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
11149 			n_ssids++;
11150 
11151 	if (n_ssids > wiphy->max_scan_ssids)
11152 		return -EINVAL;
11153 
11154 	if (info->attrs[NL80211_ATTR_IE])
11155 		ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
11156 	else
11157 		ie_len = 0;
11158 
11159 	if (ie_len > wiphy->max_scan_ie_len)
11160 		return -EINVAL;
11161 
11162 	size = struct_size(request, req.channels, n_channels);
11163 	ssids_offset = size;
11164 	size = size_add(size, array_size(sizeof(*request->req.ssids), n_ssids));
11165 	ie_offset = size;
11166 	size = size_add(size, ie_len);
11167 	request = kzalloc(size, GFP_KERNEL);
11168 	if (!request)
11169 		return -ENOMEM;
11170 
11171 	if (n_ssids)
11172 		request->req.ssids = (void *)request + ssids_offset;
11173 	request->req.n_ssids = n_ssids;
11174 	if (ie_len)
11175 		request->req.ie = (void *)request + ie_offset;
11176 
11177 	i = 0;
11178 	if (scan_freqs) {
11179 		/* user specified, bail out if channel not found */
11180 		nla_for_each_nested(attr, scan_freqs, tmp) {
11181 			struct ieee80211_channel *chan;
11182 			int freq = nla_get_u32(attr);
11183 
11184 			if (!scan_freqs_khz)
11185 				freq = MHZ_TO_KHZ(freq);
11186 
11187 			chan = ieee80211_get_channel_khz(wiphy, freq);
11188 			if (!chan) {
11189 				err = -EINVAL;
11190 				goto out_free;
11191 			}
11192 
11193 			/* Ignore disabled / no primary channels */
11194 			if (chan->flags & IEEE80211_CHAN_DISABLED ||
11195 			    chan->flags & IEEE80211_CHAN_S1G_NO_PRIMARY ||
11196 			    !cfg80211_wdev_channel_allowed(wdev, chan))
11197 				continue;
11198 
11199 			request->req.channels[i] = chan;
11200 			i++;
11201 		}
11202 	} else {
11203 		enum nl80211_band band;
11204 
11205 		/* all channels */
11206 		for (band = 0; band < NUM_NL80211_BANDS; band++) {
11207 			int j;
11208 
11209 			if (!wiphy->bands[band])
11210 				continue;
11211 			for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
11212 				struct ieee80211_channel *chan;
11213 
11214 				chan = &wiphy->bands[band]->channels[j];
11215 
11216 				if (chan->flags & IEEE80211_CHAN_DISABLED ||
11217 				    chan->flags &
11218 					    IEEE80211_CHAN_S1G_NO_PRIMARY ||
11219 				    !cfg80211_wdev_channel_allowed(wdev, chan))
11220 					continue;
11221 
11222 				request->req.channels[i] = chan;
11223 				i++;
11224 			}
11225 		}
11226 	}
11227 
11228 	if (!i) {
11229 		err = -EINVAL;
11230 		goto out_free;
11231 	}
11232 
11233 	request->req.n_channels = i;
11234 
11235 	for (i = 0; i < request->req.n_channels; i++) {
11236 		struct ieee80211_channel *chan = request->req.channels[i];
11237 
11238 		/* if we can go off-channel to the target channel we're good */
11239 		if (cfg80211_off_channel_oper_allowed(wdev, chan))
11240 			continue;
11241 
11242 		if (!cfg80211_wdev_on_sub_chan(wdev, chan, true)) {
11243 			err = -EBUSY;
11244 			goto out_free;
11245 		}
11246 	}
11247 
11248 	i = 0;
11249 	if (n_ssids) {
11250 		nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
11251 			if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
11252 				err = -EINVAL;
11253 				goto out_free;
11254 			}
11255 			request->req.ssids[i].ssid_len = nla_len(attr);
11256 			memcpy(request->req.ssids[i].ssid,
11257 			       nla_data(attr), nla_len(attr));
11258 			i++;
11259 		}
11260 	}
11261 
11262 	if (info->attrs[NL80211_ATTR_IE]) {
11263 		request->req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
11264 		memcpy((void *)request->req.ie,
11265 		       nla_data(info->attrs[NL80211_ATTR_IE]),
11266 		       request->req.ie_len);
11267 	}
11268 
11269 	for (i = 0; i < NUM_NL80211_BANDS; i++)
11270 		if (wiphy->bands[i])
11271 			request->req.rates[i] =
11272 				(1 << wiphy->bands[i]->n_bitrates) - 1;
11273 
11274 	if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) {
11275 		nla_for_each_nested(attr,
11276 				    info->attrs[NL80211_ATTR_SCAN_SUPP_RATES],
11277 				    tmp) {
11278 			int band = nla_type(attr);
11279 
11280 			if (band < 0 || band >= NUM_NL80211_BANDS) {
11281 				err = -EINVAL;
11282 				goto out_free;
11283 			}
11284 
11285 			if (!wiphy->bands[band])
11286 				continue;
11287 
11288 			err = ieee80211_get_ratemask(wiphy->bands[band],
11289 						     nla_data(attr),
11290 						     nla_len(attr),
11291 						     &request->req.rates[band]);
11292 			if (err)
11293 				goto out_free;
11294 		}
11295 	}
11296 
11297 	if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) {
11298 		request->req.duration =
11299 			nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]);
11300 		request->req.duration_mandatory =
11301 			nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]);
11302 	}
11303 
11304 	err = nl80211_check_scan_flags_reg(wiphy, wdev, info->attrs, request);
11305 	if (err)
11306 		goto out_free;
11307 
11308 	request->req.no_cck =
11309 		nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
11310 
11311 	/* Initial implementation used NL80211_ATTR_MAC to set the specific
11312 	 * BSSID to scan for. This was problematic because that same attribute
11313 	 * was already used for another purpose (local random MAC address). The
11314 	 * NL80211_ATTR_BSSID attribute was added to fix this. For backwards
11315 	 * compatibility with older userspace components, also use the
11316 	 * NL80211_ATTR_MAC value here if it can be determined to be used for
11317 	 * the specific BSSID use case instead of the random MAC address
11318 	 * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use).
11319 	 */
11320 	if (info->attrs[NL80211_ATTR_BSSID])
11321 		memcpy(request->req.bssid,
11322 		       nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN);
11323 	else if (!(request->req.flags & NL80211_SCAN_FLAG_RANDOM_ADDR) &&
11324 		 info->attrs[NL80211_ATTR_MAC])
11325 		memcpy(request->req.bssid,
11326 		       nla_data(info->attrs[NL80211_ATTR_MAC]),
11327 		       ETH_ALEN);
11328 	else
11329 		eth_broadcast_addr(request->req.bssid);
11330 
11331 	request->req.tsf_report_link_id =
11332 		nl80211_link_id_or_invalid(info->attrs);
11333 	request->req.wdev = wdev;
11334 	request->req.wiphy = &rdev->wiphy;
11335 	request->req.scan_start = jiffies;
11336 
11337 	rdev->scan_req = request;
11338 	err = cfg80211_scan(rdev);
11339 
11340 	if (err)
11341 		goto out_free;
11342 
11343 	nl80211_send_scan_start(rdev, wdev);
11344 	dev_hold(wdev->netdev);
11345 
11346 	return 0;
11347 
11348  out_free:
11349 	rdev->scan_req = NULL;
11350 	kfree(request);
11351 
11352 	return err;
11353 }
11354 
11355 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info)
11356 {
11357 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
11358 	struct wireless_dev *wdev = info->user_ptr[1];
11359 
11360 	if (!rdev->ops->abort_scan)
11361 		return -EOPNOTSUPP;
11362 
11363 	if (rdev->scan_msg)
11364 		return 0;
11365 
11366 	if (!rdev->scan_req)
11367 		return -ENOENT;
11368 
11369 	rdev_abort_scan(rdev, wdev);
11370 	return 0;
11371 }
11372 
11373 static int
11374 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans,
11375 			       struct cfg80211_sched_scan_request *request,
11376 			       struct nlattr **attrs)
11377 {
11378 	int tmp, err, i = 0;
11379 	struct nlattr *attr;
11380 
11381 	if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
11382 		u32 interval;
11383 
11384 		/*
11385 		 * If scan plans are not specified,
11386 		 * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this
11387 		 * case one scan plan will be set with the specified scan
11388 		 * interval and infinite number of iterations.
11389 		 */
11390 		interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]);
11391 		if (!interval)
11392 			return -EINVAL;
11393 
11394 		request->scan_plans[0].interval =
11395 			DIV_ROUND_UP(interval, MSEC_PER_SEC);
11396 		if (!request->scan_plans[0].interval)
11397 			return -EINVAL;
11398 
11399 		if (request->scan_plans[0].interval >
11400 		    wiphy->max_sched_scan_plan_interval)
11401 			request->scan_plans[0].interval =
11402 				wiphy->max_sched_scan_plan_interval;
11403 
11404 		return 0;
11405 	}
11406 
11407 	nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) {
11408 		struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1];
11409 
11410 		if (WARN_ON(i >= n_plans))
11411 			return -EINVAL;
11412 
11413 		err = nla_parse_nested_deprecated(plan,
11414 						  NL80211_SCHED_SCAN_PLAN_MAX,
11415 						  attr, nl80211_plan_policy,
11416 						  NULL);
11417 		if (err)
11418 			return err;
11419 
11420 		if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL])
11421 			return -EINVAL;
11422 
11423 		request->scan_plans[i].interval =
11424 			nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]);
11425 		if (!request->scan_plans[i].interval ||
11426 		    request->scan_plans[i].interval >
11427 		    wiphy->max_sched_scan_plan_interval)
11428 			return -EINVAL;
11429 
11430 		if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) {
11431 			request->scan_plans[i].iterations =
11432 				nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]);
11433 			if (!request->scan_plans[i].iterations ||
11434 			    (request->scan_plans[i].iterations >
11435 			     wiphy->max_sched_scan_plan_iterations))
11436 				return -EINVAL;
11437 		} else if (i < n_plans - 1) {
11438 			/*
11439 			 * All scan plans but the last one must specify
11440 			 * a finite number of iterations
11441 			 */
11442 			return -EINVAL;
11443 		}
11444 
11445 		i++;
11446 	}
11447 
11448 	/*
11449 	 * The last scan plan must not specify the number of
11450 	 * iterations, it is supposed to run infinitely
11451 	 */
11452 	if (request->scan_plans[n_plans - 1].iterations)
11453 		return  -EINVAL;
11454 
11455 	return 0;
11456 }
11457 
11458 static struct cfg80211_sched_scan_request *
11459 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
11460 			 struct nlattr **attrs, int max_match_sets)
11461 {
11462 	struct cfg80211_sched_scan_request *request;
11463 	struct nlattr *attr;
11464 	int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0;
11465 	enum nl80211_band band;
11466 	size_t ie_len, size;
11467 	struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1];
11468 	s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF;
11469 
11470 	if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
11471 		n_channels = validate_scan_freqs(
11472 				attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
11473 		if (!n_channels)
11474 			return ERR_PTR(-EINVAL);
11475 	} else {
11476 		n_channels = ieee80211_get_num_supported_channels(wiphy);
11477 	}
11478 
11479 	if (attrs[NL80211_ATTR_SCAN_SSIDS])
11480 		nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
11481 				    tmp)
11482 			n_ssids++;
11483 
11484 	if (n_ssids > wiphy->max_sched_scan_ssids)
11485 		return ERR_PTR(-EINVAL);
11486 
11487 	/*
11488 	 * First, count the number of 'real' matchsets. Due to an issue with
11489 	 * the old implementation, matchsets containing only the RSSI attribute
11490 	 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default'
11491 	 * RSSI for all matchsets, rather than their own matchset for reporting
11492 	 * all APs with a strong RSSI. This is needed to be compatible with
11493 	 * older userspace that treated a matchset with only the RSSI as the
11494 	 * global RSSI for all other matchsets - if there are other matchsets.
11495 	 */
11496 	if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
11497 		nla_for_each_nested(attr,
11498 				    attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
11499 				    tmp) {
11500 			struct nlattr *rssi;
11501 
11502 			err = nla_parse_nested_deprecated(tb,
11503 							  NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
11504 							  attr,
11505 							  nl80211_match_policy,
11506 							  NULL);
11507 			if (err)
11508 				return ERR_PTR(err);
11509 
11510 			/* SSID and BSSID are mutually exclusive */
11511 			if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] &&
11512 			    tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID])
11513 				return ERR_PTR(-EINVAL);
11514 
11515 			/* add other standalone attributes here */
11516 			if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] ||
11517 			    tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) {
11518 				n_match_sets++;
11519 				continue;
11520 			}
11521 			rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
11522 			if (rssi)
11523 				default_match_rssi = nla_get_s32(rssi);
11524 		}
11525 	}
11526 
11527 	/* However, if there's no other matchset, add the RSSI one */
11528 	if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
11529 		n_match_sets = 1;
11530 
11531 	if (n_match_sets > max_match_sets)
11532 		return ERR_PTR(-EINVAL);
11533 
11534 	if (attrs[NL80211_ATTR_IE])
11535 		ie_len = nla_len(attrs[NL80211_ATTR_IE]);
11536 	else
11537 		ie_len = 0;
11538 
11539 	if (ie_len > wiphy->max_sched_scan_ie_len)
11540 		return ERR_PTR(-EINVAL);
11541 
11542 	if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
11543 		/*
11544 		 * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since
11545 		 * each scan plan already specifies its own interval
11546 		 */
11547 		if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
11548 			return ERR_PTR(-EINVAL);
11549 
11550 		nla_for_each_nested(attr,
11551 				    attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp)
11552 			n_plans++;
11553 	} else {
11554 		/*
11555 		 * The scan interval attribute is kept for backward
11556 		 * compatibility. If no scan plans are specified and sched scan
11557 		 * interval is specified, one scan plan will be set with this
11558 		 * scan interval and infinite number of iterations.
11559 		 */
11560 		if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
11561 			return ERR_PTR(-EINVAL);
11562 
11563 		n_plans = 1;
11564 	}
11565 
11566 	if (!n_plans || n_plans > wiphy->max_sched_scan_plans)
11567 		return ERR_PTR(-EINVAL);
11568 
11569 	if (!wiphy_ext_feature_isset(
11570 		    wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) &&
11571 	    (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] ||
11572 	     attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]))
11573 		return ERR_PTR(-EINVAL);
11574 
11575 	size = struct_size(request, channels, n_channels);
11576 	size = size_add(size, array_size(sizeof(*request->ssids), n_ssids));
11577 	size = size_add(size, array_size(sizeof(*request->match_sets),
11578 					 n_match_sets));
11579 	size = size_add(size, array_size(sizeof(*request->scan_plans),
11580 					 n_plans));
11581 	size = size_add(size, ie_len);
11582 	request = kzalloc(size, GFP_KERNEL);
11583 	if (!request)
11584 		return ERR_PTR(-ENOMEM);
11585 	request->n_channels = n_channels;
11586 
11587 	if (n_ssids)
11588 		request->ssids = (void *)request +
11589 			struct_size(request, channels, n_channels);
11590 	request->n_ssids = n_ssids;
11591 	if (ie_len) {
11592 		if (n_ssids)
11593 			request->ie = (void *)(request->ssids + n_ssids);
11594 		else
11595 			request->ie = (void *)(request->channels + n_channels);
11596 	}
11597 
11598 	if (n_match_sets) {
11599 		if (request->ie)
11600 			request->match_sets = (void *)(request->ie + ie_len);
11601 		else if (n_ssids)
11602 			request->match_sets =
11603 				(void *)(request->ssids + n_ssids);
11604 		else
11605 			request->match_sets =
11606 				(void *)(request->channels + n_channels);
11607 	}
11608 	request->n_match_sets = n_match_sets;
11609 
11610 	if (n_match_sets)
11611 		request->scan_plans = (void *)(request->match_sets +
11612 					       n_match_sets);
11613 	else if (request->ie)
11614 		request->scan_plans = (void *)(request->ie + ie_len);
11615 	else if (n_ssids)
11616 		request->scan_plans = (void *)(request->ssids + n_ssids);
11617 	else
11618 		request->scan_plans = (void *)(request->channels + n_channels);
11619 
11620 	request->n_scan_plans = n_plans;
11621 
11622 	i = 0;
11623 	if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
11624 		/* user specified, bail out if channel not found */
11625 		nla_for_each_nested(attr,
11626 				    attrs[NL80211_ATTR_SCAN_FREQUENCIES],
11627 				    tmp) {
11628 			struct ieee80211_channel *chan;
11629 
11630 			chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
11631 
11632 			if (!chan) {
11633 				err = -EINVAL;
11634 				goto out_free;
11635 			}
11636 
11637 			/* ignore disabled channels */
11638 			if (chan->flags & IEEE80211_CHAN_DISABLED)
11639 				continue;
11640 
11641 			request->channels[i] = chan;
11642 			i++;
11643 		}
11644 	} else {
11645 		/* all channels */
11646 		for (band = 0; band < NUM_NL80211_BANDS; band++) {
11647 			int j;
11648 
11649 			if (!wiphy->bands[band])
11650 				continue;
11651 			for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
11652 				struct ieee80211_channel *chan;
11653 
11654 				chan = &wiphy->bands[band]->channels[j];
11655 
11656 				if (chan->flags & IEEE80211_CHAN_DISABLED)
11657 					continue;
11658 
11659 				request->channels[i] = chan;
11660 				i++;
11661 			}
11662 		}
11663 	}
11664 
11665 	if (!i) {
11666 		err = -EINVAL;
11667 		goto out_free;
11668 	}
11669 
11670 	request->n_channels = i;
11671 
11672 	i = 0;
11673 	if (n_ssids) {
11674 		nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
11675 				    tmp) {
11676 			if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
11677 				err = -EINVAL;
11678 				goto out_free;
11679 			}
11680 			request->ssids[i].ssid_len = nla_len(attr);
11681 			memcpy(request->ssids[i].ssid, nla_data(attr),
11682 			       nla_len(attr));
11683 			i++;
11684 		}
11685 	}
11686 
11687 	i = 0;
11688 	if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
11689 		nla_for_each_nested(attr,
11690 				    attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
11691 				    tmp) {
11692 			struct nlattr *ssid, *bssid, *rssi;
11693 
11694 			err = nla_parse_nested_deprecated(tb,
11695 							  NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
11696 							  attr,
11697 							  nl80211_match_policy,
11698 							  NULL);
11699 			if (err)
11700 				goto out_free;
11701 			ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
11702 			bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID];
11703 
11704 			if (!ssid && !bssid) {
11705 				i++;
11706 				continue;
11707 			}
11708 
11709 			if (WARN_ON(i >= n_match_sets)) {
11710 				/* this indicates a programming error,
11711 				 * the loop above should have verified
11712 				 * things properly
11713 				 */
11714 				err = -EINVAL;
11715 				goto out_free;
11716 			}
11717 
11718 			if (ssid) {
11719 				memcpy(request->match_sets[i].ssid.ssid,
11720 				       nla_data(ssid), nla_len(ssid));
11721 				request->match_sets[i].ssid.ssid_len =
11722 					nla_len(ssid);
11723 			}
11724 			if (bssid)
11725 				memcpy(request->match_sets[i].bssid,
11726 				       nla_data(bssid), ETH_ALEN);
11727 
11728 			/* special attribute - old implementation w/a */
11729 			request->match_sets[i].rssi_thold = default_match_rssi;
11730 			rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
11731 			if (rssi)
11732 				request->match_sets[i].rssi_thold =
11733 					nla_get_s32(rssi);
11734 			i++;
11735 		}
11736 
11737 		/* there was no other matchset, so the RSSI one is alone */
11738 		if (i == 0 && n_match_sets)
11739 			request->match_sets[0].rssi_thold = default_match_rssi;
11740 
11741 		request->min_rssi_thold = INT_MAX;
11742 		for (i = 0; i < n_match_sets; i++)
11743 			request->min_rssi_thold =
11744 				min(request->match_sets[i].rssi_thold,
11745 				    request->min_rssi_thold);
11746 	} else {
11747 		request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF;
11748 	}
11749 
11750 	if (ie_len) {
11751 		request->ie_len = ie_len;
11752 		memcpy((void *)request->ie,
11753 		       nla_data(attrs[NL80211_ATTR_IE]),
11754 		       request->ie_len);
11755 	}
11756 
11757 	err = nl80211_check_scan_flags_sched(wiphy, wdev, attrs, request);
11758 	if (err)
11759 		goto out_free;
11760 
11761 	if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY])
11762 		request->delay =
11763 			nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]);
11764 
11765 	if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) {
11766 		request->relative_rssi = nla_get_s8(
11767 			attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]);
11768 		request->relative_rssi_set = true;
11769 	}
11770 
11771 	if (request->relative_rssi_set &&
11772 	    attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) {
11773 		struct nl80211_bss_select_rssi_adjust *rssi_adjust;
11774 
11775 		rssi_adjust = nla_data(
11776 			attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]);
11777 		request->rssi_adjust.band = rssi_adjust->band;
11778 		request->rssi_adjust.delta = rssi_adjust->delta;
11779 		if (!is_band_valid(wiphy, request->rssi_adjust.band)) {
11780 			err = -EINVAL;
11781 			goto out_free;
11782 		}
11783 	}
11784 
11785 	err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs);
11786 	if (err)
11787 		goto out_free;
11788 
11789 	request->scan_start = jiffies;
11790 
11791 	return request;
11792 
11793 out_free:
11794 	kfree(request);
11795 	return ERR_PTR(err);
11796 }
11797 
11798 static int nl80211_start_sched_scan(struct sk_buff *skb,
11799 				    struct genl_info *info)
11800 {
11801 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
11802 	struct net_device *dev = info->user_ptr[1];
11803 	struct wireless_dev *wdev = dev->ieee80211_ptr;
11804 	struct cfg80211_sched_scan_request *sched_scan_req;
11805 	bool want_multi;
11806 	int err;
11807 
11808 	if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start)
11809 		return -EOPNOTSUPP;
11810 
11811 	want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI];
11812 	err = cfg80211_sched_scan_req_possible(rdev, want_multi);
11813 	if (err)
11814 		return err;
11815 
11816 	sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev,
11817 						  info->attrs,
11818 						  rdev->wiphy.max_match_sets);
11819 
11820 	err = PTR_ERR_OR_ZERO(sched_scan_req);
11821 	if (err)
11822 		goto out_err;
11823 
11824 	/* leave request id zero for legacy request
11825 	 * or if driver does not support multi-scheduled scan
11826 	 */
11827 	if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1)
11828 		sched_scan_req->reqid = cfg80211_assign_cookie(rdev);
11829 
11830 	err = rdev_sched_scan_start(rdev, dev, sched_scan_req);
11831 	if (err)
11832 		goto out_free;
11833 
11834 	sched_scan_req->dev = dev;
11835 	sched_scan_req->wiphy = &rdev->wiphy;
11836 
11837 	if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
11838 		sched_scan_req->owner_nlportid = info->snd_portid;
11839 
11840 	cfg80211_add_sched_scan_req(rdev, sched_scan_req);
11841 
11842 	nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN);
11843 	return 0;
11844 
11845 out_free:
11846 	kfree(sched_scan_req);
11847 out_err:
11848 	return err;
11849 }
11850 
11851 static int nl80211_stop_sched_scan(struct sk_buff *skb,
11852 				   struct genl_info *info)
11853 {
11854 	struct cfg80211_sched_scan_request *req;
11855 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
11856 	u64 cookie;
11857 
11858 	if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop)
11859 		return -EOPNOTSUPP;
11860 
11861 	if (info->attrs[NL80211_ATTR_COOKIE]) {
11862 		cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
11863 		return __cfg80211_stop_sched_scan(rdev, cookie, false);
11864 	}
11865 
11866 	req = list_first_or_null_rcu(&rdev->sched_scan_req_list,
11867 				     struct cfg80211_sched_scan_request,
11868 				     list);
11869 	if (!req || req->reqid ||
11870 	    (req->owner_nlportid &&
11871 	     req->owner_nlportid != info->snd_portid))
11872 		return -ENOENT;
11873 
11874 	return cfg80211_stop_sched_scan_req(rdev, req, false);
11875 }
11876 
11877 static int nl80211_start_radar_detection(struct sk_buff *skb,
11878 					 struct genl_info *info)
11879 {
11880 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
11881 	struct net_device *dev = info->user_ptr[1];
11882 	struct wireless_dev *wdev = dev->ieee80211_ptr;
11883 	int link_id = nl80211_link_id(info->attrs);
11884 	struct wiphy *wiphy = wdev->wiphy;
11885 	struct cfg80211_chan_def chandef;
11886 	enum nl80211_dfs_regions dfs_region;
11887 	unsigned int cac_time_ms;
11888 	int err;
11889 
11890 	flush_delayed_work(&rdev->dfs_update_channels_wk);
11891 
11892 	switch (wdev->iftype) {
11893 	case NL80211_IFTYPE_AP:
11894 	case NL80211_IFTYPE_P2P_GO:
11895 	case NL80211_IFTYPE_MESH_POINT:
11896 	case NL80211_IFTYPE_ADHOC:
11897 		break;
11898 	default:
11899 		/* caution - see cfg80211_beaconing_iface_active() below */
11900 		return -EINVAL;
11901 	}
11902 
11903 	guard(wiphy)(wiphy);
11904 
11905 	dfs_region = reg_get_dfs_region(wiphy);
11906 	if (dfs_region == NL80211_DFS_UNSET)
11907 		return -EINVAL;
11908 
11909 	err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef,
11910 				    false);
11911 	if (err)
11912 		return err;
11913 
11914 	err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype);
11915 	if (err < 0)
11916 		return err;
11917 
11918 	if (err == 0)
11919 		return -EINVAL;
11920 
11921 	if (!cfg80211_chandef_dfs_usable(wiphy, &chandef))
11922 		return -EINVAL;
11923 
11924 	if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND]))
11925 		return cfg80211_start_background_radar_detection(rdev, wdev,
11926 								 &chandef);
11927 
11928 	if (cfg80211_beaconing_iface_active(wdev)) {
11929 		/* During MLO other link(s) can beacon, only the current link
11930 		 * can not already beacon
11931 		 */
11932 		if (wdev->valid_links &&
11933 		    !wdev->links[link_id].ap.beacon_interval) {
11934 			/* nothing */
11935 		} else {
11936 			return -EBUSY;
11937 		}
11938 	}
11939 
11940 	if (wdev->links[link_id].cac_started)
11941 		return -EBUSY;
11942 
11943 	/* CAC start is offloaded to HW and can't be started manually */
11944 	if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD))
11945 		return -EOPNOTSUPP;
11946 
11947 	if (!rdev->ops->start_radar_detection)
11948 		return -EOPNOTSUPP;
11949 
11950 	cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef);
11951 	if (WARN_ON(!cac_time_ms))
11952 		cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
11953 
11954 	err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms,
11955 					 link_id);
11956 	if (err)
11957 		return err;
11958 
11959 	switch (wdev->iftype) {
11960 	case NL80211_IFTYPE_AP:
11961 	case NL80211_IFTYPE_P2P_GO:
11962 		wdev->links[link_id].ap.chandef = chandef;
11963 		break;
11964 	case NL80211_IFTYPE_ADHOC:
11965 		wdev->u.ibss.chandef = chandef;
11966 		break;
11967 	case NL80211_IFTYPE_MESH_POINT:
11968 		wdev->u.mesh.chandef = chandef;
11969 		break;
11970 	default:
11971 		break;
11972 	}
11973 	wdev->links[link_id].cac_started = true;
11974 	wdev->links[link_id].cac_start_time = jiffies;
11975 	wdev->links[link_id].cac_time_ms = cac_time_ms;
11976 	cfg80211_set_cac_state(wiphy, &chandef, true);
11977 
11978 	return 0;
11979 }
11980 
11981 static int nl80211_notify_radar_detection(struct sk_buff *skb,
11982 					  struct genl_info *info)
11983 {
11984 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
11985 	struct net_device *dev = info->user_ptr[1];
11986 	struct wireless_dev *wdev = dev->ieee80211_ptr;
11987 	struct wiphy *wiphy = wdev->wiphy;
11988 	struct cfg80211_chan_def chandef;
11989 	enum nl80211_dfs_regions dfs_region;
11990 	int err;
11991 
11992 	dfs_region = reg_get_dfs_region(wiphy);
11993 	if (dfs_region == NL80211_DFS_UNSET) {
11994 		GENL_SET_ERR_MSG(info,
11995 				 "DFS Region is not set. Unexpected Radar indication");
11996 		return -EINVAL;
11997 	}
11998 
11999 	err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef,
12000 				    false);
12001 	if (err) {
12002 		GENL_SET_ERR_MSG(info, "Unable to extract chandef info");
12003 		return err;
12004 	}
12005 
12006 	err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype);
12007 	if (err < 0) {
12008 		GENL_SET_ERR_MSG(info, "chandef is invalid");
12009 		return err;
12010 	}
12011 
12012 	if (err == 0) {
12013 		GENL_SET_ERR_MSG(info,
12014 				 "Unexpected Radar indication for chandef/iftype");
12015 		return -EINVAL;
12016 	}
12017 
12018 	/* Do not process this notification if radar is already detected
12019 	 * by kernel on this channel, and return success.
12020 	 */
12021 	if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE)
12022 		return 0;
12023 
12024 	cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_UNAVAILABLE);
12025 
12026 	cfg80211_sched_dfs_chan_update(rdev);
12027 
12028 	rdev->radar_chandef = chandef;
12029 
12030 	/* Propagate this notification to other radios as well */
12031 	queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk);
12032 
12033 	return 0;
12034 }
12035 
12036 static int nl80211_parse_counter_offsets(struct cfg80211_registered_device *rdev,
12037 					 const u8 *data, size_t datalen,
12038 					 int first_count, struct nlattr *attr,
12039 					 const u16 **offsets, unsigned int *n_offsets)
12040 {
12041 	int i;
12042 
12043 	*n_offsets = 0;
12044 
12045 	if (!attr)
12046 		return 0;
12047 
12048 	if (!nla_len(attr) || (nla_len(attr) % sizeof(u16)))
12049 		return -EINVAL;
12050 
12051 	*n_offsets = nla_len(attr) / sizeof(u16);
12052 	if (rdev->wiphy.max_num_csa_counters &&
12053 	    (*n_offsets > rdev->wiphy.max_num_csa_counters))
12054 		return -EINVAL;
12055 
12056 	*offsets = nla_data(attr);
12057 
12058 	/* sanity checks - counters should fit and be the same */
12059 	for (i = 0; i < *n_offsets; i++) {
12060 		u16 offset = (*offsets)[i];
12061 
12062 		if (offset >= datalen)
12063 			return -EINVAL;
12064 
12065 		if (first_count != -1 && data[offset] != first_count)
12066 			return -EINVAL;
12067 	}
12068 
12069 	return 0;
12070 }
12071 
12072 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
12073 {
12074 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
12075 	unsigned int link_id = nl80211_link_id(info->attrs);
12076 	struct net_device *dev = info->user_ptr[1];
12077 	struct wireless_dev *wdev = dev->ieee80211_ptr;
12078 	struct cfg80211_csa_settings params;
12079 	struct nlattr **csa_attrs = NULL;
12080 	int err;
12081 	bool need_new_beacon = false;
12082 	bool need_handle_dfs_flag = true;
12083 	bool permit_npca = false;
12084 	u32 cs_count;
12085 
12086 	if (!rdev->ops->channel_switch ||
12087 	    !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
12088 		return -EOPNOTSUPP;
12089 
12090 	switch (dev->ieee80211_ptr->iftype) {
12091 	case NL80211_IFTYPE_AP:
12092 	case NL80211_IFTYPE_P2P_GO:
12093 		need_new_beacon = true;
12094 		/* For all modes except AP the handle_dfs flag needs to be
12095 		 * supplied to tell the kernel that userspace will handle radar
12096 		 * events when they happen. Otherwise a switch to a channel
12097 		 * requiring DFS will be rejected.
12098 		 */
12099 		need_handle_dfs_flag = false;
12100 
12101 		permit_npca = true;
12102 
12103 		/* useless if AP is not running */
12104 		if (!wdev->links[link_id].ap.beacon_interval)
12105 			return -ENOTCONN;
12106 		break;
12107 	case NL80211_IFTYPE_ADHOC:
12108 		if (!wdev->u.ibss.ssid_len)
12109 			return -ENOTCONN;
12110 		break;
12111 	case NL80211_IFTYPE_MESH_POINT:
12112 		if (!wdev->u.mesh.id_len)
12113 			return -ENOTCONN;
12114 		break;
12115 	default:
12116 		return -EOPNOTSUPP;
12117 	}
12118 
12119 	memset(&params, 0, sizeof(params));
12120 	params.beacon_csa.ftm_responder = -1;
12121 
12122 	if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
12123 	    !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT])
12124 		return -EINVAL;
12125 
12126 	/* only important for AP, IBSS and mesh create IEs internally */
12127 	if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES])
12128 		return -EINVAL;
12129 
12130 	/* Even though the attribute is u32, the specification says
12131 	 * u8, so let's make sure we don't overflow.
12132 	 */
12133 	cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]);
12134 	if (cs_count > 255)
12135 		return -EINVAL;
12136 
12137 	params.count = cs_count;
12138 
12139 	err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
12140 				    &params.chandef, permit_npca);
12141 	if (err)
12142 		goto free;
12143 
12144 	err = nl80211_check_npca(rdev, &params.chandef, wdev->iftype,
12145 				 info->extack);
12146 	if (err)
12147 		goto free;
12148 
12149 	if (!need_new_beacon)
12150 		goto skip_beacons;
12151 
12152 	err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_after,
12153 				   params.chandef.chan, info->extack);
12154 	if (err)
12155 		goto free;
12156 
12157 	csa_attrs = kzalloc_objs(*csa_attrs, NL80211_ATTR_MAX + 1);
12158 	if (!csa_attrs) {
12159 		err = -ENOMEM;
12160 		goto free;
12161 	}
12162 
12163 	err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX,
12164 					  info->attrs[NL80211_ATTR_CSA_IES],
12165 					  nl80211_policy, info->extack);
12166 	if (err)
12167 		goto free;
12168 
12169 	err = nl80211_parse_beacon(rdev, csa_attrs, &params.beacon_csa,
12170 				   wdev->links[link_id].ap.chandef.chan,
12171 				   info->extack);
12172 	if (err)
12173 		goto free;
12174 
12175 	if (!csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]) {
12176 		err = -EINVAL;
12177 		goto free;
12178 	}
12179 
12180 	err = nl80211_parse_counter_offsets(rdev, params.beacon_csa.tail,
12181 					    params.beacon_csa.tail_len,
12182 					    params.count,
12183 					    csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON],
12184 					    &params.counter_offsets_beacon,
12185 					    &params.n_counter_offsets_beacon);
12186 	if (err)
12187 		goto free;
12188 
12189 	err = nl80211_parse_counter_offsets(rdev, params.beacon_csa.probe_resp,
12190 					    params.beacon_csa.probe_resp_len,
12191 					    params.count,
12192 					    csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP],
12193 					    &params.counter_offsets_presp,
12194 					    &params.n_counter_offsets_presp);
12195 	if (err)
12196 		goto free;
12197 
12198 skip_beacons:
12199 	if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef,
12200 					   wdev->iftype)) {
12201 		err = -EINVAL;
12202 		goto free;
12203 	}
12204 
12205 	err = cfg80211_chandef_dfs_required(wdev->wiphy,
12206 					    &params.chandef,
12207 					    wdev->iftype);
12208 	if (err < 0)
12209 		goto free;
12210 
12211 	if (err > 0) {
12212 		params.radar_required = true;
12213 		if (need_handle_dfs_flag &&
12214 		    !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) {
12215 			err = -EINVAL;
12216 			goto free;
12217 		}
12218 	}
12219 
12220 	if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
12221 		params.block_tx = true;
12222 
12223 	if ((wdev->iftype == NL80211_IFTYPE_AP ||
12224 	     wdev->iftype == NL80211_IFTYPE_P2P_GO) &&
12225 	    info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) {
12226 		err = nl80211_parse_unsol_bcast_probe_resp(
12227 			rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP],
12228 			&params.unsol_bcast_probe_resp);
12229 		if (err)
12230 			goto free;
12231 	}
12232 
12233 	params.link_id = link_id;
12234 	err = rdev_channel_switch(rdev, dev, &params);
12235 
12236 free:
12237 	kfree(params.beacon_after.mbssid_ies);
12238 	kfree(params.beacon_csa.mbssid_ies);
12239 	kfree(params.beacon_after.rnr_ies);
12240 	kfree(params.beacon_csa.rnr_ies);
12241 	kfree(csa_attrs);
12242 	return err;
12243 }
12244 
12245 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
12246 			    u32 seq, int flags,
12247 			    struct cfg80211_registered_device *rdev,
12248 			    struct wireless_dev *wdev,
12249 			    struct cfg80211_internal_bss *intbss)
12250 {
12251 	struct cfg80211_bss *res = &intbss->pub;
12252 	const struct cfg80211_bss_ies *ies;
12253 	unsigned int link_id;
12254 	void *hdr;
12255 	struct nlattr *bss;
12256 
12257 	lockdep_assert_wiphy(wdev->wiphy);
12258 
12259 	hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
12260 			     NL80211_CMD_NEW_SCAN_RESULTS);
12261 	if (!hdr)
12262 		return -1;
12263 
12264 	genl_dump_check_consistent(cb, hdr);
12265 
12266 	if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation))
12267 		goto nla_put_failure;
12268 	if (wdev->netdev &&
12269 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex))
12270 		goto nla_put_failure;
12271 	if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
12272 			      NL80211_ATTR_PAD))
12273 		goto nla_put_failure;
12274 
12275 	bss = nla_nest_start_noflag(msg, NL80211_ATTR_BSS);
12276 	if (!bss)
12277 		goto nla_put_failure;
12278 	if ((!is_zero_ether_addr(res->bssid) &&
12279 	     nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid)))
12280 		goto nla_put_failure;
12281 
12282 	rcu_read_lock();
12283 	/* indicate whether we have probe response data or not */
12284 	if (rcu_access_pointer(res->proberesp_ies) &&
12285 	    nla_put_flag(msg, NL80211_BSS_PRESP_DATA))
12286 		goto fail_unlock_rcu;
12287 
12288 	/* this pointer prefers to be pointed to probe response data
12289 	 * but is always valid
12290 	 */
12291 	ies = rcu_dereference(res->ies);
12292 	if (ies) {
12293 		if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf,
12294 				      NL80211_BSS_PAD))
12295 			goto fail_unlock_rcu;
12296 		if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS,
12297 					ies->len, ies->data))
12298 			goto fail_unlock_rcu;
12299 	}
12300 
12301 	/* and this pointer is always (unless driver didn't know) beacon data */
12302 	ies = rcu_dereference(res->beacon_ies);
12303 	if (ies && ies->from_beacon) {
12304 		if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf,
12305 				      NL80211_BSS_PAD))
12306 			goto fail_unlock_rcu;
12307 		if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES,
12308 					ies->len, ies->data))
12309 			goto fail_unlock_rcu;
12310 	}
12311 	rcu_read_unlock();
12312 
12313 	if (res->beacon_interval &&
12314 	    nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval))
12315 		goto nla_put_failure;
12316 	if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) ||
12317 	    nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) ||
12318 	    nla_put_u32(msg, NL80211_BSS_FREQUENCY_OFFSET,
12319 			res->channel->freq_offset) ||
12320 	    nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO,
12321 			jiffies_to_msecs(jiffies - intbss->ts)))
12322 		goto nla_put_failure;
12323 
12324 	if (intbss->parent_tsf &&
12325 	    (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF,
12326 			       intbss->parent_tsf, NL80211_BSS_PAD) ||
12327 	     nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN,
12328 		     intbss->parent_bssid)))
12329 		goto nla_put_failure;
12330 
12331 	if (res->ts_boottime &&
12332 	    nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME,
12333 			      res->ts_boottime, NL80211_BSS_PAD))
12334 		goto nla_put_failure;
12335 
12336 	if (!nl80211_put_signal(msg, intbss->pub.chains,
12337 				intbss->pub.chain_signal,
12338 				NL80211_BSS_CHAIN_SIGNAL))
12339 		goto nla_put_failure;
12340 
12341 	if (intbss->bss_source != BSS_SOURCE_STA_PROFILE) {
12342 		switch (rdev->wiphy.signal_type) {
12343 		case CFG80211_SIGNAL_TYPE_MBM:
12344 			if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM,
12345 					res->signal))
12346 				goto nla_put_failure;
12347 			break;
12348 		case CFG80211_SIGNAL_TYPE_UNSPEC:
12349 			if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC,
12350 				       res->signal))
12351 				goto nla_put_failure;
12352 			break;
12353 		default:
12354 			break;
12355 		}
12356 	}
12357 
12358 	switch (wdev->iftype) {
12359 	case NL80211_IFTYPE_P2P_CLIENT:
12360 	case NL80211_IFTYPE_STATION:
12361 		for_each_valid_link(wdev, link_id) {
12362 			if (intbss == wdev->links[link_id].client.current_bss &&
12363 			    (nla_put_u32(msg, NL80211_BSS_STATUS,
12364 					 NL80211_BSS_STATUS_ASSOCIATED) ||
12365 			     (wdev->valid_links &&
12366 			      (nla_put_u8(msg, NL80211_BSS_MLO_LINK_ID,
12367 					  link_id) ||
12368 			       nla_put(msg, NL80211_BSS_MLD_ADDR, ETH_ALEN,
12369 				       wdev->u.client.connected_addr)))))
12370 				goto nla_put_failure;
12371 		}
12372 		break;
12373 	case NL80211_IFTYPE_ADHOC:
12374 		if (intbss == wdev->u.ibss.current_bss &&
12375 		    nla_put_u32(msg, NL80211_BSS_STATUS,
12376 				NL80211_BSS_STATUS_IBSS_JOINED))
12377 			goto nla_put_failure;
12378 		break;
12379 	default:
12380 		break;
12381 	}
12382 
12383 	if (nla_put_u32(msg, NL80211_BSS_USE_FOR, res->use_for))
12384 		goto nla_put_failure;
12385 
12386 	if (res->cannot_use_reasons &&
12387 	    nla_put_u64_64bit(msg, NL80211_BSS_CANNOT_USE_REASONS,
12388 			      res->cannot_use_reasons,
12389 			      NL80211_BSS_PAD))
12390 		goto nla_put_failure;
12391 
12392 	nla_nest_end(msg, bss);
12393 
12394 	genlmsg_end(msg, hdr);
12395 	return 0;
12396 
12397  fail_unlock_rcu:
12398 	rcu_read_unlock();
12399  nla_put_failure:
12400 	genlmsg_cancel(msg, hdr);
12401 	return -EMSGSIZE;
12402 }
12403 
12404 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb)
12405 {
12406 	struct cfg80211_registered_device *rdev;
12407 	struct cfg80211_internal_bss *scan;
12408 	struct wireless_dev *wdev;
12409 	struct nlattr **attrbuf;
12410 	int start = cb->args[2], idx = 0;
12411 	bool dump_include_use_data;
12412 	int err;
12413 
12414 	attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR);
12415 	if (!attrbuf)
12416 		return -ENOMEM;
12417 
12418 	err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf);
12419 	if (err) {
12420 		kfree(attrbuf);
12421 		return err;
12422 	}
12423 	/* nl80211_prepare_wdev_dump acquired it in the successful case */
12424 	__acquire(&rdev->wiphy.mtx);
12425 
12426 	dump_include_use_data =
12427 		attrbuf[NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA];
12428 	kfree(attrbuf);
12429 
12430 	spin_lock_bh(&rdev->bss_lock);
12431 
12432 	/*
12433 	 * dump_scan will be called multiple times to break up the scan results
12434 	 * into multiple messages.  It is unlikely that any more bss-es will be
12435 	 * expired after the first call, so only call only call this on the
12436 	 * first dump_scan invocation.
12437 	 */
12438 	if (start == 0)
12439 		cfg80211_bss_expire(rdev);
12440 
12441 	cb->seq = rdev->bss_generation;
12442 
12443 	list_for_each_entry(scan, &rdev->bss_list, list) {
12444 		if (++idx <= start)
12445 			continue;
12446 		if (!dump_include_use_data &&
12447 		    !(scan->pub.use_for & NL80211_BSS_USE_FOR_NORMAL))
12448 			continue;
12449 		if (nl80211_send_bss(skb, cb,
12450 				cb->nlh->nlmsg_seq, NLM_F_MULTI,
12451 				rdev, wdev, scan) < 0) {
12452 			idx--;
12453 			break;
12454 		}
12455 	}
12456 
12457 	spin_unlock_bh(&rdev->bss_lock);
12458 
12459 	cb->args[2] = idx;
12460 	wiphy_unlock(&rdev->wiphy);
12461 
12462 	return skb->len;
12463 }
12464 
12465 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq,
12466 			       int flags, struct net_device *dev,
12467 			       bool allow_radio_stats,
12468 			       struct survey_info *survey)
12469 {
12470 	void *hdr;
12471 	struct nlattr *infoattr;
12472 
12473 	/* skip radio stats if userspace didn't request them */
12474 	if (!survey->channel && !allow_radio_stats)
12475 		return 0;
12476 
12477 	hdr = nl80211hdr_put(msg, portid, seq, flags,
12478 			     NL80211_CMD_NEW_SURVEY_RESULTS);
12479 	if (!hdr)
12480 		return -ENOMEM;
12481 
12482 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
12483 		goto nla_put_failure;
12484 
12485 	infoattr = nla_nest_start_noflag(msg, NL80211_ATTR_SURVEY_INFO);
12486 	if (!infoattr)
12487 		goto nla_put_failure;
12488 
12489 	if (survey->channel &&
12490 	    nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY,
12491 			survey->channel->center_freq))
12492 		goto nla_put_failure;
12493 
12494 	if (survey->channel && survey->channel->freq_offset &&
12495 	    nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY_OFFSET,
12496 			survey->channel->freq_offset))
12497 		goto nla_put_failure;
12498 
12499 	if ((survey->filled & SURVEY_INFO_NOISE_DBM) &&
12500 	    nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise))
12501 		goto nla_put_failure;
12502 	if ((survey->filled & SURVEY_INFO_IN_USE) &&
12503 	    nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE))
12504 		goto nla_put_failure;
12505 	if ((survey->filled & SURVEY_INFO_TIME) &&
12506 	    nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME,
12507 			survey->time, NL80211_SURVEY_INFO_PAD))
12508 		goto nla_put_failure;
12509 	if ((survey->filled & SURVEY_INFO_TIME_BUSY) &&
12510 	    nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY,
12511 			      survey->time_busy, NL80211_SURVEY_INFO_PAD))
12512 		goto nla_put_failure;
12513 	if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) &&
12514 	    nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY,
12515 			      survey->time_ext_busy, NL80211_SURVEY_INFO_PAD))
12516 		goto nla_put_failure;
12517 	if ((survey->filled & SURVEY_INFO_TIME_RX) &&
12518 	    nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX,
12519 			      survey->time_rx, NL80211_SURVEY_INFO_PAD))
12520 		goto nla_put_failure;
12521 	if ((survey->filled & SURVEY_INFO_TIME_TX) &&
12522 	    nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX,
12523 			      survey->time_tx, NL80211_SURVEY_INFO_PAD))
12524 		goto nla_put_failure;
12525 	if ((survey->filled & SURVEY_INFO_TIME_SCAN) &&
12526 	    nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN,
12527 			      survey->time_scan, NL80211_SURVEY_INFO_PAD))
12528 		goto nla_put_failure;
12529 	if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) &&
12530 	    nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BSS_RX,
12531 			      survey->time_bss_rx, NL80211_SURVEY_INFO_PAD))
12532 		goto nla_put_failure;
12533 
12534 	nla_nest_end(msg, infoattr);
12535 
12536 	genlmsg_end(msg, hdr);
12537 	return 0;
12538 
12539  nla_put_failure:
12540 	genlmsg_cancel(msg, hdr);
12541 	return -EMSGSIZE;
12542 }
12543 
12544 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
12545 {
12546 	struct nlattr **attrbuf;
12547 	struct survey_info survey;
12548 	struct cfg80211_registered_device *rdev;
12549 	struct wireless_dev *wdev;
12550 	int survey_idx = cb->args[2];
12551 	int res;
12552 	bool radio_stats;
12553 
12554 	attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR);
12555 	if (!attrbuf)
12556 		return -ENOMEM;
12557 
12558 	res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf);
12559 	if (res) {
12560 		kfree(attrbuf);
12561 		return res;
12562 	}
12563 	/* nl80211_prepare_wdev_dump acquired it in the successful case */
12564 	__acquire(&rdev->wiphy.mtx);
12565 
12566 	/* prepare_wdev_dump parsed the attributes */
12567 	radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
12568 
12569 	if (!wdev->netdev) {
12570 		res = -EINVAL;
12571 		goto out_err;
12572 	}
12573 
12574 	if (!rdev->ops->dump_survey) {
12575 		res = -EOPNOTSUPP;
12576 		goto out_err;
12577 	}
12578 
12579 	while (1) {
12580 		res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey);
12581 		if (res == -ENOENT)
12582 			break;
12583 		if (res)
12584 			goto out_err;
12585 
12586 		/* don't send disabled channels, but do send non-channel data */
12587 		if (survey.channel &&
12588 		    survey.channel->flags & IEEE80211_CHAN_DISABLED) {
12589 			survey_idx++;
12590 			continue;
12591 		}
12592 
12593 		if (nl80211_send_survey(skb,
12594 				NETLINK_CB(cb->skb).portid,
12595 				cb->nlh->nlmsg_seq, NLM_F_MULTI,
12596 				wdev->netdev, radio_stats, &survey) < 0)
12597 			goto out;
12598 		survey_idx++;
12599 	}
12600 
12601  out:
12602 	cb->args[2] = survey_idx;
12603 	res = skb->len;
12604  out_err:
12605 	kfree(attrbuf);
12606 	wiphy_unlock(&rdev->wiphy);
12607 	return res;
12608 }
12609 
12610 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
12611 {
12612 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
12613 	struct net_device *dev = info->user_ptr[1];
12614 	struct ieee80211_channel *chan;
12615 	const u8 *bssid, *ssid;
12616 	int err, ssid_len;
12617 	enum nl80211_auth_type auth_type;
12618 	struct key_parse key;
12619 	bool local_state_change;
12620 	struct cfg80211_auth_request req = {};
12621 	u32 freq;
12622 
12623 	if (!info->attrs[NL80211_ATTR_MAC])
12624 		return -EINVAL;
12625 
12626 	if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
12627 		return -EINVAL;
12628 
12629 	if (!info->attrs[NL80211_ATTR_SSID])
12630 		return -EINVAL;
12631 
12632 	if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
12633 		return -EINVAL;
12634 
12635 	err = nl80211_parse_key(info, &key);
12636 	if (err)
12637 		return err;
12638 
12639 	if (key.idx >= 0) {
12640 		if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP)
12641 			return -EINVAL;
12642 		if (!key.p.key || !key.p.key_len)
12643 			return -EINVAL;
12644 		if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 ||
12645 		     key.p.key_len != WLAN_KEY_LEN_WEP40) &&
12646 		    (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 ||
12647 		     key.p.key_len != WLAN_KEY_LEN_WEP104))
12648 			return -EINVAL;
12649 		if (key.idx > 3)
12650 			return -EINVAL;
12651 	} else {
12652 		key.p.key_len = 0;
12653 		key.p.key = NULL;
12654 	}
12655 
12656 	if (key.idx >= 0) {
12657 		int i;
12658 		bool ok = false;
12659 
12660 		for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) {
12661 			if (key.p.cipher == rdev->wiphy.cipher_suites[i]) {
12662 				ok = true;
12663 				break;
12664 			}
12665 		}
12666 		if (!ok)
12667 			return -EINVAL;
12668 	}
12669 
12670 	if (!rdev->ops->auth)
12671 		return -EOPNOTSUPP;
12672 
12673 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
12674 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
12675 		return -EOPNOTSUPP;
12676 
12677 	bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
12678 	freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
12679 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
12680 		freq +=
12681 		    nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
12682 
12683 	chan = nl80211_get_valid_chan(&rdev->wiphy, freq);
12684 	if (!chan)
12685 		return -EINVAL;
12686 
12687 	ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
12688 	ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
12689 
12690 	if (info->attrs[NL80211_ATTR_IE]) {
12691 		req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
12692 		req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
12693 	}
12694 
12695 	if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) {
12696 		req.supported_selectors =
12697 			nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]);
12698 		req.supported_selectors_len =
12699 			nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]);
12700 	}
12701 
12702 	auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
12703 	if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE))
12704 		return -EINVAL;
12705 
12706 	if ((auth_type == NL80211_AUTHTYPE_SAE ||
12707 	     auth_type == NL80211_AUTHTYPE_FILS_SK ||
12708 	     auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
12709 	     auth_type == NL80211_AUTHTYPE_FILS_PK ||
12710 	     auth_type == NL80211_AUTHTYPE_EPPKE ||
12711 	     auth_type == NL80211_AUTHTYPE_IEEE8021X) &&
12712 	    !info->attrs[NL80211_ATTR_AUTH_DATA])
12713 		return -EINVAL;
12714 
12715 	if (info->attrs[NL80211_ATTR_AUTH_DATA]) {
12716 		if (auth_type != NL80211_AUTHTYPE_SAE &&
12717 		    auth_type != NL80211_AUTHTYPE_FILS_SK &&
12718 		    auth_type != NL80211_AUTHTYPE_FILS_SK_PFS &&
12719 		    auth_type != NL80211_AUTHTYPE_FILS_PK &&
12720 		    auth_type != NL80211_AUTHTYPE_EPPKE &&
12721 		    auth_type != NL80211_AUTHTYPE_IEEE8021X)
12722 			return -EINVAL;
12723 		req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
12724 		req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
12725 	}
12726 
12727 	local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
12728 
12729 	/*
12730 	 * Since we no longer track auth state, ignore
12731 	 * requests to only change local state.
12732 	 */
12733 	if (local_state_change)
12734 		return 0;
12735 
12736 	req.auth_type = auth_type;
12737 	req.key = key.p.key;
12738 	req.key_len = key.p.key_len;
12739 	req.key_idx = key.idx;
12740 	req.link_id = nl80211_link_id_or_invalid(info->attrs);
12741 	if (req.link_id >= 0) {
12742 		if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO))
12743 			return -EINVAL;
12744 		if (!info->attrs[NL80211_ATTR_MLD_ADDR])
12745 			return -EINVAL;
12746 		req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
12747 		if (!is_valid_ether_addr(req.ap_mld_addr))
12748 			return -EINVAL;
12749 	}
12750 
12751 	req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len,
12752 				   IEEE80211_BSS_TYPE_ESS,
12753 				   IEEE80211_PRIVACY_ANY);
12754 	if (!req.bss)
12755 		return -ENOENT;
12756 
12757 	err = cfg80211_mlme_auth(rdev, dev, &req);
12758 
12759 	cfg80211_put_bss(&rdev->wiphy, req.bss);
12760 
12761 	return err;
12762 }
12763 
12764 static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev,
12765 				     struct genl_info *info)
12766 {
12767 	if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
12768 		GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set");
12769 		return -EINVAL;
12770 	}
12771 
12772 	if (!rdev->ops->tx_control_port ||
12773 	    !wiphy_ext_feature_isset(&rdev->wiphy,
12774 				     NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211))
12775 		return -EOPNOTSUPP;
12776 
12777 	return 0;
12778 }
12779 
12780 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
12781 				   struct genl_info *info,
12782 				   struct cfg80211_crypto_settings *settings,
12783 				   int cipher_limit)
12784 {
12785 	memset(settings, 0, sizeof(*settings));
12786 
12787 	settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
12788 
12789 	if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
12790 		u16 proto;
12791 
12792 		proto = nla_get_u16(
12793 			info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
12794 		settings->control_port_ethertype = cpu_to_be16(proto);
12795 		if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
12796 		    proto != ETH_P_PAE)
12797 			return -EINVAL;
12798 		if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT])
12799 			settings->control_port_no_encrypt = true;
12800 	} else
12801 		settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE);
12802 
12803 	if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
12804 		int r = validate_pae_over_nl80211(rdev, info);
12805 
12806 		if (r < 0)
12807 			return r;
12808 
12809 		settings->control_port_over_nl80211 = true;
12810 
12811 		if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH])
12812 			settings->control_port_no_preauth = true;
12813 	}
12814 
12815 	if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
12816 		void *data;
12817 		int len, i;
12818 
12819 		data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
12820 		len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
12821 		settings->n_ciphers_pairwise = len / sizeof(u32);
12822 
12823 		if (len % sizeof(u32))
12824 			return -EINVAL;
12825 
12826 		if (settings->n_ciphers_pairwise > cipher_limit)
12827 			return -EINVAL;
12828 
12829 		memcpy(settings->ciphers_pairwise, data, len);
12830 
12831 		for (i = 0; i < settings->n_ciphers_pairwise; i++)
12832 			if (!cfg80211_supported_cipher_suite(
12833 					&rdev->wiphy,
12834 					settings->ciphers_pairwise[i]))
12835 				return -EINVAL;
12836 	}
12837 
12838 	if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
12839 		settings->cipher_group =
12840 			nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
12841 		if (!cfg80211_supported_cipher_suite(&rdev->wiphy,
12842 						     settings->cipher_group))
12843 			return -EINVAL;
12844 	}
12845 
12846 	if (info->attrs[NL80211_ATTR_WPA_VERSIONS])
12847 		settings->wpa_versions =
12848 			nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
12849 
12850 	if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
12851 		void *data;
12852 		int len;
12853 
12854 		data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
12855 		len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
12856 		settings->n_akm_suites = len / sizeof(u32);
12857 
12858 		if (len % sizeof(u32))
12859 			return -EINVAL;
12860 
12861 		if (settings->n_akm_suites > rdev->wiphy.max_num_akm_suites)
12862 			return -EINVAL;
12863 
12864 		memcpy(settings->akm_suites, data, len);
12865 	}
12866 
12867 	if (info->attrs[NL80211_ATTR_PMK]) {
12868 		if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN)
12869 			return -EINVAL;
12870 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
12871 					     NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) &&
12872 		    !wiphy_ext_feature_isset(&rdev->wiphy,
12873 					     NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK))
12874 			return -EINVAL;
12875 		settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]);
12876 	}
12877 
12878 	if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) {
12879 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
12880 					     NL80211_EXT_FEATURE_SAE_OFFLOAD) &&
12881 		    !wiphy_ext_feature_isset(&rdev->wiphy,
12882 					     NL80211_EXT_FEATURE_SAE_OFFLOAD_AP))
12883 			return -EINVAL;
12884 		settings->sae_pwd =
12885 			nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
12886 		settings->sae_pwd_len =
12887 			nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
12888 	}
12889 
12890 	settings->sae_pwe =
12891 		nla_get_u8_default(info->attrs[NL80211_ATTR_SAE_PWE],
12892 				   NL80211_SAE_PWE_UNSPECIFIED);
12893 
12894 	return 0;
12895 }
12896 
12897 static struct cfg80211_bss *nl80211_assoc_bss(struct cfg80211_registered_device *rdev,
12898 					      const u8 *ssid, int ssid_len,
12899 					      struct nlattr **attrs,
12900 					      int assoc_link_id, int link_id)
12901 {
12902 	struct ieee80211_channel *chan;
12903 	struct cfg80211_bss *bss;
12904 	const u8 *bssid;
12905 	u32 freq, use_for = 0;
12906 
12907 	if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_WIPHY_FREQ])
12908 		return ERR_PTR(-EINVAL);
12909 
12910 	bssid = nla_data(attrs[NL80211_ATTR_MAC]);
12911 
12912 	freq = MHZ_TO_KHZ(nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ]));
12913 	if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
12914 		freq += nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
12915 
12916 	chan = nl80211_get_valid_chan(&rdev->wiphy, freq);
12917 	if (!chan)
12918 		return ERR_PTR(-EINVAL);
12919 
12920 	if (assoc_link_id >= 0)
12921 		use_for = NL80211_BSS_USE_FOR_MLD_LINK;
12922 	if (assoc_link_id == link_id)
12923 		use_for |= NL80211_BSS_USE_FOR_NORMAL;
12924 
12925 	bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid,
12926 				 ssid, ssid_len,
12927 				 IEEE80211_BSS_TYPE_ESS,
12928 				 IEEE80211_PRIVACY_ANY,
12929 				 use_for);
12930 	if (!bss)
12931 		return ERR_PTR(-ENOENT);
12932 
12933 	return bss;
12934 }
12935 
12936 static int nl80211_process_links(struct cfg80211_registered_device *rdev,
12937 				 struct cfg80211_assoc_link *links,
12938 				 int assoc_link_id,
12939 				 const u8 *ssid, int ssid_len,
12940 				 struct genl_info *info)
12941 {
12942 	unsigned int attrsize = NUM_NL80211_ATTR * sizeof(struct nlattr *);
12943 	struct nlattr **attrs __free(kfree) = kzalloc(attrsize, GFP_KERNEL);
12944 	struct nlattr *link;
12945 	unsigned int link_id;
12946 	int rem, err;
12947 
12948 	if (!attrs)
12949 		return -ENOMEM;
12950 
12951 	nla_for_each_nested(link, info->attrs[NL80211_ATTR_MLO_LINKS], rem) {
12952 		memset(attrs, 0, attrsize);
12953 
12954 		nla_parse_nested(attrs, NL80211_ATTR_MAX, link, NULL, NULL);
12955 
12956 		if (!attrs[NL80211_ATTR_MLO_LINK_ID]) {
12957 			NL_SET_BAD_ATTR(info->extack, link);
12958 			return -EINVAL;
12959 		}
12960 
12961 		link_id = nla_get_u8(attrs[NL80211_ATTR_MLO_LINK_ID]);
12962 		/* cannot use the same link ID again */
12963 		if (links[link_id].bss) {
12964 			NL_SET_BAD_ATTR(info->extack, link);
12965 			return -EINVAL;
12966 		}
12967 		links[link_id].bss =
12968 			nl80211_assoc_bss(rdev, ssid, ssid_len, attrs,
12969 					  assoc_link_id, link_id);
12970 		if (IS_ERR(links[link_id].bss)) {
12971 			err = PTR_ERR(links[link_id].bss);
12972 			links[link_id].bss = NULL;
12973 			NL_SET_ERR_MSG_ATTR(info->extack, link,
12974 					    "Error fetching BSS for link");
12975 			return err;
12976 		}
12977 
12978 		if (attrs[NL80211_ATTR_IE]) {
12979 			links[link_id].elems = nla_data(attrs[NL80211_ATTR_IE]);
12980 			links[link_id].elems_len =
12981 				nla_len(attrs[NL80211_ATTR_IE]);
12982 
12983 			if (cfg80211_find_elem(WLAN_EID_FRAGMENT,
12984 					       links[link_id].elems,
12985 					       links[link_id].elems_len)) {
12986 				NL_SET_ERR_MSG_ATTR(info->extack,
12987 						    attrs[NL80211_ATTR_IE],
12988 						    "cannot deal with fragmentation");
12989 				return -EINVAL;
12990 			}
12991 
12992 			if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
12993 						   links[link_id].elems,
12994 						   links[link_id].elems_len)) {
12995 				NL_SET_ERR_MSG_ATTR(info->extack,
12996 						    attrs[NL80211_ATTR_IE],
12997 						    "cannot deal with non-inheritance");
12998 				return -EINVAL;
12999 			}
13000 		}
13001 	}
13002 
13003 	return 0;
13004 }
13005 
13006 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
13007 {
13008 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
13009 	struct net_device *dev = info->user_ptr[1];
13010 	struct cfg80211_assoc_request req = {};
13011 	const u8 *ap_addr, *ssid;
13012 	unsigned int link_id;
13013 	int err, ssid_len;
13014 
13015 	if (dev->ieee80211_ptr->conn_owner_nlportid &&
13016 	    dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
13017 		return -EPERM;
13018 
13019 	if (!info->attrs[NL80211_ATTR_SSID])
13020 		return -EINVAL;
13021 
13022 	if (!rdev->ops->assoc)
13023 		return -EOPNOTSUPP;
13024 
13025 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
13026 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
13027 		return -EOPNOTSUPP;
13028 
13029 	ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
13030 	ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
13031 
13032 	if (info->attrs[NL80211_ATTR_IE]) {
13033 		req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
13034 		req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
13035 
13036 		if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
13037 					   req.ie, req.ie_len)) {
13038 			NL_SET_ERR_MSG_ATTR(info->extack,
13039 					    info->attrs[NL80211_ATTR_IE],
13040 					    "non-inheritance makes no sense");
13041 			return -EINVAL;
13042 		}
13043 	}
13044 
13045 	if (info->attrs[NL80211_ATTR_USE_MFP]) {
13046 		enum nl80211_mfp mfp =
13047 			nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
13048 		if (mfp == NL80211_MFP_REQUIRED)
13049 			req.use_mfp = true;
13050 		else if (mfp != NL80211_MFP_NO)
13051 			return -EINVAL;
13052 	}
13053 
13054 	if (info->attrs[NL80211_ATTR_PREV_BSSID])
13055 		req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
13056 
13057 	if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) {
13058 		req.supported_selectors =
13059 			nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]);
13060 		req.supported_selectors_len =
13061 			nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]);
13062 	}
13063 
13064 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
13065 		req.flags |= ASSOC_REQ_DISABLE_HT;
13066 
13067 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
13068 		memcpy(&req.ht_capa_mask,
13069 		       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
13070 		       sizeof(req.ht_capa_mask));
13071 
13072 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
13073 		if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
13074 			return -EINVAL;
13075 		memcpy(&req.ht_capa,
13076 		       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
13077 		       sizeof(req.ht_capa));
13078 	}
13079 
13080 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
13081 		req.flags |= ASSOC_REQ_DISABLE_VHT;
13082 
13083 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE]))
13084 		req.flags |= ASSOC_REQ_DISABLE_HE;
13085 
13086 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT]))
13087 		req.flags |= ASSOC_REQ_DISABLE_EHT;
13088 
13089 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_UHR]))
13090 		req.flags |= ASSOC_REQ_DISABLE_UHR;
13091 
13092 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
13093 		memcpy(&req.vht_capa_mask,
13094 		       nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
13095 		       sizeof(req.vht_capa_mask));
13096 
13097 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
13098 		if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
13099 			return -EINVAL;
13100 		memcpy(&req.vht_capa,
13101 		       nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
13102 		       sizeof(req.vht_capa));
13103 	}
13104 
13105 	if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
13106 		if (!((rdev->wiphy.features &
13107 			NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
13108 		       (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
13109 		    !wiphy_ext_feature_isset(&rdev->wiphy,
13110 					     NL80211_EXT_FEATURE_RRM))
13111 			return -EINVAL;
13112 		req.flags |= ASSOC_REQ_USE_RRM;
13113 	}
13114 
13115 	if (info->attrs[NL80211_ATTR_FILS_KEK]) {
13116 		req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]);
13117 		req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]);
13118 		if (!info->attrs[NL80211_ATTR_FILS_NONCES])
13119 			return -EINVAL;
13120 		req.fils_nonces =
13121 			nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]);
13122 	}
13123 
13124 	if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) {
13125 		if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY])
13126 			return -EINVAL;
13127 		memcpy(&req.s1g_capa_mask,
13128 		       nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]),
13129 		       sizeof(req.s1g_capa_mask));
13130 	}
13131 
13132 	if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) {
13133 		if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK])
13134 			return -EINVAL;
13135 		memcpy(&req.s1g_capa,
13136 		       nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]),
13137 		       sizeof(req.s1g_capa));
13138 	}
13139 
13140 	if (nla_get_flag(info->attrs[NL80211_ATTR_ASSOC_SPP_AMSDU])) {
13141 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
13142 					     NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT)) {
13143 			GENL_SET_ERR_MSG(info, "SPP A-MSDUs not supported");
13144 			return -EINVAL;
13145 		}
13146 		req.flags |= ASSOC_REQ_SPP_AMSDU;
13147 	}
13148 
13149 	req.link_id = nl80211_link_id_or_invalid(info->attrs);
13150 
13151 	if (info->attrs[NL80211_ATTR_MLO_LINKS]) {
13152 		if (req.link_id < 0)
13153 			return -EINVAL;
13154 
13155 		if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO))
13156 			return -EINVAL;
13157 
13158 		if (info->attrs[NL80211_ATTR_MAC] ||
13159 		    info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
13160 		    !info->attrs[NL80211_ATTR_MLD_ADDR])
13161 			return -EINVAL;
13162 
13163 		req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
13164 		ap_addr = req.ap_mld_addr;
13165 
13166 		err = nl80211_process_links(rdev, req.links, req.link_id,
13167 					    ssid, ssid_len, info);
13168 		if (err)
13169 			goto free;
13170 
13171 		if (!req.links[req.link_id].bss) {
13172 			err = -EINVAL;
13173 			goto free;
13174 		}
13175 
13176 		if (req.links[req.link_id].elems_len) {
13177 			GENL_SET_ERR_MSG(info,
13178 					 "cannot have per-link elems on assoc link");
13179 			err = -EINVAL;
13180 			goto free;
13181 		}
13182 
13183 		if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS])
13184 			req.ext_mld_capa_ops =
13185 				nla_get_u16(info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]);
13186 	} else {
13187 		if (req.link_id >= 0)
13188 			return -EINVAL;
13189 
13190 		req.bss = nl80211_assoc_bss(rdev, ssid, ssid_len, info->attrs,
13191 					    -1, -1);
13192 		if (IS_ERR(req.bss))
13193 			return PTR_ERR(req.bss);
13194 		ap_addr = req.bss->bssid;
13195 
13196 		if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS])
13197 			return -EINVAL;
13198 	}
13199 
13200 	err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
13201 	if (!err) {
13202 		struct nlattr *link;
13203 		int rem = 0;
13204 
13205 		err = cfg80211_mlme_assoc(rdev, dev, &req,
13206 					  info->extack);
13207 
13208 		if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
13209 			dev->ieee80211_ptr->conn_owner_nlportid =
13210 				info->snd_portid;
13211 			memcpy(dev->ieee80211_ptr->disconnect_bssid,
13212 			       ap_addr, ETH_ALEN);
13213 		}
13214 
13215 		/* Report error from first problematic link */
13216 		if (info->attrs[NL80211_ATTR_MLO_LINKS]) {
13217 			nla_for_each_nested(link,
13218 					    info->attrs[NL80211_ATTR_MLO_LINKS],
13219 					    rem) {
13220 				struct nlattr *link_id_attr =
13221 					nla_find_nested(link, NL80211_ATTR_MLO_LINK_ID);
13222 
13223 				if (!link_id_attr)
13224 					continue;
13225 
13226 				link_id = nla_get_u8(link_id_attr);
13227 
13228 				if (link_id == req.link_id)
13229 					continue;
13230 
13231 				if (!req.links[link_id].error ||
13232 				    WARN_ON(req.links[link_id].error > 0))
13233 					continue;
13234 
13235 				WARN_ON(err >= 0);
13236 
13237 				NL_SET_BAD_ATTR(info->extack, link);
13238 				err = req.links[link_id].error;
13239 				break;
13240 			}
13241 		}
13242 	}
13243 
13244 free:
13245 	for (link_id = 0; link_id < ARRAY_SIZE(req.links); link_id++)
13246 		cfg80211_put_bss(&rdev->wiphy, req.links[link_id].bss);
13247 	cfg80211_put_bss(&rdev->wiphy, req.bss);
13248 
13249 	return err;
13250 }
13251 
13252 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
13253 {
13254 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
13255 	struct net_device *dev = info->user_ptr[1];
13256 	const u8 *ie = NULL, *bssid;
13257 	int ie_len = 0;
13258 	u16 reason_code;
13259 	bool local_state_change;
13260 
13261 	if (dev->ieee80211_ptr->conn_owner_nlportid &&
13262 	    dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
13263 		return -EPERM;
13264 
13265 	if (!info->attrs[NL80211_ATTR_MAC])
13266 		return -EINVAL;
13267 
13268 	if (!info->attrs[NL80211_ATTR_REASON_CODE])
13269 		return -EINVAL;
13270 
13271 	if (!rdev->ops->deauth)
13272 		return -EOPNOTSUPP;
13273 
13274 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
13275 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
13276 		return -EOPNOTSUPP;
13277 
13278 	bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
13279 
13280 	reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
13281 	if (reason_code == 0) {
13282 		/* Reason Code 0 is reserved */
13283 		return -EINVAL;
13284 	}
13285 
13286 	if (info->attrs[NL80211_ATTR_IE]) {
13287 		ie = nla_data(info->attrs[NL80211_ATTR_IE]);
13288 		ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
13289 	}
13290 
13291 	local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
13292 
13293 	return cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code,
13294 				    local_state_change);
13295 }
13296 
13297 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
13298 {
13299 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
13300 	struct net_device *dev = info->user_ptr[1];
13301 	const u8 *ie = NULL, *bssid;
13302 	int ie_len = 0;
13303 	u16 reason_code;
13304 	bool local_state_change;
13305 
13306 	if (dev->ieee80211_ptr->conn_owner_nlportid &&
13307 	    dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
13308 		return -EPERM;
13309 
13310 	if (!info->attrs[NL80211_ATTR_MAC])
13311 		return -EINVAL;
13312 
13313 	if (!info->attrs[NL80211_ATTR_REASON_CODE])
13314 		return -EINVAL;
13315 
13316 	if (!rdev->ops->disassoc)
13317 		return -EOPNOTSUPP;
13318 
13319 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
13320 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
13321 		return -EOPNOTSUPP;
13322 
13323 	bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
13324 
13325 	reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
13326 	if (reason_code == 0) {
13327 		/* Reason Code 0 is reserved */
13328 		return -EINVAL;
13329 	}
13330 
13331 	if (info->attrs[NL80211_ATTR_IE]) {
13332 		ie = nla_data(info->attrs[NL80211_ATTR_IE]);
13333 		ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
13334 	}
13335 
13336 	local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
13337 
13338 	return cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code,
13339 				      local_state_change);
13340 }
13341 
13342 static bool
13343 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev,
13344 			 int mcast_rate[NUM_NL80211_BANDS],
13345 			 int rateval)
13346 {
13347 	struct wiphy *wiphy = &rdev->wiphy;
13348 	bool found = false;
13349 	int band, i;
13350 
13351 	for (band = 0; band < NUM_NL80211_BANDS; band++) {
13352 		struct ieee80211_supported_band *sband;
13353 
13354 		sband = wiphy->bands[band];
13355 		if (!sband)
13356 			continue;
13357 
13358 		for (i = 0; i < sband->n_bitrates; i++) {
13359 			if (sband->bitrates[i].bitrate == rateval) {
13360 				mcast_rate[band] = i + 1;
13361 				found = true;
13362 				break;
13363 			}
13364 		}
13365 	}
13366 
13367 	return found;
13368 }
13369 
13370 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
13371 {
13372 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
13373 	struct net_device *dev = info->user_ptr[1];
13374 	struct cfg80211_ibss_params ibss;
13375 	struct wiphy *wiphy;
13376 	struct cfg80211_cached_keys *connkeys = NULL;
13377 	int err;
13378 
13379 	memset(&ibss, 0, sizeof(ibss));
13380 
13381 	if (!info->attrs[NL80211_ATTR_SSID] ||
13382 	    !nla_len(info->attrs[NL80211_ATTR_SSID]))
13383 		return -EINVAL;
13384 
13385 	ibss.beacon_interval = 100;
13386 
13387 	if (info->attrs[NL80211_ATTR_BEACON_INTERVAL])
13388 		ibss.beacon_interval =
13389 			nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
13390 
13391 	err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC,
13392 					   ibss.beacon_interval);
13393 	if (err)
13394 		return err;
13395 
13396 	if (!rdev->ops->join_ibss)
13397 		return -EOPNOTSUPP;
13398 
13399 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
13400 		return -EOPNOTSUPP;
13401 
13402 	wiphy = &rdev->wiphy;
13403 
13404 	if (info->attrs[NL80211_ATTR_MAC]) {
13405 		ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
13406 
13407 		if (!is_valid_ether_addr(ibss.bssid))
13408 			return -EINVAL;
13409 	}
13410 	ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
13411 	ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
13412 
13413 	if (info->attrs[NL80211_ATTR_IE]) {
13414 		ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
13415 		ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
13416 	}
13417 
13418 	err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
13419 				    &ibss.chandef, false);
13420 	if (err)
13421 		return err;
13422 
13423 	if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef,
13424 				     NL80211_IFTYPE_ADHOC))
13425 		return -EINVAL;
13426 
13427 	switch (ibss.chandef.width) {
13428 	case NL80211_CHAN_WIDTH_20_NOHT:
13429 		break;
13430 	case NL80211_CHAN_WIDTH_20:
13431 	case NL80211_CHAN_WIDTH_40:
13432 		if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
13433 			return -EINVAL;
13434 		break;
13435 	case NL80211_CHAN_WIDTH_80:
13436 	case NL80211_CHAN_WIDTH_80P80:
13437 	case NL80211_CHAN_WIDTH_160:
13438 		if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
13439 			return -EINVAL;
13440 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
13441 					     NL80211_EXT_FEATURE_VHT_IBSS))
13442 			return -EINVAL;
13443 		break;
13444 	case NL80211_CHAN_WIDTH_320:
13445 		return -EINVAL;
13446 	default:
13447 		return -EINVAL;
13448 	}
13449 
13450 	ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
13451 	ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
13452 
13453 	if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
13454 		u8 *rates =
13455 			nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
13456 		int n_rates =
13457 			nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
13458 		struct ieee80211_supported_band *sband =
13459 			wiphy->bands[ibss.chandef.chan->band];
13460 
13461 		err = ieee80211_get_ratemask(sband, rates, n_rates,
13462 					     &ibss.basic_rates);
13463 		if (err)
13464 			return err;
13465 	}
13466 
13467 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
13468 		memcpy(&ibss.ht_capa_mask,
13469 		       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
13470 		       sizeof(ibss.ht_capa_mask));
13471 
13472 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
13473 		if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
13474 			return -EINVAL;
13475 		memcpy(&ibss.ht_capa,
13476 		       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
13477 		       sizeof(ibss.ht_capa));
13478 	}
13479 
13480 	if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
13481 	    !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate,
13482 			nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
13483 		return -EINVAL;
13484 
13485 	if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
13486 		bool no_ht = false;
13487 
13488 		connkeys = nl80211_parse_connkeys(rdev, dev->ieee80211_ptr,
13489 						  info, &no_ht);
13490 		if (IS_ERR(connkeys))
13491 			return PTR_ERR(connkeys);
13492 
13493 		if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) &&
13494 		    no_ht) {
13495 			kfree_sensitive(connkeys);
13496 			return -EINVAL;
13497 		}
13498 	}
13499 
13500 	ibss.control_port =
13501 		nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]);
13502 
13503 	if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
13504 		int r = validate_pae_over_nl80211(rdev, info);
13505 
13506 		if (r < 0) {
13507 			kfree_sensitive(connkeys);
13508 			return r;
13509 		}
13510 
13511 		ibss.control_port_over_nl80211 = true;
13512 	}
13513 
13514 	ibss.userspace_handles_dfs =
13515 		nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
13516 
13517 	err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
13518 	if (err)
13519 		kfree_sensitive(connkeys);
13520 	else if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
13521 		dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
13522 
13523 	return err;
13524 }
13525 
13526 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
13527 {
13528 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
13529 	struct net_device *dev = info->user_ptr[1];
13530 
13531 	if (!rdev->ops->leave_ibss)
13532 		return -EOPNOTSUPP;
13533 
13534 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
13535 		return -EOPNOTSUPP;
13536 
13537 	return cfg80211_leave_ibss(rdev, dev, false);
13538 }
13539 
13540 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info)
13541 {
13542 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
13543 	struct net_device *dev = info->user_ptr[1];
13544 	int mcast_rate[NUM_NL80211_BANDS];
13545 	u32 nla_rate;
13546 
13547 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
13548 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
13549 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB)
13550 		return -EOPNOTSUPP;
13551 
13552 	if (!rdev->ops->set_mcast_rate)
13553 		return -EOPNOTSUPP;
13554 
13555 	memset(mcast_rate, 0, sizeof(mcast_rate));
13556 
13557 	if (!info->attrs[NL80211_ATTR_MCAST_RATE])
13558 		return -EINVAL;
13559 
13560 	nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
13561 	if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate))
13562 		return -EINVAL;
13563 
13564 	return rdev_set_mcast_rate(rdev, dev, mcast_rate);
13565 }
13566 
13567 static struct sk_buff *
13568 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
13569 			    struct wireless_dev *wdev, int approxlen,
13570 			    u32 portid, u32 seq, enum nl80211_commands cmd,
13571 			    enum nl80211_attrs attr,
13572 			    const struct nl80211_vendor_cmd_info *info,
13573 			    gfp_t gfp)
13574 {
13575 	struct sk_buff *skb;
13576 	void *hdr;
13577 	struct nlattr *data;
13578 
13579 	skb = nlmsg_new(approxlen + 100, gfp);
13580 	if (!skb)
13581 		return NULL;
13582 
13583 	hdr = nl80211hdr_put(skb, portid, seq, 0, cmd);
13584 	if (!hdr) {
13585 		kfree_skb(skb);
13586 		return NULL;
13587 	}
13588 
13589 	if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
13590 		goto nla_put_failure;
13591 
13592 	if (info) {
13593 		if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID,
13594 				info->vendor_id))
13595 			goto nla_put_failure;
13596 		if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD,
13597 				info->subcmd))
13598 			goto nla_put_failure;
13599 	}
13600 
13601 	if (wdev) {
13602 		if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
13603 				      wdev_id(wdev), NL80211_ATTR_PAD))
13604 			goto nla_put_failure;
13605 		if (wdev->netdev &&
13606 		    nla_put_u32(skb, NL80211_ATTR_IFINDEX,
13607 				wdev->netdev->ifindex))
13608 			goto nla_put_failure;
13609 	}
13610 
13611 	data = nla_nest_start_noflag(skb, attr);
13612 	if (!data)
13613 		goto nla_put_failure;
13614 
13615 	((void **)skb->cb)[0] = rdev;
13616 	((void **)skb->cb)[1] = hdr;
13617 	((void **)skb->cb)[2] = data;
13618 
13619 	return skb;
13620 
13621  nla_put_failure:
13622 	kfree_skb(skb);
13623 	return NULL;
13624 }
13625 
13626 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
13627 					   struct wireless_dev *wdev,
13628 					   enum nl80211_commands cmd,
13629 					   enum nl80211_attrs attr,
13630 					   unsigned int portid,
13631 					   int vendor_event_idx,
13632 					   int approxlen, gfp_t gfp)
13633 {
13634 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
13635 	const struct nl80211_vendor_cmd_info *info;
13636 
13637 	switch (cmd) {
13638 	case NL80211_CMD_TESTMODE:
13639 		if (WARN_ON(vendor_event_idx != -1))
13640 			return NULL;
13641 		info = NULL;
13642 		break;
13643 	case NL80211_CMD_VENDOR:
13644 		if (WARN_ON(vendor_event_idx < 0 ||
13645 			    vendor_event_idx >= wiphy->n_vendor_events))
13646 			return NULL;
13647 		info = &wiphy->vendor_events[vendor_event_idx];
13648 		break;
13649 	default:
13650 		WARN_ON(1);
13651 		return NULL;
13652 	}
13653 
13654 	return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, portid, 0,
13655 					   cmd, attr, info, gfp);
13656 }
13657 EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
13658 
13659 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
13660 {
13661 	struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
13662 	void *hdr = ((void **)skb->cb)[1];
13663 	struct nlmsghdr *nlhdr = nlmsg_hdr(skb);
13664 	struct nlattr *data = ((void **)skb->cb)[2];
13665 	enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
13666 
13667 	/* clear CB data for netlink core to own from now on */
13668 	memset(skb->cb, 0, sizeof(skb->cb));
13669 
13670 	nla_nest_end(skb, data);
13671 	genlmsg_end(skb, hdr);
13672 
13673 	if (nlhdr->nlmsg_pid) {
13674 		genlmsg_unicast(wiphy_net(&rdev->wiphy), skb,
13675 				nlhdr->nlmsg_pid);
13676 	} else {
13677 		if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
13678 			mcgrp = NL80211_MCGRP_VENDOR;
13679 
13680 		genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
13681 					skb, 0, mcgrp, gfp);
13682 	}
13683 }
13684 EXPORT_SYMBOL(__cfg80211_send_event_skb);
13685 
13686 #ifdef CONFIG_NL80211_TESTMODE
13687 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
13688 {
13689 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
13690 	struct wireless_dev *wdev;
13691 	int err;
13692 
13693 	lockdep_assert_held(&rdev->wiphy.mtx);
13694 
13695 	wdev = __cfg80211_wdev_from_attrs(rdev, genl_info_net(info),
13696 					  info->attrs);
13697 
13698 	if (!rdev->ops->testmode_cmd)
13699 		return -EOPNOTSUPP;
13700 
13701 	if (IS_ERR(wdev)) {
13702 		err = PTR_ERR(wdev);
13703 		if (err != -EINVAL)
13704 			return err;
13705 		wdev = NULL;
13706 	} else if (wdev->wiphy != &rdev->wiphy) {
13707 		return -EINVAL;
13708 	}
13709 
13710 	if (!info->attrs[NL80211_ATTR_TESTDATA])
13711 		return -EINVAL;
13712 
13713 	rdev->cur_cmd_info = info;
13714 	err = rdev_testmode_cmd(rdev, wdev,
13715 				nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
13716 				nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
13717 	rdev->cur_cmd_info = NULL;
13718 
13719 	return err;
13720 }
13721 
13722 static int nl80211_testmode_dump(struct sk_buff *skb,
13723 				 struct netlink_callback *cb)
13724 {
13725 	struct cfg80211_registered_device *rdev;
13726 	struct nlattr **attrbuf = NULL;
13727 	int err;
13728 	long phy_idx;
13729 	void *data = NULL;
13730 	int data_len = 0;
13731 
13732 	rtnl_lock();
13733 
13734 	if (cb->args[0]) {
13735 		/*
13736 		 * 0 is a valid index, but not valid for args[0],
13737 		 * so we need to offset by 1.
13738 		 */
13739 		phy_idx = cb->args[0] - 1;
13740 
13741 		rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
13742 		if (!rdev) {
13743 			err = -ENOENT;
13744 			goto out_err;
13745 		}
13746 
13747 		/*
13748 		 * The wiphy may have moved netns between dumpit
13749 		 * invocations (via NL80211_CMD_SET_WIPHY_NETNS), so
13750 		 * re-check that it still matches the caller's netns.
13751 		 */
13752 		if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) {
13753 			err = -ENODEV;
13754 			goto out_err;
13755 		}
13756 	} else {
13757 		attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR);
13758 		if (!attrbuf) {
13759 			err = -ENOMEM;
13760 			goto out_err;
13761 		}
13762 
13763 		err = nlmsg_parse_deprecated(cb->nlh,
13764 					     GENL_HDRLEN + nl80211_fam.hdrsize,
13765 					     attrbuf, nl80211_fam.maxattr,
13766 					     nl80211_policy, NULL);
13767 		if (err)
13768 			goto out_err;
13769 
13770 		rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
13771 		if (IS_ERR(rdev)) {
13772 			err = PTR_ERR(rdev);
13773 			goto out_err;
13774 		}
13775 		phy_idx = rdev->wiphy_idx;
13776 
13777 		if (attrbuf[NL80211_ATTR_TESTDATA])
13778 			cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA];
13779 	}
13780 
13781 	if (cb->args[1]) {
13782 		data = nla_data((void *)cb->args[1]);
13783 		data_len = nla_len((void *)cb->args[1]);
13784 	}
13785 
13786 	if (!rdev->ops->testmode_dump) {
13787 		err = -EOPNOTSUPP;
13788 		goto out_err;
13789 	}
13790 
13791 	while (1) {
13792 		void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
13793 					   cb->nlh->nlmsg_seq, NLM_F_MULTI,
13794 					   NL80211_CMD_TESTMODE);
13795 		struct nlattr *tmdata;
13796 
13797 		if (!hdr)
13798 			break;
13799 
13800 		if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) {
13801 			genlmsg_cancel(skb, hdr);
13802 			break;
13803 		}
13804 
13805 		tmdata = nla_nest_start_noflag(skb, NL80211_ATTR_TESTDATA);
13806 		if (!tmdata) {
13807 			genlmsg_cancel(skb, hdr);
13808 			break;
13809 		}
13810 		err = rdev_testmode_dump(rdev, skb, cb, data, data_len);
13811 		nla_nest_end(skb, tmdata);
13812 
13813 		if (err == -ENOBUFS || err == -ENOENT) {
13814 			genlmsg_cancel(skb, hdr);
13815 			break;
13816 		} else if (err) {
13817 			genlmsg_cancel(skb, hdr);
13818 			goto out_err;
13819 		}
13820 
13821 		genlmsg_end(skb, hdr);
13822 	}
13823 
13824 	err = skb->len;
13825 	/* see above */
13826 	cb->args[0] = phy_idx + 1;
13827  out_err:
13828 	kfree(attrbuf);
13829 	rtnl_unlock();
13830 	return err;
13831 }
13832 #endif
13833 
13834 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
13835 {
13836 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
13837 	struct net_device *dev = info->user_ptr[1];
13838 	struct cfg80211_connect_params connect;
13839 	struct wiphy *wiphy;
13840 	struct cfg80211_cached_keys *connkeys = NULL;
13841 	u32 freq = 0;
13842 	int err;
13843 
13844 	memset(&connect, 0, sizeof(connect));
13845 
13846 	if (!info->attrs[NL80211_ATTR_SSID] ||
13847 	    !nla_len(info->attrs[NL80211_ATTR_SSID]))
13848 		return -EINVAL;
13849 
13850 	if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
13851 		connect.auth_type =
13852 			nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
13853 		if (!nl80211_valid_auth_type(rdev, connect.auth_type,
13854 					     NL80211_CMD_CONNECT))
13855 			return -EINVAL;
13856 	} else
13857 		connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
13858 
13859 	connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
13860 
13861 	if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] &&
13862 	    !wiphy_ext_feature_isset(&rdev->wiphy,
13863 				     NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
13864 		return -EINVAL;
13865 	connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS];
13866 
13867 	err = nl80211_crypto_settings(rdev, info, &connect.crypto,
13868 				      NL80211_MAX_NR_CIPHER_SUITES);
13869 	if (err)
13870 		return err;
13871 
13872 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
13873 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
13874 		return -EOPNOTSUPP;
13875 
13876 	wiphy = &rdev->wiphy;
13877 
13878 	connect.bg_scan_period = -1;
13879 	if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] &&
13880 		(wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) {
13881 		connect.bg_scan_period =
13882 			nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]);
13883 	}
13884 
13885 	if (info->attrs[NL80211_ATTR_MAC])
13886 		connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
13887 	else if (info->attrs[NL80211_ATTR_MAC_HINT])
13888 		connect.bssid_hint =
13889 			nla_data(info->attrs[NL80211_ATTR_MAC_HINT]);
13890 	connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
13891 	connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
13892 
13893 	if (info->attrs[NL80211_ATTR_IE]) {
13894 		connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
13895 		connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
13896 	}
13897 
13898 	if (info->attrs[NL80211_ATTR_USE_MFP]) {
13899 		connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
13900 		if (connect.mfp == NL80211_MFP_OPTIONAL &&
13901 		    !wiphy_ext_feature_isset(&rdev->wiphy,
13902 					     NL80211_EXT_FEATURE_MFP_OPTIONAL))
13903 			return -EOPNOTSUPP;
13904 	} else {
13905 		connect.mfp = NL80211_MFP_NO;
13906 	}
13907 
13908 	if (info->attrs[NL80211_ATTR_PREV_BSSID])
13909 		connect.prev_bssid =
13910 			nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
13911 
13912 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ])
13913 		freq = MHZ_TO_KHZ(nla_get_u32(
13914 					info->attrs[NL80211_ATTR_WIPHY_FREQ]));
13915 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
13916 		freq +=
13917 		    nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
13918 
13919 	if (freq) {
13920 		connect.channel = nl80211_get_valid_chan(wiphy, freq);
13921 		if (!connect.channel)
13922 			return -EINVAL;
13923 	} else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) {
13924 		freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]);
13925 		freq = MHZ_TO_KHZ(freq);
13926 		connect.channel_hint = nl80211_get_valid_chan(wiphy, freq);
13927 		if (!connect.channel_hint)
13928 			return -EINVAL;
13929 	}
13930 
13931 	if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) {
13932 		connect.edmg.channels =
13933 		      nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]);
13934 
13935 		if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG])
13936 			connect.edmg.bw_config =
13937 				nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]);
13938 	}
13939 
13940 	if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
13941 		connkeys = nl80211_parse_connkeys(rdev, dev->ieee80211_ptr,
13942 						  info, NULL);
13943 		if (IS_ERR(connkeys))
13944 			return PTR_ERR(connkeys);
13945 	}
13946 
13947 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
13948 		connect.flags |= ASSOC_REQ_DISABLE_HT;
13949 
13950 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
13951 		memcpy(&connect.ht_capa_mask,
13952 		       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
13953 		       sizeof(connect.ht_capa_mask));
13954 
13955 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
13956 		if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
13957 			kfree_sensitive(connkeys);
13958 			return -EINVAL;
13959 		}
13960 		memcpy(&connect.ht_capa,
13961 		       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
13962 		       sizeof(connect.ht_capa));
13963 	}
13964 
13965 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
13966 		connect.flags |= ASSOC_REQ_DISABLE_VHT;
13967 
13968 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE]))
13969 		connect.flags |= ASSOC_REQ_DISABLE_HE;
13970 
13971 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT]))
13972 		connect.flags |= ASSOC_REQ_DISABLE_EHT;
13973 
13974 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_UHR]))
13975 		connect.flags |= ASSOC_REQ_DISABLE_UHR;
13976 
13977 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
13978 		memcpy(&connect.vht_capa_mask,
13979 		       nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
13980 		       sizeof(connect.vht_capa_mask));
13981 
13982 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
13983 		if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
13984 			kfree_sensitive(connkeys);
13985 			return -EINVAL;
13986 		}
13987 		memcpy(&connect.vht_capa,
13988 		       nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
13989 		       sizeof(connect.vht_capa));
13990 	}
13991 
13992 	if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
13993 		if (!((rdev->wiphy.features &
13994 			NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
13995 		       (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
13996 		    !wiphy_ext_feature_isset(&rdev->wiphy,
13997 					     NL80211_EXT_FEATURE_RRM)) {
13998 			kfree_sensitive(connkeys);
13999 			return -EINVAL;
14000 		}
14001 		connect.flags |= ASSOC_REQ_USE_RRM;
14002 	}
14003 
14004 	connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
14005 	if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) {
14006 		kfree_sensitive(connkeys);
14007 		return -EOPNOTSUPP;
14008 	}
14009 
14010 	if (info->attrs[NL80211_ATTR_BSS_SELECT]) {
14011 		/* bss selection makes no sense if bssid is set */
14012 		if (connect.bssid) {
14013 			kfree_sensitive(connkeys);
14014 			return -EINVAL;
14015 		}
14016 
14017 		err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT],
14018 				       wiphy, &connect.bss_select);
14019 		if (err) {
14020 			kfree_sensitive(connkeys);
14021 			return err;
14022 		}
14023 	}
14024 
14025 	if (wiphy_ext_feature_isset(&rdev->wiphy,
14026 				    NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
14027 	    info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
14028 	    info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
14029 	    info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
14030 	    info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
14031 		connect.fils_erp_username =
14032 			nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
14033 		connect.fils_erp_username_len =
14034 			nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
14035 		connect.fils_erp_realm =
14036 			nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
14037 		connect.fils_erp_realm_len =
14038 			nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
14039 		connect.fils_erp_next_seq_num =
14040 			nla_get_u16(
14041 			   info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
14042 		connect.fils_erp_rrk =
14043 			nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
14044 		connect.fils_erp_rrk_len =
14045 			nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
14046 	} else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
14047 		   info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
14048 		   info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
14049 		   info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
14050 		kfree_sensitive(connkeys);
14051 		return -EINVAL;
14052 	}
14053 
14054 	if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) {
14055 		if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
14056 			kfree_sensitive(connkeys);
14057 			GENL_SET_ERR_MSG(info,
14058 					 "external auth requires connection ownership");
14059 			return -EINVAL;
14060 		}
14061 		connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT;
14062 	}
14063 
14064 	if (nla_get_flag(info->attrs[NL80211_ATTR_MLO_SUPPORT]))
14065 		connect.flags |= CONNECT_REQ_MLO_SUPPORT;
14066 
14067 	err = cfg80211_connect(rdev, dev, &connect, connkeys,
14068 			       connect.prev_bssid);
14069 	if (err)
14070 		kfree_sensitive(connkeys);
14071 
14072 	if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
14073 		dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
14074 		if (connect.bssid)
14075 			memcpy(dev->ieee80211_ptr->disconnect_bssid,
14076 			       connect.bssid, ETH_ALEN);
14077 		else
14078 			eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid);
14079 	}
14080 
14081 	return err;
14082 }
14083 
14084 static int nl80211_update_connect_params(struct sk_buff *skb,
14085 					 struct genl_info *info)
14086 {
14087 	struct cfg80211_connect_params connect = {};
14088 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14089 	struct net_device *dev = info->user_ptr[1];
14090 	struct wireless_dev *wdev = dev->ieee80211_ptr;
14091 	bool fils_sk_offload;
14092 	u32 auth_type;
14093 	u32 changed = 0;
14094 
14095 	if (!rdev->ops->update_connect_params)
14096 		return -EOPNOTSUPP;
14097 
14098 	if (info->attrs[NL80211_ATTR_IE]) {
14099 		connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
14100 		connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
14101 		changed |= UPDATE_ASSOC_IES;
14102 	}
14103 
14104 	fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy,
14105 						  NL80211_EXT_FEATURE_FILS_SK_OFFLOAD);
14106 
14107 	/*
14108 	 * when driver supports fils-sk offload all attributes must be
14109 	 * provided. So the else covers "fils-sk-not-all" and
14110 	 * "no-fils-sk-any".
14111 	 */
14112 	if (fils_sk_offload &&
14113 	    info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
14114 	    info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
14115 	    info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
14116 	    info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
14117 		connect.fils_erp_username =
14118 			nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
14119 		connect.fils_erp_username_len =
14120 			nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
14121 		connect.fils_erp_realm =
14122 			nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
14123 		connect.fils_erp_realm_len =
14124 			nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
14125 		connect.fils_erp_next_seq_num =
14126 			nla_get_u16(
14127 			   info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
14128 		connect.fils_erp_rrk =
14129 			nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
14130 		connect.fils_erp_rrk_len =
14131 			nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
14132 		changed |= UPDATE_FILS_ERP_INFO;
14133 	} else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
14134 		   info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
14135 		   info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
14136 		   info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
14137 		return -EINVAL;
14138 	}
14139 
14140 	if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
14141 		auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
14142 		if (!nl80211_valid_auth_type(rdev, auth_type,
14143 					     NL80211_CMD_CONNECT))
14144 			return -EINVAL;
14145 
14146 		if (auth_type == NL80211_AUTHTYPE_FILS_SK &&
14147 		    fils_sk_offload && !(changed & UPDATE_FILS_ERP_INFO))
14148 			return -EINVAL;
14149 
14150 		connect.auth_type = auth_type;
14151 		changed |= UPDATE_AUTH_TYPE;
14152 	}
14153 
14154 	if (!wdev->connected)
14155 		return -ENOLINK;
14156 
14157 	return rdev_update_connect_params(rdev, dev, &connect, changed);
14158 }
14159 
14160 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
14161 {
14162 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14163 	struct net_device *dev = info->user_ptr[1];
14164 	u16 reason;
14165 
14166 	if (dev->ieee80211_ptr->conn_owner_nlportid &&
14167 	    dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
14168 		return -EPERM;
14169 
14170 	reason = nla_get_u16_default(info->attrs[NL80211_ATTR_REASON_CODE],
14171 				     WLAN_REASON_DEAUTH_LEAVING);
14172 
14173 	if (reason == 0)
14174 		return -EINVAL;
14175 
14176 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
14177 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
14178 		return -EOPNOTSUPP;
14179 
14180 	return cfg80211_disconnect(rdev, dev, reason, true);
14181 }
14182 
14183 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
14184 {
14185 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14186 	struct net *net;
14187 	int err;
14188 
14189 	if (info->attrs[NL80211_ATTR_PID]) {
14190 		u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
14191 
14192 		net = get_net_ns_by_pid(pid);
14193 	} else if (info->attrs[NL80211_ATTR_NETNS_FD]) {
14194 		u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]);
14195 
14196 		net = get_net_ns_by_fd(fd);
14197 	} else {
14198 		return -EINVAL;
14199 	}
14200 
14201 	if (IS_ERR(net))
14202 		return PTR_ERR(net);
14203 
14204 	/*
14205 	 * The caller already has CAP_NET_ADMIN over the source netns
14206 	 * (enforced by GENL_UNS_ADMIN_PERM on the genl op). Mirror the
14207 	 * convention used by net/core/rtnetlink.c::rtnl_get_net_ns_capable()
14208 	 * and require CAP_NET_ADMIN over the target netns as well, so that
14209 	 * a caller that is privileged in their own user namespace cannot
14210 	 * push a wiphy into a netns where they have no privilege.
14211 	 */
14212 	if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) {
14213 		put_net(net);
14214 		return -EPERM;
14215 	}
14216 
14217 	err = 0;
14218 
14219 	/* check if anything to do */
14220 	if (!net_eq(wiphy_net(&rdev->wiphy), net))
14221 		err = cfg80211_switch_netns(rdev, net);
14222 
14223 	put_net(net);
14224 	return err;
14225 }
14226 
14227 static int nl80211_set_pmksa(struct sk_buff *skb, struct genl_info *info)
14228 {
14229 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14230 	struct net_device *dev = info->user_ptr[1];
14231 	struct cfg80211_pmksa pmksa;
14232 	bool ap_pmksa_caching_support = false;
14233 
14234 	memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
14235 
14236 	ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy,
14237 		NL80211_EXT_FEATURE_AP_PMKSA_CACHING);
14238 
14239 	if (!info->attrs[NL80211_ATTR_PMKID])
14240 		return -EINVAL;
14241 
14242 	pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
14243 
14244 	if (info->attrs[NL80211_ATTR_MAC]) {
14245 		pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
14246 	} else if (info->attrs[NL80211_ATTR_SSID] &&
14247 	           info->attrs[NL80211_ATTR_FILS_CACHE_ID] &&
14248 	           info->attrs[NL80211_ATTR_PMK]) {
14249 		pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
14250 		pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
14251 		pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]);
14252 	} else {
14253 		return -EINVAL;
14254 	}
14255 
14256 	if (info->attrs[NL80211_ATTR_PMK]) {
14257 		pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
14258 		pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
14259 	}
14260 
14261 	if (info->attrs[NL80211_ATTR_PMK_LIFETIME])
14262 		pmksa.pmk_lifetime =
14263 			nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]);
14264 
14265 	if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD])
14266 		pmksa.pmk_reauth_threshold =
14267 			nla_get_u8(info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]);
14268 
14269 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
14270 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT &&
14271 	    !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP ||
14272 	       dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) &&
14273 	       ap_pmksa_caching_support))
14274 		return -EOPNOTSUPP;
14275 
14276 	if (!rdev->ops->set_pmksa)
14277 		return -EOPNOTSUPP;
14278 
14279 	return rdev_set_pmksa(rdev, dev, &pmksa);
14280 }
14281 
14282 static int nl80211_del_pmksa(struct sk_buff *skb, struct genl_info *info)
14283 {
14284 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14285 	struct net_device *dev = info->user_ptr[1];
14286 	struct cfg80211_pmksa pmksa;
14287 	bool sae_offload_support = false;
14288 	bool owe_offload_support = false;
14289 	bool ap_pmksa_caching_support = false;
14290 
14291 	memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
14292 
14293 	sae_offload_support = wiphy_ext_feature_isset(&rdev->wiphy,
14294 		NL80211_EXT_FEATURE_SAE_OFFLOAD);
14295 	owe_offload_support = wiphy_ext_feature_isset(&rdev->wiphy,
14296 		NL80211_EXT_FEATURE_OWE_OFFLOAD);
14297 	ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy,
14298 		NL80211_EXT_FEATURE_AP_PMKSA_CACHING);
14299 
14300 	if (info->attrs[NL80211_ATTR_PMKID])
14301 		pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
14302 
14303 	if (info->attrs[NL80211_ATTR_MAC]) {
14304 		pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
14305 	} else if (info->attrs[NL80211_ATTR_SSID]) {
14306 		/* SSID based pmksa flush supported only for FILS,
14307 		 * OWE/SAE OFFLOAD cases
14308 		 */
14309 		if (info->attrs[NL80211_ATTR_FILS_CACHE_ID] &&
14310 		    info->attrs[NL80211_ATTR_PMK]) {
14311 			pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]);
14312 		} else if (!sae_offload_support && !owe_offload_support) {
14313 			return -EINVAL;
14314 		}
14315 		pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
14316 		pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
14317 	} else {
14318 		return -EINVAL;
14319 	}
14320 
14321 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
14322 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT &&
14323 	    !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP ||
14324 	       dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) &&
14325 	       ap_pmksa_caching_support))
14326 		return -EOPNOTSUPP;
14327 
14328 	if (!rdev->ops->del_pmksa)
14329 		return -EOPNOTSUPP;
14330 
14331 	return rdev_del_pmksa(rdev, dev, &pmksa);
14332 }
14333 
14334 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
14335 {
14336 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14337 	struct net_device *dev = info->user_ptr[1];
14338 
14339 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
14340 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
14341 		return -EOPNOTSUPP;
14342 
14343 	if (!rdev->ops->flush_pmksa)
14344 		return -EOPNOTSUPP;
14345 
14346 	return rdev_flush_pmksa(rdev, dev);
14347 }
14348 
14349 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
14350 {
14351 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14352 	struct net_device *dev = info->user_ptr[1];
14353 	u8 action_code, dialog_token;
14354 	u32 peer_capability = 0;
14355 	u16 status_code;
14356 	u8 *peer;
14357 	int link_id;
14358 	bool initiator;
14359 
14360 	if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
14361 	    !rdev->ops->tdls_mgmt)
14362 		return -EOPNOTSUPP;
14363 
14364 	if (!info->attrs[NL80211_ATTR_TDLS_ACTION] ||
14365 	    !info->attrs[NL80211_ATTR_STATUS_CODE] ||
14366 	    !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] ||
14367 	    !info->attrs[NL80211_ATTR_IE] ||
14368 	    !info->attrs[NL80211_ATTR_MAC])
14369 		return -EINVAL;
14370 
14371 	peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
14372 	action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
14373 	status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
14374 	dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
14375 	initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]);
14376 	if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
14377 		peer_capability =
14378 			nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
14379 	link_id = nl80211_link_id_or_invalid(info->attrs);
14380 
14381 	return rdev_tdls_mgmt(rdev, dev, peer, link_id, action_code,
14382 			      dialog_token, status_code, peer_capability,
14383 			      initiator,
14384 			      nla_data(info->attrs[NL80211_ATTR_IE]),
14385 			      nla_len(info->attrs[NL80211_ATTR_IE]));
14386 }
14387 
14388 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info)
14389 {
14390 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14391 	struct net_device *dev = info->user_ptr[1];
14392 	enum nl80211_tdls_operation operation;
14393 	u8 *peer;
14394 
14395 	if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
14396 	    !rdev->ops->tdls_oper)
14397 		return -EOPNOTSUPP;
14398 
14399 	if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] ||
14400 	    !info->attrs[NL80211_ATTR_MAC])
14401 		return -EINVAL;
14402 
14403 	operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]);
14404 	peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
14405 
14406 	return rdev_tdls_oper(rdev, dev, peer, operation);
14407 }
14408 
14409 static int nl80211_remain_on_channel(struct sk_buff *skb,
14410 				     struct genl_info *info)
14411 {
14412 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14413 	unsigned int link_id = nl80211_link_id(info->attrs);
14414 	struct wireless_dev *wdev = info->user_ptr[1];
14415 	struct cfg80211_chan_def chandef;
14416 	const u8 *rx_addr = NULL;
14417 	struct sk_buff *msg;
14418 	void *hdr;
14419 	u64 cookie;
14420 	u32 duration;
14421 	int err;
14422 
14423 	if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
14424 	    !info->attrs[NL80211_ATTR_DURATION])
14425 		return -EINVAL;
14426 
14427 	duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
14428 
14429 	if (info->attrs[NL80211_ATTR_MAC])
14430 		rx_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
14431 
14432 	if (rx_addr &&
14433 	    !wiphy_ext_feature_isset(wdev->wiphy,
14434 				     NL80211_EXT_FEATURE_ROC_ADDR_FILTER))
14435 		return -EOPNOTSUPP;
14436 
14437 	if (!rdev->ops->remain_on_channel ||
14438 	    !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL))
14439 		return -EOPNOTSUPP;
14440 
14441 	/*
14442 	 * We should be on that channel for at least a minimum amount of
14443 	 * time (10ms) but no longer than the driver supports.
14444 	 */
14445 	if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
14446 	    duration > rdev->wiphy.max_remain_on_channel_duration)
14447 		return -EINVAL;
14448 
14449 	err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef,
14450 				    false);
14451 	if (err)
14452 		return err;
14453 
14454 	if (!cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) {
14455 		const struct cfg80211_chan_def *oper_chandef, *compat_chandef;
14456 
14457 		oper_chandef = wdev_chandef(wdev, link_id);
14458 
14459 		if (WARN_ON(!oper_chandef)) {
14460 			/* cannot happen since we must beacon to get here */
14461 			WARN_ON(1);
14462 			return -EBUSY;
14463 		}
14464 
14465 		/* note: returns first one if identical chandefs */
14466 		compat_chandef = cfg80211_chandef_compatible(&chandef,
14467 							     oper_chandef);
14468 
14469 		if (compat_chandef != &chandef)
14470 			return -EBUSY;
14471 	}
14472 
14473 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
14474 	if (!msg)
14475 		return -ENOMEM;
14476 
14477 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
14478 			     NL80211_CMD_REMAIN_ON_CHANNEL);
14479 	if (!hdr) {
14480 		err = -ENOBUFS;
14481 		goto free_msg;
14482 	}
14483 
14484 	err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
14485 				     duration, &cookie, rx_addr);
14486 
14487 	if (err)
14488 		goto free_msg;
14489 
14490 	if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
14491 			      NL80211_ATTR_PAD))
14492 		goto nla_put_failure;
14493 
14494 	genlmsg_end(msg, hdr);
14495 
14496 	return genlmsg_reply(msg, info);
14497 
14498  nla_put_failure:
14499 	err = -ENOBUFS;
14500  free_msg:
14501 	nlmsg_free(msg);
14502 	return err;
14503 }
14504 
14505 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
14506 					    struct genl_info *info)
14507 {
14508 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14509 	struct wireless_dev *wdev = info->user_ptr[1];
14510 	u64 cookie;
14511 
14512 	if (!info->attrs[NL80211_ATTR_COOKIE])
14513 		return -EINVAL;
14514 
14515 	if (!rdev->ops->cancel_remain_on_channel)
14516 		return -EOPNOTSUPP;
14517 
14518 	cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
14519 
14520 	return rdev_cancel_remain_on_channel(rdev, wdev, cookie);
14521 }
14522 
14523 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
14524 				       struct genl_info *info)
14525 {
14526 	struct cfg80211_bitrate_mask mask;
14527 	unsigned int link_id = nl80211_link_id(info->attrs);
14528 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14529 	struct net_device *dev = info->user_ptr[1];
14530 	int err;
14531 
14532 	if (!rdev->ops->set_bitrate_mask)
14533 		return -EOPNOTSUPP;
14534 
14535 	err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
14536 					    NL80211_ATTR_TX_RATES, &mask,
14537 					    dev, true, link_id);
14538 	if (err)
14539 		return err;
14540 
14541 	return rdev_set_bitrate_mask(rdev, dev, link_id, NULL, &mask);
14542 }
14543 
14544 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
14545 {
14546 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14547 	struct wireless_dev *wdev = info->user_ptr[1];
14548 	u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
14549 
14550 	if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
14551 		return -EINVAL;
14552 
14553 	if (info->attrs[NL80211_ATTR_FRAME_TYPE])
14554 		frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
14555 
14556 	switch (wdev->iftype) {
14557 	case NL80211_IFTYPE_STATION:
14558 	case NL80211_IFTYPE_ADHOC:
14559 	case NL80211_IFTYPE_P2P_CLIENT:
14560 	case NL80211_IFTYPE_AP:
14561 	case NL80211_IFTYPE_AP_VLAN:
14562 	case NL80211_IFTYPE_MESH_POINT:
14563 	case NL80211_IFTYPE_P2P_GO:
14564 	case NL80211_IFTYPE_P2P_DEVICE:
14565 		break;
14566 	case NL80211_IFTYPE_NAN:
14567 	case NL80211_IFTYPE_NAN_DATA:
14568 		if (!wiphy_ext_feature_isset(wdev->wiphy,
14569 					     NL80211_EXT_FEATURE_SECURE_NAN) &&
14570 		    !(wdev->wiphy->nan_capa.flags &
14571 		      WIPHY_NAN_FLAGS_USERSPACE_DE))
14572 			return -EOPNOTSUPP;
14573 		break;
14574 	case NL80211_IFTYPE_PD:
14575 		if (!wiphy_ext_feature_isset(wdev->wiphy,
14576 					     NL80211_EXT_FEATURE_SECURE_RTT))
14577 			return -EOPNOTSUPP;
14578 		break;
14579 	default:
14580 		return -EOPNOTSUPP;
14581 	}
14582 
14583 	/* not much point in registering if we can't reply */
14584 	if (!rdev->ops->mgmt_tx)
14585 		return -EOPNOTSUPP;
14586 
14587 	if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] &&
14588 	    !wiphy_ext_feature_isset(&rdev->wiphy,
14589 				     NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS)) {
14590 		GENL_SET_ERR_MSG(info,
14591 				 "multicast RX registrations are not supported");
14592 		return -EOPNOTSUPP;
14593 	}
14594 
14595 	return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type,
14596 					   nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
14597 					   nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]),
14598 					   info->attrs[NL80211_ATTR_RECEIVE_MULTICAST],
14599 					   info->extack);
14600 }
14601 
14602 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
14603 {
14604 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14605 	struct wireless_dev *wdev = info->user_ptr[1];
14606 	struct cfg80211_chan_def chandef;
14607 	int err;
14608 	void *hdr = NULL;
14609 	u64 cookie;
14610 	struct sk_buff *msg = NULL;
14611 	struct cfg80211_mgmt_tx_params params = {
14612 		.dont_wait_for_ack =
14613 			info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK],
14614 	};
14615 
14616 	if (!info->attrs[NL80211_ATTR_FRAME])
14617 		return -EINVAL;
14618 
14619 	if (!rdev->ops->mgmt_tx)
14620 		return -EOPNOTSUPP;
14621 
14622 	switch (wdev->iftype) {
14623 	case NL80211_IFTYPE_P2P_DEVICE:
14624 		if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
14625 			return -EINVAL;
14626 		break;
14627 	case NL80211_IFTYPE_STATION:
14628 	case NL80211_IFTYPE_ADHOC:
14629 	case NL80211_IFTYPE_P2P_CLIENT:
14630 	case NL80211_IFTYPE_AP:
14631 	case NL80211_IFTYPE_AP_VLAN:
14632 	case NL80211_IFTYPE_MESH_POINT:
14633 	case NL80211_IFTYPE_P2P_GO:
14634 		break;
14635 	case NL80211_IFTYPE_NAN:
14636 	case NL80211_IFTYPE_NAN_DATA:
14637 		if (!wiphy_ext_feature_isset(wdev->wiphy,
14638 					     NL80211_EXT_FEATURE_SECURE_NAN) &&
14639 		    !(wdev->wiphy->nan_capa.flags &
14640 		      WIPHY_NAN_FLAGS_USERSPACE_DE))
14641 			return -EOPNOTSUPP;
14642 		break;
14643 	case NL80211_IFTYPE_PD:
14644 		if (!wiphy_ext_feature_isset(wdev->wiphy,
14645 					     NL80211_EXT_FEATURE_SECURE_RTT))
14646 			return -EOPNOTSUPP;
14647 		break;
14648 	default:
14649 		return -EOPNOTSUPP;
14650 	}
14651 
14652 	if (info->attrs[NL80211_ATTR_DURATION]) {
14653 		if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
14654 			return -EINVAL;
14655 		params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
14656 
14657 		/*
14658 		 * We should wait on the channel for at least a minimum amount
14659 		 * of time (10ms) but no longer than the driver supports.
14660 		 */
14661 		if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
14662 		    params.wait > rdev->wiphy.max_remain_on_channel_duration)
14663 			return -EINVAL;
14664 	}
14665 
14666 	params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
14667 
14668 	if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
14669 		return -EINVAL;
14670 
14671 	params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
14672 
14673 	/* get the channel if any has been specified, otherwise pass NULL to
14674 	 * the driver. The latter will use the current one
14675 	 */
14676 	chandef.chan = NULL;
14677 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
14678 		err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
14679 					    &chandef, false);
14680 		if (err)
14681 			return err;
14682 	}
14683 
14684 	if (!chandef.chan && params.offchan)
14685 		return -EINVAL;
14686 
14687 	if (params.offchan &&
14688 	    !cfg80211_off_channel_oper_allowed(wdev, chandef.chan))
14689 		return -EBUSY;
14690 
14691 	params.link_id = nl80211_link_id_or_invalid(info->attrs);
14692 	/*
14693 	 * This now races due to the unlock, but we cannot check
14694 	 * the valid links for the _station_ anyway, so that's up
14695 	 * to the driver.
14696 	 */
14697 	if (params.link_id >= 0 &&
14698 	    !(wdev->valid_links & BIT(params.link_id)))
14699 		return -EINVAL;
14700 
14701 	params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
14702 	params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
14703 
14704 	err = nl80211_parse_counter_offsets(rdev, NULL, params.len, -1,
14705 					    info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX],
14706 					    &params.csa_offsets,
14707 					    &params.n_csa_offsets);
14708 	if (err)
14709 		return err;
14710 
14711 	if (!params.dont_wait_for_ack) {
14712 		msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
14713 		if (!msg)
14714 			return -ENOMEM;
14715 
14716 		hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
14717 				     NL80211_CMD_FRAME);
14718 		if (!hdr) {
14719 			err = -ENOBUFS;
14720 			goto free_msg;
14721 		}
14722 	}
14723 
14724 	params.chan = chandef.chan;
14725 	err = cfg80211_mlme_mgmt_tx(rdev, wdev, &params, &cookie);
14726 	if (err)
14727 		goto free_msg;
14728 
14729 	if (msg) {
14730 		if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
14731 				      NL80211_ATTR_PAD))
14732 			goto nla_put_failure;
14733 
14734 		genlmsg_end(msg, hdr);
14735 		return genlmsg_reply(msg, info);
14736 	}
14737 
14738 	return 0;
14739 
14740  nla_put_failure:
14741 	err = -ENOBUFS;
14742  free_msg:
14743 	nlmsg_free(msg);
14744 	return err;
14745 }
14746 
14747 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
14748 {
14749 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14750 	struct wireless_dev *wdev = info->user_ptr[1];
14751 	u64 cookie;
14752 
14753 	if (!info->attrs[NL80211_ATTR_COOKIE])
14754 		return -EINVAL;
14755 
14756 	if (!rdev->ops->mgmt_tx_cancel_wait)
14757 		return -EOPNOTSUPP;
14758 
14759 	switch (wdev->iftype) {
14760 	case NL80211_IFTYPE_STATION:
14761 	case NL80211_IFTYPE_ADHOC:
14762 	case NL80211_IFTYPE_P2P_CLIENT:
14763 	case NL80211_IFTYPE_AP:
14764 	case NL80211_IFTYPE_AP_VLAN:
14765 	case NL80211_IFTYPE_P2P_GO:
14766 	case NL80211_IFTYPE_P2P_DEVICE:
14767 		break;
14768 	case NL80211_IFTYPE_NAN:
14769 		if (!wiphy_ext_feature_isset(wdev->wiphy,
14770 					     NL80211_EXT_FEATURE_SECURE_NAN))
14771 			return -EOPNOTSUPP;
14772 		break;
14773 	case NL80211_IFTYPE_PD:
14774 		if (!wiphy_ext_feature_isset(wdev->wiphy,
14775 					     NL80211_EXT_FEATURE_SECURE_RTT))
14776 			return -EOPNOTSUPP;
14777 		break;
14778 	default:
14779 		return -EOPNOTSUPP;
14780 	}
14781 
14782 	cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
14783 
14784 	return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie);
14785 }
14786 
14787 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
14788 {
14789 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14790 	struct wireless_dev *wdev;
14791 	struct net_device *dev = info->user_ptr[1];
14792 	u8 ps_state;
14793 	bool state;
14794 	int err;
14795 
14796 	if (!info->attrs[NL80211_ATTR_PS_STATE])
14797 		return -EINVAL;
14798 
14799 	ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
14800 
14801 	wdev = dev->ieee80211_ptr;
14802 
14803 	if (!rdev->ops->set_power_mgmt)
14804 		return -EOPNOTSUPP;
14805 
14806 	state = (ps_state == NL80211_PS_ENABLED) ? true : false;
14807 
14808 	if (state == wdev->ps)
14809 		return 0;
14810 
14811 	err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout);
14812 	if (!err)
14813 		wdev->ps = state;
14814 	return err;
14815 }
14816 
14817 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
14818 {
14819 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14820 	enum nl80211_ps_state ps_state;
14821 	struct wireless_dev *wdev;
14822 	struct net_device *dev = info->user_ptr[1];
14823 	struct sk_buff *msg;
14824 	void *hdr;
14825 	int err;
14826 
14827 	wdev = dev->ieee80211_ptr;
14828 
14829 	if (!rdev->ops->set_power_mgmt)
14830 		return -EOPNOTSUPP;
14831 
14832 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
14833 	if (!msg)
14834 		return -ENOMEM;
14835 
14836 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
14837 			     NL80211_CMD_GET_POWER_SAVE);
14838 	if (!hdr) {
14839 		err = -ENOBUFS;
14840 		goto free_msg;
14841 	}
14842 
14843 	if (wdev->ps)
14844 		ps_state = NL80211_PS_ENABLED;
14845 	else
14846 		ps_state = NL80211_PS_DISABLED;
14847 
14848 	if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state))
14849 		goto nla_put_failure;
14850 
14851 	genlmsg_end(msg, hdr);
14852 	return genlmsg_reply(msg, info);
14853 
14854  nla_put_failure:
14855 	err = -ENOBUFS;
14856  free_msg:
14857 	nlmsg_free(msg);
14858 	return err;
14859 }
14860 
14861 static const struct nla_policy
14862 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
14863 	[NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY },
14864 	[NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 },
14865 	[NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
14866 	[NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
14867 	[NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
14868 	[NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
14869 	[NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 },
14870 };
14871 
14872 static int nl80211_set_cqm_txe(struct genl_info *info,
14873 			       u32 rate, u32 pkts, u32 intvl)
14874 {
14875 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14876 	struct net_device *dev = info->user_ptr[1];
14877 	struct wireless_dev *wdev = dev->ieee80211_ptr;
14878 
14879 	if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL)
14880 		return -EINVAL;
14881 
14882 	if (!rdev->ops->set_cqm_txe_config)
14883 		return -EOPNOTSUPP;
14884 
14885 	if (wdev->iftype != NL80211_IFTYPE_STATION &&
14886 	    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
14887 		return -EOPNOTSUPP;
14888 
14889 	return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl);
14890 }
14891 
14892 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
14893 				    struct net_device *dev,
14894 				    struct cfg80211_cqm_config *cqm_config)
14895 {
14896 	struct wireless_dev *wdev = dev->ieee80211_ptr;
14897 	s32 last, low, high;
14898 	u32 hyst;
14899 	int i, n, low_index;
14900 	int err;
14901 
14902 	/*
14903 	 * Obtain current RSSI value if possible, if not and no RSSI threshold
14904 	 * event has been received yet, we should receive an event after a
14905 	 * connection is established and enough beacons received to calculate
14906 	 * the average.
14907 	 */
14908 	if (!cqm_config->last_rssi_event_value &&
14909 	    wdev->links[0].client.current_bss &&
14910 	    rdev->ops->get_station) {
14911 		struct station_info sinfo = {};
14912 		u8 *mac_addr;
14913 
14914 		mac_addr = wdev->links[0].client.current_bss->pub.bssid;
14915 
14916 		err = rdev_get_station(rdev, wdev, mac_addr, &sinfo);
14917 		if (err)
14918 			return err;
14919 
14920 		cfg80211_sinfo_release_content(&sinfo);
14921 		if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG))
14922 			cqm_config->last_rssi_event_value =
14923 				(s8) sinfo.rx_beacon_signal_avg;
14924 	}
14925 
14926 	last = cqm_config->last_rssi_event_value;
14927 	hyst = cqm_config->rssi_hyst;
14928 	n = cqm_config->n_rssi_thresholds;
14929 
14930 	for (i = 0; i < n; i++) {
14931 		i = array_index_nospec(i, n);
14932 		if (last < cqm_config->rssi_thresholds[i])
14933 			break;
14934 	}
14935 
14936 	low_index = i - 1;
14937 	if (low_index >= 0) {
14938 		low_index = array_index_nospec(low_index, n);
14939 		low = cqm_config->rssi_thresholds[low_index] - hyst;
14940 	} else {
14941 		low = S32_MIN;
14942 	}
14943 	if (i < n) {
14944 		i = array_index_nospec(i, n);
14945 		high = cqm_config->rssi_thresholds[i] + hyst - 1;
14946 	} else {
14947 		high = S32_MAX;
14948 	}
14949 
14950 	return rdev_set_cqm_rssi_range_config(rdev, dev, low, high);
14951 }
14952 
14953 static int nl80211_set_cqm_rssi(struct genl_info *info,
14954 				const s32 *thresholds, int n_thresholds,
14955 				u32 hysteresis)
14956 {
14957 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
14958 	struct cfg80211_cqm_config *cqm_config = NULL, *old;
14959 	struct net_device *dev = info->user_ptr[1];
14960 	struct wireless_dev *wdev = dev->ieee80211_ptr;
14961 	s32 prev = S32_MIN;
14962 	int i, err;
14963 
14964 	/* Check all values negative and sorted */
14965 	for (i = 0; i < n_thresholds; i++) {
14966 		if (thresholds[i] > 0 || thresholds[i] <= prev)
14967 			return -EINVAL;
14968 
14969 		prev = thresholds[i];
14970 	}
14971 
14972 	if (wdev->iftype != NL80211_IFTYPE_STATION &&
14973 	    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
14974 		return -EOPNOTSUPP;
14975 
14976 	if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */
14977 		n_thresholds = 0;
14978 
14979 	old = wiphy_dereference(wdev->wiphy, wdev->cqm_config);
14980 
14981 	/* if already disabled just succeed */
14982 	if (!n_thresholds && !old)
14983 		return 0;
14984 
14985 	if (n_thresholds > 1) {
14986 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
14987 					     NL80211_EXT_FEATURE_CQM_RSSI_LIST) ||
14988 		    !rdev->ops->set_cqm_rssi_range_config)
14989 			return -EOPNOTSUPP;
14990 	} else {
14991 		if (!rdev->ops->set_cqm_rssi_config)
14992 			return -EOPNOTSUPP;
14993 	}
14994 
14995 	if (n_thresholds) {
14996 		cqm_config = kzalloc_flex(*cqm_config, rssi_thresholds,
14997 					  n_thresholds);
14998 		if (!cqm_config)
14999 			return -ENOMEM;
15000 
15001 		cqm_config->rssi_hyst = hysteresis;
15002 		cqm_config->n_rssi_thresholds = n_thresholds;
15003 		memcpy(cqm_config->rssi_thresholds, thresholds,
15004 		       flex_array_size(cqm_config, rssi_thresholds,
15005 				       n_thresholds));
15006 		cqm_config->use_range_api = n_thresholds > 1 ||
15007 					    !rdev->ops->set_cqm_rssi_config;
15008 
15009 		rcu_assign_pointer(wdev->cqm_config, cqm_config);
15010 
15011 		if (cqm_config->use_range_api)
15012 			err = cfg80211_cqm_rssi_update(rdev, dev, cqm_config);
15013 		else
15014 			err = rdev_set_cqm_rssi_config(rdev, dev,
15015 						       thresholds[0],
15016 						       hysteresis);
15017 	} else {
15018 		RCU_INIT_POINTER(wdev->cqm_config, NULL);
15019 		/* if enabled as range also disable via range */
15020 		if (old->use_range_api)
15021 			err = rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0);
15022 		else
15023 			err = rdev_set_cqm_rssi_config(rdev, dev, 0, 0);
15024 	}
15025 
15026 	if (err) {
15027 		rcu_assign_pointer(wdev->cqm_config, old);
15028 		kfree_rcu(cqm_config, rcu_head);
15029 	} else {
15030 		kfree_rcu(old, rcu_head);
15031 	}
15032 
15033 	return err;
15034 }
15035 
15036 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
15037 {
15038 	struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1];
15039 	struct nlattr *cqm;
15040 	int err;
15041 
15042 	cqm = info->attrs[NL80211_ATTR_CQM];
15043 	if (!cqm)
15044 		return -EINVAL;
15045 
15046 	err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm,
15047 					  nl80211_attr_cqm_policy,
15048 					  info->extack);
15049 	if (err)
15050 		return err;
15051 
15052 	if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
15053 	    attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
15054 		const s32 *thresholds =
15055 			nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
15056 		int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
15057 		u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
15058 
15059 		if (len % 4)
15060 			return -EINVAL;
15061 
15062 		return nl80211_set_cqm_rssi(info, thresholds, len / 4,
15063 					    hysteresis);
15064 	}
15065 
15066 	if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
15067 	    attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
15068 	    attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
15069 		u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
15070 		u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
15071 		u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
15072 
15073 		return nl80211_set_cqm_txe(info, rate, pkts, intvl);
15074 	}
15075 
15076 	return -EINVAL;
15077 }
15078 
15079 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info)
15080 {
15081 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
15082 	struct net_device *dev = info->user_ptr[1];
15083 	struct ocb_setup setup = {};
15084 	int err;
15085 
15086 	err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
15087 				    &setup.chandef, false);
15088 	if (err)
15089 		return err;
15090 
15091 	return cfg80211_join_ocb(rdev, dev, &setup);
15092 }
15093 
15094 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info)
15095 {
15096 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
15097 	struct net_device *dev = info->user_ptr[1];
15098 
15099 	return cfg80211_leave_ocb(rdev, dev);
15100 }
15101 
15102 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
15103 {
15104 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
15105 	struct net_device *dev = info->user_ptr[1];
15106 	struct mesh_config cfg;
15107 	struct mesh_setup setup;
15108 	int err;
15109 
15110 	/* start with default */
15111 	memcpy(&cfg, &default_mesh_config, sizeof(cfg));
15112 	memcpy(&setup, &default_mesh_setup, sizeof(setup));
15113 
15114 	if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
15115 		/* and parse parameters if given */
15116 		err = nl80211_parse_mesh_config(info, &cfg, NULL);
15117 		if (err)
15118 			return err;
15119 	}
15120 
15121 	if (!info->attrs[NL80211_ATTR_MESH_ID] ||
15122 	    !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
15123 		return -EINVAL;
15124 
15125 	setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
15126 	setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
15127 
15128 	if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
15129 	    !nl80211_parse_mcast_rate(rdev, setup.mcast_rate,
15130 			    nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
15131 			return -EINVAL;
15132 
15133 	if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
15134 		setup.beacon_interval =
15135 			nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
15136 
15137 		err = cfg80211_validate_beacon_int(rdev,
15138 						   NL80211_IFTYPE_MESH_POINT,
15139 						   setup.beacon_interval);
15140 		if (err)
15141 			return err;
15142 	}
15143 
15144 	if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
15145 		setup.dtim_period =
15146 			nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
15147 		if (setup.dtim_period < 1 || setup.dtim_period > 100)
15148 			return -EINVAL;
15149 	}
15150 
15151 	if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
15152 		/* parse additional setup parameters if given */
15153 		err = nl80211_parse_mesh_setup(info, &setup);
15154 		if (err)
15155 			return err;
15156 	}
15157 
15158 	if (setup.user_mpm)
15159 		cfg.auto_open_plinks = false;
15160 
15161 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
15162 		err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
15163 					    &setup.chandef, false);
15164 		if (err)
15165 			return err;
15166 	} else {
15167 		/* __cfg80211_join_mesh() will sort it out */
15168 		setup.chandef.chan = NULL;
15169 	}
15170 
15171 	if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
15172 		u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
15173 		int n_rates =
15174 			nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
15175 		struct ieee80211_supported_band *sband;
15176 
15177 		if (!setup.chandef.chan)
15178 			return -EINVAL;
15179 
15180 		sband = rdev->wiphy.bands[setup.chandef.chan->band];
15181 
15182 		err = ieee80211_get_ratemask(sband, rates, n_rates,
15183 					     &setup.basic_rates);
15184 		if (err)
15185 			return err;
15186 	}
15187 
15188 	if (info->attrs[NL80211_ATTR_TX_RATES]) {
15189 		err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
15190 						    NL80211_ATTR_TX_RATES,
15191 						    &setup.beacon_rate,
15192 						    dev, false, 0);
15193 		if (err)
15194 			return err;
15195 
15196 		if (!setup.chandef.chan)
15197 			return -EINVAL;
15198 
15199 		err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band,
15200 					      &setup.beacon_rate);
15201 		if (err)
15202 			return err;
15203 	}
15204 
15205 	setup.userspace_handles_dfs =
15206 		nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
15207 
15208 	if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
15209 		int r = validate_pae_over_nl80211(rdev, info);
15210 
15211 		if (r < 0)
15212 			return r;
15213 
15214 		setup.control_port_over_nl80211 = true;
15215 	}
15216 
15217 	err = __cfg80211_join_mesh(rdev, dev, &setup, &cfg);
15218 	if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER])
15219 		dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
15220 
15221 	return err;
15222 }
15223 
15224 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
15225 {
15226 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
15227 	struct net_device *dev = info->user_ptr[1];
15228 
15229 	return cfg80211_leave_mesh(rdev, dev);
15230 }
15231 
15232 #ifdef CONFIG_PM
15233 static int nl80211_send_wowlan_patterns(struct sk_buff *msg,
15234 					struct cfg80211_registered_device *rdev)
15235 {
15236 	struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config;
15237 	struct nlattr *nl_pats, *nl_pat;
15238 	int i, pat_len;
15239 
15240 	if (!wowlan->n_patterns)
15241 		return 0;
15242 
15243 	nl_pats = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN);
15244 	if (!nl_pats)
15245 		return -ENOBUFS;
15246 
15247 	for (i = 0; i < wowlan->n_patterns; i++) {
15248 		nl_pat = nla_nest_start_noflag(msg, i + 1);
15249 		if (!nl_pat)
15250 			return -ENOBUFS;
15251 		pat_len = wowlan->patterns[i].pattern_len;
15252 		if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8),
15253 			    wowlan->patterns[i].mask) ||
15254 		    nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
15255 			    wowlan->patterns[i].pattern) ||
15256 		    nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
15257 				wowlan->patterns[i].pkt_offset))
15258 			return -ENOBUFS;
15259 		nla_nest_end(msg, nl_pat);
15260 	}
15261 	nla_nest_end(msg, nl_pats);
15262 
15263 	return 0;
15264 }
15265 
15266 static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
15267 				   struct cfg80211_wowlan_tcp *tcp)
15268 {
15269 	struct nlattr *nl_tcp;
15270 
15271 	if (!tcp)
15272 		return 0;
15273 
15274 	nl_tcp = nla_nest_start_noflag(msg,
15275 				       NL80211_WOWLAN_TRIG_TCP_CONNECTION);
15276 	if (!nl_tcp)
15277 		return -ENOBUFS;
15278 
15279 	if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) ||
15280 	    nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) ||
15281 	    nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) ||
15282 	    nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) ||
15283 	    nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) ||
15284 	    nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
15285 		    tcp->payload_len, tcp->payload) ||
15286 	    nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
15287 			tcp->data_interval) ||
15288 	    nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
15289 		    tcp->wake_len, tcp->wake_data) ||
15290 	    nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK,
15291 		    DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask))
15292 		return -ENOBUFS;
15293 
15294 	if (tcp->payload_seq.len &&
15295 	    nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
15296 		    sizeof(tcp->payload_seq), &tcp->payload_seq))
15297 		return -ENOBUFS;
15298 
15299 	if (tcp->payload_tok.len &&
15300 	    nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
15301 		    sizeof(tcp->payload_tok) + tcp->tokens_size,
15302 		    &tcp->payload_tok))
15303 		return -ENOBUFS;
15304 
15305 	nla_nest_end(msg, nl_tcp);
15306 
15307 	return 0;
15308 }
15309 
15310 static int nl80211_send_wowlan_nd(struct sk_buff *msg,
15311 				  struct cfg80211_sched_scan_request *req)
15312 {
15313 	struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan;
15314 	int i;
15315 
15316 	if (!req)
15317 		return 0;
15318 
15319 	nd = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_NET_DETECT);
15320 	if (!nd)
15321 		return -ENOBUFS;
15322 
15323 	if (req->n_scan_plans == 1 &&
15324 	    nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL,
15325 			req->scan_plans[0].interval * 1000))
15326 		return -ENOBUFS;
15327 
15328 	if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay))
15329 		return -ENOBUFS;
15330 
15331 	if (req->relative_rssi_set) {
15332 		struct nl80211_bss_select_rssi_adjust rssi_adjust;
15333 
15334 		if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI,
15335 			       req->relative_rssi))
15336 			return -ENOBUFS;
15337 
15338 		rssi_adjust.band = req->rssi_adjust.band;
15339 		rssi_adjust.delta = req->rssi_adjust.delta;
15340 		if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST,
15341 			    sizeof(rssi_adjust), &rssi_adjust))
15342 			return -ENOBUFS;
15343 	}
15344 
15345 	freqs = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES);
15346 	if (!freqs)
15347 		return -ENOBUFS;
15348 
15349 	for (i = 0; i < req->n_channels; i++) {
15350 		if (nla_put_u32(msg, i, req->channels[i]->center_freq))
15351 			return -ENOBUFS;
15352 	}
15353 
15354 	nla_nest_end(msg, freqs);
15355 
15356 	if (req->n_match_sets) {
15357 		matches = nla_nest_start_noflag(msg,
15358 						NL80211_ATTR_SCHED_SCAN_MATCH);
15359 		if (!matches)
15360 			return -ENOBUFS;
15361 
15362 		for (i = 0; i < req->n_match_sets; i++) {
15363 			match = nla_nest_start_noflag(msg, i);
15364 			if (!match)
15365 				return -ENOBUFS;
15366 
15367 			if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
15368 				    req->match_sets[i].ssid.ssid_len,
15369 				    req->match_sets[i].ssid.ssid))
15370 				return -ENOBUFS;
15371 			nla_nest_end(msg, match);
15372 		}
15373 		nla_nest_end(msg, matches);
15374 	}
15375 
15376 	scan_plans = nla_nest_start_noflag(msg, NL80211_ATTR_SCHED_SCAN_PLANS);
15377 	if (!scan_plans)
15378 		return -ENOBUFS;
15379 
15380 	for (i = 0; i < req->n_scan_plans; i++) {
15381 		scan_plan = nla_nest_start_noflag(msg, i + 1);
15382 		if (!scan_plan)
15383 			return -ENOBUFS;
15384 
15385 		if (nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL,
15386 				req->scan_plans[i].interval) ||
15387 		    (req->scan_plans[i].iterations &&
15388 		     nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS,
15389 				 req->scan_plans[i].iterations)))
15390 			return -ENOBUFS;
15391 		nla_nest_end(msg, scan_plan);
15392 	}
15393 	nla_nest_end(msg, scan_plans);
15394 
15395 	nla_nest_end(msg, nd);
15396 
15397 	return 0;
15398 }
15399 
15400 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
15401 {
15402 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
15403 	struct sk_buff *msg;
15404 	void *hdr;
15405 	u32 size = NLMSG_DEFAULT_SIZE;
15406 
15407 	if (!rdev->wiphy.wowlan)
15408 		return -EOPNOTSUPP;
15409 
15410 	if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) {
15411 		/* adjust size to have room for all the data */
15412 		size += rdev->wiphy.wowlan_config->tcp->tokens_size +
15413 			rdev->wiphy.wowlan_config->tcp->payload_len +
15414 			rdev->wiphy.wowlan_config->tcp->wake_len +
15415 			rdev->wiphy.wowlan_config->tcp->wake_len / 8;
15416 	}
15417 
15418 	msg = nlmsg_new(size, GFP_KERNEL);
15419 	if (!msg)
15420 		return -ENOMEM;
15421 
15422 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
15423 			     NL80211_CMD_GET_WOWLAN);
15424 	if (!hdr)
15425 		goto nla_put_failure;
15426 
15427 	if (rdev->wiphy.wowlan_config) {
15428 		struct nlattr *nl_wowlan;
15429 
15430 		nl_wowlan = nla_nest_start_noflag(msg,
15431 						  NL80211_ATTR_WOWLAN_TRIGGERS);
15432 		if (!nl_wowlan)
15433 			goto nla_put_failure;
15434 
15435 		if ((rdev->wiphy.wowlan_config->any &&
15436 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
15437 		    (rdev->wiphy.wowlan_config->disconnect &&
15438 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
15439 		    (rdev->wiphy.wowlan_config->magic_pkt &&
15440 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
15441 		    (rdev->wiphy.wowlan_config->gtk_rekey_failure &&
15442 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
15443 		    (rdev->wiphy.wowlan_config->eap_identity_req &&
15444 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
15445 		    (rdev->wiphy.wowlan_config->four_way_handshake &&
15446 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
15447 		    (rdev->wiphy.wowlan_config->rfkill_release &&
15448 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
15449 			goto nla_put_failure;
15450 
15451 		if (nl80211_send_wowlan_patterns(msg, rdev))
15452 			goto nla_put_failure;
15453 
15454 		if (nl80211_send_wowlan_tcp(msg,
15455 					    rdev->wiphy.wowlan_config->tcp))
15456 			goto nla_put_failure;
15457 
15458 		if (nl80211_send_wowlan_nd(
15459 			    msg,
15460 			    rdev->wiphy.wowlan_config->nd_config))
15461 			goto nla_put_failure;
15462 
15463 		nla_nest_end(msg, nl_wowlan);
15464 	}
15465 
15466 	genlmsg_end(msg, hdr);
15467 	return genlmsg_reply(msg, info);
15468 
15469 nla_put_failure:
15470 	nlmsg_free(msg);
15471 	return -ENOBUFS;
15472 }
15473 
15474 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev,
15475 				    struct nlattr *attr,
15476 				    struct cfg80211_wowlan *trig)
15477 {
15478 	struct nlattr *tb[NUM_NL80211_WOWLAN_TCP];
15479 	struct cfg80211_wowlan_tcp *cfg;
15480 	struct nl80211_wowlan_tcp_data_token *tok = NULL;
15481 	struct nl80211_wowlan_tcp_data_seq *seq = NULL;
15482 	u32 size;
15483 	u32 data_size, wake_size, tokens_size = 0, wake_mask_size;
15484 	int err, port;
15485 
15486 	if (!rdev->wiphy.wowlan->tcp)
15487 		return -EINVAL;
15488 
15489 	err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr,
15490 					  nl80211_wowlan_tcp_policy, NULL);
15491 	if (err)
15492 		return err;
15493 
15494 	if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] ||
15495 	    !tb[NL80211_WOWLAN_TCP_DST_IPV4] ||
15496 	    !tb[NL80211_WOWLAN_TCP_DST_MAC] ||
15497 	    !tb[NL80211_WOWLAN_TCP_DST_PORT] ||
15498 	    !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] ||
15499 	    !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] ||
15500 	    !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] ||
15501 	    !tb[NL80211_WOWLAN_TCP_WAKE_MASK])
15502 		return -EINVAL;
15503 
15504 	data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]);
15505 	if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max)
15506 		return -EINVAL;
15507 
15508 	if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) >
15509 			rdev->wiphy.wowlan->tcp->data_interval_max ||
15510 	    nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0)
15511 		return -EINVAL;
15512 
15513 	wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]);
15514 	if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max)
15515 		return -EINVAL;
15516 
15517 	wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]);
15518 	if (wake_mask_size != DIV_ROUND_UP(wake_size, 8))
15519 		return -EINVAL;
15520 
15521 	if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) {
15522 		u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
15523 
15524 		tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
15525 		tokens_size = tokln - sizeof(*tok);
15526 
15527 		if (!tok->len || tokens_size % tok->len)
15528 			return -EINVAL;
15529 		if (!rdev->wiphy.wowlan->tcp->tok)
15530 			return -EINVAL;
15531 		if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len)
15532 			return -EINVAL;
15533 		if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len)
15534 			return -EINVAL;
15535 		if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize)
15536 			return -EINVAL;
15537 		if (tok->offset + tok->len > data_size)
15538 			return -EINVAL;
15539 	}
15540 
15541 	if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) {
15542 		seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]);
15543 		if (!rdev->wiphy.wowlan->tcp->seq)
15544 			return -EINVAL;
15545 		if (seq->len == 0 || seq->len > 4)
15546 			return -EINVAL;
15547 		if (seq->len + seq->offset > data_size)
15548 			return -EINVAL;
15549 	}
15550 
15551 	size = sizeof(*cfg);
15552 	size += data_size;
15553 	size += wake_size + wake_mask_size;
15554 	size += tokens_size;
15555 
15556 	cfg = kzalloc(size, GFP_KERNEL);
15557 	if (!cfg)
15558 		return -ENOMEM;
15559 	cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]);
15560 	cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]);
15561 	memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]),
15562 	       ETH_ALEN);
15563 	port = nla_get_u16_default(tb[NL80211_WOWLAN_TCP_SRC_PORT], 0);
15564 #ifdef CONFIG_INET
15565 	/* allocate a socket and port for it and use it */
15566 	err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM,
15567 			    IPPROTO_TCP, &cfg->sock, 1);
15568 	if (err) {
15569 		kfree(cfg);
15570 		return err;
15571 	}
15572 	if (inet_csk_get_port(cfg->sock->sk, port)) {
15573 		sock_release(cfg->sock);
15574 		kfree(cfg);
15575 		return -EADDRINUSE;
15576 	}
15577 	cfg->src_port = inet_sk(cfg->sock->sk)->inet_num;
15578 #else
15579 	if (!port) {
15580 		kfree(cfg);
15581 		return -EINVAL;
15582 	}
15583 	cfg->src_port = port;
15584 #endif
15585 
15586 	cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]);
15587 	cfg->payload_len = data_size;
15588 	cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size;
15589 	memcpy((void *)cfg->payload,
15590 	       nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]),
15591 	       data_size);
15592 	if (seq)
15593 		cfg->payload_seq = *seq;
15594 	cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]);
15595 	cfg->wake_len = wake_size;
15596 	cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size;
15597 	memcpy((void *)cfg->wake_data,
15598 	       nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]),
15599 	       wake_size);
15600 	cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size +
15601 			 data_size + wake_size;
15602 	memcpy((void *)cfg->wake_mask,
15603 	       nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]),
15604 	       wake_mask_size);
15605 	if (tok) {
15606 		cfg->tokens_size = tokens_size;
15607 		cfg->payload_tok = *tok;
15608 		memcpy(cfg->payload_tok.token_stream, tok->token_stream,
15609 		       tokens_size);
15610 	}
15611 
15612 	trig->tcp = cfg;
15613 
15614 	return 0;
15615 }
15616 
15617 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev,
15618 				   const struct wiphy_wowlan_support *wowlan,
15619 				   struct nlattr *attr,
15620 				   struct cfg80211_wowlan *trig)
15621 {
15622 	struct nlattr **tb;
15623 	int err;
15624 
15625 	tb = kzalloc_objs(*tb, NUM_NL80211_ATTR);
15626 	if (!tb)
15627 		return -ENOMEM;
15628 
15629 	if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) {
15630 		err = -EOPNOTSUPP;
15631 		goto out;
15632 	}
15633 
15634 	err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr,
15635 					  nl80211_policy, NULL);
15636 	if (err)
15637 		goto out;
15638 
15639 	trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb,
15640 						   wowlan->max_nd_match_sets);
15641 	err = PTR_ERR_OR_ZERO(trig->nd_config);
15642 	if (err)
15643 		trig->nd_config = NULL;
15644 
15645 out:
15646 	kfree(tb);
15647 	return err;
15648 }
15649 
15650 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
15651 {
15652 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
15653 	struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG];
15654 	struct cfg80211_wowlan new_triggers = {};
15655 	struct cfg80211_wowlan *ntrig;
15656 	const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan;
15657 	int err, i;
15658 	bool prev_enabled = rdev->wiphy.wowlan_config;
15659 	bool regular = false;
15660 
15661 	if (!wowlan)
15662 		return -EOPNOTSUPP;
15663 
15664 	if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) {
15665 		cfg80211_rdev_free_wowlan(rdev);
15666 		rdev->wiphy.wowlan_config = NULL;
15667 		goto set_wakeup;
15668 	}
15669 
15670 	err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG,
15671 					  info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS],
15672 					  nl80211_wowlan_policy, info->extack);
15673 	if (err)
15674 		return err;
15675 
15676 	if (tb[NL80211_WOWLAN_TRIG_ANY]) {
15677 		if (!(wowlan->flags & WIPHY_WOWLAN_ANY))
15678 			return -EINVAL;
15679 		new_triggers.any = true;
15680 	}
15681 
15682 	if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) {
15683 		if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT))
15684 			return -EINVAL;
15685 		new_triggers.disconnect = true;
15686 		regular = true;
15687 	}
15688 
15689 	if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) {
15690 		if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT))
15691 			return -EINVAL;
15692 		new_triggers.magic_pkt = true;
15693 		regular = true;
15694 	}
15695 
15696 	if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED])
15697 		return -EINVAL;
15698 
15699 	if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) {
15700 		if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE))
15701 			return -EINVAL;
15702 		new_triggers.gtk_rekey_failure = true;
15703 		regular = true;
15704 	}
15705 
15706 	if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) {
15707 		if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ))
15708 			return -EINVAL;
15709 		new_triggers.eap_identity_req = true;
15710 		regular = true;
15711 	}
15712 
15713 	if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) {
15714 		if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE))
15715 			return -EINVAL;
15716 		new_triggers.four_way_handshake = true;
15717 		regular = true;
15718 	}
15719 
15720 	if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) {
15721 		if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE))
15722 			return -EINVAL;
15723 		new_triggers.rfkill_release = true;
15724 		regular = true;
15725 	}
15726 
15727 	if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) {
15728 		struct nlattr *pat;
15729 		int n_patterns = 0;
15730 		int rem, pat_len, mask_len, pkt_offset;
15731 		struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
15732 
15733 		regular = true;
15734 
15735 		nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
15736 				    rem)
15737 			n_patterns++;
15738 		if (n_patterns > wowlan->n_patterns)
15739 			return -EINVAL;
15740 
15741 		new_triggers.patterns = kzalloc_objs(new_triggers.patterns[0],
15742 						     n_patterns);
15743 		if (!new_triggers.patterns)
15744 			return -ENOMEM;
15745 
15746 		new_triggers.n_patterns = n_patterns;
15747 		i = 0;
15748 
15749 		nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
15750 				    rem) {
15751 			u8 *mask_pat;
15752 
15753 			err = nla_parse_nested_deprecated(pat_tb,
15754 							  MAX_NL80211_PKTPAT,
15755 							  pat,
15756 							  nl80211_packet_pattern_policy,
15757 							  info->extack);
15758 			if (err)
15759 				goto error;
15760 
15761 			err = -EINVAL;
15762 			if (!pat_tb[NL80211_PKTPAT_MASK] ||
15763 			    !pat_tb[NL80211_PKTPAT_PATTERN])
15764 				goto error;
15765 			pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
15766 			mask_len = DIV_ROUND_UP(pat_len, 8);
15767 			if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
15768 				goto error;
15769 			if (pat_len > wowlan->pattern_max_len ||
15770 			    pat_len < wowlan->pattern_min_len)
15771 				goto error;
15772 
15773 			pkt_offset =
15774 				nla_get_u32_default(pat_tb[NL80211_PKTPAT_OFFSET],
15775 						    0);
15776 			if (pkt_offset > wowlan->max_pkt_offset)
15777 				goto error;
15778 			new_triggers.patterns[i].pkt_offset = pkt_offset;
15779 
15780 			mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
15781 			if (!mask_pat) {
15782 				err = -ENOMEM;
15783 				goto error;
15784 			}
15785 			new_triggers.patterns[i].mask = mask_pat;
15786 			memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
15787 			       mask_len);
15788 			mask_pat += mask_len;
15789 			new_triggers.patterns[i].pattern = mask_pat;
15790 			new_triggers.patterns[i].pattern_len = pat_len;
15791 			memcpy(mask_pat,
15792 			       nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
15793 			       pat_len);
15794 			i++;
15795 		}
15796 	}
15797 
15798 	if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) {
15799 		regular = true;
15800 		err = nl80211_parse_wowlan_tcp(
15801 			rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION],
15802 			&new_triggers);
15803 		if (err)
15804 			goto error;
15805 	}
15806 
15807 	if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) {
15808 		regular = true;
15809 		err = nl80211_parse_wowlan_nd(
15810 			rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT],
15811 			&new_triggers);
15812 		if (err)
15813 			goto error;
15814 	}
15815 
15816 	/* The 'any' trigger means the device continues operating more or less
15817 	 * as in its normal operation mode and wakes up the host on most of the
15818 	 * normal interrupts (like packet RX, ...)
15819 	 * It therefore makes little sense to combine with the more constrained
15820 	 * wakeup trigger modes.
15821 	 */
15822 	if (new_triggers.any && regular) {
15823 		err = -EINVAL;
15824 		goto error;
15825 	}
15826 
15827 	ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL);
15828 	if (!ntrig) {
15829 		err = -ENOMEM;
15830 		goto error;
15831 	}
15832 	cfg80211_rdev_free_wowlan(rdev);
15833 	rdev->wiphy.wowlan_config = ntrig;
15834 
15835  set_wakeup:
15836 	if (rdev->ops->set_wakeup &&
15837 	    prev_enabled != !!rdev->wiphy.wowlan_config)
15838 		rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config);
15839 
15840 	return 0;
15841  error:
15842 	for (i = 0; i < new_triggers.n_patterns; i++)
15843 		kfree(new_triggers.patterns[i].mask);
15844 	kfree(new_triggers.patterns);
15845 	if (new_triggers.tcp && new_triggers.tcp->sock)
15846 		sock_release(new_triggers.tcp->sock);
15847 	kfree(new_triggers.tcp);
15848 	kfree(new_triggers.nd_config);
15849 	return err;
15850 }
15851 #endif
15852 
15853 static int nl80211_send_coalesce_rules(struct sk_buff *msg,
15854 				       struct cfg80211_registered_device *rdev)
15855 {
15856 	struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules;
15857 	int i, j, pat_len;
15858 	struct cfg80211_coalesce_rules *rule;
15859 
15860 	if (!rdev->coalesce->n_rules)
15861 		return 0;
15862 
15863 	nl_rules = nla_nest_start_noflag(msg, NL80211_ATTR_COALESCE_RULE);
15864 	if (!nl_rules)
15865 		return -ENOBUFS;
15866 
15867 	for (i = 0; i < rdev->coalesce->n_rules; i++) {
15868 		nl_rule = nla_nest_start_noflag(msg, i + 1);
15869 		if (!nl_rule)
15870 			return -ENOBUFS;
15871 
15872 		rule = &rdev->coalesce->rules[i];
15873 		if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY,
15874 				rule->delay))
15875 			return -ENOBUFS;
15876 
15877 		if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION,
15878 				rule->condition))
15879 			return -ENOBUFS;
15880 
15881 		nl_pats = nla_nest_start_noflag(msg,
15882 						NL80211_ATTR_COALESCE_RULE_PKT_PATTERN);
15883 		if (!nl_pats)
15884 			return -ENOBUFS;
15885 
15886 		for (j = 0; j < rule->n_patterns; j++) {
15887 			nl_pat = nla_nest_start_noflag(msg, j + 1);
15888 			if (!nl_pat)
15889 				return -ENOBUFS;
15890 			pat_len = rule->patterns[j].pattern_len;
15891 			if (nla_put(msg, NL80211_PKTPAT_MASK,
15892 				    DIV_ROUND_UP(pat_len, 8),
15893 				    rule->patterns[j].mask) ||
15894 			    nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
15895 				    rule->patterns[j].pattern) ||
15896 			    nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
15897 					rule->patterns[j].pkt_offset))
15898 				return -ENOBUFS;
15899 			nla_nest_end(msg, nl_pat);
15900 		}
15901 		nla_nest_end(msg, nl_pats);
15902 		nla_nest_end(msg, nl_rule);
15903 	}
15904 	nla_nest_end(msg, nl_rules);
15905 
15906 	return 0;
15907 }
15908 
15909 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info)
15910 {
15911 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
15912 	struct sk_buff *msg;
15913 	void *hdr;
15914 
15915 	if (!rdev->wiphy.coalesce)
15916 		return -EOPNOTSUPP;
15917 
15918 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
15919 	if (!msg)
15920 		return -ENOMEM;
15921 
15922 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
15923 			     NL80211_CMD_GET_COALESCE);
15924 	if (!hdr)
15925 		goto nla_put_failure;
15926 
15927 	if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev))
15928 		goto nla_put_failure;
15929 
15930 	genlmsg_end(msg, hdr);
15931 	return genlmsg_reply(msg, info);
15932 
15933 nla_put_failure:
15934 	nlmsg_free(msg);
15935 	return -ENOBUFS;
15936 }
15937 
15938 void cfg80211_free_coalesce(struct cfg80211_coalesce *coalesce)
15939 {
15940 	int i, j;
15941 	struct cfg80211_coalesce_rules *rule;
15942 
15943 	if (!coalesce)
15944 		return;
15945 
15946 	for (i = 0; i < coalesce->n_rules; i++) {
15947 		rule = &coalesce->rules[i];
15948 		for (j = 0; j < rule->n_patterns; j++)
15949 			kfree(rule->patterns[j].mask);
15950 		kfree(rule->patterns);
15951 	}
15952 	kfree(coalesce);
15953 }
15954 
15955 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,
15956 				       struct nlattr *rule,
15957 				       struct cfg80211_coalesce_rules *new_rule)
15958 {
15959 	int err, i;
15960 	const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
15961 	struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat;
15962 	int rem, pat_len, mask_len, pkt_offset, n_patterns = 0;
15963 	struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
15964 
15965 	err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX,
15966 					  rule, nl80211_coalesce_policy, NULL);
15967 	if (err)
15968 		return err;
15969 
15970 	if (tb[NL80211_ATTR_COALESCE_RULE_DELAY])
15971 		new_rule->delay =
15972 			nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]);
15973 	if (new_rule->delay > coalesce->max_delay)
15974 		return -EINVAL;
15975 
15976 	if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION])
15977 		new_rule->condition =
15978 			nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]);
15979 
15980 	if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN])
15981 		return -EINVAL;
15982 
15983 	nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
15984 			    rem)
15985 		n_patterns++;
15986 	if (n_patterns > coalesce->n_patterns)
15987 		return -EINVAL;
15988 
15989 	new_rule->patterns = kzalloc_objs(new_rule->patterns[0], n_patterns);
15990 	if (!new_rule->patterns)
15991 		return -ENOMEM;
15992 
15993 	new_rule->n_patterns = n_patterns;
15994 	i = 0;
15995 
15996 	nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
15997 			    rem) {
15998 		u8 *mask_pat;
15999 
16000 		err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT,
16001 						  pat,
16002 						  nl80211_packet_pattern_policy,
16003 						  NULL);
16004 		if (err)
16005 			return err;
16006 
16007 		if (!pat_tb[NL80211_PKTPAT_MASK] ||
16008 		    !pat_tb[NL80211_PKTPAT_PATTERN])
16009 			return -EINVAL;
16010 		pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
16011 		mask_len = DIV_ROUND_UP(pat_len, 8);
16012 		if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
16013 			return -EINVAL;
16014 		if (pat_len > coalesce->pattern_max_len ||
16015 		    pat_len < coalesce->pattern_min_len)
16016 			return -EINVAL;
16017 
16018 		pkt_offset = nla_get_u32_default(pat_tb[NL80211_PKTPAT_OFFSET],
16019 						 0);
16020 		if (pkt_offset > coalesce->max_pkt_offset)
16021 			return -EINVAL;
16022 		new_rule->patterns[i].pkt_offset = pkt_offset;
16023 
16024 		mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
16025 		if (!mask_pat)
16026 			return -ENOMEM;
16027 
16028 		new_rule->patterns[i].mask = mask_pat;
16029 		memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
16030 		       mask_len);
16031 
16032 		mask_pat += mask_len;
16033 		new_rule->patterns[i].pattern = mask_pat;
16034 		new_rule->patterns[i].pattern_len = pat_len;
16035 		memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
16036 		       pat_len);
16037 		i++;
16038 	}
16039 
16040 	return 0;
16041 }
16042 
16043 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info)
16044 {
16045 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16046 	const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
16047 	struct cfg80211_coalesce *new_coalesce;
16048 	int err, rem_rule, n_rules = 0, i;
16049 	struct nlattr *rule;
16050 
16051 	if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce)
16052 		return -EOPNOTSUPP;
16053 
16054 	if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) {
16055 		cfg80211_free_coalesce(rdev->coalesce);
16056 		rdev->coalesce = NULL;
16057 		rdev_set_coalesce(rdev, NULL);
16058 		return 0;
16059 	}
16060 
16061 	nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
16062 			    rem_rule)
16063 		n_rules++;
16064 	if (n_rules > coalesce->n_rules)
16065 		return -EINVAL;
16066 
16067 	new_coalesce = kzalloc_flex(*new_coalesce, rules, n_rules);
16068 	if (!new_coalesce)
16069 		return -ENOMEM;
16070 
16071 	new_coalesce->n_rules = n_rules;
16072 	i = 0;
16073 
16074 	nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
16075 			    rem_rule) {
16076 		err = nl80211_parse_coalesce_rule(rdev, rule,
16077 						  &new_coalesce->rules[i]);
16078 		if (err)
16079 			goto error;
16080 
16081 		i++;
16082 	}
16083 
16084 	err = rdev_set_coalesce(rdev, new_coalesce);
16085 	if (err)
16086 		goto error;
16087 
16088 	cfg80211_free_coalesce(rdev->coalesce);
16089 	rdev->coalesce = new_coalesce;
16090 
16091 	return 0;
16092 error:
16093 	cfg80211_free_coalesce(new_coalesce);
16094 
16095 	return err;
16096 }
16097 
16098 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
16099 {
16100 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16101 	struct net_device *dev = info->user_ptr[1];
16102 	struct wireless_dev *wdev = dev->ieee80211_ptr;
16103 	struct nlattr *tb[NUM_NL80211_REKEY_DATA];
16104 	struct cfg80211_gtk_rekey_data rekey_data = {};
16105 	int err;
16106 
16107 	if (!info->attrs[NL80211_ATTR_REKEY_DATA])
16108 		return -EINVAL;
16109 
16110 	err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA,
16111 					  info->attrs[NL80211_ATTR_REKEY_DATA],
16112 					  nl80211_rekey_policy, info->extack);
16113 	if (err)
16114 		return err;
16115 
16116 	if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] ||
16117 	    !tb[NL80211_REKEY_DATA_KCK])
16118 		return -EINVAL;
16119 	if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN &&
16120 	    !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK &&
16121 	      nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KEK_EXT_LEN))
16122 		return -ERANGE;
16123 	if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN &&
16124 	    !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK &&
16125 	      nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN) &&
16126 	     !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 &&
16127 	       nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN_32))
16128 		return -ERANGE;
16129 
16130 	rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]);
16131 	rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]);
16132 	rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]);
16133 	rekey_data.kek_len = nla_len(tb[NL80211_REKEY_DATA_KEK]);
16134 	rekey_data.kck_len = nla_len(tb[NL80211_REKEY_DATA_KCK]);
16135 	if (tb[NL80211_REKEY_DATA_AKM])
16136 		rekey_data.akm = nla_get_u32(tb[NL80211_REKEY_DATA_AKM]);
16137 
16138 	if (!wdev->connected)
16139 		return -ENOTCONN;
16140 
16141 	if (!rdev->ops->set_rekey_data)
16142 		return -EOPNOTSUPP;
16143 
16144 	return rdev_set_rekey_data(rdev, dev, &rekey_data);
16145 }
16146 
16147 static int nl80211_register_unexpected_frame(struct sk_buff *skb,
16148 					     struct genl_info *info)
16149 {
16150 	struct net_device *dev = info->user_ptr[1];
16151 	struct wireless_dev *wdev = dev->ieee80211_ptr;
16152 
16153 	if (wdev->iftype != NL80211_IFTYPE_AP &&
16154 	    wdev->iftype != NL80211_IFTYPE_P2P_GO &&
16155 	    wdev->iftype != NL80211_IFTYPE_NAN_DATA)
16156 		return -EINVAL;
16157 
16158 	if (wdev->unexpected_nlportid)
16159 		return -EBUSY;
16160 
16161 	wdev->unexpected_nlportid = info->snd_portid;
16162 	return 0;
16163 }
16164 
16165 static int nl80211_probe_client(struct sk_buff *skb,
16166 				struct genl_info *info)
16167 {
16168 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16169 	struct net_device *dev = info->user_ptr[1];
16170 	struct wireless_dev *wdev = dev->ieee80211_ptr;
16171 	struct sk_buff *msg;
16172 	void *hdr;
16173 	const u8 *addr;
16174 	u64 cookie;
16175 	int err;
16176 
16177 	if (wdev->iftype != NL80211_IFTYPE_AP &&
16178 	    wdev->iftype != NL80211_IFTYPE_P2P_GO)
16179 		return -EOPNOTSUPP;
16180 
16181 	if (!info->attrs[NL80211_ATTR_MAC])
16182 		return -EINVAL;
16183 
16184 	if (!rdev->ops->probe_client)
16185 		return -EOPNOTSUPP;
16186 
16187 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
16188 	if (!msg)
16189 		return -ENOMEM;
16190 
16191 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
16192 			     NL80211_CMD_PROBE_CLIENT);
16193 	if (!hdr) {
16194 		err = -ENOBUFS;
16195 		goto free_msg;
16196 	}
16197 
16198 	addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
16199 
16200 	err = rdev_probe_client(rdev, dev, addr, &cookie);
16201 	if (err)
16202 		goto free_msg;
16203 
16204 	if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
16205 			      NL80211_ATTR_PAD))
16206 		goto nla_put_failure;
16207 
16208 	genlmsg_end(msg, hdr);
16209 
16210 	return genlmsg_reply(msg, info);
16211 
16212  nla_put_failure:
16213 	err = -ENOBUFS;
16214  free_msg:
16215 	nlmsg_free(msg);
16216 	return err;
16217 }
16218 
16219 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info)
16220 {
16221 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16222 	struct cfg80211_beacon_registration *reg, *nreg;
16223 	int rv;
16224 
16225 	if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS))
16226 		return -EOPNOTSUPP;
16227 
16228 	nreg = kzalloc_obj(*nreg);
16229 	if (!nreg)
16230 		return -ENOMEM;
16231 
16232 	/* First, check if already registered. */
16233 	spin_lock_bh(&rdev->beacon_registrations_lock);
16234 	list_for_each_entry(reg, &rdev->beacon_registrations, list) {
16235 		if (reg->nlportid == info->snd_portid) {
16236 			rv = -EALREADY;
16237 			goto out_err;
16238 		}
16239 	}
16240 	/* Add it to the list */
16241 	nreg->nlportid = info->snd_portid;
16242 	list_add(&nreg->list, &rdev->beacon_registrations);
16243 
16244 	spin_unlock_bh(&rdev->beacon_registrations_lock);
16245 
16246 	return 0;
16247 out_err:
16248 	spin_unlock_bh(&rdev->beacon_registrations_lock);
16249 	kfree(nreg);
16250 	return rv;
16251 }
16252 
16253 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
16254 {
16255 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16256 	struct wireless_dev *wdev = info->user_ptr[1];
16257 	int err;
16258 
16259 	if (!rdev->ops->start_p2p_device)
16260 		return -EOPNOTSUPP;
16261 
16262 	if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
16263 		return -EOPNOTSUPP;
16264 
16265 	if (wdev_running(wdev))
16266 		return 0;
16267 
16268 	if (rfkill_blocked(rdev->wiphy.rfkill))
16269 		return -ERFKILL;
16270 
16271 	err = rdev_start_p2p_device(rdev, wdev);
16272 	if (err)
16273 		return err;
16274 
16275 	wdev->is_running = true;
16276 	rdev->opencount++;
16277 
16278 	return 0;
16279 }
16280 
16281 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info)
16282 {
16283 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16284 	struct wireless_dev *wdev = info->user_ptr[1];
16285 
16286 	if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
16287 		return -EOPNOTSUPP;
16288 
16289 	if (!rdev->ops->stop_p2p_device)
16290 		return -EOPNOTSUPP;
16291 
16292 	cfg80211_stop_p2p_device(rdev, wdev);
16293 
16294 	return 0;
16295 }
16296 
16297 static struct ieee80211_channel *nl80211_get_nan_channel(struct wiphy *wiphy,
16298 							 int freq)
16299 {
16300 	struct ieee80211_channel *chan;
16301 	struct cfg80211_chan_def def;
16302 
16303 	/* Check if the frequency is valid for NAN */
16304 	if (freq != 5220 && freq != 5745 && freq != 2437)
16305 		return NULL;
16306 
16307 	chan = ieee80211_get_channel(wiphy, freq);
16308 	if (!chan)
16309 		return NULL;
16310 
16311 	cfg80211_chandef_create(&def, chan, NL80211_CHAN_NO_HT);
16312 
16313 	/* Check if the channel is allowed */
16314 	if (cfg80211_reg_can_beacon(wiphy, &def, NL80211_IFTYPE_NAN))
16315 		return chan;
16316 
16317 	return NULL;
16318 }
16319 
16320 static int nl80211_parse_nan_band_config(struct wiphy *wiphy,
16321 					 struct nlattr **tb,
16322 					 struct cfg80211_nan_band_config *cfg,
16323 					 enum nl80211_band band)
16324 {
16325 	if (BIT(band) & ~(u32)wiphy->nan_supported_bands)
16326 		return -EINVAL;
16327 
16328 	if (tb[NL80211_NAN_BAND_CONF_FREQ]) {
16329 		u16 freq = nla_get_u16(tb[NL80211_NAN_BAND_CONF_FREQ]);
16330 
16331 		if (band != NL80211_BAND_5GHZ)
16332 			return -EINVAL;
16333 
16334 		cfg->chan = nl80211_get_nan_channel(wiphy, freq);
16335 		if (!cfg->chan)
16336 			return -EINVAL;
16337 	}
16338 
16339 	if (tb[NL80211_NAN_BAND_CONF_RSSI_CLOSE]) {
16340 		cfg->rssi_close =
16341 			nla_get_s8(tb[NL80211_NAN_BAND_CONF_RSSI_CLOSE]);
16342 		if (!tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE])
16343 			return -EINVAL;
16344 	}
16345 
16346 	if (tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]) {
16347 		cfg->rssi_middle =
16348 			nla_get_s8(tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]);
16349 		if (!cfg->rssi_close || cfg->rssi_middle >= cfg->rssi_close)
16350 			return -EINVAL;
16351 	}
16352 
16353 	if (tb[NL80211_NAN_BAND_CONF_WAKE_DW]) {
16354 		cfg->awake_dw_interval =
16355 			nla_get_u8(tb[NL80211_NAN_BAND_CONF_WAKE_DW]);
16356 
16357 		if (band == NL80211_BAND_2GHZ && cfg->awake_dw_interval == 0)
16358 			return -EINVAL;
16359 	}
16360 
16361 	cfg->disable_scan =
16362 		nla_get_flag(tb[NL80211_NAN_BAND_CONF_DISABLE_SCAN]);
16363 	return 0;
16364 }
16365 
16366 static int nl80211_parse_nan_conf(struct wiphy *wiphy,
16367 				  struct genl_info *info,
16368 				  struct cfg80211_nan_conf *conf,
16369 				  u32 *changed_flags,
16370 				  bool start)
16371 {
16372 	struct nlattr *attrs[NL80211_NAN_CONF_ATTR_MAX + 1];
16373 	int err, rem;
16374 	u32 changed = 0;
16375 	struct nlattr *band_config;
16376 
16377 	if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) {
16378 		conf->master_pref =
16379 			nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
16380 
16381 		changed |= CFG80211_NAN_CONF_CHANGED_PREF;
16382 	}
16383 
16384 	if (info->attrs[NL80211_ATTR_BANDS]) {
16385 		u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
16386 
16387 		if (bands & ~(u32)wiphy->nan_supported_bands)
16388 			return -EOPNOTSUPP;
16389 
16390 		if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
16391 			return -EINVAL;
16392 
16393 		conf->bands = bands;
16394 		changed |= CFG80211_NAN_CONF_CHANGED_BANDS;
16395 	}
16396 
16397 	conf->band_cfgs[NL80211_BAND_2GHZ].awake_dw_interval = 1;
16398 	if (conf->bands & BIT(NL80211_BAND_5GHZ) || !conf->bands)
16399 		conf->band_cfgs[NL80211_BAND_5GHZ].awake_dw_interval = 1;
16400 
16401 	/* On 2.4 GHz band use channel 6 */
16402 	conf->band_cfgs[NL80211_BAND_2GHZ].chan =
16403 		nl80211_get_nan_channel(wiphy, 2437);
16404 	if (!conf->band_cfgs[NL80211_BAND_2GHZ].chan)
16405 		return -EINVAL;
16406 
16407 	if (!info->attrs[NL80211_ATTR_NAN_CONFIG])
16408 		goto out;
16409 
16410 	err = nla_parse_nested(attrs, NL80211_NAN_CONF_ATTR_MAX,
16411 			       info->attrs[NL80211_ATTR_NAN_CONFIG], NULL,
16412 			       info->extack);
16413 	if (err)
16414 		return err;
16415 
16416 	changed |= CFG80211_NAN_CONF_CHANGED_CONFIG;
16417 	if (attrs[NL80211_NAN_CONF_CLUSTER_ID] && start) {
16418 		ether_addr_copy(conf->cluster_id,
16419 				nla_data(attrs[NL80211_NAN_CONF_CLUSTER_ID]));
16420 	} else if (start) {
16421 		conf->cluster_id[0] = 0x50;
16422 		conf->cluster_id[1] = 0x6f;
16423 		conf->cluster_id[2] = 0x9a;
16424 		conf->cluster_id[3] = 0x01;
16425 		get_random_bytes(&conf->cluster_id[4], 2);
16426 	}
16427 
16428 	if (attrs[NL80211_NAN_CONF_EXTRA_ATTRS]) {
16429 		conf->extra_nan_attrs =
16430 			nla_data(attrs[NL80211_NAN_CONF_EXTRA_ATTRS]);
16431 		conf->extra_nan_attrs_len =
16432 			nla_len(attrs[NL80211_NAN_CONF_EXTRA_ATTRS]);
16433 	}
16434 
16435 	if (attrs[NL80211_NAN_CONF_VENDOR_ELEMS]) {
16436 		conf->vendor_elems =
16437 			nla_data(attrs[NL80211_NAN_CONF_VENDOR_ELEMS]);
16438 		conf->vendor_elems_len =
16439 			nla_len(attrs[NL80211_NAN_CONF_VENDOR_ELEMS]);
16440 	}
16441 
16442 	if (attrs[NL80211_NAN_CONF_BAND_CONFIGS]) {
16443 		nla_for_each_nested(band_config,
16444 				    attrs[NL80211_NAN_CONF_BAND_CONFIGS],
16445 				    rem) {
16446 			enum nl80211_band band;
16447 			struct cfg80211_nan_band_config *cfg;
16448 			struct nlattr *tb[NL80211_NAN_BAND_CONF_ATTR_MAX + 1];
16449 
16450 			err = nla_parse_nested(tb,
16451 					       NL80211_NAN_BAND_CONF_ATTR_MAX,
16452 					       band_config, NULL,
16453 					       info->extack);
16454 			if (err)
16455 				return err;
16456 
16457 			if (!tb[NL80211_NAN_BAND_CONF_BAND])
16458 				return -EINVAL;
16459 
16460 			band = nla_get_u8(tb[NL80211_NAN_BAND_CONF_BAND]);
16461 			if (conf->bands && !(conf->bands & BIT(band)))
16462 				return -EINVAL;
16463 
16464 			cfg = &conf->band_cfgs[band];
16465 
16466 			err = nl80211_parse_nan_band_config(wiphy, tb, cfg,
16467 							    band);
16468 			if (err)
16469 				return err;
16470 		}
16471 	}
16472 
16473 	if (attrs[NL80211_NAN_CONF_SCAN_PERIOD])
16474 		conf->scan_period =
16475 			nla_get_u16(attrs[NL80211_NAN_CONF_SCAN_PERIOD]);
16476 
16477 	if (attrs[NL80211_NAN_CONF_SCAN_DWELL_TIME])
16478 		conf->scan_dwell_time =
16479 			nla_get_u16(attrs[NL80211_NAN_CONF_SCAN_DWELL_TIME]);
16480 
16481 	if (attrs[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL])
16482 		conf->discovery_beacon_interval =
16483 			nla_get_u8(attrs[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL]);
16484 
16485 	if (attrs[NL80211_NAN_CONF_NOTIFY_DW])
16486 		conf->enable_dw_notification =
16487 			nla_get_flag(attrs[NL80211_NAN_CONF_NOTIFY_DW]);
16488 
16489 out:
16490 	if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan &&
16491 	    (!conf->bands || conf->bands & BIT(NL80211_BAND_5GHZ))) {
16492 		/* If no 5GHz channel is specified use default, if possible */
16493 		conf->band_cfgs[NL80211_BAND_5GHZ].chan =
16494 				nl80211_get_nan_channel(wiphy, 5745);
16495 		if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan)
16496 			conf->band_cfgs[NL80211_BAND_5GHZ].chan =
16497 					nl80211_get_nan_channel(wiphy, 5220);
16498 
16499 		/* Return error if user space asked explicitly for 5 GHz */
16500 		if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan &&
16501 		    conf->bands & BIT(NL80211_BAND_5GHZ)) {
16502 			NL_SET_ERR_MSG_ATTR(info->extack,
16503 					    info->attrs[NL80211_ATTR_BANDS],
16504 					    "5 GHz band operation is not allowed");
16505 			return -EINVAL;
16506 		}
16507 	}
16508 
16509 	if (changed_flags)
16510 		*changed_flags = changed;
16511 
16512 	return 0;
16513 }
16514 
16515 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
16516 {
16517 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16518 	struct wireless_dev *wdev = info->user_ptr[1];
16519 	struct cfg80211_nan_conf conf = {};
16520 	int err;
16521 
16522 	if (wdev->iftype != NL80211_IFTYPE_NAN)
16523 		return -EOPNOTSUPP;
16524 
16525 	if (wdev_running(wdev))
16526 		return -EEXIST;
16527 
16528 	if (rfkill_blocked(rdev->wiphy.rfkill))
16529 		return -ERFKILL;
16530 
16531 	/* Master preference is mandatory for START_NAN */
16532 	if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF])
16533 		return -EINVAL;
16534 
16535 	err = nl80211_parse_nan_conf(&rdev->wiphy, info, &conf, NULL, true);
16536 	if (err)
16537 		return err;
16538 
16539 	err = rdev_start_nan(rdev, wdev, &conf);
16540 	if (err)
16541 		return err;
16542 
16543 	wdev->is_running = true;
16544 	rdev->opencount++;
16545 
16546 	return 0;
16547 }
16548 
16549 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info)
16550 {
16551 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16552 	struct wireless_dev *wdev = info->user_ptr[1];
16553 
16554 	if (wdev->iftype != NL80211_IFTYPE_NAN)
16555 		return -EOPNOTSUPP;
16556 
16557 	cfg80211_close_dependents(rdev, wdev);
16558 
16559 	guard(wiphy)(&rdev->wiphy);
16560 
16561 	cfg80211_stop_nan(rdev, wdev);
16562 
16563 	return 0;
16564 }
16565 
16566 static int validate_nan_filter(struct nlattr *filter_attr)
16567 {
16568 	struct nlattr *attr;
16569 	int len = 0, n_entries = 0, rem;
16570 
16571 	nla_for_each_nested(attr, filter_attr, rem) {
16572 		len += nla_len(attr);
16573 		n_entries++;
16574 	}
16575 
16576 	if (len >= U8_MAX)
16577 		return -EINVAL;
16578 
16579 	return n_entries;
16580 }
16581 
16582 static int handle_nan_filter(struct nlattr *attr_filter,
16583 			     struct cfg80211_nan_func *func,
16584 			     bool tx)
16585 {
16586 	struct nlattr *attr;
16587 	int n_entries, rem, i;
16588 	struct cfg80211_nan_func_filter *filter;
16589 
16590 	n_entries = validate_nan_filter(attr_filter);
16591 	if (n_entries < 0)
16592 		return n_entries;
16593 
16594 	BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters));
16595 
16596 	filter = kzalloc_objs(*func->rx_filters, n_entries);
16597 	if (!filter)
16598 		return -ENOMEM;
16599 
16600 	i = 0;
16601 	nla_for_each_nested(attr, attr_filter, rem) {
16602 		filter[i].filter = nla_memdup(attr, GFP_KERNEL);
16603 		if (!filter[i].filter)
16604 			goto err;
16605 
16606 		filter[i].len = nla_len(attr);
16607 		i++;
16608 	}
16609 	if (tx) {
16610 		func->num_tx_filters = n_entries;
16611 		func->tx_filters = filter;
16612 	} else {
16613 		func->num_rx_filters = n_entries;
16614 		func->rx_filters = filter;
16615 	}
16616 
16617 	return 0;
16618 
16619 err:
16620 	i = 0;
16621 	nla_for_each_nested(attr, attr_filter, rem) {
16622 		kfree(filter[i].filter);
16623 		i++;
16624 	}
16625 	kfree(filter);
16626 	return -ENOMEM;
16627 }
16628 
16629 static int nl80211_nan_add_func(struct sk_buff *skb,
16630 				struct genl_info *info)
16631 {
16632 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16633 	struct wireless_dev *wdev = info->user_ptr[1];
16634 	struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr;
16635 	struct cfg80211_nan_func *func;
16636 	struct sk_buff *msg = NULL;
16637 	void *hdr = NULL;
16638 	int err = 0;
16639 
16640 	if (wdev->iftype != NL80211_IFTYPE_NAN)
16641 		return -EOPNOTSUPP;
16642 
16643 	if (!wdev_running(wdev))
16644 		return -ENOTCONN;
16645 
16646 	if (!info->attrs[NL80211_ATTR_NAN_FUNC])
16647 		return -EINVAL;
16648 
16649 	err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX,
16650 					  info->attrs[NL80211_ATTR_NAN_FUNC],
16651 					  nl80211_nan_func_policy,
16652 					  info->extack);
16653 	if (err)
16654 		return err;
16655 
16656 	func = kzalloc_obj(*func);
16657 	if (!func)
16658 		return -ENOMEM;
16659 
16660 	func->cookie = cfg80211_assign_cookie(rdev);
16661 
16662 	if (!tb[NL80211_NAN_FUNC_TYPE]) {
16663 		err = -EINVAL;
16664 		goto out;
16665 	}
16666 
16667 
16668 	func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]);
16669 
16670 	if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) {
16671 		err = -EINVAL;
16672 		goto out;
16673 	}
16674 
16675 	memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]),
16676 	       sizeof(func->service_id));
16677 
16678 	func->close_range =
16679 		nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]);
16680 
16681 	if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) {
16682 		func->serv_spec_info_len =
16683 			nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]);
16684 		func->serv_spec_info =
16685 			kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]),
16686 				func->serv_spec_info_len,
16687 				GFP_KERNEL);
16688 		if (!func->serv_spec_info) {
16689 			err = -ENOMEM;
16690 			goto out;
16691 		}
16692 	}
16693 
16694 	if (tb[NL80211_NAN_FUNC_TTL])
16695 		func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]);
16696 
16697 	switch (func->type) {
16698 	case NL80211_NAN_FUNC_PUBLISH:
16699 		if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) {
16700 			err = -EINVAL;
16701 			goto out;
16702 		}
16703 
16704 		func->publish_type =
16705 			nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]);
16706 		func->publish_bcast =
16707 			nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]);
16708 
16709 		if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) &&
16710 			func->publish_bcast) {
16711 			err = -EINVAL;
16712 			goto out;
16713 		}
16714 		break;
16715 	case NL80211_NAN_FUNC_SUBSCRIBE:
16716 		func->subscribe_active =
16717 			nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]);
16718 		break;
16719 	case NL80211_NAN_FUNC_FOLLOW_UP:
16720 		if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] ||
16721 		    !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] ||
16722 		    !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) {
16723 			err = -EINVAL;
16724 			goto out;
16725 		}
16726 
16727 		func->followup_id =
16728 			nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]);
16729 		func->followup_reqid =
16730 			nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]);
16731 		memcpy(func->followup_dest.addr,
16732 		       nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]),
16733 		       sizeof(func->followup_dest.addr));
16734 		if (func->ttl) {
16735 			err = -EINVAL;
16736 			goto out;
16737 		}
16738 		break;
16739 	default:
16740 		err = -EINVAL;
16741 		goto out;
16742 	}
16743 
16744 	if (tb[NL80211_NAN_FUNC_SRF]) {
16745 		struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR];
16746 
16747 		err = nla_parse_nested_deprecated(srf_tb,
16748 						  NL80211_NAN_SRF_ATTR_MAX,
16749 						  tb[NL80211_NAN_FUNC_SRF],
16750 						  nl80211_nan_srf_policy,
16751 						  info->extack);
16752 		if (err)
16753 			goto out;
16754 
16755 		func->srf_include =
16756 			nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]);
16757 
16758 		if (srf_tb[NL80211_NAN_SRF_BF]) {
16759 			if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] ||
16760 			    !srf_tb[NL80211_NAN_SRF_BF_IDX]) {
16761 				err = -EINVAL;
16762 				goto out;
16763 			}
16764 
16765 			func->srf_bf_len =
16766 				nla_len(srf_tb[NL80211_NAN_SRF_BF]);
16767 			func->srf_bf =
16768 				kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]),
16769 					func->srf_bf_len, GFP_KERNEL);
16770 			if (!func->srf_bf) {
16771 				err = -ENOMEM;
16772 				goto out;
16773 			}
16774 
16775 			func->srf_bf_idx =
16776 				nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]);
16777 		} else {
16778 			struct nlattr *attr, *mac_attr =
16779 				srf_tb[NL80211_NAN_SRF_MAC_ADDRS];
16780 			int n_entries, rem, i = 0;
16781 
16782 			if (!mac_attr) {
16783 				err = -EINVAL;
16784 				goto out;
16785 			}
16786 
16787 			n_entries = validate_acl_mac_addrs(mac_attr);
16788 			if (n_entries <= 0) {
16789 				err = -EINVAL;
16790 				goto out;
16791 			}
16792 
16793 			func->srf_num_macs = n_entries;
16794 			func->srf_macs =
16795 				kzalloc_objs(*func->srf_macs, n_entries);
16796 			if (!func->srf_macs) {
16797 				err = -ENOMEM;
16798 				goto out;
16799 			}
16800 
16801 			nla_for_each_nested(attr, mac_attr, rem)
16802 				memcpy(func->srf_macs[i++].addr, nla_data(attr),
16803 				       sizeof(*func->srf_macs));
16804 		}
16805 	}
16806 
16807 	if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) {
16808 		err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER],
16809 					func, true);
16810 		if (err)
16811 			goto out;
16812 	}
16813 
16814 	if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) {
16815 		err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER],
16816 					func, false);
16817 		if (err)
16818 			goto out;
16819 	}
16820 
16821 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
16822 	if (!msg) {
16823 		err = -ENOMEM;
16824 		goto out;
16825 	}
16826 
16827 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
16828 			     NL80211_CMD_ADD_NAN_FUNCTION);
16829 	/* This can't really happen - we just allocated 4KB */
16830 	if (WARN_ON(!hdr)) {
16831 		err = -ENOMEM;
16832 		goto out;
16833 	}
16834 
16835 	err = rdev_add_nan_func(rdev, wdev, func);
16836 out:
16837 	if (err < 0) {
16838 		cfg80211_free_nan_func(func);
16839 		nlmsg_free(msg);
16840 		return err;
16841 	}
16842 
16843 	/* propagate the instance id and cookie to userspace  */
16844 	if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie,
16845 			      NL80211_ATTR_PAD))
16846 		goto nla_put_failure;
16847 
16848 	func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC);
16849 	if (!func_attr)
16850 		goto nla_put_failure;
16851 
16852 	if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID,
16853 		       func->instance_id))
16854 		goto nla_put_failure;
16855 
16856 	nla_nest_end(msg, func_attr);
16857 
16858 	genlmsg_end(msg, hdr);
16859 	return genlmsg_reply(msg, info);
16860 
16861 nla_put_failure:
16862 	nlmsg_free(msg);
16863 	return -ENOBUFS;
16864 }
16865 
16866 static int nl80211_nan_del_func(struct sk_buff *skb,
16867 			       struct genl_info *info)
16868 {
16869 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16870 	struct wireless_dev *wdev = info->user_ptr[1];
16871 	u64 cookie;
16872 
16873 	if (wdev->iftype != NL80211_IFTYPE_NAN)
16874 		return -EOPNOTSUPP;
16875 
16876 	if (!wdev_running(wdev))
16877 		return -ENOTCONN;
16878 
16879 	if (!info->attrs[NL80211_ATTR_COOKIE])
16880 		return -EINVAL;
16881 
16882 	cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
16883 
16884 	rdev_del_nan_func(rdev, wdev, cookie);
16885 
16886 	return 0;
16887 }
16888 
16889 static int nl80211_nan_change_config(struct sk_buff *skb,
16890 				     struct genl_info *info)
16891 {
16892 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16893 	struct wireless_dev *wdev = info->user_ptr[1];
16894 	struct cfg80211_nan_conf conf = {};
16895 	u32 changed = 0;
16896 	int err;
16897 
16898 	if (wdev->iftype != NL80211_IFTYPE_NAN)
16899 		return -EOPNOTSUPP;
16900 
16901 	if (!wdev_running(wdev))
16902 		return -ENOTCONN;
16903 
16904 	err = nl80211_parse_nan_conf(&rdev->wiphy, info, &conf, &changed, false);
16905 	if (err)
16906 		return err;
16907 
16908 	if (!changed)
16909 		return -EINVAL;
16910 
16911 	return rdev_nan_change_conf(rdev, wdev, &conf, changed);
16912 }
16913 
16914 static int nl80211_start_pd(struct sk_buff *skb, struct genl_info *info)
16915 {
16916 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16917 	struct wireless_dev *wdev = info->user_ptr[1];
16918 	int err;
16919 
16920 	if (wdev->iftype != NL80211_IFTYPE_PD)
16921 		return -EOPNOTSUPP;
16922 
16923 	if (wdev_running(wdev))
16924 		return -EEXIST;
16925 
16926 	if (rfkill_blocked(rdev->wiphy.rfkill))
16927 		return -ERFKILL;
16928 
16929 	if (!rdev->ops->start_pd)
16930 		return -EOPNOTSUPP;
16931 
16932 	err = rdev_start_pd(rdev, wdev);
16933 	if (err)
16934 		return err;
16935 	wdev->is_running = true;
16936 	rdev->opencount++;
16937 
16938 	return 0;
16939 }
16940 
16941 static int nl80211_stop_pd(struct sk_buff *skb, struct genl_info *info)
16942 {
16943 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
16944 	struct wireless_dev *wdev = info->user_ptr[1];
16945 
16946 	if (wdev->iftype != NL80211_IFTYPE_PD)
16947 		return -EOPNOTSUPP;
16948 
16949 	cfg80211_stop_pd(rdev, wdev);
16950 
16951 	return 0;
16952 }
16953 
16954 void cfg80211_nan_match(struct wireless_dev *wdev,
16955 			struct cfg80211_nan_match_params *match, gfp_t gfp)
16956 {
16957 	struct wiphy *wiphy = wdev->wiphy;
16958 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
16959 	struct nlattr *match_attr, *local_func_attr, *peer_func_attr;
16960 	struct sk_buff *msg;
16961 	void *hdr;
16962 
16963 	if (WARN_ON(wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE))
16964 		return;
16965 
16966 	if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr))
16967 		return;
16968 
16969 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
16970 	if (!msg)
16971 		return;
16972 
16973 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH);
16974 	if (!hdr) {
16975 		nlmsg_free(msg);
16976 		return;
16977 	}
16978 
16979 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16980 	    (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
16981 					 wdev->netdev->ifindex)) ||
16982 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
16983 			      NL80211_ATTR_PAD))
16984 		goto nla_put_failure;
16985 
16986 	if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie,
16987 			      NL80211_ATTR_PAD) ||
16988 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr))
16989 		goto nla_put_failure;
16990 
16991 	match_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_MATCH);
16992 	if (!match_attr)
16993 		goto nla_put_failure;
16994 
16995 	local_func_attr = nla_nest_start_noflag(msg,
16996 						NL80211_NAN_MATCH_FUNC_LOCAL);
16997 	if (!local_func_attr)
16998 		goto nla_put_failure;
16999 
17000 	if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id))
17001 		goto nla_put_failure;
17002 
17003 	nla_nest_end(msg, local_func_attr);
17004 
17005 	peer_func_attr = nla_nest_start_noflag(msg,
17006 					       NL80211_NAN_MATCH_FUNC_PEER);
17007 	if (!peer_func_attr)
17008 		goto nla_put_failure;
17009 
17010 	if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) ||
17011 	    nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id))
17012 		goto nla_put_failure;
17013 
17014 	if (match->info && match->info_len &&
17015 	    nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len,
17016 		    match->info))
17017 		goto nla_put_failure;
17018 
17019 	nla_nest_end(msg, peer_func_attr);
17020 	nla_nest_end(msg, match_attr);
17021 	genlmsg_end(msg, hdr);
17022 
17023 	if (!wdev->owner_nlportid)
17024 		genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
17025 					msg, 0, NL80211_MCGRP_NAN, gfp);
17026 	else
17027 		genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
17028 				wdev->owner_nlportid);
17029 
17030 	return;
17031 
17032 nla_put_failure:
17033 	nlmsg_free(msg);
17034 }
17035 EXPORT_SYMBOL(cfg80211_nan_match);
17036 
17037 void cfg80211_nan_func_terminated(struct wireless_dev *wdev,
17038 				  u8 inst_id,
17039 				  enum nl80211_nan_func_term_reason reason,
17040 				  u64 cookie, gfp_t gfp)
17041 {
17042 	struct wiphy *wiphy = wdev->wiphy;
17043 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17044 	struct sk_buff *msg;
17045 	struct nlattr *func_attr;
17046 	void *hdr;
17047 
17048 	if (WARN_ON(wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE))
17049 		return;
17050 
17051 	if (WARN_ON(!inst_id))
17052 		return;
17053 
17054 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
17055 	if (!msg)
17056 		return;
17057 
17058 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION);
17059 	if (!hdr) {
17060 		nlmsg_free(msg);
17061 		return;
17062 	}
17063 
17064 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17065 	    (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
17066 					 wdev->netdev->ifindex)) ||
17067 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
17068 			      NL80211_ATTR_PAD))
17069 		goto nla_put_failure;
17070 
17071 	if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
17072 			      NL80211_ATTR_PAD))
17073 		goto nla_put_failure;
17074 
17075 	func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC);
17076 	if (!func_attr)
17077 		goto nla_put_failure;
17078 
17079 	if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) ||
17080 	    nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason))
17081 		goto nla_put_failure;
17082 
17083 	nla_nest_end(msg, func_attr);
17084 	genlmsg_end(msg, hdr);
17085 
17086 	if (!wdev->owner_nlportid)
17087 		genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
17088 					msg, 0, NL80211_MCGRP_NAN, gfp);
17089 	else
17090 		genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
17091 				wdev->owner_nlportid);
17092 
17093 	return;
17094 
17095 nla_put_failure:
17096 	nlmsg_free(msg);
17097 }
17098 EXPORT_SYMBOL(cfg80211_nan_func_terminated);
17099 
17100 void cfg80211_nan_sched_update_done(struct wireless_dev *wdev, bool success,
17101 				    gfp_t gfp)
17102 {
17103 	struct wiphy *wiphy = wdev->wiphy;
17104 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17105 	struct sk_buff *msg;
17106 	void *hdr;
17107 
17108 	trace_cfg80211_nan_sched_update_done(wiphy, wdev, success);
17109 
17110 	/* Can happen if we stopped NAN */
17111 	if (!wdev->u.nan.sched_update_pending)
17112 		return;
17113 
17114 	wdev->u.nan.sched_update_pending = false;
17115 
17116 	if (!wdev->owner_nlportid)
17117 		return;
17118 
17119 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
17120 	if (!msg)
17121 		return;
17122 
17123 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_SCHED_UPDATE_DONE);
17124 	if (!hdr)
17125 		goto nla_put_failure;
17126 
17127 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17128 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
17129 			      NL80211_ATTR_PAD) ||
17130 	    (success &&
17131 	     nla_put_flag(msg, NL80211_ATTR_NAN_SCHED_UPDATE_SUCCESS)))
17132 		goto nla_put_failure;
17133 
17134 	genlmsg_end(msg, hdr);
17135 
17136 	genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid);
17137 
17138 	return;
17139 
17140 nla_put_failure:
17141 	nlmsg_free(msg);
17142 }
17143 EXPORT_SYMBOL(cfg80211_nan_sched_update_done);
17144 
17145 static int nl80211_parse_nan_channel(struct cfg80211_registered_device *rdev,
17146 				     struct nlattr *channel,
17147 				     struct genl_info *info,
17148 				     struct cfg80211_nan_channel *nan_channels,
17149 				     u8 index, bool local)
17150 {
17151 	struct nlattr **channel_parsed __free(kfree) = NULL;
17152 	struct cfg80211_chan_def chandef;
17153 	u8 n_rx_nss;
17154 	int ret;
17155 
17156 	channel_parsed = kcalloc(NL80211_ATTR_MAX + 1, sizeof(*channel_parsed),
17157 				 GFP_KERNEL);
17158 	if (!channel_parsed)
17159 		return -ENOMEM;
17160 
17161 	ret = nla_parse_nested(channel_parsed, NL80211_ATTR_MAX, channel, NULL,
17162 			       info->extack);
17163 	if (ret)
17164 		return ret;
17165 
17166 	ret = nl80211_parse_chandef(rdev, info->extack, channel_parsed,
17167 				    &chandef, false);
17168 	if (ret)
17169 		return ret;
17170 
17171 	if (chandef.chan->band == NL80211_BAND_6GHZ) {
17172 		NL_SET_ERR_MSG(info->extack,
17173 			       "6 GHz band is not supported");
17174 		return -EOPNOTSUPP;
17175 	}
17176 
17177 	if (!cfg80211_reg_can_beacon(&rdev->wiphy, &chandef,
17178 				     NL80211_IFTYPE_NAN)) {
17179 		NL_SET_ERR_MSG_ATTR(info->extack, channel,
17180 				    "Channel in NAN schedule is not allowed for NAN operation");
17181 		return -EINVAL;
17182 	}
17183 
17184 	if (local) {
17185 		for (int i = 0; i < index; i++) {
17186 			if (cfg80211_chandef_compatible(&nan_channels[i].chandef,
17187 							&chandef)) {
17188 				NL_SET_ERR_MSG_ATTR(info->extack, channel,
17189 						    "Channels in NAN schedule must be mutually incompatible");
17190 				return -EINVAL;
17191 			}
17192 		}
17193 	}
17194 
17195 	if (!channel_parsed[NL80211_ATTR_NAN_CHANNEL_ENTRY]) {
17196 		NL_SET_ERR_MSG(info->extack,
17197 			       "Missing NAN channel entry attribute");
17198 		return -EINVAL;
17199 	}
17200 
17201 	nan_channels[index].channel_entry =
17202 		nla_data(channel_parsed[NL80211_ATTR_NAN_CHANNEL_ENTRY]);
17203 
17204 	if (!channel_parsed[NL80211_ATTR_NAN_RX_NSS]) {
17205 		NL_SET_ERR_MSG(info->extack,
17206 			       "Missing NAN RX NSS attribute");
17207 		return -EINVAL;
17208 	}
17209 
17210 	nan_channels[index].rx_nss =
17211 		nla_get_u8(channel_parsed[NL80211_ATTR_NAN_RX_NSS]);
17212 
17213 	n_rx_nss = u8_get_bits(rdev->wiphy.nan_capa.n_antennas, 0x03);
17214 	if ((local && nan_channels[index].rx_nss > n_rx_nss) ||
17215 	    !nan_channels[index].rx_nss) {
17216 		NL_SET_ERR_MSG_ATTR(info->extack, channel,
17217 				    "Invalid RX NSS in NAN channel definition");
17218 		return -EINVAL;
17219 	}
17220 
17221 	nan_channels[index].chandef = chandef;
17222 
17223 	return 0;
17224 }
17225 
17226 static int
17227 nl80211_parse_nan_schedule(struct genl_info *info, struct nlattr *slots_attr,
17228 			   u8 schedule[CFG80211_NAN_SCHED_NUM_TIME_SLOTS],
17229 			   u8 n_channels)
17230 {
17231 	if (WARN_ON(nla_len(slots_attr) != CFG80211_NAN_SCHED_NUM_TIME_SLOTS))
17232 		return -EINVAL;
17233 
17234 	memcpy(schedule, nla_data(slots_attr), nla_len(slots_attr));
17235 
17236 	for (int slot = 0; slot < CFG80211_NAN_SCHED_NUM_TIME_SLOTS; slot++) {
17237 		if (schedule[slot] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT &&
17238 		    schedule[slot] >= n_channels) {
17239 			NL_SET_ERR_MSG_FMT(info->extack,
17240 					   "Invalid time slot: slot %d refers to channel index %d, n_channels=%d",
17241 					   slot, schedule[slot], n_channels);
17242 			return -EINVAL;
17243 		}
17244 	}
17245 
17246 	return 0;
17247 }
17248 
17249 static int
17250 nl80211_parse_nan_peer_map(struct genl_info *info, struct nlattr *map_attr,
17251 			   struct cfg80211_nan_peer_map *map, u8 n_channels)
17252 {
17253 	struct nlattr *tb[NL80211_NAN_PEER_MAP_ATTR_MAX + 1];
17254 	int ret;
17255 
17256 	ret = nla_parse_nested(tb, NL80211_NAN_PEER_MAP_ATTR_MAX, map_attr,
17257 			       nl80211_nan_peer_map_policy, info->extack);
17258 	if (ret)
17259 		return ret;
17260 
17261 	if (!tb[NL80211_NAN_PEER_MAP_ATTR_MAP_ID] ||
17262 	    !tb[NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS]) {
17263 		NL_SET_ERR_MSG(info->extack,
17264 			       "Missing required peer map attributes");
17265 		return -EINVAL;
17266 	}
17267 
17268 	map->map_id = nla_get_u8(tb[NL80211_NAN_PEER_MAP_ATTR_MAP_ID]);
17269 
17270 	/* Parse schedule */
17271 	return nl80211_parse_nan_schedule(info,
17272 					  tb[NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS],
17273 					  map->schedule, n_channels);
17274 }
17275 
17276 static int nl80211_nan_validate_map_pair(struct wiphy *wiphy,
17277 					 struct genl_info *info,
17278 					 const struct cfg80211_nan_peer_map *map1,
17279 					 const struct cfg80211_nan_peer_map *map2,
17280 					 struct cfg80211_nan_channel *nan_channels)
17281 {
17282 	/* Check for duplicate map_id */
17283 	if (map1->map_id == map2->map_id) {
17284 		NL_SET_ERR_MSG_FMT(info->extack, "Duplicate map_id %u",
17285 				   map1->map_id);
17286 		return -EINVAL;
17287 	}
17288 
17289 	/* Check for compatible channels between maps */
17290 	for (int i = 0; i < ARRAY_SIZE(map1->schedule); i++) {
17291 		if (map1->schedule[i] == NL80211_NAN_SCHED_NOT_AVAIL_SLOT)
17292 			continue;
17293 
17294 		for (int j = 0; j < ARRAY_SIZE(map2->schedule); j++) {
17295 			u8 ch1 = map1->schedule[i];
17296 			u8 ch2 = map2->schedule[j];
17297 
17298 			if (ch2 == NL80211_NAN_SCHED_NOT_AVAIL_SLOT)
17299 				continue;
17300 
17301 			if (cfg80211_chandef_compatible(&nan_channels[ch1].chandef,
17302 							&nan_channels[ch2].chandef)) {
17303 				NL_SET_ERR_MSG_FMT(info->extack,
17304 						   "Maps %u and %u have compatible channels %d and %d",
17305 						   map1->map_id, map2->map_id,
17306 						   ch1, ch2);
17307 				return -EINVAL;
17308 			}
17309 		}
17310 	}
17311 
17312 	/*
17313 	 * Check for conflicting time slots between maps.
17314 	 * Only check for single-radio devices (n_radio <= 1) which cannot
17315 	 * operate on multiple channels simultaneously.
17316 	 */
17317 	if (wiphy->n_radio > 1)
17318 		return 0;
17319 
17320 	for (int i = 0; i < ARRAY_SIZE(map1->schedule); i++) {
17321 		if (map1->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT &&
17322 		    map2->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT) {
17323 			NL_SET_ERR_MSG_FMT(info->extack,
17324 					   "Maps %u and %u both schedule slot %d",
17325 					   map1->map_id, map2->map_id, i);
17326 			return -EINVAL;
17327 		}
17328 	}
17329 
17330 	return 0;
17331 }
17332 
17333 static int nl80211_nan_set_peer_sched(struct sk_buff *skb,
17334 				      struct genl_info *info)
17335 {
17336 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
17337 	struct cfg80211_nan_channel *nan_channels __free(kfree) = NULL;
17338 	struct cfg80211_nan_peer_sched sched = {};
17339 	struct wireless_dev *wdev = info->user_ptr[1];
17340 	struct nlattr *map_attr, *channel;
17341 	int ret, n_maps = 0, n_channels = 0, i = 0, rem;
17342 
17343 	if (wdev->iftype != NL80211_IFTYPE_NAN)
17344 		return -EOPNOTSUPP;
17345 
17346 	if (!info->attrs[NL80211_ATTR_MAC] ||
17347 	    !info->attrs[NL80211_ATTR_NAN_COMMITTED_DW]) {
17348 		NL_SET_ERR_MSG(info->extack,
17349 			       "Required NAN peer schedule attributes are missing");
17350 		return -EINVAL;
17351 	}
17352 
17353 	/* First count how many channel attributes we got */
17354 	nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL,
17355 				 info->nlhdr, GENL_HDRLEN, rem)
17356 		n_channels++;
17357 
17358 	if (!((info->attrs[NL80211_ATTR_NAN_SEQ_ID] &&
17359 	       info->attrs[NL80211_ATTR_NAN_PEER_MAPS] && n_channels) ||
17360 	      ((!info->attrs[NL80211_ATTR_NAN_SEQ_ID] &&
17361 		!info->attrs[NL80211_ATTR_NAN_PEER_MAPS] && !n_channels)))) {
17362 		NL_SET_ERR_MSG(info->extack,
17363 			       "Either provide all of: seq id, channels and maps, or none");
17364 		return -EINVAL;
17365 	}
17366 
17367 	/*
17368 	 * Limit the number of peer channels to:
17369 	 * local_channels * 4 (possible BWs) * 2 (possible NSS values)
17370 	 */
17371 	if (n_channels && n_channels > wdev->u.nan.n_channels * 4 * 2) {
17372 		NL_SET_ERR_MSG_FMT(info->extack,
17373 				   "Too many peer channels: %d (max %d)",
17374 				   n_channels,
17375 				   wdev->u.nan.n_channels * 4 * 2);
17376 		return -EINVAL;
17377 	}
17378 
17379 	if (n_channels) {
17380 		nan_channels = kcalloc(n_channels, sizeof(*nan_channels),
17381 				       GFP_KERNEL);
17382 		if (!nan_channels)
17383 			return -ENOMEM;
17384 	}
17385 
17386 	/* Parse peer channels */
17387 	nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL,
17388 				 info->nlhdr, GENL_HDRLEN, rem) {
17389 		bool compatible = false;
17390 
17391 		ret = nl80211_parse_nan_channel(rdev, channel, info,
17392 						nan_channels, i, false);
17393 		if (ret)
17394 			return ret;
17395 
17396 		/* Verify channel is compatible with at least one local channel */
17397 		for (int j = 0; j < wdev->u.nan.n_channels; j++) {
17398 			if (cfg80211_chandef_compatible(&nan_channels[i].chandef,
17399 							&wdev->u.nan.chandefs[j])) {
17400 				compatible = true;
17401 				break;
17402 			}
17403 		}
17404 		if (!compatible) {
17405 			NL_SET_ERR_MSG_FMT(info->extack,
17406 					   "Channel %d not compatible with any local channel",
17407 					   i);
17408 			return -EINVAL;
17409 		}
17410 		i++;
17411 	}
17412 
17413 	sched.n_channels = n_channels;
17414 	sched.nan_channels = nan_channels;
17415 	sched.peer_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
17416 	sched.seq_id = nla_get_u8_default(info->attrs[NL80211_ATTR_NAN_SEQ_ID], 0);
17417 	sched.committed_dw = nla_get_u16(info->attrs[NL80211_ATTR_NAN_COMMITTED_DW]);
17418 	sched.max_chan_switch =
17419 		nla_get_u16_default(info->attrs[NL80211_ATTR_NAN_MAX_CHAN_SWITCH_TIME], 0);
17420 
17421 	if (info->attrs[NL80211_ATTR_NAN_ULW]) {
17422 		sched.ulw_size = nla_len(info->attrs[NL80211_ATTR_NAN_ULW]);
17423 		sched.init_ulw = nla_data(info->attrs[NL80211_ATTR_NAN_ULW]);
17424 	}
17425 
17426 	/* Initialize all maps as invalid */
17427 	for (int j = 0; j < ARRAY_SIZE(sched.maps); j++)
17428 		sched.maps[j].map_id = CFG80211_NAN_INVALID_MAP_ID;
17429 
17430 	if (info->attrs[NL80211_ATTR_NAN_PEER_MAPS]) {
17431 		/* Parse each map */
17432 		nla_for_each_nested(map_attr, info->attrs[NL80211_ATTR_NAN_PEER_MAPS],
17433 				    rem) {
17434 			if (n_maps >= ARRAY_SIZE(sched.maps)) {
17435 				NL_SET_ERR_MSG(info->extack, "Too many peer maps");
17436 				return -EINVAL;
17437 			}
17438 
17439 			ret = nl80211_parse_nan_peer_map(info, map_attr,
17440 							 &sched.maps[n_maps],
17441 							 n_channels);
17442 			if (ret)
17443 				return ret;
17444 
17445 			/* Validate against previous maps */
17446 			for (int j = 0; j < n_maps; j++) {
17447 				ret = nl80211_nan_validate_map_pair(&rdev->wiphy, info,
17448 								    &sched.maps[j],
17449 								    &sched.maps[n_maps],
17450 								    nan_channels);
17451 				if (ret)
17452 					return ret;
17453 			}
17454 
17455 			n_maps++;
17456 		}
17457 	}
17458 
17459 	/* Verify each channel is scheduled at least once */
17460 	for (int ch = 0; ch < n_channels; ch++) {
17461 		bool scheduled = false;
17462 
17463 		for (int m = 0; m < n_maps && !scheduled; m++) {
17464 			for (int s = 0; s < ARRAY_SIZE(sched.maps[m].schedule); s++) {
17465 				if (sched.maps[m].schedule[s] == ch) {
17466 					scheduled = true;
17467 					break;
17468 				}
17469 			}
17470 		}
17471 		if (!scheduled) {
17472 			NL_SET_ERR_MSG_FMT(info->extack,
17473 					   "Channel %d is not scheduled in any map",
17474 					   ch);
17475 			return -EINVAL;
17476 		}
17477 	}
17478 
17479 	return rdev_nan_set_peer_sched(rdev, wdev, &sched);
17480 }
17481 
17482 static bool nl80211_nan_is_sched_empty(struct cfg80211_nan_local_sched *sched)
17483 {
17484 	if (!sched->n_channels)
17485 		return true;
17486 
17487 	for (int i = 0; i < ARRAY_SIZE(sched->schedule); i++) {
17488 		if (sched->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT)
17489 			return false;
17490 	}
17491 
17492 	return true;
17493 }
17494 
17495 static int nl80211_nan_set_local_sched(struct sk_buff *skb,
17496 				       struct genl_info *info)
17497 {
17498 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
17499 	struct cfg80211_nan_local_sched *sched __free(kfree) = NULL;
17500 	struct wireless_dev *wdev = info->user_ptr[1];
17501 	int rem, i = 0, n_channels = 0, ret;
17502 	struct nlattr *channel;
17503 	bool sched_empty;
17504 
17505 	if (wdev->iftype != NL80211_IFTYPE_NAN)
17506 		return -EOPNOTSUPP;
17507 
17508 	if (!wdev_running(wdev))
17509 		return -ENOTCONN;
17510 
17511 	if (!info->attrs[NL80211_ATTR_NAN_TIME_SLOTS])
17512 		return -EINVAL;
17513 
17514 	/* First count how many channel attributes we got */
17515 	nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL,
17516 				 info->nlhdr, GENL_HDRLEN, rem)
17517 		n_channels++;
17518 
17519 	sched = kzalloc(struct_size(sched, nan_channels, n_channels),
17520 			GFP_KERNEL);
17521 	if (!sched)
17522 		return -ENOMEM;
17523 
17524 	sched->n_channels = n_channels;
17525 
17526 	nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL,
17527 				 info->nlhdr, GENL_HDRLEN, rem) {
17528 		ret = nl80211_parse_nan_channel(rdev, channel, info,
17529 						sched->nan_channels, i, true);
17530 
17531 		if (ret)
17532 			return ret;
17533 		i++;
17534 	}
17535 
17536 	/* Parse and validate schedule */
17537 	ret = nl80211_parse_nan_schedule(info,
17538 					 info->attrs[NL80211_ATTR_NAN_TIME_SLOTS],
17539 					 sched->schedule, sched->n_channels);
17540 	if (ret)
17541 		return ret;
17542 
17543 	sched_empty = nl80211_nan_is_sched_empty(sched);
17544 
17545 	sched->deferred =
17546 		nla_get_flag(info->attrs[NL80211_ATTR_NAN_SCHED_DEFERRED]);
17547 
17548 	if (sched_empty) {
17549 		if (sched->deferred) {
17550 			NL_SET_ERR_MSG(info->extack,
17551 				       "Schedule cannot be deferred if all time slots are unavailable");
17552 			return -EINVAL;
17553 		}
17554 
17555 		if (info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]) {
17556 			NL_SET_ERR_MSG(info->extack,
17557 				       "NAN Availability blob must be empty if all time slots are unavailable");
17558 			return -EINVAL;
17559 		}
17560 	} else {
17561 		if (!info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]) {
17562 			NL_SET_ERR_MSG(info->extack,
17563 				       "NAN Availability blob attribute is required");
17564 			return -EINVAL;
17565 		}
17566 
17567 		sched->nan_avail_blob =
17568 			nla_data(info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]);
17569 		sched->nan_avail_blob_len =
17570 			nla_len(info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]);
17571 	}
17572 
17573 	return cfg80211_nan_set_local_schedule(rdev, wdev, sched);
17574 }
17575 
17576 static int nl80211_get_protocol_features(struct sk_buff *skb,
17577 					 struct genl_info *info)
17578 {
17579 	void *hdr;
17580 	struct sk_buff *msg;
17581 
17582 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
17583 	if (!msg)
17584 		return -ENOMEM;
17585 
17586 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
17587 			     NL80211_CMD_GET_PROTOCOL_FEATURES);
17588 	if (!hdr)
17589 		goto nla_put_failure;
17590 
17591 	if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES,
17592 			NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP))
17593 		goto nla_put_failure;
17594 
17595 	genlmsg_end(msg, hdr);
17596 	return genlmsg_reply(msg, info);
17597 
17598  nla_put_failure:
17599 	kfree_skb(msg);
17600 	return -ENOBUFS;
17601 }
17602 
17603 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info)
17604 {
17605 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
17606 	struct cfg80211_update_ft_ies_params ft_params;
17607 	struct net_device *dev = info->user_ptr[1];
17608 
17609 	if (!rdev->ops->update_ft_ies)
17610 		return -EOPNOTSUPP;
17611 
17612 	if (!info->attrs[NL80211_ATTR_MDID] ||
17613 	    !info->attrs[NL80211_ATTR_IE])
17614 		return -EINVAL;
17615 
17616 	memset(&ft_params, 0, sizeof(ft_params));
17617 	ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]);
17618 	ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
17619 	ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
17620 
17621 	return rdev_update_ft_ies(rdev, dev, &ft_params);
17622 }
17623 
17624 static int nl80211_crit_protocol_start(struct sk_buff *skb,
17625 				       struct genl_info *info)
17626 {
17627 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
17628 	struct wireless_dev *wdev = info->user_ptr[1];
17629 	enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC;
17630 	u16 duration;
17631 	int ret;
17632 
17633 	if (!rdev->ops->crit_proto_start)
17634 		return -EOPNOTSUPP;
17635 
17636 	if (WARN_ON(!rdev->ops->crit_proto_stop))
17637 		return -EINVAL;
17638 
17639 	if (rdev->crit_proto_nlportid)
17640 		return -EBUSY;
17641 
17642 	/* determine protocol if provided */
17643 	if (info->attrs[NL80211_ATTR_CRIT_PROT_ID])
17644 		proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]);
17645 
17646 	if (proto >= NUM_NL80211_CRIT_PROTO)
17647 		return -EINVAL;
17648 
17649 	/* timeout must be provided */
17650 	if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION])
17651 		return -EINVAL;
17652 
17653 	duration =
17654 		nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
17655 
17656 	ret = rdev_crit_proto_start(rdev, wdev, proto, duration);
17657 	if (!ret)
17658 		rdev->crit_proto_nlportid = info->snd_portid;
17659 
17660 	return ret;
17661 }
17662 
17663 static int nl80211_crit_protocol_stop(struct sk_buff *skb,
17664 				      struct genl_info *info)
17665 {
17666 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
17667 	struct wireless_dev *wdev = info->user_ptr[1];
17668 
17669 	if (!rdev->ops->crit_proto_stop)
17670 		return -EOPNOTSUPP;
17671 
17672 	if (rdev->crit_proto_nlportid) {
17673 		rdev->crit_proto_nlportid = 0;
17674 		rdev_crit_proto_stop(rdev, wdev);
17675 	}
17676 	return 0;
17677 }
17678 
17679 static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd,
17680 				       struct nlattr *attr,
17681 				       struct netlink_ext_ack *extack)
17682 {
17683 	if (vcmd->policy == VENDOR_CMD_RAW_DATA) {
17684 		if (attr->nla_type & NLA_F_NESTED) {
17685 			NL_SET_ERR_MSG_ATTR(extack, attr,
17686 					    "unexpected nested data");
17687 			return -EINVAL;
17688 		}
17689 
17690 		return 0;
17691 	}
17692 
17693 	if (!(attr->nla_type & NLA_F_NESTED)) {
17694 		NL_SET_ERR_MSG_ATTR(extack, attr, "expected nested data");
17695 		return -EINVAL;
17696 	}
17697 
17698 	return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack);
17699 }
17700 
17701 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
17702 {
17703 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
17704 	struct wireless_dev *wdev =
17705 		__cfg80211_wdev_from_attrs(rdev, genl_info_net(info),
17706 					   info->attrs);
17707 	int i, err;
17708 	u32 vid, subcmd;
17709 
17710 	if (!rdev->wiphy.vendor_commands)
17711 		return -EOPNOTSUPP;
17712 
17713 	if (IS_ERR(wdev)) {
17714 		err = PTR_ERR(wdev);
17715 		if (err != -EINVAL)
17716 			return err;
17717 		wdev = NULL;
17718 	} else if (wdev->wiphy != &rdev->wiphy) {
17719 		return -EINVAL;
17720 	}
17721 
17722 	if (!info->attrs[NL80211_ATTR_VENDOR_ID] ||
17723 	    !info->attrs[NL80211_ATTR_VENDOR_SUBCMD])
17724 		return -EINVAL;
17725 
17726 	vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]);
17727 	subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]);
17728 	for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
17729 		const struct wiphy_vendor_command *vcmd;
17730 		void *data = NULL;
17731 		int len = 0;
17732 
17733 		vcmd = &rdev->wiphy.vendor_commands[i];
17734 
17735 		if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
17736 			continue;
17737 
17738 		if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
17739 				   WIPHY_VENDOR_CMD_NEED_NETDEV)) {
17740 			if (!wdev)
17741 				return -EINVAL;
17742 			if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
17743 			    !wdev->netdev)
17744 				return -EINVAL;
17745 
17746 			if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
17747 				if (!wdev_running(wdev))
17748 					return -ENETDOWN;
17749 			}
17750 		} else {
17751 			wdev = NULL;
17752 		}
17753 
17754 		if (!vcmd->doit)
17755 			return -EOPNOTSUPP;
17756 
17757 		if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
17758 			data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
17759 			len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
17760 
17761 			err = nl80211_vendor_check_policy(vcmd,
17762 					info->attrs[NL80211_ATTR_VENDOR_DATA],
17763 					info->extack);
17764 			if (err)
17765 				return err;
17766 		}
17767 
17768 		rdev->cur_cmd_info = info;
17769 		err = vcmd->doit(&rdev->wiphy, wdev, data, len);
17770 		rdev->cur_cmd_info = NULL;
17771 		return err;
17772 	}
17773 
17774 	return -EOPNOTSUPP;
17775 }
17776 
17777 static int nl80211_prepare_vendor_dump(struct sk_buff *skb,
17778 				       struct netlink_callback *cb,
17779 				       struct cfg80211_registered_device **rdev,
17780 				       struct wireless_dev **wdev)
17781 {
17782 	struct nlattr **attrbuf;
17783 	u32 vid, subcmd;
17784 	unsigned int i;
17785 	int vcmd_idx = -1;
17786 	int err;
17787 	void *data = NULL;
17788 	unsigned int data_len = 0;
17789 
17790 	if (cb->args[0]) {
17791 		/* subtract the 1 again here */
17792 		struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
17793 		struct wireless_dev *tmp;
17794 
17795 		if (!wiphy)
17796 			return -ENODEV;
17797 
17798 		/*
17799 		 * The wiphy may have moved netns between dumpit
17800 		 * invocations (via NL80211_CMD_SET_WIPHY_NETNS), so
17801 		 * re-check that it still matches the caller's netns.
17802 		 */
17803 		if (!net_eq(wiphy_net(wiphy), sock_net(skb->sk)))
17804 			return -ENODEV;
17805 
17806 		*rdev = wiphy_to_rdev(wiphy);
17807 		*wdev = NULL;
17808 
17809 		if (cb->args[1]) {
17810 			list_for_each_entry(tmp, &wiphy->wdev_list, list) {
17811 				if (tmp->identifier == cb->args[1] - 1) {
17812 					*wdev = tmp;
17813 					break;
17814 				}
17815 			}
17816 		}
17817 
17818 		/* keep rtnl locked in successful case */
17819 		return 0;
17820 	}
17821 
17822 	attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR);
17823 	if (!attrbuf)
17824 		return -ENOMEM;
17825 
17826 	err = nlmsg_parse_deprecated(cb->nlh,
17827 				     GENL_HDRLEN + nl80211_fam.hdrsize,
17828 				     attrbuf, nl80211_fam.maxattr,
17829 				     nl80211_policy, NULL);
17830 	if (err)
17831 		goto out;
17832 
17833 	if (!attrbuf[NL80211_ATTR_VENDOR_ID] ||
17834 	    !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) {
17835 		err = -EINVAL;
17836 		goto out;
17837 	}
17838 
17839 	*wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf);
17840 	if (IS_ERR(*wdev))
17841 		*wdev = NULL;
17842 
17843 	*rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
17844 	if (IS_ERR(*rdev)) {
17845 		err = PTR_ERR(*rdev);
17846 		goto out;
17847 	}
17848 
17849 	vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]);
17850 	subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
17851 
17852 	for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) {
17853 		const struct wiphy_vendor_command *vcmd;
17854 
17855 		vcmd = &(*rdev)->wiphy.vendor_commands[i];
17856 
17857 		if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
17858 			continue;
17859 
17860 		if (!vcmd->dumpit) {
17861 			err = -EOPNOTSUPP;
17862 			goto out;
17863 		}
17864 
17865 		vcmd_idx = i;
17866 		break;
17867 	}
17868 
17869 	if (vcmd_idx < 0) {
17870 		err = -EOPNOTSUPP;
17871 		goto out;
17872 	}
17873 
17874 	if (attrbuf[NL80211_ATTR_VENDOR_DATA]) {
17875 		data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]);
17876 		data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]);
17877 
17878 		err = nl80211_vendor_check_policy(
17879 				&(*rdev)->wiphy.vendor_commands[vcmd_idx],
17880 				attrbuf[NL80211_ATTR_VENDOR_DATA],
17881 				cb->extack);
17882 		if (err)
17883 			goto out;
17884 	}
17885 
17886 	/* 0 is the first index - add 1 to parse only once */
17887 	cb->args[0] = (*rdev)->wiphy_idx + 1;
17888 	/* add 1 to know if it was NULL */
17889 	cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0;
17890 	cb->args[2] = vcmd_idx;
17891 	cb->args[3] = (unsigned long)data;
17892 	cb->args[4] = data_len;
17893 
17894 	/* keep rtnl locked in successful case */
17895 	err = 0;
17896 out:
17897 	kfree(attrbuf);
17898 	return err;
17899 }
17900 
17901 static int nl80211_vendor_cmd_dump(struct sk_buff *skb,
17902 				   struct netlink_callback *cb)
17903 {
17904 	struct cfg80211_registered_device *rdev;
17905 	struct wireless_dev *wdev;
17906 	unsigned int vcmd_idx;
17907 	const struct wiphy_vendor_command *vcmd;
17908 	void *data;
17909 	int data_len;
17910 	int err;
17911 	struct nlattr *vendor_data;
17912 
17913 	rtnl_lock();
17914 	err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev);
17915 	if (err)
17916 		goto out;
17917 
17918 	vcmd_idx = cb->args[2];
17919 	data = (void *)cb->args[3];
17920 	data_len = cb->args[4];
17921 	vcmd = &rdev->wiphy.vendor_commands[vcmd_idx];
17922 
17923 	if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
17924 			   WIPHY_VENDOR_CMD_NEED_NETDEV)) {
17925 		if (!wdev) {
17926 			err = -EINVAL;
17927 			goto out;
17928 		}
17929 		if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
17930 		    !wdev->netdev) {
17931 			err = -EINVAL;
17932 			goto out;
17933 		}
17934 
17935 		if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
17936 			if (!wdev_running(wdev)) {
17937 				err = -ENETDOWN;
17938 				goto out;
17939 			}
17940 		}
17941 	}
17942 
17943 	while (1) {
17944 		void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
17945 					   cb->nlh->nlmsg_seq, NLM_F_MULTI,
17946 					   NL80211_CMD_VENDOR);
17947 		if (!hdr)
17948 			break;
17949 
17950 		if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
17951 		    (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
17952 					       wdev_id(wdev),
17953 					       NL80211_ATTR_PAD))) {
17954 			genlmsg_cancel(skb, hdr);
17955 			break;
17956 		}
17957 
17958 		vendor_data = nla_nest_start_noflag(skb,
17959 						    NL80211_ATTR_VENDOR_DATA);
17960 		if (!vendor_data) {
17961 			genlmsg_cancel(skb, hdr);
17962 			break;
17963 		}
17964 
17965 		err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len,
17966 				   (unsigned long *)&cb->args[5]);
17967 		nla_nest_end(skb, vendor_data);
17968 
17969 		if (err == -ENOBUFS || err == -ENOENT) {
17970 			genlmsg_cancel(skb, hdr);
17971 			break;
17972 		} else if (err <= 0) {
17973 			genlmsg_cancel(skb, hdr);
17974 			goto out;
17975 		}
17976 
17977 		genlmsg_end(skb, hdr);
17978 	}
17979 
17980 	err = skb->len;
17981  out:
17982 	rtnl_unlock();
17983 	return err;
17984 }
17985 
17986 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
17987 					   enum nl80211_commands cmd,
17988 					   enum nl80211_attrs attr,
17989 					   int approxlen)
17990 {
17991 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
17992 
17993 	if (WARN_ON(!rdev->cur_cmd_info))
17994 		return NULL;
17995 
17996 	return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen,
17997 					   rdev->cur_cmd_info->snd_portid,
17998 					   rdev->cur_cmd_info->snd_seq,
17999 					   cmd, attr, NULL, GFP_KERNEL);
18000 }
18001 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb);
18002 
18003 int cfg80211_vendor_cmd_reply(struct sk_buff *skb)
18004 {
18005 	struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
18006 	void *hdr = ((void **)skb->cb)[1];
18007 	struct nlattr *data = ((void **)skb->cb)[2];
18008 
18009 	/* clear CB data for netlink core to own from now on */
18010 	memset(skb->cb, 0, sizeof(skb->cb));
18011 
18012 	if (WARN_ON(!rdev->cur_cmd_info)) {
18013 		kfree_skb(skb);
18014 		return -EINVAL;
18015 	}
18016 
18017 	nla_nest_end(skb, data);
18018 	genlmsg_end(skb, hdr);
18019 	return genlmsg_reply(skb, rdev->cur_cmd_info);
18020 }
18021 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply);
18022 
18023 unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy)
18024 {
18025 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
18026 
18027 	if (WARN_ON(!rdev->cur_cmd_info))
18028 		return 0;
18029 
18030 	return rdev->cur_cmd_info->snd_portid;
18031 }
18032 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_get_sender);
18033 
18034 static int nl80211_set_qos_map(struct sk_buff *skb,
18035 			       struct genl_info *info)
18036 {
18037 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18038 	struct cfg80211_qos_map *qos_map = NULL;
18039 	struct net_device *dev = info->user_ptr[1];
18040 	u8 *pos, len, num_des, des_len, des;
18041 	int ret;
18042 
18043 	if (!rdev->ops->set_qos_map)
18044 		return -EOPNOTSUPP;
18045 
18046 	if (info->attrs[NL80211_ATTR_QOS_MAP]) {
18047 		pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]);
18048 		len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]);
18049 
18050 		if (len % 2)
18051 			return -EINVAL;
18052 
18053 		qos_map = kzalloc_obj(struct cfg80211_qos_map);
18054 		if (!qos_map)
18055 			return -ENOMEM;
18056 
18057 		num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1;
18058 		if (num_des) {
18059 			des_len = num_des *
18060 				sizeof(struct cfg80211_dscp_exception);
18061 			memcpy(qos_map->dscp_exception, pos, des_len);
18062 			qos_map->num_des = num_des;
18063 			for (des = 0; des < num_des; des++) {
18064 				if (qos_map->dscp_exception[des].up > 7) {
18065 					kfree(qos_map);
18066 					return -EINVAL;
18067 				}
18068 			}
18069 			pos += des_len;
18070 		}
18071 		memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN);
18072 	}
18073 
18074 	ret = nl80211_key_allowed(dev->ieee80211_ptr);
18075 	if (!ret)
18076 		ret = rdev_set_qos_map(rdev, dev, qos_map);
18077 
18078 	kfree(qos_map);
18079 	return ret;
18080 }
18081 
18082 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info)
18083 {
18084 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18085 	struct net_device *dev = info->user_ptr[1];
18086 	struct wireless_dev *wdev = dev->ieee80211_ptr;
18087 	const u8 *peer;
18088 	u8 tsid, up;
18089 	u16 admitted_time = 0;
18090 
18091 	if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION))
18092 		return -EOPNOTSUPP;
18093 
18094 	if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] ||
18095 	    !info->attrs[NL80211_ATTR_USER_PRIO])
18096 		return -EINVAL;
18097 
18098 	tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
18099 	up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]);
18100 
18101 	/* WMM uses TIDs 0-7 even for TSPEC */
18102 	if (tsid >= IEEE80211_FIRST_TSPEC_TSID) {
18103 		/* TODO: handle 802.11 TSPEC/admission control
18104 		 * need more attributes for that (e.g. BA session requirement);
18105 		 * change the WMM admission test above to allow both then
18106 		 */
18107 		return -EINVAL;
18108 	}
18109 
18110 	peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
18111 
18112 	if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) {
18113 		admitted_time =
18114 			nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]);
18115 		if (!admitted_time)
18116 			return -EINVAL;
18117 	}
18118 
18119 	switch (wdev->iftype) {
18120 	case NL80211_IFTYPE_STATION:
18121 	case NL80211_IFTYPE_P2P_CLIENT:
18122 		if (wdev->connected)
18123 			break;
18124 		return -ENOTCONN;
18125 	default:
18126 		return -EOPNOTSUPP;
18127 	}
18128 
18129 	return rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time);
18130 }
18131 
18132 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info)
18133 {
18134 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18135 	struct net_device *dev = info->user_ptr[1];
18136 	const u8 *peer;
18137 	u8 tsid;
18138 
18139 	if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC])
18140 		return -EINVAL;
18141 
18142 	tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
18143 	peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
18144 
18145 	return rdev_del_tx_ts(rdev, dev, tsid, peer);
18146 }
18147 
18148 static int nl80211_tdls_channel_switch(struct sk_buff *skb,
18149 				       struct genl_info *info)
18150 {
18151 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18152 	struct net_device *dev = info->user_ptr[1];
18153 	struct wireless_dev *wdev = dev->ieee80211_ptr;
18154 	struct cfg80211_chan_def chandef = {};
18155 	const u8 *addr;
18156 	u8 oper_class;
18157 	int err;
18158 
18159 	if (!rdev->ops->tdls_channel_switch ||
18160 	    !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
18161 		return -EOPNOTSUPP;
18162 
18163 	switch (dev->ieee80211_ptr->iftype) {
18164 	case NL80211_IFTYPE_STATION:
18165 	case NL80211_IFTYPE_P2P_CLIENT:
18166 		break;
18167 	default:
18168 		return -EOPNOTSUPP;
18169 	}
18170 
18171 	if (!info->attrs[NL80211_ATTR_MAC] ||
18172 	    !info->attrs[NL80211_ATTR_OPER_CLASS])
18173 		return -EINVAL;
18174 
18175 	err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef,
18176 				    false);
18177 	if (err)
18178 		return err;
18179 
18180 	/*
18181 	 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012
18182 	 * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the
18183 	 * specification is not defined for them.
18184 	 */
18185 	if (chandef.chan->band == NL80211_BAND_2GHZ &&
18186 	    chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
18187 	    chandef.width != NL80211_CHAN_WIDTH_20)
18188 		return -EINVAL;
18189 
18190 	/* we will be active on the TDLS link */
18191 	if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
18192 					   wdev->iftype))
18193 		return -EINVAL;
18194 
18195 	/* don't allow switching to DFS channels */
18196 	if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype))
18197 		return -EINVAL;
18198 
18199 	addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
18200 	oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]);
18201 
18202 	return rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef);
18203 }
18204 
18205 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb,
18206 					      struct genl_info *info)
18207 {
18208 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18209 	struct net_device *dev = info->user_ptr[1];
18210 	const u8 *addr;
18211 
18212 	if (!rdev->ops->tdls_channel_switch ||
18213 	    !rdev->ops->tdls_cancel_channel_switch ||
18214 	    !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
18215 		return -EOPNOTSUPP;
18216 
18217 	switch (dev->ieee80211_ptr->iftype) {
18218 	case NL80211_IFTYPE_STATION:
18219 	case NL80211_IFTYPE_P2P_CLIENT:
18220 		break;
18221 	default:
18222 		return -EOPNOTSUPP;
18223 	}
18224 
18225 	if (!info->attrs[NL80211_ATTR_MAC])
18226 		return -EINVAL;
18227 
18228 	addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
18229 
18230 	rdev_tdls_cancel_channel_switch(rdev, dev, addr);
18231 
18232 	return 0;
18233 }
18234 
18235 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb,
18236 					    struct genl_info *info)
18237 {
18238 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18239 	struct net_device *dev = info->user_ptr[1];
18240 	struct wireless_dev *wdev = dev->ieee80211_ptr;
18241 	const struct nlattr *nla;
18242 	bool enabled;
18243 
18244 	if (!rdev->ops->set_multicast_to_unicast)
18245 		return -EOPNOTSUPP;
18246 
18247 	if (wdev->iftype != NL80211_IFTYPE_AP &&
18248 	    wdev->iftype != NL80211_IFTYPE_P2P_GO)
18249 		return -EOPNOTSUPP;
18250 
18251 	nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED];
18252 	enabled = nla_get_flag(nla);
18253 
18254 	return rdev_set_multicast_to_unicast(rdev, dev, enabled);
18255 }
18256 
18257 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info)
18258 {
18259 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18260 	struct net_device *dev = info->user_ptr[1];
18261 	struct wireless_dev *wdev = dev->ieee80211_ptr;
18262 	struct cfg80211_pmk_conf pmk_conf = {};
18263 
18264 	if (wdev->iftype != NL80211_IFTYPE_STATION &&
18265 	    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
18266 		return -EOPNOTSUPP;
18267 
18268 	if (!wiphy_ext_feature_isset(&rdev->wiphy,
18269 				     NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
18270 		return -EOPNOTSUPP;
18271 
18272 	if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK])
18273 		return -EINVAL;
18274 
18275 	if (!wdev->connected)
18276 		return -ENOTCONN;
18277 
18278 	pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
18279 	if (memcmp(pmk_conf.aa, wdev->u.client.connected_addr, ETH_ALEN))
18280 		return -EINVAL;
18281 
18282 	pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
18283 	pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
18284 	if (pmk_conf.pmk_len != WLAN_PMK_LEN &&
18285 	    pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192)
18286 		return -EINVAL;
18287 
18288 	if (info->attrs[NL80211_ATTR_PMKR0_NAME])
18289 		pmk_conf.pmk_r0_name =
18290 			nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]);
18291 
18292 	return rdev_set_pmk(rdev, dev, &pmk_conf);
18293 }
18294 
18295 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info)
18296 {
18297 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18298 	struct net_device *dev = info->user_ptr[1];
18299 	struct wireless_dev *wdev = dev->ieee80211_ptr;
18300 	const u8 *aa;
18301 
18302 	if (wdev->iftype != NL80211_IFTYPE_STATION &&
18303 	    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
18304 		return -EOPNOTSUPP;
18305 
18306 	if (!wiphy_ext_feature_isset(&rdev->wiphy,
18307 				     NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
18308 		return -EOPNOTSUPP;
18309 
18310 	if (!info->attrs[NL80211_ATTR_MAC])
18311 		return -EINVAL;
18312 
18313 	aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
18314 	return rdev_del_pmk(rdev, dev, aa);
18315 }
18316 
18317 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info)
18318 {
18319 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18320 	struct net_device *dev = info->user_ptr[1];
18321 	struct cfg80211_external_auth_params params;
18322 
18323 	if (!rdev->ops->external_auth)
18324 		return -EOPNOTSUPP;
18325 
18326 	if (!info->attrs[NL80211_ATTR_SSID] &&
18327 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
18328 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
18329 		return -EINVAL;
18330 
18331 	if (!info->attrs[NL80211_ATTR_BSSID])
18332 		return -EINVAL;
18333 
18334 	if (!info->attrs[NL80211_ATTR_STATUS_CODE])
18335 		return -EINVAL;
18336 
18337 	memset(&params, 0, sizeof(params));
18338 
18339 	if (info->attrs[NL80211_ATTR_SSID]) {
18340 		params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
18341 		if (params.ssid.ssid_len == 0)
18342 			return -EINVAL;
18343 		memcpy(params.ssid.ssid,
18344 		       nla_data(info->attrs[NL80211_ATTR_SSID]),
18345 		       params.ssid.ssid_len);
18346 	}
18347 
18348 	memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]),
18349 	       ETH_ALEN);
18350 
18351 	params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
18352 
18353 	if (info->attrs[NL80211_ATTR_PMKID])
18354 		params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
18355 
18356 	return rdev_external_auth(rdev, dev, &params);
18357 }
18358 
18359 static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info)
18360 {
18361 	bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK];
18362 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18363 	struct net_device *dev = info->user_ptr[1];
18364 	struct wireless_dev *wdev = dev->ieee80211_ptr;
18365 	const u8 *buf;
18366 	size_t len;
18367 	u8 *dest;
18368 	u16 proto;
18369 	bool noencrypt;
18370 	u64 cookie = 0;
18371 	int link_id;
18372 	int err;
18373 
18374 	if (!wiphy_ext_feature_isset(&rdev->wiphy,
18375 				     NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211))
18376 		return -EOPNOTSUPP;
18377 
18378 	if (!rdev->ops->tx_control_port)
18379 		return -EOPNOTSUPP;
18380 
18381 	if (!info->attrs[NL80211_ATTR_FRAME] ||
18382 	    !info->attrs[NL80211_ATTR_MAC] ||
18383 	    !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
18384 		GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing");
18385 		return -EINVAL;
18386 	}
18387 
18388 	switch (wdev->iftype) {
18389 	case NL80211_IFTYPE_AP:
18390 	case NL80211_IFTYPE_P2P_GO:
18391 	case NL80211_IFTYPE_MESH_POINT:
18392 		break;
18393 	case NL80211_IFTYPE_ADHOC:
18394 		if (wdev->u.ibss.current_bss)
18395 			break;
18396 		return -ENOTCONN;
18397 	case NL80211_IFTYPE_STATION:
18398 	case NL80211_IFTYPE_P2P_CLIENT:
18399 		if (wdev->connected)
18400 			break;
18401 		return -ENOTCONN;
18402 	default:
18403 		return -EOPNOTSUPP;
18404 	}
18405 
18406 	buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
18407 	len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
18408 	dest = nla_data(info->attrs[NL80211_ATTR_MAC]);
18409 	proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
18410 	noencrypt =
18411 		nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]);
18412 
18413 	link_id = nl80211_link_id_or_invalid(info->attrs);
18414 
18415 	err = rdev_tx_control_port(rdev, dev, buf, len,
18416 				   dest, cpu_to_be16(proto), noencrypt, link_id,
18417 				   dont_wait_for_ack ? NULL : &cookie);
18418 	if (!err && !dont_wait_for_ack)
18419 		nl_set_extack_cookie_u64(info->extack, cookie);
18420 	return err;
18421 }
18422 
18423 static int nl80211_get_ftm_responder_stats(struct sk_buff *skb,
18424 					   struct genl_info *info)
18425 {
18426 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18427 	struct net_device *dev = info->user_ptr[1];
18428 	struct wireless_dev *wdev = dev->ieee80211_ptr;
18429 	struct cfg80211_ftm_responder_stats ftm_stats = {};
18430 	unsigned int link_id = nl80211_link_id(info->attrs);
18431 	struct sk_buff *msg;
18432 	void *hdr;
18433 	struct nlattr *ftm_stats_attr;
18434 	int err;
18435 
18436 	if (wdev->iftype != NL80211_IFTYPE_AP ||
18437 	    !wdev->links[link_id].ap.beacon_interval)
18438 		return -EOPNOTSUPP;
18439 
18440 	err = rdev_get_ftm_responder_stats(rdev, dev, &ftm_stats);
18441 	if (err)
18442 		return err;
18443 
18444 	if (!ftm_stats.filled)
18445 		return -ENODATA;
18446 
18447 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
18448 	if (!msg)
18449 		return -ENOMEM;
18450 
18451 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
18452 			     NL80211_CMD_GET_FTM_RESPONDER_STATS);
18453 	if (!hdr)
18454 		goto nla_put_failure;
18455 
18456 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
18457 		goto nla_put_failure;
18458 
18459 	ftm_stats_attr = nla_nest_start_noflag(msg,
18460 					       NL80211_ATTR_FTM_RESPONDER_STATS);
18461 	if (!ftm_stats_attr)
18462 		goto nla_put_failure;
18463 
18464 #define SET_FTM(field, name, type)					 \
18465 	do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \
18466 	    nla_put_ ## type(msg, NL80211_FTM_STATS_ ## name,		 \
18467 			     ftm_stats.field))				 \
18468 		goto nla_put_failure; } while (0)
18469 #define SET_FTM_U64(field, name)					 \
18470 	do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \
18471 	    nla_put_u64_64bit(msg, NL80211_FTM_STATS_ ## name,		 \
18472 			      ftm_stats.field, NL80211_FTM_STATS_PAD))	 \
18473 		goto nla_put_failure; } while (0)
18474 
18475 	SET_FTM(success_num, SUCCESS_NUM, u32);
18476 	SET_FTM(partial_num, PARTIAL_NUM, u32);
18477 	SET_FTM(failed_num, FAILED_NUM, u32);
18478 	SET_FTM(asap_num, ASAP_NUM, u32);
18479 	SET_FTM(non_asap_num, NON_ASAP_NUM, u32);
18480 	SET_FTM_U64(total_duration_ms, TOTAL_DURATION_MSEC);
18481 	SET_FTM(unknown_triggers_num, UNKNOWN_TRIGGERS_NUM, u32);
18482 	SET_FTM(reschedule_requests_num, RESCHEDULE_REQUESTS_NUM, u32);
18483 	SET_FTM(out_of_window_triggers_num, OUT_OF_WINDOW_TRIGGERS_NUM, u32);
18484 #undef SET_FTM
18485 
18486 	nla_nest_end(msg, ftm_stats_attr);
18487 
18488 	genlmsg_end(msg, hdr);
18489 	return genlmsg_reply(msg, info);
18490 
18491 nla_put_failure:
18492 	nlmsg_free(msg);
18493 	return -ENOBUFS;
18494 }
18495 
18496 static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info)
18497 {
18498 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18499 	struct cfg80211_update_owe_info owe_info;
18500 	struct net_device *dev = info->user_ptr[1];
18501 
18502 	if (!rdev->ops->update_owe_info)
18503 		return -EOPNOTSUPP;
18504 
18505 	if (!info->attrs[NL80211_ATTR_STATUS_CODE] ||
18506 	    !info->attrs[NL80211_ATTR_MAC])
18507 		return -EINVAL;
18508 
18509 	memset(&owe_info, 0, sizeof(owe_info));
18510 	owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
18511 	nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN);
18512 
18513 	if (info->attrs[NL80211_ATTR_IE]) {
18514 		owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
18515 		owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
18516 	}
18517 
18518 	return rdev_update_owe_info(rdev, dev, &owe_info);
18519 }
18520 
18521 static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info)
18522 {
18523 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18524 	struct net_device *dev = info->user_ptr[1];
18525 	struct wireless_dev *wdev = dev->ieee80211_ptr;
18526 	struct station_info sinfo = {};
18527 	const u8 *buf;
18528 	size_t len;
18529 	u8 *dest;
18530 	int err;
18531 
18532 	if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station)
18533 		return -EOPNOTSUPP;
18534 
18535 	if (!info->attrs[NL80211_ATTR_MAC] ||
18536 	    !info->attrs[NL80211_ATTR_FRAME]) {
18537 		GENL_SET_ERR_MSG(info, "Frame or MAC missing");
18538 		return -EINVAL;
18539 	}
18540 
18541 	if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
18542 		return -EOPNOTSUPP;
18543 
18544 	dest = nla_data(info->attrs[NL80211_ATTR_MAC]);
18545 	buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
18546 	len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
18547 
18548 	if (len < sizeof(struct ethhdr))
18549 		return -EINVAL;
18550 
18551 	if (!ether_addr_equal(buf, dest) || is_multicast_ether_addr(buf) ||
18552 	    !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr))
18553 		return -EINVAL;
18554 
18555 	err = rdev_get_station(rdev, wdev, dest, &sinfo);
18556 	if (err)
18557 		return err;
18558 
18559 	cfg80211_sinfo_release_content(&sinfo);
18560 
18561 	return rdev_probe_mesh_link(rdev, dev, dest, buf, len);
18562 }
18563 
18564 static int parse_tid_conf(struct cfg80211_registered_device *rdev,
18565 			  struct nlattr *attrs[], struct net_device *dev,
18566 			  struct cfg80211_tid_cfg *tid_conf,
18567 			  struct genl_info *info, const u8 *peer,
18568 			  unsigned int link_id)
18569 {
18570 	struct netlink_ext_ack *extack = info->extack;
18571 	u64 mask;
18572 	int err;
18573 
18574 	if (!attrs[NL80211_TID_CONFIG_ATTR_TIDS])
18575 		return -EINVAL;
18576 
18577 	tid_conf->config_override =
18578 			nla_get_flag(attrs[NL80211_TID_CONFIG_ATTR_OVERRIDE]);
18579 	tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]);
18580 
18581 	if (tid_conf->config_override) {
18582 		if (rdev->ops->reset_tid_config) {
18583 			err = rdev_reset_tid_config(rdev, dev, peer,
18584 						    tid_conf->tids);
18585 			if (err)
18586 				return err;
18587 		} else {
18588 			return -EINVAL;
18589 		}
18590 	}
18591 
18592 	if (attrs[NL80211_TID_CONFIG_ATTR_NOACK]) {
18593 		tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK);
18594 		tid_conf->noack =
18595 			nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_NOACK]);
18596 	}
18597 
18598 	if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]) {
18599 		tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT);
18600 		tid_conf->retry_short =
18601 			nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]);
18602 
18603 		if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count)
18604 			return -EINVAL;
18605 	}
18606 
18607 	if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]) {
18608 		tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG);
18609 		tid_conf->retry_long =
18610 			nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]);
18611 
18612 		if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count)
18613 			return -EINVAL;
18614 	}
18615 
18616 	if (attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]) {
18617 		tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL);
18618 		tid_conf->ampdu =
18619 			nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]);
18620 	}
18621 
18622 	if (attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]) {
18623 		tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL);
18624 		tid_conf->rtscts =
18625 			nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]);
18626 	}
18627 
18628 	if (attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]) {
18629 		tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL);
18630 		tid_conf->amsdu =
18631 			nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]);
18632 	}
18633 
18634 	if (attrs[NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE]) {
18635 		u32 idx = NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE, attr;
18636 
18637 		tid_conf->txrate_type = nla_get_u8(attrs[idx]);
18638 
18639 		if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) {
18640 			attr = NL80211_TID_CONFIG_ATTR_TX_RATE;
18641 			err = nl80211_parse_tx_bitrate_mask(info, attrs, attr,
18642 						    &tid_conf->txrate_mask, dev,
18643 						    true, link_id);
18644 			if (err)
18645 				return err;
18646 
18647 			tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE);
18648 		}
18649 		tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE);
18650 	}
18651 
18652 	if (peer)
18653 		mask = rdev->wiphy.tid_config_support.peer;
18654 	else
18655 		mask = rdev->wiphy.tid_config_support.vif;
18656 
18657 	if (tid_conf->mask & ~mask) {
18658 		NL_SET_ERR_MSG(extack, "unsupported TID configuration");
18659 		return -EOPNOTSUPP;
18660 	}
18661 
18662 	return 0;
18663 }
18664 
18665 static int nl80211_set_tid_config(struct sk_buff *skb,
18666 				  struct genl_info *info)
18667 {
18668 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18669 	struct nlattr *attrs[NL80211_TID_CONFIG_ATTR_MAX + 1];
18670 	unsigned int link_id = nl80211_link_id(info->attrs);
18671 	struct net_device *dev = info->user_ptr[1];
18672 	struct cfg80211_tid_config *tid_config;
18673 	struct nlattr *tid;
18674 	int conf_idx = 0, rem_conf;
18675 	int ret = -EINVAL;
18676 	u32 num_conf = 0;
18677 
18678 	if (!info->attrs[NL80211_ATTR_TID_CONFIG])
18679 		return -EINVAL;
18680 
18681 	if (!rdev->ops->set_tid_config)
18682 		return -EOPNOTSUPP;
18683 
18684 	nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG],
18685 			    rem_conf)
18686 		num_conf++;
18687 
18688 	tid_config = kzalloc_flex(*tid_config, tid_conf, num_conf);
18689 	if (!tid_config)
18690 		return -ENOMEM;
18691 
18692 	tid_config->n_tid_conf = num_conf;
18693 
18694 	if (info->attrs[NL80211_ATTR_MAC])
18695 		tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
18696 
18697 	nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG],
18698 			    rem_conf) {
18699 		ret = nla_parse_nested(attrs, NL80211_TID_CONFIG_ATTR_MAX,
18700 				       tid, NULL, NULL);
18701 
18702 		if (ret)
18703 			goto bad_tid_conf;
18704 
18705 		ret = parse_tid_conf(rdev, attrs, dev,
18706 				     &tid_config->tid_conf[conf_idx],
18707 				     info, tid_config->peer, link_id);
18708 		if (ret)
18709 			goto bad_tid_conf;
18710 
18711 		conf_idx++;
18712 	}
18713 
18714 	ret = rdev_set_tid_config(rdev, dev, tid_config);
18715 
18716 bad_tid_conf:
18717 	kfree(tid_config);
18718 	return ret;
18719 }
18720 
18721 static int nl80211_color_change(struct sk_buff *skb, struct genl_info *info)
18722 {
18723 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18724 	struct cfg80211_color_change_settings params = {};
18725 	struct net_device *dev = info->user_ptr[1];
18726 	struct wireless_dev *wdev = dev->ieee80211_ptr;
18727 	struct nlattr **tb;
18728 	u16 offset;
18729 	int err;
18730 
18731 	if (!rdev->ops->color_change)
18732 		return -EOPNOTSUPP;
18733 
18734 	if (!wiphy_ext_feature_isset(&rdev->wiphy,
18735 				     NL80211_EXT_FEATURE_BSS_COLOR))
18736 		return -EOPNOTSUPP;
18737 
18738 	if (wdev->iftype != NL80211_IFTYPE_AP)
18739 		return -EOPNOTSUPP;
18740 
18741 	if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] ||
18742 	    !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] ||
18743 	    !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS])
18744 		return -EINVAL;
18745 
18746 	params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]);
18747 	params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]);
18748 
18749 	params.link_id = nl80211_link_id(info->attrs);
18750 	if (!wdev->links[params.link_id].ap.beacon_interval)
18751 		return -EINVAL;
18752 
18753 	err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_next,
18754 				   wdev->links[params.link_id].ap.chandef.chan,
18755 				   info->extack);
18756 	if (err)
18757 		return err;
18758 
18759 	tb = kzalloc_objs(*tb, NL80211_ATTR_MAX + 1);
18760 	if (!tb)
18761 		return -ENOMEM;
18762 
18763 	err = nla_parse_nested(tb, NL80211_ATTR_MAX,
18764 			       info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS],
18765 			       nl80211_policy, info->extack);
18766 	if (err)
18767 		goto out;
18768 
18769 	err = nl80211_parse_beacon(rdev, tb, &params.beacon_color_change,
18770 				   wdev->links[params.link_id].ap.chandef.chan,
18771 				   info->extack);
18772 	if (err)
18773 		goto out;
18774 
18775 	if (!tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) {
18776 		err = -EINVAL;
18777 		goto out;
18778 	}
18779 
18780 	if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) != sizeof(u16)) {
18781 		err = -EINVAL;
18782 		goto out;
18783 	}
18784 
18785 	offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]);
18786 	if (offset >= params.beacon_color_change.tail_len) {
18787 		err = -EINVAL;
18788 		goto out;
18789 	}
18790 
18791 	if (params.beacon_color_change.tail[offset] != params.count) {
18792 		err = -EINVAL;
18793 		goto out;
18794 	}
18795 
18796 	params.counter_offset_beacon = offset;
18797 
18798 	if (tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) {
18799 		if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) !=
18800 		    sizeof(u16)) {
18801 			err = -EINVAL;
18802 			goto out;
18803 		}
18804 
18805 		offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]);
18806 		if (offset >= params.beacon_color_change.probe_resp_len) {
18807 			err = -EINVAL;
18808 			goto out;
18809 		}
18810 
18811 		if (params.beacon_color_change.probe_resp[offset] !=
18812 		    params.count) {
18813 			err = -EINVAL;
18814 			goto out;
18815 		}
18816 
18817 		params.counter_offset_presp = offset;
18818 	}
18819 
18820 	if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) {
18821 		err = nl80211_parse_unsol_bcast_probe_resp(
18822 			rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP],
18823 			&params.unsol_bcast_probe_resp);
18824 		if (err)
18825 			goto out;
18826 	}
18827 
18828 	err = rdev_color_change(rdev, dev, &params);
18829 
18830 out:
18831 	kfree(params.beacon_next.mbssid_ies);
18832 	kfree(params.beacon_color_change.mbssid_ies);
18833 	kfree(params.beacon_next.rnr_ies);
18834 	kfree(params.beacon_color_change.rnr_ies);
18835 	kfree(tb);
18836 	return err;
18837 }
18838 
18839 static int nl80211_set_fils_aad(struct sk_buff *skb,
18840 				struct genl_info *info)
18841 {
18842 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18843 	struct net_device *dev = info->user_ptr[1];
18844 	struct cfg80211_fils_aad fils_aad = {};
18845 	u8 *nonces;
18846 
18847 	if (!info->attrs[NL80211_ATTR_MAC] ||
18848 	    !info->attrs[NL80211_ATTR_FILS_KEK] ||
18849 	    !info->attrs[NL80211_ATTR_FILS_NONCES])
18850 		return -EINVAL;
18851 
18852 	fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]);
18853 	fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]);
18854 	fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]);
18855 	nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]);
18856 	fils_aad.snonce = nonces;
18857 	fils_aad.anonce = nonces + FILS_NONCE_LEN;
18858 
18859 	return rdev_set_fils_aad(rdev, dev, &fils_aad);
18860 }
18861 
18862 static int nl80211_add_link(struct sk_buff *skb, struct genl_info *info)
18863 {
18864 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18865 	unsigned int link_id = nl80211_link_id(info->attrs);
18866 	struct net_device *dev = info->user_ptr[1];
18867 	struct wireless_dev *wdev = dev->ieee80211_ptr;
18868 	int ret;
18869 
18870 	if (!(wdev->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO))
18871 		return -EINVAL;
18872 
18873 	switch (wdev->iftype) {
18874 	case NL80211_IFTYPE_AP:
18875 		break;
18876 	default:
18877 		return -EINVAL;
18878 	}
18879 
18880 	if (!info->attrs[NL80211_ATTR_MAC] ||
18881 	    !is_valid_ether_addr(nla_data(info->attrs[NL80211_ATTR_MAC])))
18882 		return -EINVAL;
18883 
18884 	wdev->valid_links |= BIT(link_id);
18885 	ether_addr_copy(wdev->links[link_id].addr,
18886 			nla_data(info->attrs[NL80211_ATTR_MAC]));
18887 
18888 	ret = rdev_add_intf_link(rdev, wdev, link_id);
18889 	if (ret) {
18890 		wdev->valid_links &= ~BIT(link_id);
18891 		eth_zero_addr(wdev->links[link_id].addr);
18892 	}
18893 
18894 	return ret;
18895 }
18896 
18897 static int nl80211_remove_link(struct sk_buff *skb, struct genl_info *info)
18898 {
18899 	unsigned int link_id = nl80211_link_id(info->attrs);
18900 	struct net_device *dev = info->user_ptr[1];
18901 	struct wireless_dev *wdev = dev->ieee80211_ptr;
18902 
18903 	/* cannot remove if there's no link */
18904 	if (!info->attrs[NL80211_ATTR_MLO_LINK_ID])
18905 		return -EINVAL;
18906 
18907 	switch (wdev->iftype) {
18908 	case NL80211_IFTYPE_AP:
18909 		break;
18910 	default:
18911 		return -EINVAL;
18912 	}
18913 
18914 	cfg80211_remove_link(wdev, link_id);
18915 
18916 	return 0;
18917 }
18918 
18919 static int
18920 nl80211_add_mod_link_station(struct sk_buff *skb, struct genl_info *info,
18921 			     bool add)
18922 {
18923 	struct link_station_parameters params = {};
18924 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
18925 	struct net_device *dev = info->user_ptr[1];
18926 	int err;
18927 
18928 	if ((add && !rdev->ops->add_link_station) ||
18929 	    (!add && !rdev->ops->mod_link_station))
18930 		return -EOPNOTSUPP;
18931 
18932 	if (add && !info->attrs[NL80211_ATTR_MAC])
18933 		return -EINVAL;
18934 
18935 	if (!info->attrs[NL80211_ATTR_MLD_ADDR])
18936 		return -EINVAL;
18937 
18938 	if (add && !info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
18939 		return -EINVAL;
18940 
18941 	params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
18942 
18943 	if (info->attrs[NL80211_ATTR_MAC]) {
18944 		params.link_mac = nla_data(info->attrs[NL80211_ATTR_MAC]);
18945 		if (!is_valid_ether_addr(params.link_mac))
18946 			return -EINVAL;
18947 	}
18948 
18949 	if (!info->attrs[NL80211_ATTR_MLO_LINK_ID])
18950 		return -EINVAL;
18951 
18952 	params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]);
18953 
18954 	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
18955 		params.supported_rates =
18956 			nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
18957 		params.supported_rates_len =
18958 			nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
18959 	}
18960 
18961 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
18962 		params.ht_capa =
18963 			nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
18964 
18965 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
18966 		params.vht_capa =
18967 			nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
18968 
18969 	if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) {
18970 		params.he_capa =
18971 			nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
18972 		params.he_capa_len =
18973 			nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
18974 
18975 		if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) {
18976 			params.eht_capa =
18977 				nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
18978 			params.eht_capa_len =
18979 				nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
18980 
18981 			if (!ieee80211_eht_capa_size_ok((const u8 *)params.he_capa,
18982 							(const u8 *)params.eht_capa,
18983 							params.eht_capa_len,
18984 							false))
18985 				return -EINVAL;
18986 		}
18987 	}
18988 
18989 	if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) {
18990 		if (!params.eht_capa)
18991 			return -EINVAL;
18992 
18993 		params.uhr_capa =
18994 			nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]);
18995 		params.uhr_capa_len =
18996 			nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]);
18997 	}
18998 
18999 	if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY])
19000 		params.he_6ghz_capa =
19001 			nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]);
19002 
19003 	if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
19004 		params.opmode_notif_used = true;
19005 		params.opmode_notif =
19006 			nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
19007 	}
19008 
19009 	err = nl80211_parse_sta_txpower_setting(info, &params.txpwr,
19010 						&params.txpwr_set);
19011 	if (err)
19012 		return err;
19013 
19014 	if (add)
19015 		return rdev_add_link_station(rdev, dev, &params);
19016 
19017 	return rdev_mod_link_station(rdev, dev, &params);
19018 }
19019 
19020 static int
19021 nl80211_add_link_station(struct sk_buff *skb, struct genl_info *info)
19022 {
19023 	return nl80211_add_mod_link_station(skb, info, true);
19024 }
19025 
19026 static int
19027 nl80211_modify_link_station(struct sk_buff *skb, struct genl_info *info)
19028 {
19029 	return nl80211_add_mod_link_station(skb, info, false);
19030 }
19031 
19032 static int
19033 nl80211_remove_link_station(struct sk_buff *skb, struct genl_info *info)
19034 {
19035 	struct link_station_del_parameters params = {};
19036 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
19037 	struct net_device *dev = info->user_ptr[1];
19038 
19039 	if (!rdev->ops->del_link_station)
19040 		return -EOPNOTSUPP;
19041 
19042 	if (!info->attrs[NL80211_ATTR_MLD_ADDR] ||
19043 	    !info->attrs[NL80211_ATTR_MLO_LINK_ID])
19044 		return -EINVAL;
19045 
19046 	params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
19047 	params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]);
19048 
19049 	return rdev_del_link_station(rdev, dev, &params);
19050 }
19051 
19052 static int nl80211_set_hw_timestamp(struct sk_buff *skb,
19053 				    struct genl_info *info)
19054 {
19055 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
19056 	struct net_device *dev = info->user_ptr[1];
19057 	struct cfg80211_set_hw_timestamp hwts = {};
19058 
19059 	if (!rdev->wiphy.hw_timestamp_max_peers)
19060 		return -EOPNOTSUPP;
19061 
19062 	if (!info->attrs[NL80211_ATTR_MAC] &&
19063 	    rdev->wiphy.hw_timestamp_max_peers != CFG80211_HW_TIMESTAMP_ALL_PEERS)
19064 		return -EOPNOTSUPP;
19065 
19066 	if (info->attrs[NL80211_ATTR_MAC])
19067 		hwts.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]);
19068 
19069 	hwts.enable =
19070 		nla_get_flag(info->attrs[NL80211_ATTR_HW_TIMESTAMP_ENABLED]);
19071 
19072 	return rdev_set_hw_timestamp(rdev, dev, &hwts);
19073 }
19074 
19075 static int
19076 nl80211_set_ttlm(struct sk_buff *skb, struct genl_info *info)
19077 {
19078 	struct cfg80211_ttlm_params params = {};
19079 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
19080 	struct net_device *dev = info->user_ptr[1];
19081 	struct wireless_dev *wdev = dev->ieee80211_ptr;
19082 
19083 	if (wdev->iftype != NL80211_IFTYPE_STATION &&
19084 	    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
19085 		return -EOPNOTSUPP;
19086 
19087 	if (!wdev->connected)
19088 		return -ENOLINK;
19089 
19090 	if (!info->attrs[NL80211_ATTR_MLO_TTLM_DLINK] ||
19091 	    !info->attrs[NL80211_ATTR_MLO_TTLM_ULINK])
19092 		return -EINVAL;
19093 
19094 	nla_memcpy(params.dlink,
19095 		   info->attrs[NL80211_ATTR_MLO_TTLM_DLINK],
19096 		   sizeof(params.dlink));
19097 	nla_memcpy(params.ulink,
19098 		   info->attrs[NL80211_ATTR_MLO_TTLM_ULINK],
19099 		   sizeof(params.ulink));
19100 
19101 	return rdev_set_ttlm(rdev, dev, &params);
19102 }
19103 
19104 static int nl80211_assoc_ml_reconf(struct sk_buff *skb, struct genl_info *info)
19105 {
19106 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
19107 	struct net_device *dev = info->user_ptr[1];
19108 	struct wireless_dev *wdev = dev->ieee80211_ptr;
19109 	struct cfg80211_ml_reconf_req req = {};
19110 	unsigned int link_id;
19111 	u16 add_links;
19112 	int err;
19113 
19114 	if (!wdev->valid_links)
19115 		return -EINVAL;
19116 
19117 	if (dev->ieee80211_ptr->conn_owner_nlportid &&
19118 	    dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
19119 		return -EPERM;
19120 
19121 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
19122 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
19123 		return -EOPNOTSUPP;
19124 
19125 	add_links = 0;
19126 	if (info->attrs[NL80211_ATTR_MLO_LINKS]) {
19127 		err = nl80211_process_links(rdev, req.add_links,
19128 					    /* mark as MLO, but not assoc */
19129 					    IEEE80211_MLD_MAX_NUM_LINKS,
19130 					    NULL, 0, info);
19131 		if (err)
19132 			return err;
19133 
19134 		for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS;
19135 		     link_id++) {
19136 			if (!req.add_links[link_id].bss)
19137 				continue;
19138 			add_links |= BIT(link_id);
19139 		}
19140 	}
19141 
19142 	if (info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS])
19143 		req.rem_links =
19144 			nla_get_u16(info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]);
19145 
19146 	/* Validate that existing links are not added, removed links are valid
19147 	 * and don't allow adding and removing the same links
19148 	 */
19149 	if ((add_links & req.rem_links) || !(add_links | req.rem_links) ||
19150 	    (wdev->valid_links & add_links) ||
19151 	    ((wdev->valid_links & req.rem_links) != req.rem_links)) {
19152 		err = -EINVAL;
19153 		goto out;
19154 	}
19155 
19156 	if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS])
19157 		req.ext_mld_capa_ops =
19158 			nla_get_u16(info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]);
19159 
19160 	err = cfg80211_assoc_ml_reconf(rdev, dev, &req);
19161 
19162 out:
19163 	for (link_id = 0; link_id < ARRAY_SIZE(req.add_links); link_id++)
19164 		cfg80211_put_bss(&rdev->wiphy, req.add_links[link_id].bss);
19165 
19166 	return err;
19167 }
19168 
19169 static int
19170 nl80211_epcs_cfg(struct sk_buff *skb, struct genl_info *info)
19171 {
19172 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
19173 	struct net_device *dev = info->user_ptr[1];
19174 	struct wireless_dev *wdev = dev->ieee80211_ptr;
19175 	bool val;
19176 
19177 	if (wdev->iftype != NL80211_IFTYPE_STATION &&
19178 	    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
19179 		return -EOPNOTSUPP;
19180 
19181 	if (!wdev->connected)
19182 		return -ENOLINK;
19183 
19184 	val = nla_get_flag(info->attrs[NL80211_ATTR_EPCS]);
19185 
19186 	return rdev_set_epcs(rdev, dev, val);
19187 }
19188 
19189 #define NL80211_FLAG_NEED_WIPHY		0x01
19190 #define NL80211_FLAG_NEED_NETDEV	0x02
19191 #define NL80211_FLAG_NEED_RTNL		0x04
19192 #define NL80211_FLAG_CHECK_NETDEV_UP	0x08
19193 #define NL80211_FLAG_NEED_NETDEV_UP	(NL80211_FLAG_NEED_NETDEV |\
19194 					 NL80211_FLAG_CHECK_NETDEV_UP)
19195 #define NL80211_FLAG_NEED_WDEV		0x10
19196 /* If a netdev is associated, it must be UP, P2P must be started */
19197 #define NL80211_FLAG_NEED_WDEV_UP	(NL80211_FLAG_NEED_WDEV |\
19198 					 NL80211_FLAG_CHECK_NETDEV_UP)
19199 #define NL80211_FLAG_CLEAR_SKB		0x20
19200 #define NL80211_FLAG_NO_WIPHY_MTX	0x40
19201 #define NL80211_FLAG_MLO_VALID_LINK_ID	0x80
19202 #define NL80211_FLAG_MLO_UNSUPPORTED	0x100
19203 
19204 #define INTERNAL_FLAG_SELECTORS(__sel)			\
19205 	SELECTOR(__sel, NONE, 0) /* must be first */	\
19206 	SELECTOR(__sel, WIPHY,				\
19207 		 NL80211_FLAG_NEED_WIPHY)		\
19208 	SELECTOR(__sel, WDEV,				\
19209 		 NL80211_FLAG_NEED_WDEV)		\
19210 	SELECTOR(__sel, NETDEV,				\
19211 		 NL80211_FLAG_NEED_NETDEV)		\
19212 	SELECTOR(__sel, NETDEV_LINK,			\
19213 		 NL80211_FLAG_NEED_NETDEV |		\
19214 		 NL80211_FLAG_MLO_VALID_LINK_ID)	\
19215 	SELECTOR(__sel, NETDEV_NO_MLO,			\
19216 		 NL80211_FLAG_NEED_NETDEV |		\
19217 		 NL80211_FLAG_MLO_UNSUPPORTED)	\
19218 	SELECTOR(__sel, WIPHY_RTNL,			\
19219 		 NL80211_FLAG_NEED_WIPHY |		\
19220 		 NL80211_FLAG_NEED_RTNL)		\
19221 	SELECTOR(__sel, WIPHY_RTNL_NOMTX,		\
19222 		 NL80211_FLAG_NEED_WIPHY |		\
19223 		 NL80211_FLAG_NEED_RTNL |		\
19224 		 NL80211_FLAG_NO_WIPHY_MTX)		\
19225 	SELECTOR(__sel, WDEV_RTNL,			\
19226 		 NL80211_FLAG_NEED_WDEV |		\
19227 		 NL80211_FLAG_NEED_RTNL)		\
19228 	SELECTOR(__sel, NETDEV_RTNL,			\
19229 		 NL80211_FLAG_NEED_NETDEV |		\
19230 		 NL80211_FLAG_NEED_RTNL)		\
19231 	SELECTOR(__sel, NETDEV_UP,			\
19232 		 NL80211_FLAG_NEED_NETDEV_UP)		\
19233 	SELECTOR(__sel, NETDEV_UP_LINK,			\
19234 		 NL80211_FLAG_NEED_NETDEV_UP |		\
19235 		 NL80211_FLAG_MLO_VALID_LINK_ID)	\
19236 	SELECTOR(__sel, NETDEV_UP_NO_MLO,		\
19237 		 NL80211_FLAG_NEED_NETDEV_UP |		\
19238 		 NL80211_FLAG_MLO_UNSUPPORTED)		\
19239 	SELECTOR(__sel, NETDEV_UP_NO_MLO_CLEAR,		\
19240 		 NL80211_FLAG_NEED_NETDEV_UP |		\
19241 		 NL80211_FLAG_CLEAR_SKB |		\
19242 		 NL80211_FLAG_MLO_UNSUPPORTED)		\
19243 	SELECTOR(__sel, NETDEV_UP_NOTMX,		\
19244 		 NL80211_FLAG_NEED_NETDEV_UP |		\
19245 		 NL80211_FLAG_NO_WIPHY_MTX)		\
19246 	SELECTOR(__sel, NETDEV_UP_NOTMX_MLO,		\
19247 		 NL80211_FLAG_NEED_NETDEV_UP |		\
19248 		 NL80211_FLAG_NO_WIPHY_MTX |		\
19249 		 NL80211_FLAG_MLO_VALID_LINK_ID)	\
19250 	SELECTOR(__sel, NETDEV_UP_CLEAR,		\
19251 		 NL80211_FLAG_NEED_NETDEV_UP |		\
19252 		 NL80211_FLAG_CLEAR_SKB)		\
19253 	SELECTOR(__sel, WDEV_UP,			\
19254 		 NL80211_FLAG_NEED_WDEV_UP)		\
19255 	SELECTOR(__sel, WDEV_UP_CLEAR,			\
19256 		 NL80211_FLAG_NEED_WDEV_UP |		\
19257 		 NL80211_FLAG_CLEAR_SKB)		\
19258 	SELECTOR(__sel, WDEV_UP_LINK,			\
19259 		 NL80211_FLAG_NEED_WDEV_UP |		\
19260 		 NL80211_FLAG_MLO_VALID_LINK_ID)	\
19261 	SELECTOR(__sel, WDEV_UP_RTNL,			\
19262 		 NL80211_FLAG_NEED_WDEV_UP |		\
19263 		 NL80211_FLAG_NEED_RTNL)		\
19264 	SELECTOR(__sel, WIPHY_CLEAR,			\
19265 		 NL80211_FLAG_NEED_WIPHY |		\
19266 		 NL80211_FLAG_CLEAR_SKB)		\
19267 	SELECTOR(__sel, WDEV_UP_RTNL_NOMTX,		\
19268 		 NL80211_FLAG_NEED_WDEV_UP |		\
19269 		 NL80211_FLAG_NO_WIPHY_MTX |		\
19270 		 NL80211_FLAG_NEED_RTNL)
19271 
19272 enum nl80211_internal_flags_selector {
19273 #define SELECTOR(_, name, value)	NL80211_IFL_SEL_##name,
19274 	INTERNAL_FLAG_SELECTORS(_)
19275 #undef SELECTOR
19276 };
19277 
19278 static u32 nl80211_internal_flags[] = {
19279 #define SELECTOR(_, name, value)	[NL80211_IFL_SEL_##name] = value,
19280 	INTERNAL_FLAG_SELECTORS(_)
19281 #undef SELECTOR
19282 };
19283 
19284 static int nl80211_pre_doit(const struct genl_split_ops *ops,
19285 			    struct sk_buff *skb,
19286 			    struct genl_info *info)
19287 {
19288 	struct cfg80211_registered_device *rdev = NULL;
19289 	struct wireless_dev *wdev = NULL;
19290 	struct net_device *dev = NULL;
19291 	u32 internal_flags;
19292 	int err;
19293 
19294 	if (WARN_ON(ops->internal_flags >= ARRAY_SIZE(nl80211_internal_flags)))
19295 		return -EINVAL;
19296 
19297 	internal_flags = nl80211_internal_flags[ops->internal_flags];
19298 
19299 	rtnl_lock();
19300 	if (internal_flags & NL80211_FLAG_NEED_WIPHY) {
19301 		rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
19302 		if (IS_ERR(rdev)) {
19303 			err = PTR_ERR(rdev);
19304 			goto out_unlock;
19305 		}
19306 		info->user_ptr[0] = rdev;
19307 	} else if (internal_flags & NL80211_FLAG_NEED_NETDEV ||
19308 		   internal_flags & NL80211_FLAG_NEED_WDEV) {
19309 		wdev = __cfg80211_wdev_from_attrs(NULL, genl_info_net(info),
19310 						  info->attrs);
19311 		if (IS_ERR(wdev)) {
19312 			err = PTR_ERR(wdev);
19313 			goto out_unlock;
19314 		}
19315 
19316 		dev = wdev->netdev;
19317 		dev_hold(dev);
19318 		rdev = wiphy_to_rdev(wdev->wiphy);
19319 
19320 		if (internal_flags & NL80211_FLAG_NEED_NETDEV) {
19321 			if (!dev) {
19322 				err = -EINVAL;
19323 				goto out_unlock;
19324 			}
19325 
19326 			info->user_ptr[1] = dev;
19327 		} else {
19328 			info->user_ptr[1] = wdev;
19329 		}
19330 
19331 		if (internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
19332 		    !wdev_running(wdev)) {
19333 			err = -ENETDOWN;
19334 			goto out_unlock;
19335 		}
19336 
19337 		info->user_ptr[0] = rdev;
19338 	}
19339 
19340 	if (internal_flags & NL80211_FLAG_MLO_VALID_LINK_ID) {
19341 		struct nlattr *link_id = info->attrs[NL80211_ATTR_MLO_LINK_ID];
19342 
19343 		if (!wdev) {
19344 			err = -EINVAL;
19345 			goto out_unlock;
19346 		}
19347 
19348 		/* MLO -> require valid link ID */
19349 		if (wdev->valid_links &&
19350 		    (!link_id ||
19351 		     !(wdev->valid_links & BIT(nla_get_u8(link_id))))) {
19352 			err = -EINVAL;
19353 			goto out_unlock;
19354 		}
19355 
19356 		/* non-MLO -> no link ID attribute accepted */
19357 		if (!wdev->valid_links && link_id) {
19358 			err = -EINVAL;
19359 			goto out_unlock;
19360 		}
19361 	}
19362 
19363 	if (internal_flags & NL80211_FLAG_MLO_UNSUPPORTED) {
19364 		if (info->attrs[NL80211_ATTR_MLO_LINK_ID] ||
19365 		    (wdev && wdev->valid_links)) {
19366 			err = -EINVAL;
19367 			goto out_unlock;
19368 		}
19369 	}
19370 
19371 	if (rdev && !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) {
19372 		wiphy_lock(&rdev->wiphy);
19373 		/* we keep the mutex locked until post_doit */
19374 		__release(&rdev->wiphy.mtx);
19375 	}
19376 	if (!(internal_flags & NL80211_FLAG_NEED_RTNL))
19377 		rtnl_unlock();
19378 
19379 	return 0;
19380 out_unlock:
19381 	rtnl_unlock();
19382 	dev_put(dev);
19383 	return err;
19384 }
19385 
19386 static void nl80211_post_doit(const struct genl_split_ops *ops,
19387 			      struct sk_buff *skb,
19388 			      struct genl_info *info)
19389 {
19390 	u32 internal_flags = nl80211_internal_flags[ops->internal_flags];
19391 
19392 	if (info->user_ptr[1]) {
19393 		if (internal_flags & NL80211_FLAG_NEED_WDEV) {
19394 			struct wireless_dev *wdev = info->user_ptr[1];
19395 
19396 			dev_put(wdev->netdev);
19397 		} else {
19398 			dev_put(info->user_ptr[1]);
19399 		}
19400 	}
19401 
19402 	if (info->user_ptr[0] &&
19403 	    !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) {
19404 		struct cfg80211_registered_device *rdev = info->user_ptr[0];
19405 
19406 		/* we kept the mutex locked since pre_doit */
19407 		__acquire(&rdev->wiphy.mtx);
19408 		wiphy_unlock(&rdev->wiphy);
19409 	}
19410 
19411 	if (internal_flags & NL80211_FLAG_NEED_RTNL)
19412 		rtnl_unlock();
19413 
19414 	/* If needed, clear the netlink message payload from the SKB
19415 	 * as it might contain key data that shouldn't stick around on
19416 	 * the heap after the SKB is freed. The netlink message header
19417 	 * is still needed for further processing, so leave it intact.
19418 	 */
19419 	if (internal_flags & NL80211_FLAG_CLEAR_SKB) {
19420 		struct nlmsghdr *nlh = nlmsg_hdr(skb);
19421 
19422 		memset(nlmsg_data(nlh), 0, nlmsg_len(nlh));
19423 	}
19424 }
19425 
19426 static int nl80211_set_sar_sub_specs(struct cfg80211_registered_device *rdev,
19427 				     struct cfg80211_sar_specs *sar_specs,
19428 				     struct nlattr *spec[], int index)
19429 {
19430 	u32 range_index, i;
19431 
19432 	if (!sar_specs || !spec)
19433 		return -EINVAL;
19434 
19435 	if (!spec[NL80211_SAR_ATTR_SPECS_POWER] ||
19436 	    !spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX])
19437 		return -EINVAL;
19438 
19439 	range_index = nla_get_u32(spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]);
19440 
19441 	/* check if range_index exceeds num_freq_ranges */
19442 	if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges)
19443 		return -EINVAL;
19444 
19445 	/* check if range_index duplicates */
19446 	for (i = 0; i < index; i++) {
19447 		if (sar_specs->sub_specs[i].freq_range_index == range_index)
19448 			return -EINVAL;
19449 	}
19450 
19451 	sar_specs->sub_specs[index].power =
19452 		nla_get_s32(spec[NL80211_SAR_ATTR_SPECS_POWER]);
19453 
19454 	sar_specs->sub_specs[index].freq_range_index = range_index;
19455 
19456 	return 0;
19457 }
19458 
19459 static int nl80211_set_sar_specs(struct sk_buff *skb, struct genl_info *info)
19460 {
19461 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
19462 	struct nlattr *spec[NL80211_SAR_ATTR_SPECS_MAX + 1];
19463 	struct nlattr *tb[NL80211_SAR_ATTR_MAX + 1];
19464 	struct cfg80211_sar_specs *sar_spec;
19465 	enum nl80211_sar_type type;
19466 	struct nlattr *spec_list;
19467 	u32 specs;
19468 	int rem, err;
19469 
19470 	if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs)
19471 		return -EOPNOTSUPP;
19472 
19473 	if (!info->attrs[NL80211_ATTR_SAR_SPEC])
19474 		return -EINVAL;
19475 
19476 	nla_parse_nested(tb, NL80211_SAR_ATTR_MAX,
19477 			 info->attrs[NL80211_ATTR_SAR_SPEC],
19478 			 NULL, NULL);
19479 
19480 	if (!tb[NL80211_SAR_ATTR_TYPE] || !tb[NL80211_SAR_ATTR_SPECS])
19481 		return -EINVAL;
19482 
19483 	type = nla_get_u32(tb[NL80211_SAR_ATTR_TYPE]);
19484 	if (type != rdev->wiphy.sar_capa->type)
19485 		return -EINVAL;
19486 
19487 	specs = 0;
19488 	nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem)
19489 		specs++;
19490 
19491 	if (specs > rdev->wiphy.sar_capa->num_freq_ranges)
19492 		return -EINVAL;
19493 
19494 	sar_spec = kzalloc_flex(*sar_spec, sub_specs, specs);
19495 	if (!sar_spec)
19496 		return -ENOMEM;
19497 
19498 	sar_spec->num_sub_specs = specs;
19499 	sar_spec->type = type;
19500 	specs = 0;
19501 	nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) {
19502 		nla_parse_nested(spec, NL80211_SAR_ATTR_SPECS_MAX,
19503 				 spec_list, NULL, NULL);
19504 
19505 		switch (type) {
19506 		case NL80211_SAR_TYPE_POWER:
19507 			if (nl80211_set_sar_sub_specs(rdev, sar_spec,
19508 						      spec, specs)) {
19509 				err = -EINVAL;
19510 				goto error;
19511 			}
19512 			break;
19513 		default:
19514 			err = -EINVAL;
19515 			goto error;
19516 		}
19517 		specs++;
19518 	}
19519 
19520 	sar_spec->num_sub_specs = specs;
19521 
19522 	rdev->cur_cmd_info = info;
19523 	err = rdev_set_sar_specs(rdev, sar_spec);
19524 	rdev->cur_cmd_info = NULL;
19525 error:
19526 	kfree(sar_spec);
19527 	return err;
19528 }
19529 
19530 #define SELECTOR(__sel, name, value) \
19531 	((__sel) == (value)) ? NL80211_IFL_SEL_##name :
19532 int __missing_selector(void);
19533 #define IFLAGS(__val) INTERNAL_FLAG_SELECTORS(__val) __missing_selector()
19534 
19535 static const struct genl_ops nl80211_ops[] = {
19536 	{
19537 		.cmd = NL80211_CMD_GET_WIPHY,
19538 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19539 		.doit = nl80211_get_wiphy,
19540 		.dumpit = nl80211_dump_wiphy,
19541 		.done = nl80211_dump_wiphy_done,
19542 		/* can be retrieved by unprivileged users */
19543 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
19544 	},
19545 };
19546 
19547 static const struct genl_small_ops nl80211_small_ops[] = {
19548 	{
19549 		.cmd = NL80211_CMD_SET_WIPHY,
19550 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19551 		.doit = nl80211_set_wiphy,
19552 		.flags = GENL_UNS_ADMIN_PERM,
19553 	},
19554 	{
19555 		.cmd = NL80211_CMD_GET_INTERFACE,
19556 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19557 		.doit = nl80211_get_interface,
19558 		.dumpit = nl80211_dump_interface,
19559 		/* can be retrieved by unprivileged users */
19560 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV),
19561 	},
19562 	{
19563 		.cmd = NL80211_CMD_SET_INTERFACE,
19564 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19565 		.doit = nl80211_set_interface,
19566 		.flags = GENL_UNS_ADMIN_PERM,
19567 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV |
19568 					 NL80211_FLAG_NEED_RTNL),
19569 	},
19570 	{
19571 		.cmd = NL80211_CMD_NEW_INTERFACE,
19572 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19573 		.doit = nl80211_new_interface,
19574 		.flags = GENL_UNS_ADMIN_PERM,
19575 		.internal_flags =
19576 			IFLAGS(NL80211_FLAG_NEED_WIPHY |
19577 			       NL80211_FLAG_NEED_RTNL |
19578 			       /* we take the wiphy mutex later ourselves */
19579 			       NL80211_FLAG_NO_WIPHY_MTX),
19580 	},
19581 	{
19582 		.cmd = NL80211_CMD_DEL_INTERFACE,
19583 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19584 		.doit = nl80211_del_interface,
19585 		.flags = GENL_UNS_ADMIN_PERM,
19586 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV |
19587 					 NL80211_FLAG_NEED_RTNL),
19588 	},
19589 	{
19590 		.cmd = NL80211_CMD_GET_KEY,
19591 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19592 		.doit = nl80211_get_key,
19593 		.flags = GENL_UNS_ADMIN_PERM,
19594 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
19595 	},
19596 	{
19597 		.cmd = NL80211_CMD_SET_KEY,
19598 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19599 		.doit = nl80211_set_key,
19600 		.flags = GENL_UNS_ADMIN_PERM,
19601 		/* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on key */
19602 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP |
19603 					 NL80211_FLAG_CLEAR_SKB),
19604 	},
19605 	{
19606 		.cmd = NL80211_CMD_NEW_KEY,
19607 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19608 		.doit = nl80211_new_key,
19609 		.flags = GENL_UNS_ADMIN_PERM,
19610 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP |
19611 					 NL80211_FLAG_CLEAR_SKB),
19612 	},
19613 	{
19614 		.cmd = NL80211_CMD_DEL_KEY,
19615 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19616 		.doit = nl80211_del_key,
19617 		.flags = GENL_UNS_ADMIN_PERM,
19618 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
19619 	},
19620 	{
19621 		.cmd = NL80211_CMD_SET_BEACON,
19622 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19623 		.flags = GENL_UNS_ADMIN_PERM,
19624 		.doit = nl80211_set_beacon,
19625 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
19626 					 NL80211_FLAG_MLO_VALID_LINK_ID),
19627 	},
19628 	{
19629 		.cmd = NL80211_CMD_START_AP,
19630 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19631 		.flags = GENL_UNS_ADMIN_PERM,
19632 		.doit = nl80211_start_ap,
19633 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
19634 					 NL80211_FLAG_MLO_VALID_LINK_ID),
19635 	},
19636 	{
19637 		.cmd = NL80211_CMD_STOP_AP,
19638 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19639 		.flags = GENL_UNS_ADMIN_PERM,
19640 		.doit = nl80211_stop_ap,
19641 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
19642 					 NL80211_FLAG_MLO_VALID_LINK_ID),
19643 	},
19644 	{
19645 		.cmd = NL80211_CMD_GET_STATION,
19646 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19647 		.doit = nl80211_get_station,
19648 		.dumpit = nl80211_dump_station,
19649 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV),
19650 	},
19651 	{
19652 		.cmd = NL80211_CMD_SET_STATION,
19653 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19654 		.doit = nl80211_set_station,
19655 		.flags = GENL_UNS_ADMIN_PERM,
19656 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
19657 	},
19658 	{
19659 		.cmd = NL80211_CMD_NEW_STATION,
19660 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19661 		.doit = nl80211_new_station,
19662 		.flags = GENL_UNS_ADMIN_PERM,
19663 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
19664 	},
19665 	{
19666 		.cmd = NL80211_CMD_DEL_STATION,
19667 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19668 		.doit = nl80211_del_station,
19669 		.flags = GENL_UNS_ADMIN_PERM,
19670 		/* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on
19671 		 * whether MAC address is passed or not. If MAC address is
19672 		 * passed, then even during MLO, link ID is not required.
19673 		 */
19674 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
19675 	},
19676 	{
19677 		.cmd = NL80211_CMD_GET_MPATH,
19678 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19679 		.doit = nl80211_get_mpath,
19680 		.dumpit = nl80211_dump_mpath,
19681 		.flags = GENL_UNS_ADMIN_PERM,
19682 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19683 	},
19684 	{
19685 		.cmd = NL80211_CMD_GET_MPP,
19686 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19687 		.doit = nl80211_get_mpp,
19688 		.dumpit = nl80211_dump_mpp,
19689 		.flags = GENL_UNS_ADMIN_PERM,
19690 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19691 	},
19692 	{
19693 		.cmd = NL80211_CMD_SET_MPATH,
19694 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19695 		.doit = nl80211_set_mpath,
19696 		.flags = GENL_UNS_ADMIN_PERM,
19697 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19698 	},
19699 	{
19700 		.cmd = NL80211_CMD_NEW_MPATH,
19701 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19702 		.doit = nl80211_new_mpath,
19703 		.flags = GENL_UNS_ADMIN_PERM,
19704 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19705 	},
19706 	{
19707 		.cmd = NL80211_CMD_DEL_MPATH,
19708 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19709 		.doit = nl80211_del_mpath,
19710 		.flags = GENL_UNS_ADMIN_PERM,
19711 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19712 	},
19713 	{
19714 		.cmd = NL80211_CMD_SET_BSS,
19715 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19716 		.doit = nl80211_set_bss,
19717 		.flags = GENL_UNS_ADMIN_PERM,
19718 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
19719 					 NL80211_FLAG_MLO_VALID_LINK_ID),
19720 	},
19721 	{
19722 		.cmd = NL80211_CMD_GET_REG,
19723 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19724 		.doit = nl80211_get_reg_do,
19725 		.dumpit = nl80211_get_reg_dump,
19726 		/* can be retrieved by unprivileged users */
19727 	},
19728 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
19729 	{
19730 		.cmd = NL80211_CMD_SET_REG,
19731 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19732 		.doit = nl80211_set_reg,
19733 		.flags = GENL_ADMIN_PERM,
19734 	},
19735 #endif
19736 	{
19737 		.cmd = NL80211_CMD_REQ_SET_REG,
19738 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19739 		.doit = nl80211_req_set_reg,
19740 		.flags = GENL_ADMIN_PERM,
19741 	},
19742 	{
19743 		.cmd = NL80211_CMD_RELOAD_REGDB,
19744 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19745 		.doit = nl80211_reload_regdb,
19746 		.flags = GENL_ADMIN_PERM,
19747 	},
19748 	{
19749 		.cmd = NL80211_CMD_GET_MESH_CONFIG,
19750 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19751 		.doit = nl80211_get_mesh_config,
19752 		/* can be retrieved by unprivileged users */
19753 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19754 	},
19755 	{
19756 		.cmd = NL80211_CMD_SET_MESH_CONFIG,
19757 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19758 		.doit = nl80211_update_mesh_config,
19759 		.flags = GENL_UNS_ADMIN_PERM,
19760 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19761 	},
19762 	{
19763 		.cmd = NL80211_CMD_TRIGGER_SCAN,
19764 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19765 		.doit = nl80211_trigger_scan,
19766 		.flags = GENL_UNS_ADMIN_PERM,
19767 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
19768 	},
19769 	{
19770 		.cmd = NL80211_CMD_ABORT_SCAN,
19771 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19772 		.doit = nl80211_abort_scan,
19773 		.flags = GENL_UNS_ADMIN_PERM,
19774 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
19775 	},
19776 	{
19777 		.cmd = NL80211_CMD_GET_SCAN,
19778 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19779 		.dumpit = nl80211_dump_scan,
19780 	},
19781 	{
19782 		.cmd = NL80211_CMD_START_SCHED_SCAN,
19783 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19784 		.doit = nl80211_start_sched_scan,
19785 		.flags = GENL_UNS_ADMIN_PERM,
19786 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19787 	},
19788 	{
19789 		.cmd = NL80211_CMD_STOP_SCHED_SCAN,
19790 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19791 		.doit = nl80211_stop_sched_scan,
19792 		.flags = GENL_UNS_ADMIN_PERM,
19793 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19794 	},
19795 	{
19796 		.cmd = NL80211_CMD_AUTHENTICATE,
19797 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19798 		.doit = nl80211_authenticate,
19799 		.flags = GENL_UNS_ADMIN_PERM,
19800 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
19801 					 NL80211_FLAG_CLEAR_SKB),
19802 	},
19803 	{
19804 		.cmd = NL80211_CMD_ASSOCIATE,
19805 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19806 		.doit = nl80211_associate,
19807 		.flags = GENL_UNS_ADMIN_PERM,
19808 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
19809 					 NL80211_FLAG_CLEAR_SKB),
19810 	},
19811 	{
19812 		.cmd = NL80211_CMD_DEAUTHENTICATE,
19813 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19814 		.doit = nl80211_deauthenticate,
19815 		.flags = GENL_UNS_ADMIN_PERM,
19816 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19817 	},
19818 	{
19819 		.cmd = NL80211_CMD_DISASSOCIATE,
19820 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19821 		.doit = nl80211_disassociate,
19822 		.flags = GENL_UNS_ADMIN_PERM,
19823 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19824 	},
19825 	{
19826 		.cmd = NL80211_CMD_JOIN_IBSS,
19827 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19828 		.doit = nl80211_join_ibss,
19829 		.flags = GENL_UNS_ADMIN_PERM,
19830 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19831 	},
19832 	{
19833 		.cmd = NL80211_CMD_LEAVE_IBSS,
19834 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19835 		.doit = nl80211_leave_ibss,
19836 		.flags = GENL_UNS_ADMIN_PERM,
19837 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19838 	},
19839 #ifdef CONFIG_NL80211_TESTMODE
19840 	{
19841 		.cmd = NL80211_CMD_TESTMODE,
19842 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19843 		.doit = nl80211_testmode_do,
19844 		.dumpit = nl80211_testmode_dump,
19845 		.flags = GENL_UNS_ADMIN_PERM,
19846 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
19847 	},
19848 #endif
19849 	{
19850 		.cmd = NL80211_CMD_CONNECT,
19851 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19852 		.doit = nl80211_connect,
19853 		.flags = GENL_UNS_ADMIN_PERM,
19854 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
19855 					 NL80211_FLAG_CLEAR_SKB),
19856 	},
19857 	{
19858 		.cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS,
19859 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19860 		.doit = nl80211_update_connect_params,
19861 		.flags = GENL_ADMIN_PERM,
19862 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
19863 					 NL80211_FLAG_CLEAR_SKB),
19864 	},
19865 	{
19866 		.cmd = NL80211_CMD_DISCONNECT,
19867 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19868 		.doit = nl80211_disconnect,
19869 		.flags = GENL_UNS_ADMIN_PERM,
19870 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19871 	},
19872 	{
19873 		.cmd = NL80211_CMD_SET_WIPHY_NETNS,
19874 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19875 		.doit = nl80211_wiphy_netns,
19876 		.flags = GENL_UNS_ADMIN_PERM,
19877 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY |
19878 					 NL80211_FLAG_NEED_RTNL |
19879 					 NL80211_FLAG_NO_WIPHY_MTX),
19880 	},
19881 	{
19882 		.cmd = NL80211_CMD_GET_SURVEY,
19883 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19884 		.dumpit = nl80211_dump_survey,
19885 	},
19886 	{
19887 		.cmd = NL80211_CMD_SET_PMKSA,
19888 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19889 		.doit = nl80211_set_pmksa,
19890 		.flags = GENL_UNS_ADMIN_PERM,
19891 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
19892 					 NL80211_FLAG_CLEAR_SKB),
19893 	},
19894 	{
19895 		.cmd = NL80211_CMD_DEL_PMKSA,
19896 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19897 		.doit = nl80211_del_pmksa,
19898 		.flags = GENL_UNS_ADMIN_PERM,
19899 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19900 	},
19901 	{
19902 		.cmd = NL80211_CMD_FLUSH_PMKSA,
19903 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19904 		.doit = nl80211_flush_pmksa,
19905 		.flags = GENL_UNS_ADMIN_PERM,
19906 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19907 	},
19908 	{
19909 		.cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
19910 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19911 		.doit = nl80211_remain_on_channel,
19912 		.flags = GENL_UNS_ADMIN_PERM,
19913 		/* FIXME: requiring a link ID here is probably not good */
19914 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP |
19915 					 NL80211_FLAG_MLO_VALID_LINK_ID),
19916 	},
19917 	{
19918 		.cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
19919 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19920 		.doit = nl80211_cancel_remain_on_channel,
19921 		.flags = GENL_UNS_ADMIN_PERM,
19922 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
19923 	},
19924 	{
19925 		.cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
19926 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19927 		.doit = nl80211_set_tx_bitrate_mask,
19928 		.flags = GENL_UNS_ADMIN_PERM,
19929 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV |
19930 					 NL80211_FLAG_MLO_VALID_LINK_ID),
19931 	},
19932 	{
19933 		.cmd = NL80211_CMD_REGISTER_FRAME,
19934 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19935 		.doit = nl80211_register_mgmt,
19936 		.flags = GENL_UNS_ADMIN_PERM,
19937 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV),
19938 	},
19939 	{
19940 		.cmd = NL80211_CMD_FRAME,
19941 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19942 		.doit = nl80211_tx_mgmt,
19943 		.flags = GENL_UNS_ADMIN_PERM,
19944 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
19945 	},
19946 	{
19947 		.cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
19948 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19949 		.doit = nl80211_tx_mgmt_cancel_wait,
19950 		.flags = GENL_UNS_ADMIN_PERM,
19951 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
19952 	},
19953 	{
19954 		.cmd = NL80211_CMD_SET_POWER_SAVE,
19955 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19956 		.doit = nl80211_set_power_save,
19957 		.flags = GENL_UNS_ADMIN_PERM,
19958 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
19959 	},
19960 	{
19961 		.cmd = NL80211_CMD_GET_POWER_SAVE,
19962 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19963 		.doit = nl80211_get_power_save,
19964 		/* can be retrieved by unprivileged users */
19965 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
19966 	},
19967 	{
19968 		.cmd = NL80211_CMD_SET_CQM,
19969 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19970 		.doit = nl80211_set_cqm,
19971 		.flags = GENL_UNS_ADMIN_PERM,
19972 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
19973 	},
19974 	{
19975 		.cmd = NL80211_CMD_SET_CHANNEL,
19976 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19977 		.doit = nl80211_set_channel,
19978 		.flags = GENL_UNS_ADMIN_PERM,
19979 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV |
19980 					 NL80211_FLAG_MLO_VALID_LINK_ID),
19981 	},
19982 	{
19983 		.cmd = NL80211_CMD_JOIN_MESH,
19984 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19985 		.doit = nl80211_join_mesh,
19986 		.flags = GENL_UNS_ADMIN_PERM,
19987 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19988 	},
19989 	{
19990 		.cmd = NL80211_CMD_LEAVE_MESH,
19991 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19992 		.doit = nl80211_leave_mesh,
19993 		.flags = GENL_UNS_ADMIN_PERM,
19994 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
19995 	},
19996 	{
19997 		.cmd = NL80211_CMD_JOIN_OCB,
19998 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
19999 		.doit = nl80211_join_ocb,
20000 		.flags = GENL_UNS_ADMIN_PERM,
20001 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20002 	},
20003 	{
20004 		.cmd = NL80211_CMD_LEAVE_OCB,
20005 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20006 		.doit = nl80211_leave_ocb,
20007 		.flags = GENL_UNS_ADMIN_PERM,
20008 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20009 	},
20010 #ifdef CONFIG_PM
20011 	{
20012 		.cmd = NL80211_CMD_GET_WOWLAN,
20013 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20014 		.doit = nl80211_get_wowlan,
20015 		/* can be retrieved by unprivileged users */
20016 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
20017 	},
20018 	{
20019 		.cmd = NL80211_CMD_SET_WOWLAN,
20020 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20021 		.doit = nl80211_set_wowlan,
20022 		.flags = GENL_UNS_ADMIN_PERM,
20023 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
20024 	},
20025 #endif
20026 	{
20027 		.cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
20028 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20029 		.doit = nl80211_set_rekey_data,
20030 		.flags = GENL_UNS_ADMIN_PERM,
20031 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
20032 					 NL80211_FLAG_CLEAR_SKB),
20033 	},
20034 	{
20035 		.cmd = NL80211_CMD_TDLS_MGMT,
20036 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20037 		.doit = nl80211_tdls_mgmt,
20038 		.flags = GENL_UNS_ADMIN_PERM,
20039 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
20040 					 NL80211_FLAG_MLO_VALID_LINK_ID),
20041 	},
20042 	{
20043 		.cmd = NL80211_CMD_TDLS_OPER,
20044 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20045 		.doit = nl80211_tdls_oper,
20046 		.flags = GENL_UNS_ADMIN_PERM,
20047 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20048 	},
20049 	{
20050 		.cmd = NL80211_CMD_UNEXPECTED_FRAME,
20051 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20052 		.doit = nl80211_register_unexpected_frame,
20053 		.flags = GENL_UNS_ADMIN_PERM,
20054 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
20055 	},
20056 	{
20057 		.cmd = NL80211_CMD_PROBE_CLIENT,
20058 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20059 		.doit = nl80211_probe_client,
20060 		.flags = GENL_UNS_ADMIN_PERM,
20061 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20062 	},
20063 	{
20064 		.cmd = NL80211_CMD_REGISTER_BEACONS,
20065 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20066 		.doit = nl80211_register_beacons,
20067 		.flags = GENL_UNS_ADMIN_PERM,
20068 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
20069 	},
20070 	{
20071 		.cmd = NL80211_CMD_SET_NOACK_MAP,
20072 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20073 		.doit = nl80211_set_noack_map,
20074 		.flags = GENL_UNS_ADMIN_PERM,
20075 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
20076 	},
20077 	{
20078 		.cmd = NL80211_CMD_START_P2P_DEVICE,
20079 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20080 		.doit = nl80211_start_p2p_device,
20081 		.flags = GENL_UNS_ADMIN_PERM,
20082 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV |
20083 					 NL80211_FLAG_NEED_RTNL),
20084 	},
20085 	{
20086 		.cmd = NL80211_CMD_STOP_P2P_DEVICE,
20087 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20088 		.doit = nl80211_stop_p2p_device,
20089 		.flags = GENL_UNS_ADMIN_PERM,
20090 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP |
20091 					 NL80211_FLAG_NEED_RTNL),
20092 	},
20093 	{
20094 		.cmd = NL80211_CMD_START_NAN,
20095 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20096 		.doit = nl80211_start_nan,
20097 		.flags = GENL_ADMIN_PERM,
20098 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV |
20099 					 NL80211_FLAG_NEED_RTNL),
20100 	},
20101 	{
20102 		.cmd = NL80211_CMD_STOP_NAN,
20103 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20104 		.doit = nl80211_stop_nan,
20105 		.flags = GENL_ADMIN_PERM,
20106 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP |
20107 					 NL80211_FLAG_NO_WIPHY_MTX |
20108 					 NL80211_FLAG_NEED_RTNL),
20109 	},
20110 	{
20111 		.cmd = NL80211_CMD_ADD_NAN_FUNCTION,
20112 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20113 		.doit = nl80211_nan_add_func,
20114 		.flags = GENL_ADMIN_PERM,
20115 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
20116 	},
20117 	{
20118 		.cmd = NL80211_CMD_DEL_NAN_FUNCTION,
20119 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20120 		.doit = nl80211_nan_del_func,
20121 		.flags = GENL_ADMIN_PERM,
20122 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
20123 	},
20124 	{
20125 		.cmd = NL80211_CMD_CHANGE_NAN_CONFIG,
20126 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20127 		.doit = nl80211_nan_change_config,
20128 		.flags = GENL_ADMIN_PERM,
20129 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
20130 	},
20131 	{
20132 		.cmd = NL80211_CMD_START_PD,
20133 		.doit = nl80211_start_pd,
20134 		.flags = GENL_ADMIN_PERM,
20135 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV |
20136 					 NL80211_FLAG_NEED_RTNL),
20137 	},
20138 	{
20139 		.cmd = NL80211_CMD_STOP_PD,
20140 		.doit = nl80211_stop_pd,
20141 		.flags = GENL_ADMIN_PERM,
20142 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP |
20143 					 NL80211_FLAG_NEED_RTNL),
20144 	},
20145 	{
20146 		.cmd = NL80211_CMD_SET_MCAST_RATE,
20147 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20148 		.doit = nl80211_set_mcast_rate,
20149 		.flags = GENL_UNS_ADMIN_PERM,
20150 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
20151 	},
20152 	{
20153 		.cmd = NL80211_CMD_SET_MAC_ACL,
20154 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20155 		.doit = nl80211_set_mac_acl,
20156 		.flags = GENL_UNS_ADMIN_PERM,
20157 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV |
20158 					 NL80211_FLAG_MLO_UNSUPPORTED),
20159 	},
20160 	{
20161 		.cmd = NL80211_CMD_RADAR_DETECT,
20162 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20163 		.doit = nl80211_start_radar_detection,
20164 		.flags = GENL_UNS_ADMIN_PERM,
20165 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
20166 					 NL80211_FLAG_NO_WIPHY_MTX |
20167 					 NL80211_FLAG_MLO_VALID_LINK_ID),
20168 	},
20169 	{
20170 		.cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
20171 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20172 		.doit = nl80211_get_protocol_features,
20173 	},
20174 	{
20175 		.cmd = NL80211_CMD_UPDATE_FT_IES,
20176 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20177 		.doit = nl80211_update_ft_ies,
20178 		.flags = GENL_UNS_ADMIN_PERM,
20179 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20180 	},
20181 	{
20182 		.cmd = NL80211_CMD_CRIT_PROTOCOL_START,
20183 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20184 		.doit = nl80211_crit_protocol_start,
20185 		.flags = GENL_UNS_ADMIN_PERM,
20186 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
20187 	},
20188 	{
20189 		.cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
20190 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20191 		.doit = nl80211_crit_protocol_stop,
20192 		.flags = GENL_UNS_ADMIN_PERM,
20193 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
20194 	},
20195 	{
20196 		.cmd = NL80211_CMD_GET_COALESCE,
20197 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20198 		.doit = nl80211_get_coalesce,
20199 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
20200 	},
20201 	{
20202 		.cmd = NL80211_CMD_SET_COALESCE,
20203 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20204 		.doit = nl80211_set_coalesce,
20205 		.flags = GENL_UNS_ADMIN_PERM,
20206 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
20207 	},
20208 	{
20209 		.cmd = NL80211_CMD_CHANNEL_SWITCH,
20210 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20211 		.doit = nl80211_channel_switch,
20212 		.flags = GENL_UNS_ADMIN_PERM,
20213 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
20214 					 NL80211_FLAG_MLO_VALID_LINK_ID),
20215 	},
20216 	{
20217 		.cmd = NL80211_CMD_VENDOR,
20218 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20219 		.doit = nl80211_vendor_cmd,
20220 		.dumpit = nl80211_vendor_cmd_dump,
20221 		.flags = GENL_UNS_ADMIN_PERM,
20222 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY |
20223 					 NL80211_FLAG_CLEAR_SKB),
20224 	},
20225 	{
20226 		.cmd = NL80211_CMD_SET_QOS_MAP,
20227 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20228 		.doit = nl80211_set_qos_map,
20229 		.flags = GENL_UNS_ADMIN_PERM,
20230 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20231 	},
20232 	{
20233 		.cmd = NL80211_CMD_ADD_TX_TS,
20234 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20235 		.doit = nl80211_add_tx_ts,
20236 		.flags = GENL_UNS_ADMIN_PERM,
20237 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
20238 					 NL80211_FLAG_MLO_UNSUPPORTED),
20239 	},
20240 	{
20241 		.cmd = NL80211_CMD_DEL_TX_TS,
20242 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20243 		.doit = nl80211_del_tx_ts,
20244 		.flags = GENL_UNS_ADMIN_PERM,
20245 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20246 	},
20247 	{
20248 		.cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH,
20249 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20250 		.doit = nl80211_tdls_channel_switch,
20251 		.flags = GENL_UNS_ADMIN_PERM,
20252 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20253 	},
20254 	{
20255 		.cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
20256 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20257 		.doit = nl80211_tdls_cancel_channel_switch,
20258 		.flags = GENL_UNS_ADMIN_PERM,
20259 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20260 	},
20261 	{
20262 		.cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST,
20263 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20264 		.doit = nl80211_set_multicast_to_unicast,
20265 		.flags = GENL_UNS_ADMIN_PERM,
20266 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
20267 	},
20268 	{
20269 		.cmd = NL80211_CMD_SET_PMK,
20270 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20271 		.doit = nl80211_set_pmk,
20272 		.flags = GENL_UNS_ADMIN_PERM,
20273 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
20274 					 NL80211_FLAG_CLEAR_SKB),
20275 	},
20276 	{
20277 		.cmd = NL80211_CMD_DEL_PMK,
20278 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20279 		.doit = nl80211_del_pmk,
20280 		.flags = GENL_UNS_ADMIN_PERM,
20281 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20282 	},
20283 	{
20284 		.cmd = NL80211_CMD_EXTERNAL_AUTH,
20285 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20286 		.doit = nl80211_external_auth,
20287 		.flags = GENL_ADMIN_PERM,
20288 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20289 	},
20290 	{
20291 		.cmd = NL80211_CMD_CONTROL_PORT_FRAME,
20292 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20293 		.doit = nl80211_tx_control_port,
20294 		.flags = GENL_UNS_ADMIN_PERM,
20295 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20296 	},
20297 	{
20298 		.cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS,
20299 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20300 		.doit = nl80211_get_ftm_responder_stats,
20301 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV |
20302 					 NL80211_FLAG_MLO_VALID_LINK_ID),
20303 	},
20304 	{
20305 		.cmd = NL80211_CMD_PEER_MEASUREMENT_START,
20306 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20307 		.doit = nl80211_pmsr_start,
20308 		.flags = GENL_UNS_ADMIN_PERM,
20309 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
20310 	},
20311 	{
20312 		.cmd = NL80211_CMD_NOTIFY_RADAR,
20313 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20314 		.doit = nl80211_notify_radar_detection,
20315 		.flags = GENL_UNS_ADMIN_PERM,
20316 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20317 	},
20318 	{
20319 		.cmd = NL80211_CMD_UPDATE_OWE_INFO,
20320 		.doit = nl80211_update_owe_info,
20321 		.flags = GENL_ADMIN_PERM,
20322 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20323 	},
20324 	{
20325 		.cmd = NL80211_CMD_PROBE_MESH_LINK,
20326 		.doit = nl80211_probe_mesh_link,
20327 		.flags = GENL_UNS_ADMIN_PERM,
20328 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20329 	},
20330 	{
20331 		.cmd = NL80211_CMD_SET_TID_CONFIG,
20332 		.doit = nl80211_set_tid_config,
20333 		.flags = GENL_UNS_ADMIN_PERM,
20334 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV |
20335 					 NL80211_FLAG_MLO_VALID_LINK_ID),
20336 	},
20337 	{
20338 		.cmd = NL80211_CMD_SET_SAR_SPECS,
20339 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20340 		.doit = nl80211_set_sar_specs,
20341 		.flags = GENL_UNS_ADMIN_PERM,
20342 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY |
20343 					 NL80211_FLAG_NEED_RTNL),
20344 	},
20345 	{
20346 		.cmd = NL80211_CMD_COLOR_CHANGE_REQUEST,
20347 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20348 		.doit = nl80211_color_change,
20349 		.flags = GENL_UNS_ADMIN_PERM,
20350 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
20351 					 NL80211_FLAG_MLO_VALID_LINK_ID),
20352 	},
20353 	{
20354 		.cmd = NL80211_CMD_SET_FILS_AAD,
20355 		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
20356 		.doit = nl80211_set_fils_aad,
20357 		.flags = GENL_UNS_ADMIN_PERM,
20358 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20359 	},
20360 	{
20361 		.cmd = NL80211_CMD_ADD_LINK,
20362 		.doit = nl80211_add_link,
20363 		.flags = GENL_UNS_ADMIN_PERM,
20364 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20365 	},
20366 	{
20367 		.cmd = NL80211_CMD_REMOVE_LINK,
20368 		.doit = nl80211_remove_link,
20369 		.flags = GENL_UNS_ADMIN_PERM,
20370 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
20371 					 NL80211_FLAG_MLO_VALID_LINK_ID),
20372 	},
20373 	{
20374 		.cmd = NL80211_CMD_ADD_LINK_STA,
20375 		.doit = nl80211_add_link_station,
20376 		.flags = GENL_UNS_ADMIN_PERM,
20377 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
20378 					 NL80211_FLAG_MLO_VALID_LINK_ID),
20379 	},
20380 	{
20381 		.cmd = NL80211_CMD_MODIFY_LINK_STA,
20382 		.doit = nl80211_modify_link_station,
20383 		.flags = GENL_UNS_ADMIN_PERM,
20384 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
20385 					 NL80211_FLAG_MLO_VALID_LINK_ID),
20386 	},
20387 	{
20388 		.cmd = NL80211_CMD_REMOVE_LINK_STA,
20389 		.doit = nl80211_remove_link_station,
20390 		.flags = GENL_UNS_ADMIN_PERM,
20391 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
20392 					 NL80211_FLAG_MLO_VALID_LINK_ID),
20393 	},
20394 	{
20395 		.cmd = NL80211_CMD_SET_HW_TIMESTAMP,
20396 		.doit = nl80211_set_hw_timestamp,
20397 		.flags = GENL_UNS_ADMIN_PERM,
20398 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20399 	},
20400 	{
20401 		.cmd = NL80211_CMD_SET_TID_TO_LINK_MAPPING,
20402 		.doit = nl80211_set_ttlm,
20403 		.flags = GENL_UNS_ADMIN_PERM,
20404 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20405 	},
20406 	{
20407 		.cmd = NL80211_CMD_ASSOC_MLO_RECONF,
20408 		.doit = nl80211_assoc_ml_reconf,
20409 		.flags = GENL_UNS_ADMIN_PERM,
20410 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20411 	},
20412 	{
20413 		.cmd = NL80211_CMD_EPCS_CFG,
20414 		.doit = nl80211_epcs_cfg,
20415 		.flags = GENL_UNS_ADMIN_PERM,
20416 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
20417 	},
20418 	{
20419 		.cmd = NL80211_CMD_NAN_SET_LOCAL_SCHED,
20420 		.doit = nl80211_nan_set_local_sched,
20421 		.flags = GENL_ADMIN_PERM,
20422 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
20423 	},
20424 	{
20425 		.cmd = NL80211_CMD_NAN_SET_PEER_SCHED,
20426 		.doit = nl80211_nan_set_peer_sched,
20427 		.flags = GENL_ADMIN_PERM,
20428 		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
20429 	},
20430 };
20431 
20432 static struct genl_family nl80211_fam __ro_after_init = {
20433 	.name = NL80211_GENL_NAME,	/* have users key off the name instead */
20434 	.hdrsize = 0,			/* no private header */
20435 	.version = 1,			/* no particular meaning now */
20436 	.maxattr = NL80211_ATTR_MAX,
20437 	.policy = nl80211_policy,
20438 	.netnsok = true,
20439 	.pre_doit = nl80211_pre_doit,
20440 	.post_doit = nl80211_post_doit,
20441 	.module = THIS_MODULE,
20442 	.ops = nl80211_ops,
20443 	.n_ops = ARRAY_SIZE(nl80211_ops),
20444 	.small_ops = nl80211_small_ops,
20445 	.n_small_ops = ARRAY_SIZE(nl80211_small_ops),
20446 	.resv_start_op = NL80211_CMD_REMOVE_LINK_STA + 1,
20447 	.mcgrps = nl80211_mcgrps,
20448 	.n_mcgrps = ARRAY_SIZE(nl80211_mcgrps),
20449 	.parallel_ops = true,
20450 };
20451 
20452 /* notification functions */
20453 
20454 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
20455 			  enum nl80211_commands cmd)
20456 {
20457 	struct sk_buff *msg;
20458 	struct nl80211_dump_wiphy_state state = {};
20459 
20460 	WARN_ON(cmd != NL80211_CMD_NEW_WIPHY &&
20461 		cmd != NL80211_CMD_DEL_WIPHY);
20462 
20463 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
20464 	if (!msg)
20465 		return;
20466 
20467 	if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) {
20468 		nlmsg_free(msg);
20469 		return;
20470 	}
20471 
20472 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
20473 				NL80211_MCGRP_CONFIG, GFP_KERNEL);
20474 }
20475 
20476 void nl80211_notify_iface(struct cfg80211_registered_device *rdev,
20477 				struct wireless_dev *wdev,
20478 				enum nl80211_commands cmd)
20479 {
20480 	struct sk_buff *msg;
20481 
20482 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
20483 	if (!msg)
20484 		return;
20485 
20486 	if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, cmd) < 0) {
20487 		nlmsg_free(msg);
20488 		return;
20489 	}
20490 
20491 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
20492 				NL80211_MCGRP_CONFIG, GFP_KERNEL);
20493 }
20494 
20495 static int nl80211_add_scan_req(struct sk_buff *msg,
20496 				struct cfg80211_registered_device *rdev)
20497 {
20498 	struct cfg80211_scan_request_int *req = rdev->scan_req;
20499 	struct nlattr *nest;
20500 	int i;
20501 	struct cfg80211_scan_info *info;
20502 
20503 	if (WARN_ON(!req))
20504 		return 0;
20505 
20506 	nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS);
20507 	if (!nest)
20508 		goto nla_put_failure;
20509 	for (i = 0; i < req->req.n_ssids; i++) {
20510 		if (nla_put(msg, i, req->req.ssids[i].ssid_len,
20511 			    req->req.ssids[i].ssid))
20512 			goto nla_put_failure;
20513 	}
20514 	nla_nest_end(msg, nest);
20515 
20516 	if (req->req.flags & NL80211_SCAN_FLAG_FREQ_KHZ) {
20517 		nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQ_KHZ);
20518 		if (!nest)
20519 			goto nla_put_failure;
20520 		for (i = 0; i < req->req.n_channels; i++) {
20521 			if (nla_put_u32(msg, i,
20522 					ieee80211_channel_to_khz(req->req.channels[i])))
20523 				goto nla_put_failure;
20524 		}
20525 		nla_nest_end(msg, nest);
20526 	} else {
20527 		nest = nla_nest_start_noflag(msg,
20528 					     NL80211_ATTR_SCAN_FREQUENCIES);
20529 		if (!nest)
20530 			goto nla_put_failure;
20531 		for (i = 0; i < req->req.n_channels; i++) {
20532 			if (nla_put_u32(msg, i,
20533 					req->req.channels[i]->center_freq))
20534 				goto nla_put_failure;
20535 		}
20536 		nla_nest_end(msg, nest);
20537 	}
20538 
20539 	if (req->req.ie &&
20540 	    nla_put(msg, NL80211_ATTR_IE, req->req.ie_len, req->req.ie))
20541 		goto nla_put_failure;
20542 
20543 	if (req->req.flags &&
20544 	    nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->req.flags))
20545 		goto nla_put_failure;
20546 
20547 	info = rdev->int_scan_req ? &rdev->int_scan_req->info :
20548 		&rdev->scan_req->info;
20549 	if (info->scan_start_tsf &&
20550 	    (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF,
20551 			       info->scan_start_tsf, NL80211_BSS_PAD) ||
20552 	     nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN,
20553 		     info->tsf_bssid)))
20554 		goto nla_put_failure;
20555 
20556 	return 0;
20557  nla_put_failure:
20558 	return -ENOBUFS;
20559 }
20560 
20561 static int nl80211_prep_scan_msg(struct sk_buff *msg,
20562 				 struct cfg80211_registered_device *rdev,
20563 				 struct wireless_dev *wdev,
20564 				 u32 portid, u32 seq, int flags,
20565 				 u32 cmd)
20566 {
20567 	void *hdr;
20568 
20569 	hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
20570 	if (!hdr)
20571 		return -1;
20572 
20573 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
20574 	    (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
20575 					 wdev->netdev->ifindex)) ||
20576 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
20577 			      NL80211_ATTR_PAD))
20578 		goto nla_put_failure;
20579 
20580 	/* ignore errors and send incomplete event anyway */
20581 	nl80211_add_scan_req(msg, rdev);
20582 
20583 	genlmsg_end(msg, hdr);
20584 	return 0;
20585 
20586  nla_put_failure:
20587 	genlmsg_cancel(msg, hdr);
20588 	return -EMSGSIZE;
20589 }
20590 
20591 static int
20592 nl80211_prep_sched_scan_msg(struct sk_buff *msg,
20593 			    struct cfg80211_sched_scan_request *req, u32 cmd)
20594 {
20595 	void *hdr;
20596 
20597 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
20598 	if (!hdr)
20599 		return -1;
20600 
20601 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY,
20602 			wiphy_to_rdev(req->wiphy)->wiphy_idx) ||
20603 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) ||
20604 	    nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid,
20605 			      NL80211_ATTR_PAD))
20606 		goto nla_put_failure;
20607 
20608 	genlmsg_end(msg, hdr);
20609 	return 0;
20610 
20611  nla_put_failure:
20612 	genlmsg_cancel(msg, hdr);
20613 	return -EMSGSIZE;
20614 }
20615 
20616 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
20617 			     struct wireless_dev *wdev)
20618 {
20619 	struct sk_buff *msg;
20620 
20621 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
20622 	if (!msg)
20623 		return;
20624 
20625 	if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
20626 				  NL80211_CMD_TRIGGER_SCAN) < 0) {
20627 		nlmsg_free(msg);
20628 		return;
20629 	}
20630 
20631 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
20632 				NL80211_MCGRP_SCAN, GFP_KERNEL);
20633 }
20634 
20635 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
20636 				       struct wireless_dev *wdev, bool aborted)
20637 {
20638 	struct sk_buff *msg;
20639 
20640 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
20641 	if (!msg)
20642 		return NULL;
20643 
20644 	if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
20645 				  aborted ? NL80211_CMD_SCAN_ABORTED :
20646 					    NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
20647 		nlmsg_free(msg);
20648 		return NULL;
20649 	}
20650 
20651 	return msg;
20652 }
20653 
20654 /* send message created by nl80211_build_scan_msg() */
20655 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev,
20656 			   struct sk_buff *msg)
20657 {
20658 	if (!msg)
20659 		return;
20660 
20661 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
20662 				NL80211_MCGRP_SCAN, GFP_KERNEL);
20663 }
20664 
20665 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd)
20666 {
20667 	struct sk_buff *msg;
20668 
20669 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
20670 	if (!msg)
20671 		return;
20672 
20673 	if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) {
20674 		nlmsg_free(msg);
20675 		return;
20676 	}
20677 
20678 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0,
20679 				NL80211_MCGRP_SCAN, GFP_KERNEL);
20680 }
20681 
20682 static bool nl80211_reg_change_event_fill(struct sk_buff *msg,
20683 					  struct regulatory_request *request)
20684 {
20685 	/* Userspace can always count this one always being set */
20686 	if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator))
20687 		goto nla_put_failure;
20688 
20689 	if (request->alpha2[0] == '0' && request->alpha2[1] == '0') {
20690 		if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
20691 			       NL80211_REGDOM_TYPE_WORLD))
20692 			goto nla_put_failure;
20693 	} else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') {
20694 		if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
20695 			       NL80211_REGDOM_TYPE_CUSTOM_WORLD))
20696 			goto nla_put_failure;
20697 	} else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
20698 		   request->intersect) {
20699 		if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
20700 			       NL80211_REGDOM_TYPE_INTERSECTION))
20701 			goto nla_put_failure;
20702 	} else {
20703 		if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
20704 			       NL80211_REGDOM_TYPE_COUNTRY) ||
20705 		    nla_put_string(msg, NL80211_ATTR_REG_ALPHA2,
20706 				   request->alpha2))
20707 			goto nla_put_failure;
20708 	}
20709 
20710 	if (request->wiphy_idx != WIPHY_IDX_INVALID) {
20711 		struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx);
20712 
20713 		if (wiphy &&
20714 		    nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx))
20715 			goto nla_put_failure;
20716 
20717 		if (wiphy &&
20718 		    wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
20719 		    nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
20720 			goto nla_put_failure;
20721 	}
20722 
20723 	return true;
20724 
20725 nla_put_failure:
20726 	return false;
20727 }
20728 
20729 /*
20730  * This can happen on global regulatory changes or device specific settings
20731  * based on custom regulatory domains.
20732  */
20733 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id,
20734 				     struct regulatory_request *request)
20735 {
20736 	struct sk_buff *msg;
20737 	void *hdr;
20738 
20739 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
20740 	if (!msg)
20741 		return;
20742 
20743 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id);
20744 	if (!hdr)
20745 		goto nla_put_failure;
20746 
20747 	if (!nl80211_reg_change_event_fill(msg, request))
20748 		goto nla_put_failure;
20749 
20750 	genlmsg_end(msg, hdr);
20751 
20752 	genlmsg_multicast_allns(&nl80211_fam, msg, 0,
20753 				NL80211_MCGRP_REGULATORY);
20754 
20755 	return;
20756 
20757 nla_put_failure:
20758 	nlmsg_free(msg);
20759 }
20760 
20761 struct nl80211_mlme_event {
20762 	enum nl80211_commands cmd;
20763 	const u8 *buf;
20764 	size_t buf_len;
20765 	int uapsd_queues;
20766 	const u8 *req_ies;
20767 	size_t req_ies_len;
20768 	bool reconnect;
20769 };
20770 
20771 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
20772 				    struct net_device *netdev,
20773 				    const struct nl80211_mlme_event *event,
20774 				    gfp_t gfp)
20775 {
20776 	struct sk_buff *msg;
20777 	void *hdr;
20778 
20779 	msg = nlmsg_new(100 + event->buf_len + event->req_ies_len, gfp);
20780 	if (!msg)
20781 		return;
20782 
20783 	hdr = nl80211hdr_put(msg, 0, 0, 0, event->cmd);
20784 	if (!hdr) {
20785 		nlmsg_free(msg);
20786 		return;
20787 	}
20788 
20789 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
20790 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
20791 	    nla_put(msg, NL80211_ATTR_FRAME, event->buf_len, event->buf) ||
20792 	    (event->req_ies &&
20793 	     nla_put(msg, NL80211_ATTR_REQ_IE, event->req_ies_len,
20794 		     event->req_ies)))
20795 		goto nla_put_failure;
20796 
20797 	if (event->reconnect &&
20798 	    nla_put_flag(msg, NL80211_ATTR_RECONNECT_REQUESTED))
20799 		goto nla_put_failure;
20800 
20801 	if (event->uapsd_queues >= 0) {
20802 		struct nlattr *nla_wmm =
20803 			nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME);
20804 		if (!nla_wmm)
20805 			goto nla_put_failure;
20806 
20807 		if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES,
20808 			       event->uapsd_queues))
20809 			goto nla_put_failure;
20810 
20811 		nla_nest_end(msg, nla_wmm);
20812 	}
20813 
20814 	genlmsg_end(msg, hdr);
20815 
20816 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
20817 				NL80211_MCGRP_MLME, gfp);
20818 	return;
20819 
20820  nla_put_failure:
20821 	nlmsg_free(msg);
20822 }
20823 
20824 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
20825 			  struct net_device *netdev, const u8 *buf,
20826 			  size_t len, gfp_t gfp)
20827 {
20828 	struct nl80211_mlme_event event = {
20829 		.cmd = NL80211_CMD_AUTHENTICATE,
20830 		.buf = buf,
20831 		.buf_len = len,
20832 		.uapsd_queues = -1,
20833 	};
20834 
20835 	nl80211_send_mlme_event(rdev, netdev, &event, gfp);
20836 }
20837 
20838 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
20839 			   struct net_device *netdev,
20840 			   const struct cfg80211_rx_assoc_resp_data *data)
20841 {
20842 	struct nl80211_mlme_event event = {
20843 		.cmd = NL80211_CMD_ASSOCIATE,
20844 		.buf = data->buf,
20845 		.buf_len = data->len,
20846 		.uapsd_queues = data->uapsd_queues,
20847 		.req_ies = data->req_ies,
20848 		.req_ies_len = data->req_ies_len,
20849 	};
20850 
20851 	nl80211_send_mlme_event(rdev, netdev, &event, GFP_KERNEL);
20852 }
20853 
20854 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
20855 			 struct net_device *netdev, const u8 *buf,
20856 			 size_t len, bool reconnect, gfp_t gfp)
20857 {
20858 	struct nl80211_mlme_event event = {
20859 		.cmd = NL80211_CMD_DEAUTHENTICATE,
20860 		.buf = buf,
20861 		.buf_len = len,
20862 		.reconnect = reconnect,
20863 		.uapsd_queues = -1,
20864 	};
20865 
20866 	nl80211_send_mlme_event(rdev, netdev, &event, gfp);
20867 }
20868 
20869 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
20870 			   struct net_device *netdev, const u8 *buf,
20871 			   size_t len, bool reconnect, gfp_t gfp)
20872 {
20873 	struct nl80211_mlme_event event = {
20874 		.cmd = NL80211_CMD_DISASSOCIATE,
20875 		.buf = buf,
20876 		.buf_len = len,
20877 		.reconnect = reconnect,
20878 		.uapsd_queues = -1,
20879 	};
20880 
20881 	nl80211_send_mlme_event(rdev, netdev, &event, gfp);
20882 }
20883 
20884 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
20885 				  size_t len)
20886 {
20887 	struct wireless_dev *wdev = dev->ieee80211_ptr;
20888 	struct wiphy *wiphy = wdev->wiphy;
20889 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
20890 	const struct ieee80211_mgmt *mgmt = (void *)buf;
20891 	struct nl80211_mlme_event event = {
20892 		.buf = buf,
20893 		.buf_len = len,
20894 		.uapsd_queues = -1,
20895 	};
20896 
20897 	if (WARN_ON(len < 2))
20898 		return;
20899 
20900 	if (ieee80211_is_deauth(mgmt->frame_control)) {
20901 		event.cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE;
20902 	} else if (ieee80211_is_disassoc(mgmt->frame_control)) {
20903 		event.cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
20904 	} else if (ieee80211_is_beacon(mgmt->frame_control)) {
20905 		if (wdev->unprot_beacon_reported &&
20906 		    elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000)
20907 			return;
20908 		event.cmd = NL80211_CMD_UNPROT_BEACON;
20909 		wdev->unprot_beacon_reported = jiffies;
20910 	} else {
20911 		return;
20912 	}
20913 
20914 	trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
20915 	nl80211_send_mlme_event(rdev, dev, &event, GFP_ATOMIC);
20916 }
20917 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
20918 
20919 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
20920 				      struct net_device *netdev, int cmd,
20921 				      const u8 *addr, gfp_t gfp)
20922 {
20923 	struct sk_buff *msg;
20924 	void *hdr;
20925 
20926 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
20927 	if (!msg)
20928 		return;
20929 
20930 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
20931 	if (!hdr) {
20932 		nlmsg_free(msg);
20933 		return;
20934 	}
20935 
20936 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
20937 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
20938 	    nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
20939 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
20940 		goto nla_put_failure;
20941 
20942 	genlmsg_end(msg, hdr);
20943 
20944 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
20945 				NL80211_MCGRP_MLME, gfp);
20946 	return;
20947 
20948  nla_put_failure:
20949 	nlmsg_free(msg);
20950 }
20951 
20952 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
20953 			       struct net_device *netdev, const u8 *addr,
20954 			       gfp_t gfp)
20955 {
20956 	nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
20957 				  addr, gfp);
20958 }
20959 
20960 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
20961 				struct net_device *netdev, const u8 *addr,
20962 				gfp_t gfp)
20963 {
20964 	nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
20965 				  addr, gfp);
20966 }
20967 
20968 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
20969 				 struct net_device *netdev,
20970 				 struct cfg80211_connect_resp_params *cr,
20971 				 gfp_t gfp)
20972 {
20973 	struct sk_buff *msg;
20974 	void *hdr;
20975 	unsigned int link;
20976 	size_t link_info_size = 0;
20977 	const u8 *connected_addr = cr->valid_links ?
20978 				   cr->ap_mld_addr : cr->links[0].bssid;
20979 
20980 	if (cr->valid_links) {
20981 		for_each_valid_link(cr, link) {
20982 			/* Nested attribute header */
20983 			link_info_size += NLA_HDRLEN;
20984 			/* Link ID */
20985 			link_info_size += nla_total_size(sizeof(u8));
20986 			link_info_size += cr->links[link].addr ?
20987 					  nla_total_size(ETH_ALEN) : 0;
20988 			link_info_size += (cr->links[link].bssid ||
20989 					   cr->links[link].bss) ?
20990 					  nla_total_size(ETH_ALEN) : 0;
20991 			link_info_size += nla_total_size(sizeof(u16));
20992 		}
20993 	}
20994 
20995 	msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len +
20996 			cr->fils.kek_len + cr->fils.pmk_len +
20997 			(cr->fils.pmkid ? WLAN_PMKID_LEN : 0) + link_info_size,
20998 			gfp);
20999 	if (!msg)
21000 		return;
21001 
21002 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
21003 	if (!hdr) {
21004 		nlmsg_free(msg);
21005 		return;
21006 	}
21007 
21008 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21009 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
21010 	    (connected_addr &&
21011 	     nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr)) ||
21012 	    nla_put_u16(msg, NL80211_ATTR_STATUS_CODE,
21013 			cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE :
21014 			cr->status) ||
21015 	    (cr->status < 0 &&
21016 	     (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
21017 	      nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON,
21018 			  cr->timeout_reason))) ||
21019 	    (cr->req_ie &&
21020 	     nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) ||
21021 	    (cr->resp_ie &&
21022 	     nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len,
21023 		     cr->resp_ie)) ||
21024 	    (cr->fils.update_erp_next_seq_num &&
21025 	     nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
21026 			 cr->fils.erp_next_seq_num)) ||
21027 	    (cr->status == WLAN_STATUS_SUCCESS &&
21028 	     ((cr->fils.kek &&
21029 	       nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len,
21030 		       cr->fils.kek)) ||
21031 	      (cr->fils.pmk &&
21032 	       nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) ||
21033 	      (cr->fils.pmkid &&
21034 	       nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid)))) ||
21035 	    (cr->assoc_encrypted &&
21036 	     nla_put_flag(msg, NL80211_ATTR_ASSOC_ENCRYPTED)))
21037 		goto nla_put_failure;
21038 
21039 	if (cr->valid_links) {
21040 		int i = 1;
21041 		struct nlattr *nested;
21042 
21043 		nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS);
21044 		if (!nested)
21045 			goto nla_put_failure;
21046 
21047 		for_each_valid_link(cr, link) {
21048 			struct nlattr *nested_mlo_links;
21049 			const u8 *bssid = cr->links[link].bss ?
21050 					  cr->links[link].bss->bssid :
21051 					  cr->links[link].bssid;
21052 
21053 			nested_mlo_links = nla_nest_start(msg, i);
21054 			if (!nested_mlo_links)
21055 				goto nla_put_failure;
21056 
21057 			if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) ||
21058 			    (bssid &&
21059 			     nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) ||
21060 			    (cr->links[link].addr &&
21061 			     nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN,
21062 				     cr->links[link].addr)) ||
21063 			    nla_put_u16(msg, NL80211_ATTR_STATUS_CODE,
21064 					cr->links[link].status))
21065 				goto nla_put_failure;
21066 
21067 			nla_nest_end(msg, nested_mlo_links);
21068 			i++;
21069 		}
21070 		nla_nest_end(msg, nested);
21071 	}
21072 
21073 	genlmsg_end(msg, hdr);
21074 
21075 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21076 				NL80211_MCGRP_MLME, gfp);
21077 	return;
21078 
21079  nla_put_failure:
21080 	nlmsg_free(msg);
21081 }
21082 
21083 void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
21084 			 struct net_device *netdev,
21085 			 struct cfg80211_roam_info *info, gfp_t gfp)
21086 {
21087 	struct sk_buff *msg;
21088 	void *hdr;
21089 	size_t link_info_size = 0;
21090 	unsigned int link;
21091 	const u8 *connected_addr = info->ap_mld_addr ?
21092 				   info->ap_mld_addr :
21093 				   (info->links[0].bss ?
21094 				    info->links[0].bss->bssid :
21095 				    info->links[0].bssid);
21096 
21097 	if (info->valid_links) {
21098 		for_each_valid_link(info, link) {
21099 			/* Nested attribute header */
21100 			link_info_size += NLA_HDRLEN;
21101 			/* Link ID */
21102 			link_info_size += nla_total_size(sizeof(u8));
21103 			link_info_size += info->links[link].addr ?
21104 					  nla_total_size(ETH_ALEN) : 0;
21105 			link_info_size += (info->links[link].bssid ||
21106 					   info->links[link].bss) ?
21107 					  nla_total_size(ETH_ALEN) : 0;
21108 		}
21109 	}
21110 
21111 	msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len +
21112 			info->fils.kek_len + info->fils.pmk_len +
21113 			(info->fils.pmkid ? WLAN_PMKID_LEN : 0) +
21114 			link_info_size, gfp);
21115 	if (!msg)
21116 		return;
21117 
21118 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
21119 	if (!hdr) {
21120 		nlmsg_free(msg);
21121 		return;
21122 	}
21123 
21124 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21125 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
21126 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr) ||
21127 	    (info->req_ie &&
21128 	     nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len,
21129 		     info->req_ie)) ||
21130 	    (info->resp_ie &&
21131 	     nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len,
21132 		     info->resp_ie)) ||
21133 	    (info->fils.update_erp_next_seq_num &&
21134 	     nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
21135 			 info->fils.erp_next_seq_num)) ||
21136 	    (info->fils.kek &&
21137 	     nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len,
21138 		     info->fils.kek)) ||
21139 	    (info->fils.pmk &&
21140 	     nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) ||
21141 	    (info->fils.pmkid &&
21142 	     nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid)))
21143 		goto nla_put_failure;
21144 
21145 	if (info->valid_links) {
21146 		int i = 1;
21147 		struct nlattr *nested;
21148 
21149 		nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS);
21150 		if (!nested)
21151 			goto nla_put_failure;
21152 
21153 		for_each_valid_link(info, link) {
21154 			struct nlattr *nested_mlo_links;
21155 			const u8 *bssid = info->links[link].bss ?
21156 					  info->links[link].bss->bssid :
21157 					  info->links[link].bssid;
21158 
21159 			nested_mlo_links = nla_nest_start(msg, i);
21160 			if (!nested_mlo_links)
21161 				goto nla_put_failure;
21162 
21163 			if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) ||
21164 			    (bssid &&
21165 			     nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) ||
21166 			    (info->links[link].addr &&
21167 			     nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN,
21168 				     info->links[link].addr)))
21169 				goto nla_put_failure;
21170 
21171 			nla_nest_end(msg, nested_mlo_links);
21172 			i++;
21173 		}
21174 		nla_nest_end(msg, nested);
21175 	}
21176 
21177 	genlmsg_end(msg, hdr);
21178 
21179 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21180 				NL80211_MCGRP_MLME, gfp);
21181 	return;
21182 
21183  nla_put_failure:
21184 	nlmsg_free(msg);
21185 }
21186 
21187 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
21188 				  struct net_device *netdev, const u8 *peer_addr,
21189 				  const u8 *td_bitmap, u8 td_bitmap_len)
21190 {
21191 	struct sk_buff *msg;
21192 	void *hdr;
21193 
21194 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
21195 	if (!msg)
21196 		return;
21197 
21198 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED);
21199 	if (!hdr) {
21200 		nlmsg_free(msg);
21201 		return;
21202 	}
21203 
21204 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21205 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
21206 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer_addr))
21207 		goto nla_put_failure;
21208 
21209 	if (td_bitmap_len > 0 && td_bitmap &&
21210 	    nla_put(msg, NL80211_ATTR_TD_BITMAP, td_bitmap_len, td_bitmap))
21211 		goto nla_put_failure;
21212 
21213 	genlmsg_end(msg, hdr);
21214 
21215 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21216 				NL80211_MCGRP_MLME, GFP_KERNEL);
21217 	return;
21218 
21219  nla_put_failure:
21220 	nlmsg_free(msg);
21221 }
21222 
21223 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
21224 			       struct net_device *netdev, u16 reason,
21225 			       const u8 *ie, size_t ie_len, bool from_ap)
21226 {
21227 	struct sk_buff *msg;
21228 	void *hdr;
21229 
21230 	msg = nlmsg_new(100 + ie_len, GFP_KERNEL);
21231 	if (!msg)
21232 		return;
21233 
21234 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
21235 	if (!hdr) {
21236 		nlmsg_free(msg);
21237 		return;
21238 	}
21239 
21240 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21241 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
21242 	    (reason &&
21243 	     nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) ||
21244 	    (from_ap &&
21245 	     nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) ||
21246 	    (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie)))
21247 		goto nla_put_failure;
21248 
21249 	genlmsg_end(msg, hdr);
21250 
21251 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21252 				NL80211_MCGRP_MLME, GFP_KERNEL);
21253 	return;
21254 
21255  nla_put_failure:
21256 	nlmsg_free(msg);
21257 }
21258 
21259 void cfg80211_links_removed(struct net_device *dev, u16 link_mask)
21260 {
21261 	struct wireless_dev *wdev = dev->ieee80211_ptr;
21262 	struct wiphy *wiphy = wdev->wiphy;
21263 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
21264 	struct sk_buff *msg;
21265 	struct nlattr *links;
21266 	void *hdr;
21267 
21268 	lockdep_assert_wiphy(wdev->wiphy);
21269 	trace_cfg80211_links_removed(dev, link_mask);
21270 
21271 	if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
21272 		    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT))
21273 		return;
21274 
21275 	if (WARN_ON(!wdev->valid_links || !link_mask ||
21276 		    (wdev->valid_links & link_mask) != link_mask ||
21277 		    wdev->valid_links == link_mask))
21278 		return;
21279 
21280 	cfg80211_wdev_release_link_bsses(wdev, link_mask);
21281 	wdev->valid_links &= ~link_mask;
21282 
21283 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
21284 	if (!msg)
21285 		return;
21286 
21287 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_LINKS_REMOVED);
21288 	if (!hdr) {
21289 		nlmsg_free(msg);
21290 		return;
21291 	}
21292 
21293 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21294 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
21295 		goto nla_put_failure;
21296 
21297 	links = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS);
21298 	if (!links)
21299 		goto nla_put_failure;
21300 
21301 	while (link_mask) {
21302 		struct nlattr *link;
21303 		int link_id = __ffs(link_mask);
21304 
21305 		link = nla_nest_start(msg, link_id + 1);
21306 		if (!link)
21307 			goto nla_put_failure;
21308 
21309 		if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))
21310 			goto nla_put_failure;
21311 
21312 		nla_nest_end(msg, link);
21313 		link_mask &= ~(1 << link_id);
21314 	}
21315 
21316 	nla_nest_end(msg, links);
21317 
21318 	genlmsg_end(msg, hdr);
21319 
21320 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21321 				NL80211_MCGRP_MLME, GFP_KERNEL);
21322 	return;
21323 
21324  nla_put_failure:
21325 	nlmsg_free(msg);
21326 }
21327 EXPORT_SYMBOL(cfg80211_links_removed);
21328 
21329 void nl80211_mlo_reconf_add_done(struct net_device *dev,
21330 				 struct cfg80211_mlo_reconf_done_data *data)
21331 {
21332 	struct wireless_dev *wdev = dev->ieee80211_ptr;
21333 	struct wiphy *wiphy = wdev->wiphy;
21334 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
21335 	struct nl80211_mlme_event event = {
21336 		.cmd = NL80211_CMD_ASSOC_MLO_RECONF,
21337 		.buf = data->buf,
21338 		.buf_len = data->len,
21339 		.uapsd_queues = -1,
21340 	};
21341 
21342 	nl80211_send_mlme_event(rdev, dev, &event, GFP_KERNEL);
21343 }
21344 EXPORT_SYMBOL(nl80211_mlo_reconf_add_done);
21345 
21346 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
21347 			     struct net_device *netdev, const u8 *bssid,
21348 			     gfp_t gfp)
21349 {
21350 	struct sk_buff *msg;
21351 	void *hdr;
21352 
21353 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
21354 	if (!msg)
21355 		return;
21356 
21357 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
21358 	if (!hdr) {
21359 		nlmsg_free(msg);
21360 		return;
21361 	}
21362 
21363 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21364 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
21365 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
21366 		goto nla_put_failure;
21367 
21368 	genlmsg_end(msg, hdr);
21369 
21370 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21371 				NL80211_MCGRP_MLME, gfp);
21372 	return;
21373 
21374  nla_put_failure:
21375 	nlmsg_free(msg);
21376 }
21377 
21378 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
21379 					const u8 *ie, size_t ie_len,
21380 					int sig_dbm, gfp_t gfp)
21381 {
21382 	struct wireless_dev *wdev = dev->ieee80211_ptr;
21383 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
21384 	struct sk_buff *msg;
21385 	void *hdr;
21386 
21387 	if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
21388 		return;
21389 
21390 	trace_cfg80211_notify_new_peer_candidate(dev, addr);
21391 
21392 	msg = nlmsg_new(100 + ie_len, gfp);
21393 	if (!msg)
21394 		return;
21395 
21396 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
21397 	if (!hdr) {
21398 		nlmsg_free(msg);
21399 		return;
21400 	}
21401 
21402 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21403 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
21404 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
21405 	    (ie_len && ie &&
21406 	     nla_put(msg, NL80211_ATTR_IE, ie_len, ie)) ||
21407 	    (sig_dbm &&
21408 	     nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)))
21409 		goto nla_put_failure;
21410 
21411 	genlmsg_end(msg, hdr);
21412 
21413 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21414 				NL80211_MCGRP_MLME, gfp);
21415 	return;
21416 
21417  nla_put_failure:
21418 	nlmsg_free(msg);
21419 }
21420 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
21421 
21422 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
21423 				 struct net_device *netdev, const u8 *addr,
21424 				 enum nl80211_key_type key_type, int key_id,
21425 				 const u8 *tsc, gfp_t gfp)
21426 {
21427 	struct sk_buff *msg;
21428 	void *hdr;
21429 
21430 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
21431 	if (!msg)
21432 		return;
21433 
21434 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
21435 	if (!hdr) {
21436 		nlmsg_free(msg);
21437 		return;
21438 	}
21439 
21440 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21441 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
21442 	    (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) ||
21443 	    nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) ||
21444 	    (key_id != -1 &&
21445 	     nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) ||
21446 	    (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc)))
21447 		goto nla_put_failure;
21448 
21449 	genlmsg_end(msg, hdr);
21450 
21451 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21452 				NL80211_MCGRP_MLME, gfp);
21453 	return;
21454 
21455  nla_put_failure:
21456 	nlmsg_free(msg);
21457 }
21458 
21459 void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
21460 				    struct ieee80211_channel *channel_before,
21461 				    struct ieee80211_channel *channel_after)
21462 {
21463 	struct sk_buff *msg;
21464 	void *hdr;
21465 	struct nlattr *nl_freq;
21466 
21467 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
21468 	if (!msg)
21469 		return;
21470 
21471 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
21472 	if (!hdr) {
21473 		nlmsg_free(msg);
21474 		return;
21475 	}
21476 
21477 	/*
21478 	 * Since we are applying the beacon hint to a wiphy we know its
21479 	 * wiphy_idx is valid
21480 	 */
21481 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
21482 		goto nla_put_failure;
21483 
21484 	/* Before */
21485 	nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_BEFORE);
21486 	if (!nl_freq)
21487 		goto nla_put_failure;
21488 
21489 	if (nl80211_msg_put_channel(msg, wiphy, channel_before, false))
21490 		goto nla_put_failure;
21491 	nla_nest_end(msg, nl_freq);
21492 
21493 	/* After */
21494 	nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_AFTER);
21495 	if (!nl_freq)
21496 		goto nla_put_failure;
21497 
21498 	if (nl80211_msg_put_channel(msg, wiphy, channel_after, false))
21499 		goto nla_put_failure;
21500 	nla_nest_end(msg, nl_freq);
21501 
21502 	genlmsg_end(msg, hdr);
21503 
21504 	genlmsg_multicast_allns(&nl80211_fam, msg, 0,
21505 				NL80211_MCGRP_REGULATORY);
21506 
21507 	return;
21508 
21509 nla_put_failure:
21510 	nlmsg_free(msg);
21511 }
21512 
21513 static void nl80211_send_remain_on_chan_event(
21514 	int cmd, struct cfg80211_registered_device *rdev,
21515 	struct wireless_dev *wdev, u64 cookie,
21516 	struct ieee80211_channel *chan,
21517 	unsigned int duration, gfp_t gfp)
21518 {
21519 	struct sk_buff *msg;
21520 	void *hdr;
21521 
21522 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
21523 	if (!msg)
21524 		return;
21525 
21526 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
21527 	if (!hdr) {
21528 		nlmsg_free(msg);
21529 		return;
21530 	}
21531 
21532 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21533 	    (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
21534 					 wdev->netdev->ifindex)) ||
21535 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
21536 			      NL80211_ATTR_PAD) ||
21537 	    nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) ||
21538 	    nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
21539 			NL80211_CHAN_NO_HT) ||
21540 	    nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
21541 			      NL80211_ATTR_PAD))
21542 		goto nla_put_failure;
21543 
21544 	if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL &&
21545 	    nla_put_u32(msg, NL80211_ATTR_DURATION, duration))
21546 		goto nla_put_failure;
21547 
21548 	genlmsg_end(msg, hdr);
21549 
21550 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21551 				NL80211_MCGRP_MLME, gfp);
21552 	return;
21553 
21554  nla_put_failure:
21555 	nlmsg_free(msg);
21556 }
21557 
21558 void cfg80211_assoc_comeback(struct net_device *netdev,
21559 			     const u8 *ap_addr, u32 timeout)
21560 {
21561 	struct wireless_dev *wdev = netdev->ieee80211_ptr;
21562 	struct wiphy *wiphy = wdev->wiphy;
21563 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
21564 	struct sk_buff *msg;
21565 	void *hdr;
21566 
21567 	trace_cfg80211_assoc_comeback(wdev, ap_addr, timeout);
21568 
21569 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
21570 	if (!msg)
21571 		return;
21572 
21573 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ASSOC_COMEBACK);
21574 	if (!hdr) {
21575 		nlmsg_free(msg);
21576 		return;
21577 	}
21578 
21579 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21580 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
21581 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ap_addr) ||
21582 	    nla_put_u32(msg, NL80211_ATTR_TIMEOUT, timeout))
21583 		goto nla_put_failure;
21584 
21585 	genlmsg_end(msg, hdr);
21586 
21587 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21588 				NL80211_MCGRP_MLME, GFP_KERNEL);
21589 	return;
21590 
21591  nla_put_failure:
21592 	nlmsg_free(msg);
21593 }
21594 EXPORT_SYMBOL(cfg80211_assoc_comeback);
21595 
21596 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
21597 			       struct ieee80211_channel *chan,
21598 			       unsigned int duration, gfp_t gfp)
21599 {
21600 	struct wiphy *wiphy = wdev->wiphy;
21601 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
21602 
21603 	trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
21604 	nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
21605 					  rdev, wdev, cookie, chan,
21606 					  duration, gfp);
21607 }
21608 EXPORT_SYMBOL(cfg80211_ready_on_channel);
21609 
21610 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
21611 					struct ieee80211_channel *chan,
21612 					gfp_t gfp)
21613 {
21614 	struct wiphy *wiphy = wdev->wiphy;
21615 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
21616 
21617 	trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
21618 	nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
21619 					  rdev, wdev, cookie, chan, 0, gfp);
21620 }
21621 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
21622 
21623 void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie,
21624 					struct ieee80211_channel *chan,
21625 					gfp_t gfp)
21626 {
21627 	struct wiphy *wiphy = wdev->wiphy;
21628 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
21629 
21630 	trace_cfg80211_tx_mgmt_expired(wdev, cookie, chan);
21631 	nl80211_send_remain_on_chan_event(NL80211_CMD_FRAME_WAIT_CANCEL,
21632 					  rdev, wdev, cookie, chan, 0, gfp);
21633 }
21634 EXPORT_SYMBOL(cfg80211_tx_mgmt_expired);
21635 
21636 void cfg80211_new_sta(struct wireless_dev *wdev, const u8 *mac_addr,
21637 		      struct station_info *sinfo, gfp_t gfp)
21638 {
21639 	struct wiphy *wiphy = wdev->wiphy;
21640 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
21641 	struct sk_buff *msg;
21642 
21643 	trace_cfg80211_new_sta(wdev, mac_addr, sinfo);
21644 
21645 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
21646 	if (!msg)
21647 		return;
21648 
21649 	if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0,
21650 				 rdev, wdev, mac_addr, sinfo, false) < 0) {
21651 		nlmsg_free(msg);
21652 		return;
21653 	}
21654 
21655 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21656 				NL80211_MCGRP_MLME, gfp);
21657 }
21658 EXPORT_SYMBOL(cfg80211_new_sta);
21659 
21660 void cfg80211_del_sta_sinfo(struct wireless_dev *wdev, const u8 *mac_addr,
21661 			    struct station_info *sinfo, gfp_t gfp)
21662 {
21663 	struct wiphy *wiphy = wdev->wiphy;
21664 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
21665 	struct sk_buff *msg;
21666 	struct station_info empty_sinfo = {};
21667 
21668 	if (!sinfo)
21669 		sinfo = &empty_sinfo;
21670 
21671 	trace_cfg80211_del_sta(wdev, mac_addr);
21672 
21673 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
21674 	if (!msg) {
21675 		cfg80211_sinfo_release_content(sinfo);
21676 		return;
21677 	}
21678 
21679 	if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0,
21680 				 rdev, wdev, mac_addr, sinfo, false) < 0) {
21681 		nlmsg_free(msg);
21682 		return;
21683 	}
21684 
21685 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21686 				NL80211_MCGRP_MLME, gfp);
21687 }
21688 EXPORT_SYMBOL(cfg80211_del_sta_sinfo);
21689 
21690 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
21691 			  enum nl80211_connect_failed_reason reason,
21692 			  gfp_t gfp)
21693 {
21694 	struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
21695 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
21696 	struct sk_buff *msg;
21697 	void *hdr;
21698 
21699 	msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
21700 	if (!msg)
21701 		return;
21702 
21703 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
21704 	if (!hdr) {
21705 		nlmsg_free(msg);
21706 		return;
21707 	}
21708 
21709 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
21710 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
21711 	    nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
21712 		goto nla_put_failure;
21713 
21714 	genlmsg_end(msg, hdr);
21715 
21716 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21717 				NL80211_MCGRP_MLME, gfp);
21718 	return;
21719 
21720  nla_put_failure:
21721 	nlmsg_free(msg);
21722 }
21723 EXPORT_SYMBOL(cfg80211_conn_failed);
21724 
21725 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
21726 				       const u8 *addr, int link_id, gfp_t gfp)
21727 {
21728 	struct wireless_dev *wdev = dev->ieee80211_ptr;
21729 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
21730 	struct sk_buff *msg;
21731 	void *hdr;
21732 	u32 nlportid = READ_ONCE(wdev->unexpected_nlportid);
21733 
21734 	if (!nlportid)
21735 		return false;
21736 
21737 	msg = nlmsg_new(100, gfp);
21738 	if (!msg)
21739 		return true;
21740 
21741 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
21742 	if (!hdr) {
21743 		nlmsg_free(msg);
21744 		return true;
21745 	}
21746 
21747 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21748 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
21749 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
21750 	    (link_id >= 0 &&
21751 	     nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)))
21752 		goto nla_put_failure;
21753 
21754 	genlmsg_end(msg, hdr);
21755 	genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
21756 	return true;
21757 
21758  nla_put_failure:
21759 	nlmsg_free(msg);
21760 	return true;
21761 }
21762 
21763 bool cfg80211_rx_spurious_frame(struct net_device *dev, const u8 *addr,
21764 				int link_id, gfp_t gfp)
21765 {
21766 	struct wireless_dev *wdev = dev->ieee80211_ptr;
21767 	bool ret;
21768 
21769 	trace_cfg80211_rx_spurious_frame(dev, addr, link_id);
21770 
21771 	if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
21772 		    wdev->iftype != NL80211_IFTYPE_P2P_GO &&
21773 		    wdev->iftype != NL80211_IFTYPE_NAN_DATA)) {
21774 		trace_cfg80211_return_bool(false);
21775 		return false;
21776 	}
21777 	ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME,
21778 					 addr, link_id, gfp);
21779 	trace_cfg80211_return_bool(ret);
21780 	return ret;
21781 }
21782 EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
21783 
21784 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, const u8 *addr,
21785 					int link_id, gfp_t gfp)
21786 {
21787 	struct wireless_dev *wdev = dev->ieee80211_ptr;
21788 	bool ret;
21789 
21790 	trace_cfg80211_rx_unexpected_4addr_frame(dev, addr, link_id);
21791 
21792 	if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
21793 		    wdev->iftype != NL80211_IFTYPE_P2P_GO &&
21794 		    wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
21795 		trace_cfg80211_return_bool(false);
21796 		return false;
21797 	}
21798 	ret = __nl80211_unexpected_frame(dev,
21799 					 NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
21800 					 addr, link_id, gfp);
21801 	trace_cfg80211_return_bool(ret);
21802 	return ret;
21803 }
21804 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
21805 
21806 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
21807 		      struct wireless_dev *wdev, u32 nlportid,
21808 		      struct cfg80211_rx_info *info, gfp_t gfp)
21809 {
21810 	struct net_device *netdev = wdev->netdev;
21811 	struct sk_buff *msg;
21812 	void *hdr;
21813 
21814 	msg = nlmsg_new(100 + info->len, gfp);
21815 	if (!msg)
21816 		return -ENOMEM;
21817 
21818 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
21819 	if (!hdr) {
21820 		nlmsg_free(msg);
21821 		return -ENOMEM;
21822 	}
21823 
21824 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21825 	    (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
21826 					netdev->ifindex)) ||
21827 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
21828 			      NL80211_ATTR_PAD) ||
21829 	    (info->have_link_id &&
21830 	     nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, info->link_id)) ||
21831 	    nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) ||
21832 	    nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) ||
21833 	    (info->sig_dbm &&
21834 	     nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) ||
21835 	    nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) ||
21836 	    (info->flags &&
21837 	     nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)) ||
21838 	    (info->rx_tstamp && nla_put_u64_64bit(msg,
21839 						  NL80211_ATTR_RX_HW_TIMESTAMP,
21840 						  info->rx_tstamp,
21841 						  NL80211_ATTR_PAD)) ||
21842 	    (info->ack_tstamp && nla_put_u64_64bit(msg,
21843 						   NL80211_ATTR_TX_HW_TIMESTAMP,
21844 						   info->ack_tstamp,
21845 						   NL80211_ATTR_PAD)))
21846 		goto nla_put_failure;
21847 
21848 	genlmsg_end(msg, hdr);
21849 
21850 	return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
21851 
21852  nla_put_failure:
21853 	nlmsg_free(msg);
21854 	return -ENOBUFS;
21855 }
21856 
21857 static void nl80211_frame_tx_status(struct wireless_dev *wdev,
21858 				    struct cfg80211_tx_status *status,
21859 				    gfp_t gfp, enum nl80211_commands command)
21860 {
21861 	struct wiphy *wiphy = wdev->wiphy;
21862 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
21863 	struct net_device *netdev = wdev->netdev;
21864 	struct sk_buff *msg;
21865 	void *hdr;
21866 
21867 	if (command == NL80211_CMD_FRAME_TX_STATUS)
21868 		trace_cfg80211_mgmt_tx_status(wdev, status->cookie,
21869 					      status->ack);
21870 	else
21871 		trace_cfg80211_control_port_tx_status(wdev, status->cookie,
21872 						      status->ack);
21873 
21874 	msg = nlmsg_new(100 + status->len, gfp);
21875 	if (!msg)
21876 		return;
21877 
21878 	hdr = nl80211hdr_put(msg, 0, 0, 0, command);
21879 	if (!hdr) {
21880 		nlmsg_free(msg);
21881 		return;
21882 	}
21883 
21884 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21885 	    (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
21886 				   netdev->ifindex)) ||
21887 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
21888 			      NL80211_ATTR_PAD) ||
21889 	    nla_put(msg, NL80211_ATTR_FRAME, status->len, status->buf) ||
21890 	    nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, status->cookie,
21891 			      NL80211_ATTR_PAD) ||
21892 	    (status->ack && nla_put_flag(msg, NL80211_ATTR_ACK)) ||
21893 	    (status->tx_tstamp &&
21894 	     nla_put_u64_64bit(msg, NL80211_ATTR_TX_HW_TIMESTAMP,
21895 			       status->tx_tstamp, NL80211_ATTR_PAD)) ||
21896 	    (status->ack_tstamp &&
21897 	     nla_put_u64_64bit(msg, NL80211_ATTR_RX_HW_TIMESTAMP,
21898 			       status->ack_tstamp, NL80211_ATTR_PAD)))
21899 		goto nla_put_failure;
21900 
21901 	genlmsg_end(msg, hdr);
21902 
21903 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
21904 				NL80211_MCGRP_MLME, gfp);
21905 	return;
21906 
21907 nla_put_failure:
21908 	nlmsg_free(msg);
21909 }
21910 
21911 void cfg80211_control_port_tx_status(struct wireless_dev *wdev, u64 cookie,
21912 				     const u8 *buf, size_t len, bool ack,
21913 				     gfp_t gfp)
21914 {
21915 	struct cfg80211_tx_status status = {
21916 		.cookie = cookie,
21917 		.buf = buf,
21918 		.len = len,
21919 		.ack = ack
21920 	};
21921 
21922 	nl80211_frame_tx_status(wdev, &status, gfp,
21923 				NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS);
21924 }
21925 EXPORT_SYMBOL(cfg80211_control_port_tx_status);
21926 
21927 void cfg80211_mgmt_tx_status_ext(struct wireless_dev *wdev,
21928 				 struct cfg80211_tx_status *status, gfp_t gfp)
21929 {
21930 	nl80211_frame_tx_status(wdev, status, gfp, NL80211_CMD_FRAME_TX_STATUS);
21931 }
21932 EXPORT_SYMBOL(cfg80211_mgmt_tx_status_ext);
21933 
21934 static int __nl80211_rx_control_port(struct net_device *dev,
21935 				     struct sk_buff *skb,
21936 				     bool unencrypted,
21937 				     int link_id,
21938 				     gfp_t gfp)
21939 {
21940 	struct wireless_dev *wdev = dev->ieee80211_ptr;
21941 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
21942 	struct ethhdr *ehdr = eth_hdr(skb);
21943 	const u8 *addr = ehdr->h_source;
21944 	u16 proto = be16_to_cpu(skb->protocol);
21945 	struct sk_buff *msg;
21946 	void *hdr;
21947 	struct nlattr *frame;
21948 
21949 	u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid);
21950 
21951 	if (!nlportid)
21952 		return -ENOENT;
21953 
21954 	msg = nlmsg_new(100 + skb->len, gfp);
21955 	if (!msg)
21956 		return -ENOMEM;
21957 
21958 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONTROL_PORT_FRAME);
21959 	if (!hdr) {
21960 		nlmsg_free(msg);
21961 		return -ENOBUFS;
21962 	}
21963 
21964 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
21965 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
21966 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
21967 			      NL80211_ATTR_PAD) ||
21968 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
21969 	    nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) ||
21970 	    (link_id >= 0 &&
21971 	     nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) ||
21972 	    (unencrypted && nla_put_flag(msg,
21973 					 NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT)))
21974 		goto nla_put_failure;
21975 
21976 	frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len);
21977 	if (!frame)
21978 		goto nla_put_failure;
21979 
21980 	skb_copy_bits(skb, 0, nla_data(frame), skb->len);
21981 	genlmsg_end(msg, hdr);
21982 
21983 	return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
21984 
21985  nla_put_failure:
21986 	nlmsg_free(msg);
21987 	return -ENOBUFS;
21988 }
21989 
21990 bool cfg80211_rx_control_port(struct net_device *dev, struct sk_buff *skb,
21991 			      bool unencrypted, int link_id)
21992 {
21993 	int ret;
21994 
21995 	trace_cfg80211_rx_control_port(dev, skb, unencrypted, link_id);
21996 	ret = __nl80211_rx_control_port(dev, skb, unencrypted, link_id,
21997 					GFP_ATOMIC);
21998 	trace_cfg80211_return_bool(ret == 0);
21999 	return ret == 0;
22000 }
22001 EXPORT_SYMBOL(cfg80211_rx_control_port);
22002 
22003 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev,
22004 					    const char *mac, gfp_t gfp)
22005 {
22006 	struct wireless_dev *wdev = dev->ieee80211_ptr;
22007 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
22008 	struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
22009 	void **cb;
22010 
22011 	if (!msg)
22012 		return NULL;
22013 
22014 	cb = (void **)msg->cb;
22015 
22016 	cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
22017 	if (!cb[0]) {
22018 		nlmsg_free(msg);
22019 		return NULL;
22020 	}
22021 
22022 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
22023 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
22024 		goto nla_put_failure;
22025 
22026 	if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
22027 		goto nla_put_failure;
22028 
22029 	cb[1] = nla_nest_start_noflag(msg, NL80211_ATTR_CQM);
22030 	if (!cb[1])
22031 		goto nla_put_failure;
22032 
22033 	cb[2] = rdev;
22034 
22035 	return msg;
22036  nla_put_failure:
22037 	nlmsg_free(msg);
22038 	return NULL;
22039 }
22040 
22041 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp)
22042 {
22043 	void **cb = (void **)msg->cb;
22044 	struct cfg80211_registered_device *rdev = cb[2];
22045 
22046 	nla_nest_end(msg, cb[1]);
22047 	genlmsg_end(msg, cb[0]);
22048 
22049 	memset(msg->cb, 0, sizeof(msg->cb));
22050 
22051 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
22052 				NL80211_MCGRP_MLME, gfp);
22053 }
22054 
22055 void cfg80211_cqm_rssi_notify(struct net_device *dev,
22056 			      enum nl80211_cqm_rssi_threshold_event rssi_event,
22057 			      s32 rssi_level, gfp_t gfp)
22058 {
22059 	struct wireless_dev *wdev = dev->ieee80211_ptr;
22060 	struct cfg80211_cqm_config *cqm_config;
22061 
22062 	trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level);
22063 
22064 	if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
22065 		    rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
22066 		return;
22067 
22068 	rcu_read_lock();
22069 	cqm_config = rcu_dereference(wdev->cqm_config);
22070 	if (cqm_config) {
22071 		cqm_config->last_rssi_event_value = rssi_level;
22072 		cqm_config->last_rssi_event_type = rssi_event;
22073 		wiphy_work_queue(wdev->wiphy, &wdev->cqm_rssi_work);
22074 	}
22075 	rcu_read_unlock();
22076 }
22077 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
22078 
22079 void cfg80211_cqm_rssi_notify_work(struct wiphy *wiphy, struct wiphy_work *work)
22080 {
22081 	struct wireless_dev *wdev = container_of(work, struct wireless_dev,
22082 						 cqm_rssi_work);
22083 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
22084 	enum nl80211_cqm_rssi_threshold_event rssi_event;
22085 	struct cfg80211_cqm_config *cqm_config;
22086 	struct sk_buff *msg;
22087 	s32 rssi_level;
22088 
22089 	cqm_config = wiphy_dereference(wdev->wiphy, wdev->cqm_config);
22090 	if (!cqm_config)
22091 		return;
22092 
22093 	if (cqm_config->use_range_api)
22094 		cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config);
22095 
22096 	rssi_level = cqm_config->last_rssi_event_value;
22097 	rssi_event = cqm_config->last_rssi_event_type;
22098 
22099 	msg = cfg80211_prepare_cqm(wdev->netdev, NULL, GFP_KERNEL);
22100 	if (!msg)
22101 		return;
22102 
22103 	if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
22104 			rssi_event))
22105 		goto nla_put_failure;
22106 
22107 	if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL,
22108 				      rssi_level))
22109 		goto nla_put_failure;
22110 
22111 	cfg80211_send_cqm(msg, GFP_KERNEL);
22112 
22113 	return;
22114 
22115  nla_put_failure:
22116 	nlmsg_free(msg);
22117 }
22118 
22119 void cfg80211_cqm_txe_notify(struct net_device *dev,
22120 			     const u8 *peer, u32 num_packets,
22121 			     u32 rate, u32 intvl, gfp_t gfp)
22122 {
22123 	struct sk_buff *msg;
22124 
22125 	msg = cfg80211_prepare_cqm(dev, peer, gfp);
22126 	if (!msg)
22127 		return;
22128 
22129 	if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets))
22130 		goto nla_put_failure;
22131 
22132 	if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate))
22133 		goto nla_put_failure;
22134 
22135 	if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl))
22136 		goto nla_put_failure;
22137 
22138 	cfg80211_send_cqm(msg, gfp);
22139 	return;
22140 
22141  nla_put_failure:
22142 	nlmsg_free(msg);
22143 }
22144 EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
22145 
22146 void cfg80211_cqm_pktloss_notify(struct net_device *dev,
22147 				 const u8 *peer, u32 num_packets, gfp_t gfp)
22148 {
22149 	struct sk_buff *msg;
22150 
22151 	trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
22152 
22153 	msg = cfg80211_prepare_cqm(dev, peer, gfp);
22154 	if (!msg)
22155 		return;
22156 
22157 	if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets))
22158 		goto nla_put_failure;
22159 
22160 	cfg80211_send_cqm(msg, gfp);
22161 	return;
22162 
22163  nla_put_failure:
22164 	nlmsg_free(msg);
22165 }
22166 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
22167 
22168 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp)
22169 {
22170 	struct sk_buff *msg;
22171 
22172 	msg = cfg80211_prepare_cqm(dev, NULL, gfp);
22173 	if (!msg)
22174 		return;
22175 
22176 	if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT))
22177 		goto nla_put_failure;
22178 
22179 	cfg80211_send_cqm(msg, gfp);
22180 	return;
22181 
22182  nla_put_failure:
22183 	nlmsg_free(msg);
22184 }
22185 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify);
22186 
22187 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
22188 				     struct net_device *netdev, const u8 *bssid,
22189 				     const u8 *replay_ctr, gfp_t gfp)
22190 {
22191 	struct sk_buff *msg;
22192 	struct nlattr *rekey_attr;
22193 	void *hdr;
22194 
22195 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
22196 	if (!msg)
22197 		return;
22198 
22199 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD);
22200 	if (!hdr) {
22201 		nlmsg_free(msg);
22202 		return;
22203 	}
22204 
22205 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
22206 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
22207 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
22208 		goto nla_put_failure;
22209 
22210 	rekey_attr = nla_nest_start_noflag(msg, NL80211_ATTR_REKEY_DATA);
22211 	if (!rekey_attr)
22212 		goto nla_put_failure;
22213 
22214 	if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR,
22215 		    NL80211_REPLAY_CTR_LEN, replay_ctr))
22216 		goto nla_put_failure;
22217 
22218 	nla_nest_end(msg, rekey_attr);
22219 
22220 	genlmsg_end(msg, hdr);
22221 
22222 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
22223 				NL80211_MCGRP_MLME, gfp);
22224 	return;
22225 
22226  nla_put_failure:
22227 	nlmsg_free(msg);
22228 }
22229 
22230 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
22231 			       const u8 *replay_ctr, gfp_t gfp)
22232 {
22233 	struct wireless_dev *wdev = dev->ieee80211_ptr;
22234 	struct wiphy *wiphy = wdev->wiphy;
22235 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
22236 
22237 	trace_cfg80211_gtk_rekey_notify(dev, bssid);
22238 	nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
22239 }
22240 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
22241 
22242 static void
22243 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
22244 			       struct net_device *netdev, int index,
22245 			       const u8 *bssid, bool preauth, gfp_t gfp)
22246 {
22247 	struct sk_buff *msg;
22248 	struct nlattr *attr;
22249 	void *hdr;
22250 
22251 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
22252 	if (!msg)
22253 		return;
22254 
22255 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE);
22256 	if (!hdr) {
22257 		nlmsg_free(msg);
22258 		return;
22259 	}
22260 
22261 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
22262 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
22263 		goto nla_put_failure;
22264 
22265 	attr = nla_nest_start_noflag(msg, NL80211_ATTR_PMKSA_CANDIDATE);
22266 	if (!attr)
22267 		goto nla_put_failure;
22268 
22269 	if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) ||
22270 	    nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) ||
22271 	    (preauth &&
22272 	     nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH)))
22273 		goto nla_put_failure;
22274 
22275 	nla_nest_end(msg, attr);
22276 
22277 	genlmsg_end(msg, hdr);
22278 
22279 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
22280 				NL80211_MCGRP_MLME, gfp);
22281 	return;
22282 
22283  nla_put_failure:
22284 	nlmsg_free(msg);
22285 }
22286 
22287 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
22288 				     const u8 *bssid, bool preauth, gfp_t gfp)
22289 {
22290 	struct wireless_dev *wdev = dev->ieee80211_ptr;
22291 	struct wiphy *wiphy = wdev->wiphy;
22292 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
22293 
22294 	trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
22295 	nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
22296 }
22297 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
22298 
22299 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
22300 				     struct net_device *netdev,
22301 				     unsigned int link_id,
22302 				     struct cfg80211_chan_def *chandef,
22303 				     gfp_t gfp,
22304 				     enum nl80211_commands notif,
22305 				     u8 count, bool quiet)
22306 {
22307 	struct wireless_dev *wdev = netdev->ieee80211_ptr;
22308 	struct sk_buff *msg;
22309 	void *hdr;
22310 
22311 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
22312 	if (!msg)
22313 		return;
22314 
22315 	hdr = nl80211hdr_put(msg, 0, 0, 0, notif);
22316 	if (!hdr) {
22317 		nlmsg_free(msg);
22318 		return;
22319 	}
22320 
22321 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
22322 		goto nla_put_failure;
22323 
22324 	if (wdev->valid_links &&
22325 	    nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))
22326 		goto nla_put_failure;
22327 
22328 	if (nl80211_send_chandef(msg, chandef))
22329 		goto nla_put_failure;
22330 
22331 	if (notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) {
22332 		if (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count))
22333 			goto nla_put_failure;
22334 		if (quiet &&
22335 		    nla_put_flag(msg, NL80211_ATTR_CH_SWITCH_BLOCK_TX))
22336 			goto nla_put_failure;
22337 	}
22338 
22339 	genlmsg_end(msg, hdr);
22340 
22341 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
22342 				NL80211_MCGRP_MLME, gfp);
22343 	return;
22344 
22345  nla_put_failure:
22346 	nlmsg_free(msg);
22347 }
22348 
22349 void cfg80211_ch_switch_notify(struct net_device *dev,
22350 			       struct cfg80211_chan_def *chandef,
22351 			       unsigned int link_id)
22352 {
22353 	struct wireless_dev *wdev = dev->ieee80211_ptr;
22354 	struct wiphy *wiphy = wdev->wiphy;
22355 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
22356 
22357 	lockdep_assert_wiphy(wdev->wiphy);
22358 	WARN_INVALID_LINK_ID(wdev, link_id);
22359 
22360 	trace_cfg80211_ch_switch_notify(dev, chandef, link_id);
22361 
22362 	switch (wdev->iftype) {
22363 	case NL80211_IFTYPE_STATION:
22364 	case NL80211_IFTYPE_P2P_CLIENT:
22365 		if (!WARN_ON(!wdev->links[link_id].client.current_bss))
22366 			cfg80211_update_assoc_bss_entry(wdev, link_id,
22367 							chandef->chan);
22368 		break;
22369 	case NL80211_IFTYPE_MESH_POINT:
22370 		wdev->u.mesh.chandef = *chandef;
22371 		wdev->u.mesh.preset_chandef = *chandef;
22372 		break;
22373 	case NL80211_IFTYPE_AP:
22374 	case NL80211_IFTYPE_P2P_GO:
22375 		wdev->links[link_id].ap.chandef = *chandef;
22376 		break;
22377 	case NL80211_IFTYPE_ADHOC:
22378 		wdev->u.ibss.chandef = *chandef;
22379 		break;
22380 	default:
22381 		WARN_ON(1);
22382 		break;
22383 	}
22384 
22385 	cfg80211_schedule_channels_check(wdev);
22386 	cfg80211_sched_dfs_chan_update(rdev);
22387 
22388 	nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL,
22389 				 NL80211_CMD_CH_SWITCH_NOTIFY, 0, false);
22390 }
22391 EXPORT_SYMBOL(cfg80211_ch_switch_notify);
22392 
22393 void cfg80211_incumbent_signal_notify(struct wiphy *wiphy,
22394 				      const struct cfg80211_chan_def *chandef,
22395 				      u32 signal_interference_bitmap,
22396 				      gfp_t gfp)
22397 {
22398 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
22399 	struct sk_buff *msg;
22400 	void *hdr;
22401 
22402 	trace_cfg80211_incumbent_signal_notify(wiphy, chandef, signal_interference_bitmap);
22403 
22404 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
22405 	if (!msg)
22406 		return;
22407 
22408 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_INCUMBENT_SIGNAL_DETECT);
22409 	if (!hdr)
22410 		goto nla_put_failure;
22411 
22412 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
22413 		goto nla_put_failure;
22414 
22415 	if (nl80211_send_chandef(msg, chandef))
22416 		goto nla_put_failure;
22417 
22418 	if (nla_put_u32(msg, NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP,
22419 			signal_interference_bitmap))
22420 		goto nla_put_failure;
22421 
22422 	genlmsg_end(msg, hdr);
22423 
22424 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
22425 				NL80211_MCGRP_MLME, gfp);
22426 	return;
22427 
22428 nla_put_failure:
22429 	nlmsg_free(msg);
22430 }
22431 EXPORT_SYMBOL(cfg80211_incumbent_signal_notify);
22432 
22433 void cfg80211_ch_switch_started_notify(struct net_device *dev,
22434 				       struct cfg80211_chan_def *chandef,
22435 				       unsigned int link_id, u8 count,
22436 				       bool quiet)
22437 {
22438 	struct wireless_dev *wdev = dev->ieee80211_ptr;
22439 	struct wiphy *wiphy = wdev->wiphy;
22440 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
22441 
22442 	lockdep_assert_wiphy(wdev->wiphy);
22443 	WARN_INVALID_LINK_ID(wdev, link_id);
22444 
22445 	trace_cfg80211_ch_switch_started_notify(dev, chandef, link_id);
22446 
22447 
22448 	nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL,
22449 				 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY,
22450 				 count, quiet);
22451 }
22452 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
22453 
22454 int cfg80211_bss_color_notify(struct net_device *dev,
22455 			      enum nl80211_commands cmd, u8 count,
22456 			      u64 color_bitmap, u8 link_id)
22457 {
22458 	struct wireless_dev *wdev = dev->ieee80211_ptr;
22459 	struct wiphy *wiphy = wdev->wiphy;
22460 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
22461 	struct sk_buff *msg;
22462 	void *hdr;
22463 
22464 	lockdep_assert_wiphy(wdev->wiphy);
22465 
22466 	trace_cfg80211_bss_color_notify(dev, cmd, count, color_bitmap);
22467 
22468 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
22469 	if (!msg)
22470 		return -ENOMEM;
22471 
22472 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
22473 	if (!hdr)
22474 		goto nla_put_failure;
22475 
22476 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
22477 		goto nla_put_failure;
22478 
22479 	if (wdev->valid_links &&
22480 	    nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))
22481 		goto nla_put_failure;
22482 
22483 	if (cmd == NL80211_CMD_COLOR_CHANGE_STARTED &&
22484 	    nla_put_u32(msg, NL80211_ATTR_COLOR_CHANGE_COUNT, count))
22485 		goto nla_put_failure;
22486 
22487 	if (cmd == NL80211_CMD_OBSS_COLOR_COLLISION &&
22488 	    nla_put_u64_64bit(msg, NL80211_ATTR_OBSS_COLOR_BITMAP,
22489 			      color_bitmap, NL80211_ATTR_PAD))
22490 		goto nla_put_failure;
22491 
22492 	genlmsg_end(msg, hdr);
22493 
22494 	return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
22495 				       msg, 0, NL80211_MCGRP_MLME, GFP_KERNEL);
22496 
22497 nla_put_failure:
22498 	nlmsg_free(msg);
22499 	return -EINVAL;
22500 }
22501 EXPORT_SYMBOL(cfg80211_bss_color_notify);
22502 
22503 void
22504 nl80211_radar_notify(struct cfg80211_registered_device *rdev,
22505 		     const struct cfg80211_chan_def *chandef,
22506 		     enum nl80211_radar_event event,
22507 		     struct net_device *netdev, gfp_t gfp)
22508 {
22509 	struct sk_buff *msg;
22510 	void *hdr;
22511 
22512 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
22513 	if (!msg)
22514 		return;
22515 
22516 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT);
22517 	if (!hdr) {
22518 		nlmsg_free(msg);
22519 		return;
22520 	}
22521 
22522 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
22523 		goto nla_put_failure;
22524 
22525 	/* NOP and radar events don't need a netdev parameter */
22526 	if (netdev) {
22527 		struct wireless_dev *wdev = netdev->ieee80211_ptr;
22528 
22529 		if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
22530 		    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
22531 				      NL80211_ATTR_PAD))
22532 			goto nla_put_failure;
22533 	}
22534 
22535 	if (rdev->background_radar_wdev &&
22536 	    cfg80211_chandef_identical(&rdev->background_radar_chandef,
22537 				       chandef)) {
22538 		if (nla_put_flag(msg, NL80211_ATTR_RADAR_BACKGROUND))
22539 			goto nla_put_failure;
22540 	}
22541 
22542 	if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
22543 		goto nla_put_failure;
22544 
22545 	if (nl80211_send_chandef(msg, chandef))
22546 		goto nla_put_failure;
22547 
22548 	genlmsg_end(msg, hdr);
22549 
22550 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
22551 				NL80211_MCGRP_MLME, gfp);
22552 	return;
22553 
22554  nla_put_failure:
22555 	nlmsg_free(msg);
22556 }
22557 
22558 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac,
22559 				       struct sta_opmode_info *sta_opmode,
22560 				       gfp_t gfp)
22561 {
22562 	struct sk_buff *msg;
22563 	struct wireless_dev *wdev = dev->ieee80211_ptr;
22564 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
22565 	void *hdr;
22566 
22567 	if (WARN_ON(!mac))
22568 		return;
22569 
22570 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
22571 	if (!msg)
22572 		return;
22573 
22574 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED);
22575 	if (!hdr) {
22576 		nlmsg_free(msg);
22577 		return;
22578 	}
22579 
22580 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
22581 		goto nla_put_failure;
22582 
22583 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
22584 		goto nla_put_failure;
22585 
22586 	if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
22587 		goto nla_put_failure;
22588 
22589 	if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) &&
22590 	    nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode))
22591 		goto nla_put_failure;
22592 
22593 	if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) &&
22594 	    nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw))
22595 		goto nla_put_failure;
22596 
22597 	if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) &&
22598 	    nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss))
22599 		goto nla_put_failure;
22600 
22601 	genlmsg_end(msg, hdr);
22602 
22603 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
22604 				NL80211_MCGRP_MLME, gfp);
22605 
22606 	return;
22607 
22608 nla_put_failure:
22609 	nlmsg_free(msg);
22610 }
22611 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify);
22612 
22613 void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
22614 			   u64 cookie, bool acked, s32 ack_signal,
22615 			   bool is_valid_ack_signal, gfp_t gfp)
22616 {
22617 	struct wireless_dev *wdev = dev->ieee80211_ptr;
22618 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
22619 	struct sk_buff *msg;
22620 	void *hdr;
22621 
22622 	trace_cfg80211_probe_status(dev, addr, cookie, acked);
22623 
22624 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
22625 
22626 	if (!msg)
22627 		return;
22628 
22629 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT);
22630 	if (!hdr) {
22631 		nlmsg_free(msg);
22632 		return;
22633 	}
22634 
22635 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
22636 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
22637 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
22638 	    nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
22639 			      NL80211_ATTR_PAD) ||
22640 	    (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) ||
22641 	    (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL,
22642 						ack_signal)))
22643 		goto nla_put_failure;
22644 
22645 	genlmsg_end(msg, hdr);
22646 
22647 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
22648 				NL80211_MCGRP_MLME, gfp);
22649 	return;
22650 
22651  nla_put_failure:
22652 	nlmsg_free(msg);
22653 }
22654 EXPORT_SYMBOL(cfg80211_probe_status);
22655 
22656 void cfg80211_report_obss_beacon_khz(struct wiphy *wiphy, const u8 *frame,
22657 				     size_t len, int freq, int sig_dbm)
22658 {
22659 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
22660 	struct sk_buff *msg;
22661 	void *hdr;
22662 	struct cfg80211_beacon_registration *reg;
22663 
22664 	trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm);
22665 
22666 	spin_lock_bh(&rdev->beacon_registrations_lock);
22667 	list_for_each_entry(reg, &rdev->beacon_registrations, list) {
22668 		msg = nlmsg_new(len + 100, GFP_ATOMIC);
22669 		if (!msg) {
22670 			spin_unlock_bh(&rdev->beacon_registrations_lock);
22671 			return;
22672 		}
22673 
22674 		hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
22675 		if (!hdr)
22676 			goto nla_put_failure;
22677 
22678 		if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
22679 		    (freq &&
22680 		     (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ,
22681 				  KHZ_TO_MHZ(freq)) ||
22682 		      nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET,
22683 				  freq % 1000))) ||
22684 		    (sig_dbm &&
22685 		     nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
22686 		    nla_put(msg, NL80211_ATTR_FRAME, len, frame))
22687 			goto nla_put_failure;
22688 
22689 		genlmsg_end(msg, hdr);
22690 
22691 		genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid);
22692 	}
22693 	spin_unlock_bh(&rdev->beacon_registrations_lock);
22694 	return;
22695 
22696  nla_put_failure:
22697 	spin_unlock_bh(&rdev->beacon_registrations_lock);
22698 	nlmsg_free(msg);
22699 }
22700 EXPORT_SYMBOL(cfg80211_report_obss_beacon_khz);
22701 
22702 #ifdef CONFIG_PM
22703 static int cfg80211_net_detect_results(struct sk_buff *msg,
22704 				       struct cfg80211_wowlan_wakeup *wakeup)
22705 {
22706 	struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect;
22707 	struct nlattr *nl_results, *nl_match, *nl_freqs;
22708 	int i, j;
22709 
22710 	nl_results = nla_nest_start_noflag(msg,
22711 					   NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS);
22712 	if (!nl_results)
22713 		return -EMSGSIZE;
22714 
22715 	for (i = 0; i < nd->n_matches; i++) {
22716 		struct cfg80211_wowlan_nd_match *match = nd->matches[i];
22717 
22718 		nl_match = nla_nest_start_noflag(msg, i);
22719 		if (!nl_match)
22720 			break;
22721 
22722 		/* The SSID attribute is optional in nl80211, but for
22723 		 * simplicity reasons it's always present in the
22724 		 * cfg80211 structure.  If a driver can't pass the
22725 		 * SSID, that needs to be changed.  A zero length SSID
22726 		 * is still a valid SSID (wildcard), so it cannot be
22727 		 * used for this purpose.
22728 		 */
22729 		if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len,
22730 			    match->ssid.ssid)) {
22731 			nla_nest_cancel(msg, nl_match);
22732 			goto out;
22733 		}
22734 
22735 		if (match->n_channels) {
22736 			nl_freqs = nla_nest_start_noflag(msg,
22737 							 NL80211_ATTR_SCAN_FREQUENCIES);
22738 			if (!nl_freqs) {
22739 				nla_nest_cancel(msg, nl_match);
22740 				goto out;
22741 			}
22742 
22743 			for (j = 0; j < match->n_channels; j++) {
22744 				if (nla_put_u32(msg, j, match->channels[j])) {
22745 					nla_nest_cancel(msg, nl_freqs);
22746 					nla_nest_cancel(msg, nl_match);
22747 					goto out;
22748 				}
22749 			}
22750 
22751 			nla_nest_end(msg, nl_freqs);
22752 		}
22753 
22754 		nla_nest_end(msg, nl_match);
22755 	}
22756 
22757 out:
22758 	nla_nest_end(msg, nl_results);
22759 	return 0;
22760 }
22761 
22762 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
22763 				   struct cfg80211_wowlan_wakeup *wakeup,
22764 				   gfp_t gfp)
22765 {
22766 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
22767 	struct sk_buff *msg;
22768 	void *hdr;
22769 	int size = 200;
22770 
22771 	trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup);
22772 
22773 	if (wakeup)
22774 		size += wakeup->packet_present_len;
22775 
22776 	msg = nlmsg_new(size, gfp);
22777 	if (!msg)
22778 		return;
22779 
22780 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN);
22781 	if (!hdr)
22782 		goto free_msg;
22783 
22784 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
22785 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
22786 			      NL80211_ATTR_PAD))
22787 		goto free_msg;
22788 
22789 	if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
22790 					wdev->netdev->ifindex))
22791 		goto free_msg;
22792 
22793 	if (wakeup) {
22794 		struct nlattr *reasons;
22795 
22796 		reasons = nla_nest_start_noflag(msg,
22797 						NL80211_ATTR_WOWLAN_TRIGGERS);
22798 		if (!reasons)
22799 			goto free_msg;
22800 
22801 		if (wakeup->disconnect &&
22802 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT))
22803 			goto free_msg;
22804 		if (wakeup->magic_pkt &&
22805 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT))
22806 			goto free_msg;
22807 		if (wakeup->gtk_rekey_failure &&
22808 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE))
22809 			goto free_msg;
22810 		if (wakeup->eap_identity_req &&
22811 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST))
22812 			goto free_msg;
22813 		if (wakeup->four_way_handshake &&
22814 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE))
22815 			goto free_msg;
22816 		if (wakeup->rfkill_release &&
22817 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))
22818 			goto free_msg;
22819 
22820 		if (wakeup->pattern_idx >= 0 &&
22821 		    nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
22822 				wakeup->pattern_idx))
22823 			goto free_msg;
22824 
22825 		if (wakeup->tcp_match &&
22826 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH))
22827 			goto free_msg;
22828 
22829 		if (wakeup->tcp_connlost &&
22830 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST))
22831 			goto free_msg;
22832 
22833 		if (wakeup->tcp_nomoretokens &&
22834 		    nla_put_flag(msg,
22835 				 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS))
22836 			goto free_msg;
22837 
22838 		if (wakeup->unprot_deauth_disassoc &&
22839 		    nla_put_flag(msg,
22840 				 NL80211_WOWLAN_TRIG_UNPROTECTED_DEAUTH_DISASSOC))
22841 			goto free_msg;
22842 
22843 		if (wakeup->packet) {
22844 			u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211;
22845 			u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN;
22846 
22847 			if (!wakeup->packet_80211) {
22848 				pkt_attr =
22849 					NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023;
22850 				len_attr =
22851 					NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN;
22852 			}
22853 
22854 			if (wakeup->packet_len &&
22855 			    nla_put_u32(msg, len_attr, wakeup->packet_len))
22856 				goto free_msg;
22857 
22858 			if (nla_put(msg, pkt_attr, wakeup->packet_present_len,
22859 				    wakeup->packet))
22860 				goto free_msg;
22861 		}
22862 
22863 		if (wakeup->net_detect &&
22864 		    cfg80211_net_detect_results(msg, wakeup))
22865 				goto free_msg;
22866 
22867 		nla_nest_end(msg, reasons);
22868 	}
22869 
22870 	genlmsg_end(msg, hdr);
22871 
22872 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
22873 				NL80211_MCGRP_MLME, gfp);
22874 	return;
22875 
22876  free_msg:
22877 	nlmsg_free(msg);
22878 }
22879 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup);
22880 #endif
22881 
22882 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
22883 				enum nl80211_tdls_operation oper,
22884 				u16 reason_code, gfp_t gfp)
22885 {
22886 	struct wireless_dev *wdev = dev->ieee80211_ptr;
22887 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
22888 	struct sk_buff *msg;
22889 	void *hdr;
22890 
22891 	trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper,
22892 					 reason_code);
22893 
22894 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
22895 	if (!msg)
22896 		return;
22897 
22898 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER);
22899 	if (!hdr) {
22900 		nlmsg_free(msg);
22901 		return;
22902 	}
22903 
22904 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
22905 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
22906 	    nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) ||
22907 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) ||
22908 	    (reason_code > 0 &&
22909 	     nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code)))
22910 		goto nla_put_failure;
22911 
22912 	genlmsg_end(msg, hdr);
22913 
22914 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
22915 				NL80211_MCGRP_MLME, gfp);
22916 	return;
22917 
22918  nla_put_failure:
22919 	nlmsg_free(msg);
22920 }
22921 EXPORT_SYMBOL(cfg80211_tdls_oper_request);
22922 
22923 static int nl80211_netlink_notify(struct notifier_block * nb,
22924 				  unsigned long state,
22925 				  void *_notify)
22926 {
22927 	struct netlink_notify *notify = _notify;
22928 	struct cfg80211_registered_device *rdev;
22929 	struct wireless_dev *wdev;
22930 	struct cfg80211_beacon_registration *reg, *tmp;
22931 
22932 	if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC)
22933 		return NOTIFY_DONE;
22934 
22935 	rcu_read_lock();
22936 
22937 	list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
22938 		struct cfg80211_sched_scan_request *sched_scan_req;
22939 
22940 		list_for_each_entry_rcu(sched_scan_req,
22941 					&rdev->sched_scan_req_list,
22942 					list) {
22943 			if (sched_scan_req->owner_nlportid == notify->portid) {
22944 				sched_scan_req->nl_owner_dead = true;
22945 				wiphy_work_queue(&rdev->wiphy,
22946 						 &rdev->sched_scan_stop_wk);
22947 			}
22948 		}
22949 
22950 		list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) {
22951 			cfg80211_mlme_unregister_socket(wdev, notify->portid);
22952 
22953 			if (wdev->owner_nlportid == notify->portid) {
22954 				wdev->nl_owner_dead = true;
22955 				schedule_work(&rdev->destroy_work);
22956 			} else if (wdev->conn_owner_nlportid == notify->portid) {
22957 				wiphy_work_queue(wdev->wiphy,
22958 						 &wdev->disconnect_wk);
22959 			}
22960 
22961 			cfg80211_release_pmsr(wdev, notify->portid);
22962 		}
22963 
22964 		spin_lock_bh(&rdev->beacon_registrations_lock);
22965 		list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations,
22966 					 list) {
22967 			if (reg->nlportid == notify->portid) {
22968 				list_del(&reg->list);
22969 				kfree(reg);
22970 				break;
22971 			}
22972 		}
22973 		spin_unlock_bh(&rdev->beacon_registrations_lock);
22974 	}
22975 
22976 	rcu_read_unlock();
22977 
22978 	/*
22979 	 * It is possible that the user space process that is controlling the
22980 	 * indoor setting disappeared, so notify the regulatory core.
22981 	 */
22982 	regulatory_netlink_notify(notify->portid);
22983 	return NOTIFY_OK;
22984 }
22985 
22986 static struct notifier_block nl80211_netlink_notifier = {
22987 	.notifier_call = nl80211_netlink_notify,
22988 };
22989 
22990 void cfg80211_ft_event(struct net_device *netdev,
22991 		       struct cfg80211_ft_event_params *ft_event)
22992 {
22993 	struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
22994 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
22995 	struct sk_buff *msg;
22996 	void *hdr;
22997 
22998 	trace_cfg80211_ft_event(wiphy, netdev, ft_event);
22999 
23000 	if (!ft_event->target_ap)
23001 		return;
23002 
23003 	msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len,
23004 			GFP_KERNEL);
23005 	if (!msg)
23006 		return;
23007 
23008 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT);
23009 	if (!hdr)
23010 		goto out;
23011 
23012 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
23013 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
23014 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap))
23015 		goto out;
23016 
23017 	if (ft_event->ies &&
23018 	    nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies))
23019 		goto out;
23020 	if (ft_event->ric_ies &&
23021 	    nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len,
23022 		    ft_event->ric_ies))
23023 		goto out;
23024 
23025 	genlmsg_end(msg, hdr);
23026 
23027 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
23028 				NL80211_MCGRP_MLME, GFP_KERNEL);
23029 	return;
23030  out:
23031 	nlmsg_free(msg);
23032 }
23033 EXPORT_SYMBOL(cfg80211_ft_event);
23034 
23035 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp)
23036 {
23037 	struct cfg80211_registered_device *rdev;
23038 	struct sk_buff *msg;
23039 	void *hdr;
23040 	u32 nlportid;
23041 
23042 	rdev = wiphy_to_rdev(wdev->wiphy);
23043 	if (!rdev->crit_proto_nlportid)
23044 		return;
23045 
23046 	nlportid = rdev->crit_proto_nlportid;
23047 	rdev->crit_proto_nlportid = 0;
23048 
23049 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
23050 	if (!msg)
23051 		return;
23052 
23053 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP);
23054 	if (!hdr)
23055 		goto nla_put_failure;
23056 
23057 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
23058 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
23059 			      NL80211_ATTR_PAD))
23060 		goto nla_put_failure;
23061 
23062 	genlmsg_end(msg, hdr);
23063 
23064 	genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
23065 	return;
23066 
23067  nla_put_failure:
23068 	nlmsg_free(msg);
23069 }
23070 EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
23071 
23072 void nl80211_send_ap_stopped(struct wireless_dev *wdev, unsigned int link_id)
23073 {
23074 	struct wiphy *wiphy = wdev->wiphy;
23075 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
23076 	struct sk_buff *msg;
23077 	void *hdr;
23078 
23079 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
23080 	if (!msg)
23081 		return;
23082 
23083 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP);
23084 	if (!hdr)
23085 		goto out;
23086 
23087 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
23088 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) ||
23089 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
23090 			      NL80211_ATTR_PAD) ||
23091 	    (wdev->valid_links &&
23092 	     nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)))
23093 		goto out;
23094 
23095 	genlmsg_end(msg, hdr);
23096 
23097 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
23098 				NL80211_MCGRP_MLME, GFP_KERNEL);
23099 	return;
23100  out:
23101 	nlmsg_free(msg);
23102 }
23103 
23104 int cfg80211_external_auth_request(struct net_device *dev,
23105 				   struct cfg80211_external_auth_params *params,
23106 				   gfp_t gfp)
23107 {
23108 	struct wireless_dev *wdev = dev->ieee80211_ptr;
23109 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
23110 	struct sk_buff *msg;
23111 	void *hdr;
23112 
23113 	if (!wdev->conn_owner_nlportid)
23114 		return -EINVAL;
23115 
23116 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
23117 	if (!msg)
23118 		return -ENOMEM;
23119 
23120 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH);
23121 	if (!hdr)
23122 		goto nla_put_failure;
23123 
23124 	/* Some historical mistakes in drivers <-> userspace interface (notably
23125 	 * between drivers and wpa_supplicant) led to a big-endian conversion
23126 	 * being needed on NL80211_ATTR_AKM_SUITES _only_ when its value is
23127 	 * WLAN_AKM_SUITE_SAE. This is now fixed on userspace side, but for the
23128 	 * benefit of older wpa_supplicant versions, send this particular value
23129 	 * in big-endian. Note that newer wpa_supplicant will also detect this
23130 	 * particular value in big endian still, so it all continues to work.
23131 	 */
23132 	if (params->key_mgmt_suite == WLAN_AKM_SUITE_SAE) {
23133 		if (nla_put_be32(msg, NL80211_ATTR_AKM_SUITES,
23134 				 cpu_to_be32(WLAN_AKM_SUITE_SAE)))
23135 			goto nla_put_failure;
23136 	} else {
23137 		if (nla_put_u32(msg, NL80211_ATTR_AKM_SUITES,
23138 				params->key_mgmt_suite))
23139 			goto nla_put_failure;
23140 	}
23141 
23142 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
23143 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
23144 	    nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION,
23145 			params->action) ||
23146 	    nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) ||
23147 	    nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len,
23148 		    params->ssid.ssid) ||
23149 	    (!is_zero_ether_addr(params->mld_addr) &&
23150 	     nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, params->mld_addr)))
23151 		goto nla_put_failure;
23152 
23153 	genlmsg_end(msg, hdr);
23154 	genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
23155 			wdev->conn_owner_nlportid);
23156 	return 0;
23157 
23158  nla_put_failure:
23159 	nlmsg_free(msg);
23160 	return -ENOBUFS;
23161 }
23162 EXPORT_SYMBOL(cfg80211_external_auth_request);
23163 
23164 void cfg80211_update_owe_info_event(struct net_device *netdev,
23165 				    struct cfg80211_update_owe_info *owe_info,
23166 				    gfp_t gfp)
23167 {
23168 	struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
23169 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
23170 	struct sk_buff *msg;
23171 	void *hdr;
23172 
23173 	trace_cfg80211_update_owe_info_event(wiphy, netdev, owe_info);
23174 
23175 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
23176 	if (!msg)
23177 		return;
23178 
23179 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_OWE_INFO);
23180 	if (!hdr)
23181 		goto nla_put_failure;
23182 
23183 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
23184 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
23185 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer))
23186 		goto nla_put_failure;
23187 
23188 	if (!owe_info->ie_len ||
23189 	    nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie))
23190 		goto nla_put_failure;
23191 
23192 	if (owe_info->assoc_link_id != -1) {
23193 		if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID,
23194 			       owe_info->assoc_link_id))
23195 			goto nla_put_failure;
23196 
23197 		if (!is_zero_ether_addr(owe_info->peer_mld_addr) &&
23198 		    nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN,
23199 			    owe_info->peer_mld_addr))
23200 			goto nla_put_failure;
23201 	}
23202 
23203 	genlmsg_end(msg, hdr);
23204 
23205 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
23206 				NL80211_MCGRP_MLME, gfp);
23207 	return;
23208 
23209 nla_put_failure:
23210 	genlmsg_cancel(msg, hdr);
23211 	nlmsg_free(msg);
23212 }
23213 EXPORT_SYMBOL(cfg80211_update_owe_info_event);
23214 
23215 void cfg80211_schedule_channels_check(struct wireless_dev *wdev)
23216 {
23217 	struct wiphy *wiphy = wdev->wiphy;
23218 
23219 	/* Schedule channels check if NO_IR or DFS relaxations are supported */
23220 	if (wdev->iftype == NL80211_IFTYPE_STATION &&
23221 	    (wiphy_ext_feature_isset(wiphy,
23222 				     NL80211_EXT_FEATURE_DFS_CONCURRENT) ||
23223 	    (IS_ENABLED(CONFIG_CFG80211_REG_RELAX_NO_IR) &&
23224 	     wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR)))
23225 		reg_check_channels();
23226 }
23227 EXPORT_SYMBOL(cfg80211_schedule_channels_check);
23228 
23229 void cfg80211_epcs_changed(struct net_device *netdev, bool enabled)
23230 {
23231 	struct wireless_dev *wdev = netdev->ieee80211_ptr;
23232 	struct wiphy *wiphy = wdev->wiphy;
23233 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
23234 	struct sk_buff *msg;
23235 	void *hdr;
23236 
23237 	trace_cfg80211_epcs_changed(wdev, enabled);
23238 
23239 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
23240 	if (!msg)
23241 		return;
23242 
23243 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EPCS_CFG);
23244 	if (!hdr) {
23245 		nlmsg_free(msg);
23246 		return;
23247 	}
23248 
23249 	if (enabled && nla_put_flag(msg, NL80211_ATTR_EPCS))
23250 		goto nla_put_failure;
23251 
23252 	genlmsg_end(msg, hdr);
23253 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
23254 				NL80211_MCGRP_MLME, GFP_KERNEL);
23255 	return;
23256 
23257  nla_put_failure:
23258 	nlmsg_free(msg);
23259 }
23260 EXPORT_SYMBOL(cfg80211_epcs_changed);
23261 
23262 void cfg80211_next_nan_dw_notif(struct wireless_dev *wdev,
23263 				struct ieee80211_channel *chan, gfp_t gfp)
23264 {
23265 	struct wiphy *wiphy = wdev->wiphy;
23266 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
23267 	struct sk_buff *msg;
23268 	void *hdr;
23269 
23270 	trace_cfg80211_next_nan_dw_notif(wdev, chan);
23271 
23272 	if (!wdev->owner_nlportid)
23273 		return;
23274 
23275 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
23276 	if (!msg)
23277 		return;
23278 
23279 	hdr = nl80211hdr_put(msg, 0, 0, 0,
23280 			     NL80211_CMD_NAN_NEXT_DW_NOTIFICATION);
23281 	if (!hdr)
23282 		goto nla_put_failure;
23283 
23284 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
23285 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
23286 			      NL80211_ATTR_PAD) ||
23287 	    nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq))
23288 		goto nla_put_failure;
23289 
23290 	genlmsg_end(msg, hdr);
23291 
23292 	genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid);
23293 
23294 	return;
23295 
23296  nla_put_failure:
23297 	nlmsg_free(msg);
23298 }
23299 EXPORT_SYMBOL(cfg80211_next_nan_dw_notif);
23300 
23301 void cfg80211_nan_cluster_joined(struct wireless_dev *wdev,
23302 				 const u8 *cluster_id, bool new_cluster,
23303 				 gfp_t gfp)
23304 {
23305 	struct wiphy *wiphy = wdev->wiphy;
23306 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
23307 	struct sk_buff *msg;
23308 	void *hdr;
23309 
23310 	trace_cfg80211_nan_cluster_joined(wdev, cluster_id, new_cluster);
23311 
23312 	memcpy(wdev->u.nan.cluster_id, cluster_id, ETH_ALEN);
23313 
23314 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
23315 	if (!msg)
23316 		return;
23317 
23318 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_CLUSTER_JOINED);
23319 	if (!hdr)
23320 		goto nla_put_failure;
23321 
23322 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
23323 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
23324 			      NL80211_ATTR_PAD) ||
23325 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cluster_id) ||
23326 	    (new_cluster && nla_put_flag(msg, NL80211_ATTR_NAN_NEW_CLUSTER)))
23327 		goto nla_put_failure;
23328 
23329 	genlmsg_end(msg, hdr);
23330 
23331 	if (!wdev->owner_nlportid)
23332 		genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy),
23333 					msg, 0, NL80211_MCGRP_NAN, gfp);
23334 	else
23335 		genlmsg_unicast(wiphy_net(wiphy), msg,
23336 				wdev->owner_nlportid);
23337 	return;
23338 
23339  nla_put_failure:
23340 	nlmsg_free(msg);
23341 }
23342 EXPORT_SYMBOL(cfg80211_nan_cluster_joined);
23343 
23344 void cfg80211_nan_ulw_update(struct wireless_dev *wdev,
23345 			     const u8 *ulw, size_t ulw_len, gfp_t gfp)
23346 {
23347 	struct wiphy *wiphy = wdev->wiphy;
23348 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
23349 	struct sk_buff *msg;
23350 	void *hdr;
23351 
23352 	trace_cfg80211_nan_ulw_update(wiphy, wdev, ulw, ulw_len);
23353 
23354 	if (!wdev->owner_nlportid)
23355 		return;
23356 
23357 	/* 32 for the wiphy idx, 64 for the wdev id, 100 for padding */
23358 	msg = nlmsg_new(nla_total_size(sizeof(u32)) +
23359 			nla_total_size(ulw_len) +
23360 			nla_total_size(sizeof(u64)) + 100,
23361 			gfp);
23362 	if (!msg)
23363 		return;
23364 
23365 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_ULW_UPDATE);
23366 	if (!hdr)
23367 		goto nla_put_failure;
23368 
23369 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
23370 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
23371 			      NL80211_ATTR_PAD) ||
23372 	    (ulw && ulw_len &&
23373 	     nla_put(msg, NL80211_ATTR_NAN_ULW, ulw_len, ulw)))
23374 		goto nla_put_failure;
23375 
23376 	genlmsg_end(msg, hdr);
23377 
23378 	genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid);
23379 
23380 	return;
23381 
23382  nla_put_failure:
23383 	nlmsg_free(msg);
23384 }
23385 EXPORT_SYMBOL(cfg80211_nan_ulw_update);
23386 
23387 void cfg80211_nan_channel_evac(struct wireless_dev *wdev,
23388 			       const struct cfg80211_chan_def *chandef,
23389 			       gfp_t gfp)
23390 {
23391 	struct wiphy *wiphy = wdev->wiphy;
23392 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
23393 	struct sk_buff *msg;
23394 	struct nlattr *chan_attr;
23395 	void *hdr;
23396 
23397 	trace_cfg80211_nan_channel_evac(wiphy, wdev, chandef);
23398 
23399 	if (!wdev->owner_nlportid)
23400 		return;
23401 
23402 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
23403 	if (!msg)
23404 		return;
23405 
23406 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_CHANNEL_EVAC);
23407 	if (!hdr)
23408 		goto nla_put_failure;
23409 
23410 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
23411 	    nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
23412 			      NL80211_ATTR_PAD))
23413 		goto nla_put_failure;
23414 
23415 	chan_attr = nla_nest_start(msg, NL80211_ATTR_NAN_CHANNEL);
23416 	if (!chan_attr)
23417 		goto nla_put_failure;
23418 
23419 	if (nl80211_send_chandef(msg, chandef))
23420 		goto nla_put_failure;
23421 
23422 	nla_nest_end(msg, chan_attr);
23423 
23424 	genlmsg_end(msg, hdr);
23425 
23426 	genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid);
23427 
23428 	return;
23429 
23430  nla_put_failure:
23431 	nlmsg_free(msg);
23432 }
23433 EXPORT_SYMBOL(cfg80211_nan_channel_evac);
23434 
23435 /* initialisation/exit functions */
23436 
23437 int __init nl80211_init(void)
23438 {
23439 	int err;
23440 
23441 	err = genl_register_family(&nl80211_fam);
23442 	if (err)
23443 		return err;
23444 
23445 	err = netlink_register_notifier(&nl80211_netlink_notifier);
23446 	if (err)
23447 		goto err_out;
23448 
23449 	return 0;
23450  err_out:
23451 	genl_unregister_family(&nl80211_fam);
23452 	return err;
23453 }
23454 
23455 void nl80211_exit(void)
23456 {
23457 	netlink_unregister_notifier(&nl80211_netlink_notifier);
23458 	genl_unregister_family(&nl80211_fam);
23459 }
23460