xref: /openbmc/linux/net/wireless/nl80211.c (revision ba6fbacf9c073effaedf0c52fe7e52e2baf67725)
1 /*
2  * This is the new netlink-based wireless configuration interface.
3  *
4  * Copyright 2006-2010	Johannes Berg <johannes@sipsolutions.net>
5  * Copyright 2013-2014  Intel Mobile Communications GmbH
6  * Copyright 2015-2016	Intel Deutschland GmbH
7  */
8 
9 #include <linux/if.h>
10 #include <linux/module.h>
11 #include <linux/err.h>
12 #include <linux/slab.h>
13 #include <linux/list.h>
14 #include <linux/if_ether.h>
15 #include <linux/ieee80211.h>
16 #include <linux/nl80211.h>
17 #include <linux/rtnetlink.h>
18 #include <linux/netlink.h>
19 #include <linux/etherdevice.h>
20 #include <net/net_namespace.h>
21 #include <net/genetlink.h>
22 #include <net/cfg80211.h>
23 #include <net/sock.h>
24 #include <net/inet_connection_sock.h>
25 #include "core.h"
26 #include "nl80211.h"
27 #include "reg.h"
28 #include "rdev-ops.h"
29 
30 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
31 				   struct genl_info *info,
32 				   struct cfg80211_crypto_settings *settings,
33 				   int cipher_limit);
34 
35 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
36 			    struct genl_info *info);
37 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
38 			      struct genl_info *info);
39 
40 /* the netlink family */
41 static struct genl_family nl80211_fam = {
42 	.id = GENL_ID_GENERATE,		/* don't bother with a hardcoded ID */
43 	.name = NL80211_GENL_NAME,	/* have users key off the name instead */
44 	.hdrsize = 0,			/* no private header */
45 	.version = 1,			/* no particular meaning now */
46 	.maxattr = NL80211_ATTR_MAX,
47 	.netnsok = true,
48 	.pre_doit = nl80211_pre_doit,
49 	.post_doit = nl80211_post_doit,
50 };
51 
52 /* multicast groups */
53 enum nl80211_multicast_groups {
54 	NL80211_MCGRP_CONFIG,
55 	NL80211_MCGRP_SCAN,
56 	NL80211_MCGRP_REGULATORY,
57 	NL80211_MCGRP_MLME,
58 	NL80211_MCGRP_VENDOR,
59 	NL80211_MCGRP_TESTMODE /* keep last - ifdef! */
60 };
61 
62 static const struct genl_multicast_group nl80211_mcgrps[] = {
63 	[NL80211_MCGRP_CONFIG] = { .name = NL80211_MULTICAST_GROUP_CONFIG },
64 	[NL80211_MCGRP_SCAN] = { .name = NL80211_MULTICAST_GROUP_SCAN },
65 	[NL80211_MCGRP_REGULATORY] = { .name = NL80211_MULTICAST_GROUP_REG },
66 	[NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME },
67 	[NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR },
68 #ifdef CONFIG_NL80211_TESTMODE
69 	[NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE }
70 #endif
71 };
72 
73 /* returns ERR_PTR values */
74 static struct wireless_dev *
75 __cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs)
76 {
77 	struct cfg80211_registered_device *rdev;
78 	struct wireless_dev *result = NULL;
79 	bool have_ifidx = attrs[NL80211_ATTR_IFINDEX];
80 	bool have_wdev_id = attrs[NL80211_ATTR_WDEV];
81 	u64 wdev_id;
82 	int wiphy_idx = -1;
83 	int ifidx = -1;
84 
85 	ASSERT_RTNL();
86 
87 	if (!have_ifidx && !have_wdev_id)
88 		return ERR_PTR(-EINVAL);
89 
90 	if (have_ifidx)
91 		ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
92 	if (have_wdev_id) {
93 		wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
94 		wiphy_idx = wdev_id >> 32;
95 	}
96 
97 	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
98 		struct wireless_dev *wdev;
99 
100 		if (wiphy_net(&rdev->wiphy) != netns)
101 			continue;
102 
103 		if (have_wdev_id && rdev->wiphy_idx != wiphy_idx)
104 			continue;
105 
106 		list_for_each_entry(wdev, &rdev->wdev_list, list) {
107 			if (have_ifidx && wdev->netdev &&
108 			    wdev->netdev->ifindex == ifidx) {
109 				result = wdev;
110 				break;
111 			}
112 			if (have_wdev_id && wdev->identifier == (u32)wdev_id) {
113 				result = wdev;
114 				break;
115 			}
116 		}
117 
118 		if (result)
119 			break;
120 	}
121 
122 	if (result)
123 		return result;
124 	return ERR_PTR(-ENODEV);
125 }
126 
127 static struct cfg80211_registered_device *
128 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs)
129 {
130 	struct cfg80211_registered_device *rdev = NULL, *tmp;
131 	struct net_device *netdev;
132 
133 	ASSERT_RTNL();
134 
135 	if (!attrs[NL80211_ATTR_WIPHY] &&
136 	    !attrs[NL80211_ATTR_IFINDEX] &&
137 	    !attrs[NL80211_ATTR_WDEV])
138 		return ERR_PTR(-EINVAL);
139 
140 	if (attrs[NL80211_ATTR_WIPHY])
141 		rdev = cfg80211_rdev_by_wiphy_idx(
142 				nla_get_u32(attrs[NL80211_ATTR_WIPHY]));
143 
144 	if (attrs[NL80211_ATTR_WDEV]) {
145 		u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
146 		struct wireless_dev *wdev;
147 		bool found = false;
148 
149 		tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32);
150 		if (tmp) {
151 			/* make sure wdev exists */
152 			list_for_each_entry(wdev, &tmp->wdev_list, list) {
153 				if (wdev->identifier != (u32)wdev_id)
154 					continue;
155 				found = true;
156 				break;
157 			}
158 
159 			if (!found)
160 				tmp = NULL;
161 
162 			if (rdev && tmp != rdev)
163 				return ERR_PTR(-EINVAL);
164 			rdev = tmp;
165 		}
166 	}
167 
168 	if (attrs[NL80211_ATTR_IFINDEX]) {
169 		int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
170 		netdev = __dev_get_by_index(netns, ifindex);
171 		if (netdev) {
172 			if (netdev->ieee80211_ptr)
173 				tmp = wiphy_to_rdev(
174 					netdev->ieee80211_ptr->wiphy);
175 			else
176 				tmp = NULL;
177 
178 			/* not wireless device -- return error */
179 			if (!tmp)
180 				return ERR_PTR(-EINVAL);
181 
182 			/* mismatch -- return error */
183 			if (rdev && tmp != rdev)
184 				return ERR_PTR(-EINVAL);
185 
186 			rdev = tmp;
187 		}
188 	}
189 
190 	if (!rdev)
191 		return ERR_PTR(-ENODEV);
192 
193 	if (netns != wiphy_net(&rdev->wiphy))
194 		return ERR_PTR(-ENODEV);
195 
196 	return rdev;
197 }
198 
199 /*
200  * This function returns a pointer to the driver
201  * that the genl_info item that is passed refers to.
202  *
203  * The result of this can be a PTR_ERR and hence must
204  * be checked with IS_ERR() for errors.
205  */
206 static struct cfg80211_registered_device *
207 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info)
208 {
209 	return __cfg80211_rdev_from_attrs(netns, info->attrs);
210 }
211 
212 /* policy for the attributes */
213 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
214 	[NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
215 	[NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
216 				      .len = 20-1 },
217 	[NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED },
218 
219 	[NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 },
220 	[NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 },
221 	[NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 },
222 	[NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 },
223 	[NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 },
224 
225 	[NL80211_ATTR_WIPHY_RETRY_SHORT] = { .type = NLA_U8 },
226 	[NL80211_ATTR_WIPHY_RETRY_LONG] = { .type = NLA_U8 },
227 	[NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 },
228 	[NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 },
229 	[NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 },
230 	[NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG },
231 
232 	[NL80211_ATTR_IFTYPE] = { .type = NLA_U32 },
233 	[NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
234 	[NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
235 
236 	[NL80211_ATTR_MAC] = { .len = ETH_ALEN },
237 	[NL80211_ATTR_PREV_BSSID] = { .len = ETH_ALEN },
238 
239 	[NL80211_ATTR_KEY] = { .type = NLA_NESTED, },
240 	[NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
241 				    .len = WLAN_MAX_KEY_LEN },
242 	[NL80211_ATTR_KEY_IDX] = { .type = NLA_U8 },
243 	[NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 },
244 	[NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG },
245 	[NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
246 	[NL80211_ATTR_KEY_TYPE] = { .type = NLA_U32 },
247 
248 	[NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 },
249 	[NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 },
250 	[NL80211_ATTR_BEACON_HEAD] = { .type = NLA_BINARY,
251 				       .len = IEEE80211_MAX_DATA_LEN },
252 	[NL80211_ATTR_BEACON_TAIL] = { .type = NLA_BINARY,
253 				       .len = IEEE80211_MAX_DATA_LEN },
254 	[NL80211_ATTR_STA_AID] = { .type = NLA_U16 },
255 	[NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED },
256 	[NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 },
257 	[NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY,
258 					       .len = NL80211_MAX_SUPP_RATES },
259 	[NL80211_ATTR_STA_PLINK_ACTION] = { .type = NLA_U8 },
260 	[NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 },
261 	[NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
262 	[NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
263 				   .len = IEEE80211_MAX_MESH_ID_LEN },
264 	[NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 },
265 
266 	[NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 },
267 	[NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
268 
269 	[NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
270 	[NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
271 	[NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
272 	[NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY,
273 					   .len = NL80211_MAX_SUPP_RATES },
274 	[NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 },
275 
276 	[NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED },
277 	[NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG },
278 
279 	[NL80211_ATTR_HT_CAPABILITY] = { .len = NL80211_HT_CAPABILITY_LEN },
280 
281 	[NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
282 	[NL80211_ATTR_IE] = { .type = NLA_BINARY,
283 			      .len = IEEE80211_MAX_DATA_LEN },
284 	[NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
285 	[NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
286 
287 	[NL80211_ATTR_SSID] = { .type = NLA_BINARY,
288 				.len = IEEE80211_MAX_SSID_LEN },
289 	[NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
290 	[NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
291 	[NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
292 	[NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
293 	[NL80211_ATTR_USE_MFP] = { .type = NLA_U32 },
294 	[NL80211_ATTR_STA_FLAGS2] = {
295 		.len = sizeof(struct nl80211_sta_flag_update),
296 	},
297 	[NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
298 	[NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 },
299 	[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG },
300 	[NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG },
301 	[NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 },
302 	[NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 },
303 	[NL80211_ATTR_PID] = { .type = NLA_U32 },
304 	[NL80211_ATTR_4ADDR] = { .type = NLA_U8 },
305 	[NL80211_ATTR_PMKID] = { .type = NLA_BINARY,
306 				 .len = WLAN_PMKID_LEN },
307 	[NL80211_ATTR_DURATION] = { .type = NLA_U32 },
308 	[NL80211_ATTR_COOKIE] = { .type = NLA_U64 },
309 	[NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED },
310 	[NL80211_ATTR_FRAME] = { .type = NLA_BINARY,
311 				 .len = IEEE80211_MAX_DATA_LEN },
312 	[NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, },
313 	[NL80211_ATTR_PS_STATE] = { .type = NLA_U32 },
314 	[NL80211_ATTR_CQM] = { .type = NLA_NESTED, },
315 	[NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG },
316 	[NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 },
317 	[NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
318 	[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
319 	[NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
320 	[NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 },
321 	[NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 },
322 	[NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 },
323 	[NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG },
324 	[NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
325 	[NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED },
326 	[NL80211_ATTR_STA_PLINK_STATE] = { .type = NLA_U8 },
327 	[NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 },
328 	[NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED },
329 	[NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED },
330 	[NL80211_ATTR_HIDDEN_SSID] = { .type = NLA_U32 },
331 	[NL80211_ATTR_IE_PROBE_RESP] = { .type = NLA_BINARY,
332 					 .len = IEEE80211_MAX_DATA_LEN },
333 	[NL80211_ATTR_IE_ASSOC_RESP] = { .type = NLA_BINARY,
334 					 .len = IEEE80211_MAX_DATA_LEN },
335 	[NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG },
336 	[NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED },
337 	[NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG },
338 	[NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 },
339 	[NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 },
340 	[NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 },
341 	[NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG },
342 	[NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG },
343 	[NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG },
344 	[NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
345 	[NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
346 				      .len = IEEE80211_MAX_DATA_LEN },
347 	[NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 },
348 	[NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG },
349 	[NL80211_ATTR_HT_CAPABILITY_MASK] = {
350 		.len = NL80211_HT_CAPABILITY_LEN
351 	},
352 	[NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 },
353 	[NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 },
354 	[NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 },
355 	[NL80211_ATTR_WDEV] = { .type = NLA_U64 },
356 	[NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 },
357 	[NL80211_ATTR_SAE_DATA] = { .type = NLA_BINARY, },
358 	[NL80211_ATTR_VHT_CAPABILITY] = { .len = NL80211_VHT_CAPABILITY_LEN },
359 	[NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
360 	[NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 },
361 	[NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 },
362 	[NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 },
363 	[NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
364 	[NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
365 	[NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, },
366 	[NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, },
367 	[NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG },
368 	[NL80211_ATTR_VHT_CAPABILITY_MASK] = {
369 		.len = NL80211_VHT_CAPABILITY_LEN,
370 	},
371 	[NL80211_ATTR_MDID] = { .type = NLA_U16 },
372 	[NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
373 				  .len = IEEE80211_MAX_DATA_LEN },
374 	[NL80211_ATTR_PEER_AID] = { .type = NLA_U16 },
375 	[NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 },
376 	[NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG },
377 	[NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
378 	[NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_BINARY },
379 	[NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_BINARY },
380 	[NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY },
381 	[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY },
382 	[NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG },
383 	[NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 },
384 	[NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 },
385 	[NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 },
386 	[NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
387 	[NL80211_ATTR_QOS_MAP] = { .type = NLA_BINARY,
388 				   .len = IEEE80211_QOS_MAP_LEN_MAX },
389 	[NL80211_ATTR_MAC_HINT] = { .len = ETH_ALEN },
390 	[NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 },
391 	[NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 },
392 	[NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG },
393 	[NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY },
394 	[NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG },
395 	[NL80211_ATTR_TSID] = { .type = NLA_U8 },
396 	[NL80211_ATTR_USER_PRIO] = { .type = NLA_U8 },
397 	[NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 },
398 	[NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 },
399 	[NL80211_ATTR_MAC_MASK] = { .len = ETH_ALEN },
400 	[NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG },
401 	[NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 },
402 	[NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 },
403 	[NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG },
404 	[NL80211_ATTR_PBSS] = { .type = NLA_FLAG },
405 	[NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED },
406 	[NL80211_ATTR_STA_SUPPORT_P2P_PS] = { .type = NLA_U8 },
407 };
408 
409 /* policy for the key attributes */
410 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
411 	[NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
412 	[NL80211_KEY_IDX] = { .type = NLA_U8 },
413 	[NL80211_KEY_CIPHER] = { .type = NLA_U32 },
414 	[NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
415 	[NL80211_KEY_DEFAULT] = { .type = NLA_FLAG },
416 	[NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG },
417 	[NL80211_KEY_TYPE] = { .type = NLA_U32 },
418 	[NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
419 };
420 
421 /* policy for the key default flags */
422 static const struct nla_policy
423 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = {
424 	[NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG },
425 	[NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG },
426 };
427 
428 /* policy for WoWLAN attributes */
429 static const struct nla_policy
430 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = {
431 	[NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG },
432 	[NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG },
433 	[NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG },
434 	[NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED },
435 	[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG },
436 	[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG },
437 	[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG },
438 	[NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG },
439 	[NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED },
440 	[NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED },
441 };
442 
443 static const struct nla_policy
444 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = {
445 	[NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 },
446 	[NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 },
447 	[NL80211_WOWLAN_TCP_DST_MAC] = { .len = ETH_ALEN },
448 	[NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 },
449 	[NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 },
450 	[NL80211_WOWLAN_TCP_DATA_PAYLOAD] = { .len = 1 },
451 	[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = {
452 		.len = sizeof(struct nl80211_wowlan_tcp_data_seq)
453 	},
454 	[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = {
455 		.len = sizeof(struct nl80211_wowlan_tcp_data_token)
456 	},
457 	[NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 },
458 	[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = { .len = 1 },
459 	[NL80211_WOWLAN_TCP_WAKE_MASK] = { .len = 1 },
460 };
461 
462 /* policy for coalesce rule attributes */
463 static const struct nla_policy
464 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = {
465 	[NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 },
466 	[NL80211_ATTR_COALESCE_RULE_CONDITION] = { .type = NLA_U32 },
467 	[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED },
468 };
469 
470 /* policy for GTK rekey offload attributes */
471 static const struct nla_policy
472 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
473 	[NL80211_REKEY_DATA_KEK] = { .len = NL80211_KEK_LEN },
474 	[NL80211_REKEY_DATA_KCK] = { .len = NL80211_KCK_LEN },
475 	[NL80211_REKEY_DATA_REPLAY_CTR] = { .len = NL80211_REPLAY_CTR_LEN },
476 };
477 
478 static const struct nla_policy
479 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = {
480 	[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY,
481 						 .len = IEEE80211_MAX_SSID_LEN },
482 	[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 },
483 };
484 
485 static const struct nla_policy
486 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = {
487 	[NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 },
488 	[NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 },
489 };
490 
491 static const struct nla_policy
492 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = {
493 	[NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG },
494 	[NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 },
495 	[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = {
496 		.len = sizeof(struct nl80211_bss_select_rssi_adjust)
497 	},
498 };
499 
500 static int nl80211_prepare_wdev_dump(struct sk_buff *skb,
501 				     struct netlink_callback *cb,
502 				     struct cfg80211_registered_device **rdev,
503 				     struct wireless_dev **wdev)
504 {
505 	int err;
506 
507 	rtnl_lock();
508 
509 	if (!cb->args[0]) {
510 		err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
511 				  nl80211_fam.attrbuf, nl80211_fam.maxattr,
512 				  nl80211_policy);
513 		if (err)
514 			goto out_unlock;
515 
516 		*wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk),
517 						   nl80211_fam.attrbuf);
518 		if (IS_ERR(*wdev)) {
519 			err = PTR_ERR(*wdev);
520 			goto out_unlock;
521 		}
522 		*rdev = wiphy_to_rdev((*wdev)->wiphy);
523 		/* 0 is the first index - add 1 to parse only once */
524 		cb->args[0] = (*rdev)->wiphy_idx + 1;
525 		cb->args[1] = (*wdev)->identifier;
526 	} else {
527 		/* subtract the 1 again here */
528 		struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
529 		struct wireless_dev *tmp;
530 
531 		if (!wiphy) {
532 			err = -ENODEV;
533 			goto out_unlock;
534 		}
535 		*rdev = wiphy_to_rdev(wiphy);
536 		*wdev = NULL;
537 
538 		list_for_each_entry(tmp, &(*rdev)->wdev_list, list) {
539 			if (tmp->identifier == cb->args[1]) {
540 				*wdev = tmp;
541 				break;
542 			}
543 		}
544 
545 		if (!*wdev) {
546 			err = -ENODEV;
547 			goto out_unlock;
548 		}
549 	}
550 
551 	return 0;
552  out_unlock:
553 	rtnl_unlock();
554 	return err;
555 }
556 
557 static void nl80211_finish_wdev_dump(struct cfg80211_registered_device *rdev)
558 {
559 	rtnl_unlock();
560 }
561 
562 /* IE validation */
563 static bool is_valid_ie_attr(const struct nlattr *attr)
564 {
565 	const u8 *pos;
566 	int len;
567 
568 	if (!attr)
569 		return true;
570 
571 	pos = nla_data(attr);
572 	len = nla_len(attr);
573 
574 	while (len) {
575 		u8 elemlen;
576 
577 		if (len < 2)
578 			return false;
579 		len -= 2;
580 
581 		elemlen = pos[1];
582 		if (elemlen > len)
583 			return false;
584 
585 		len -= elemlen;
586 		pos += 2 + elemlen;
587 	}
588 
589 	return true;
590 }
591 
592 /* message building helper */
593 static inline void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
594 				   int flags, u8 cmd)
595 {
596 	/* since there is no private header just add the generic one */
597 	return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd);
598 }
599 
600 static int nl80211_msg_put_channel(struct sk_buff *msg,
601 				   struct ieee80211_channel *chan,
602 				   bool large)
603 {
604 	/* Some channels must be completely excluded from the
605 	 * list to protect old user-space tools from breaking
606 	 */
607 	if (!large && chan->flags &
608 	    (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ))
609 		return 0;
610 
611 	if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ,
612 			chan->center_freq))
613 		goto nla_put_failure;
614 
615 	if ((chan->flags & IEEE80211_CHAN_DISABLED) &&
616 	    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED))
617 		goto nla_put_failure;
618 	if (chan->flags & IEEE80211_CHAN_NO_IR) {
619 		if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR))
620 			goto nla_put_failure;
621 		if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS))
622 			goto nla_put_failure;
623 	}
624 	if (chan->flags & IEEE80211_CHAN_RADAR) {
625 		if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
626 			goto nla_put_failure;
627 		if (large) {
628 			u32 time;
629 
630 			time = elapsed_jiffies_msecs(chan->dfs_state_entered);
631 
632 			if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE,
633 					chan->dfs_state))
634 				goto nla_put_failure;
635 			if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME,
636 					time))
637 				goto nla_put_failure;
638 			if (nla_put_u32(msg,
639 					NL80211_FREQUENCY_ATTR_DFS_CAC_TIME,
640 					chan->dfs_cac_ms))
641 				goto nla_put_failure;
642 		}
643 	}
644 
645 	if (large) {
646 		if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
647 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
648 			goto nla_put_failure;
649 		if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) &&
650 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS))
651 			goto nla_put_failure;
652 		if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) &&
653 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ))
654 			goto nla_put_failure;
655 		if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) &&
656 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ))
657 			goto nla_put_failure;
658 		if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) &&
659 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY))
660 			goto nla_put_failure;
661 		if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) &&
662 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT))
663 			goto nla_put_failure;
664 		if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) &&
665 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ))
666 			goto nla_put_failure;
667 		if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) &&
668 		    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ))
669 			goto nla_put_failure;
670 	}
671 
672 	if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
673 			DBM_TO_MBM(chan->max_power)))
674 		goto nla_put_failure;
675 
676 	return 0;
677 
678  nla_put_failure:
679 	return -ENOBUFS;
680 }
681 
682 /* netlink command implementations */
683 
684 struct key_parse {
685 	struct key_params p;
686 	int idx;
687 	int type;
688 	bool def, defmgmt;
689 	bool def_uni, def_multi;
690 };
691 
692 static int nl80211_parse_key_new(struct nlattr *key, struct key_parse *k)
693 {
694 	struct nlattr *tb[NL80211_KEY_MAX + 1];
695 	int err = nla_parse_nested(tb, NL80211_KEY_MAX, key,
696 				   nl80211_key_policy);
697 	if (err)
698 		return err;
699 
700 	k->def = !!tb[NL80211_KEY_DEFAULT];
701 	k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT];
702 
703 	if (k->def) {
704 		k->def_uni = true;
705 		k->def_multi = true;
706 	}
707 	if (k->defmgmt)
708 		k->def_multi = true;
709 
710 	if (tb[NL80211_KEY_IDX])
711 		k->idx = nla_get_u8(tb[NL80211_KEY_IDX]);
712 
713 	if (tb[NL80211_KEY_DATA]) {
714 		k->p.key = nla_data(tb[NL80211_KEY_DATA]);
715 		k->p.key_len = nla_len(tb[NL80211_KEY_DATA]);
716 	}
717 
718 	if (tb[NL80211_KEY_SEQ]) {
719 		k->p.seq = nla_data(tb[NL80211_KEY_SEQ]);
720 		k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]);
721 	}
722 
723 	if (tb[NL80211_KEY_CIPHER])
724 		k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]);
725 
726 	if (tb[NL80211_KEY_TYPE]) {
727 		k->type = nla_get_u32(tb[NL80211_KEY_TYPE]);
728 		if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
729 			return -EINVAL;
730 	}
731 
732 	if (tb[NL80211_KEY_DEFAULT_TYPES]) {
733 		struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
734 		err = nla_parse_nested(kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
735 				       tb[NL80211_KEY_DEFAULT_TYPES],
736 				       nl80211_key_default_policy);
737 		if (err)
738 			return err;
739 
740 		k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
741 		k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
742 	}
743 
744 	return 0;
745 }
746 
747 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
748 {
749 	if (info->attrs[NL80211_ATTR_KEY_DATA]) {
750 		k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
751 		k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
752 	}
753 
754 	if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
755 		k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
756 		k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
757 	}
758 
759 	if (info->attrs[NL80211_ATTR_KEY_IDX])
760 		k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
761 
762 	if (info->attrs[NL80211_ATTR_KEY_CIPHER])
763 		k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
764 
765 	k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
766 	k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
767 
768 	if (k->def) {
769 		k->def_uni = true;
770 		k->def_multi = true;
771 	}
772 	if (k->defmgmt)
773 		k->def_multi = true;
774 
775 	if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
776 		k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
777 		if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
778 			return -EINVAL;
779 	}
780 
781 	if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
782 		struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
783 		int err = nla_parse_nested(
784 				kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
785 				info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
786 				nl80211_key_default_policy);
787 		if (err)
788 			return err;
789 
790 		k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
791 		k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
792 	}
793 
794 	return 0;
795 }
796 
797 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
798 {
799 	int err;
800 
801 	memset(k, 0, sizeof(*k));
802 	k->idx = -1;
803 	k->type = -1;
804 
805 	if (info->attrs[NL80211_ATTR_KEY])
806 		err = nl80211_parse_key_new(info->attrs[NL80211_ATTR_KEY], k);
807 	else
808 		err = nl80211_parse_key_old(info, k);
809 
810 	if (err)
811 		return err;
812 
813 	if (k->def && k->defmgmt)
814 		return -EINVAL;
815 
816 	if (k->defmgmt) {
817 		if (k->def_uni || !k->def_multi)
818 			return -EINVAL;
819 	}
820 
821 	if (k->idx != -1) {
822 		if (k->defmgmt) {
823 			if (k->idx < 4 || k->idx > 5)
824 				return -EINVAL;
825 		} else if (k->def) {
826 			if (k->idx < 0 || k->idx > 3)
827 				return -EINVAL;
828 		} else {
829 			if (k->idx < 0 || k->idx > 5)
830 				return -EINVAL;
831 		}
832 	}
833 
834 	return 0;
835 }
836 
837 static struct cfg80211_cached_keys *
838 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
839 		       struct nlattr *keys, bool *no_ht)
840 {
841 	struct key_parse parse;
842 	struct nlattr *key;
843 	struct cfg80211_cached_keys *result;
844 	int rem, err, def = 0;
845 
846 	result = kzalloc(sizeof(*result), GFP_KERNEL);
847 	if (!result)
848 		return ERR_PTR(-ENOMEM);
849 
850 	result->def = -1;
851 	result->defmgmt = -1;
852 
853 	nla_for_each_nested(key, keys, rem) {
854 		memset(&parse, 0, sizeof(parse));
855 		parse.idx = -1;
856 
857 		err = nl80211_parse_key_new(key, &parse);
858 		if (err)
859 			goto error;
860 		err = -EINVAL;
861 		if (!parse.p.key)
862 			goto error;
863 		if (parse.idx < 0 || parse.idx > 4)
864 			goto error;
865 		if (parse.def) {
866 			if (def)
867 				goto error;
868 			def = 1;
869 			result->def = parse.idx;
870 			if (!parse.def_uni || !parse.def_multi)
871 				goto error;
872 		} else if (parse.defmgmt)
873 			goto error;
874 		err = cfg80211_validate_key_settings(rdev, &parse.p,
875 						     parse.idx, false, NULL);
876 		if (err)
877 			goto error;
878 		result->params[parse.idx].cipher = parse.p.cipher;
879 		result->params[parse.idx].key_len = parse.p.key_len;
880 		result->params[parse.idx].key = result->data[parse.idx];
881 		memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len);
882 
883 		if (parse.p.cipher == WLAN_CIPHER_SUITE_WEP40 ||
884 		    parse.p.cipher == WLAN_CIPHER_SUITE_WEP104) {
885 			if (no_ht)
886 				*no_ht = true;
887 		}
888 	}
889 
890 	return result;
891  error:
892 	kfree(result);
893 	return ERR_PTR(err);
894 }
895 
896 static int nl80211_key_allowed(struct wireless_dev *wdev)
897 {
898 	ASSERT_WDEV_LOCK(wdev);
899 
900 	switch (wdev->iftype) {
901 	case NL80211_IFTYPE_AP:
902 	case NL80211_IFTYPE_AP_VLAN:
903 	case NL80211_IFTYPE_P2P_GO:
904 	case NL80211_IFTYPE_MESH_POINT:
905 		break;
906 	case NL80211_IFTYPE_ADHOC:
907 	case NL80211_IFTYPE_STATION:
908 	case NL80211_IFTYPE_P2P_CLIENT:
909 		if (!wdev->current_bss)
910 			return -ENOLINK;
911 		break;
912 	case NL80211_IFTYPE_UNSPECIFIED:
913 	case NL80211_IFTYPE_OCB:
914 	case NL80211_IFTYPE_MONITOR:
915 	case NL80211_IFTYPE_P2P_DEVICE:
916 	case NL80211_IFTYPE_WDS:
917 	case NUM_NL80211_IFTYPES:
918 		return -EINVAL;
919 	}
920 
921 	return 0;
922 }
923 
924 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy,
925 							struct nlattr *tb)
926 {
927 	struct ieee80211_channel *chan;
928 
929 	if (tb == NULL)
930 		return NULL;
931 	chan = ieee80211_get_channel(wiphy, nla_get_u32(tb));
932 	if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
933 		return NULL;
934 	return chan;
935 }
936 
937 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
938 {
939 	struct nlattr *nl_modes = nla_nest_start(msg, attr);
940 	int i;
941 
942 	if (!nl_modes)
943 		goto nla_put_failure;
944 
945 	i = 0;
946 	while (ifmodes) {
947 		if ((ifmodes & 1) && nla_put_flag(msg, i))
948 			goto nla_put_failure;
949 		ifmodes >>= 1;
950 		i++;
951 	}
952 
953 	nla_nest_end(msg, nl_modes);
954 	return 0;
955 
956 nla_put_failure:
957 	return -ENOBUFS;
958 }
959 
960 static int nl80211_put_iface_combinations(struct wiphy *wiphy,
961 					  struct sk_buff *msg,
962 					  bool large)
963 {
964 	struct nlattr *nl_combis;
965 	int i, j;
966 
967 	nl_combis = nla_nest_start(msg,
968 				NL80211_ATTR_INTERFACE_COMBINATIONS);
969 	if (!nl_combis)
970 		goto nla_put_failure;
971 
972 	for (i = 0; i < wiphy->n_iface_combinations; i++) {
973 		const struct ieee80211_iface_combination *c;
974 		struct nlattr *nl_combi, *nl_limits;
975 
976 		c = &wiphy->iface_combinations[i];
977 
978 		nl_combi = nla_nest_start(msg, i + 1);
979 		if (!nl_combi)
980 			goto nla_put_failure;
981 
982 		nl_limits = nla_nest_start(msg, NL80211_IFACE_COMB_LIMITS);
983 		if (!nl_limits)
984 			goto nla_put_failure;
985 
986 		for (j = 0; j < c->n_limits; j++) {
987 			struct nlattr *nl_limit;
988 
989 			nl_limit = nla_nest_start(msg, j + 1);
990 			if (!nl_limit)
991 				goto nla_put_failure;
992 			if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX,
993 					c->limits[j].max))
994 				goto nla_put_failure;
995 			if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
996 						c->limits[j].types))
997 				goto nla_put_failure;
998 			nla_nest_end(msg, nl_limit);
999 		}
1000 
1001 		nla_nest_end(msg, nl_limits);
1002 
1003 		if (c->beacon_int_infra_match &&
1004 		    nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
1005 			goto nla_put_failure;
1006 		if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
1007 				c->num_different_channels) ||
1008 		    nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
1009 				c->max_interfaces))
1010 			goto nla_put_failure;
1011 		if (large &&
1012 		    (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
1013 				c->radar_detect_widths) ||
1014 		     nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
1015 				c->radar_detect_regions)))
1016 			goto nla_put_failure;
1017 
1018 		nla_nest_end(msg, nl_combi);
1019 	}
1020 
1021 	nla_nest_end(msg, nl_combis);
1022 
1023 	return 0;
1024 nla_put_failure:
1025 	return -ENOBUFS;
1026 }
1027 
1028 #ifdef CONFIG_PM
1029 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev,
1030 					struct sk_buff *msg)
1031 {
1032 	const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp;
1033 	struct nlattr *nl_tcp;
1034 
1035 	if (!tcp)
1036 		return 0;
1037 
1038 	nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
1039 	if (!nl_tcp)
1040 		return -ENOBUFS;
1041 
1042 	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
1043 			tcp->data_payload_max))
1044 		return -ENOBUFS;
1045 
1046 	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
1047 			tcp->data_payload_max))
1048 		return -ENOBUFS;
1049 
1050 	if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ))
1051 		return -ENOBUFS;
1052 
1053 	if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
1054 				sizeof(*tcp->tok), tcp->tok))
1055 		return -ENOBUFS;
1056 
1057 	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
1058 			tcp->data_interval_max))
1059 		return -ENOBUFS;
1060 
1061 	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
1062 			tcp->wake_payload_max))
1063 		return -ENOBUFS;
1064 
1065 	nla_nest_end(msg, nl_tcp);
1066 	return 0;
1067 }
1068 
1069 static int nl80211_send_wowlan(struct sk_buff *msg,
1070 			       struct cfg80211_registered_device *rdev,
1071 			       bool large)
1072 {
1073 	struct nlattr *nl_wowlan;
1074 
1075 	if (!rdev->wiphy.wowlan)
1076 		return 0;
1077 
1078 	nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED);
1079 	if (!nl_wowlan)
1080 		return -ENOBUFS;
1081 
1082 	if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) &&
1083 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
1084 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) &&
1085 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
1086 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) &&
1087 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
1088 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) &&
1089 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) ||
1090 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
1091 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
1092 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) &&
1093 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
1094 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) &&
1095 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
1096 	    ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) &&
1097 	     nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
1098 		return -ENOBUFS;
1099 
1100 	if (rdev->wiphy.wowlan->n_patterns) {
1101 		struct nl80211_pattern_support pat = {
1102 			.max_patterns = rdev->wiphy.wowlan->n_patterns,
1103 			.min_pattern_len = rdev->wiphy.wowlan->pattern_min_len,
1104 			.max_pattern_len = rdev->wiphy.wowlan->pattern_max_len,
1105 			.max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset,
1106 		};
1107 
1108 		if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
1109 			    sizeof(pat), &pat))
1110 			return -ENOBUFS;
1111 	}
1112 
1113 	if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) &&
1114 	    nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT,
1115 			rdev->wiphy.wowlan->max_nd_match_sets))
1116 		return -ENOBUFS;
1117 
1118 	if (large && nl80211_send_wowlan_tcp_caps(rdev, msg))
1119 		return -ENOBUFS;
1120 
1121 	nla_nest_end(msg, nl_wowlan);
1122 
1123 	return 0;
1124 }
1125 #endif
1126 
1127 static int nl80211_send_coalesce(struct sk_buff *msg,
1128 				 struct cfg80211_registered_device *rdev)
1129 {
1130 	struct nl80211_coalesce_rule_support rule;
1131 
1132 	if (!rdev->wiphy.coalesce)
1133 		return 0;
1134 
1135 	rule.max_rules = rdev->wiphy.coalesce->n_rules;
1136 	rule.max_delay = rdev->wiphy.coalesce->max_delay;
1137 	rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns;
1138 	rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len;
1139 	rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len;
1140 	rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset;
1141 
1142 	if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule))
1143 		return -ENOBUFS;
1144 
1145 	return 0;
1146 }
1147 
1148 static int nl80211_send_band_rateinfo(struct sk_buff *msg,
1149 				      struct ieee80211_supported_band *sband)
1150 {
1151 	struct nlattr *nl_rates, *nl_rate;
1152 	struct ieee80211_rate *rate;
1153 	int i;
1154 
1155 	/* add HT info */
1156 	if (sband->ht_cap.ht_supported &&
1157 	    (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET,
1158 		     sizeof(sband->ht_cap.mcs),
1159 		     &sband->ht_cap.mcs) ||
1160 	     nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA,
1161 			 sband->ht_cap.cap) ||
1162 	     nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
1163 			sband->ht_cap.ampdu_factor) ||
1164 	     nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
1165 			sband->ht_cap.ampdu_density)))
1166 		return -ENOBUFS;
1167 
1168 	/* add VHT info */
1169 	if (sband->vht_cap.vht_supported &&
1170 	    (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET,
1171 		     sizeof(sband->vht_cap.vht_mcs),
1172 		     &sband->vht_cap.vht_mcs) ||
1173 	     nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA,
1174 			 sband->vht_cap.cap)))
1175 		return -ENOBUFS;
1176 
1177 	/* add bitrates */
1178 	nl_rates = nla_nest_start(msg, NL80211_BAND_ATTR_RATES);
1179 	if (!nl_rates)
1180 		return -ENOBUFS;
1181 
1182 	for (i = 0; i < sband->n_bitrates; i++) {
1183 		nl_rate = nla_nest_start(msg, i);
1184 		if (!nl_rate)
1185 			return -ENOBUFS;
1186 
1187 		rate = &sband->bitrates[i];
1188 		if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE,
1189 				rate->bitrate))
1190 			return -ENOBUFS;
1191 		if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) &&
1192 		    nla_put_flag(msg,
1193 				 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE))
1194 			return -ENOBUFS;
1195 
1196 		nla_nest_end(msg, nl_rate);
1197 	}
1198 
1199 	nla_nest_end(msg, nl_rates);
1200 
1201 	return 0;
1202 }
1203 
1204 static int
1205 nl80211_send_mgmt_stypes(struct sk_buff *msg,
1206 			 const struct ieee80211_txrx_stypes *mgmt_stypes)
1207 {
1208 	u16 stypes;
1209 	struct nlattr *nl_ftypes, *nl_ifs;
1210 	enum nl80211_iftype ift;
1211 	int i;
1212 
1213 	if (!mgmt_stypes)
1214 		return 0;
1215 
1216 	nl_ifs = nla_nest_start(msg, NL80211_ATTR_TX_FRAME_TYPES);
1217 	if (!nl_ifs)
1218 		return -ENOBUFS;
1219 
1220 	for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1221 		nl_ftypes = nla_nest_start(msg, ift);
1222 		if (!nl_ftypes)
1223 			return -ENOBUFS;
1224 		i = 0;
1225 		stypes = mgmt_stypes[ift].tx;
1226 		while (stypes) {
1227 			if ((stypes & 1) &&
1228 			    nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1229 					(i << 4) | IEEE80211_FTYPE_MGMT))
1230 				return -ENOBUFS;
1231 			stypes >>= 1;
1232 			i++;
1233 		}
1234 		nla_nest_end(msg, nl_ftypes);
1235 	}
1236 
1237 	nla_nest_end(msg, nl_ifs);
1238 
1239 	nl_ifs = nla_nest_start(msg, NL80211_ATTR_RX_FRAME_TYPES);
1240 	if (!nl_ifs)
1241 		return -ENOBUFS;
1242 
1243 	for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1244 		nl_ftypes = nla_nest_start(msg, ift);
1245 		if (!nl_ftypes)
1246 			return -ENOBUFS;
1247 		i = 0;
1248 		stypes = mgmt_stypes[ift].rx;
1249 		while (stypes) {
1250 			if ((stypes & 1) &&
1251 			    nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1252 					(i << 4) | IEEE80211_FTYPE_MGMT))
1253 				return -ENOBUFS;
1254 			stypes >>= 1;
1255 			i++;
1256 		}
1257 		nla_nest_end(msg, nl_ftypes);
1258 	}
1259 	nla_nest_end(msg, nl_ifs);
1260 
1261 	return 0;
1262 }
1263 
1264 struct nl80211_dump_wiphy_state {
1265 	s64 filter_wiphy;
1266 	long start;
1267 	long split_start, band_start, chan_start;
1268 	bool split;
1269 };
1270 
1271 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
1272 			      enum nl80211_commands cmd,
1273 			      struct sk_buff *msg, u32 portid, u32 seq,
1274 			      int flags, struct nl80211_dump_wiphy_state *state)
1275 {
1276 	void *hdr;
1277 	struct nlattr *nl_bands, *nl_band;
1278 	struct nlattr *nl_freqs, *nl_freq;
1279 	struct nlattr *nl_cmds;
1280 	enum ieee80211_band band;
1281 	struct ieee80211_channel *chan;
1282 	int i;
1283 	const struct ieee80211_txrx_stypes *mgmt_stypes =
1284 				rdev->wiphy.mgmt_stypes;
1285 	u32 features;
1286 
1287 	hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
1288 	if (!hdr)
1289 		return -ENOBUFS;
1290 
1291 	if (WARN_ON(!state))
1292 		return -EINVAL;
1293 
1294 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
1295 	    nla_put_string(msg, NL80211_ATTR_WIPHY_NAME,
1296 			   wiphy_name(&rdev->wiphy)) ||
1297 	    nla_put_u32(msg, NL80211_ATTR_GENERATION,
1298 			cfg80211_rdev_list_generation))
1299 		goto nla_put_failure;
1300 
1301 	if (cmd != NL80211_CMD_NEW_WIPHY)
1302 		goto finish;
1303 
1304 	switch (state->split_start) {
1305 	case 0:
1306 		if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
1307 			       rdev->wiphy.retry_short) ||
1308 		    nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
1309 			       rdev->wiphy.retry_long) ||
1310 		    nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
1311 				rdev->wiphy.frag_threshold) ||
1312 		    nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
1313 				rdev->wiphy.rts_threshold) ||
1314 		    nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS,
1315 			       rdev->wiphy.coverage_class) ||
1316 		    nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
1317 			       rdev->wiphy.max_scan_ssids) ||
1318 		    nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
1319 			       rdev->wiphy.max_sched_scan_ssids) ||
1320 		    nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
1321 				rdev->wiphy.max_scan_ie_len) ||
1322 		    nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
1323 				rdev->wiphy.max_sched_scan_ie_len) ||
1324 		    nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS,
1325 			       rdev->wiphy.max_match_sets) ||
1326 		    nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS,
1327 				rdev->wiphy.max_sched_scan_plans) ||
1328 		    nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL,
1329 				rdev->wiphy.max_sched_scan_plan_interval) ||
1330 		    nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
1331 				rdev->wiphy.max_sched_scan_plan_iterations))
1332 			goto nla_put_failure;
1333 
1334 		if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) &&
1335 		    nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN))
1336 			goto nla_put_failure;
1337 		if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
1338 		    nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH))
1339 			goto nla_put_failure;
1340 		if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) &&
1341 		    nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD))
1342 			goto nla_put_failure;
1343 		if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) &&
1344 		    nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT))
1345 			goto nla_put_failure;
1346 		if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) &&
1347 		    nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT))
1348 			goto nla_put_failure;
1349 		if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) &&
1350 		    nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP))
1351 			goto nla_put_failure;
1352 		state->split_start++;
1353 		if (state->split)
1354 			break;
1355 	case 1:
1356 		if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES,
1357 			    sizeof(u32) * rdev->wiphy.n_cipher_suites,
1358 			    rdev->wiphy.cipher_suites))
1359 			goto nla_put_failure;
1360 
1361 		if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS,
1362 			       rdev->wiphy.max_num_pmkids))
1363 			goto nla_put_failure;
1364 
1365 		if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
1366 		    nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE))
1367 			goto nla_put_failure;
1368 
1369 		if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
1370 				rdev->wiphy.available_antennas_tx) ||
1371 		    nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
1372 				rdev->wiphy.available_antennas_rx))
1373 			goto nla_put_failure;
1374 
1375 		if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) &&
1376 		    nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD,
1377 				rdev->wiphy.probe_resp_offload))
1378 			goto nla_put_failure;
1379 
1380 		if ((rdev->wiphy.available_antennas_tx ||
1381 		     rdev->wiphy.available_antennas_rx) &&
1382 		    rdev->ops->get_antenna) {
1383 			u32 tx_ant = 0, rx_ant = 0;
1384 			int res;
1385 			res = rdev_get_antenna(rdev, &tx_ant, &rx_ant);
1386 			if (!res) {
1387 				if (nla_put_u32(msg,
1388 						NL80211_ATTR_WIPHY_ANTENNA_TX,
1389 						tx_ant) ||
1390 				    nla_put_u32(msg,
1391 						NL80211_ATTR_WIPHY_ANTENNA_RX,
1392 						rx_ant))
1393 					goto nla_put_failure;
1394 			}
1395 		}
1396 
1397 		state->split_start++;
1398 		if (state->split)
1399 			break;
1400 	case 2:
1401 		if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
1402 					rdev->wiphy.interface_modes))
1403 				goto nla_put_failure;
1404 		state->split_start++;
1405 		if (state->split)
1406 			break;
1407 	case 3:
1408 		nl_bands = nla_nest_start(msg, NL80211_ATTR_WIPHY_BANDS);
1409 		if (!nl_bands)
1410 			goto nla_put_failure;
1411 
1412 		for (band = state->band_start;
1413 		     band < IEEE80211_NUM_BANDS; band++) {
1414 			struct ieee80211_supported_band *sband;
1415 
1416 			sband = rdev->wiphy.bands[band];
1417 
1418 			if (!sband)
1419 				continue;
1420 
1421 			nl_band = nla_nest_start(msg, band);
1422 			if (!nl_band)
1423 				goto nla_put_failure;
1424 
1425 			switch (state->chan_start) {
1426 			case 0:
1427 				if (nl80211_send_band_rateinfo(msg, sband))
1428 					goto nla_put_failure;
1429 				state->chan_start++;
1430 				if (state->split)
1431 					break;
1432 			default:
1433 				/* add frequencies */
1434 				nl_freqs = nla_nest_start(
1435 					msg, NL80211_BAND_ATTR_FREQS);
1436 				if (!nl_freqs)
1437 					goto nla_put_failure;
1438 
1439 				for (i = state->chan_start - 1;
1440 				     i < sband->n_channels;
1441 				     i++) {
1442 					nl_freq = nla_nest_start(msg, i);
1443 					if (!nl_freq)
1444 						goto nla_put_failure;
1445 
1446 					chan = &sband->channels[i];
1447 
1448 					if (nl80211_msg_put_channel(
1449 							msg, chan,
1450 							state->split))
1451 						goto nla_put_failure;
1452 
1453 					nla_nest_end(msg, nl_freq);
1454 					if (state->split)
1455 						break;
1456 				}
1457 				if (i < sband->n_channels)
1458 					state->chan_start = i + 2;
1459 				else
1460 					state->chan_start = 0;
1461 				nla_nest_end(msg, nl_freqs);
1462 			}
1463 
1464 			nla_nest_end(msg, nl_band);
1465 
1466 			if (state->split) {
1467 				/* start again here */
1468 				if (state->chan_start)
1469 					band--;
1470 				break;
1471 			}
1472 		}
1473 		nla_nest_end(msg, nl_bands);
1474 
1475 		if (band < IEEE80211_NUM_BANDS)
1476 			state->band_start = band + 1;
1477 		else
1478 			state->band_start = 0;
1479 
1480 		/* if bands & channels are done, continue outside */
1481 		if (state->band_start == 0 && state->chan_start == 0)
1482 			state->split_start++;
1483 		if (state->split)
1484 			break;
1485 	case 4:
1486 		nl_cmds = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_COMMANDS);
1487 		if (!nl_cmds)
1488 			goto nla_put_failure;
1489 
1490 		i = 0;
1491 #define CMD(op, n)							\
1492 		 do {							\
1493 			if (rdev->ops->op) {				\
1494 				i++;					\
1495 				if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \
1496 					goto nla_put_failure;		\
1497 			}						\
1498 		} while (0)
1499 
1500 		CMD(add_virtual_intf, NEW_INTERFACE);
1501 		CMD(change_virtual_intf, SET_INTERFACE);
1502 		CMD(add_key, NEW_KEY);
1503 		CMD(start_ap, START_AP);
1504 		CMD(add_station, NEW_STATION);
1505 		CMD(add_mpath, NEW_MPATH);
1506 		CMD(update_mesh_config, SET_MESH_CONFIG);
1507 		CMD(change_bss, SET_BSS);
1508 		CMD(auth, AUTHENTICATE);
1509 		CMD(assoc, ASSOCIATE);
1510 		CMD(deauth, DEAUTHENTICATE);
1511 		CMD(disassoc, DISASSOCIATE);
1512 		CMD(join_ibss, JOIN_IBSS);
1513 		CMD(join_mesh, JOIN_MESH);
1514 		CMD(set_pmksa, SET_PMKSA);
1515 		CMD(del_pmksa, DEL_PMKSA);
1516 		CMD(flush_pmksa, FLUSH_PMKSA);
1517 		if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)
1518 			CMD(remain_on_channel, REMAIN_ON_CHANNEL);
1519 		CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
1520 		CMD(mgmt_tx, FRAME);
1521 		CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL);
1522 		if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) {
1523 			i++;
1524 			if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS))
1525 				goto nla_put_failure;
1526 		}
1527 		if (rdev->ops->set_monitor_channel || rdev->ops->start_ap ||
1528 		    rdev->ops->join_mesh) {
1529 			i++;
1530 			if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL))
1531 				goto nla_put_failure;
1532 		}
1533 		CMD(set_wds_peer, SET_WDS_PEER);
1534 		if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) {
1535 			CMD(tdls_mgmt, TDLS_MGMT);
1536 			CMD(tdls_oper, TDLS_OPER);
1537 		}
1538 		if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN)
1539 			CMD(sched_scan_start, START_SCHED_SCAN);
1540 		CMD(probe_client, PROBE_CLIENT);
1541 		CMD(set_noack_map, SET_NOACK_MAP);
1542 		if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) {
1543 			i++;
1544 			if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS))
1545 				goto nla_put_failure;
1546 		}
1547 		CMD(start_p2p_device, START_P2P_DEVICE);
1548 		CMD(set_mcast_rate, SET_MCAST_RATE);
1549 #ifdef CONFIG_NL80211_TESTMODE
1550 		CMD(testmode_cmd, TESTMODE);
1551 #endif
1552 		if (state->split) {
1553 			CMD(crit_proto_start, CRIT_PROTOCOL_START);
1554 			CMD(crit_proto_stop, CRIT_PROTOCOL_STOP);
1555 			if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)
1556 				CMD(channel_switch, CHANNEL_SWITCH);
1557 			CMD(set_qos_map, SET_QOS_MAP);
1558 			if (rdev->wiphy.features &
1559 					NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)
1560 				CMD(add_tx_ts, ADD_TX_TS);
1561 		}
1562 		/* add into the if now */
1563 #undef CMD
1564 
1565 		if (rdev->ops->connect || rdev->ops->auth) {
1566 			i++;
1567 			if (nla_put_u32(msg, i, NL80211_CMD_CONNECT))
1568 				goto nla_put_failure;
1569 		}
1570 
1571 		if (rdev->ops->disconnect || rdev->ops->deauth) {
1572 			i++;
1573 			if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT))
1574 				goto nla_put_failure;
1575 		}
1576 
1577 		nla_nest_end(msg, nl_cmds);
1578 		state->split_start++;
1579 		if (state->split)
1580 			break;
1581 	case 5:
1582 		if (rdev->ops->remain_on_channel &&
1583 		    (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) &&
1584 		    nla_put_u32(msg,
1585 				NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
1586 				rdev->wiphy.max_remain_on_channel_duration))
1587 			goto nla_put_failure;
1588 
1589 		if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) &&
1590 		    nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK))
1591 			goto nla_put_failure;
1592 
1593 		if (nl80211_send_mgmt_stypes(msg, mgmt_stypes))
1594 			goto nla_put_failure;
1595 		state->split_start++;
1596 		if (state->split)
1597 			break;
1598 	case 6:
1599 #ifdef CONFIG_PM
1600 		if (nl80211_send_wowlan(msg, rdev, state->split))
1601 			goto nla_put_failure;
1602 		state->split_start++;
1603 		if (state->split)
1604 			break;
1605 #else
1606 		state->split_start++;
1607 #endif
1608 	case 7:
1609 		if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
1610 					rdev->wiphy.software_iftypes))
1611 			goto nla_put_failure;
1612 
1613 		if (nl80211_put_iface_combinations(&rdev->wiphy, msg,
1614 						   state->split))
1615 			goto nla_put_failure;
1616 
1617 		state->split_start++;
1618 		if (state->split)
1619 			break;
1620 	case 8:
1621 		if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) &&
1622 		    nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME,
1623 				rdev->wiphy.ap_sme_capa))
1624 			goto nla_put_failure;
1625 
1626 		features = rdev->wiphy.features;
1627 		/*
1628 		 * We can only add the per-channel limit information if the
1629 		 * dump is split, otherwise it makes it too big. Therefore
1630 		 * only advertise it in that case.
1631 		 */
1632 		if (state->split)
1633 			features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS;
1634 		if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features))
1635 			goto nla_put_failure;
1636 
1637 		if (rdev->wiphy.ht_capa_mod_mask &&
1638 		    nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK,
1639 			    sizeof(*rdev->wiphy.ht_capa_mod_mask),
1640 			    rdev->wiphy.ht_capa_mod_mask))
1641 			goto nla_put_failure;
1642 
1643 		if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME &&
1644 		    rdev->wiphy.max_acl_mac_addrs &&
1645 		    nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX,
1646 				rdev->wiphy.max_acl_mac_addrs))
1647 			goto nla_put_failure;
1648 
1649 		/*
1650 		 * Any information below this point is only available to
1651 		 * applications that can deal with it being split. This
1652 		 * helps ensure that newly added capabilities don't break
1653 		 * older tools by overrunning their buffers.
1654 		 *
1655 		 * We still increment split_start so that in the split
1656 		 * case we'll continue with more data in the next round,
1657 		 * but break unconditionally so unsplit data stops here.
1658 		 */
1659 		state->split_start++;
1660 		break;
1661 	case 9:
1662 		if (rdev->wiphy.extended_capabilities &&
1663 		    (nla_put(msg, NL80211_ATTR_EXT_CAPA,
1664 			     rdev->wiphy.extended_capabilities_len,
1665 			     rdev->wiphy.extended_capabilities) ||
1666 		     nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
1667 			     rdev->wiphy.extended_capabilities_len,
1668 			     rdev->wiphy.extended_capabilities_mask)))
1669 			goto nla_put_failure;
1670 
1671 		if (rdev->wiphy.vht_capa_mod_mask &&
1672 		    nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK,
1673 			    sizeof(*rdev->wiphy.vht_capa_mod_mask),
1674 			    rdev->wiphy.vht_capa_mod_mask))
1675 			goto nla_put_failure;
1676 
1677 		state->split_start++;
1678 		break;
1679 	case 10:
1680 		if (nl80211_send_coalesce(msg, rdev))
1681 			goto nla_put_failure;
1682 
1683 		if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) &&
1684 		    (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) ||
1685 		     nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ)))
1686 			goto nla_put_failure;
1687 
1688 		if (rdev->wiphy.max_ap_assoc_sta &&
1689 		    nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA,
1690 				rdev->wiphy.max_ap_assoc_sta))
1691 			goto nla_put_failure;
1692 
1693 		state->split_start++;
1694 		break;
1695 	case 11:
1696 		if (rdev->wiphy.n_vendor_commands) {
1697 			const struct nl80211_vendor_cmd_info *info;
1698 			struct nlattr *nested;
1699 
1700 			nested = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA);
1701 			if (!nested)
1702 				goto nla_put_failure;
1703 
1704 			for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
1705 				info = &rdev->wiphy.vendor_commands[i].info;
1706 				if (nla_put(msg, i + 1, sizeof(*info), info))
1707 					goto nla_put_failure;
1708 			}
1709 			nla_nest_end(msg, nested);
1710 		}
1711 
1712 		if (rdev->wiphy.n_vendor_events) {
1713 			const struct nl80211_vendor_cmd_info *info;
1714 			struct nlattr *nested;
1715 
1716 			nested = nla_nest_start(msg,
1717 						NL80211_ATTR_VENDOR_EVENTS);
1718 			if (!nested)
1719 				goto nla_put_failure;
1720 
1721 			for (i = 0; i < rdev->wiphy.n_vendor_events; i++) {
1722 				info = &rdev->wiphy.vendor_events[i];
1723 				if (nla_put(msg, i + 1, sizeof(*info), info))
1724 					goto nla_put_failure;
1725 			}
1726 			nla_nest_end(msg, nested);
1727 		}
1728 		state->split_start++;
1729 		break;
1730 	case 12:
1731 		if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH &&
1732 		    nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS,
1733 			       rdev->wiphy.max_num_csa_counters))
1734 			goto nla_put_failure;
1735 
1736 		if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
1737 		    nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
1738 			goto nla_put_failure;
1739 
1740 		if (nla_put(msg, NL80211_ATTR_EXT_FEATURES,
1741 			    sizeof(rdev->wiphy.ext_features),
1742 			    rdev->wiphy.ext_features))
1743 			goto nla_put_failure;
1744 
1745 		if (rdev->wiphy.bss_select_support) {
1746 			struct nlattr *nested;
1747 			u32 bss_select_support = rdev->wiphy.bss_select_support;
1748 
1749 			nested = nla_nest_start(msg, NL80211_ATTR_BSS_SELECT);
1750 			if (!nested)
1751 				goto nla_put_failure;
1752 
1753 			i = 0;
1754 			while (bss_select_support) {
1755 				if ((bss_select_support & 1) &&
1756 				    nla_put_flag(msg, i))
1757 					goto nla_put_failure;
1758 				i++;
1759 				bss_select_support >>= 1;
1760 			}
1761 			nla_nest_end(msg, nested);
1762 		}
1763 
1764 		/* done */
1765 		state->split_start = 0;
1766 		break;
1767 	}
1768  finish:
1769 	genlmsg_end(msg, hdr);
1770 	return 0;
1771 
1772  nla_put_failure:
1773 	genlmsg_cancel(msg, hdr);
1774 	return -EMSGSIZE;
1775 }
1776 
1777 static int nl80211_dump_wiphy_parse(struct sk_buff *skb,
1778 				    struct netlink_callback *cb,
1779 				    struct nl80211_dump_wiphy_state *state)
1780 {
1781 	struct nlattr **tb = nl80211_fam.attrbuf;
1782 	int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
1783 			      tb, nl80211_fam.maxattr, nl80211_policy);
1784 	/* ignore parse errors for backward compatibility */
1785 	if (ret)
1786 		return 0;
1787 
1788 	state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP];
1789 	if (tb[NL80211_ATTR_WIPHY])
1790 		state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
1791 	if (tb[NL80211_ATTR_WDEV])
1792 		state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32;
1793 	if (tb[NL80211_ATTR_IFINDEX]) {
1794 		struct net_device *netdev;
1795 		struct cfg80211_registered_device *rdev;
1796 		int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
1797 
1798 		netdev = __dev_get_by_index(sock_net(skb->sk), ifidx);
1799 		if (!netdev)
1800 			return -ENODEV;
1801 		if (netdev->ieee80211_ptr) {
1802 			rdev = wiphy_to_rdev(
1803 				netdev->ieee80211_ptr->wiphy);
1804 			state->filter_wiphy = rdev->wiphy_idx;
1805 		}
1806 	}
1807 
1808 	return 0;
1809 }
1810 
1811 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
1812 {
1813 	int idx = 0, ret;
1814 	struct nl80211_dump_wiphy_state *state = (void *)cb->args[0];
1815 	struct cfg80211_registered_device *rdev;
1816 
1817 	rtnl_lock();
1818 	if (!state) {
1819 		state = kzalloc(sizeof(*state), GFP_KERNEL);
1820 		if (!state) {
1821 			rtnl_unlock();
1822 			return -ENOMEM;
1823 		}
1824 		state->filter_wiphy = -1;
1825 		ret = nl80211_dump_wiphy_parse(skb, cb, state);
1826 		if (ret) {
1827 			kfree(state);
1828 			rtnl_unlock();
1829 			return ret;
1830 		}
1831 		cb->args[0] = (long)state;
1832 	}
1833 
1834 	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
1835 		if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
1836 			continue;
1837 		if (++idx <= state->start)
1838 			continue;
1839 		if (state->filter_wiphy != -1 &&
1840 		    state->filter_wiphy != rdev->wiphy_idx)
1841 			continue;
1842 		/* attempt to fit multiple wiphy data chunks into the skb */
1843 		do {
1844 			ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY,
1845 						 skb,
1846 						 NETLINK_CB(cb->skb).portid,
1847 						 cb->nlh->nlmsg_seq,
1848 						 NLM_F_MULTI, state);
1849 			if (ret < 0) {
1850 				/*
1851 				 * If sending the wiphy data didn't fit (ENOBUFS
1852 				 * or EMSGSIZE returned), this SKB is still
1853 				 * empty (so it's not too big because another
1854 				 * wiphy dataset is already in the skb) and
1855 				 * we've not tried to adjust the dump allocation
1856 				 * yet ... then adjust the alloc size to be
1857 				 * bigger, and return 1 but with the empty skb.
1858 				 * This results in an empty message being RX'ed
1859 				 * in userspace, but that is ignored.
1860 				 *
1861 				 * We can then retry with the larger buffer.
1862 				 */
1863 				if ((ret == -ENOBUFS || ret == -EMSGSIZE) &&
1864 				    !skb->len && !state->split &&
1865 				    cb->min_dump_alloc < 4096) {
1866 					cb->min_dump_alloc = 4096;
1867 					state->split_start = 0;
1868 					rtnl_unlock();
1869 					return 1;
1870 				}
1871 				idx--;
1872 				break;
1873 			}
1874 		} while (state->split_start > 0);
1875 		break;
1876 	}
1877 	rtnl_unlock();
1878 
1879 	state->start = idx;
1880 
1881 	return skb->len;
1882 }
1883 
1884 static int nl80211_dump_wiphy_done(struct netlink_callback *cb)
1885 {
1886 	kfree((void *)cb->args[0]);
1887 	return 0;
1888 }
1889 
1890 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
1891 {
1892 	struct sk_buff *msg;
1893 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
1894 	struct nl80211_dump_wiphy_state state = {};
1895 
1896 	msg = nlmsg_new(4096, GFP_KERNEL);
1897 	if (!msg)
1898 		return -ENOMEM;
1899 
1900 	if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg,
1901 			       info->snd_portid, info->snd_seq, 0,
1902 			       &state) < 0) {
1903 		nlmsg_free(msg);
1904 		return -ENOBUFS;
1905 	}
1906 
1907 	return genlmsg_reply(msg, info);
1908 }
1909 
1910 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
1911 	[NL80211_TXQ_ATTR_QUEUE]		= { .type = NLA_U8 },
1912 	[NL80211_TXQ_ATTR_TXOP]			= { .type = NLA_U16 },
1913 	[NL80211_TXQ_ATTR_CWMIN]		= { .type = NLA_U16 },
1914 	[NL80211_TXQ_ATTR_CWMAX]		= { .type = NLA_U16 },
1915 	[NL80211_TXQ_ATTR_AIFS]			= { .type = NLA_U8 },
1916 };
1917 
1918 static int parse_txq_params(struct nlattr *tb[],
1919 			    struct ieee80211_txq_params *txq_params)
1920 {
1921 	if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] ||
1922 	    !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
1923 	    !tb[NL80211_TXQ_ATTR_AIFS])
1924 		return -EINVAL;
1925 
1926 	txq_params->ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]);
1927 	txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
1928 	txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
1929 	txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
1930 	txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
1931 
1932 	if (txq_params->ac >= NL80211_NUM_ACS)
1933 		return -EINVAL;
1934 
1935 	return 0;
1936 }
1937 
1938 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
1939 {
1940 	/*
1941 	 * You can only set the channel explicitly for WDS interfaces,
1942 	 * all others have their channel managed via their respective
1943 	 * "establish a connection" command (connect, join, ...)
1944 	 *
1945 	 * For AP/GO and mesh mode, the channel can be set with the
1946 	 * channel userspace API, but is only stored and passed to the
1947 	 * low-level driver when the AP starts or the mesh is joined.
1948 	 * This is for backward compatibility, userspace can also give
1949 	 * the channel in the start-ap or join-mesh commands instead.
1950 	 *
1951 	 * Monitors are special as they are normally slaved to
1952 	 * whatever else is going on, so they have their own special
1953 	 * operation to set the monitor channel if possible.
1954 	 */
1955 	return !wdev ||
1956 		wdev->iftype == NL80211_IFTYPE_AP ||
1957 		wdev->iftype == NL80211_IFTYPE_MESH_POINT ||
1958 		wdev->iftype == NL80211_IFTYPE_MONITOR ||
1959 		wdev->iftype == NL80211_IFTYPE_P2P_GO;
1960 }
1961 
1962 static int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
1963 				 struct genl_info *info,
1964 				 struct cfg80211_chan_def *chandef)
1965 {
1966 	u32 control_freq;
1967 
1968 	if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
1969 		return -EINVAL;
1970 
1971 	control_freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
1972 
1973 	chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq);
1974 	chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
1975 	chandef->center_freq1 = control_freq;
1976 	chandef->center_freq2 = 0;
1977 
1978 	/* Primary channel not allowed */
1979 	if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED)
1980 		return -EINVAL;
1981 
1982 	if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
1983 		enum nl80211_channel_type chantype;
1984 
1985 		chantype = nla_get_u32(
1986 				info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
1987 
1988 		switch (chantype) {
1989 		case NL80211_CHAN_NO_HT:
1990 		case NL80211_CHAN_HT20:
1991 		case NL80211_CHAN_HT40PLUS:
1992 		case NL80211_CHAN_HT40MINUS:
1993 			cfg80211_chandef_create(chandef, chandef->chan,
1994 						chantype);
1995 			break;
1996 		default:
1997 			return -EINVAL;
1998 		}
1999 	} else if (info->attrs[NL80211_ATTR_CHANNEL_WIDTH]) {
2000 		chandef->width =
2001 			nla_get_u32(info->attrs[NL80211_ATTR_CHANNEL_WIDTH]);
2002 		if (info->attrs[NL80211_ATTR_CENTER_FREQ1])
2003 			chandef->center_freq1 =
2004 				nla_get_u32(
2005 					info->attrs[NL80211_ATTR_CENTER_FREQ1]);
2006 		if (info->attrs[NL80211_ATTR_CENTER_FREQ2])
2007 			chandef->center_freq2 =
2008 				nla_get_u32(
2009 					info->attrs[NL80211_ATTR_CENTER_FREQ2]);
2010 	}
2011 
2012 	if (!cfg80211_chandef_valid(chandef))
2013 		return -EINVAL;
2014 
2015 	if (!cfg80211_chandef_usable(&rdev->wiphy, chandef,
2016 				     IEEE80211_CHAN_DISABLED))
2017 		return -EINVAL;
2018 
2019 	if ((chandef->width == NL80211_CHAN_WIDTH_5 ||
2020 	     chandef->width == NL80211_CHAN_WIDTH_10) &&
2021 	    !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ))
2022 		return -EINVAL;
2023 
2024 	return 0;
2025 }
2026 
2027 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
2028 				 struct net_device *dev,
2029 				 struct genl_info *info)
2030 {
2031 	struct cfg80211_chan_def chandef;
2032 	int result;
2033 	enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR;
2034 	struct wireless_dev *wdev = NULL;
2035 
2036 	if (dev)
2037 		wdev = dev->ieee80211_ptr;
2038 	if (!nl80211_can_set_dev_channel(wdev))
2039 		return -EOPNOTSUPP;
2040 	if (wdev)
2041 		iftype = wdev->iftype;
2042 
2043 	result = nl80211_parse_chandef(rdev, info, &chandef);
2044 	if (result)
2045 		return result;
2046 
2047 	switch (iftype) {
2048 	case NL80211_IFTYPE_AP:
2049 	case NL80211_IFTYPE_P2P_GO:
2050 		if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
2051 						   iftype)) {
2052 			result = -EINVAL;
2053 			break;
2054 		}
2055 		if (wdev->beacon_interval) {
2056 			if (!dev || !rdev->ops->set_ap_chanwidth ||
2057 			    !(rdev->wiphy.features &
2058 			      NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) {
2059 				result = -EBUSY;
2060 				break;
2061 			}
2062 
2063 			/* Only allow dynamic channel width changes */
2064 			if (chandef.chan != wdev->preset_chandef.chan) {
2065 				result = -EBUSY;
2066 				break;
2067 			}
2068 			result = rdev_set_ap_chanwidth(rdev, dev, &chandef);
2069 			if (result)
2070 				break;
2071 		}
2072 		wdev->preset_chandef = chandef;
2073 		result = 0;
2074 		break;
2075 	case NL80211_IFTYPE_MESH_POINT:
2076 		result = cfg80211_set_mesh_channel(rdev, wdev, &chandef);
2077 		break;
2078 	case NL80211_IFTYPE_MONITOR:
2079 		result = cfg80211_set_monitor_channel(rdev, &chandef);
2080 		break;
2081 	default:
2082 		result = -EINVAL;
2083 	}
2084 
2085 	return result;
2086 }
2087 
2088 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
2089 {
2090 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
2091 	struct net_device *netdev = info->user_ptr[1];
2092 
2093 	return __nl80211_set_channel(rdev, netdev, info);
2094 }
2095 
2096 static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info)
2097 {
2098 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
2099 	struct net_device *dev = info->user_ptr[1];
2100 	struct wireless_dev *wdev = dev->ieee80211_ptr;
2101 	const u8 *bssid;
2102 
2103 	if (!info->attrs[NL80211_ATTR_MAC])
2104 		return -EINVAL;
2105 
2106 	if (netif_running(dev))
2107 		return -EBUSY;
2108 
2109 	if (!rdev->ops->set_wds_peer)
2110 		return -EOPNOTSUPP;
2111 
2112 	if (wdev->iftype != NL80211_IFTYPE_WDS)
2113 		return -EOPNOTSUPP;
2114 
2115 	bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
2116 	return rdev_set_wds_peer(rdev, dev, bssid);
2117 }
2118 
2119 
2120 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
2121 {
2122 	struct cfg80211_registered_device *rdev;
2123 	struct net_device *netdev = NULL;
2124 	struct wireless_dev *wdev;
2125 	int result = 0, rem_txq_params = 0;
2126 	struct nlattr *nl_txq_params;
2127 	u32 changed;
2128 	u8 retry_short = 0, retry_long = 0;
2129 	u32 frag_threshold = 0, rts_threshold = 0;
2130 	u8 coverage_class = 0;
2131 
2132 	ASSERT_RTNL();
2133 
2134 	/*
2135 	 * Try to find the wiphy and netdev. Normally this
2136 	 * function shouldn't need the netdev, but this is
2137 	 * done for backward compatibility -- previously
2138 	 * setting the channel was done per wiphy, but now
2139 	 * it is per netdev. Previous userland like hostapd
2140 	 * also passed a netdev to set_wiphy, so that it is
2141 	 * possible to let that go to the right netdev!
2142 	 */
2143 
2144 	if (info->attrs[NL80211_ATTR_IFINDEX]) {
2145 		int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
2146 
2147 		netdev = __dev_get_by_index(genl_info_net(info), ifindex);
2148 		if (netdev && netdev->ieee80211_ptr)
2149 			rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy);
2150 		else
2151 			netdev = NULL;
2152 	}
2153 
2154 	if (!netdev) {
2155 		rdev = __cfg80211_rdev_from_attrs(genl_info_net(info),
2156 						  info->attrs);
2157 		if (IS_ERR(rdev))
2158 			return PTR_ERR(rdev);
2159 		wdev = NULL;
2160 		netdev = NULL;
2161 		result = 0;
2162 	} else
2163 		wdev = netdev->ieee80211_ptr;
2164 
2165 	/*
2166 	 * end workaround code, by now the rdev is available
2167 	 * and locked, and wdev may or may not be NULL.
2168 	 */
2169 
2170 	if (info->attrs[NL80211_ATTR_WIPHY_NAME])
2171 		result = cfg80211_dev_rename(
2172 			rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
2173 
2174 	if (result)
2175 		return result;
2176 
2177 	if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
2178 		struct ieee80211_txq_params txq_params;
2179 		struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
2180 
2181 		if (!rdev->ops->set_txq_params)
2182 			return -EOPNOTSUPP;
2183 
2184 		if (!netdev)
2185 			return -EINVAL;
2186 
2187 		if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
2188 		    netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
2189 			return -EINVAL;
2190 
2191 		if (!netif_running(netdev))
2192 			return -ENETDOWN;
2193 
2194 		nla_for_each_nested(nl_txq_params,
2195 				    info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
2196 				    rem_txq_params) {
2197 			result = nla_parse(tb, NL80211_TXQ_ATTR_MAX,
2198 					   nla_data(nl_txq_params),
2199 					   nla_len(nl_txq_params),
2200 					   txq_params_policy);
2201 			if (result)
2202 				return result;
2203 			result = parse_txq_params(tb, &txq_params);
2204 			if (result)
2205 				return result;
2206 
2207 			result = rdev_set_txq_params(rdev, netdev,
2208 						     &txq_params);
2209 			if (result)
2210 				return result;
2211 		}
2212 	}
2213 
2214 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
2215 		result = __nl80211_set_channel(
2216 			rdev,
2217 			nl80211_can_set_dev_channel(wdev) ? netdev : NULL,
2218 			info);
2219 		if (result)
2220 			return result;
2221 	}
2222 
2223 	if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
2224 		struct wireless_dev *txp_wdev = wdev;
2225 		enum nl80211_tx_power_setting type;
2226 		int idx, mbm = 0;
2227 
2228 		if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER))
2229 			txp_wdev = NULL;
2230 
2231 		if (!rdev->ops->set_tx_power)
2232 			return -EOPNOTSUPP;
2233 
2234 		idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
2235 		type = nla_get_u32(info->attrs[idx]);
2236 
2237 		if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
2238 		    (type != NL80211_TX_POWER_AUTOMATIC))
2239 			return -EINVAL;
2240 
2241 		if (type != NL80211_TX_POWER_AUTOMATIC) {
2242 			idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
2243 			mbm = nla_get_u32(info->attrs[idx]);
2244 		}
2245 
2246 		result = rdev_set_tx_power(rdev, txp_wdev, type, mbm);
2247 		if (result)
2248 			return result;
2249 	}
2250 
2251 	if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
2252 	    info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
2253 		u32 tx_ant, rx_ant;
2254 		if ((!rdev->wiphy.available_antennas_tx &&
2255 		     !rdev->wiphy.available_antennas_rx) ||
2256 		    !rdev->ops->set_antenna)
2257 			return -EOPNOTSUPP;
2258 
2259 		tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
2260 		rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
2261 
2262 		/* reject antenna configurations which don't match the
2263 		 * available antenna masks, except for the "all" mask */
2264 		if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
2265 		    (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx)))
2266 			return -EINVAL;
2267 
2268 		tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
2269 		rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
2270 
2271 		result = rdev_set_antenna(rdev, tx_ant, rx_ant);
2272 		if (result)
2273 			return result;
2274 	}
2275 
2276 	changed = 0;
2277 
2278 	if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
2279 		retry_short = nla_get_u8(
2280 			info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
2281 		if (retry_short == 0)
2282 			return -EINVAL;
2283 
2284 		changed |= WIPHY_PARAM_RETRY_SHORT;
2285 	}
2286 
2287 	if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
2288 		retry_long = nla_get_u8(
2289 			info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
2290 		if (retry_long == 0)
2291 			return -EINVAL;
2292 
2293 		changed |= WIPHY_PARAM_RETRY_LONG;
2294 	}
2295 
2296 	if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
2297 		frag_threshold = nla_get_u32(
2298 			info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
2299 		if (frag_threshold < 256)
2300 			return -EINVAL;
2301 
2302 		if (frag_threshold != (u32) -1) {
2303 			/*
2304 			 * Fragments (apart from the last one) are required to
2305 			 * have even length. Make the fragmentation code
2306 			 * simpler by stripping LSB should someone try to use
2307 			 * odd threshold value.
2308 			 */
2309 			frag_threshold &= ~0x1;
2310 		}
2311 		changed |= WIPHY_PARAM_FRAG_THRESHOLD;
2312 	}
2313 
2314 	if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
2315 		rts_threshold = nla_get_u32(
2316 			info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
2317 		changed |= WIPHY_PARAM_RTS_THRESHOLD;
2318 	}
2319 
2320 	if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
2321 		if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK])
2322 			return -EINVAL;
2323 
2324 		coverage_class = nla_get_u8(
2325 			info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
2326 		changed |= WIPHY_PARAM_COVERAGE_CLASS;
2327 	}
2328 
2329 	if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) {
2330 		if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION))
2331 			return -EOPNOTSUPP;
2332 
2333 		changed |= WIPHY_PARAM_DYN_ACK;
2334 	}
2335 
2336 	if (changed) {
2337 		u8 old_retry_short, old_retry_long;
2338 		u32 old_frag_threshold, old_rts_threshold;
2339 		u8 old_coverage_class;
2340 
2341 		if (!rdev->ops->set_wiphy_params)
2342 			return -EOPNOTSUPP;
2343 
2344 		old_retry_short = rdev->wiphy.retry_short;
2345 		old_retry_long = rdev->wiphy.retry_long;
2346 		old_frag_threshold = rdev->wiphy.frag_threshold;
2347 		old_rts_threshold = rdev->wiphy.rts_threshold;
2348 		old_coverage_class = rdev->wiphy.coverage_class;
2349 
2350 		if (changed & WIPHY_PARAM_RETRY_SHORT)
2351 			rdev->wiphy.retry_short = retry_short;
2352 		if (changed & WIPHY_PARAM_RETRY_LONG)
2353 			rdev->wiphy.retry_long = retry_long;
2354 		if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
2355 			rdev->wiphy.frag_threshold = frag_threshold;
2356 		if (changed & WIPHY_PARAM_RTS_THRESHOLD)
2357 			rdev->wiphy.rts_threshold = rts_threshold;
2358 		if (changed & WIPHY_PARAM_COVERAGE_CLASS)
2359 			rdev->wiphy.coverage_class = coverage_class;
2360 
2361 		result = rdev_set_wiphy_params(rdev, changed);
2362 		if (result) {
2363 			rdev->wiphy.retry_short = old_retry_short;
2364 			rdev->wiphy.retry_long = old_retry_long;
2365 			rdev->wiphy.frag_threshold = old_frag_threshold;
2366 			rdev->wiphy.rts_threshold = old_rts_threshold;
2367 			rdev->wiphy.coverage_class = old_coverage_class;
2368 			return result;
2369 		}
2370 	}
2371 	return 0;
2372 }
2373 
2374 static inline u64 wdev_id(struct wireless_dev *wdev)
2375 {
2376 	return (u64)wdev->identifier |
2377 	       ((u64)wiphy_to_rdev(wdev->wiphy)->wiphy_idx << 32);
2378 }
2379 
2380 static int nl80211_send_chandef(struct sk_buff *msg,
2381 				const struct cfg80211_chan_def *chandef)
2382 {
2383 	if (WARN_ON(!cfg80211_chandef_valid(chandef)))
2384 		return -EINVAL;
2385 
2386 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ,
2387 			chandef->chan->center_freq))
2388 		return -ENOBUFS;
2389 	switch (chandef->width) {
2390 	case NL80211_CHAN_WIDTH_20_NOHT:
2391 	case NL80211_CHAN_WIDTH_20:
2392 	case NL80211_CHAN_WIDTH_40:
2393 		if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
2394 				cfg80211_get_chandef_type(chandef)))
2395 			return -ENOBUFS;
2396 		break;
2397 	default:
2398 		break;
2399 	}
2400 	if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width))
2401 		return -ENOBUFS;
2402 	if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1))
2403 		return -ENOBUFS;
2404 	if (chandef->center_freq2 &&
2405 	    nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2))
2406 		return -ENOBUFS;
2407 	return 0;
2408 }
2409 
2410 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags,
2411 			      struct cfg80211_registered_device *rdev,
2412 			      struct wireless_dev *wdev, bool removal)
2413 {
2414 	struct net_device *dev = wdev->netdev;
2415 	u8 cmd = NL80211_CMD_NEW_INTERFACE;
2416 	void *hdr;
2417 
2418 	if (removal)
2419 		cmd = NL80211_CMD_DEL_INTERFACE;
2420 
2421 	hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
2422 	if (!hdr)
2423 		return -1;
2424 
2425 	if (dev &&
2426 	    (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
2427 	     nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name)))
2428 		goto nla_put_failure;
2429 
2430 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
2431 	    nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) ||
2432 	    nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
2433 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) ||
2434 	    nla_put_u32(msg, NL80211_ATTR_GENERATION,
2435 			rdev->devlist_generation ^
2436 			(cfg80211_rdev_list_generation << 2)))
2437 		goto nla_put_failure;
2438 
2439 	if (rdev->ops->get_channel) {
2440 		int ret;
2441 		struct cfg80211_chan_def chandef;
2442 
2443 		ret = rdev_get_channel(rdev, wdev, &chandef);
2444 		if (ret == 0) {
2445 			if (nl80211_send_chandef(msg, &chandef))
2446 				goto nla_put_failure;
2447 		}
2448 	}
2449 
2450 	if (rdev->ops->get_tx_power) {
2451 		int dbm, ret;
2452 
2453 		ret = rdev_get_tx_power(rdev, wdev, &dbm);
2454 		if (ret == 0 &&
2455 		    nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
2456 				DBM_TO_MBM(dbm)))
2457 			goto nla_put_failure;
2458 	}
2459 
2460 	if (wdev->ssid_len) {
2461 		if (nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid))
2462 			goto nla_put_failure;
2463 	}
2464 
2465 	genlmsg_end(msg, hdr);
2466 	return 0;
2467 
2468  nla_put_failure:
2469 	genlmsg_cancel(msg, hdr);
2470 	return -EMSGSIZE;
2471 }
2472 
2473 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
2474 {
2475 	int wp_idx = 0;
2476 	int if_idx = 0;
2477 	int wp_start = cb->args[0];
2478 	int if_start = cb->args[1];
2479 	struct cfg80211_registered_device *rdev;
2480 	struct wireless_dev *wdev;
2481 
2482 	rtnl_lock();
2483 	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
2484 		if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
2485 			continue;
2486 		if (wp_idx < wp_start) {
2487 			wp_idx++;
2488 			continue;
2489 		}
2490 		if_idx = 0;
2491 
2492 		list_for_each_entry(wdev, &rdev->wdev_list, list) {
2493 			if (if_idx < if_start) {
2494 				if_idx++;
2495 				continue;
2496 			}
2497 			if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid,
2498 					       cb->nlh->nlmsg_seq, NLM_F_MULTI,
2499 					       rdev, wdev, false) < 0) {
2500 				goto out;
2501 			}
2502 			if_idx++;
2503 		}
2504 
2505 		wp_idx++;
2506 	}
2507  out:
2508 	rtnl_unlock();
2509 
2510 	cb->args[0] = wp_idx;
2511 	cb->args[1] = if_idx;
2512 
2513 	return skb->len;
2514 }
2515 
2516 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
2517 {
2518 	struct sk_buff *msg;
2519 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
2520 	struct wireless_dev *wdev = info->user_ptr[1];
2521 
2522 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2523 	if (!msg)
2524 		return -ENOMEM;
2525 
2526 	if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
2527 			       rdev, wdev, false) < 0) {
2528 		nlmsg_free(msg);
2529 		return -ENOBUFS;
2530 	}
2531 
2532 	return genlmsg_reply(msg, info);
2533 }
2534 
2535 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = {
2536 	[NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG },
2537 	[NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG },
2538 	[NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG },
2539 	[NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
2540 	[NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
2541 	[NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG },
2542 };
2543 
2544 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
2545 {
2546 	struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1];
2547 	int flag;
2548 
2549 	*mntrflags = 0;
2550 
2551 	if (!nla)
2552 		return -EINVAL;
2553 
2554 	if (nla_parse_nested(flags, NL80211_MNTR_FLAG_MAX,
2555 			     nla, mntr_flags_policy))
2556 		return -EINVAL;
2557 
2558 	for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
2559 		if (flags[flag])
2560 			*mntrflags |= (1<<flag);
2561 
2562 	return 0;
2563 }
2564 
2565 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev,
2566 			       struct net_device *netdev, u8 use_4addr,
2567 			       enum nl80211_iftype iftype)
2568 {
2569 	if (!use_4addr) {
2570 		if (netdev && (netdev->priv_flags & IFF_BRIDGE_PORT))
2571 			return -EBUSY;
2572 		return 0;
2573 	}
2574 
2575 	switch (iftype) {
2576 	case NL80211_IFTYPE_AP_VLAN:
2577 		if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP)
2578 			return 0;
2579 		break;
2580 	case NL80211_IFTYPE_STATION:
2581 		if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION)
2582 			return 0;
2583 		break;
2584 	default:
2585 		break;
2586 	}
2587 
2588 	return -EOPNOTSUPP;
2589 }
2590 
2591 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
2592 {
2593 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
2594 	struct vif_params params;
2595 	int err;
2596 	enum nl80211_iftype otype, ntype;
2597 	struct net_device *dev = info->user_ptr[1];
2598 	u32 _flags, *flags = NULL;
2599 	bool change = false;
2600 
2601 	memset(&params, 0, sizeof(params));
2602 
2603 	otype = ntype = dev->ieee80211_ptr->iftype;
2604 
2605 	if (info->attrs[NL80211_ATTR_IFTYPE]) {
2606 		ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
2607 		if (otype != ntype)
2608 			change = true;
2609 		if (ntype > NL80211_IFTYPE_MAX)
2610 			return -EINVAL;
2611 	}
2612 
2613 	if (info->attrs[NL80211_ATTR_MESH_ID]) {
2614 		struct wireless_dev *wdev = dev->ieee80211_ptr;
2615 
2616 		if (ntype != NL80211_IFTYPE_MESH_POINT)
2617 			return -EINVAL;
2618 		if (netif_running(dev))
2619 			return -EBUSY;
2620 
2621 		wdev_lock(wdev);
2622 		BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
2623 			     IEEE80211_MAX_MESH_ID_LEN);
2624 		wdev->mesh_id_up_len =
2625 			nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
2626 		memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
2627 		       wdev->mesh_id_up_len);
2628 		wdev_unlock(wdev);
2629 	}
2630 
2631 	if (info->attrs[NL80211_ATTR_4ADDR]) {
2632 		params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
2633 		change = true;
2634 		err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype);
2635 		if (err)
2636 			return err;
2637 	} else {
2638 		params.use_4addr = -1;
2639 	}
2640 
2641 	if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
2642 		if (ntype != NL80211_IFTYPE_MONITOR)
2643 			return -EINVAL;
2644 		err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
2645 					  &_flags);
2646 		if (err)
2647 			return err;
2648 
2649 		flags = &_flags;
2650 		change = true;
2651 	}
2652 
2653 	if (flags && (*flags & MONITOR_FLAG_ACTIVE) &&
2654 	    !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
2655 		return -EOPNOTSUPP;
2656 
2657 	if (change)
2658 		err = cfg80211_change_iface(rdev, dev, ntype, flags, &params);
2659 	else
2660 		err = 0;
2661 
2662 	if (!err && params.use_4addr != -1)
2663 		dev->ieee80211_ptr->use_4addr = params.use_4addr;
2664 
2665 	return err;
2666 }
2667 
2668 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
2669 {
2670 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
2671 	struct vif_params params;
2672 	struct wireless_dev *wdev;
2673 	struct sk_buff *msg, *event;
2674 	int err;
2675 	enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
2676 	u32 flags;
2677 
2678 	/* to avoid failing a new interface creation due to pending removal */
2679 	cfg80211_destroy_ifaces(rdev);
2680 
2681 	memset(&params, 0, sizeof(params));
2682 
2683 	if (!info->attrs[NL80211_ATTR_IFNAME])
2684 		return -EINVAL;
2685 
2686 	if (info->attrs[NL80211_ATTR_IFTYPE]) {
2687 		type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
2688 		if (type > NL80211_IFTYPE_MAX)
2689 			return -EINVAL;
2690 	}
2691 
2692 	if (!rdev->ops->add_virtual_intf ||
2693 	    !(rdev->wiphy.interface_modes & (1 << type)))
2694 		return -EOPNOTSUPP;
2695 
2696 	if ((type == NL80211_IFTYPE_P2P_DEVICE ||
2697 	     rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) &&
2698 	    info->attrs[NL80211_ATTR_MAC]) {
2699 		nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC],
2700 			   ETH_ALEN);
2701 		if (!is_valid_ether_addr(params.macaddr))
2702 			return -EADDRNOTAVAIL;
2703 	}
2704 
2705 	if (info->attrs[NL80211_ATTR_4ADDR]) {
2706 		params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
2707 		err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type);
2708 		if (err)
2709 			return err;
2710 	}
2711 
2712 	err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ?
2713 				  info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL,
2714 				  &flags);
2715 
2716 	if (!err && (flags & MONITOR_FLAG_ACTIVE) &&
2717 	    !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
2718 		return -EOPNOTSUPP;
2719 
2720 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2721 	if (!msg)
2722 		return -ENOMEM;
2723 
2724 	wdev = rdev_add_virtual_intf(rdev,
2725 				nla_data(info->attrs[NL80211_ATTR_IFNAME]),
2726 				NET_NAME_USER, type, err ? NULL : &flags,
2727 				&params);
2728 	if (WARN_ON(!wdev)) {
2729 		nlmsg_free(msg);
2730 		return -EPROTO;
2731 	} else if (IS_ERR(wdev)) {
2732 		nlmsg_free(msg);
2733 		return PTR_ERR(wdev);
2734 	}
2735 
2736 	if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
2737 		wdev->owner_nlportid = info->snd_portid;
2738 
2739 	switch (type) {
2740 	case NL80211_IFTYPE_MESH_POINT:
2741 		if (!info->attrs[NL80211_ATTR_MESH_ID])
2742 			break;
2743 		wdev_lock(wdev);
2744 		BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
2745 			     IEEE80211_MAX_MESH_ID_LEN);
2746 		wdev->mesh_id_up_len =
2747 			nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
2748 		memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
2749 		       wdev->mesh_id_up_len);
2750 		wdev_unlock(wdev);
2751 		break;
2752 	case NL80211_IFTYPE_P2P_DEVICE:
2753 		/*
2754 		 * P2P Device doesn't have a netdev, so doesn't go
2755 		 * through the netdev notifier and must be added here
2756 		 */
2757 		mutex_init(&wdev->mtx);
2758 		INIT_LIST_HEAD(&wdev->event_list);
2759 		spin_lock_init(&wdev->event_lock);
2760 		INIT_LIST_HEAD(&wdev->mgmt_registrations);
2761 		spin_lock_init(&wdev->mgmt_registrations_lock);
2762 
2763 		wdev->identifier = ++rdev->wdev_id;
2764 		list_add_rcu(&wdev->list, &rdev->wdev_list);
2765 		rdev->devlist_generation++;
2766 		break;
2767 	default:
2768 		break;
2769 	}
2770 
2771 	if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
2772 			       rdev, wdev, false) < 0) {
2773 		nlmsg_free(msg);
2774 		return -ENOBUFS;
2775 	}
2776 
2777 	event = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2778 	if (event) {
2779 		if (nl80211_send_iface(event, 0, 0, 0,
2780 				       rdev, wdev, false) < 0) {
2781 			nlmsg_free(event);
2782 			goto out;
2783 		}
2784 
2785 		genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
2786 					event, 0, NL80211_MCGRP_CONFIG,
2787 					GFP_KERNEL);
2788 	}
2789 
2790 out:
2791 	return genlmsg_reply(msg, info);
2792 }
2793 
2794 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
2795 {
2796 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
2797 	struct wireless_dev *wdev = info->user_ptr[1];
2798 	struct sk_buff *msg;
2799 	int status;
2800 
2801 	if (!rdev->ops->del_virtual_intf)
2802 		return -EOPNOTSUPP;
2803 
2804 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2805 	if (msg && nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, true) < 0) {
2806 		nlmsg_free(msg);
2807 		msg = NULL;
2808 	}
2809 
2810 	/*
2811 	 * If we remove a wireless device without a netdev then clear
2812 	 * user_ptr[1] so that nl80211_post_doit won't dereference it
2813 	 * to check if it needs to do dev_put(). Otherwise it crashes
2814 	 * since the wdev has been freed, unlike with a netdev where
2815 	 * we need the dev_put() for the netdev to really be freed.
2816 	 */
2817 	if (!wdev->netdev)
2818 		info->user_ptr[1] = NULL;
2819 
2820 	status = rdev_del_virtual_intf(rdev, wdev);
2821 	if (status >= 0 && msg)
2822 		genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
2823 					msg, 0, NL80211_MCGRP_CONFIG,
2824 					GFP_KERNEL);
2825 	else
2826 		nlmsg_free(msg);
2827 
2828 	return status;
2829 }
2830 
2831 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info)
2832 {
2833 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
2834 	struct net_device *dev = info->user_ptr[1];
2835 	u16 noack_map;
2836 
2837 	if (!info->attrs[NL80211_ATTR_NOACK_MAP])
2838 		return -EINVAL;
2839 
2840 	if (!rdev->ops->set_noack_map)
2841 		return -EOPNOTSUPP;
2842 
2843 	noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]);
2844 
2845 	return rdev_set_noack_map(rdev, dev, noack_map);
2846 }
2847 
2848 struct get_key_cookie {
2849 	struct sk_buff *msg;
2850 	int error;
2851 	int idx;
2852 };
2853 
2854 static void get_key_callback(void *c, struct key_params *params)
2855 {
2856 	struct nlattr *key;
2857 	struct get_key_cookie *cookie = c;
2858 
2859 	if ((params->key &&
2860 	     nla_put(cookie->msg, NL80211_ATTR_KEY_DATA,
2861 		     params->key_len, params->key)) ||
2862 	    (params->seq &&
2863 	     nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ,
2864 		     params->seq_len, params->seq)) ||
2865 	    (params->cipher &&
2866 	     nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER,
2867 			 params->cipher)))
2868 		goto nla_put_failure;
2869 
2870 	key = nla_nest_start(cookie->msg, NL80211_ATTR_KEY);
2871 	if (!key)
2872 		goto nla_put_failure;
2873 
2874 	if ((params->key &&
2875 	     nla_put(cookie->msg, NL80211_KEY_DATA,
2876 		     params->key_len, params->key)) ||
2877 	    (params->seq &&
2878 	     nla_put(cookie->msg, NL80211_KEY_SEQ,
2879 		     params->seq_len, params->seq)) ||
2880 	    (params->cipher &&
2881 	     nla_put_u32(cookie->msg, NL80211_KEY_CIPHER,
2882 			 params->cipher)))
2883 		goto nla_put_failure;
2884 
2885 	if (nla_put_u8(cookie->msg, NL80211_ATTR_KEY_IDX, cookie->idx))
2886 		goto nla_put_failure;
2887 
2888 	nla_nest_end(cookie->msg, key);
2889 
2890 	return;
2891  nla_put_failure:
2892 	cookie->error = 1;
2893 }
2894 
2895 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
2896 {
2897 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
2898 	int err;
2899 	struct net_device *dev = info->user_ptr[1];
2900 	u8 key_idx = 0;
2901 	const u8 *mac_addr = NULL;
2902 	bool pairwise;
2903 	struct get_key_cookie cookie = {
2904 		.error = 0,
2905 	};
2906 	void *hdr;
2907 	struct sk_buff *msg;
2908 
2909 	if (info->attrs[NL80211_ATTR_KEY_IDX])
2910 		key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
2911 
2912 	if (key_idx > 5)
2913 		return -EINVAL;
2914 
2915 	if (info->attrs[NL80211_ATTR_MAC])
2916 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
2917 
2918 	pairwise = !!mac_addr;
2919 	if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
2920 		u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
2921 		if (kt >= NUM_NL80211_KEYTYPES)
2922 			return -EINVAL;
2923 		if (kt != NL80211_KEYTYPE_GROUP &&
2924 		    kt != NL80211_KEYTYPE_PAIRWISE)
2925 			return -EINVAL;
2926 		pairwise = kt == NL80211_KEYTYPE_PAIRWISE;
2927 	}
2928 
2929 	if (!rdev->ops->get_key)
2930 		return -EOPNOTSUPP;
2931 
2932 	if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
2933 		return -ENOENT;
2934 
2935 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2936 	if (!msg)
2937 		return -ENOMEM;
2938 
2939 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
2940 			     NL80211_CMD_NEW_KEY);
2941 	if (!hdr)
2942 		goto nla_put_failure;
2943 
2944 	cookie.msg = msg;
2945 	cookie.idx = key_idx;
2946 
2947 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
2948 	    nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx))
2949 		goto nla_put_failure;
2950 	if (mac_addr &&
2951 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
2952 		goto nla_put_failure;
2953 
2954 	err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie,
2955 			   get_key_callback);
2956 
2957 	if (err)
2958 		goto free_msg;
2959 
2960 	if (cookie.error)
2961 		goto nla_put_failure;
2962 
2963 	genlmsg_end(msg, hdr);
2964 	return genlmsg_reply(msg, info);
2965 
2966  nla_put_failure:
2967 	err = -ENOBUFS;
2968  free_msg:
2969 	nlmsg_free(msg);
2970 	return err;
2971 }
2972 
2973 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
2974 {
2975 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
2976 	struct key_parse key;
2977 	int err;
2978 	struct net_device *dev = info->user_ptr[1];
2979 
2980 	err = nl80211_parse_key(info, &key);
2981 	if (err)
2982 		return err;
2983 
2984 	if (key.idx < 0)
2985 		return -EINVAL;
2986 
2987 	/* only support setting default key */
2988 	if (!key.def && !key.defmgmt)
2989 		return -EINVAL;
2990 
2991 	wdev_lock(dev->ieee80211_ptr);
2992 
2993 	if (key.def) {
2994 		if (!rdev->ops->set_default_key) {
2995 			err = -EOPNOTSUPP;
2996 			goto out;
2997 		}
2998 
2999 		err = nl80211_key_allowed(dev->ieee80211_ptr);
3000 		if (err)
3001 			goto out;
3002 
3003 		err = rdev_set_default_key(rdev, dev, key.idx,
3004 						 key.def_uni, key.def_multi);
3005 
3006 		if (err)
3007 			goto out;
3008 
3009 #ifdef CONFIG_CFG80211_WEXT
3010 		dev->ieee80211_ptr->wext.default_key = key.idx;
3011 #endif
3012 	} else {
3013 		if (key.def_uni || !key.def_multi) {
3014 			err = -EINVAL;
3015 			goto out;
3016 		}
3017 
3018 		if (!rdev->ops->set_default_mgmt_key) {
3019 			err = -EOPNOTSUPP;
3020 			goto out;
3021 		}
3022 
3023 		err = nl80211_key_allowed(dev->ieee80211_ptr);
3024 		if (err)
3025 			goto out;
3026 
3027 		err = rdev_set_default_mgmt_key(rdev, dev, key.idx);
3028 		if (err)
3029 			goto out;
3030 
3031 #ifdef CONFIG_CFG80211_WEXT
3032 		dev->ieee80211_ptr->wext.default_mgmt_key = key.idx;
3033 #endif
3034 	}
3035 
3036  out:
3037 	wdev_unlock(dev->ieee80211_ptr);
3038 
3039 	return err;
3040 }
3041 
3042 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
3043 {
3044 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
3045 	int err;
3046 	struct net_device *dev = info->user_ptr[1];
3047 	struct key_parse key;
3048 	const u8 *mac_addr = NULL;
3049 
3050 	err = nl80211_parse_key(info, &key);
3051 	if (err)
3052 		return err;
3053 
3054 	if (!key.p.key)
3055 		return -EINVAL;
3056 
3057 	if (info->attrs[NL80211_ATTR_MAC])
3058 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3059 
3060 	if (key.type == -1) {
3061 		if (mac_addr)
3062 			key.type = NL80211_KEYTYPE_PAIRWISE;
3063 		else
3064 			key.type = NL80211_KEYTYPE_GROUP;
3065 	}
3066 
3067 	/* for now */
3068 	if (key.type != NL80211_KEYTYPE_PAIRWISE &&
3069 	    key.type != NL80211_KEYTYPE_GROUP)
3070 		return -EINVAL;
3071 
3072 	if (!rdev->ops->add_key)
3073 		return -EOPNOTSUPP;
3074 
3075 	if (cfg80211_validate_key_settings(rdev, &key.p, key.idx,
3076 					   key.type == NL80211_KEYTYPE_PAIRWISE,
3077 					   mac_addr))
3078 		return -EINVAL;
3079 
3080 	wdev_lock(dev->ieee80211_ptr);
3081 	err = nl80211_key_allowed(dev->ieee80211_ptr);
3082 	if (!err)
3083 		err = rdev_add_key(rdev, dev, key.idx,
3084 				   key.type == NL80211_KEYTYPE_PAIRWISE,
3085 				    mac_addr, &key.p);
3086 	wdev_unlock(dev->ieee80211_ptr);
3087 
3088 	return err;
3089 }
3090 
3091 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
3092 {
3093 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
3094 	int err;
3095 	struct net_device *dev = info->user_ptr[1];
3096 	u8 *mac_addr = NULL;
3097 	struct key_parse key;
3098 
3099 	err = nl80211_parse_key(info, &key);
3100 	if (err)
3101 		return err;
3102 
3103 	if (info->attrs[NL80211_ATTR_MAC])
3104 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3105 
3106 	if (key.type == -1) {
3107 		if (mac_addr)
3108 			key.type = NL80211_KEYTYPE_PAIRWISE;
3109 		else
3110 			key.type = NL80211_KEYTYPE_GROUP;
3111 	}
3112 
3113 	/* for now */
3114 	if (key.type != NL80211_KEYTYPE_PAIRWISE &&
3115 	    key.type != NL80211_KEYTYPE_GROUP)
3116 		return -EINVAL;
3117 
3118 	if (!rdev->ops->del_key)
3119 		return -EOPNOTSUPP;
3120 
3121 	wdev_lock(dev->ieee80211_ptr);
3122 	err = nl80211_key_allowed(dev->ieee80211_ptr);
3123 
3124 	if (key.type == NL80211_KEYTYPE_GROUP && mac_addr &&
3125 	    !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
3126 		err = -ENOENT;
3127 
3128 	if (!err)
3129 		err = rdev_del_key(rdev, dev, key.idx,
3130 				   key.type == NL80211_KEYTYPE_PAIRWISE,
3131 				   mac_addr);
3132 
3133 #ifdef CONFIG_CFG80211_WEXT
3134 	if (!err) {
3135 		if (key.idx == dev->ieee80211_ptr->wext.default_key)
3136 			dev->ieee80211_ptr->wext.default_key = -1;
3137 		else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key)
3138 			dev->ieee80211_ptr->wext.default_mgmt_key = -1;
3139 	}
3140 #endif
3141 	wdev_unlock(dev->ieee80211_ptr);
3142 
3143 	return err;
3144 }
3145 
3146 /* This function returns an error or the number of nested attributes */
3147 static int validate_acl_mac_addrs(struct nlattr *nl_attr)
3148 {
3149 	struct nlattr *attr;
3150 	int n_entries = 0, tmp;
3151 
3152 	nla_for_each_nested(attr, nl_attr, tmp) {
3153 		if (nla_len(attr) != ETH_ALEN)
3154 			return -EINVAL;
3155 
3156 		n_entries++;
3157 	}
3158 
3159 	return n_entries;
3160 }
3161 
3162 /*
3163  * This function parses ACL information and allocates memory for ACL data.
3164  * On successful return, the calling function is responsible to free the
3165  * ACL buffer returned by this function.
3166  */
3167 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy,
3168 						struct genl_info *info)
3169 {
3170 	enum nl80211_acl_policy acl_policy;
3171 	struct nlattr *attr;
3172 	struct cfg80211_acl_data *acl;
3173 	int i = 0, n_entries, tmp;
3174 
3175 	if (!wiphy->max_acl_mac_addrs)
3176 		return ERR_PTR(-EOPNOTSUPP);
3177 
3178 	if (!info->attrs[NL80211_ATTR_ACL_POLICY])
3179 		return ERR_PTR(-EINVAL);
3180 
3181 	acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]);
3182 	if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED &&
3183 	    acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED)
3184 		return ERR_PTR(-EINVAL);
3185 
3186 	if (!info->attrs[NL80211_ATTR_MAC_ADDRS])
3187 		return ERR_PTR(-EINVAL);
3188 
3189 	n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]);
3190 	if (n_entries < 0)
3191 		return ERR_PTR(n_entries);
3192 
3193 	if (n_entries > wiphy->max_acl_mac_addrs)
3194 		return ERR_PTR(-ENOTSUPP);
3195 
3196 	acl = kzalloc(sizeof(*acl) + (sizeof(struct mac_address) * n_entries),
3197 		      GFP_KERNEL);
3198 	if (!acl)
3199 		return ERR_PTR(-ENOMEM);
3200 
3201 	nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) {
3202 		memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN);
3203 		i++;
3204 	}
3205 
3206 	acl->n_acl_entries = n_entries;
3207 	acl->acl_policy = acl_policy;
3208 
3209 	return acl;
3210 }
3211 
3212 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info)
3213 {
3214 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
3215 	struct net_device *dev = info->user_ptr[1];
3216 	struct cfg80211_acl_data *acl;
3217 	int err;
3218 
3219 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3220 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3221 		return -EOPNOTSUPP;
3222 
3223 	if (!dev->ieee80211_ptr->beacon_interval)
3224 		return -EINVAL;
3225 
3226 	acl = parse_acl_data(&rdev->wiphy, info);
3227 	if (IS_ERR(acl))
3228 		return PTR_ERR(acl);
3229 
3230 	err = rdev_set_mac_acl(rdev, dev, acl);
3231 
3232 	kfree(acl);
3233 
3234 	return err;
3235 }
3236 
3237 static int nl80211_parse_beacon(struct nlattr *attrs[],
3238 				struct cfg80211_beacon_data *bcn)
3239 {
3240 	bool haveinfo = false;
3241 
3242 	if (!is_valid_ie_attr(attrs[NL80211_ATTR_BEACON_TAIL]) ||
3243 	    !is_valid_ie_attr(attrs[NL80211_ATTR_IE]) ||
3244 	    !is_valid_ie_attr(attrs[NL80211_ATTR_IE_PROBE_RESP]) ||
3245 	    !is_valid_ie_attr(attrs[NL80211_ATTR_IE_ASSOC_RESP]))
3246 		return -EINVAL;
3247 
3248 	memset(bcn, 0, sizeof(*bcn));
3249 
3250 	if (attrs[NL80211_ATTR_BEACON_HEAD]) {
3251 		bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]);
3252 		bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]);
3253 		if (!bcn->head_len)
3254 			return -EINVAL;
3255 		haveinfo = true;
3256 	}
3257 
3258 	if (attrs[NL80211_ATTR_BEACON_TAIL]) {
3259 		bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]);
3260 		bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]);
3261 		haveinfo = true;
3262 	}
3263 
3264 	if (!haveinfo)
3265 		return -EINVAL;
3266 
3267 	if (attrs[NL80211_ATTR_IE]) {
3268 		bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]);
3269 		bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]);
3270 	}
3271 
3272 	if (attrs[NL80211_ATTR_IE_PROBE_RESP]) {
3273 		bcn->proberesp_ies =
3274 			nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]);
3275 		bcn->proberesp_ies_len =
3276 			nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]);
3277 	}
3278 
3279 	if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) {
3280 		bcn->assocresp_ies =
3281 			nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
3282 		bcn->assocresp_ies_len =
3283 			nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
3284 	}
3285 
3286 	if (attrs[NL80211_ATTR_PROBE_RESP]) {
3287 		bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]);
3288 		bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]);
3289 	}
3290 
3291 	return 0;
3292 }
3293 
3294 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
3295 				   struct cfg80211_ap_settings *params)
3296 {
3297 	struct wireless_dev *wdev;
3298 	bool ret = false;
3299 
3300 	list_for_each_entry(wdev, &rdev->wdev_list, list) {
3301 		if (wdev->iftype != NL80211_IFTYPE_AP &&
3302 		    wdev->iftype != NL80211_IFTYPE_P2P_GO)
3303 			continue;
3304 
3305 		if (!wdev->preset_chandef.chan)
3306 			continue;
3307 
3308 		params->chandef = wdev->preset_chandef;
3309 		ret = true;
3310 		break;
3311 	}
3312 
3313 	return ret;
3314 }
3315 
3316 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
3317 				    enum nl80211_auth_type auth_type,
3318 				    enum nl80211_commands cmd)
3319 {
3320 	if (auth_type > NL80211_AUTHTYPE_MAX)
3321 		return false;
3322 
3323 	switch (cmd) {
3324 	case NL80211_CMD_AUTHENTICATE:
3325 		if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
3326 		    auth_type == NL80211_AUTHTYPE_SAE)
3327 			return false;
3328 		return true;
3329 	case NL80211_CMD_CONNECT:
3330 	case NL80211_CMD_START_AP:
3331 		/* SAE not supported yet */
3332 		if (auth_type == NL80211_AUTHTYPE_SAE)
3333 			return false;
3334 		return true;
3335 	default:
3336 		return false;
3337 	}
3338 }
3339 
3340 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
3341 {
3342 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
3343 	struct net_device *dev = info->user_ptr[1];
3344 	struct wireless_dev *wdev = dev->ieee80211_ptr;
3345 	struct cfg80211_ap_settings params;
3346 	int err;
3347 
3348 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3349 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3350 		return -EOPNOTSUPP;
3351 
3352 	if (!rdev->ops->start_ap)
3353 		return -EOPNOTSUPP;
3354 
3355 	if (wdev->beacon_interval)
3356 		return -EALREADY;
3357 
3358 	memset(&params, 0, sizeof(params));
3359 
3360 	/* these are required for START_AP */
3361 	if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
3362 	    !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
3363 	    !info->attrs[NL80211_ATTR_BEACON_HEAD])
3364 		return -EINVAL;
3365 
3366 	err = nl80211_parse_beacon(info->attrs, &params.beacon);
3367 	if (err)
3368 		return err;
3369 
3370 	params.beacon_interval =
3371 		nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
3372 	params.dtim_period =
3373 		nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
3374 
3375 	err = cfg80211_validate_beacon_int(rdev, params.beacon_interval);
3376 	if (err)
3377 		return err;
3378 
3379 	/*
3380 	 * In theory, some of these attributes should be required here
3381 	 * but since they were not used when the command was originally
3382 	 * added, keep them optional for old user space programs to let
3383 	 * them continue to work with drivers that do not need the
3384 	 * additional information -- drivers must check!
3385 	 */
3386 	if (info->attrs[NL80211_ATTR_SSID]) {
3387 		params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
3388 		params.ssid_len =
3389 			nla_len(info->attrs[NL80211_ATTR_SSID]);
3390 		if (params.ssid_len == 0 ||
3391 		    params.ssid_len > IEEE80211_MAX_SSID_LEN)
3392 			return -EINVAL;
3393 	}
3394 
3395 	if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) {
3396 		params.hidden_ssid = nla_get_u32(
3397 			info->attrs[NL80211_ATTR_HIDDEN_SSID]);
3398 		if (params.hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE &&
3399 		    params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_LEN &&
3400 		    params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_CONTENTS)
3401 			return -EINVAL;
3402 	}
3403 
3404 	params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
3405 
3406 	if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
3407 		params.auth_type = nla_get_u32(
3408 			info->attrs[NL80211_ATTR_AUTH_TYPE]);
3409 		if (!nl80211_valid_auth_type(rdev, params.auth_type,
3410 					     NL80211_CMD_START_AP))
3411 			return -EINVAL;
3412 	} else
3413 		params.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
3414 
3415 	err = nl80211_crypto_settings(rdev, info, &params.crypto,
3416 				      NL80211_MAX_NR_CIPHER_SUITES);
3417 	if (err)
3418 		return err;
3419 
3420 	if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) {
3421 		if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER))
3422 			return -EOPNOTSUPP;
3423 		params.inactivity_timeout = nla_get_u16(
3424 			info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]);
3425 	}
3426 
3427 	if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
3428 		if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3429 			return -EINVAL;
3430 		params.p2p_ctwindow =
3431 			nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
3432 		if (params.p2p_ctwindow > 127)
3433 			return -EINVAL;
3434 		if (params.p2p_ctwindow != 0 &&
3435 		    !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
3436 			return -EINVAL;
3437 	}
3438 
3439 	if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
3440 		u8 tmp;
3441 
3442 		if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3443 			return -EINVAL;
3444 		tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
3445 		if (tmp > 1)
3446 			return -EINVAL;
3447 		params.p2p_opp_ps = tmp;
3448 		if (params.p2p_opp_ps != 0 &&
3449 		    !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
3450 			return -EINVAL;
3451 	}
3452 
3453 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
3454 		err = nl80211_parse_chandef(rdev, info, &params.chandef);
3455 		if (err)
3456 			return err;
3457 	} else if (wdev->preset_chandef.chan) {
3458 		params.chandef = wdev->preset_chandef;
3459 	} else if (!nl80211_get_ap_channel(rdev, &params))
3460 		return -EINVAL;
3461 
3462 	if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef,
3463 					   wdev->iftype))
3464 		return -EINVAL;
3465 
3466 	if (info->attrs[NL80211_ATTR_SMPS_MODE]) {
3467 		params.smps_mode =
3468 			nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]);
3469 		switch (params.smps_mode) {
3470 		case NL80211_SMPS_OFF:
3471 			break;
3472 		case NL80211_SMPS_STATIC:
3473 			if (!(rdev->wiphy.features &
3474 			      NL80211_FEATURE_STATIC_SMPS))
3475 				return -EINVAL;
3476 			break;
3477 		case NL80211_SMPS_DYNAMIC:
3478 			if (!(rdev->wiphy.features &
3479 			      NL80211_FEATURE_DYNAMIC_SMPS))
3480 				return -EINVAL;
3481 			break;
3482 		default:
3483 			return -EINVAL;
3484 		}
3485 	} else {
3486 		params.smps_mode = NL80211_SMPS_OFF;
3487 	}
3488 
3489 	if (info->attrs[NL80211_ATTR_ACL_POLICY]) {
3490 		params.acl = parse_acl_data(&rdev->wiphy, info);
3491 		if (IS_ERR(params.acl))
3492 			return PTR_ERR(params.acl);
3493 	}
3494 
3495 	params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
3496 	if (params.pbss && !rdev->wiphy.bands[IEEE80211_BAND_60GHZ])
3497 		return -EOPNOTSUPP;
3498 
3499 	wdev_lock(wdev);
3500 	err = rdev_start_ap(rdev, dev, &params);
3501 	if (!err) {
3502 		wdev->preset_chandef = params.chandef;
3503 		wdev->beacon_interval = params.beacon_interval;
3504 		wdev->chandef = params.chandef;
3505 		wdev->ssid_len = params.ssid_len;
3506 		memcpy(wdev->ssid, params.ssid, wdev->ssid_len);
3507 	}
3508 	wdev_unlock(wdev);
3509 
3510 	kfree(params.acl);
3511 
3512 	return err;
3513 }
3514 
3515 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
3516 {
3517 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
3518 	struct net_device *dev = info->user_ptr[1];
3519 	struct wireless_dev *wdev = dev->ieee80211_ptr;
3520 	struct cfg80211_beacon_data params;
3521 	int err;
3522 
3523 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3524 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3525 		return -EOPNOTSUPP;
3526 
3527 	if (!rdev->ops->change_beacon)
3528 		return -EOPNOTSUPP;
3529 
3530 	if (!wdev->beacon_interval)
3531 		return -EINVAL;
3532 
3533 	err = nl80211_parse_beacon(info->attrs, &params);
3534 	if (err)
3535 		return err;
3536 
3537 	wdev_lock(wdev);
3538 	err = rdev_change_beacon(rdev, dev, &params);
3539 	wdev_unlock(wdev);
3540 
3541 	return err;
3542 }
3543 
3544 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info)
3545 {
3546 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
3547 	struct net_device *dev = info->user_ptr[1];
3548 
3549 	return cfg80211_stop_ap(rdev, dev, false);
3550 }
3551 
3552 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
3553 	[NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG },
3554 	[NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
3555 	[NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
3556 	[NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
3557 	[NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG },
3558 	[NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG },
3559 };
3560 
3561 static int parse_station_flags(struct genl_info *info,
3562 			       enum nl80211_iftype iftype,
3563 			       struct station_parameters *params)
3564 {
3565 	struct nlattr *flags[NL80211_STA_FLAG_MAX + 1];
3566 	struct nlattr *nla;
3567 	int flag;
3568 
3569 	/*
3570 	 * Try parsing the new attribute first so userspace
3571 	 * can specify both for older kernels.
3572 	 */
3573 	nla = info->attrs[NL80211_ATTR_STA_FLAGS2];
3574 	if (nla) {
3575 		struct nl80211_sta_flag_update *sta_flags;
3576 
3577 		sta_flags = nla_data(nla);
3578 		params->sta_flags_mask = sta_flags->mask;
3579 		params->sta_flags_set = sta_flags->set;
3580 		params->sta_flags_set &= params->sta_flags_mask;
3581 		if ((params->sta_flags_mask |
3582 		     params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID))
3583 			return -EINVAL;
3584 		return 0;
3585 	}
3586 
3587 	/* if present, parse the old attribute */
3588 
3589 	nla = info->attrs[NL80211_ATTR_STA_FLAGS];
3590 	if (!nla)
3591 		return 0;
3592 
3593 	if (nla_parse_nested(flags, NL80211_STA_FLAG_MAX,
3594 			     nla, sta_flags_policy))
3595 		return -EINVAL;
3596 
3597 	/*
3598 	 * Only allow certain flags for interface types so that
3599 	 * other attributes are silently ignored. Remember that
3600 	 * this is backward compatibility code with old userspace
3601 	 * and shouldn't be hit in other cases anyway.
3602 	 */
3603 	switch (iftype) {
3604 	case NL80211_IFTYPE_AP:
3605 	case NL80211_IFTYPE_AP_VLAN:
3606 	case NL80211_IFTYPE_P2P_GO:
3607 		params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
3608 					 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
3609 					 BIT(NL80211_STA_FLAG_WME) |
3610 					 BIT(NL80211_STA_FLAG_MFP);
3611 		break;
3612 	case NL80211_IFTYPE_P2P_CLIENT:
3613 	case NL80211_IFTYPE_STATION:
3614 		params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
3615 					 BIT(NL80211_STA_FLAG_TDLS_PEER);
3616 		break;
3617 	case NL80211_IFTYPE_MESH_POINT:
3618 		params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
3619 					 BIT(NL80211_STA_FLAG_MFP) |
3620 					 BIT(NL80211_STA_FLAG_AUTHORIZED);
3621 	default:
3622 		return -EINVAL;
3623 	}
3624 
3625 	for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) {
3626 		if (flags[flag]) {
3627 			params->sta_flags_set |= (1<<flag);
3628 
3629 			/* no longer support new API additions in old API */
3630 			if (flag > NL80211_STA_FLAG_MAX_OLD_API)
3631 				return -EINVAL;
3632 		}
3633 	}
3634 
3635 	return 0;
3636 }
3637 
3638 static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info,
3639 				 int attr)
3640 {
3641 	struct nlattr *rate;
3642 	u32 bitrate;
3643 	u16 bitrate_compat;
3644 	enum nl80211_attrs rate_flg;
3645 
3646 	rate = nla_nest_start(msg, attr);
3647 	if (!rate)
3648 		return false;
3649 
3650 	/* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
3651 	bitrate = cfg80211_calculate_bitrate(info);
3652 	/* report 16-bit bitrate only if we can */
3653 	bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0;
3654 	if (bitrate > 0 &&
3655 	    nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate))
3656 		return false;
3657 	if (bitrate_compat > 0 &&
3658 	    nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat))
3659 		return false;
3660 
3661 	switch (info->bw) {
3662 	case RATE_INFO_BW_5:
3663 		rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH;
3664 		break;
3665 	case RATE_INFO_BW_10:
3666 		rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH;
3667 		break;
3668 	default:
3669 		WARN_ON(1);
3670 		/* fall through */
3671 	case RATE_INFO_BW_20:
3672 		rate_flg = 0;
3673 		break;
3674 	case RATE_INFO_BW_40:
3675 		rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH;
3676 		break;
3677 	case RATE_INFO_BW_80:
3678 		rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH;
3679 		break;
3680 	case RATE_INFO_BW_160:
3681 		rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH;
3682 		break;
3683 	}
3684 
3685 	if (rate_flg && nla_put_flag(msg, rate_flg))
3686 		return false;
3687 
3688 	if (info->flags & RATE_INFO_FLAGS_MCS) {
3689 		if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs))
3690 			return false;
3691 		if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
3692 		    nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
3693 			return false;
3694 	} else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) {
3695 		if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs))
3696 			return false;
3697 		if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss))
3698 			return false;
3699 		if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
3700 		    nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
3701 			return false;
3702 	}
3703 
3704 	nla_nest_end(msg, rate);
3705 	return true;
3706 }
3707 
3708 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal,
3709 			       int id)
3710 {
3711 	void *attr;
3712 	int i = 0;
3713 
3714 	if (!mask)
3715 		return true;
3716 
3717 	attr = nla_nest_start(msg, id);
3718 	if (!attr)
3719 		return false;
3720 
3721 	for (i = 0; i < IEEE80211_MAX_CHAINS; i++) {
3722 		if (!(mask & BIT(i)))
3723 			continue;
3724 
3725 		if (nla_put_u8(msg, i, signal[i]))
3726 			return false;
3727 	}
3728 
3729 	nla_nest_end(msg, attr);
3730 
3731 	return true;
3732 }
3733 
3734 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
3735 				u32 seq, int flags,
3736 				struct cfg80211_registered_device *rdev,
3737 				struct net_device *dev,
3738 				const u8 *mac_addr, struct station_info *sinfo)
3739 {
3740 	void *hdr;
3741 	struct nlattr *sinfoattr, *bss_param;
3742 
3743 	hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
3744 	if (!hdr)
3745 		return -1;
3746 
3747 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
3748 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
3749 	    nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation))
3750 		goto nla_put_failure;
3751 
3752 	sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO);
3753 	if (!sinfoattr)
3754 		goto nla_put_failure;
3755 
3756 #define PUT_SINFO(attr, memb, type) do {				\
3757 	if (sinfo->filled & BIT(NL80211_STA_INFO_ ## attr) &&		\
3758 	    nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr,		\
3759 			     sinfo->memb))				\
3760 		goto nla_put_failure;					\
3761 	} while (0)
3762 
3763 	PUT_SINFO(CONNECTED_TIME, connected_time, u32);
3764 	PUT_SINFO(INACTIVE_TIME, inactive_time, u32);
3765 
3766 	if (sinfo->filled & (BIT(NL80211_STA_INFO_RX_BYTES) |
3767 			     BIT(NL80211_STA_INFO_RX_BYTES64)) &&
3768 	    nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES,
3769 			(u32)sinfo->rx_bytes))
3770 		goto nla_put_failure;
3771 
3772 	if (sinfo->filled & (BIT(NL80211_STA_INFO_TX_BYTES) |
3773 			     BIT(NL80211_STA_INFO_TX_BYTES64)) &&
3774 	    nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES,
3775 			(u32)sinfo->tx_bytes))
3776 		goto nla_put_failure;
3777 
3778 	PUT_SINFO(RX_BYTES64, rx_bytes, u64);
3779 	PUT_SINFO(TX_BYTES64, tx_bytes, u64);
3780 	PUT_SINFO(LLID, llid, u16);
3781 	PUT_SINFO(PLID, plid, u16);
3782 	PUT_SINFO(PLINK_STATE, plink_state, u8);
3783 
3784 	switch (rdev->wiphy.signal_type) {
3785 	case CFG80211_SIGNAL_TYPE_MBM:
3786 		PUT_SINFO(SIGNAL, signal, u8);
3787 		PUT_SINFO(SIGNAL_AVG, signal_avg, u8);
3788 		break;
3789 	default:
3790 		break;
3791 	}
3792 	if (sinfo->filled & BIT(NL80211_STA_INFO_CHAIN_SIGNAL)) {
3793 		if (!nl80211_put_signal(msg, sinfo->chains,
3794 					sinfo->chain_signal,
3795 					NL80211_STA_INFO_CHAIN_SIGNAL))
3796 			goto nla_put_failure;
3797 	}
3798 	if (sinfo->filled & BIT(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) {
3799 		if (!nl80211_put_signal(msg, sinfo->chains,
3800 					sinfo->chain_signal_avg,
3801 					NL80211_STA_INFO_CHAIN_SIGNAL_AVG))
3802 			goto nla_put_failure;
3803 	}
3804 	if (sinfo->filled & BIT(NL80211_STA_INFO_TX_BITRATE)) {
3805 		if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
3806 					  NL80211_STA_INFO_TX_BITRATE))
3807 			goto nla_put_failure;
3808 	}
3809 	if (sinfo->filled & BIT(NL80211_STA_INFO_RX_BITRATE)) {
3810 		if (!nl80211_put_sta_rate(msg, &sinfo->rxrate,
3811 					  NL80211_STA_INFO_RX_BITRATE))
3812 			goto nla_put_failure;
3813 	}
3814 
3815 	PUT_SINFO(RX_PACKETS, rx_packets, u32);
3816 	PUT_SINFO(TX_PACKETS, tx_packets, u32);
3817 	PUT_SINFO(TX_RETRIES, tx_retries, u32);
3818 	PUT_SINFO(TX_FAILED, tx_failed, u32);
3819 	PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32);
3820 	PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32);
3821 	PUT_SINFO(LOCAL_PM, local_pm, u32);
3822 	PUT_SINFO(PEER_PM, peer_pm, u32);
3823 	PUT_SINFO(NONPEER_PM, nonpeer_pm, u32);
3824 
3825 	if (sinfo->filled & BIT(NL80211_STA_INFO_BSS_PARAM)) {
3826 		bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM);
3827 		if (!bss_param)
3828 			goto nla_put_failure;
3829 
3830 		if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) &&
3831 		     nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) ||
3832 		    ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) &&
3833 		     nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) ||
3834 		    ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) &&
3835 		     nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) ||
3836 		    nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD,
3837 			       sinfo->bss_param.dtim_period) ||
3838 		    nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL,
3839 				sinfo->bss_param.beacon_interval))
3840 			goto nla_put_failure;
3841 
3842 		nla_nest_end(msg, bss_param);
3843 	}
3844 	if ((sinfo->filled & BIT(NL80211_STA_INFO_STA_FLAGS)) &&
3845 	    nla_put(msg, NL80211_STA_INFO_STA_FLAGS,
3846 		    sizeof(struct nl80211_sta_flag_update),
3847 		    &sinfo->sta_flags))
3848 		goto nla_put_failure;
3849 
3850 	PUT_SINFO(T_OFFSET, t_offset, u64);
3851 	PUT_SINFO(RX_DROP_MISC, rx_dropped_misc, u64);
3852 	PUT_SINFO(BEACON_RX, rx_beacon, u64);
3853 	PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
3854 
3855 #undef PUT_SINFO
3856 
3857 	if (sinfo->filled & BIT(NL80211_STA_INFO_TID_STATS)) {
3858 		struct nlattr *tidsattr;
3859 		int tid;
3860 
3861 		tidsattr = nla_nest_start(msg, NL80211_STA_INFO_TID_STATS);
3862 		if (!tidsattr)
3863 			goto nla_put_failure;
3864 
3865 		for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) {
3866 			struct cfg80211_tid_stats *tidstats;
3867 			struct nlattr *tidattr;
3868 
3869 			tidstats = &sinfo->pertid[tid];
3870 
3871 			if (!tidstats->filled)
3872 				continue;
3873 
3874 			tidattr = nla_nest_start(msg, tid + 1);
3875 			if (!tidattr)
3876 				goto nla_put_failure;
3877 
3878 #define PUT_TIDVAL(attr, memb, type) do {				\
3879 	if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) &&	\
3880 	    nla_put_ ## type(msg, NL80211_TID_STATS_ ## attr,		\
3881 			     tidstats->memb))				\
3882 		goto nla_put_failure;					\
3883 	} while (0)
3884 
3885 			PUT_TIDVAL(RX_MSDU, rx_msdu, u64);
3886 			PUT_TIDVAL(TX_MSDU, tx_msdu, u64);
3887 			PUT_TIDVAL(TX_MSDU_RETRIES, tx_msdu_retries, u64);
3888 			PUT_TIDVAL(TX_MSDU_FAILED, tx_msdu_failed, u64);
3889 
3890 #undef PUT_TIDVAL
3891 			nla_nest_end(msg, tidattr);
3892 		}
3893 
3894 		nla_nest_end(msg, tidsattr);
3895 	}
3896 
3897 	nla_nest_end(msg, sinfoattr);
3898 
3899 	if (sinfo->assoc_req_ies_len &&
3900 	    nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len,
3901 		    sinfo->assoc_req_ies))
3902 		goto nla_put_failure;
3903 
3904 	genlmsg_end(msg, hdr);
3905 	return 0;
3906 
3907  nla_put_failure:
3908 	genlmsg_cancel(msg, hdr);
3909 	return -EMSGSIZE;
3910 }
3911 
3912 static int nl80211_dump_station(struct sk_buff *skb,
3913 				struct netlink_callback *cb)
3914 {
3915 	struct station_info sinfo;
3916 	struct cfg80211_registered_device *rdev;
3917 	struct wireless_dev *wdev;
3918 	u8 mac_addr[ETH_ALEN];
3919 	int sta_idx = cb->args[2];
3920 	int err;
3921 
3922 	err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
3923 	if (err)
3924 		return err;
3925 
3926 	if (!wdev->netdev) {
3927 		err = -EINVAL;
3928 		goto out_err;
3929 	}
3930 
3931 	if (!rdev->ops->dump_station) {
3932 		err = -EOPNOTSUPP;
3933 		goto out_err;
3934 	}
3935 
3936 	while (1) {
3937 		memset(&sinfo, 0, sizeof(sinfo));
3938 		err = rdev_dump_station(rdev, wdev->netdev, sta_idx,
3939 					mac_addr, &sinfo);
3940 		if (err == -ENOENT)
3941 			break;
3942 		if (err)
3943 			goto out_err;
3944 
3945 		if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION,
3946 				NETLINK_CB(cb->skb).portid,
3947 				cb->nlh->nlmsg_seq, NLM_F_MULTI,
3948 				rdev, wdev->netdev, mac_addr,
3949 				&sinfo) < 0)
3950 			goto out;
3951 
3952 		sta_idx++;
3953 	}
3954 
3955 
3956  out:
3957 	cb->args[2] = sta_idx;
3958 	err = skb->len;
3959  out_err:
3960 	nl80211_finish_wdev_dump(rdev);
3961 
3962 	return err;
3963 }
3964 
3965 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
3966 {
3967 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
3968 	struct net_device *dev = info->user_ptr[1];
3969 	struct station_info sinfo;
3970 	struct sk_buff *msg;
3971 	u8 *mac_addr = NULL;
3972 	int err;
3973 
3974 	memset(&sinfo, 0, sizeof(sinfo));
3975 
3976 	if (!info->attrs[NL80211_ATTR_MAC])
3977 		return -EINVAL;
3978 
3979 	mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3980 
3981 	if (!rdev->ops->get_station)
3982 		return -EOPNOTSUPP;
3983 
3984 	err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
3985 	if (err)
3986 		return err;
3987 
3988 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3989 	if (!msg)
3990 		return -ENOMEM;
3991 
3992 	if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION,
3993 				 info->snd_portid, info->snd_seq, 0,
3994 				 rdev, dev, mac_addr, &sinfo) < 0) {
3995 		nlmsg_free(msg);
3996 		return -ENOBUFS;
3997 	}
3998 
3999 	return genlmsg_reply(msg, info);
4000 }
4001 
4002 int cfg80211_check_station_change(struct wiphy *wiphy,
4003 				  struct station_parameters *params,
4004 				  enum cfg80211_station_type statype)
4005 {
4006 	if (params->listen_interval != -1 &&
4007 	    statype != CFG80211_STA_AP_CLIENT_UNASSOC)
4008 		return -EINVAL;
4009 
4010 	if (params->support_p2p_ps != -1 &&
4011 	    statype != CFG80211_STA_AP_CLIENT_UNASSOC)
4012 		return -EINVAL;
4013 
4014 	if (params->aid &&
4015 	    !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) &&
4016 	    statype != CFG80211_STA_AP_CLIENT_UNASSOC)
4017 		return -EINVAL;
4018 
4019 	/* When you run into this, adjust the code below for the new flag */
4020 	BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
4021 
4022 	switch (statype) {
4023 	case CFG80211_STA_MESH_PEER_KERNEL:
4024 	case CFG80211_STA_MESH_PEER_USER:
4025 		/*
4026 		 * No ignoring the TDLS flag here -- the userspace mesh
4027 		 * code doesn't have the bug of including TDLS in the
4028 		 * mask everywhere.
4029 		 */
4030 		if (params->sta_flags_mask &
4031 				~(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4032 				  BIT(NL80211_STA_FLAG_MFP) |
4033 				  BIT(NL80211_STA_FLAG_AUTHORIZED)))
4034 			return -EINVAL;
4035 		break;
4036 	case CFG80211_STA_TDLS_PEER_SETUP:
4037 	case CFG80211_STA_TDLS_PEER_ACTIVE:
4038 		if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
4039 			return -EINVAL;
4040 		/* ignore since it can't change */
4041 		params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
4042 		break;
4043 	default:
4044 		/* disallow mesh-specific things */
4045 		if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION)
4046 			return -EINVAL;
4047 		if (params->local_pm)
4048 			return -EINVAL;
4049 		if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
4050 			return -EINVAL;
4051 	}
4052 
4053 	if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
4054 	    statype != CFG80211_STA_TDLS_PEER_ACTIVE) {
4055 		/* TDLS can't be set, ... */
4056 		if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
4057 			return -EINVAL;
4058 		/*
4059 		 * ... but don't bother the driver with it. This works around
4060 		 * a hostapd/wpa_supplicant issue -- it always includes the
4061 		 * TLDS_PEER flag in the mask even for AP mode.
4062 		 */
4063 		params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
4064 	}
4065 
4066 	if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
4067 	    statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
4068 		/* reject other things that can't change */
4069 		if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD)
4070 			return -EINVAL;
4071 		if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY)
4072 			return -EINVAL;
4073 		if (params->supported_rates)
4074 			return -EINVAL;
4075 		if (params->ext_capab || params->ht_capa || params->vht_capa)
4076 			return -EINVAL;
4077 	}
4078 
4079 	if (statype != CFG80211_STA_AP_CLIENT &&
4080 	    statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
4081 		if (params->vlan)
4082 			return -EINVAL;
4083 	}
4084 
4085 	switch (statype) {
4086 	case CFG80211_STA_AP_MLME_CLIENT:
4087 		/* Use this only for authorizing/unauthorizing a station */
4088 		if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)))
4089 			return -EOPNOTSUPP;
4090 		break;
4091 	case CFG80211_STA_AP_CLIENT:
4092 	case CFG80211_STA_AP_CLIENT_UNASSOC:
4093 		/* accept only the listed bits */
4094 		if (params->sta_flags_mask &
4095 				~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
4096 				  BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4097 				  BIT(NL80211_STA_FLAG_ASSOCIATED) |
4098 				  BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
4099 				  BIT(NL80211_STA_FLAG_WME) |
4100 				  BIT(NL80211_STA_FLAG_MFP)))
4101 			return -EINVAL;
4102 
4103 		/* but authenticated/associated only if driver handles it */
4104 		if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
4105 		    params->sta_flags_mask &
4106 				(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4107 				 BIT(NL80211_STA_FLAG_ASSOCIATED)))
4108 			return -EINVAL;
4109 		break;
4110 	case CFG80211_STA_IBSS:
4111 	case CFG80211_STA_AP_STA:
4112 		/* reject any changes other than AUTHORIZED */
4113 		if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
4114 			return -EINVAL;
4115 		break;
4116 	case CFG80211_STA_TDLS_PEER_SETUP:
4117 		/* reject any changes other than AUTHORIZED or WME */
4118 		if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
4119 					       BIT(NL80211_STA_FLAG_WME)))
4120 			return -EINVAL;
4121 		/* force (at least) rates when authorizing */
4122 		if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) &&
4123 		    !params->supported_rates)
4124 			return -EINVAL;
4125 		break;
4126 	case CFG80211_STA_TDLS_PEER_ACTIVE:
4127 		/* reject any changes */
4128 		return -EINVAL;
4129 	case CFG80211_STA_MESH_PEER_KERNEL:
4130 		if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
4131 			return -EINVAL;
4132 		break;
4133 	case CFG80211_STA_MESH_PEER_USER:
4134 		if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION &&
4135 		    params->plink_action != NL80211_PLINK_ACTION_BLOCK)
4136 			return -EINVAL;
4137 		break;
4138 	}
4139 
4140 	return 0;
4141 }
4142 EXPORT_SYMBOL(cfg80211_check_station_change);
4143 
4144 /*
4145  * Get vlan interface making sure it is running and on the right wiphy.
4146  */
4147 static struct net_device *get_vlan(struct genl_info *info,
4148 				   struct cfg80211_registered_device *rdev)
4149 {
4150 	struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN];
4151 	struct net_device *v;
4152 	int ret;
4153 
4154 	if (!vlanattr)
4155 		return NULL;
4156 
4157 	v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr));
4158 	if (!v)
4159 		return ERR_PTR(-ENODEV);
4160 
4161 	if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) {
4162 		ret = -EINVAL;
4163 		goto error;
4164 	}
4165 
4166 	if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
4167 	    v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
4168 	    v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
4169 		ret = -EINVAL;
4170 		goto error;
4171 	}
4172 
4173 	if (!netif_running(v)) {
4174 		ret = -ENETDOWN;
4175 		goto error;
4176 	}
4177 
4178 	return v;
4179  error:
4180 	dev_put(v);
4181 	return ERR_PTR(ret);
4182 }
4183 
4184 static const struct nla_policy
4185 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = {
4186 	[NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 },
4187 	[NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 },
4188 };
4189 
4190 static int nl80211_parse_sta_wme(struct genl_info *info,
4191 				 struct station_parameters *params)
4192 {
4193 	struct nlattr *tb[NL80211_STA_WME_MAX + 1];
4194 	struct nlattr *nla;
4195 	int err;
4196 
4197 	/* parse WME attributes if present */
4198 	if (!info->attrs[NL80211_ATTR_STA_WME])
4199 		return 0;
4200 
4201 	nla = info->attrs[NL80211_ATTR_STA_WME];
4202 	err = nla_parse_nested(tb, NL80211_STA_WME_MAX, nla,
4203 			       nl80211_sta_wme_policy);
4204 	if (err)
4205 		return err;
4206 
4207 	if (tb[NL80211_STA_WME_UAPSD_QUEUES])
4208 		params->uapsd_queues = nla_get_u8(
4209 			tb[NL80211_STA_WME_UAPSD_QUEUES]);
4210 	if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK)
4211 		return -EINVAL;
4212 
4213 	if (tb[NL80211_STA_WME_MAX_SP])
4214 		params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]);
4215 
4216 	if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK)
4217 		return -EINVAL;
4218 
4219 	params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD;
4220 
4221 	return 0;
4222 }
4223 
4224 static int nl80211_parse_sta_channel_info(struct genl_info *info,
4225 				      struct station_parameters *params)
4226 {
4227 	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
4228 		params->supported_channels =
4229 		     nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
4230 		params->supported_channels_len =
4231 		     nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
4232 		/*
4233 		 * Need to include at least one (first channel, number of
4234 		 * channels) tuple for each subband, and must have proper
4235 		 * tuples for the rest of the data as well.
4236 		 */
4237 		if (params->supported_channels_len < 2)
4238 			return -EINVAL;
4239 		if (params->supported_channels_len % 2)
4240 			return -EINVAL;
4241 	}
4242 
4243 	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
4244 		params->supported_oper_classes =
4245 		 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
4246 		params->supported_oper_classes_len =
4247 		  nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
4248 		/*
4249 		 * The value of the Length field of the Supported Operating
4250 		 * Classes element is between 2 and 253.
4251 		 */
4252 		if (params->supported_oper_classes_len < 2 ||
4253 		    params->supported_oper_classes_len > 253)
4254 			return -EINVAL;
4255 	}
4256 	return 0;
4257 }
4258 
4259 static int nl80211_set_station_tdls(struct genl_info *info,
4260 				    struct station_parameters *params)
4261 {
4262 	int err;
4263 	/* Dummy STA entry gets updated once the peer capabilities are known */
4264 	if (info->attrs[NL80211_ATTR_PEER_AID])
4265 		params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
4266 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
4267 		params->ht_capa =
4268 			nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
4269 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
4270 		params->vht_capa =
4271 			nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
4272 
4273 	err = nl80211_parse_sta_channel_info(info, params);
4274 	if (err)
4275 		return err;
4276 
4277 	return nl80211_parse_sta_wme(info, params);
4278 }
4279 
4280 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
4281 {
4282 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
4283 	struct net_device *dev = info->user_ptr[1];
4284 	struct station_parameters params;
4285 	u8 *mac_addr;
4286 	int err;
4287 
4288 	memset(&params, 0, sizeof(params));
4289 
4290 	if (!rdev->ops->change_station)
4291 		return -EOPNOTSUPP;
4292 
4293 	/*
4294 	 * AID and listen_interval properties can be set only for unassociated
4295 	 * station. Include these parameters here and will check them in
4296 	 * cfg80211_check_station_change().
4297 	 */
4298 	if (info->attrs[NL80211_ATTR_STA_AID])
4299 		params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
4300 
4301 	if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
4302 		params.listen_interval =
4303 		     nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
4304 	else
4305 		params.listen_interval = -1;
4306 
4307 	if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
4308 		u8 tmp;
4309 
4310 		tmp = nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
4311 		if (tmp >= NUM_NL80211_P2P_PS_STATUS)
4312 			return -EINVAL;
4313 
4314 		params.support_p2p_ps = tmp;
4315 	} else {
4316 		params.support_p2p_ps = -1;
4317 	}
4318 
4319 	if (!info->attrs[NL80211_ATTR_MAC])
4320 		return -EINVAL;
4321 
4322 	mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4323 
4324 	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
4325 		params.supported_rates =
4326 			nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
4327 		params.supported_rates_len =
4328 			nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
4329 	}
4330 
4331 	if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
4332 		params.capability =
4333 			nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
4334 		params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
4335 	}
4336 
4337 	if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
4338 		params.ext_capab =
4339 			nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
4340 		params.ext_capab_len =
4341 			nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
4342 	}
4343 
4344 	if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
4345 		return -EINVAL;
4346 
4347 	if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) {
4348 		params.plink_action =
4349 			nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
4350 		if (params.plink_action >= NUM_NL80211_PLINK_ACTIONS)
4351 			return -EINVAL;
4352 	}
4353 
4354 	if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) {
4355 		params.plink_state =
4356 			nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]);
4357 		if (params.plink_state >= NUM_NL80211_PLINK_STATES)
4358 			return -EINVAL;
4359 		params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE;
4360 	}
4361 
4362 	if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) {
4363 		enum nl80211_mesh_power_mode pm = nla_get_u32(
4364 			info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]);
4365 
4366 		if (pm <= NL80211_MESH_POWER_UNKNOWN ||
4367 		    pm > NL80211_MESH_POWER_MAX)
4368 			return -EINVAL;
4369 
4370 		params.local_pm = pm;
4371 	}
4372 
4373 	/* Include parameters for TDLS peer (will check later) */
4374 	err = nl80211_set_station_tdls(info, &params);
4375 	if (err)
4376 		return err;
4377 
4378 	params.vlan = get_vlan(info, rdev);
4379 	if (IS_ERR(params.vlan))
4380 		return PTR_ERR(params.vlan);
4381 
4382 	switch (dev->ieee80211_ptr->iftype) {
4383 	case NL80211_IFTYPE_AP:
4384 	case NL80211_IFTYPE_AP_VLAN:
4385 	case NL80211_IFTYPE_P2P_GO:
4386 	case NL80211_IFTYPE_P2P_CLIENT:
4387 	case NL80211_IFTYPE_STATION:
4388 	case NL80211_IFTYPE_ADHOC:
4389 	case NL80211_IFTYPE_MESH_POINT:
4390 		break;
4391 	default:
4392 		err = -EOPNOTSUPP;
4393 		goto out_put_vlan;
4394 	}
4395 
4396 	/* driver will call cfg80211_check_station_change() */
4397 	err = rdev_change_station(rdev, dev, mac_addr, &params);
4398 
4399  out_put_vlan:
4400 	if (params.vlan)
4401 		dev_put(params.vlan);
4402 
4403 	return err;
4404 }
4405 
4406 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
4407 {
4408 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
4409 	int err;
4410 	struct net_device *dev = info->user_ptr[1];
4411 	struct station_parameters params;
4412 	u8 *mac_addr = NULL;
4413 	u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4414 			 BIT(NL80211_STA_FLAG_ASSOCIATED);
4415 
4416 	memset(&params, 0, sizeof(params));
4417 
4418 	if (!rdev->ops->add_station)
4419 		return -EOPNOTSUPP;
4420 
4421 	if (!info->attrs[NL80211_ATTR_MAC])
4422 		return -EINVAL;
4423 
4424 	if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
4425 		return -EINVAL;
4426 
4427 	if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
4428 		return -EINVAL;
4429 
4430 	if (!info->attrs[NL80211_ATTR_STA_AID] &&
4431 	    !info->attrs[NL80211_ATTR_PEER_AID])
4432 		return -EINVAL;
4433 
4434 	mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4435 	params.supported_rates =
4436 		nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
4437 	params.supported_rates_len =
4438 		nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
4439 	params.listen_interval =
4440 		nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
4441 
4442 	if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
4443 		u8 tmp;
4444 
4445 		tmp = nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
4446 		if (tmp >= NUM_NL80211_P2P_PS_STATUS)
4447 			return -EINVAL;
4448 
4449 		params.support_p2p_ps = tmp;
4450 	} else {
4451 		/*
4452 		 * if not specified, assume it's supported for P2P GO interface,
4453 		 * and is NOT supported for AP interface
4454 		 */
4455 		params.support_p2p_ps =
4456 			dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO;
4457 	}
4458 
4459 	if (info->attrs[NL80211_ATTR_PEER_AID])
4460 		params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
4461 	else
4462 		params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
4463 	if (!params.aid || params.aid > IEEE80211_MAX_AID)
4464 		return -EINVAL;
4465 
4466 	if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
4467 		params.capability =
4468 			nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
4469 		params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
4470 	}
4471 
4472 	if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
4473 		params.ext_capab =
4474 			nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
4475 		params.ext_capab_len =
4476 			nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
4477 	}
4478 
4479 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
4480 		params.ht_capa =
4481 			nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
4482 
4483 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
4484 		params.vht_capa =
4485 			nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
4486 
4487 	if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
4488 		params.opmode_notif_used = true;
4489 		params.opmode_notif =
4490 			nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
4491 	}
4492 
4493 	if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) {
4494 		params.plink_action =
4495 			nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
4496 		if (params.plink_action >= NUM_NL80211_PLINK_ACTIONS)
4497 			return -EINVAL;
4498 	}
4499 
4500 	err = nl80211_parse_sta_channel_info(info, &params);
4501 	if (err)
4502 		return err;
4503 
4504 	err = nl80211_parse_sta_wme(info, &params);
4505 	if (err)
4506 		return err;
4507 
4508 	if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
4509 		return -EINVAL;
4510 
4511 	/* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT
4512 	 * as userspace might just pass through the capabilities from the IEs
4513 	 * directly, rather than enforcing this restriction and returning an
4514 	 * error in this case.
4515 	 */
4516 	if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) {
4517 		params.ht_capa = NULL;
4518 		params.vht_capa = NULL;
4519 	}
4520 
4521 	/* When you run into this, adjust the code below for the new flag */
4522 	BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
4523 
4524 	switch (dev->ieee80211_ptr->iftype) {
4525 	case NL80211_IFTYPE_AP:
4526 	case NL80211_IFTYPE_AP_VLAN:
4527 	case NL80211_IFTYPE_P2P_GO:
4528 		/* ignore WME attributes if iface/sta is not capable */
4529 		if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) ||
4530 		    !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME)))
4531 			params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
4532 
4533 		/* TDLS peers cannot be added */
4534 		if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
4535 		    info->attrs[NL80211_ATTR_PEER_AID])
4536 			return -EINVAL;
4537 		/* but don't bother the driver with it */
4538 		params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
4539 
4540 		/* allow authenticated/associated only if driver handles it */
4541 		if (!(rdev->wiphy.features &
4542 				NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
4543 		    params.sta_flags_mask & auth_assoc)
4544 			return -EINVAL;
4545 
4546 		/* Older userspace, or userspace wanting to be compatible with
4547 		 * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth
4548 		 * and assoc flags in the mask, but assumes the station will be
4549 		 * added as associated anyway since this was the required driver
4550 		 * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was
4551 		 * introduced.
4552 		 * In order to not bother drivers with this quirk in the API
4553 		 * set the flags in both the mask and set for new stations in
4554 		 * this case.
4555 		 */
4556 		if (!(params.sta_flags_mask & auth_assoc)) {
4557 			params.sta_flags_mask |= auth_assoc;
4558 			params.sta_flags_set |= auth_assoc;
4559 		}
4560 
4561 		/* must be last in here for error handling */
4562 		params.vlan = get_vlan(info, rdev);
4563 		if (IS_ERR(params.vlan))
4564 			return PTR_ERR(params.vlan);
4565 		break;
4566 	case NL80211_IFTYPE_MESH_POINT:
4567 		/* ignore uAPSD data */
4568 		params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
4569 
4570 		/* associated is disallowed */
4571 		if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED))
4572 			return -EINVAL;
4573 		/* TDLS peers cannot be added */
4574 		if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
4575 		    info->attrs[NL80211_ATTR_PEER_AID])
4576 			return -EINVAL;
4577 		break;
4578 	case NL80211_IFTYPE_STATION:
4579 	case NL80211_IFTYPE_P2P_CLIENT:
4580 		/* ignore uAPSD data */
4581 		params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
4582 
4583 		/* these are disallowed */
4584 		if (params.sta_flags_mask &
4585 				(BIT(NL80211_STA_FLAG_ASSOCIATED) |
4586 				 BIT(NL80211_STA_FLAG_AUTHENTICATED)))
4587 			return -EINVAL;
4588 		/* Only TDLS peers can be added */
4589 		if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
4590 			return -EINVAL;
4591 		/* Can only add if TDLS ... */
4592 		if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS))
4593 			return -EOPNOTSUPP;
4594 		/* ... with external setup is supported */
4595 		if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP))
4596 			return -EOPNOTSUPP;
4597 		/*
4598 		 * Older wpa_supplicant versions always mark the TDLS peer
4599 		 * as authorized, but it shouldn't yet be.
4600 		 */
4601 		params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED);
4602 		break;
4603 	default:
4604 		return -EOPNOTSUPP;
4605 	}
4606 
4607 	/* be aware of params.vlan when changing code here */
4608 
4609 	err = rdev_add_station(rdev, dev, mac_addr, &params);
4610 
4611 	if (params.vlan)
4612 		dev_put(params.vlan);
4613 	return err;
4614 }
4615 
4616 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
4617 {
4618 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
4619 	struct net_device *dev = info->user_ptr[1];
4620 	struct station_del_parameters params;
4621 
4622 	memset(&params, 0, sizeof(params));
4623 
4624 	if (info->attrs[NL80211_ATTR_MAC])
4625 		params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]);
4626 
4627 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
4628 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
4629 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
4630 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4631 		return -EINVAL;
4632 
4633 	if (!rdev->ops->del_station)
4634 		return -EOPNOTSUPP;
4635 
4636 	if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) {
4637 		params.subtype =
4638 			nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]);
4639 		if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 &&
4640 		    params.subtype != IEEE80211_STYPE_DEAUTH >> 4)
4641 			return -EINVAL;
4642 	} else {
4643 		/* Default to Deauthentication frame */
4644 		params.subtype = IEEE80211_STYPE_DEAUTH >> 4;
4645 	}
4646 
4647 	if (info->attrs[NL80211_ATTR_REASON_CODE]) {
4648 		params.reason_code =
4649 			nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
4650 		if (params.reason_code == 0)
4651 			return -EINVAL; /* 0 is reserved */
4652 	} else {
4653 		/* Default to reason code 2 */
4654 		params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID;
4655 	}
4656 
4657 	return rdev_del_station(rdev, dev, &params);
4658 }
4659 
4660 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq,
4661 				int flags, struct net_device *dev,
4662 				u8 *dst, u8 *next_hop,
4663 				struct mpath_info *pinfo)
4664 {
4665 	void *hdr;
4666 	struct nlattr *pinfoattr;
4667 
4668 	hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH);
4669 	if (!hdr)
4670 		return -1;
4671 
4672 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
4673 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) ||
4674 	    nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) ||
4675 	    nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation))
4676 		goto nla_put_failure;
4677 
4678 	pinfoattr = nla_nest_start(msg, NL80211_ATTR_MPATH_INFO);
4679 	if (!pinfoattr)
4680 		goto nla_put_failure;
4681 	if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) &&
4682 	    nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN,
4683 			pinfo->frame_qlen))
4684 		goto nla_put_failure;
4685 	if (((pinfo->filled & MPATH_INFO_SN) &&
4686 	     nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) ||
4687 	    ((pinfo->filled & MPATH_INFO_METRIC) &&
4688 	     nla_put_u32(msg, NL80211_MPATH_INFO_METRIC,
4689 			 pinfo->metric)) ||
4690 	    ((pinfo->filled & MPATH_INFO_EXPTIME) &&
4691 	     nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME,
4692 			 pinfo->exptime)) ||
4693 	    ((pinfo->filled & MPATH_INFO_FLAGS) &&
4694 	     nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS,
4695 			pinfo->flags)) ||
4696 	    ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) &&
4697 	     nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
4698 			 pinfo->discovery_timeout)) ||
4699 	    ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) &&
4700 	     nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES,
4701 			pinfo->discovery_retries)))
4702 		goto nla_put_failure;
4703 
4704 	nla_nest_end(msg, pinfoattr);
4705 
4706 	genlmsg_end(msg, hdr);
4707 	return 0;
4708 
4709  nla_put_failure:
4710 	genlmsg_cancel(msg, hdr);
4711 	return -EMSGSIZE;
4712 }
4713 
4714 static int nl80211_dump_mpath(struct sk_buff *skb,
4715 			      struct netlink_callback *cb)
4716 {
4717 	struct mpath_info pinfo;
4718 	struct cfg80211_registered_device *rdev;
4719 	struct wireless_dev *wdev;
4720 	u8 dst[ETH_ALEN];
4721 	u8 next_hop[ETH_ALEN];
4722 	int path_idx = cb->args[2];
4723 	int err;
4724 
4725 	err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
4726 	if (err)
4727 		return err;
4728 
4729 	if (!rdev->ops->dump_mpath) {
4730 		err = -EOPNOTSUPP;
4731 		goto out_err;
4732 	}
4733 
4734 	if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
4735 		err = -EOPNOTSUPP;
4736 		goto out_err;
4737 	}
4738 
4739 	while (1) {
4740 		err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst,
4741 				      next_hop, &pinfo);
4742 		if (err == -ENOENT)
4743 			break;
4744 		if (err)
4745 			goto out_err;
4746 
4747 		if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
4748 				       cb->nlh->nlmsg_seq, NLM_F_MULTI,
4749 				       wdev->netdev, dst, next_hop,
4750 				       &pinfo) < 0)
4751 			goto out;
4752 
4753 		path_idx++;
4754 	}
4755 
4756 
4757  out:
4758 	cb->args[2] = path_idx;
4759 	err = skb->len;
4760  out_err:
4761 	nl80211_finish_wdev_dump(rdev);
4762 	return err;
4763 }
4764 
4765 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
4766 {
4767 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
4768 	int err;
4769 	struct net_device *dev = info->user_ptr[1];
4770 	struct mpath_info pinfo;
4771 	struct sk_buff *msg;
4772 	u8 *dst = NULL;
4773 	u8 next_hop[ETH_ALEN];
4774 
4775 	memset(&pinfo, 0, sizeof(pinfo));
4776 
4777 	if (!info->attrs[NL80211_ATTR_MAC])
4778 		return -EINVAL;
4779 
4780 	dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
4781 
4782 	if (!rdev->ops->get_mpath)
4783 		return -EOPNOTSUPP;
4784 
4785 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
4786 		return -EOPNOTSUPP;
4787 
4788 	err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo);
4789 	if (err)
4790 		return err;
4791 
4792 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
4793 	if (!msg)
4794 		return -ENOMEM;
4795 
4796 	if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
4797 				 dev, dst, next_hop, &pinfo) < 0) {
4798 		nlmsg_free(msg);
4799 		return -ENOBUFS;
4800 	}
4801 
4802 	return genlmsg_reply(msg, info);
4803 }
4804 
4805 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
4806 {
4807 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
4808 	struct net_device *dev = info->user_ptr[1];
4809 	u8 *dst = NULL;
4810 	u8 *next_hop = NULL;
4811 
4812 	if (!info->attrs[NL80211_ATTR_MAC])
4813 		return -EINVAL;
4814 
4815 	if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
4816 		return -EINVAL;
4817 
4818 	dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
4819 	next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
4820 
4821 	if (!rdev->ops->change_mpath)
4822 		return -EOPNOTSUPP;
4823 
4824 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
4825 		return -EOPNOTSUPP;
4826 
4827 	return rdev_change_mpath(rdev, dev, dst, next_hop);
4828 }
4829 
4830 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
4831 {
4832 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
4833 	struct net_device *dev = info->user_ptr[1];
4834 	u8 *dst = NULL;
4835 	u8 *next_hop = NULL;
4836 
4837 	if (!info->attrs[NL80211_ATTR_MAC])
4838 		return -EINVAL;
4839 
4840 	if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
4841 		return -EINVAL;
4842 
4843 	dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
4844 	next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
4845 
4846 	if (!rdev->ops->add_mpath)
4847 		return -EOPNOTSUPP;
4848 
4849 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
4850 		return -EOPNOTSUPP;
4851 
4852 	return rdev_add_mpath(rdev, dev, dst, next_hop);
4853 }
4854 
4855 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
4856 {
4857 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
4858 	struct net_device *dev = info->user_ptr[1];
4859 	u8 *dst = NULL;
4860 
4861 	if (info->attrs[NL80211_ATTR_MAC])
4862 		dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
4863 
4864 	if (!rdev->ops->del_mpath)
4865 		return -EOPNOTSUPP;
4866 
4867 	return rdev_del_mpath(rdev, dev, dst);
4868 }
4869 
4870 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info)
4871 {
4872 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
4873 	int err;
4874 	struct net_device *dev = info->user_ptr[1];
4875 	struct mpath_info pinfo;
4876 	struct sk_buff *msg;
4877 	u8 *dst = NULL;
4878 	u8 mpp[ETH_ALEN];
4879 
4880 	memset(&pinfo, 0, sizeof(pinfo));
4881 
4882 	if (!info->attrs[NL80211_ATTR_MAC])
4883 		return -EINVAL;
4884 
4885 	dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
4886 
4887 	if (!rdev->ops->get_mpp)
4888 		return -EOPNOTSUPP;
4889 
4890 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
4891 		return -EOPNOTSUPP;
4892 
4893 	err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo);
4894 	if (err)
4895 		return err;
4896 
4897 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
4898 	if (!msg)
4899 		return -ENOMEM;
4900 
4901 	if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
4902 			       dev, dst, mpp, &pinfo) < 0) {
4903 		nlmsg_free(msg);
4904 		return -ENOBUFS;
4905 	}
4906 
4907 	return genlmsg_reply(msg, info);
4908 }
4909 
4910 static int nl80211_dump_mpp(struct sk_buff *skb,
4911 			    struct netlink_callback *cb)
4912 {
4913 	struct mpath_info pinfo;
4914 	struct cfg80211_registered_device *rdev;
4915 	struct wireless_dev *wdev;
4916 	u8 dst[ETH_ALEN];
4917 	u8 mpp[ETH_ALEN];
4918 	int path_idx = cb->args[2];
4919 	int err;
4920 
4921 	err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
4922 	if (err)
4923 		return err;
4924 
4925 	if (!rdev->ops->dump_mpp) {
4926 		err = -EOPNOTSUPP;
4927 		goto out_err;
4928 	}
4929 
4930 	if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
4931 		err = -EOPNOTSUPP;
4932 		goto out_err;
4933 	}
4934 
4935 	while (1) {
4936 		err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst,
4937 				    mpp, &pinfo);
4938 		if (err == -ENOENT)
4939 			break;
4940 		if (err)
4941 			goto out_err;
4942 
4943 		if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
4944 				       cb->nlh->nlmsg_seq, NLM_F_MULTI,
4945 				       wdev->netdev, dst, mpp,
4946 				       &pinfo) < 0)
4947 			goto out;
4948 
4949 		path_idx++;
4950 	}
4951 
4952  out:
4953 	cb->args[2] = path_idx;
4954 	err = skb->len;
4955  out_err:
4956 	nl80211_finish_wdev_dump(rdev);
4957 	return err;
4958 }
4959 
4960 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
4961 {
4962 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
4963 	struct net_device *dev = info->user_ptr[1];
4964 	struct wireless_dev *wdev = dev->ieee80211_ptr;
4965 	struct bss_parameters params;
4966 	int err;
4967 
4968 	memset(&params, 0, sizeof(params));
4969 	/* default to not changing parameters */
4970 	params.use_cts_prot = -1;
4971 	params.use_short_preamble = -1;
4972 	params.use_short_slot_time = -1;
4973 	params.ap_isolate = -1;
4974 	params.ht_opmode = -1;
4975 	params.p2p_ctwindow = -1;
4976 	params.p2p_opp_ps = -1;
4977 
4978 	if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
4979 		params.use_cts_prot =
4980 		    nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
4981 	if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE])
4982 		params.use_short_preamble =
4983 		    nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
4984 	if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME])
4985 		params.use_short_slot_time =
4986 		    nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
4987 	if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
4988 		params.basic_rates =
4989 			nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
4990 		params.basic_rates_len =
4991 			nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
4992 	}
4993 	if (info->attrs[NL80211_ATTR_AP_ISOLATE])
4994 		params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]);
4995 	if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE])
4996 		params.ht_opmode =
4997 			nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]);
4998 
4999 	if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
5000 		if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5001 			return -EINVAL;
5002 		params.p2p_ctwindow =
5003 			nla_get_s8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
5004 		if (params.p2p_ctwindow < 0)
5005 			return -EINVAL;
5006 		if (params.p2p_ctwindow != 0 &&
5007 		    !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
5008 			return -EINVAL;
5009 	}
5010 
5011 	if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
5012 		u8 tmp;
5013 
5014 		if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5015 			return -EINVAL;
5016 		tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
5017 		if (tmp > 1)
5018 			return -EINVAL;
5019 		params.p2p_opp_ps = tmp;
5020 		if (params.p2p_opp_ps &&
5021 		    !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
5022 			return -EINVAL;
5023 	}
5024 
5025 	if (!rdev->ops->change_bss)
5026 		return -EOPNOTSUPP;
5027 
5028 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
5029 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5030 		return -EOPNOTSUPP;
5031 
5032 	wdev_lock(wdev);
5033 	err = rdev_change_bss(rdev, dev, &params);
5034 	wdev_unlock(wdev);
5035 
5036 	return err;
5037 }
5038 
5039 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
5040 {
5041 	char *data = NULL;
5042 	bool is_indoor;
5043 	enum nl80211_user_reg_hint_type user_reg_hint_type;
5044 	u32 owner_nlportid;
5045 
5046 
5047 	/*
5048 	 * You should only get this when cfg80211 hasn't yet initialized
5049 	 * completely when built-in to the kernel right between the time
5050 	 * window between nl80211_init() and regulatory_init(), if that is
5051 	 * even possible.
5052 	 */
5053 	if (unlikely(!rcu_access_pointer(cfg80211_regdomain)))
5054 		return -EINPROGRESS;
5055 
5056 	if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE])
5057 		user_reg_hint_type =
5058 		  nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]);
5059 	else
5060 		user_reg_hint_type = NL80211_USER_REG_HINT_USER;
5061 
5062 	switch (user_reg_hint_type) {
5063 	case NL80211_USER_REG_HINT_USER:
5064 	case NL80211_USER_REG_HINT_CELL_BASE:
5065 		if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
5066 			return -EINVAL;
5067 
5068 		data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
5069 		return regulatory_hint_user(data, user_reg_hint_type);
5070 	case NL80211_USER_REG_HINT_INDOOR:
5071 		if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
5072 			owner_nlportid = info->snd_portid;
5073 			is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR];
5074 		} else {
5075 			owner_nlportid = 0;
5076 			is_indoor = true;
5077 		}
5078 
5079 		return regulatory_hint_indoor(is_indoor, owner_nlportid);
5080 	default:
5081 		return -EINVAL;
5082 	}
5083 }
5084 
5085 static int nl80211_get_mesh_config(struct sk_buff *skb,
5086 				   struct genl_info *info)
5087 {
5088 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5089 	struct net_device *dev = info->user_ptr[1];
5090 	struct wireless_dev *wdev = dev->ieee80211_ptr;
5091 	struct mesh_config cur_params;
5092 	int err = 0;
5093 	void *hdr;
5094 	struct nlattr *pinfoattr;
5095 	struct sk_buff *msg;
5096 
5097 	if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
5098 		return -EOPNOTSUPP;
5099 
5100 	if (!rdev->ops->get_mesh_config)
5101 		return -EOPNOTSUPP;
5102 
5103 	wdev_lock(wdev);
5104 	/* If not connected, get default parameters */
5105 	if (!wdev->mesh_id_len)
5106 		memcpy(&cur_params, &default_mesh_config, sizeof(cur_params));
5107 	else
5108 		err = rdev_get_mesh_config(rdev, dev, &cur_params);
5109 	wdev_unlock(wdev);
5110 
5111 	if (err)
5112 		return err;
5113 
5114 	/* Draw up a netlink message to send back */
5115 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
5116 	if (!msg)
5117 		return -ENOMEM;
5118 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
5119 			     NL80211_CMD_GET_MESH_CONFIG);
5120 	if (!hdr)
5121 		goto out;
5122 	pinfoattr = nla_nest_start(msg, NL80211_ATTR_MESH_CONFIG);
5123 	if (!pinfoattr)
5124 		goto nla_put_failure;
5125 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
5126 	    nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT,
5127 			cur_params.dot11MeshRetryTimeout) ||
5128 	    nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT,
5129 			cur_params.dot11MeshConfirmTimeout) ||
5130 	    nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT,
5131 			cur_params.dot11MeshHoldingTimeout) ||
5132 	    nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
5133 			cur_params.dot11MeshMaxPeerLinks) ||
5134 	    nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES,
5135 		       cur_params.dot11MeshMaxRetries) ||
5136 	    nla_put_u8(msg, NL80211_MESHCONF_TTL,
5137 		       cur_params.dot11MeshTTL) ||
5138 	    nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL,
5139 		       cur_params.element_ttl) ||
5140 	    nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
5141 		       cur_params.auto_open_plinks) ||
5142 	    nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
5143 			cur_params.dot11MeshNbrOffsetMaxNeighbor) ||
5144 	    nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
5145 		       cur_params.dot11MeshHWMPmaxPREQretries) ||
5146 	    nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME,
5147 			cur_params.path_refresh_time) ||
5148 	    nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
5149 			cur_params.min_discovery_timeout) ||
5150 	    nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
5151 			cur_params.dot11MeshHWMPactivePathTimeout) ||
5152 	    nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
5153 			cur_params.dot11MeshHWMPpreqMinInterval) ||
5154 	    nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
5155 			cur_params.dot11MeshHWMPperrMinInterval) ||
5156 	    nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
5157 			cur_params.dot11MeshHWMPnetDiameterTraversalTime) ||
5158 	    nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE,
5159 		       cur_params.dot11MeshHWMPRootMode) ||
5160 	    nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
5161 			cur_params.dot11MeshHWMPRannInterval) ||
5162 	    nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
5163 		       cur_params.dot11MeshGateAnnouncementProtocol) ||
5164 	    nla_put_u8(msg, NL80211_MESHCONF_FORWARDING,
5165 		       cur_params.dot11MeshForwarding) ||
5166 	    nla_put_u32(msg, NL80211_MESHCONF_RSSI_THRESHOLD,
5167 			cur_params.rssi_threshold) ||
5168 	    nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE,
5169 			cur_params.ht_opmode) ||
5170 	    nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
5171 			cur_params.dot11MeshHWMPactivePathToRootTimeout) ||
5172 	    nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
5173 			cur_params.dot11MeshHWMProotInterval) ||
5174 	    nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
5175 			cur_params.dot11MeshHWMPconfirmationInterval) ||
5176 	    nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE,
5177 			cur_params.power_mode) ||
5178 	    nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW,
5179 			cur_params.dot11MeshAwakeWindowDuration) ||
5180 	    nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT,
5181 			cur_params.plink_timeout))
5182 		goto nla_put_failure;
5183 	nla_nest_end(msg, pinfoattr);
5184 	genlmsg_end(msg, hdr);
5185 	return genlmsg_reply(msg, info);
5186 
5187  nla_put_failure:
5188 	genlmsg_cancel(msg, hdr);
5189  out:
5190 	nlmsg_free(msg);
5191 	return -ENOBUFS;
5192 }
5193 
5194 static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = {
5195 	[NL80211_MESHCONF_RETRY_TIMEOUT] = { .type = NLA_U16 },
5196 	[NL80211_MESHCONF_CONFIRM_TIMEOUT] = { .type = NLA_U16 },
5197 	[NL80211_MESHCONF_HOLDING_TIMEOUT] = { .type = NLA_U16 },
5198 	[NL80211_MESHCONF_MAX_PEER_LINKS] = { .type = NLA_U16 },
5199 	[NL80211_MESHCONF_MAX_RETRIES] = { .type = NLA_U8 },
5200 	[NL80211_MESHCONF_TTL] = { .type = NLA_U8 },
5201 	[NL80211_MESHCONF_ELEMENT_TTL] = { .type = NLA_U8 },
5202 	[NL80211_MESHCONF_AUTO_OPEN_PLINKS] = { .type = NLA_U8 },
5203 	[NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = { .type = NLA_U32 },
5204 	[NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 },
5205 	[NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 },
5206 	[NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = { .type = NLA_U16 },
5207 	[NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
5208 	[NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = { .type = NLA_U16 },
5209 	[NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = { .type = NLA_U16 },
5210 	[NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = { .type = NLA_U16 },
5211 	[NL80211_MESHCONF_HWMP_ROOTMODE] = { .type = NLA_U8 },
5212 	[NL80211_MESHCONF_HWMP_RANN_INTERVAL] = { .type = NLA_U16 },
5213 	[NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = { .type = NLA_U8 },
5214 	[NL80211_MESHCONF_FORWARDING] = { .type = NLA_U8 },
5215 	[NL80211_MESHCONF_RSSI_THRESHOLD] = { .type = NLA_U32 },
5216 	[NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 },
5217 	[NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 },
5218 	[NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = { .type = NLA_U16 },
5219 	[NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = { .type = NLA_U16 },
5220 	[NL80211_MESHCONF_POWER_MODE] = { .type = NLA_U32 },
5221 	[NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 },
5222 	[NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 },
5223 };
5224 
5225 static const struct nla_policy
5226 	nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
5227 	[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 },
5228 	[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
5229 	[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
5230 	[NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
5231 	[NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 },
5232 	[NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG },
5233 	[NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY,
5234 				    .len = IEEE80211_MAX_DATA_LEN },
5235 	[NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG },
5236 };
5237 
5238 static int nl80211_parse_mesh_config(struct genl_info *info,
5239 				     struct mesh_config *cfg,
5240 				     u32 *mask_out)
5241 {
5242 	struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1];
5243 	u32 mask = 0;
5244 
5245 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, min, max, mask, attr, fn) \
5246 do {									    \
5247 	if (tb[attr]) {							    \
5248 		if (fn(tb[attr]) < min || fn(tb[attr]) > max)		    \
5249 			return -EINVAL;					    \
5250 		cfg->param = fn(tb[attr]);				    \
5251 		mask |= (1 << (attr - 1));				    \
5252 	}								    \
5253 } while (0)
5254 
5255 
5256 	if (!info->attrs[NL80211_ATTR_MESH_CONFIG])
5257 		return -EINVAL;
5258 	if (nla_parse_nested(tb, NL80211_MESHCONF_ATTR_MAX,
5259 			     info->attrs[NL80211_ATTR_MESH_CONFIG],
5260 			     nl80211_meshconf_params_policy))
5261 		return -EINVAL;
5262 
5263 	/* This makes sure that there aren't more than 32 mesh config
5264 	 * parameters (otherwise our bitfield scheme would not work.) */
5265 	BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
5266 
5267 	/* Fill in the params struct */
5268 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, 1, 255,
5269 				  mask, NL80211_MESHCONF_RETRY_TIMEOUT,
5270 				  nla_get_u16);
5271 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, 1, 255,
5272 				  mask, NL80211_MESHCONF_CONFIRM_TIMEOUT,
5273 				  nla_get_u16);
5274 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, 1, 255,
5275 				  mask, NL80211_MESHCONF_HOLDING_TIMEOUT,
5276 				  nla_get_u16);
5277 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, 0, 255,
5278 				  mask, NL80211_MESHCONF_MAX_PEER_LINKS,
5279 				  nla_get_u16);
5280 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, 0, 16,
5281 				  mask, NL80211_MESHCONF_MAX_RETRIES,
5282 				  nla_get_u8);
5283 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, 1, 255,
5284 				  mask, NL80211_MESHCONF_TTL, nla_get_u8);
5285 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, 1, 255,
5286 				  mask, NL80211_MESHCONF_ELEMENT_TTL,
5287 				  nla_get_u8);
5288 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, 0, 1,
5289 				  mask, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
5290 				  nla_get_u8);
5291 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor,
5292 				  1, 255, mask,
5293 				  NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
5294 				  nla_get_u32);
5295 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, 0, 255,
5296 				  mask, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
5297 				  nla_get_u8);
5298 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, 1, 65535,
5299 				  mask, NL80211_MESHCONF_PATH_REFRESH_TIME,
5300 				  nla_get_u32);
5301 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, 1, 65535,
5302 				  mask, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
5303 				  nla_get_u16);
5304 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout,
5305 				  1, 65535, mask,
5306 				  NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
5307 				  nla_get_u32);
5308 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval,
5309 				  1, 65535, mask,
5310 				  NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
5311 				  nla_get_u16);
5312 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval,
5313 				  1, 65535, mask,
5314 				  NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
5315 				  nla_get_u16);
5316 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
5317 				  dot11MeshHWMPnetDiameterTraversalTime,
5318 				  1, 65535, mask,
5319 				  NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
5320 				  nla_get_u16);
5321 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, 0, 4,
5322 				  mask, NL80211_MESHCONF_HWMP_ROOTMODE,
5323 				  nla_get_u8);
5324 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, 1, 65535,
5325 				  mask, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
5326 				  nla_get_u16);
5327 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
5328 				  dot11MeshGateAnnouncementProtocol, 0, 1,
5329 				  mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
5330 				  nla_get_u8);
5331 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, 0, 1,
5332 				  mask, NL80211_MESHCONF_FORWARDING,
5333 				  nla_get_u8);
5334 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, -255, 0,
5335 				  mask, NL80211_MESHCONF_RSSI_THRESHOLD,
5336 				  nla_get_s32);
5337 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, ht_opmode, 0, 16,
5338 				  mask, NL80211_MESHCONF_HT_OPMODE,
5339 				  nla_get_u16);
5340 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathToRootTimeout,
5341 				  1, 65535, mask,
5342 				  NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
5343 				  nla_get_u32);
5344 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, 1, 65535,
5345 				  mask, NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
5346 				  nla_get_u16);
5347 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
5348 				  dot11MeshHWMPconfirmationInterval,
5349 				  1, 65535, mask,
5350 				  NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
5351 				  nla_get_u16);
5352 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode,
5353 				  NL80211_MESH_POWER_ACTIVE,
5354 				  NL80211_MESH_POWER_MAX,
5355 				  mask, NL80211_MESHCONF_POWER_MODE,
5356 				  nla_get_u32);
5357 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration,
5358 				  0, 65535, mask,
5359 				  NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16);
5360 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, 0, 0xffffffff,
5361 				  mask, NL80211_MESHCONF_PLINK_TIMEOUT,
5362 				  nla_get_u32);
5363 	if (mask_out)
5364 		*mask_out = mask;
5365 
5366 	return 0;
5367 
5368 #undef FILL_IN_MESH_PARAM_IF_SET
5369 }
5370 
5371 static int nl80211_parse_mesh_setup(struct genl_info *info,
5372 				     struct mesh_setup *setup)
5373 {
5374 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5375 	struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1];
5376 
5377 	if (!info->attrs[NL80211_ATTR_MESH_SETUP])
5378 		return -EINVAL;
5379 	if (nla_parse_nested(tb, NL80211_MESH_SETUP_ATTR_MAX,
5380 			     info->attrs[NL80211_ATTR_MESH_SETUP],
5381 			     nl80211_mesh_setup_params_policy))
5382 		return -EINVAL;
5383 
5384 	if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])
5385 		setup->sync_method =
5386 		(nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ?
5387 		 IEEE80211_SYNC_METHOD_VENDOR :
5388 		 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET;
5389 
5390 	if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])
5391 		setup->path_sel_proto =
5392 		(nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ?
5393 		 IEEE80211_PATH_PROTOCOL_VENDOR :
5394 		 IEEE80211_PATH_PROTOCOL_HWMP;
5395 
5396 	if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])
5397 		setup->path_metric =
5398 		(nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ?
5399 		 IEEE80211_PATH_METRIC_VENDOR :
5400 		 IEEE80211_PATH_METRIC_AIRTIME;
5401 
5402 
5403 	if (tb[NL80211_MESH_SETUP_IE]) {
5404 		struct nlattr *ieattr =
5405 			tb[NL80211_MESH_SETUP_IE];
5406 		if (!is_valid_ie_attr(ieattr))
5407 			return -EINVAL;
5408 		setup->ie = nla_data(ieattr);
5409 		setup->ie_len = nla_len(ieattr);
5410 	}
5411 	if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] &&
5412 	    !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM))
5413 		return -EINVAL;
5414 	setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]);
5415 	setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]);
5416 	setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]);
5417 	if (setup->is_secure)
5418 		setup->user_mpm = true;
5419 
5420 	if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) {
5421 		if (!setup->user_mpm)
5422 			return -EINVAL;
5423 		setup->auth_id =
5424 			nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]);
5425 	}
5426 
5427 	return 0;
5428 }
5429 
5430 static int nl80211_update_mesh_config(struct sk_buff *skb,
5431 				      struct genl_info *info)
5432 {
5433 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5434 	struct net_device *dev = info->user_ptr[1];
5435 	struct wireless_dev *wdev = dev->ieee80211_ptr;
5436 	struct mesh_config cfg;
5437 	u32 mask;
5438 	int err;
5439 
5440 	if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
5441 		return -EOPNOTSUPP;
5442 
5443 	if (!rdev->ops->update_mesh_config)
5444 		return -EOPNOTSUPP;
5445 
5446 	err = nl80211_parse_mesh_config(info, &cfg, &mask);
5447 	if (err)
5448 		return err;
5449 
5450 	wdev_lock(wdev);
5451 	if (!wdev->mesh_id_len)
5452 		err = -ENOLINK;
5453 
5454 	if (!err)
5455 		err = rdev_update_mesh_config(rdev, dev, mask, &cfg);
5456 
5457 	wdev_unlock(wdev);
5458 
5459 	return err;
5460 }
5461 
5462 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom,
5463 			      struct sk_buff *msg)
5464 {
5465 	struct nlattr *nl_reg_rules;
5466 	unsigned int i;
5467 
5468 	if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) ||
5469 	    (regdom->dfs_region &&
5470 	     nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region)))
5471 		goto nla_put_failure;
5472 
5473 	nl_reg_rules = nla_nest_start(msg, NL80211_ATTR_REG_RULES);
5474 	if (!nl_reg_rules)
5475 		goto nla_put_failure;
5476 
5477 	for (i = 0; i < regdom->n_reg_rules; i++) {
5478 		struct nlattr *nl_reg_rule;
5479 		const struct ieee80211_reg_rule *reg_rule;
5480 		const struct ieee80211_freq_range *freq_range;
5481 		const struct ieee80211_power_rule *power_rule;
5482 		unsigned int max_bandwidth_khz;
5483 
5484 		reg_rule = &regdom->reg_rules[i];
5485 		freq_range = &reg_rule->freq_range;
5486 		power_rule = &reg_rule->power_rule;
5487 
5488 		nl_reg_rule = nla_nest_start(msg, i);
5489 		if (!nl_reg_rule)
5490 			goto nla_put_failure;
5491 
5492 		max_bandwidth_khz = freq_range->max_bandwidth_khz;
5493 		if (!max_bandwidth_khz)
5494 			max_bandwidth_khz = reg_get_max_bandwidth(regdom,
5495 								  reg_rule);
5496 
5497 		if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS,
5498 				reg_rule->flags) ||
5499 		    nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START,
5500 				freq_range->start_freq_khz) ||
5501 		    nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END,
5502 				freq_range->end_freq_khz) ||
5503 		    nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW,
5504 				max_bandwidth_khz) ||
5505 		    nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
5506 				power_rule->max_antenna_gain) ||
5507 		    nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP,
5508 				power_rule->max_eirp) ||
5509 		    nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME,
5510 				reg_rule->dfs_cac_ms))
5511 			goto nla_put_failure;
5512 
5513 		nla_nest_end(msg, nl_reg_rule);
5514 	}
5515 
5516 	nla_nest_end(msg, nl_reg_rules);
5517 	return 0;
5518 
5519 nla_put_failure:
5520 	return -EMSGSIZE;
5521 }
5522 
5523 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info)
5524 {
5525 	const struct ieee80211_regdomain *regdom = NULL;
5526 	struct cfg80211_registered_device *rdev;
5527 	struct wiphy *wiphy = NULL;
5528 	struct sk_buff *msg;
5529 	void *hdr;
5530 
5531 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
5532 	if (!msg)
5533 		return -ENOBUFS;
5534 
5535 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
5536 			     NL80211_CMD_GET_REG);
5537 	if (!hdr)
5538 		goto put_failure;
5539 
5540 	if (info->attrs[NL80211_ATTR_WIPHY]) {
5541 		bool self_managed;
5542 
5543 		rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
5544 		if (IS_ERR(rdev)) {
5545 			nlmsg_free(msg);
5546 			return PTR_ERR(rdev);
5547 		}
5548 
5549 		wiphy = &rdev->wiphy;
5550 		self_managed = wiphy->regulatory_flags &
5551 			       REGULATORY_WIPHY_SELF_MANAGED;
5552 		regdom = get_wiphy_regdom(wiphy);
5553 
5554 		/* a self-managed-reg device must have a private regdom */
5555 		if (WARN_ON(!regdom && self_managed)) {
5556 			nlmsg_free(msg);
5557 			return -EINVAL;
5558 		}
5559 
5560 		if (regdom &&
5561 		    nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
5562 			goto nla_put_failure;
5563 	}
5564 
5565 	if (!wiphy && reg_last_request_cell_base() &&
5566 	    nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
5567 			NL80211_USER_REG_HINT_CELL_BASE))
5568 		goto nla_put_failure;
5569 
5570 	rcu_read_lock();
5571 
5572 	if (!regdom)
5573 		regdom = rcu_dereference(cfg80211_regdomain);
5574 
5575 	if (nl80211_put_regdom(regdom, msg))
5576 		goto nla_put_failure_rcu;
5577 
5578 	rcu_read_unlock();
5579 
5580 	genlmsg_end(msg, hdr);
5581 	return genlmsg_reply(msg, info);
5582 
5583 nla_put_failure_rcu:
5584 	rcu_read_unlock();
5585 nla_put_failure:
5586 	genlmsg_cancel(msg, hdr);
5587 put_failure:
5588 	nlmsg_free(msg);
5589 	return -EMSGSIZE;
5590 }
5591 
5592 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb,
5593 			       u32 seq, int flags, struct wiphy *wiphy,
5594 			       const struct ieee80211_regdomain *regdom)
5595 {
5596 	void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
5597 				   NL80211_CMD_GET_REG);
5598 
5599 	if (!hdr)
5600 		return -1;
5601 
5602 	genl_dump_check_consistent(cb, hdr, &nl80211_fam);
5603 
5604 	if (nl80211_put_regdom(regdom, msg))
5605 		goto nla_put_failure;
5606 
5607 	if (!wiphy && reg_last_request_cell_base() &&
5608 	    nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
5609 			NL80211_USER_REG_HINT_CELL_BASE))
5610 		goto nla_put_failure;
5611 
5612 	if (wiphy &&
5613 	    nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
5614 		goto nla_put_failure;
5615 
5616 	if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
5617 	    nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
5618 		goto nla_put_failure;
5619 
5620 	genlmsg_end(msg, hdr);
5621 	return 0;
5622 
5623 nla_put_failure:
5624 	genlmsg_cancel(msg, hdr);
5625 	return -EMSGSIZE;
5626 }
5627 
5628 static int nl80211_get_reg_dump(struct sk_buff *skb,
5629 				struct netlink_callback *cb)
5630 {
5631 	const struct ieee80211_regdomain *regdom = NULL;
5632 	struct cfg80211_registered_device *rdev;
5633 	int err, reg_idx, start = cb->args[2];
5634 
5635 	rtnl_lock();
5636 
5637 	if (cfg80211_regdomain && start == 0) {
5638 		err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
5639 					  NLM_F_MULTI, NULL,
5640 					  rtnl_dereference(cfg80211_regdomain));
5641 		if (err < 0)
5642 			goto out_err;
5643 	}
5644 
5645 	/* the global regdom is idx 0 */
5646 	reg_idx = 1;
5647 	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
5648 		regdom = get_wiphy_regdom(&rdev->wiphy);
5649 		if (!regdom)
5650 			continue;
5651 
5652 		if (++reg_idx <= start)
5653 			continue;
5654 
5655 		err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
5656 					  NLM_F_MULTI, &rdev->wiphy, regdom);
5657 		if (err < 0) {
5658 			reg_idx--;
5659 			break;
5660 		}
5661 	}
5662 
5663 	cb->args[2] = reg_idx;
5664 	err = skb->len;
5665 out_err:
5666 	rtnl_unlock();
5667 	return err;
5668 }
5669 
5670 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
5671 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
5672 	[NL80211_ATTR_REG_RULE_FLAGS]		= { .type = NLA_U32 },
5673 	[NL80211_ATTR_FREQ_RANGE_START]		= { .type = NLA_U32 },
5674 	[NL80211_ATTR_FREQ_RANGE_END]		= { .type = NLA_U32 },
5675 	[NL80211_ATTR_FREQ_RANGE_MAX_BW]	= { .type = NLA_U32 },
5676 	[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]	= { .type = NLA_U32 },
5677 	[NL80211_ATTR_POWER_RULE_MAX_EIRP]	= { .type = NLA_U32 },
5678 	[NL80211_ATTR_DFS_CAC_TIME]		= { .type = NLA_U32 },
5679 };
5680 
5681 static int parse_reg_rule(struct nlattr *tb[],
5682 	struct ieee80211_reg_rule *reg_rule)
5683 {
5684 	struct ieee80211_freq_range *freq_range = &reg_rule->freq_range;
5685 	struct ieee80211_power_rule *power_rule = &reg_rule->power_rule;
5686 
5687 	if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
5688 		return -EINVAL;
5689 	if (!tb[NL80211_ATTR_FREQ_RANGE_START])
5690 		return -EINVAL;
5691 	if (!tb[NL80211_ATTR_FREQ_RANGE_END])
5692 		return -EINVAL;
5693 	if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
5694 		return -EINVAL;
5695 	if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
5696 		return -EINVAL;
5697 
5698 	reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
5699 
5700 	freq_range->start_freq_khz =
5701 		nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
5702 	freq_range->end_freq_khz =
5703 		nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
5704 	freq_range->max_bandwidth_khz =
5705 		nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
5706 
5707 	power_rule->max_eirp =
5708 		nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
5709 
5710 	if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
5711 		power_rule->max_antenna_gain =
5712 			nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
5713 
5714 	if (tb[NL80211_ATTR_DFS_CAC_TIME])
5715 		reg_rule->dfs_cac_ms =
5716 			nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]);
5717 
5718 	return 0;
5719 }
5720 
5721 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
5722 {
5723 	struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
5724 	struct nlattr *nl_reg_rule;
5725 	char *alpha2;
5726 	int rem_reg_rules, r;
5727 	u32 num_rules = 0, rule_idx = 0, size_of_regd;
5728 	enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET;
5729 	struct ieee80211_regdomain *rd;
5730 
5731 	if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
5732 		return -EINVAL;
5733 
5734 	if (!info->attrs[NL80211_ATTR_REG_RULES])
5735 		return -EINVAL;
5736 
5737 	alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
5738 
5739 	if (info->attrs[NL80211_ATTR_DFS_REGION])
5740 		dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]);
5741 
5742 	nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
5743 			    rem_reg_rules) {
5744 		num_rules++;
5745 		if (num_rules > NL80211_MAX_SUPP_REG_RULES)
5746 			return -EINVAL;
5747 	}
5748 
5749 	if (!reg_is_valid_request(alpha2))
5750 		return -EINVAL;
5751 
5752 	size_of_regd = sizeof(struct ieee80211_regdomain) +
5753 		       num_rules * sizeof(struct ieee80211_reg_rule);
5754 
5755 	rd = kzalloc(size_of_regd, GFP_KERNEL);
5756 	if (!rd)
5757 		return -ENOMEM;
5758 
5759 	rd->n_reg_rules = num_rules;
5760 	rd->alpha2[0] = alpha2[0];
5761 	rd->alpha2[1] = alpha2[1];
5762 
5763 	/*
5764 	 * Disable DFS master mode if the DFS region was
5765 	 * not supported or known on this kernel.
5766 	 */
5767 	if (reg_supported_dfs_region(dfs_region))
5768 		rd->dfs_region = dfs_region;
5769 
5770 	nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
5771 			    rem_reg_rules) {
5772 		r = nla_parse(tb, NL80211_REG_RULE_ATTR_MAX,
5773 			      nla_data(nl_reg_rule), nla_len(nl_reg_rule),
5774 			      reg_rule_policy);
5775 		if (r)
5776 			goto bad_reg;
5777 		r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
5778 		if (r)
5779 			goto bad_reg;
5780 
5781 		rule_idx++;
5782 
5783 		if (rule_idx > NL80211_MAX_SUPP_REG_RULES) {
5784 			r = -EINVAL;
5785 			goto bad_reg;
5786 		}
5787 	}
5788 
5789 	r = set_regdom(rd, REGD_SOURCE_CRDA);
5790 	/* set_regdom took ownership */
5791 	rd = NULL;
5792 
5793  bad_reg:
5794 	kfree(rd);
5795 	return r;
5796 }
5797 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */
5798 
5799 static int validate_scan_freqs(struct nlattr *freqs)
5800 {
5801 	struct nlattr *attr1, *attr2;
5802 	int n_channels = 0, tmp1, tmp2;
5803 
5804 	nla_for_each_nested(attr1, freqs, tmp1) {
5805 		n_channels++;
5806 		/*
5807 		 * Some hardware has a limited channel list for
5808 		 * scanning, and it is pretty much nonsensical
5809 		 * to scan for a channel twice, so disallow that
5810 		 * and don't require drivers to check that the
5811 		 * channel list they get isn't longer than what
5812 		 * they can scan, as long as they can scan all
5813 		 * the channels they registered at once.
5814 		 */
5815 		nla_for_each_nested(attr2, freqs, tmp2)
5816 			if (attr1 != attr2 &&
5817 			    nla_get_u32(attr1) == nla_get_u32(attr2))
5818 				return 0;
5819 	}
5820 
5821 	return n_channels;
5822 }
5823 
5824 static bool is_band_valid(struct wiphy *wiphy, enum ieee80211_band b)
5825 {
5826 	return b < IEEE80211_NUM_BANDS && wiphy->bands[b];
5827 }
5828 
5829 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy,
5830 			    struct cfg80211_bss_selection *bss_select)
5831 {
5832 	struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1];
5833 	struct nlattr *nest;
5834 	int err;
5835 	bool found = false;
5836 	int i;
5837 
5838 	/* only process one nested attribute */
5839 	nest = nla_data(nla);
5840 	if (!nla_ok(nest, nla_len(nest)))
5841 		return -EINVAL;
5842 
5843 	err = nla_parse(attr, NL80211_BSS_SELECT_ATTR_MAX, nla_data(nest),
5844 			nla_len(nest), nl80211_bss_select_policy);
5845 	if (err)
5846 		return err;
5847 
5848 	/* only one attribute may be given */
5849 	for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) {
5850 		if (attr[i]) {
5851 			if (found)
5852 				return -EINVAL;
5853 			found = true;
5854 		}
5855 	}
5856 
5857 	bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID;
5858 
5859 	if (attr[NL80211_BSS_SELECT_ATTR_RSSI])
5860 		bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI;
5861 
5862 	if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) {
5863 		bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF;
5864 		bss_select->param.band_pref =
5865 			nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]);
5866 		if (!is_band_valid(wiphy, bss_select->param.band_pref))
5867 			return -EINVAL;
5868 	}
5869 
5870 	if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) {
5871 		struct nl80211_bss_select_rssi_adjust *adj_param;
5872 
5873 		adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]);
5874 		bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST;
5875 		bss_select->param.adjust.band = adj_param->band;
5876 		bss_select->param.adjust.delta = adj_param->delta;
5877 		if (!is_band_valid(wiphy, bss_select->param.adjust.band))
5878 			return -EINVAL;
5879 	}
5880 
5881 	/* user-space did not provide behaviour attribute */
5882 	if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID)
5883 		return -EINVAL;
5884 
5885 	if (!(wiphy->bss_select_support & BIT(bss_select->behaviour)))
5886 		return -EINVAL;
5887 
5888 	return 0;
5889 }
5890 
5891 static int nl80211_parse_random_mac(struct nlattr **attrs,
5892 				    u8 *mac_addr, u8 *mac_addr_mask)
5893 {
5894 	int i;
5895 
5896 	if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) {
5897 		eth_zero_addr(mac_addr);
5898 		eth_zero_addr(mac_addr_mask);
5899 		mac_addr[0] = 0x2;
5900 		mac_addr_mask[0] = 0x3;
5901 
5902 		return 0;
5903 	}
5904 
5905 	/* need both or none */
5906 	if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK])
5907 		return -EINVAL;
5908 
5909 	memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN);
5910 	memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN);
5911 
5912 	/* don't allow or configure an mcast address */
5913 	if (!is_multicast_ether_addr(mac_addr_mask) ||
5914 	    is_multicast_ether_addr(mac_addr))
5915 		return -EINVAL;
5916 
5917 	/*
5918 	 * allow users to pass a MAC address that has bits set outside
5919 	 * of the mask, but don't bother drivers with having to deal
5920 	 * with such bits
5921 	 */
5922 	for (i = 0; i < ETH_ALEN; i++)
5923 		mac_addr[i] &= mac_addr_mask[i];
5924 
5925 	return 0;
5926 }
5927 
5928 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
5929 {
5930 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
5931 	struct wireless_dev *wdev = info->user_ptr[1];
5932 	struct cfg80211_scan_request *request;
5933 	struct nlattr *attr;
5934 	struct wiphy *wiphy;
5935 	int err, tmp, n_ssids = 0, n_channels, i;
5936 	size_t ie_len;
5937 
5938 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
5939 		return -EINVAL;
5940 
5941 	wiphy = &rdev->wiphy;
5942 
5943 	if (!rdev->ops->scan)
5944 		return -EOPNOTSUPP;
5945 
5946 	if (rdev->scan_req || rdev->scan_msg) {
5947 		err = -EBUSY;
5948 		goto unlock;
5949 	}
5950 
5951 	if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
5952 		n_channels = validate_scan_freqs(
5953 				info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
5954 		if (!n_channels) {
5955 			err = -EINVAL;
5956 			goto unlock;
5957 		}
5958 	} else {
5959 		n_channels = ieee80211_get_num_supported_channels(wiphy);
5960 	}
5961 
5962 	if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
5963 		nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
5964 			n_ssids++;
5965 
5966 	if (n_ssids > wiphy->max_scan_ssids) {
5967 		err = -EINVAL;
5968 		goto unlock;
5969 	}
5970 
5971 	if (info->attrs[NL80211_ATTR_IE])
5972 		ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
5973 	else
5974 		ie_len = 0;
5975 
5976 	if (ie_len > wiphy->max_scan_ie_len) {
5977 		err = -EINVAL;
5978 		goto unlock;
5979 	}
5980 
5981 	request = kzalloc(sizeof(*request)
5982 			+ sizeof(*request->ssids) * n_ssids
5983 			+ sizeof(*request->channels) * n_channels
5984 			+ ie_len, GFP_KERNEL);
5985 	if (!request) {
5986 		err = -ENOMEM;
5987 		goto unlock;
5988 	}
5989 
5990 	if (n_ssids)
5991 		request->ssids = (void *)&request->channels[n_channels];
5992 	request->n_ssids = n_ssids;
5993 	if (ie_len) {
5994 		if (n_ssids)
5995 			request->ie = (void *)(request->ssids + n_ssids);
5996 		else
5997 			request->ie = (void *)(request->channels + n_channels);
5998 	}
5999 
6000 	i = 0;
6001 	if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
6002 		/* user specified, bail out if channel not found */
6003 		nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) {
6004 			struct ieee80211_channel *chan;
6005 
6006 			chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
6007 
6008 			if (!chan) {
6009 				err = -EINVAL;
6010 				goto out_free;
6011 			}
6012 
6013 			/* ignore disabled channels */
6014 			if (chan->flags & IEEE80211_CHAN_DISABLED)
6015 				continue;
6016 
6017 			request->channels[i] = chan;
6018 			i++;
6019 		}
6020 	} else {
6021 		enum ieee80211_band band;
6022 
6023 		/* all channels */
6024 		for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
6025 			int j;
6026 			if (!wiphy->bands[band])
6027 				continue;
6028 			for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
6029 				struct ieee80211_channel *chan;
6030 
6031 				chan = &wiphy->bands[band]->channels[j];
6032 
6033 				if (chan->flags & IEEE80211_CHAN_DISABLED)
6034 					continue;
6035 
6036 				request->channels[i] = chan;
6037 				i++;
6038 			}
6039 		}
6040 	}
6041 
6042 	if (!i) {
6043 		err = -EINVAL;
6044 		goto out_free;
6045 	}
6046 
6047 	request->n_channels = i;
6048 
6049 	i = 0;
6050 	if (n_ssids) {
6051 		nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
6052 			if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
6053 				err = -EINVAL;
6054 				goto out_free;
6055 			}
6056 			request->ssids[i].ssid_len = nla_len(attr);
6057 			memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
6058 			i++;
6059 		}
6060 	}
6061 
6062 	if (info->attrs[NL80211_ATTR_IE]) {
6063 		request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6064 		memcpy((void *)request->ie,
6065 		       nla_data(info->attrs[NL80211_ATTR_IE]),
6066 		       request->ie_len);
6067 	}
6068 
6069 	for (i = 0; i < IEEE80211_NUM_BANDS; i++)
6070 		if (wiphy->bands[i])
6071 			request->rates[i] =
6072 				(1 << wiphy->bands[i]->n_bitrates) - 1;
6073 
6074 	if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) {
6075 		nla_for_each_nested(attr,
6076 				    info->attrs[NL80211_ATTR_SCAN_SUPP_RATES],
6077 				    tmp) {
6078 			enum ieee80211_band band = nla_type(attr);
6079 
6080 			if (band < 0 || band >= IEEE80211_NUM_BANDS) {
6081 				err = -EINVAL;
6082 				goto out_free;
6083 			}
6084 
6085 			if (!wiphy->bands[band])
6086 				continue;
6087 
6088 			err = ieee80211_get_ratemask(wiphy->bands[band],
6089 						     nla_data(attr),
6090 						     nla_len(attr),
6091 						     &request->rates[band]);
6092 			if (err)
6093 				goto out_free;
6094 		}
6095 	}
6096 
6097 	if (info->attrs[NL80211_ATTR_SCAN_FLAGS]) {
6098 		request->flags = nla_get_u32(
6099 			info->attrs[NL80211_ATTR_SCAN_FLAGS]);
6100 		if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
6101 		    !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) {
6102 			err = -EOPNOTSUPP;
6103 			goto out_free;
6104 		}
6105 
6106 		if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
6107 			if (!(wiphy->features &
6108 					NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR)) {
6109 				err = -EOPNOTSUPP;
6110 				goto out_free;
6111 			}
6112 
6113 			if (wdev->current_bss) {
6114 				err = -EOPNOTSUPP;
6115 				goto out_free;
6116 			}
6117 
6118 			err = nl80211_parse_random_mac(info->attrs,
6119 						       request->mac_addr,
6120 						       request->mac_addr_mask);
6121 			if (err)
6122 				goto out_free;
6123 		}
6124 	}
6125 
6126 	request->no_cck =
6127 		nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
6128 
6129 	if (info->attrs[NL80211_ATTR_MAC])
6130 		memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]),
6131 		       ETH_ALEN);
6132 	else
6133 		eth_broadcast_addr(request->bssid);
6134 
6135 	request->wdev = wdev;
6136 	request->wiphy = &rdev->wiphy;
6137 	request->scan_start = jiffies;
6138 
6139 	rdev->scan_req = request;
6140 	err = rdev_scan(rdev, request);
6141 
6142 	if (!err) {
6143 		nl80211_send_scan_start(rdev, wdev);
6144 		if (wdev->netdev)
6145 			dev_hold(wdev->netdev);
6146 	} else {
6147  out_free:
6148 		rdev->scan_req = NULL;
6149 		kfree(request);
6150 	}
6151 
6152  unlock:
6153 	return err;
6154 }
6155 
6156 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info)
6157 {
6158 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
6159 	struct wireless_dev *wdev = info->user_ptr[1];
6160 
6161 	if (!rdev->ops->abort_scan)
6162 		return -EOPNOTSUPP;
6163 
6164 	if (rdev->scan_msg)
6165 		return 0;
6166 
6167 	if (!rdev->scan_req)
6168 		return -ENOENT;
6169 
6170 	rdev_abort_scan(rdev, wdev);
6171 	return 0;
6172 }
6173 
6174 static int
6175 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans,
6176 			       struct cfg80211_sched_scan_request *request,
6177 			       struct nlattr **attrs)
6178 {
6179 	int tmp, err, i = 0;
6180 	struct nlattr *attr;
6181 
6182 	if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
6183 		u32 interval;
6184 
6185 		/*
6186 		 * If scan plans are not specified,
6187 		 * %NL80211_ATTR_SCHED_SCAN_INTERVAL must be specified. In this
6188 		 * case one scan plan will be set with the specified scan
6189 		 * interval and infinite number of iterations.
6190 		 */
6191 		if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
6192 			return -EINVAL;
6193 
6194 		interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]);
6195 		if (!interval)
6196 			return -EINVAL;
6197 
6198 		request->scan_plans[0].interval =
6199 			DIV_ROUND_UP(interval, MSEC_PER_SEC);
6200 		if (!request->scan_plans[0].interval)
6201 			return -EINVAL;
6202 
6203 		if (request->scan_plans[0].interval >
6204 		    wiphy->max_sched_scan_plan_interval)
6205 			request->scan_plans[0].interval =
6206 				wiphy->max_sched_scan_plan_interval;
6207 
6208 		return 0;
6209 	}
6210 
6211 	nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) {
6212 		struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1];
6213 
6214 		if (WARN_ON(i >= n_plans))
6215 			return -EINVAL;
6216 
6217 		err = nla_parse(plan, NL80211_SCHED_SCAN_PLAN_MAX,
6218 				nla_data(attr), nla_len(attr),
6219 				nl80211_plan_policy);
6220 		if (err)
6221 			return err;
6222 
6223 		if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL])
6224 			return -EINVAL;
6225 
6226 		request->scan_plans[i].interval =
6227 			nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]);
6228 		if (!request->scan_plans[i].interval ||
6229 		    request->scan_plans[i].interval >
6230 		    wiphy->max_sched_scan_plan_interval)
6231 			return -EINVAL;
6232 
6233 		if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) {
6234 			request->scan_plans[i].iterations =
6235 				nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]);
6236 			if (!request->scan_plans[i].iterations ||
6237 			    (request->scan_plans[i].iterations >
6238 			     wiphy->max_sched_scan_plan_iterations))
6239 				return -EINVAL;
6240 		} else if (i < n_plans - 1) {
6241 			/*
6242 			 * All scan plans but the last one must specify
6243 			 * a finite number of iterations
6244 			 */
6245 			return -EINVAL;
6246 		}
6247 
6248 		i++;
6249 	}
6250 
6251 	/*
6252 	 * The last scan plan must not specify the number of
6253 	 * iterations, it is supposed to run infinitely
6254 	 */
6255 	if (request->scan_plans[n_plans - 1].iterations)
6256 		return  -EINVAL;
6257 
6258 	return 0;
6259 }
6260 
6261 static struct cfg80211_sched_scan_request *
6262 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
6263 			 struct nlattr **attrs)
6264 {
6265 	struct cfg80211_sched_scan_request *request;
6266 	struct nlattr *attr;
6267 	int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0;
6268 	enum ieee80211_band band;
6269 	size_t ie_len;
6270 	struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1];
6271 	s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF;
6272 
6273 	if (!is_valid_ie_attr(attrs[NL80211_ATTR_IE]))
6274 		return ERR_PTR(-EINVAL);
6275 
6276 	if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
6277 		n_channels = validate_scan_freqs(
6278 				attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
6279 		if (!n_channels)
6280 			return ERR_PTR(-EINVAL);
6281 	} else {
6282 		n_channels = ieee80211_get_num_supported_channels(wiphy);
6283 	}
6284 
6285 	if (attrs[NL80211_ATTR_SCAN_SSIDS])
6286 		nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
6287 				    tmp)
6288 			n_ssids++;
6289 
6290 	if (n_ssids > wiphy->max_sched_scan_ssids)
6291 		return ERR_PTR(-EINVAL);
6292 
6293 	/*
6294 	 * First, count the number of 'real' matchsets. Due to an issue with
6295 	 * the old implementation, matchsets containing only the RSSI attribute
6296 	 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default'
6297 	 * RSSI for all matchsets, rather than their own matchset for reporting
6298 	 * all APs with a strong RSSI. This is needed to be compatible with
6299 	 * older userspace that treated a matchset with only the RSSI as the
6300 	 * global RSSI for all other matchsets - if there are other matchsets.
6301 	 */
6302 	if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
6303 		nla_for_each_nested(attr,
6304 				    attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
6305 				    tmp) {
6306 			struct nlattr *rssi;
6307 
6308 			err = nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
6309 					nla_data(attr), nla_len(attr),
6310 					nl80211_match_policy);
6311 			if (err)
6312 				return ERR_PTR(err);
6313 			/* add other standalone attributes here */
6314 			if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]) {
6315 				n_match_sets++;
6316 				continue;
6317 			}
6318 			rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
6319 			if (rssi)
6320 				default_match_rssi = nla_get_s32(rssi);
6321 		}
6322 	}
6323 
6324 	/* However, if there's no other matchset, add the RSSI one */
6325 	if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
6326 		n_match_sets = 1;
6327 
6328 	if (n_match_sets > wiphy->max_match_sets)
6329 		return ERR_PTR(-EINVAL);
6330 
6331 	if (attrs[NL80211_ATTR_IE])
6332 		ie_len = nla_len(attrs[NL80211_ATTR_IE]);
6333 	else
6334 		ie_len = 0;
6335 
6336 	if (ie_len > wiphy->max_sched_scan_ie_len)
6337 		return ERR_PTR(-EINVAL);
6338 
6339 	if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
6340 		/*
6341 		 * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since
6342 		 * each scan plan already specifies its own interval
6343 		 */
6344 		if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
6345 			return ERR_PTR(-EINVAL);
6346 
6347 		nla_for_each_nested(attr,
6348 				    attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp)
6349 			n_plans++;
6350 	} else {
6351 		/*
6352 		 * The scan interval attribute is kept for backward
6353 		 * compatibility. If no scan plans are specified and sched scan
6354 		 * interval is specified, one scan plan will be set with this
6355 		 * scan interval and infinite number of iterations.
6356 		 */
6357 		if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
6358 			return ERR_PTR(-EINVAL);
6359 
6360 		n_plans = 1;
6361 	}
6362 
6363 	if (!n_plans || n_plans > wiphy->max_sched_scan_plans)
6364 		return ERR_PTR(-EINVAL);
6365 
6366 	request = kzalloc(sizeof(*request)
6367 			+ sizeof(*request->ssids) * n_ssids
6368 			+ sizeof(*request->match_sets) * n_match_sets
6369 			+ sizeof(*request->scan_plans) * n_plans
6370 			+ sizeof(*request->channels) * n_channels
6371 			+ ie_len, GFP_KERNEL);
6372 	if (!request)
6373 		return ERR_PTR(-ENOMEM);
6374 
6375 	if (n_ssids)
6376 		request->ssids = (void *)&request->channels[n_channels];
6377 	request->n_ssids = n_ssids;
6378 	if (ie_len) {
6379 		if (n_ssids)
6380 			request->ie = (void *)(request->ssids + n_ssids);
6381 		else
6382 			request->ie = (void *)(request->channels + n_channels);
6383 	}
6384 
6385 	if (n_match_sets) {
6386 		if (request->ie)
6387 			request->match_sets = (void *)(request->ie + ie_len);
6388 		else if (n_ssids)
6389 			request->match_sets =
6390 				(void *)(request->ssids + n_ssids);
6391 		else
6392 			request->match_sets =
6393 				(void *)(request->channels + n_channels);
6394 	}
6395 	request->n_match_sets = n_match_sets;
6396 
6397 	if (n_match_sets)
6398 		request->scan_plans = (void *)(request->match_sets +
6399 					       n_match_sets);
6400 	else if (request->ie)
6401 		request->scan_plans = (void *)(request->ie + ie_len);
6402 	else if (n_ssids)
6403 		request->scan_plans = (void *)(request->ssids + n_ssids);
6404 	else
6405 		request->scan_plans = (void *)(request->channels + n_channels);
6406 
6407 	request->n_scan_plans = n_plans;
6408 
6409 	i = 0;
6410 	if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
6411 		/* user specified, bail out if channel not found */
6412 		nla_for_each_nested(attr,
6413 				    attrs[NL80211_ATTR_SCAN_FREQUENCIES],
6414 				    tmp) {
6415 			struct ieee80211_channel *chan;
6416 
6417 			chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
6418 
6419 			if (!chan) {
6420 				err = -EINVAL;
6421 				goto out_free;
6422 			}
6423 
6424 			/* ignore disabled channels */
6425 			if (chan->flags & IEEE80211_CHAN_DISABLED)
6426 				continue;
6427 
6428 			request->channels[i] = chan;
6429 			i++;
6430 		}
6431 	} else {
6432 		/* all channels */
6433 		for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
6434 			int j;
6435 			if (!wiphy->bands[band])
6436 				continue;
6437 			for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
6438 				struct ieee80211_channel *chan;
6439 
6440 				chan = &wiphy->bands[band]->channels[j];
6441 
6442 				if (chan->flags & IEEE80211_CHAN_DISABLED)
6443 					continue;
6444 
6445 				request->channels[i] = chan;
6446 				i++;
6447 			}
6448 		}
6449 	}
6450 
6451 	if (!i) {
6452 		err = -EINVAL;
6453 		goto out_free;
6454 	}
6455 
6456 	request->n_channels = i;
6457 
6458 	i = 0;
6459 	if (n_ssids) {
6460 		nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
6461 				    tmp) {
6462 			if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
6463 				err = -EINVAL;
6464 				goto out_free;
6465 			}
6466 			request->ssids[i].ssid_len = nla_len(attr);
6467 			memcpy(request->ssids[i].ssid, nla_data(attr),
6468 			       nla_len(attr));
6469 			i++;
6470 		}
6471 	}
6472 
6473 	i = 0;
6474 	if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
6475 		nla_for_each_nested(attr,
6476 				    attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
6477 				    tmp) {
6478 			struct nlattr *ssid, *rssi;
6479 
6480 			err = nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
6481 					nla_data(attr), nla_len(attr),
6482 					nl80211_match_policy);
6483 			if (err)
6484 				goto out_free;
6485 			ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
6486 			if (ssid) {
6487 				if (WARN_ON(i >= n_match_sets)) {
6488 					/* this indicates a programming error,
6489 					 * the loop above should have verified
6490 					 * things properly
6491 					 */
6492 					err = -EINVAL;
6493 					goto out_free;
6494 				}
6495 
6496 				if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) {
6497 					err = -EINVAL;
6498 					goto out_free;
6499 				}
6500 				memcpy(request->match_sets[i].ssid.ssid,
6501 				       nla_data(ssid), nla_len(ssid));
6502 				request->match_sets[i].ssid.ssid_len =
6503 					nla_len(ssid);
6504 				/* special attribute - old implemenation w/a */
6505 				request->match_sets[i].rssi_thold =
6506 					default_match_rssi;
6507 				rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
6508 				if (rssi)
6509 					request->match_sets[i].rssi_thold =
6510 						nla_get_s32(rssi);
6511 			}
6512 			i++;
6513 		}
6514 
6515 		/* there was no other matchset, so the RSSI one is alone */
6516 		if (i == 0 && n_match_sets)
6517 			request->match_sets[0].rssi_thold = default_match_rssi;
6518 
6519 		request->min_rssi_thold = INT_MAX;
6520 		for (i = 0; i < n_match_sets; i++)
6521 			request->min_rssi_thold =
6522 				min(request->match_sets[i].rssi_thold,
6523 				    request->min_rssi_thold);
6524 	} else {
6525 		request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF;
6526 	}
6527 
6528 	if (ie_len) {
6529 		request->ie_len = ie_len;
6530 		memcpy((void *)request->ie,
6531 		       nla_data(attrs[NL80211_ATTR_IE]),
6532 		       request->ie_len);
6533 	}
6534 
6535 	if (attrs[NL80211_ATTR_SCAN_FLAGS]) {
6536 		request->flags = nla_get_u32(
6537 			attrs[NL80211_ATTR_SCAN_FLAGS]);
6538 		if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
6539 		    !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) {
6540 			err = -EOPNOTSUPP;
6541 			goto out_free;
6542 		}
6543 
6544 		if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
6545 			u32 flg = NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR;
6546 
6547 			if (!wdev) /* must be net-detect */
6548 				flg = NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
6549 
6550 			if (!(wiphy->features & flg)) {
6551 				err = -EOPNOTSUPP;
6552 				goto out_free;
6553 			}
6554 
6555 			if (wdev && wdev->current_bss) {
6556 				err = -EOPNOTSUPP;
6557 				goto out_free;
6558 			}
6559 
6560 			err = nl80211_parse_random_mac(attrs, request->mac_addr,
6561 						       request->mac_addr_mask);
6562 			if (err)
6563 				goto out_free;
6564 		}
6565 	}
6566 
6567 	if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY])
6568 		request->delay =
6569 			nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]);
6570 
6571 	err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs);
6572 	if (err)
6573 		goto out_free;
6574 
6575 	request->scan_start = jiffies;
6576 
6577 	return request;
6578 
6579 out_free:
6580 	kfree(request);
6581 	return ERR_PTR(err);
6582 }
6583 
6584 static int nl80211_start_sched_scan(struct sk_buff *skb,
6585 				    struct genl_info *info)
6586 {
6587 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
6588 	struct net_device *dev = info->user_ptr[1];
6589 	struct wireless_dev *wdev = dev->ieee80211_ptr;
6590 	struct cfg80211_sched_scan_request *sched_scan_req;
6591 	int err;
6592 
6593 	if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) ||
6594 	    !rdev->ops->sched_scan_start)
6595 		return -EOPNOTSUPP;
6596 
6597 	if (rdev->sched_scan_req)
6598 		return -EINPROGRESS;
6599 
6600 	sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev,
6601 						  info->attrs);
6602 
6603 	err = PTR_ERR_OR_ZERO(sched_scan_req);
6604 	if (err)
6605 		goto out_err;
6606 
6607 	err = rdev_sched_scan_start(rdev, dev, sched_scan_req);
6608 	if (err)
6609 		goto out_free;
6610 
6611 	sched_scan_req->dev = dev;
6612 	sched_scan_req->wiphy = &rdev->wiphy;
6613 
6614 	if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
6615 		sched_scan_req->owner_nlportid = info->snd_portid;
6616 
6617 	rcu_assign_pointer(rdev->sched_scan_req, sched_scan_req);
6618 
6619 	nl80211_send_sched_scan(rdev, dev,
6620 				NL80211_CMD_START_SCHED_SCAN);
6621 	return 0;
6622 
6623 out_free:
6624 	kfree(sched_scan_req);
6625 out_err:
6626 	return err;
6627 }
6628 
6629 static int nl80211_stop_sched_scan(struct sk_buff *skb,
6630 				   struct genl_info *info)
6631 {
6632 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
6633 
6634 	if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) ||
6635 	    !rdev->ops->sched_scan_stop)
6636 		return -EOPNOTSUPP;
6637 
6638 	return __cfg80211_stop_sched_scan(rdev, false);
6639 }
6640 
6641 static int nl80211_start_radar_detection(struct sk_buff *skb,
6642 					 struct genl_info *info)
6643 {
6644 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
6645 	struct net_device *dev = info->user_ptr[1];
6646 	struct wireless_dev *wdev = dev->ieee80211_ptr;
6647 	struct cfg80211_chan_def chandef;
6648 	enum nl80211_dfs_regions dfs_region;
6649 	unsigned int cac_time_ms;
6650 	int err;
6651 
6652 	dfs_region = reg_get_dfs_region(wdev->wiphy);
6653 	if (dfs_region == NL80211_DFS_UNSET)
6654 		return -EINVAL;
6655 
6656 	err = nl80211_parse_chandef(rdev, info, &chandef);
6657 	if (err)
6658 		return err;
6659 
6660 	if (netif_carrier_ok(dev))
6661 		return -EBUSY;
6662 
6663 	if (wdev->cac_started)
6664 		return -EBUSY;
6665 
6666 	err = cfg80211_chandef_dfs_required(wdev->wiphy, &chandef,
6667 					    wdev->iftype);
6668 	if (err < 0)
6669 		return err;
6670 
6671 	if (err == 0)
6672 		return -EINVAL;
6673 
6674 	if (!cfg80211_chandef_dfs_usable(wdev->wiphy, &chandef))
6675 		return -EINVAL;
6676 
6677 	if (!rdev->ops->start_radar_detection)
6678 		return -EOPNOTSUPP;
6679 
6680 	cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef);
6681 	if (WARN_ON(!cac_time_ms))
6682 		cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
6683 
6684 	err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms);
6685 	if (!err) {
6686 		wdev->chandef = chandef;
6687 		wdev->cac_started = true;
6688 		wdev->cac_start_time = jiffies;
6689 		wdev->cac_time_ms = cac_time_ms;
6690 	}
6691 	return err;
6692 }
6693 
6694 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
6695 {
6696 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
6697 	struct net_device *dev = info->user_ptr[1];
6698 	struct wireless_dev *wdev = dev->ieee80211_ptr;
6699 	struct cfg80211_csa_settings params;
6700 	/* csa_attrs is defined static to avoid waste of stack size - this
6701 	 * function is called under RTNL lock, so this should not be a problem.
6702 	 */
6703 	static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1];
6704 	int err;
6705 	bool need_new_beacon = false;
6706 	int len, i;
6707 	u32 cs_count;
6708 
6709 	if (!rdev->ops->channel_switch ||
6710 	    !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
6711 		return -EOPNOTSUPP;
6712 
6713 	switch (dev->ieee80211_ptr->iftype) {
6714 	case NL80211_IFTYPE_AP:
6715 	case NL80211_IFTYPE_P2P_GO:
6716 		need_new_beacon = true;
6717 
6718 		/* useless if AP is not running */
6719 		if (!wdev->beacon_interval)
6720 			return -ENOTCONN;
6721 		break;
6722 	case NL80211_IFTYPE_ADHOC:
6723 		if (!wdev->ssid_len)
6724 			return -ENOTCONN;
6725 		break;
6726 	case NL80211_IFTYPE_MESH_POINT:
6727 		if (!wdev->mesh_id_len)
6728 			return -ENOTCONN;
6729 		break;
6730 	default:
6731 		return -EOPNOTSUPP;
6732 	}
6733 
6734 	memset(&params, 0, sizeof(params));
6735 
6736 	if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
6737 	    !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT])
6738 		return -EINVAL;
6739 
6740 	/* only important for AP, IBSS and mesh create IEs internally */
6741 	if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES])
6742 		return -EINVAL;
6743 
6744 	/* Even though the attribute is u32, the specification says
6745 	 * u8, so let's make sure we don't overflow.
6746 	 */
6747 	cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]);
6748 	if (cs_count > 255)
6749 		return -EINVAL;
6750 
6751 	params.count = cs_count;
6752 
6753 	if (!need_new_beacon)
6754 		goto skip_beacons;
6755 
6756 	err = nl80211_parse_beacon(info->attrs, &params.beacon_after);
6757 	if (err)
6758 		return err;
6759 
6760 	err = nla_parse_nested(csa_attrs, NL80211_ATTR_MAX,
6761 			       info->attrs[NL80211_ATTR_CSA_IES],
6762 			       nl80211_policy);
6763 	if (err)
6764 		return err;
6765 
6766 	err = nl80211_parse_beacon(csa_attrs, &params.beacon_csa);
6767 	if (err)
6768 		return err;
6769 
6770 	if (!csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON])
6771 		return -EINVAL;
6772 
6773 	len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]);
6774 	if (!len || (len % sizeof(u16)))
6775 		return -EINVAL;
6776 
6777 	params.n_counter_offsets_beacon = len / sizeof(u16);
6778 	if (rdev->wiphy.max_num_csa_counters &&
6779 	    (params.n_counter_offsets_beacon >
6780 	     rdev->wiphy.max_num_csa_counters))
6781 		return -EINVAL;
6782 
6783 	params.counter_offsets_beacon =
6784 		nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]);
6785 
6786 	/* sanity checks - counters should fit and be the same */
6787 	for (i = 0; i < params.n_counter_offsets_beacon; i++) {
6788 		u16 offset = params.counter_offsets_beacon[i];
6789 
6790 		if (offset >= params.beacon_csa.tail_len)
6791 			return -EINVAL;
6792 
6793 		if (params.beacon_csa.tail[offset] != params.count)
6794 			return -EINVAL;
6795 	}
6796 
6797 	if (csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]) {
6798 		len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]);
6799 		if (!len || (len % sizeof(u16)))
6800 			return -EINVAL;
6801 
6802 		params.n_counter_offsets_presp = len / sizeof(u16);
6803 		if (rdev->wiphy.max_num_csa_counters &&
6804 		    (params.n_counter_offsets_beacon >
6805 		     rdev->wiphy.max_num_csa_counters))
6806 			return -EINVAL;
6807 
6808 		params.counter_offsets_presp =
6809 			nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]);
6810 
6811 		/* sanity checks - counters should fit and be the same */
6812 		for (i = 0; i < params.n_counter_offsets_presp; i++) {
6813 			u16 offset = params.counter_offsets_presp[i];
6814 
6815 			if (offset >= params.beacon_csa.probe_resp_len)
6816 				return -EINVAL;
6817 
6818 			if (params.beacon_csa.probe_resp[offset] !=
6819 			    params.count)
6820 				return -EINVAL;
6821 		}
6822 	}
6823 
6824 skip_beacons:
6825 	err = nl80211_parse_chandef(rdev, info, &params.chandef);
6826 	if (err)
6827 		return err;
6828 
6829 	if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef,
6830 					   wdev->iftype))
6831 		return -EINVAL;
6832 
6833 	err = cfg80211_chandef_dfs_required(wdev->wiphy,
6834 					    &params.chandef,
6835 					    wdev->iftype);
6836 	if (err < 0)
6837 		return err;
6838 
6839 	if (err > 0)
6840 		params.radar_required = true;
6841 
6842 	if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
6843 		params.block_tx = true;
6844 
6845 	wdev_lock(wdev);
6846 	err = rdev_channel_switch(rdev, dev, &params);
6847 	wdev_unlock(wdev);
6848 
6849 	return err;
6850 }
6851 
6852 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
6853 			    u32 seq, int flags,
6854 			    struct cfg80211_registered_device *rdev,
6855 			    struct wireless_dev *wdev,
6856 			    struct cfg80211_internal_bss *intbss)
6857 {
6858 	struct cfg80211_bss *res = &intbss->pub;
6859 	const struct cfg80211_bss_ies *ies;
6860 	void *hdr;
6861 	struct nlattr *bss;
6862 
6863 	ASSERT_WDEV_LOCK(wdev);
6864 
6865 	hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
6866 			     NL80211_CMD_NEW_SCAN_RESULTS);
6867 	if (!hdr)
6868 		return -1;
6869 
6870 	genl_dump_check_consistent(cb, hdr, &nl80211_fam);
6871 
6872 	if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation))
6873 		goto nla_put_failure;
6874 	if (wdev->netdev &&
6875 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex))
6876 		goto nla_put_failure;
6877 	if (nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
6878 		goto nla_put_failure;
6879 
6880 	bss = nla_nest_start(msg, NL80211_ATTR_BSS);
6881 	if (!bss)
6882 		goto nla_put_failure;
6883 	if ((!is_zero_ether_addr(res->bssid) &&
6884 	     nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid)))
6885 		goto nla_put_failure;
6886 
6887 	rcu_read_lock();
6888 	/* indicate whether we have probe response data or not */
6889 	if (rcu_access_pointer(res->proberesp_ies) &&
6890 	    nla_put_flag(msg, NL80211_BSS_PRESP_DATA))
6891 		goto fail_unlock_rcu;
6892 
6893 	/* this pointer prefers to be pointed to probe response data
6894 	 * but is always valid
6895 	 */
6896 	ies = rcu_dereference(res->ies);
6897 	if (ies) {
6898 		if (nla_put_u64(msg, NL80211_BSS_TSF, ies->tsf))
6899 			goto fail_unlock_rcu;
6900 		if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS,
6901 					ies->len, ies->data))
6902 			goto fail_unlock_rcu;
6903 	}
6904 
6905 	/* and this pointer is always (unless driver didn't know) beacon data */
6906 	ies = rcu_dereference(res->beacon_ies);
6907 	if (ies && ies->from_beacon) {
6908 		if (nla_put_u64(msg, NL80211_BSS_BEACON_TSF, ies->tsf))
6909 			goto fail_unlock_rcu;
6910 		if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES,
6911 					ies->len, ies->data))
6912 			goto fail_unlock_rcu;
6913 	}
6914 	rcu_read_unlock();
6915 
6916 	if (res->beacon_interval &&
6917 	    nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval))
6918 		goto nla_put_failure;
6919 	if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) ||
6920 	    nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) ||
6921 	    nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) ||
6922 	    nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO,
6923 			jiffies_to_msecs(jiffies - intbss->ts)))
6924 		goto nla_put_failure;
6925 
6926 	if (intbss->ts_boottime &&
6927 	    nla_put_u64(msg, NL80211_BSS_LAST_SEEN_BOOTTIME,
6928 			intbss->ts_boottime))
6929 		goto nla_put_failure;
6930 
6931 	switch (rdev->wiphy.signal_type) {
6932 	case CFG80211_SIGNAL_TYPE_MBM:
6933 		if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal))
6934 			goto nla_put_failure;
6935 		break;
6936 	case CFG80211_SIGNAL_TYPE_UNSPEC:
6937 		if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal))
6938 			goto nla_put_failure;
6939 		break;
6940 	default:
6941 		break;
6942 	}
6943 
6944 	switch (wdev->iftype) {
6945 	case NL80211_IFTYPE_P2P_CLIENT:
6946 	case NL80211_IFTYPE_STATION:
6947 		if (intbss == wdev->current_bss &&
6948 		    nla_put_u32(msg, NL80211_BSS_STATUS,
6949 				NL80211_BSS_STATUS_ASSOCIATED))
6950 			goto nla_put_failure;
6951 		break;
6952 	case NL80211_IFTYPE_ADHOC:
6953 		if (intbss == wdev->current_bss &&
6954 		    nla_put_u32(msg, NL80211_BSS_STATUS,
6955 				NL80211_BSS_STATUS_IBSS_JOINED))
6956 			goto nla_put_failure;
6957 		break;
6958 	default:
6959 		break;
6960 	}
6961 
6962 	nla_nest_end(msg, bss);
6963 
6964 	genlmsg_end(msg, hdr);
6965 	return 0;
6966 
6967  fail_unlock_rcu:
6968 	rcu_read_unlock();
6969  nla_put_failure:
6970 	genlmsg_cancel(msg, hdr);
6971 	return -EMSGSIZE;
6972 }
6973 
6974 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb)
6975 {
6976 	struct cfg80211_registered_device *rdev;
6977 	struct cfg80211_internal_bss *scan;
6978 	struct wireless_dev *wdev;
6979 	int start = cb->args[2], idx = 0;
6980 	int err;
6981 
6982 	err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
6983 	if (err)
6984 		return err;
6985 
6986 	wdev_lock(wdev);
6987 	spin_lock_bh(&rdev->bss_lock);
6988 	cfg80211_bss_expire(rdev);
6989 
6990 	cb->seq = rdev->bss_generation;
6991 
6992 	list_for_each_entry(scan, &rdev->bss_list, list) {
6993 		if (++idx <= start)
6994 			continue;
6995 		if (nl80211_send_bss(skb, cb,
6996 				cb->nlh->nlmsg_seq, NLM_F_MULTI,
6997 				rdev, wdev, scan) < 0) {
6998 			idx--;
6999 			break;
7000 		}
7001 	}
7002 
7003 	spin_unlock_bh(&rdev->bss_lock);
7004 	wdev_unlock(wdev);
7005 
7006 	cb->args[2] = idx;
7007 	nl80211_finish_wdev_dump(rdev);
7008 
7009 	return skb->len;
7010 }
7011 
7012 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq,
7013 			       int flags, struct net_device *dev,
7014 			       bool allow_radio_stats,
7015 			       struct survey_info *survey)
7016 {
7017 	void *hdr;
7018 	struct nlattr *infoattr;
7019 
7020 	/* skip radio stats if userspace didn't request them */
7021 	if (!survey->channel && !allow_radio_stats)
7022 		return 0;
7023 
7024 	hdr = nl80211hdr_put(msg, portid, seq, flags,
7025 			     NL80211_CMD_NEW_SURVEY_RESULTS);
7026 	if (!hdr)
7027 		return -ENOMEM;
7028 
7029 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
7030 		goto nla_put_failure;
7031 
7032 	infoattr = nla_nest_start(msg, NL80211_ATTR_SURVEY_INFO);
7033 	if (!infoattr)
7034 		goto nla_put_failure;
7035 
7036 	if (survey->channel &&
7037 	    nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY,
7038 			survey->channel->center_freq))
7039 		goto nla_put_failure;
7040 
7041 	if ((survey->filled & SURVEY_INFO_NOISE_DBM) &&
7042 	    nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise))
7043 		goto nla_put_failure;
7044 	if ((survey->filled & SURVEY_INFO_IN_USE) &&
7045 	    nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE))
7046 		goto nla_put_failure;
7047 	if ((survey->filled & SURVEY_INFO_TIME) &&
7048 	    nla_put_u64(msg, NL80211_SURVEY_INFO_TIME,
7049 			survey->time))
7050 		goto nla_put_failure;
7051 	if ((survey->filled & SURVEY_INFO_TIME_BUSY) &&
7052 	    nla_put_u64(msg, NL80211_SURVEY_INFO_TIME_BUSY,
7053 			survey->time_busy))
7054 		goto nla_put_failure;
7055 	if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) &&
7056 	    nla_put_u64(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY,
7057 			survey->time_ext_busy))
7058 		goto nla_put_failure;
7059 	if ((survey->filled & SURVEY_INFO_TIME_RX) &&
7060 	    nla_put_u64(msg, NL80211_SURVEY_INFO_TIME_RX,
7061 			survey->time_rx))
7062 		goto nla_put_failure;
7063 	if ((survey->filled & SURVEY_INFO_TIME_TX) &&
7064 	    nla_put_u64(msg, NL80211_SURVEY_INFO_TIME_TX,
7065 			survey->time_tx))
7066 		goto nla_put_failure;
7067 	if ((survey->filled & SURVEY_INFO_TIME_SCAN) &&
7068 	    nla_put_u64(msg, NL80211_SURVEY_INFO_TIME_SCAN,
7069 			survey->time_scan))
7070 		goto nla_put_failure;
7071 
7072 	nla_nest_end(msg, infoattr);
7073 
7074 	genlmsg_end(msg, hdr);
7075 	return 0;
7076 
7077  nla_put_failure:
7078 	genlmsg_cancel(msg, hdr);
7079 	return -EMSGSIZE;
7080 }
7081 
7082 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
7083 {
7084 	struct survey_info survey;
7085 	struct cfg80211_registered_device *rdev;
7086 	struct wireless_dev *wdev;
7087 	int survey_idx = cb->args[2];
7088 	int res;
7089 	bool radio_stats;
7090 
7091 	res = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
7092 	if (res)
7093 		return res;
7094 
7095 	/* prepare_wdev_dump parsed the attributes */
7096 	radio_stats = nl80211_fam.attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
7097 
7098 	if (!wdev->netdev) {
7099 		res = -EINVAL;
7100 		goto out_err;
7101 	}
7102 
7103 	if (!rdev->ops->dump_survey) {
7104 		res = -EOPNOTSUPP;
7105 		goto out_err;
7106 	}
7107 
7108 	while (1) {
7109 		res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey);
7110 		if (res == -ENOENT)
7111 			break;
7112 		if (res)
7113 			goto out_err;
7114 
7115 		/* don't send disabled channels, but do send non-channel data */
7116 		if (survey.channel &&
7117 		    survey.channel->flags & IEEE80211_CHAN_DISABLED) {
7118 			survey_idx++;
7119 			continue;
7120 		}
7121 
7122 		if (nl80211_send_survey(skb,
7123 				NETLINK_CB(cb->skb).portid,
7124 				cb->nlh->nlmsg_seq, NLM_F_MULTI,
7125 				wdev->netdev, radio_stats, &survey) < 0)
7126 			goto out;
7127 		survey_idx++;
7128 	}
7129 
7130  out:
7131 	cb->args[2] = survey_idx;
7132 	res = skb->len;
7133  out_err:
7134 	nl80211_finish_wdev_dump(rdev);
7135 	return res;
7136 }
7137 
7138 static bool nl80211_valid_wpa_versions(u32 wpa_versions)
7139 {
7140 	return !(wpa_versions & ~(NL80211_WPA_VERSION_1 |
7141 				  NL80211_WPA_VERSION_2));
7142 }
7143 
7144 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
7145 {
7146 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
7147 	struct net_device *dev = info->user_ptr[1];
7148 	struct ieee80211_channel *chan;
7149 	const u8 *bssid, *ssid, *ie = NULL, *sae_data = NULL;
7150 	int err, ssid_len, ie_len = 0, sae_data_len = 0;
7151 	enum nl80211_auth_type auth_type;
7152 	struct key_parse key;
7153 	bool local_state_change;
7154 
7155 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
7156 		return -EINVAL;
7157 
7158 	if (!info->attrs[NL80211_ATTR_MAC])
7159 		return -EINVAL;
7160 
7161 	if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
7162 		return -EINVAL;
7163 
7164 	if (!info->attrs[NL80211_ATTR_SSID])
7165 		return -EINVAL;
7166 
7167 	if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
7168 		return -EINVAL;
7169 
7170 	err = nl80211_parse_key(info, &key);
7171 	if (err)
7172 		return err;
7173 
7174 	if (key.idx >= 0) {
7175 		if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP)
7176 			return -EINVAL;
7177 		if (!key.p.key || !key.p.key_len)
7178 			return -EINVAL;
7179 		if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 ||
7180 		     key.p.key_len != WLAN_KEY_LEN_WEP40) &&
7181 		    (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 ||
7182 		     key.p.key_len != WLAN_KEY_LEN_WEP104))
7183 			return -EINVAL;
7184 		if (key.idx > 4)
7185 			return -EINVAL;
7186 	} else {
7187 		key.p.key_len = 0;
7188 		key.p.key = NULL;
7189 	}
7190 
7191 	if (key.idx >= 0) {
7192 		int i;
7193 		bool ok = false;
7194 		for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) {
7195 			if (key.p.cipher == rdev->wiphy.cipher_suites[i]) {
7196 				ok = true;
7197 				break;
7198 			}
7199 		}
7200 		if (!ok)
7201 			return -EINVAL;
7202 	}
7203 
7204 	if (!rdev->ops->auth)
7205 		return -EOPNOTSUPP;
7206 
7207 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
7208 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
7209 		return -EOPNOTSUPP;
7210 
7211 	bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
7212 	chan = nl80211_get_valid_chan(&rdev->wiphy,
7213 				      info->attrs[NL80211_ATTR_WIPHY_FREQ]);
7214 	if (!chan)
7215 		return -EINVAL;
7216 
7217 	ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
7218 	ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
7219 
7220 	if (info->attrs[NL80211_ATTR_IE]) {
7221 		ie = nla_data(info->attrs[NL80211_ATTR_IE]);
7222 		ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
7223 	}
7224 
7225 	auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
7226 	if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE))
7227 		return -EINVAL;
7228 
7229 	if (auth_type == NL80211_AUTHTYPE_SAE &&
7230 	    !info->attrs[NL80211_ATTR_SAE_DATA])
7231 		return -EINVAL;
7232 
7233 	if (info->attrs[NL80211_ATTR_SAE_DATA]) {
7234 		if (auth_type != NL80211_AUTHTYPE_SAE)
7235 			return -EINVAL;
7236 		sae_data = nla_data(info->attrs[NL80211_ATTR_SAE_DATA]);
7237 		sae_data_len = nla_len(info->attrs[NL80211_ATTR_SAE_DATA]);
7238 		/* need to include at least Auth Transaction and Status Code */
7239 		if (sae_data_len < 4)
7240 			return -EINVAL;
7241 	}
7242 
7243 	local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
7244 
7245 	/*
7246 	 * Since we no longer track auth state, ignore
7247 	 * requests to only change local state.
7248 	 */
7249 	if (local_state_change)
7250 		return 0;
7251 
7252 	wdev_lock(dev->ieee80211_ptr);
7253 	err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
7254 				 ssid, ssid_len, ie, ie_len,
7255 				 key.p.key, key.p.key_len, key.idx,
7256 				 sae_data, sae_data_len);
7257 	wdev_unlock(dev->ieee80211_ptr);
7258 	return err;
7259 }
7260 
7261 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
7262 				   struct genl_info *info,
7263 				   struct cfg80211_crypto_settings *settings,
7264 				   int cipher_limit)
7265 {
7266 	memset(settings, 0, sizeof(*settings));
7267 
7268 	settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
7269 
7270 	if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
7271 		u16 proto;
7272 		proto = nla_get_u16(
7273 			info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
7274 		settings->control_port_ethertype = cpu_to_be16(proto);
7275 		if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
7276 		    proto != ETH_P_PAE)
7277 			return -EINVAL;
7278 		if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT])
7279 			settings->control_port_no_encrypt = true;
7280 	} else
7281 		settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE);
7282 
7283 	if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
7284 		void *data;
7285 		int len, i;
7286 
7287 		data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
7288 		len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
7289 		settings->n_ciphers_pairwise = len / sizeof(u32);
7290 
7291 		if (len % sizeof(u32))
7292 			return -EINVAL;
7293 
7294 		if (settings->n_ciphers_pairwise > cipher_limit)
7295 			return -EINVAL;
7296 
7297 		memcpy(settings->ciphers_pairwise, data, len);
7298 
7299 		for (i = 0; i < settings->n_ciphers_pairwise; i++)
7300 			if (!cfg80211_supported_cipher_suite(
7301 					&rdev->wiphy,
7302 					settings->ciphers_pairwise[i]))
7303 				return -EINVAL;
7304 	}
7305 
7306 	if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
7307 		settings->cipher_group =
7308 			nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
7309 		if (!cfg80211_supported_cipher_suite(&rdev->wiphy,
7310 						     settings->cipher_group))
7311 			return -EINVAL;
7312 	}
7313 
7314 	if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) {
7315 		settings->wpa_versions =
7316 			nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
7317 		if (!nl80211_valid_wpa_versions(settings->wpa_versions))
7318 			return -EINVAL;
7319 	}
7320 
7321 	if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
7322 		void *data;
7323 		int len;
7324 
7325 		data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
7326 		len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
7327 		settings->n_akm_suites = len / sizeof(u32);
7328 
7329 		if (len % sizeof(u32))
7330 			return -EINVAL;
7331 
7332 		if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
7333 			return -EINVAL;
7334 
7335 		memcpy(settings->akm_suites, data, len);
7336 	}
7337 
7338 	return 0;
7339 }
7340 
7341 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
7342 {
7343 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
7344 	struct net_device *dev = info->user_ptr[1];
7345 	struct ieee80211_channel *chan;
7346 	struct cfg80211_assoc_request req = {};
7347 	const u8 *bssid, *ssid;
7348 	int err, ssid_len = 0;
7349 
7350 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
7351 		return -EINVAL;
7352 
7353 	if (!info->attrs[NL80211_ATTR_MAC] ||
7354 	    !info->attrs[NL80211_ATTR_SSID] ||
7355 	    !info->attrs[NL80211_ATTR_WIPHY_FREQ])
7356 		return -EINVAL;
7357 
7358 	if (!rdev->ops->assoc)
7359 		return -EOPNOTSUPP;
7360 
7361 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
7362 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
7363 		return -EOPNOTSUPP;
7364 
7365 	bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
7366 
7367 	chan = nl80211_get_valid_chan(&rdev->wiphy,
7368 				      info->attrs[NL80211_ATTR_WIPHY_FREQ]);
7369 	if (!chan)
7370 		return -EINVAL;
7371 
7372 	ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
7373 	ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
7374 
7375 	if (info->attrs[NL80211_ATTR_IE]) {
7376 		req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
7377 		req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
7378 	}
7379 
7380 	if (info->attrs[NL80211_ATTR_USE_MFP]) {
7381 		enum nl80211_mfp mfp =
7382 			nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
7383 		if (mfp == NL80211_MFP_REQUIRED)
7384 			req.use_mfp = true;
7385 		else if (mfp != NL80211_MFP_NO)
7386 			return -EINVAL;
7387 	}
7388 
7389 	if (info->attrs[NL80211_ATTR_PREV_BSSID])
7390 		req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
7391 
7392 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
7393 		req.flags |= ASSOC_REQ_DISABLE_HT;
7394 
7395 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
7396 		memcpy(&req.ht_capa_mask,
7397 		       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
7398 		       sizeof(req.ht_capa_mask));
7399 
7400 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
7401 		if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
7402 			return -EINVAL;
7403 		memcpy(&req.ht_capa,
7404 		       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
7405 		       sizeof(req.ht_capa));
7406 	}
7407 
7408 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
7409 		req.flags |= ASSOC_REQ_DISABLE_VHT;
7410 
7411 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
7412 		memcpy(&req.vht_capa_mask,
7413 		       nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
7414 		       sizeof(req.vht_capa_mask));
7415 
7416 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
7417 		if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
7418 			return -EINVAL;
7419 		memcpy(&req.vht_capa,
7420 		       nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
7421 		       sizeof(req.vht_capa));
7422 	}
7423 
7424 	if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
7425 		if (!((rdev->wiphy.features &
7426 			NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
7427 		       (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
7428 		    !wiphy_ext_feature_isset(&rdev->wiphy,
7429 					     NL80211_EXT_FEATURE_RRM))
7430 			return -EINVAL;
7431 		req.flags |= ASSOC_REQ_USE_RRM;
7432 	}
7433 
7434 	err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
7435 	if (!err) {
7436 		wdev_lock(dev->ieee80211_ptr);
7437 		err = cfg80211_mlme_assoc(rdev, dev, chan, bssid,
7438 					  ssid, ssid_len, &req);
7439 		wdev_unlock(dev->ieee80211_ptr);
7440 	}
7441 
7442 	return err;
7443 }
7444 
7445 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
7446 {
7447 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
7448 	struct net_device *dev = info->user_ptr[1];
7449 	const u8 *ie = NULL, *bssid;
7450 	int ie_len = 0, err;
7451 	u16 reason_code;
7452 	bool local_state_change;
7453 
7454 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
7455 		return -EINVAL;
7456 
7457 	if (!info->attrs[NL80211_ATTR_MAC])
7458 		return -EINVAL;
7459 
7460 	if (!info->attrs[NL80211_ATTR_REASON_CODE])
7461 		return -EINVAL;
7462 
7463 	if (!rdev->ops->deauth)
7464 		return -EOPNOTSUPP;
7465 
7466 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
7467 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
7468 		return -EOPNOTSUPP;
7469 
7470 	bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
7471 
7472 	reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
7473 	if (reason_code == 0) {
7474 		/* Reason Code 0 is reserved */
7475 		return -EINVAL;
7476 	}
7477 
7478 	if (info->attrs[NL80211_ATTR_IE]) {
7479 		ie = nla_data(info->attrs[NL80211_ATTR_IE]);
7480 		ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
7481 	}
7482 
7483 	local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
7484 
7485 	wdev_lock(dev->ieee80211_ptr);
7486 	err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code,
7487 				   local_state_change);
7488 	wdev_unlock(dev->ieee80211_ptr);
7489 	return err;
7490 }
7491 
7492 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
7493 {
7494 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
7495 	struct net_device *dev = info->user_ptr[1];
7496 	const u8 *ie = NULL, *bssid;
7497 	int ie_len = 0, err;
7498 	u16 reason_code;
7499 	bool local_state_change;
7500 
7501 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
7502 		return -EINVAL;
7503 
7504 	if (!info->attrs[NL80211_ATTR_MAC])
7505 		return -EINVAL;
7506 
7507 	if (!info->attrs[NL80211_ATTR_REASON_CODE])
7508 		return -EINVAL;
7509 
7510 	if (!rdev->ops->disassoc)
7511 		return -EOPNOTSUPP;
7512 
7513 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
7514 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
7515 		return -EOPNOTSUPP;
7516 
7517 	bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
7518 
7519 	reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
7520 	if (reason_code == 0) {
7521 		/* Reason Code 0 is reserved */
7522 		return -EINVAL;
7523 	}
7524 
7525 	if (info->attrs[NL80211_ATTR_IE]) {
7526 		ie = nla_data(info->attrs[NL80211_ATTR_IE]);
7527 		ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
7528 	}
7529 
7530 	local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
7531 
7532 	wdev_lock(dev->ieee80211_ptr);
7533 	err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code,
7534 				     local_state_change);
7535 	wdev_unlock(dev->ieee80211_ptr);
7536 	return err;
7537 }
7538 
7539 static bool
7540 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev,
7541 			 int mcast_rate[IEEE80211_NUM_BANDS],
7542 			 int rateval)
7543 {
7544 	struct wiphy *wiphy = &rdev->wiphy;
7545 	bool found = false;
7546 	int band, i;
7547 
7548 	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
7549 		struct ieee80211_supported_band *sband;
7550 
7551 		sband = wiphy->bands[band];
7552 		if (!sband)
7553 			continue;
7554 
7555 		for (i = 0; i < sband->n_bitrates; i++) {
7556 			if (sband->bitrates[i].bitrate == rateval) {
7557 				mcast_rate[band] = i + 1;
7558 				found = true;
7559 				break;
7560 			}
7561 		}
7562 	}
7563 
7564 	return found;
7565 }
7566 
7567 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
7568 {
7569 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
7570 	struct net_device *dev = info->user_ptr[1];
7571 	struct cfg80211_ibss_params ibss;
7572 	struct wiphy *wiphy;
7573 	struct cfg80211_cached_keys *connkeys = NULL;
7574 	int err;
7575 
7576 	memset(&ibss, 0, sizeof(ibss));
7577 
7578 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
7579 		return -EINVAL;
7580 
7581 	if (!info->attrs[NL80211_ATTR_SSID] ||
7582 	    !nla_len(info->attrs[NL80211_ATTR_SSID]))
7583 		return -EINVAL;
7584 
7585 	ibss.beacon_interval = 100;
7586 
7587 	if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
7588 		ibss.beacon_interval =
7589 			nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
7590 		if (ibss.beacon_interval < 1 || ibss.beacon_interval > 10000)
7591 			return -EINVAL;
7592 	}
7593 
7594 	if (!rdev->ops->join_ibss)
7595 		return -EOPNOTSUPP;
7596 
7597 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
7598 		return -EOPNOTSUPP;
7599 
7600 	wiphy = &rdev->wiphy;
7601 
7602 	if (info->attrs[NL80211_ATTR_MAC]) {
7603 		ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
7604 
7605 		if (!is_valid_ether_addr(ibss.bssid))
7606 			return -EINVAL;
7607 	}
7608 	ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
7609 	ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
7610 
7611 	if (info->attrs[NL80211_ATTR_IE]) {
7612 		ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
7613 		ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
7614 	}
7615 
7616 	err = nl80211_parse_chandef(rdev, info, &ibss.chandef);
7617 	if (err)
7618 		return err;
7619 
7620 	if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef,
7621 				     NL80211_IFTYPE_ADHOC))
7622 		return -EINVAL;
7623 
7624 	switch (ibss.chandef.width) {
7625 	case NL80211_CHAN_WIDTH_5:
7626 	case NL80211_CHAN_WIDTH_10:
7627 	case NL80211_CHAN_WIDTH_20_NOHT:
7628 		break;
7629 	case NL80211_CHAN_WIDTH_20:
7630 	case NL80211_CHAN_WIDTH_40:
7631 		if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
7632 			return -EINVAL;
7633 		break;
7634 	case NL80211_CHAN_WIDTH_80:
7635 	case NL80211_CHAN_WIDTH_80P80:
7636 	case NL80211_CHAN_WIDTH_160:
7637 		if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
7638 			return -EINVAL;
7639 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
7640 					     NL80211_EXT_FEATURE_VHT_IBSS))
7641 			return -EINVAL;
7642 		break;
7643 	default:
7644 		return -EINVAL;
7645 	}
7646 
7647 	ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
7648 	ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
7649 
7650 	if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
7651 		u8 *rates =
7652 			nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
7653 		int n_rates =
7654 			nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
7655 		struct ieee80211_supported_band *sband =
7656 			wiphy->bands[ibss.chandef.chan->band];
7657 
7658 		err = ieee80211_get_ratemask(sband, rates, n_rates,
7659 					     &ibss.basic_rates);
7660 		if (err)
7661 			return err;
7662 	}
7663 
7664 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
7665 		memcpy(&ibss.ht_capa_mask,
7666 		       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
7667 		       sizeof(ibss.ht_capa_mask));
7668 
7669 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
7670 		if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
7671 			return -EINVAL;
7672 		memcpy(&ibss.ht_capa,
7673 		       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
7674 		       sizeof(ibss.ht_capa));
7675 	}
7676 
7677 	if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
7678 	    !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate,
7679 			nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
7680 		return -EINVAL;
7681 
7682 	if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
7683 		bool no_ht = false;
7684 
7685 		connkeys = nl80211_parse_connkeys(rdev,
7686 					  info->attrs[NL80211_ATTR_KEYS],
7687 					  &no_ht);
7688 		if (IS_ERR(connkeys))
7689 			return PTR_ERR(connkeys);
7690 
7691 		if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) &&
7692 		    no_ht) {
7693 			kzfree(connkeys);
7694 			return -EINVAL;
7695 		}
7696 	}
7697 
7698 	ibss.control_port =
7699 		nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]);
7700 
7701 	ibss.userspace_handles_dfs =
7702 		nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
7703 
7704 	err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
7705 	if (err)
7706 		kzfree(connkeys);
7707 	return err;
7708 }
7709 
7710 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
7711 {
7712 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
7713 	struct net_device *dev = info->user_ptr[1];
7714 
7715 	if (!rdev->ops->leave_ibss)
7716 		return -EOPNOTSUPP;
7717 
7718 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
7719 		return -EOPNOTSUPP;
7720 
7721 	return cfg80211_leave_ibss(rdev, dev, false);
7722 }
7723 
7724 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info)
7725 {
7726 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
7727 	struct net_device *dev = info->user_ptr[1];
7728 	int mcast_rate[IEEE80211_NUM_BANDS];
7729 	u32 nla_rate;
7730 	int err;
7731 
7732 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
7733 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
7734 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB)
7735 		return -EOPNOTSUPP;
7736 
7737 	if (!rdev->ops->set_mcast_rate)
7738 		return -EOPNOTSUPP;
7739 
7740 	memset(mcast_rate, 0, sizeof(mcast_rate));
7741 
7742 	if (!info->attrs[NL80211_ATTR_MCAST_RATE])
7743 		return -EINVAL;
7744 
7745 	nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
7746 	if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate))
7747 		return -EINVAL;
7748 
7749 	err = rdev_set_mcast_rate(rdev, dev, mcast_rate);
7750 
7751 	return err;
7752 }
7753 
7754 static struct sk_buff *
7755 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
7756 			    struct wireless_dev *wdev, int approxlen,
7757 			    u32 portid, u32 seq, enum nl80211_commands cmd,
7758 			    enum nl80211_attrs attr,
7759 			    const struct nl80211_vendor_cmd_info *info,
7760 			    gfp_t gfp)
7761 {
7762 	struct sk_buff *skb;
7763 	void *hdr;
7764 	struct nlattr *data;
7765 
7766 	skb = nlmsg_new(approxlen + 100, gfp);
7767 	if (!skb)
7768 		return NULL;
7769 
7770 	hdr = nl80211hdr_put(skb, portid, seq, 0, cmd);
7771 	if (!hdr) {
7772 		kfree_skb(skb);
7773 		return NULL;
7774 	}
7775 
7776 	if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
7777 		goto nla_put_failure;
7778 
7779 	if (info) {
7780 		if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID,
7781 				info->vendor_id))
7782 			goto nla_put_failure;
7783 		if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD,
7784 				info->subcmd))
7785 			goto nla_put_failure;
7786 	}
7787 
7788 	if (wdev) {
7789 		if (nla_put_u64(skb, NL80211_ATTR_WDEV,
7790 				wdev_id(wdev)))
7791 			goto nla_put_failure;
7792 		if (wdev->netdev &&
7793 		    nla_put_u32(skb, NL80211_ATTR_IFINDEX,
7794 				wdev->netdev->ifindex))
7795 			goto nla_put_failure;
7796 	}
7797 
7798 	data = nla_nest_start(skb, attr);
7799 
7800 	((void **)skb->cb)[0] = rdev;
7801 	((void **)skb->cb)[1] = hdr;
7802 	((void **)skb->cb)[2] = data;
7803 
7804 	return skb;
7805 
7806  nla_put_failure:
7807 	kfree_skb(skb);
7808 	return NULL;
7809 }
7810 
7811 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
7812 					   struct wireless_dev *wdev,
7813 					   enum nl80211_commands cmd,
7814 					   enum nl80211_attrs attr,
7815 					   int vendor_event_idx,
7816 					   int approxlen, gfp_t gfp)
7817 {
7818 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
7819 	const struct nl80211_vendor_cmd_info *info;
7820 
7821 	switch (cmd) {
7822 	case NL80211_CMD_TESTMODE:
7823 		if (WARN_ON(vendor_event_idx != -1))
7824 			return NULL;
7825 		info = NULL;
7826 		break;
7827 	case NL80211_CMD_VENDOR:
7828 		if (WARN_ON(vendor_event_idx < 0 ||
7829 			    vendor_event_idx >= wiphy->n_vendor_events))
7830 			return NULL;
7831 		info = &wiphy->vendor_events[vendor_event_idx];
7832 		break;
7833 	default:
7834 		WARN_ON(1);
7835 		return NULL;
7836 	}
7837 
7838 	return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, 0, 0,
7839 					   cmd, attr, info, gfp);
7840 }
7841 EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
7842 
7843 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
7844 {
7845 	struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
7846 	void *hdr = ((void **)skb->cb)[1];
7847 	struct nlattr *data = ((void **)skb->cb)[2];
7848 	enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
7849 
7850 	/* clear CB data for netlink core to own from now on */
7851 	memset(skb->cb, 0, sizeof(skb->cb));
7852 
7853 	nla_nest_end(skb, data);
7854 	genlmsg_end(skb, hdr);
7855 
7856 	if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
7857 		mcgrp = NL80211_MCGRP_VENDOR;
7858 
7859 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0,
7860 				mcgrp, gfp);
7861 }
7862 EXPORT_SYMBOL(__cfg80211_send_event_skb);
7863 
7864 #ifdef CONFIG_NL80211_TESTMODE
7865 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
7866 {
7867 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
7868 	struct wireless_dev *wdev =
7869 		__cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
7870 	int err;
7871 
7872 	if (!rdev->ops->testmode_cmd)
7873 		return -EOPNOTSUPP;
7874 
7875 	if (IS_ERR(wdev)) {
7876 		err = PTR_ERR(wdev);
7877 		if (err != -EINVAL)
7878 			return err;
7879 		wdev = NULL;
7880 	} else if (wdev->wiphy != &rdev->wiphy) {
7881 		return -EINVAL;
7882 	}
7883 
7884 	if (!info->attrs[NL80211_ATTR_TESTDATA])
7885 		return -EINVAL;
7886 
7887 	rdev->cur_cmd_info = info;
7888 	err = rdev_testmode_cmd(rdev, wdev,
7889 				nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
7890 				nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
7891 	rdev->cur_cmd_info = NULL;
7892 
7893 	return err;
7894 }
7895 
7896 static int nl80211_testmode_dump(struct sk_buff *skb,
7897 				 struct netlink_callback *cb)
7898 {
7899 	struct cfg80211_registered_device *rdev;
7900 	int err;
7901 	long phy_idx;
7902 	void *data = NULL;
7903 	int data_len = 0;
7904 
7905 	rtnl_lock();
7906 
7907 	if (cb->args[0]) {
7908 		/*
7909 		 * 0 is a valid index, but not valid for args[0],
7910 		 * so we need to offset by 1.
7911 		 */
7912 		phy_idx = cb->args[0] - 1;
7913 	} else {
7914 		err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
7915 				  nl80211_fam.attrbuf, nl80211_fam.maxattr,
7916 				  nl80211_policy);
7917 		if (err)
7918 			goto out_err;
7919 
7920 		rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk),
7921 						  nl80211_fam.attrbuf);
7922 		if (IS_ERR(rdev)) {
7923 			err = PTR_ERR(rdev);
7924 			goto out_err;
7925 		}
7926 		phy_idx = rdev->wiphy_idx;
7927 		rdev = NULL;
7928 
7929 		if (nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA])
7930 			cb->args[1] =
7931 				(long)nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA];
7932 	}
7933 
7934 	if (cb->args[1]) {
7935 		data = nla_data((void *)cb->args[1]);
7936 		data_len = nla_len((void *)cb->args[1]);
7937 	}
7938 
7939 	rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
7940 	if (!rdev) {
7941 		err = -ENOENT;
7942 		goto out_err;
7943 	}
7944 
7945 	if (!rdev->ops->testmode_dump) {
7946 		err = -EOPNOTSUPP;
7947 		goto out_err;
7948 	}
7949 
7950 	while (1) {
7951 		void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
7952 					   cb->nlh->nlmsg_seq, NLM_F_MULTI,
7953 					   NL80211_CMD_TESTMODE);
7954 		struct nlattr *tmdata;
7955 
7956 		if (!hdr)
7957 			break;
7958 
7959 		if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) {
7960 			genlmsg_cancel(skb, hdr);
7961 			break;
7962 		}
7963 
7964 		tmdata = nla_nest_start(skb, NL80211_ATTR_TESTDATA);
7965 		if (!tmdata) {
7966 			genlmsg_cancel(skb, hdr);
7967 			break;
7968 		}
7969 		err = rdev_testmode_dump(rdev, skb, cb, data, data_len);
7970 		nla_nest_end(skb, tmdata);
7971 
7972 		if (err == -ENOBUFS || err == -ENOENT) {
7973 			genlmsg_cancel(skb, hdr);
7974 			break;
7975 		} else if (err) {
7976 			genlmsg_cancel(skb, hdr);
7977 			goto out_err;
7978 		}
7979 
7980 		genlmsg_end(skb, hdr);
7981 	}
7982 
7983 	err = skb->len;
7984 	/* see above */
7985 	cb->args[0] = phy_idx + 1;
7986  out_err:
7987 	rtnl_unlock();
7988 	return err;
7989 }
7990 #endif
7991 
7992 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
7993 {
7994 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
7995 	struct net_device *dev = info->user_ptr[1];
7996 	struct cfg80211_connect_params connect;
7997 	struct wiphy *wiphy;
7998 	struct cfg80211_cached_keys *connkeys = NULL;
7999 	int err;
8000 
8001 	memset(&connect, 0, sizeof(connect));
8002 
8003 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8004 		return -EINVAL;
8005 
8006 	if (!info->attrs[NL80211_ATTR_SSID] ||
8007 	    !nla_len(info->attrs[NL80211_ATTR_SSID]))
8008 		return -EINVAL;
8009 
8010 	if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
8011 		connect.auth_type =
8012 			nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
8013 		if (!nl80211_valid_auth_type(rdev, connect.auth_type,
8014 					     NL80211_CMD_CONNECT))
8015 			return -EINVAL;
8016 	} else
8017 		connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
8018 
8019 	connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
8020 
8021 	err = nl80211_crypto_settings(rdev, info, &connect.crypto,
8022 				      NL80211_MAX_NR_CIPHER_SUITES);
8023 	if (err)
8024 		return err;
8025 
8026 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8027 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8028 		return -EOPNOTSUPP;
8029 
8030 	wiphy = &rdev->wiphy;
8031 
8032 	connect.bg_scan_period = -1;
8033 	if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] &&
8034 		(wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) {
8035 		connect.bg_scan_period =
8036 			nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]);
8037 	}
8038 
8039 	if (info->attrs[NL80211_ATTR_MAC])
8040 		connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8041 	else if (info->attrs[NL80211_ATTR_MAC_HINT])
8042 		connect.bssid_hint =
8043 			nla_data(info->attrs[NL80211_ATTR_MAC_HINT]);
8044 	connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8045 	connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8046 
8047 	if (info->attrs[NL80211_ATTR_IE]) {
8048 		connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8049 		connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8050 	}
8051 
8052 	if (info->attrs[NL80211_ATTR_USE_MFP]) {
8053 		connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
8054 		if (connect.mfp != NL80211_MFP_REQUIRED &&
8055 		    connect.mfp != NL80211_MFP_NO)
8056 			return -EINVAL;
8057 	} else {
8058 		connect.mfp = NL80211_MFP_NO;
8059 	}
8060 
8061 	if (info->attrs[NL80211_ATTR_PREV_BSSID])
8062 		connect.prev_bssid =
8063 			nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
8064 
8065 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
8066 		connect.channel = nl80211_get_valid_chan(
8067 			wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ]);
8068 		if (!connect.channel)
8069 			return -EINVAL;
8070 	} else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) {
8071 		connect.channel_hint = nl80211_get_valid_chan(
8072 			wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]);
8073 		if (!connect.channel_hint)
8074 			return -EINVAL;
8075 	}
8076 
8077 	if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
8078 		connkeys = nl80211_parse_connkeys(rdev,
8079 					  info->attrs[NL80211_ATTR_KEYS], NULL);
8080 		if (IS_ERR(connkeys))
8081 			return PTR_ERR(connkeys);
8082 	}
8083 
8084 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
8085 		connect.flags |= ASSOC_REQ_DISABLE_HT;
8086 
8087 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8088 		memcpy(&connect.ht_capa_mask,
8089 		       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
8090 		       sizeof(connect.ht_capa_mask));
8091 
8092 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
8093 		if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
8094 			kzfree(connkeys);
8095 			return -EINVAL;
8096 		}
8097 		memcpy(&connect.ht_capa,
8098 		       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
8099 		       sizeof(connect.ht_capa));
8100 	}
8101 
8102 	if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
8103 		connect.flags |= ASSOC_REQ_DISABLE_VHT;
8104 
8105 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
8106 		memcpy(&connect.vht_capa_mask,
8107 		       nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
8108 		       sizeof(connect.vht_capa_mask));
8109 
8110 	if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
8111 		if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
8112 			kzfree(connkeys);
8113 			return -EINVAL;
8114 		}
8115 		memcpy(&connect.vht_capa,
8116 		       nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
8117 		       sizeof(connect.vht_capa));
8118 	}
8119 
8120 	if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
8121 		if (!((rdev->wiphy.features &
8122 			NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
8123 		       (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
8124 		    !wiphy_ext_feature_isset(&rdev->wiphy,
8125 					     NL80211_EXT_FEATURE_RRM)) {
8126 			kzfree(connkeys);
8127 			return -EINVAL;
8128 		}
8129 		connect.flags |= ASSOC_REQ_USE_RRM;
8130 	}
8131 
8132 	connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
8133 	if (connect.pbss && !rdev->wiphy.bands[IEEE80211_BAND_60GHZ]) {
8134 		kzfree(connkeys);
8135 		return -EOPNOTSUPP;
8136 	}
8137 
8138 	if (info->attrs[NL80211_ATTR_BSS_SELECT]) {
8139 		/* bss selection makes no sense if bssid is set */
8140 		if (connect.bssid) {
8141 			kzfree(connkeys);
8142 			return -EINVAL;
8143 		}
8144 
8145 		err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT],
8146 				       wiphy, &connect.bss_select);
8147 		if (err) {
8148 			kzfree(connkeys);
8149 			return err;
8150 		}
8151 	}
8152 
8153 	wdev_lock(dev->ieee80211_ptr);
8154 	err = cfg80211_connect(rdev, dev, &connect, connkeys, NULL);
8155 	wdev_unlock(dev->ieee80211_ptr);
8156 	if (err)
8157 		kzfree(connkeys);
8158 	return err;
8159 }
8160 
8161 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
8162 {
8163 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8164 	struct net_device *dev = info->user_ptr[1];
8165 	u16 reason;
8166 	int ret;
8167 
8168 	if (!info->attrs[NL80211_ATTR_REASON_CODE])
8169 		reason = WLAN_REASON_DEAUTH_LEAVING;
8170 	else
8171 		reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
8172 
8173 	if (reason == 0)
8174 		return -EINVAL;
8175 
8176 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8177 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8178 		return -EOPNOTSUPP;
8179 
8180 	wdev_lock(dev->ieee80211_ptr);
8181 	ret = cfg80211_disconnect(rdev, dev, reason, true);
8182 	wdev_unlock(dev->ieee80211_ptr);
8183 	return ret;
8184 }
8185 
8186 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
8187 {
8188 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8189 	struct net *net;
8190 	int err;
8191 
8192 	if (info->attrs[NL80211_ATTR_PID]) {
8193 		u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
8194 
8195 		net = get_net_ns_by_pid(pid);
8196 	} else if (info->attrs[NL80211_ATTR_NETNS_FD]) {
8197 		u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]);
8198 
8199 		net = get_net_ns_by_fd(fd);
8200 	} else {
8201 		return -EINVAL;
8202 	}
8203 
8204 	if (IS_ERR(net))
8205 		return PTR_ERR(net);
8206 
8207 	err = 0;
8208 
8209 	/* check if anything to do */
8210 	if (!net_eq(wiphy_net(&rdev->wiphy), net))
8211 		err = cfg80211_switch_netns(rdev, net);
8212 
8213 	put_net(net);
8214 	return err;
8215 }
8216 
8217 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
8218 {
8219 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8220 	int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev,
8221 			struct cfg80211_pmksa *pmksa) = NULL;
8222 	struct net_device *dev = info->user_ptr[1];
8223 	struct cfg80211_pmksa pmksa;
8224 
8225 	memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
8226 
8227 	if (!info->attrs[NL80211_ATTR_MAC])
8228 		return -EINVAL;
8229 
8230 	if (!info->attrs[NL80211_ATTR_PMKID])
8231 		return -EINVAL;
8232 
8233 	pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
8234 	pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8235 
8236 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8237 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8238 		return -EOPNOTSUPP;
8239 
8240 	switch (info->genlhdr->cmd) {
8241 	case NL80211_CMD_SET_PMKSA:
8242 		rdev_ops = rdev->ops->set_pmksa;
8243 		break;
8244 	case NL80211_CMD_DEL_PMKSA:
8245 		rdev_ops = rdev->ops->del_pmksa;
8246 		break;
8247 	default:
8248 		WARN_ON(1);
8249 		break;
8250 	}
8251 
8252 	if (!rdev_ops)
8253 		return -EOPNOTSUPP;
8254 
8255 	return rdev_ops(&rdev->wiphy, dev, &pmksa);
8256 }
8257 
8258 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
8259 {
8260 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8261 	struct net_device *dev = info->user_ptr[1];
8262 
8263 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8264 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8265 		return -EOPNOTSUPP;
8266 
8267 	if (!rdev->ops->flush_pmksa)
8268 		return -EOPNOTSUPP;
8269 
8270 	return rdev_flush_pmksa(rdev, dev);
8271 }
8272 
8273 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
8274 {
8275 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8276 	struct net_device *dev = info->user_ptr[1];
8277 	u8 action_code, dialog_token;
8278 	u32 peer_capability = 0;
8279 	u16 status_code;
8280 	u8 *peer;
8281 	bool initiator;
8282 
8283 	if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
8284 	    !rdev->ops->tdls_mgmt)
8285 		return -EOPNOTSUPP;
8286 
8287 	if (!info->attrs[NL80211_ATTR_TDLS_ACTION] ||
8288 	    !info->attrs[NL80211_ATTR_STATUS_CODE] ||
8289 	    !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] ||
8290 	    !info->attrs[NL80211_ATTR_IE] ||
8291 	    !info->attrs[NL80211_ATTR_MAC])
8292 		return -EINVAL;
8293 
8294 	peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
8295 	action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
8296 	status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
8297 	dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
8298 	initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]);
8299 	if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
8300 		peer_capability =
8301 			nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
8302 
8303 	return rdev_tdls_mgmt(rdev, dev, peer, action_code,
8304 			      dialog_token, status_code, peer_capability,
8305 			      initiator,
8306 			      nla_data(info->attrs[NL80211_ATTR_IE]),
8307 			      nla_len(info->attrs[NL80211_ATTR_IE]));
8308 }
8309 
8310 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info)
8311 {
8312 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8313 	struct net_device *dev = info->user_ptr[1];
8314 	enum nl80211_tdls_operation operation;
8315 	u8 *peer;
8316 
8317 	if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
8318 	    !rdev->ops->tdls_oper)
8319 		return -EOPNOTSUPP;
8320 
8321 	if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] ||
8322 	    !info->attrs[NL80211_ATTR_MAC])
8323 		return -EINVAL;
8324 
8325 	operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]);
8326 	peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
8327 
8328 	return rdev_tdls_oper(rdev, dev, peer, operation);
8329 }
8330 
8331 static int nl80211_remain_on_channel(struct sk_buff *skb,
8332 				     struct genl_info *info)
8333 {
8334 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8335 	struct wireless_dev *wdev = info->user_ptr[1];
8336 	struct cfg80211_chan_def chandef;
8337 	struct sk_buff *msg;
8338 	void *hdr;
8339 	u64 cookie;
8340 	u32 duration;
8341 	int err;
8342 
8343 	if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
8344 	    !info->attrs[NL80211_ATTR_DURATION])
8345 		return -EINVAL;
8346 
8347 	duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
8348 
8349 	if (!rdev->ops->remain_on_channel ||
8350 	    !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL))
8351 		return -EOPNOTSUPP;
8352 
8353 	/*
8354 	 * We should be on that channel for at least a minimum amount of
8355 	 * time (10ms) but no longer than the driver supports.
8356 	 */
8357 	if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
8358 	    duration > rdev->wiphy.max_remain_on_channel_duration)
8359 		return -EINVAL;
8360 
8361 	err = nl80211_parse_chandef(rdev, info, &chandef);
8362 	if (err)
8363 		return err;
8364 
8365 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
8366 	if (!msg)
8367 		return -ENOMEM;
8368 
8369 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8370 			     NL80211_CMD_REMAIN_ON_CHANNEL);
8371 	if (!hdr) {
8372 		err = -ENOBUFS;
8373 		goto free_msg;
8374 	}
8375 
8376 	err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
8377 				     duration, &cookie);
8378 
8379 	if (err)
8380 		goto free_msg;
8381 
8382 	if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
8383 		goto nla_put_failure;
8384 
8385 	genlmsg_end(msg, hdr);
8386 
8387 	return genlmsg_reply(msg, info);
8388 
8389  nla_put_failure:
8390 	err = -ENOBUFS;
8391  free_msg:
8392 	nlmsg_free(msg);
8393 	return err;
8394 }
8395 
8396 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
8397 					    struct genl_info *info)
8398 {
8399 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8400 	struct wireless_dev *wdev = info->user_ptr[1];
8401 	u64 cookie;
8402 
8403 	if (!info->attrs[NL80211_ATTR_COOKIE])
8404 		return -EINVAL;
8405 
8406 	if (!rdev->ops->cancel_remain_on_channel)
8407 		return -EOPNOTSUPP;
8408 
8409 	cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
8410 
8411 	return rdev_cancel_remain_on_channel(rdev, wdev, cookie);
8412 }
8413 
8414 static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
8415 			   u8 *rates, u8 rates_len)
8416 {
8417 	u8 i;
8418 	u32 mask = 0;
8419 
8420 	for (i = 0; i < rates_len; i++) {
8421 		int rate = (rates[i] & 0x7f) * 5;
8422 		int ridx;
8423 		for (ridx = 0; ridx < sband->n_bitrates; ridx++) {
8424 			struct ieee80211_rate *srate =
8425 				&sband->bitrates[ridx];
8426 			if (rate == srate->bitrate) {
8427 				mask |= 1 << ridx;
8428 				break;
8429 			}
8430 		}
8431 		if (ridx == sband->n_bitrates)
8432 			return 0; /* rate not found */
8433 	}
8434 
8435 	return mask;
8436 }
8437 
8438 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband,
8439 			       u8 *rates, u8 rates_len,
8440 			       u8 mcs[IEEE80211_HT_MCS_MASK_LEN])
8441 {
8442 	u8 i;
8443 
8444 	memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN);
8445 
8446 	for (i = 0; i < rates_len; i++) {
8447 		int ridx, rbit;
8448 
8449 		ridx = rates[i] / 8;
8450 		rbit = BIT(rates[i] % 8);
8451 
8452 		/* check validity */
8453 		if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN))
8454 			return false;
8455 
8456 		/* check availability */
8457 		if (sband->ht_cap.mcs.rx_mask[ridx] & rbit)
8458 			mcs[ridx] |= rbit;
8459 		else
8460 			return false;
8461 	}
8462 
8463 	return true;
8464 }
8465 
8466 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map)
8467 {
8468 	u16 mcs_mask = 0;
8469 
8470 	switch (vht_mcs_map) {
8471 	case IEEE80211_VHT_MCS_NOT_SUPPORTED:
8472 		break;
8473 	case IEEE80211_VHT_MCS_SUPPORT_0_7:
8474 		mcs_mask = 0x00FF;
8475 		break;
8476 	case IEEE80211_VHT_MCS_SUPPORT_0_8:
8477 		mcs_mask = 0x01FF;
8478 		break;
8479 	case IEEE80211_VHT_MCS_SUPPORT_0_9:
8480 		mcs_mask = 0x03FF;
8481 		break;
8482 	default:
8483 		break;
8484 	}
8485 
8486 	return mcs_mask;
8487 }
8488 
8489 static void vht_build_mcs_mask(u16 vht_mcs_map,
8490 			       u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
8491 {
8492 	u8 nss;
8493 
8494 	for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
8495 		vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03);
8496 		vht_mcs_map >>= 2;
8497 	}
8498 }
8499 
8500 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband,
8501 			     struct nl80211_txrate_vht *txrate,
8502 			     u16 mcs[NL80211_VHT_NSS_MAX])
8503 {
8504 	u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
8505 	u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {};
8506 	u8 i;
8507 
8508 	if (!sband->vht_cap.vht_supported)
8509 		return false;
8510 
8511 	memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX);
8512 
8513 	/* Build vht_mcs_mask from VHT capabilities */
8514 	vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask);
8515 
8516 	for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
8517 		if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
8518 			mcs[i] = txrate->mcs[i];
8519 		else
8520 			return false;
8521 	}
8522 
8523 	return true;
8524 }
8525 
8526 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
8527 	[NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY,
8528 				    .len = NL80211_MAX_SUPP_RATES },
8529 	[NL80211_TXRATE_HT] = { .type = NLA_BINARY,
8530 				.len = NL80211_MAX_SUPP_HT_RATES },
8531 	[NL80211_TXRATE_VHT] = { .len = sizeof(struct nl80211_txrate_vht)},
8532 	[NL80211_TXRATE_GI] = { .type = NLA_U8 },
8533 };
8534 
8535 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
8536 				       struct genl_info *info)
8537 {
8538 	struct nlattr *tb[NL80211_TXRATE_MAX + 1];
8539 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8540 	struct cfg80211_bitrate_mask mask;
8541 	int rem, i;
8542 	struct net_device *dev = info->user_ptr[1];
8543 	struct nlattr *tx_rates;
8544 	struct ieee80211_supported_band *sband;
8545 	u16 vht_tx_mcs_map;
8546 
8547 	if (!rdev->ops->set_bitrate_mask)
8548 		return -EOPNOTSUPP;
8549 
8550 	memset(&mask, 0, sizeof(mask));
8551 	/* Default to all rates enabled */
8552 	for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
8553 		sband = rdev->wiphy.bands[i];
8554 
8555 		if (!sband)
8556 			continue;
8557 
8558 		mask.control[i].legacy = (1 << sband->n_bitrates) - 1;
8559 		memcpy(mask.control[i].ht_mcs,
8560 		       sband->ht_cap.mcs.rx_mask,
8561 		       sizeof(mask.control[i].ht_mcs));
8562 
8563 		if (!sband->vht_cap.vht_supported)
8564 			continue;
8565 
8566 		vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
8567 		vht_build_mcs_mask(vht_tx_mcs_map, mask.control[i].vht_mcs);
8568 	}
8569 
8570 	/* if no rates are given set it back to the defaults */
8571 	if (!info->attrs[NL80211_ATTR_TX_RATES])
8572 		goto out;
8573 
8574 	/*
8575 	 * The nested attribute uses enum nl80211_band as the index. This maps
8576 	 * directly to the enum ieee80211_band values used in cfg80211.
8577 	 */
8578 	BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
8579 	nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem) {
8580 		enum ieee80211_band band = nla_type(tx_rates);
8581 		int err;
8582 
8583 		if (band < 0 || band >= IEEE80211_NUM_BANDS)
8584 			return -EINVAL;
8585 		sband = rdev->wiphy.bands[band];
8586 		if (sband == NULL)
8587 			return -EINVAL;
8588 		err = nla_parse(tb, NL80211_TXRATE_MAX, nla_data(tx_rates),
8589 				nla_len(tx_rates), nl80211_txattr_policy);
8590 		if (err)
8591 			return err;
8592 		if (tb[NL80211_TXRATE_LEGACY]) {
8593 			mask.control[band].legacy = rateset_to_mask(
8594 				sband,
8595 				nla_data(tb[NL80211_TXRATE_LEGACY]),
8596 				nla_len(tb[NL80211_TXRATE_LEGACY]));
8597 			if ((mask.control[band].legacy == 0) &&
8598 			    nla_len(tb[NL80211_TXRATE_LEGACY]))
8599 				return -EINVAL;
8600 		}
8601 		if (tb[NL80211_TXRATE_HT]) {
8602 			if (!ht_rateset_to_mask(
8603 					sband,
8604 					nla_data(tb[NL80211_TXRATE_HT]),
8605 					nla_len(tb[NL80211_TXRATE_HT]),
8606 					mask.control[band].ht_mcs))
8607 				return -EINVAL;
8608 		}
8609 		if (tb[NL80211_TXRATE_VHT]) {
8610 			if (!vht_set_mcs_mask(
8611 					sband,
8612 					nla_data(tb[NL80211_TXRATE_VHT]),
8613 					mask.control[band].vht_mcs))
8614 				return -EINVAL;
8615 		}
8616 		if (tb[NL80211_TXRATE_GI]) {
8617 			mask.control[band].gi =
8618 				nla_get_u8(tb[NL80211_TXRATE_GI]);
8619 			if (mask.control[band].gi > NL80211_TXRATE_FORCE_LGI)
8620 				return -EINVAL;
8621 		}
8622 
8623 		if (mask.control[band].legacy == 0) {
8624 			/* don't allow empty legacy rates if HT or VHT
8625 			 * are not even supported.
8626 			 */
8627 			if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported ||
8628 			      rdev->wiphy.bands[band]->vht_cap.vht_supported))
8629 				return -EINVAL;
8630 
8631 			for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
8632 				if (mask.control[band].ht_mcs[i])
8633 					goto out;
8634 
8635 			for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
8636 				if (mask.control[band].vht_mcs[i])
8637 					goto out;
8638 
8639 			/* legacy and mcs rates may not be both empty */
8640 			return -EINVAL;
8641 		}
8642 	}
8643 
8644 out:
8645 	return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
8646 }
8647 
8648 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
8649 {
8650 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8651 	struct wireless_dev *wdev = info->user_ptr[1];
8652 	u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
8653 
8654 	if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
8655 		return -EINVAL;
8656 
8657 	if (info->attrs[NL80211_ATTR_FRAME_TYPE])
8658 		frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
8659 
8660 	switch (wdev->iftype) {
8661 	case NL80211_IFTYPE_STATION:
8662 	case NL80211_IFTYPE_ADHOC:
8663 	case NL80211_IFTYPE_P2P_CLIENT:
8664 	case NL80211_IFTYPE_AP:
8665 	case NL80211_IFTYPE_AP_VLAN:
8666 	case NL80211_IFTYPE_MESH_POINT:
8667 	case NL80211_IFTYPE_P2P_GO:
8668 	case NL80211_IFTYPE_P2P_DEVICE:
8669 		break;
8670 	default:
8671 		return -EOPNOTSUPP;
8672 	}
8673 
8674 	/* not much point in registering if we can't reply */
8675 	if (!rdev->ops->mgmt_tx)
8676 		return -EOPNOTSUPP;
8677 
8678 	return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type,
8679 			nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
8680 			nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]));
8681 }
8682 
8683 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
8684 {
8685 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8686 	struct wireless_dev *wdev = info->user_ptr[1];
8687 	struct cfg80211_chan_def chandef;
8688 	int err;
8689 	void *hdr = NULL;
8690 	u64 cookie;
8691 	struct sk_buff *msg = NULL;
8692 	struct cfg80211_mgmt_tx_params params = {
8693 		.dont_wait_for_ack =
8694 			info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK],
8695 	};
8696 
8697 	if (!info->attrs[NL80211_ATTR_FRAME])
8698 		return -EINVAL;
8699 
8700 	if (!rdev->ops->mgmt_tx)
8701 		return -EOPNOTSUPP;
8702 
8703 	switch (wdev->iftype) {
8704 	case NL80211_IFTYPE_P2P_DEVICE:
8705 		if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
8706 			return -EINVAL;
8707 	case NL80211_IFTYPE_STATION:
8708 	case NL80211_IFTYPE_ADHOC:
8709 	case NL80211_IFTYPE_P2P_CLIENT:
8710 	case NL80211_IFTYPE_AP:
8711 	case NL80211_IFTYPE_AP_VLAN:
8712 	case NL80211_IFTYPE_MESH_POINT:
8713 	case NL80211_IFTYPE_P2P_GO:
8714 		break;
8715 	default:
8716 		return -EOPNOTSUPP;
8717 	}
8718 
8719 	if (info->attrs[NL80211_ATTR_DURATION]) {
8720 		if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
8721 			return -EINVAL;
8722 		params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
8723 
8724 		/*
8725 		 * We should wait on the channel for at least a minimum amount
8726 		 * of time (10ms) but no longer than the driver supports.
8727 		 */
8728 		if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
8729 		    params.wait > rdev->wiphy.max_remain_on_channel_duration)
8730 			return -EINVAL;
8731 
8732 	}
8733 
8734 	params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
8735 
8736 	if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
8737 		return -EINVAL;
8738 
8739 	params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
8740 
8741 	/* get the channel if any has been specified, otherwise pass NULL to
8742 	 * the driver. The latter will use the current one
8743 	 */
8744 	chandef.chan = NULL;
8745 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
8746 		err = nl80211_parse_chandef(rdev, info, &chandef);
8747 		if (err)
8748 			return err;
8749 	}
8750 
8751 	if (!chandef.chan && params.offchan)
8752 		return -EINVAL;
8753 
8754 	params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
8755 	params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
8756 
8757 	if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) {
8758 		int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
8759 		int i;
8760 
8761 		if (len % sizeof(u16))
8762 			return -EINVAL;
8763 
8764 		params.n_csa_offsets = len / sizeof(u16);
8765 		params.csa_offsets =
8766 			nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
8767 
8768 		/* check that all the offsets fit the frame */
8769 		for (i = 0; i < params.n_csa_offsets; i++) {
8770 			if (params.csa_offsets[i] >= params.len)
8771 				return -EINVAL;
8772 		}
8773 	}
8774 
8775 	if (!params.dont_wait_for_ack) {
8776 		msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
8777 		if (!msg)
8778 			return -ENOMEM;
8779 
8780 		hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8781 				     NL80211_CMD_FRAME);
8782 		if (!hdr) {
8783 			err = -ENOBUFS;
8784 			goto free_msg;
8785 		}
8786 	}
8787 
8788 	params.chan = chandef.chan;
8789 	err = cfg80211_mlme_mgmt_tx(rdev, wdev, &params, &cookie);
8790 	if (err)
8791 		goto free_msg;
8792 
8793 	if (msg) {
8794 		if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
8795 			goto nla_put_failure;
8796 
8797 		genlmsg_end(msg, hdr);
8798 		return genlmsg_reply(msg, info);
8799 	}
8800 
8801 	return 0;
8802 
8803  nla_put_failure:
8804 	err = -ENOBUFS;
8805  free_msg:
8806 	nlmsg_free(msg);
8807 	return err;
8808 }
8809 
8810 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
8811 {
8812 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8813 	struct wireless_dev *wdev = info->user_ptr[1];
8814 	u64 cookie;
8815 
8816 	if (!info->attrs[NL80211_ATTR_COOKIE])
8817 		return -EINVAL;
8818 
8819 	if (!rdev->ops->mgmt_tx_cancel_wait)
8820 		return -EOPNOTSUPP;
8821 
8822 	switch (wdev->iftype) {
8823 	case NL80211_IFTYPE_STATION:
8824 	case NL80211_IFTYPE_ADHOC:
8825 	case NL80211_IFTYPE_P2P_CLIENT:
8826 	case NL80211_IFTYPE_AP:
8827 	case NL80211_IFTYPE_AP_VLAN:
8828 	case NL80211_IFTYPE_P2P_GO:
8829 	case NL80211_IFTYPE_P2P_DEVICE:
8830 		break;
8831 	default:
8832 		return -EOPNOTSUPP;
8833 	}
8834 
8835 	cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
8836 
8837 	return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie);
8838 }
8839 
8840 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
8841 {
8842 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8843 	struct wireless_dev *wdev;
8844 	struct net_device *dev = info->user_ptr[1];
8845 	u8 ps_state;
8846 	bool state;
8847 	int err;
8848 
8849 	if (!info->attrs[NL80211_ATTR_PS_STATE])
8850 		return -EINVAL;
8851 
8852 	ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
8853 
8854 	if (ps_state != NL80211_PS_DISABLED && ps_state != NL80211_PS_ENABLED)
8855 		return -EINVAL;
8856 
8857 	wdev = dev->ieee80211_ptr;
8858 
8859 	if (!rdev->ops->set_power_mgmt)
8860 		return -EOPNOTSUPP;
8861 
8862 	state = (ps_state == NL80211_PS_ENABLED) ? true : false;
8863 
8864 	if (state == wdev->ps)
8865 		return 0;
8866 
8867 	err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout);
8868 	if (!err)
8869 		wdev->ps = state;
8870 	return err;
8871 }
8872 
8873 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
8874 {
8875 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8876 	enum nl80211_ps_state ps_state;
8877 	struct wireless_dev *wdev;
8878 	struct net_device *dev = info->user_ptr[1];
8879 	struct sk_buff *msg;
8880 	void *hdr;
8881 	int err;
8882 
8883 	wdev = dev->ieee80211_ptr;
8884 
8885 	if (!rdev->ops->set_power_mgmt)
8886 		return -EOPNOTSUPP;
8887 
8888 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
8889 	if (!msg)
8890 		return -ENOMEM;
8891 
8892 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8893 			     NL80211_CMD_GET_POWER_SAVE);
8894 	if (!hdr) {
8895 		err = -ENOBUFS;
8896 		goto free_msg;
8897 	}
8898 
8899 	if (wdev->ps)
8900 		ps_state = NL80211_PS_ENABLED;
8901 	else
8902 		ps_state = NL80211_PS_DISABLED;
8903 
8904 	if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state))
8905 		goto nla_put_failure;
8906 
8907 	genlmsg_end(msg, hdr);
8908 	return genlmsg_reply(msg, info);
8909 
8910  nla_put_failure:
8911 	err = -ENOBUFS;
8912  free_msg:
8913 	nlmsg_free(msg);
8914 	return err;
8915 }
8916 
8917 static const struct nla_policy
8918 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
8919 	[NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_U32 },
8920 	[NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 },
8921 	[NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
8922 	[NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
8923 	[NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
8924 	[NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
8925 };
8926 
8927 static int nl80211_set_cqm_txe(struct genl_info *info,
8928 			       u32 rate, u32 pkts, u32 intvl)
8929 {
8930 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8931 	struct net_device *dev = info->user_ptr[1];
8932 	struct wireless_dev *wdev = dev->ieee80211_ptr;
8933 
8934 	if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL)
8935 		return -EINVAL;
8936 
8937 	if (!rdev->ops->set_cqm_txe_config)
8938 		return -EOPNOTSUPP;
8939 
8940 	if (wdev->iftype != NL80211_IFTYPE_STATION &&
8941 	    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
8942 		return -EOPNOTSUPP;
8943 
8944 	return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl);
8945 }
8946 
8947 static int nl80211_set_cqm_rssi(struct genl_info *info,
8948 				s32 threshold, u32 hysteresis)
8949 {
8950 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
8951 	struct net_device *dev = info->user_ptr[1];
8952 	struct wireless_dev *wdev = dev->ieee80211_ptr;
8953 
8954 	if (threshold > 0)
8955 		return -EINVAL;
8956 
8957 	/* disabling - hysteresis should also be zero then */
8958 	if (threshold == 0)
8959 		hysteresis = 0;
8960 
8961 	if (!rdev->ops->set_cqm_rssi_config)
8962 		return -EOPNOTSUPP;
8963 
8964 	if (wdev->iftype != NL80211_IFTYPE_STATION &&
8965 	    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
8966 		return -EOPNOTSUPP;
8967 
8968 	return rdev_set_cqm_rssi_config(rdev, dev, threshold, hysteresis);
8969 }
8970 
8971 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
8972 {
8973 	struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1];
8974 	struct nlattr *cqm;
8975 	int err;
8976 
8977 	cqm = info->attrs[NL80211_ATTR_CQM];
8978 	if (!cqm)
8979 		return -EINVAL;
8980 
8981 	err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm,
8982 			       nl80211_attr_cqm_policy);
8983 	if (err)
8984 		return err;
8985 
8986 	if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
8987 	    attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
8988 		s32 threshold = nla_get_s32(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
8989 		u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
8990 
8991 		return nl80211_set_cqm_rssi(info, threshold, hysteresis);
8992 	}
8993 
8994 	if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
8995 	    attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
8996 	    attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
8997 		u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
8998 		u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
8999 		u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
9000 
9001 		return nl80211_set_cqm_txe(info, rate, pkts, intvl);
9002 	}
9003 
9004 	return -EINVAL;
9005 }
9006 
9007 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info)
9008 {
9009 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9010 	struct net_device *dev = info->user_ptr[1];
9011 	struct ocb_setup setup = {};
9012 	int err;
9013 
9014 	err = nl80211_parse_chandef(rdev, info, &setup.chandef);
9015 	if (err)
9016 		return err;
9017 
9018 	return cfg80211_join_ocb(rdev, dev, &setup);
9019 }
9020 
9021 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info)
9022 {
9023 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9024 	struct net_device *dev = info->user_ptr[1];
9025 
9026 	return cfg80211_leave_ocb(rdev, dev);
9027 }
9028 
9029 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
9030 {
9031 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9032 	struct net_device *dev = info->user_ptr[1];
9033 	struct mesh_config cfg;
9034 	struct mesh_setup setup;
9035 	int err;
9036 
9037 	/* start with default */
9038 	memcpy(&cfg, &default_mesh_config, sizeof(cfg));
9039 	memcpy(&setup, &default_mesh_setup, sizeof(setup));
9040 
9041 	if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
9042 		/* and parse parameters if given */
9043 		err = nl80211_parse_mesh_config(info, &cfg, NULL);
9044 		if (err)
9045 			return err;
9046 	}
9047 
9048 	if (!info->attrs[NL80211_ATTR_MESH_ID] ||
9049 	    !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
9050 		return -EINVAL;
9051 
9052 	setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
9053 	setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
9054 
9055 	if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
9056 	    !nl80211_parse_mcast_rate(rdev, setup.mcast_rate,
9057 			    nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
9058 			return -EINVAL;
9059 
9060 	if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
9061 		setup.beacon_interval =
9062 			nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
9063 		if (setup.beacon_interval < 10 ||
9064 		    setup.beacon_interval > 10000)
9065 			return -EINVAL;
9066 	}
9067 
9068 	if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
9069 		setup.dtim_period =
9070 			nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
9071 		if (setup.dtim_period < 1 || setup.dtim_period > 100)
9072 			return -EINVAL;
9073 	}
9074 
9075 	if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
9076 		/* parse additional setup parameters if given */
9077 		err = nl80211_parse_mesh_setup(info, &setup);
9078 		if (err)
9079 			return err;
9080 	}
9081 
9082 	if (setup.user_mpm)
9083 		cfg.auto_open_plinks = false;
9084 
9085 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
9086 		err = nl80211_parse_chandef(rdev, info, &setup.chandef);
9087 		if (err)
9088 			return err;
9089 	} else {
9090 		/* cfg80211_join_mesh() will sort it out */
9091 		setup.chandef.chan = NULL;
9092 	}
9093 
9094 	if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
9095 		u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
9096 		int n_rates =
9097 			nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
9098 		struct ieee80211_supported_band *sband;
9099 
9100 		if (!setup.chandef.chan)
9101 			return -EINVAL;
9102 
9103 		sband = rdev->wiphy.bands[setup.chandef.chan->band];
9104 
9105 		err = ieee80211_get_ratemask(sband, rates, n_rates,
9106 					     &setup.basic_rates);
9107 		if (err)
9108 			return err;
9109 	}
9110 
9111 	return cfg80211_join_mesh(rdev, dev, &setup, &cfg);
9112 }
9113 
9114 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
9115 {
9116 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9117 	struct net_device *dev = info->user_ptr[1];
9118 
9119 	return cfg80211_leave_mesh(rdev, dev);
9120 }
9121 
9122 #ifdef CONFIG_PM
9123 static int nl80211_send_wowlan_patterns(struct sk_buff *msg,
9124 					struct cfg80211_registered_device *rdev)
9125 {
9126 	struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config;
9127 	struct nlattr *nl_pats, *nl_pat;
9128 	int i, pat_len;
9129 
9130 	if (!wowlan->n_patterns)
9131 		return 0;
9132 
9133 	nl_pats = nla_nest_start(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN);
9134 	if (!nl_pats)
9135 		return -ENOBUFS;
9136 
9137 	for (i = 0; i < wowlan->n_patterns; i++) {
9138 		nl_pat = nla_nest_start(msg, i + 1);
9139 		if (!nl_pat)
9140 			return -ENOBUFS;
9141 		pat_len = wowlan->patterns[i].pattern_len;
9142 		if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8),
9143 			    wowlan->patterns[i].mask) ||
9144 		    nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
9145 			    wowlan->patterns[i].pattern) ||
9146 		    nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
9147 				wowlan->patterns[i].pkt_offset))
9148 			return -ENOBUFS;
9149 		nla_nest_end(msg, nl_pat);
9150 	}
9151 	nla_nest_end(msg, nl_pats);
9152 
9153 	return 0;
9154 }
9155 
9156 static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
9157 				   struct cfg80211_wowlan_tcp *tcp)
9158 {
9159 	struct nlattr *nl_tcp;
9160 
9161 	if (!tcp)
9162 		return 0;
9163 
9164 	nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
9165 	if (!nl_tcp)
9166 		return -ENOBUFS;
9167 
9168 	if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) ||
9169 	    nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) ||
9170 	    nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) ||
9171 	    nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) ||
9172 	    nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) ||
9173 	    nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
9174 		    tcp->payload_len, tcp->payload) ||
9175 	    nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
9176 			tcp->data_interval) ||
9177 	    nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
9178 		    tcp->wake_len, tcp->wake_data) ||
9179 	    nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK,
9180 		    DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask))
9181 		return -ENOBUFS;
9182 
9183 	if (tcp->payload_seq.len &&
9184 	    nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
9185 		    sizeof(tcp->payload_seq), &tcp->payload_seq))
9186 		return -ENOBUFS;
9187 
9188 	if (tcp->payload_tok.len &&
9189 	    nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
9190 		    sizeof(tcp->payload_tok) + tcp->tokens_size,
9191 		    &tcp->payload_tok))
9192 		return -ENOBUFS;
9193 
9194 	nla_nest_end(msg, nl_tcp);
9195 
9196 	return 0;
9197 }
9198 
9199 static int nl80211_send_wowlan_nd(struct sk_buff *msg,
9200 				  struct cfg80211_sched_scan_request *req)
9201 {
9202 	struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan;
9203 	int i;
9204 
9205 	if (!req)
9206 		return 0;
9207 
9208 	nd = nla_nest_start(msg, NL80211_WOWLAN_TRIG_NET_DETECT);
9209 	if (!nd)
9210 		return -ENOBUFS;
9211 
9212 	if (req->n_scan_plans == 1 &&
9213 	    nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL,
9214 			req->scan_plans[0].interval * 1000))
9215 		return -ENOBUFS;
9216 
9217 	if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay))
9218 		return -ENOBUFS;
9219 
9220 	freqs = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
9221 	if (!freqs)
9222 		return -ENOBUFS;
9223 
9224 	for (i = 0; i < req->n_channels; i++)
9225 		nla_put_u32(msg, i, req->channels[i]->center_freq);
9226 
9227 	nla_nest_end(msg, freqs);
9228 
9229 	if (req->n_match_sets) {
9230 		matches = nla_nest_start(msg, NL80211_ATTR_SCHED_SCAN_MATCH);
9231 		for (i = 0; i < req->n_match_sets; i++) {
9232 			match = nla_nest_start(msg, i);
9233 			nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
9234 				req->match_sets[i].ssid.ssid_len,
9235 				req->match_sets[i].ssid.ssid);
9236 			nla_nest_end(msg, match);
9237 		}
9238 		nla_nest_end(msg, matches);
9239 	}
9240 
9241 	scan_plans = nla_nest_start(msg, NL80211_ATTR_SCHED_SCAN_PLANS);
9242 	if (!scan_plans)
9243 		return -ENOBUFS;
9244 
9245 	for (i = 0; i < req->n_scan_plans; i++) {
9246 		scan_plan = nla_nest_start(msg, i + 1);
9247 		if (!scan_plan ||
9248 		    nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL,
9249 				req->scan_plans[i].interval) ||
9250 		    (req->scan_plans[i].iterations &&
9251 		     nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS,
9252 				 req->scan_plans[i].iterations)))
9253 			return -ENOBUFS;
9254 		nla_nest_end(msg, scan_plan);
9255 	}
9256 	nla_nest_end(msg, scan_plans);
9257 
9258 	nla_nest_end(msg, nd);
9259 
9260 	return 0;
9261 }
9262 
9263 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
9264 {
9265 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9266 	struct sk_buff *msg;
9267 	void *hdr;
9268 	u32 size = NLMSG_DEFAULT_SIZE;
9269 
9270 	if (!rdev->wiphy.wowlan)
9271 		return -EOPNOTSUPP;
9272 
9273 	if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) {
9274 		/* adjust size to have room for all the data */
9275 		size += rdev->wiphy.wowlan_config->tcp->tokens_size +
9276 			rdev->wiphy.wowlan_config->tcp->payload_len +
9277 			rdev->wiphy.wowlan_config->tcp->wake_len +
9278 			rdev->wiphy.wowlan_config->tcp->wake_len / 8;
9279 	}
9280 
9281 	msg = nlmsg_new(size, GFP_KERNEL);
9282 	if (!msg)
9283 		return -ENOMEM;
9284 
9285 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
9286 			     NL80211_CMD_GET_WOWLAN);
9287 	if (!hdr)
9288 		goto nla_put_failure;
9289 
9290 	if (rdev->wiphy.wowlan_config) {
9291 		struct nlattr *nl_wowlan;
9292 
9293 		nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
9294 		if (!nl_wowlan)
9295 			goto nla_put_failure;
9296 
9297 		if ((rdev->wiphy.wowlan_config->any &&
9298 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
9299 		    (rdev->wiphy.wowlan_config->disconnect &&
9300 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
9301 		    (rdev->wiphy.wowlan_config->magic_pkt &&
9302 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
9303 		    (rdev->wiphy.wowlan_config->gtk_rekey_failure &&
9304 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
9305 		    (rdev->wiphy.wowlan_config->eap_identity_req &&
9306 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
9307 		    (rdev->wiphy.wowlan_config->four_way_handshake &&
9308 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
9309 		    (rdev->wiphy.wowlan_config->rfkill_release &&
9310 		     nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
9311 			goto nla_put_failure;
9312 
9313 		if (nl80211_send_wowlan_patterns(msg, rdev))
9314 			goto nla_put_failure;
9315 
9316 		if (nl80211_send_wowlan_tcp(msg,
9317 					    rdev->wiphy.wowlan_config->tcp))
9318 			goto nla_put_failure;
9319 
9320 		if (nl80211_send_wowlan_nd(
9321 			    msg,
9322 			    rdev->wiphy.wowlan_config->nd_config))
9323 			goto nla_put_failure;
9324 
9325 		nla_nest_end(msg, nl_wowlan);
9326 	}
9327 
9328 	genlmsg_end(msg, hdr);
9329 	return genlmsg_reply(msg, info);
9330 
9331 nla_put_failure:
9332 	nlmsg_free(msg);
9333 	return -ENOBUFS;
9334 }
9335 
9336 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev,
9337 				    struct nlattr *attr,
9338 				    struct cfg80211_wowlan *trig)
9339 {
9340 	struct nlattr *tb[NUM_NL80211_WOWLAN_TCP];
9341 	struct cfg80211_wowlan_tcp *cfg;
9342 	struct nl80211_wowlan_tcp_data_token *tok = NULL;
9343 	struct nl80211_wowlan_tcp_data_seq *seq = NULL;
9344 	u32 size;
9345 	u32 data_size, wake_size, tokens_size = 0, wake_mask_size;
9346 	int err, port;
9347 
9348 	if (!rdev->wiphy.wowlan->tcp)
9349 		return -EINVAL;
9350 
9351 	err = nla_parse(tb, MAX_NL80211_WOWLAN_TCP,
9352 			nla_data(attr), nla_len(attr),
9353 			nl80211_wowlan_tcp_policy);
9354 	if (err)
9355 		return err;
9356 
9357 	if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] ||
9358 	    !tb[NL80211_WOWLAN_TCP_DST_IPV4] ||
9359 	    !tb[NL80211_WOWLAN_TCP_DST_MAC] ||
9360 	    !tb[NL80211_WOWLAN_TCP_DST_PORT] ||
9361 	    !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] ||
9362 	    !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] ||
9363 	    !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] ||
9364 	    !tb[NL80211_WOWLAN_TCP_WAKE_MASK])
9365 		return -EINVAL;
9366 
9367 	data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]);
9368 	if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max)
9369 		return -EINVAL;
9370 
9371 	if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) >
9372 			rdev->wiphy.wowlan->tcp->data_interval_max ||
9373 	    nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0)
9374 		return -EINVAL;
9375 
9376 	wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]);
9377 	if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max)
9378 		return -EINVAL;
9379 
9380 	wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]);
9381 	if (wake_mask_size != DIV_ROUND_UP(wake_size, 8))
9382 		return -EINVAL;
9383 
9384 	if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) {
9385 		u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
9386 
9387 		tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
9388 		tokens_size = tokln - sizeof(*tok);
9389 
9390 		if (!tok->len || tokens_size % tok->len)
9391 			return -EINVAL;
9392 		if (!rdev->wiphy.wowlan->tcp->tok)
9393 			return -EINVAL;
9394 		if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len)
9395 			return -EINVAL;
9396 		if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len)
9397 			return -EINVAL;
9398 		if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize)
9399 			return -EINVAL;
9400 		if (tok->offset + tok->len > data_size)
9401 			return -EINVAL;
9402 	}
9403 
9404 	if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) {
9405 		seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]);
9406 		if (!rdev->wiphy.wowlan->tcp->seq)
9407 			return -EINVAL;
9408 		if (seq->len == 0 || seq->len > 4)
9409 			return -EINVAL;
9410 		if (seq->len + seq->offset > data_size)
9411 			return -EINVAL;
9412 	}
9413 
9414 	size = sizeof(*cfg);
9415 	size += data_size;
9416 	size += wake_size + wake_mask_size;
9417 	size += tokens_size;
9418 
9419 	cfg = kzalloc(size, GFP_KERNEL);
9420 	if (!cfg)
9421 		return -ENOMEM;
9422 	cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]);
9423 	cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]);
9424 	memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]),
9425 	       ETH_ALEN);
9426 	if (tb[NL80211_WOWLAN_TCP_SRC_PORT])
9427 		port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]);
9428 	else
9429 		port = 0;
9430 #ifdef CONFIG_INET
9431 	/* allocate a socket and port for it and use it */
9432 	err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM,
9433 			    IPPROTO_TCP, &cfg->sock, 1);
9434 	if (err) {
9435 		kfree(cfg);
9436 		return err;
9437 	}
9438 	if (inet_csk_get_port(cfg->sock->sk, port)) {
9439 		sock_release(cfg->sock);
9440 		kfree(cfg);
9441 		return -EADDRINUSE;
9442 	}
9443 	cfg->src_port = inet_sk(cfg->sock->sk)->inet_num;
9444 #else
9445 	if (!port) {
9446 		kfree(cfg);
9447 		return -EINVAL;
9448 	}
9449 	cfg->src_port = port;
9450 #endif
9451 
9452 	cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]);
9453 	cfg->payload_len = data_size;
9454 	cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size;
9455 	memcpy((void *)cfg->payload,
9456 	       nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]),
9457 	       data_size);
9458 	if (seq)
9459 		cfg->payload_seq = *seq;
9460 	cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]);
9461 	cfg->wake_len = wake_size;
9462 	cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size;
9463 	memcpy((void *)cfg->wake_data,
9464 	       nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]),
9465 	       wake_size);
9466 	cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size +
9467 			 data_size + wake_size;
9468 	memcpy((void *)cfg->wake_mask,
9469 	       nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]),
9470 	       wake_mask_size);
9471 	if (tok) {
9472 		cfg->tokens_size = tokens_size;
9473 		memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size);
9474 	}
9475 
9476 	trig->tcp = cfg;
9477 
9478 	return 0;
9479 }
9480 
9481 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev,
9482 				   const struct wiphy_wowlan_support *wowlan,
9483 				   struct nlattr *attr,
9484 				   struct cfg80211_wowlan *trig)
9485 {
9486 	struct nlattr **tb;
9487 	int err;
9488 
9489 	tb = kzalloc(NUM_NL80211_ATTR * sizeof(*tb), GFP_KERNEL);
9490 	if (!tb)
9491 		return -ENOMEM;
9492 
9493 	if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) {
9494 		err = -EOPNOTSUPP;
9495 		goto out;
9496 	}
9497 
9498 	err = nla_parse(tb, NL80211_ATTR_MAX,
9499 			nla_data(attr), nla_len(attr),
9500 			nl80211_policy);
9501 	if (err)
9502 		goto out;
9503 
9504 	trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb);
9505 	err = PTR_ERR_OR_ZERO(trig->nd_config);
9506 	if (err)
9507 		trig->nd_config = NULL;
9508 
9509 out:
9510 	kfree(tb);
9511 	return err;
9512 }
9513 
9514 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
9515 {
9516 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9517 	struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG];
9518 	struct cfg80211_wowlan new_triggers = {};
9519 	struct cfg80211_wowlan *ntrig;
9520 	const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan;
9521 	int err, i;
9522 	bool prev_enabled = rdev->wiphy.wowlan_config;
9523 	bool regular = false;
9524 
9525 	if (!wowlan)
9526 		return -EOPNOTSUPP;
9527 
9528 	if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) {
9529 		cfg80211_rdev_free_wowlan(rdev);
9530 		rdev->wiphy.wowlan_config = NULL;
9531 		goto set_wakeup;
9532 	}
9533 
9534 	err = nla_parse(tb, MAX_NL80211_WOWLAN_TRIG,
9535 			nla_data(info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]),
9536 			nla_len(info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]),
9537 			nl80211_wowlan_policy);
9538 	if (err)
9539 		return err;
9540 
9541 	if (tb[NL80211_WOWLAN_TRIG_ANY]) {
9542 		if (!(wowlan->flags & WIPHY_WOWLAN_ANY))
9543 			return -EINVAL;
9544 		new_triggers.any = true;
9545 	}
9546 
9547 	if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) {
9548 		if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT))
9549 			return -EINVAL;
9550 		new_triggers.disconnect = true;
9551 		regular = true;
9552 	}
9553 
9554 	if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) {
9555 		if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT))
9556 			return -EINVAL;
9557 		new_triggers.magic_pkt = true;
9558 		regular = true;
9559 	}
9560 
9561 	if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED])
9562 		return -EINVAL;
9563 
9564 	if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) {
9565 		if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE))
9566 			return -EINVAL;
9567 		new_triggers.gtk_rekey_failure = true;
9568 		regular = true;
9569 	}
9570 
9571 	if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) {
9572 		if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ))
9573 			return -EINVAL;
9574 		new_triggers.eap_identity_req = true;
9575 		regular = true;
9576 	}
9577 
9578 	if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) {
9579 		if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE))
9580 			return -EINVAL;
9581 		new_triggers.four_way_handshake = true;
9582 		regular = true;
9583 	}
9584 
9585 	if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) {
9586 		if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE))
9587 			return -EINVAL;
9588 		new_triggers.rfkill_release = true;
9589 		regular = true;
9590 	}
9591 
9592 	if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) {
9593 		struct nlattr *pat;
9594 		int n_patterns = 0;
9595 		int rem, pat_len, mask_len, pkt_offset;
9596 		struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
9597 
9598 		regular = true;
9599 
9600 		nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
9601 				    rem)
9602 			n_patterns++;
9603 		if (n_patterns > wowlan->n_patterns)
9604 			return -EINVAL;
9605 
9606 		new_triggers.patterns = kcalloc(n_patterns,
9607 						sizeof(new_triggers.patterns[0]),
9608 						GFP_KERNEL);
9609 		if (!new_triggers.patterns)
9610 			return -ENOMEM;
9611 
9612 		new_triggers.n_patterns = n_patterns;
9613 		i = 0;
9614 
9615 		nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
9616 				    rem) {
9617 			u8 *mask_pat;
9618 
9619 			nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat),
9620 				  nla_len(pat), NULL);
9621 			err = -EINVAL;
9622 			if (!pat_tb[NL80211_PKTPAT_MASK] ||
9623 			    !pat_tb[NL80211_PKTPAT_PATTERN])
9624 				goto error;
9625 			pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
9626 			mask_len = DIV_ROUND_UP(pat_len, 8);
9627 			if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
9628 				goto error;
9629 			if (pat_len > wowlan->pattern_max_len ||
9630 			    pat_len < wowlan->pattern_min_len)
9631 				goto error;
9632 
9633 			if (!pat_tb[NL80211_PKTPAT_OFFSET])
9634 				pkt_offset = 0;
9635 			else
9636 				pkt_offset = nla_get_u32(
9637 					pat_tb[NL80211_PKTPAT_OFFSET]);
9638 			if (pkt_offset > wowlan->max_pkt_offset)
9639 				goto error;
9640 			new_triggers.patterns[i].pkt_offset = pkt_offset;
9641 
9642 			mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
9643 			if (!mask_pat) {
9644 				err = -ENOMEM;
9645 				goto error;
9646 			}
9647 			new_triggers.patterns[i].mask = mask_pat;
9648 			memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
9649 			       mask_len);
9650 			mask_pat += mask_len;
9651 			new_triggers.patterns[i].pattern = mask_pat;
9652 			new_triggers.patterns[i].pattern_len = pat_len;
9653 			memcpy(mask_pat,
9654 			       nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
9655 			       pat_len);
9656 			i++;
9657 		}
9658 	}
9659 
9660 	if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) {
9661 		regular = true;
9662 		err = nl80211_parse_wowlan_tcp(
9663 			rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION],
9664 			&new_triggers);
9665 		if (err)
9666 			goto error;
9667 	}
9668 
9669 	if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) {
9670 		regular = true;
9671 		err = nl80211_parse_wowlan_nd(
9672 			rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT],
9673 			&new_triggers);
9674 		if (err)
9675 			goto error;
9676 	}
9677 
9678 	/* The 'any' trigger means the device continues operating more or less
9679 	 * as in its normal operation mode and wakes up the host on most of the
9680 	 * normal interrupts (like packet RX, ...)
9681 	 * It therefore makes little sense to combine with the more constrained
9682 	 * wakeup trigger modes.
9683 	 */
9684 	if (new_triggers.any && regular) {
9685 		err = -EINVAL;
9686 		goto error;
9687 	}
9688 
9689 	ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL);
9690 	if (!ntrig) {
9691 		err = -ENOMEM;
9692 		goto error;
9693 	}
9694 	cfg80211_rdev_free_wowlan(rdev);
9695 	rdev->wiphy.wowlan_config = ntrig;
9696 
9697  set_wakeup:
9698 	if (rdev->ops->set_wakeup &&
9699 	    prev_enabled != !!rdev->wiphy.wowlan_config)
9700 		rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config);
9701 
9702 	return 0;
9703  error:
9704 	for (i = 0; i < new_triggers.n_patterns; i++)
9705 		kfree(new_triggers.patterns[i].mask);
9706 	kfree(new_triggers.patterns);
9707 	if (new_triggers.tcp && new_triggers.tcp->sock)
9708 		sock_release(new_triggers.tcp->sock);
9709 	kfree(new_triggers.tcp);
9710 	kfree(new_triggers.nd_config);
9711 	return err;
9712 }
9713 #endif
9714 
9715 static int nl80211_send_coalesce_rules(struct sk_buff *msg,
9716 				       struct cfg80211_registered_device *rdev)
9717 {
9718 	struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules;
9719 	int i, j, pat_len;
9720 	struct cfg80211_coalesce_rules *rule;
9721 
9722 	if (!rdev->coalesce->n_rules)
9723 		return 0;
9724 
9725 	nl_rules = nla_nest_start(msg, NL80211_ATTR_COALESCE_RULE);
9726 	if (!nl_rules)
9727 		return -ENOBUFS;
9728 
9729 	for (i = 0; i < rdev->coalesce->n_rules; i++) {
9730 		nl_rule = nla_nest_start(msg, i + 1);
9731 		if (!nl_rule)
9732 			return -ENOBUFS;
9733 
9734 		rule = &rdev->coalesce->rules[i];
9735 		if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY,
9736 				rule->delay))
9737 			return -ENOBUFS;
9738 
9739 		if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION,
9740 				rule->condition))
9741 			return -ENOBUFS;
9742 
9743 		nl_pats = nla_nest_start(msg,
9744 				NL80211_ATTR_COALESCE_RULE_PKT_PATTERN);
9745 		if (!nl_pats)
9746 			return -ENOBUFS;
9747 
9748 		for (j = 0; j < rule->n_patterns; j++) {
9749 			nl_pat = nla_nest_start(msg, j + 1);
9750 			if (!nl_pat)
9751 				return -ENOBUFS;
9752 			pat_len = rule->patterns[j].pattern_len;
9753 			if (nla_put(msg, NL80211_PKTPAT_MASK,
9754 				    DIV_ROUND_UP(pat_len, 8),
9755 				    rule->patterns[j].mask) ||
9756 			    nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
9757 				    rule->patterns[j].pattern) ||
9758 			    nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
9759 					rule->patterns[j].pkt_offset))
9760 				return -ENOBUFS;
9761 			nla_nest_end(msg, nl_pat);
9762 		}
9763 		nla_nest_end(msg, nl_pats);
9764 		nla_nest_end(msg, nl_rule);
9765 	}
9766 	nla_nest_end(msg, nl_rules);
9767 
9768 	return 0;
9769 }
9770 
9771 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info)
9772 {
9773 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9774 	struct sk_buff *msg;
9775 	void *hdr;
9776 
9777 	if (!rdev->wiphy.coalesce)
9778 		return -EOPNOTSUPP;
9779 
9780 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9781 	if (!msg)
9782 		return -ENOMEM;
9783 
9784 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
9785 			     NL80211_CMD_GET_COALESCE);
9786 	if (!hdr)
9787 		goto nla_put_failure;
9788 
9789 	if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev))
9790 		goto nla_put_failure;
9791 
9792 	genlmsg_end(msg, hdr);
9793 	return genlmsg_reply(msg, info);
9794 
9795 nla_put_failure:
9796 	nlmsg_free(msg);
9797 	return -ENOBUFS;
9798 }
9799 
9800 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev)
9801 {
9802 	struct cfg80211_coalesce *coalesce = rdev->coalesce;
9803 	int i, j;
9804 	struct cfg80211_coalesce_rules *rule;
9805 
9806 	if (!coalesce)
9807 		return;
9808 
9809 	for (i = 0; i < coalesce->n_rules; i++) {
9810 		rule = &coalesce->rules[i];
9811 		for (j = 0; j < rule->n_patterns; j++)
9812 			kfree(rule->patterns[j].mask);
9813 		kfree(rule->patterns);
9814 	}
9815 	kfree(coalesce->rules);
9816 	kfree(coalesce);
9817 	rdev->coalesce = NULL;
9818 }
9819 
9820 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,
9821 				       struct nlattr *rule,
9822 				       struct cfg80211_coalesce_rules *new_rule)
9823 {
9824 	int err, i;
9825 	const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
9826 	struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat;
9827 	int rem, pat_len, mask_len, pkt_offset, n_patterns = 0;
9828 	struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
9829 
9830 	err = nla_parse(tb, NL80211_ATTR_COALESCE_RULE_MAX, nla_data(rule),
9831 			nla_len(rule), nl80211_coalesce_policy);
9832 	if (err)
9833 		return err;
9834 
9835 	if (tb[NL80211_ATTR_COALESCE_RULE_DELAY])
9836 		new_rule->delay =
9837 			nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]);
9838 	if (new_rule->delay > coalesce->max_delay)
9839 		return -EINVAL;
9840 
9841 	if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION])
9842 		new_rule->condition =
9843 			nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]);
9844 	if (new_rule->condition != NL80211_COALESCE_CONDITION_MATCH &&
9845 	    new_rule->condition != NL80211_COALESCE_CONDITION_NO_MATCH)
9846 		return -EINVAL;
9847 
9848 	if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN])
9849 		return -EINVAL;
9850 
9851 	nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
9852 			    rem)
9853 		n_patterns++;
9854 	if (n_patterns > coalesce->n_patterns)
9855 		return -EINVAL;
9856 
9857 	new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]),
9858 				     GFP_KERNEL);
9859 	if (!new_rule->patterns)
9860 		return -ENOMEM;
9861 
9862 	new_rule->n_patterns = n_patterns;
9863 	i = 0;
9864 
9865 	nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
9866 			    rem) {
9867 		u8 *mask_pat;
9868 
9869 		nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat),
9870 			  nla_len(pat), NULL);
9871 		if (!pat_tb[NL80211_PKTPAT_MASK] ||
9872 		    !pat_tb[NL80211_PKTPAT_PATTERN])
9873 			return -EINVAL;
9874 		pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
9875 		mask_len = DIV_ROUND_UP(pat_len, 8);
9876 		if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
9877 			return -EINVAL;
9878 		if (pat_len > coalesce->pattern_max_len ||
9879 		    pat_len < coalesce->pattern_min_len)
9880 			return -EINVAL;
9881 
9882 		if (!pat_tb[NL80211_PKTPAT_OFFSET])
9883 			pkt_offset = 0;
9884 		else
9885 			pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]);
9886 		if (pkt_offset > coalesce->max_pkt_offset)
9887 			return -EINVAL;
9888 		new_rule->patterns[i].pkt_offset = pkt_offset;
9889 
9890 		mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
9891 		if (!mask_pat)
9892 			return -ENOMEM;
9893 
9894 		new_rule->patterns[i].mask = mask_pat;
9895 		memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
9896 		       mask_len);
9897 
9898 		mask_pat += mask_len;
9899 		new_rule->patterns[i].pattern = mask_pat;
9900 		new_rule->patterns[i].pattern_len = pat_len;
9901 		memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
9902 		       pat_len);
9903 		i++;
9904 	}
9905 
9906 	return 0;
9907 }
9908 
9909 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info)
9910 {
9911 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9912 	const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
9913 	struct cfg80211_coalesce new_coalesce = {};
9914 	struct cfg80211_coalesce *n_coalesce;
9915 	int err, rem_rule, n_rules = 0, i, j;
9916 	struct nlattr *rule;
9917 	struct cfg80211_coalesce_rules *tmp_rule;
9918 
9919 	if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce)
9920 		return -EOPNOTSUPP;
9921 
9922 	if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) {
9923 		cfg80211_rdev_free_coalesce(rdev);
9924 		rdev_set_coalesce(rdev, NULL);
9925 		return 0;
9926 	}
9927 
9928 	nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
9929 			    rem_rule)
9930 		n_rules++;
9931 	if (n_rules > coalesce->n_rules)
9932 		return -EINVAL;
9933 
9934 	new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]),
9935 				     GFP_KERNEL);
9936 	if (!new_coalesce.rules)
9937 		return -ENOMEM;
9938 
9939 	new_coalesce.n_rules = n_rules;
9940 	i = 0;
9941 
9942 	nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
9943 			    rem_rule) {
9944 		err = nl80211_parse_coalesce_rule(rdev, rule,
9945 						  &new_coalesce.rules[i]);
9946 		if (err)
9947 			goto error;
9948 
9949 		i++;
9950 	}
9951 
9952 	err = rdev_set_coalesce(rdev, &new_coalesce);
9953 	if (err)
9954 		goto error;
9955 
9956 	n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL);
9957 	if (!n_coalesce) {
9958 		err = -ENOMEM;
9959 		goto error;
9960 	}
9961 	cfg80211_rdev_free_coalesce(rdev);
9962 	rdev->coalesce = n_coalesce;
9963 
9964 	return 0;
9965 error:
9966 	for (i = 0; i < new_coalesce.n_rules; i++) {
9967 		tmp_rule = &new_coalesce.rules[i];
9968 		for (j = 0; j < tmp_rule->n_patterns; j++)
9969 			kfree(tmp_rule->patterns[j].mask);
9970 		kfree(tmp_rule->patterns);
9971 	}
9972 	kfree(new_coalesce.rules);
9973 
9974 	return err;
9975 }
9976 
9977 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
9978 {
9979 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
9980 	struct net_device *dev = info->user_ptr[1];
9981 	struct wireless_dev *wdev = dev->ieee80211_ptr;
9982 	struct nlattr *tb[NUM_NL80211_REKEY_DATA];
9983 	struct cfg80211_gtk_rekey_data rekey_data;
9984 	int err;
9985 
9986 	if (!info->attrs[NL80211_ATTR_REKEY_DATA])
9987 		return -EINVAL;
9988 
9989 	err = nla_parse(tb, MAX_NL80211_REKEY_DATA,
9990 			nla_data(info->attrs[NL80211_ATTR_REKEY_DATA]),
9991 			nla_len(info->attrs[NL80211_ATTR_REKEY_DATA]),
9992 			nl80211_rekey_policy);
9993 	if (err)
9994 		return err;
9995 
9996 	if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN)
9997 		return -ERANGE;
9998 	if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN)
9999 		return -ERANGE;
10000 	if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN)
10001 		return -ERANGE;
10002 
10003 	rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]);
10004 	rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]);
10005 	rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]);
10006 
10007 	wdev_lock(wdev);
10008 	if (!wdev->current_bss) {
10009 		err = -ENOTCONN;
10010 		goto out;
10011 	}
10012 
10013 	if (!rdev->ops->set_rekey_data) {
10014 		err = -EOPNOTSUPP;
10015 		goto out;
10016 	}
10017 
10018 	err = rdev_set_rekey_data(rdev, dev, &rekey_data);
10019  out:
10020 	wdev_unlock(wdev);
10021 	return err;
10022 }
10023 
10024 static int nl80211_register_unexpected_frame(struct sk_buff *skb,
10025 					     struct genl_info *info)
10026 {
10027 	struct net_device *dev = info->user_ptr[1];
10028 	struct wireless_dev *wdev = dev->ieee80211_ptr;
10029 
10030 	if (wdev->iftype != NL80211_IFTYPE_AP &&
10031 	    wdev->iftype != NL80211_IFTYPE_P2P_GO)
10032 		return -EINVAL;
10033 
10034 	if (wdev->ap_unexpected_nlportid)
10035 		return -EBUSY;
10036 
10037 	wdev->ap_unexpected_nlportid = info->snd_portid;
10038 	return 0;
10039 }
10040 
10041 static int nl80211_probe_client(struct sk_buff *skb,
10042 				struct genl_info *info)
10043 {
10044 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10045 	struct net_device *dev = info->user_ptr[1];
10046 	struct wireless_dev *wdev = dev->ieee80211_ptr;
10047 	struct sk_buff *msg;
10048 	void *hdr;
10049 	const u8 *addr;
10050 	u64 cookie;
10051 	int err;
10052 
10053 	if (wdev->iftype != NL80211_IFTYPE_AP &&
10054 	    wdev->iftype != NL80211_IFTYPE_P2P_GO)
10055 		return -EOPNOTSUPP;
10056 
10057 	if (!info->attrs[NL80211_ATTR_MAC])
10058 		return -EINVAL;
10059 
10060 	if (!rdev->ops->probe_client)
10061 		return -EOPNOTSUPP;
10062 
10063 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10064 	if (!msg)
10065 		return -ENOMEM;
10066 
10067 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10068 			     NL80211_CMD_PROBE_CLIENT);
10069 	if (!hdr) {
10070 		err = -ENOBUFS;
10071 		goto free_msg;
10072 	}
10073 
10074 	addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
10075 
10076 	err = rdev_probe_client(rdev, dev, addr, &cookie);
10077 	if (err)
10078 		goto free_msg;
10079 
10080 	if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
10081 		goto nla_put_failure;
10082 
10083 	genlmsg_end(msg, hdr);
10084 
10085 	return genlmsg_reply(msg, info);
10086 
10087  nla_put_failure:
10088 	err = -ENOBUFS;
10089  free_msg:
10090 	nlmsg_free(msg);
10091 	return err;
10092 }
10093 
10094 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info)
10095 {
10096 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10097 	struct cfg80211_beacon_registration *reg, *nreg;
10098 	int rv;
10099 
10100 	if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS))
10101 		return -EOPNOTSUPP;
10102 
10103 	nreg = kzalloc(sizeof(*nreg), GFP_KERNEL);
10104 	if (!nreg)
10105 		return -ENOMEM;
10106 
10107 	/* First, check if already registered. */
10108 	spin_lock_bh(&rdev->beacon_registrations_lock);
10109 	list_for_each_entry(reg, &rdev->beacon_registrations, list) {
10110 		if (reg->nlportid == info->snd_portid) {
10111 			rv = -EALREADY;
10112 			goto out_err;
10113 		}
10114 	}
10115 	/* Add it to the list */
10116 	nreg->nlportid = info->snd_portid;
10117 	list_add(&nreg->list, &rdev->beacon_registrations);
10118 
10119 	spin_unlock_bh(&rdev->beacon_registrations_lock);
10120 
10121 	return 0;
10122 out_err:
10123 	spin_unlock_bh(&rdev->beacon_registrations_lock);
10124 	kfree(nreg);
10125 	return rv;
10126 }
10127 
10128 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
10129 {
10130 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10131 	struct wireless_dev *wdev = info->user_ptr[1];
10132 	int err;
10133 
10134 	if (!rdev->ops->start_p2p_device)
10135 		return -EOPNOTSUPP;
10136 
10137 	if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
10138 		return -EOPNOTSUPP;
10139 
10140 	if (wdev->p2p_started)
10141 		return 0;
10142 
10143 	if (rfkill_blocked(rdev->rfkill))
10144 		return -ERFKILL;
10145 
10146 	err = rdev_start_p2p_device(rdev, wdev);
10147 	if (err)
10148 		return err;
10149 
10150 	wdev->p2p_started = true;
10151 	rdev->opencount++;
10152 
10153 	return 0;
10154 }
10155 
10156 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info)
10157 {
10158 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10159 	struct wireless_dev *wdev = info->user_ptr[1];
10160 
10161 	if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
10162 		return -EOPNOTSUPP;
10163 
10164 	if (!rdev->ops->stop_p2p_device)
10165 		return -EOPNOTSUPP;
10166 
10167 	cfg80211_stop_p2p_device(rdev, wdev);
10168 
10169 	return 0;
10170 }
10171 
10172 static int nl80211_get_protocol_features(struct sk_buff *skb,
10173 					 struct genl_info *info)
10174 {
10175 	void *hdr;
10176 	struct sk_buff *msg;
10177 
10178 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10179 	if (!msg)
10180 		return -ENOMEM;
10181 
10182 	hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10183 			     NL80211_CMD_GET_PROTOCOL_FEATURES);
10184 	if (!hdr)
10185 		goto nla_put_failure;
10186 
10187 	if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES,
10188 			NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP))
10189 		goto nla_put_failure;
10190 
10191 	genlmsg_end(msg, hdr);
10192 	return genlmsg_reply(msg, info);
10193 
10194  nla_put_failure:
10195 	kfree_skb(msg);
10196 	return -ENOBUFS;
10197 }
10198 
10199 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info)
10200 {
10201 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10202 	struct cfg80211_update_ft_ies_params ft_params;
10203 	struct net_device *dev = info->user_ptr[1];
10204 
10205 	if (!rdev->ops->update_ft_ies)
10206 		return -EOPNOTSUPP;
10207 
10208 	if (!info->attrs[NL80211_ATTR_MDID] ||
10209 	    !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
10210 		return -EINVAL;
10211 
10212 	memset(&ft_params, 0, sizeof(ft_params));
10213 	ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]);
10214 	ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
10215 	ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
10216 
10217 	return rdev_update_ft_ies(rdev, dev, &ft_params);
10218 }
10219 
10220 static int nl80211_crit_protocol_start(struct sk_buff *skb,
10221 				       struct genl_info *info)
10222 {
10223 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10224 	struct wireless_dev *wdev = info->user_ptr[1];
10225 	enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC;
10226 	u16 duration;
10227 	int ret;
10228 
10229 	if (!rdev->ops->crit_proto_start)
10230 		return -EOPNOTSUPP;
10231 
10232 	if (WARN_ON(!rdev->ops->crit_proto_stop))
10233 		return -EINVAL;
10234 
10235 	if (rdev->crit_proto_nlportid)
10236 		return -EBUSY;
10237 
10238 	/* determine protocol if provided */
10239 	if (info->attrs[NL80211_ATTR_CRIT_PROT_ID])
10240 		proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]);
10241 
10242 	if (proto >= NUM_NL80211_CRIT_PROTO)
10243 		return -EINVAL;
10244 
10245 	/* timeout must be provided */
10246 	if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION])
10247 		return -EINVAL;
10248 
10249 	duration =
10250 		nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
10251 
10252 	if (duration > NL80211_CRIT_PROTO_MAX_DURATION)
10253 		return -ERANGE;
10254 
10255 	ret = rdev_crit_proto_start(rdev, wdev, proto, duration);
10256 	if (!ret)
10257 		rdev->crit_proto_nlportid = info->snd_portid;
10258 
10259 	return ret;
10260 }
10261 
10262 static int nl80211_crit_protocol_stop(struct sk_buff *skb,
10263 				      struct genl_info *info)
10264 {
10265 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10266 	struct wireless_dev *wdev = info->user_ptr[1];
10267 
10268 	if (!rdev->ops->crit_proto_stop)
10269 		return -EOPNOTSUPP;
10270 
10271 	if (rdev->crit_proto_nlportid) {
10272 		rdev->crit_proto_nlportid = 0;
10273 		rdev_crit_proto_stop(rdev, wdev);
10274 	}
10275 	return 0;
10276 }
10277 
10278 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
10279 {
10280 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10281 	struct wireless_dev *wdev =
10282 		__cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
10283 	int i, err;
10284 	u32 vid, subcmd;
10285 
10286 	if (!rdev->wiphy.vendor_commands)
10287 		return -EOPNOTSUPP;
10288 
10289 	if (IS_ERR(wdev)) {
10290 		err = PTR_ERR(wdev);
10291 		if (err != -EINVAL)
10292 			return err;
10293 		wdev = NULL;
10294 	} else if (wdev->wiphy != &rdev->wiphy) {
10295 		return -EINVAL;
10296 	}
10297 
10298 	if (!info->attrs[NL80211_ATTR_VENDOR_ID] ||
10299 	    !info->attrs[NL80211_ATTR_VENDOR_SUBCMD])
10300 		return -EINVAL;
10301 
10302 	vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]);
10303 	subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]);
10304 	for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
10305 		const struct wiphy_vendor_command *vcmd;
10306 		void *data = NULL;
10307 		int len = 0;
10308 
10309 		vcmd = &rdev->wiphy.vendor_commands[i];
10310 
10311 		if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
10312 			continue;
10313 
10314 		if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
10315 				   WIPHY_VENDOR_CMD_NEED_NETDEV)) {
10316 			if (!wdev)
10317 				return -EINVAL;
10318 			if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
10319 			    !wdev->netdev)
10320 				return -EINVAL;
10321 
10322 			if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
10323 				if (wdev->netdev &&
10324 				    !netif_running(wdev->netdev))
10325 					return -ENETDOWN;
10326 				if (!wdev->netdev && !wdev->p2p_started)
10327 					return -ENETDOWN;
10328 			}
10329 
10330 			if (!vcmd->doit)
10331 				return -EOPNOTSUPP;
10332 		} else {
10333 			wdev = NULL;
10334 		}
10335 
10336 		if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
10337 			data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
10338 			len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
10339 		}
10340 
10341 		rdev->cur_cmd_info = info;
10342 		err = rdev->wiphy.vendor_commands[i].doit(&rdev->wiphy, wdev,
10343 							  data, len);
10344 		rdev->cur_cmd_info = NULL;
10345 		return err;
10346 	}
10347 
10348 	return -EOPNOTSUPP;
10349 }
10350 
10351 static int nl80211_prepare_vendor_dump(struct sk_buff *skb,
10352 				       struct netlink_callback *cb,
10353 				       struct cfg80211_registered_device **rdev,
10354 				       struct wireless_dev **wdev)
10355 {
10356 	u32 vid, subcmd;
10357 	unsigned int i;
10358 	int vcmd_idx = -1;
10359 	int err;
10360 	void *data = NULL;
10361 	unsigned int data_len = 0;
10362 
10363 	rtnl_lock();
10364 
10365 	if (cb->args[0]) {
10366 		/* subtract the 1 again here */
10367 		struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
10368 		struct wireless_dev *tmp;
10369 
10370 		if (!wiphy) {
10371 			err = -ENODEV;
10372 			goto out_unlock;
10373 		}
10374 		*rdev = wiphy_to_rdev(wiphy);
10375 		*wdev = NULL;
10376 
10377 		if (cb->args[1]) {
10378 			list_for_each_entry(tmp, &(*rdev)->wdev_list, list) {
10379 				if (tmp->identifier == cb->args[1] - 1) {
10380 					*wdev = tmp;
10381 					break;
10382 				}
10383 			}
10384 		}
10385 
10386 		/* keep rtnl locked in successful case */
10387 		return 0;
10388 	}
10389 
10390 	err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
10391 			  nl80211_fam.attrbuf, nl80211_fam.maxattr,
10392 			  nl80211_policy);
10393 	if (err)
10394 		goto out_unlock;
10395 
10396 	if (!nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID] ||
10397 	    !nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) {
10398 		err = -EINVAL;
10399 		goto out_unlock;
10400 	}
10401 
10402 	*wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk),
10403 					   nl80211_fam.attrbuf);
10404 	if (IS_ERR(*wdev))
10405 		*wdev = NULL;
10406 
10407 	*rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk),
10408 					   nl80211_fam.attrbuf);
10409 	if (IS_ERR(*rdev)) {
10410 		err = PTR_ERR(*rdev);
10411 		goto out_unlock;
10412 	}
10413 
10414 	vid = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID]);
10415 	subcmd = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
10416 
10417 	for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) {
10418 		const struct wiphy_vendor_command *vcmd;
10419 
10420 		vcmd = &(*rdev)->wiphy.vendor_commands[i];
10421 
10422 		if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
10423 			continue;
10424 
10425 		if (!vcmd->dumpit) {
10426 			err = -EOPNOTSUPP;
10427 			goto out_unlock;
10428 		}
10429 
10430 		vcmd_idx = i;
10431 		break;
10432 	}
10433 
10434 	if (vcmd_idx < 0) {
10435 		err = -EOPNOTSUPP;
10436 		goto out_unlock;
10437 	}
10438 
10439 	if (nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]) {
10440 		data = nla_data(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]);
10441 		data_len = nla_len(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]);
10442 	}
10443 
10444 	/* 0 is the first index - add 1 to parse only once */
10445 	cb->args[0] = (*rdev)->wiphy_idx + 1;
10446 	/* add 1 to know if it was NULL */
10447 	cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0;
10448 	cb->args[2] = vcmd_idx;
10449 	cb->args[3] = (unsigned long)data;
10450 	cb->args[4] = data_len;
10451 
10452 	/* keep rtnl locked in successful case */
10453 	return 0;
10454  out_unlock:
10455 	rtnl_unlock();
10456 	return err;
10457 }
10458 
10459 static int nl80211_vendor_cmd_dump(struct sk_buff *skb,
10460 				   struct netlink_callback *cb)
10461 {
10462 	struct cfg80211_registered_device *rdev;
10463 	struct wireless_dev *wdev;
10464 	unsigned int vcmd_idx;
10465 	const struct wiphy_vendor_command *vcmd;
10466 	void *data;
10467 	int data_len;
10468 	int err;
10469 	struct nlattr *vendor_data;
10470 
10471 	err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev);
10472 	if (err)
10473 		return err;
10474 
10475 	vcmd_idx = cb->args[2];
10476 	data = (void *)cb->args[3];
10477 	data_len = cb->args[4];
10478 	vcmd = &rdev->wiphy.vendor_commands[vcmd_idx];
10479 
10480 	if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
10481 			   WIPHY_VENDOR_CMD_NEED_NETDEV)) {
10482 		if (!wdev)
10483 			return -EINVAL;
10484 		if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
10485 		    !wdev->netdev)
10486 			return -EINVAL;
10487 
10488 		if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
10489 			if (wdev->netdev &&
10490 			    !netif_running(wdev->netdev))
10491 				return -ENETDOWN;
10492 			if (!wdev->netdev && !wdev->p2p_started)
10493 				return -ENETDOWN;
10494 		}
10495 	}
10496 
10497 	while (1) {
10498 		void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
10499 					   cb->nlh->nlmsg_seq, NLM_F_MULTI,
10500 					   NL80211_CMD_VENDOR);
10501 		if (!hdr)
10502 			break;
10503 
10504 		if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10505 		    (wdev && nla_put_u64(skb, NL80211_ATTR_WDEV,
10506 					 wdev_id(wdev)))) {
10507 			genlmsg_cancel(skb, hdr);
10508 			break;
10509 		}
10510 
10511 		vendor_data = nla_nest_start(skb, NL80211_ATTR_VENDOR_DATA);
10512 		if (!vendor_data) {
10513 			genlmsg_cancel(skb, hdr);
10514 			break;
10515 		}
10516 
10517 		err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len,
10518 				   (unsigned long *)&cb->args[5]);
10519 		nla_nest_end(skb, vendor_data);
10520 
10521 		if (err == -ENOBUFS || err == -ENOENT) {
10522 			genlmsg_cancel(skb, hdr);
10523 			break;
10524 		} else if (err) {
10525 			genlmsg_cancel(skb, hdr);
10526 			goto out;
10527 		}
10528 
10529 		genlmsg_end(skb, hdr);
10530 	}
10531 
10532 	err = skb->len;
10533  out:
10534 	rtnl_unlock();
10535 	return err;
10536 }
10537 
10538 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
10539 					   enum nl80211_commands cmd,
10540 					   enum nl80211_attrs attr,
10541 					   int approxlen)
10542 {
10543 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
10544 
10545 	if (WARN_ON(!rdev->cur_cmd_info))
10546 		return NULL;
10547 
10548 	return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen,
10549 					   rdev->cur_cmd_info->snd_portid,
10550 					   rdev->cur_cmd_info->snd_seq,
10551 					   cmd, attr, NULL, GFP_KERNEL);
10552 }
10553 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb);
10554 
10555 int cfg80211_vendor_cmd_reply(struct sk_buff *skb)
10556 {
10557 	struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
10558 	void *hdr = ((void **)skb->cb)[1];
10559 	struct nlattr *data = ((void **)skb->cb)[2];
10560 
10561 	/* clear CB data for netlink core to own from now on */
10562 	memset(skb->cb, 0, sizeof(skb->cb));
10563 
10564 	if (WARN_ON(!rdev->cur_cmd_info)) {
10565 		kfree_skb(skb);
10566 		return -EINVAL;
10567 	}
10568 
10569 	nla_nest_end(skb, data);
10570 	genlmsg_end(skb, hdr);
10571 	return genlmsg_reply(skb, rdev->cur_cmd_info);
10572 }
10573 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply);
10574 
10575 
10576 static int nl80211_set_qos_map(struct sk_buff *skb,
10577 			       struct genl_info *info)
10578 {
10579 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10580 	struct cfg80211_qos_map *qos_map = NULL;
10581 	struct net_device *dev = info->user_ptr[1];
10582 	u8 *pos, len, num_des, des_len, des;
10583 	int ret;
10584 
10585 	if (!rdev->ops->set_qos_map)
10586 		return -EOPNOTSUPP;
10587 
10588 	if (info->attrs[NL80211_ATTR_QOS_MAP]) {
10589 		pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]);
10590 		len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]);
10591 
10592 		if (len % 2 || len < IEEE80211_QOS_MAP_LEN_MIN ||
10593 		    len > IEEE80211_QOS_MAP_LEN_MAX)
10594 			return -EINVAL;
10595 
10596 		qos_map = kzalloc(sizeof(struct cfg80211_qos_map), GFP_KERNEL);
10597 		if (!qos_map)
10598 			return -ENOMEM;
10599 
10600 		num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1;
10601 		if (num_des) {
10602 			des_len = num_des *
10603 				sizeof(struct cfg80211_dscp_exception);
10604 			memcpy(qos_map->dscp_exception, pos, des_len);
10605 			qos_map->num_des = num_des;
10606 			for (des = 0; des < num_des; des++) {
10607 				if (qos_map->dscp_exception[des].up > 7) {
10608 					kfree(qos_map);
10609 					return -EINVAL;
10610 				}
10611 			}
10612 			pos += des_len;
10613 		}
10614 		memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN);
10615 	}
10616 
10617 	wdev_lock(dev->ieee80211_ptr);
10618 	ret = nl80211_key_allowed(dev->ieee80211_ptr);
10619 	if (!ret)
10620 		ret = rdev_set_qos_map(rdev, dev, qos_map);
10621 	wdev_unlock(dev->ieee80211_ptr);
10622 
10623 	kfree(qos_map);
10624 	return ret;
10625 }
10626 
10627 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info)
10628 {
10629 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10630 	struct net_device *dev = info->user_ptr[1];
10631 	struct wireless_dev *wdev = dev->ieee80211_ptr;
10632 	const u8 *peer;
10633 	u8 tsid, up;
10634 	u16 admitted_time = 0;
10635 	int err;
10636 
10637 	if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION))
10638 		return -EOPNOTSUPP;
10639 
10640 	if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] ||
10641 	    !info->attrs[NL80211_ATTR_USER_PRIO])
10642 		return -EINVAL;
10643 
10644 	tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
10645 	if (tsid >= IEEE80211_NUM_TIDS)
10646 		return -EINVAL;
10647 
10648 	up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]);
10649 	if (up >= IEEE80211_NUM_UPS)
10650 		return -EINVAL;
10651 
10652 	/* WMM uses TIDs 0-7 even for TSPEC */
10653 	if (tsid >= IEEE80211_FIRST_TSPEC_TSID) {
10654 		/* TODO: handle 802.11 TSPEC/admission control
10655 		 * need more attributes for that (e.g. BA session requirement);
10656 		 * change the WMM adminssion test above to allow both then
10657 		 */
10658 		return -EINVAL;
10659 	}
10660 
10661 	peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
10662 
10663 	if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) {
10664 		admitted_time =
10665 			nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]);
10666 		if (!admitted_time)
10667 			return -EINVAL;
10668 	}
10669 
10670 	wdev_lock(wdev);
10671 	switch (wdev->iftype) {
10672 	case NL80211_IFTYPE_STATION:
10673 	case NL80211_IFTYPE_P2P_CLIENT:
10674 		if (wdev->current_bss)
10675 			break;
10676 		err = -ENOTCONN;
10677 		goto out;
10678 	default:
10679 		err = -EOPNOTSUPP;
10680 		goto out;
10681 	}
10682 
10683 	err = rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time);
10684 
10685  out:
10686 	wdev_unlock(wdev);
10687 	return err;
10688 }
10689 
10690 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info)
10691 {
10692 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10693 	struct net_device *dev = info->user_ptr[1];
10694 	struct wireless_dev *wdev = dev->ieee80211_ptr;
10695 	const u8 *peer;
10696 	u8 tsid;
10697 	int err;
10698 
10699 	if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC])
10700 		return -EINVAL;
10701 
10702 	tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
10703 	peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
10704 
10705 	wdev_lock(wdev);
10706 	err = rdev_del_tx_ts(rdev, dev, tsid, peer);
10707 	wdev_unlock(wdev);
10708 
10709 	return err;
10710 }
10711 
10712 static int nl80211_tdls_channel_switch(struct sk_buff *skb,
10713 				       struct genl_info *info)
10714 {
10715 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10716 	struct net_device *dev = info->user_ptr[1];
10717 	struct wireless_dev *wdev = dev->ieee80211_ptr;
10718 	struct cfg80211_chan_def chandef = {};
10719 	const u8 *addr;
10720 	u8 oper_class;
10721 	int err;
10722 
10723 	if (!rdev->ops->tdls_channel_switch ||
10724 	    !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
10725 		return -EOPNOTSUPP;
10726 
10727 	switch (dev->ieee80211_ptr->iftype) {
10728 	case NL80211_IFTYPE_STATION:
10729 	case NL80211_IFTYPE_P2P_CLIENT:
10730 		break;
10731 	default:
10732 		return -EOPNOTSUPP;
10733 	}
10734 
10735 	if (!info->attrs[NL80211_ATTR_MAC] ||
10736 	    !info->attrs[NL80211_ATTR_OPER_CLASS])
10737 		return -EINVAL;
10738 
10739 	err = nl80211_parse_chandef(rdev, info, &chandef);
10740 	if (err)
10741 		return err;
10742 
10743 	/*
10744 	 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012
10745 	 * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the
10746 	 * specification is not defined for them.
10747 	 */
10748 	if (chandef.chan->band == IEEE80211_BAND_2GHZ &&
10749 	    chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
10750 	    chandef.width != NL80211_CHAN_WIDTH_20)
10751 		return -EINVAL;
10752 
10753 	/* we will be active on the TDLS link */
10754 	if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
10755 					   wdev->iftype))
10756 		return -EINVAL;
10757 
10758 	/* don't allow switching to DFS channels */
10759 	if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype))
10760 		return -EINVAL;
10761 
10762 	addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
10763 	oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]);
10764 
10765 	wdev_lock(wdev);
10766 	err = rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef);
10767 	wdev_unlock(wdev);
10768 
10769 	return err;
10770 }
10771 
10772 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb,
10773 					      struct genl_info *info)
10774 {
10775 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
10776 	struct net_device *dev = info->user_ptr[1];
10777 	struct wireless_dev *wdev = dev->ieee80211_ptr;
10778 	const u8 *addr;
10779 
10780 	if (!rdev->ops->tdls_channel_switch ||
10781 	    !rdev->ops->tdls_cancel_channel_switch ||
10782 	    !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
10783 		return -EOPNOTSUPP;
10784 
10785 	switch (dev->ieee80211_ptr->iftype) {
10786 	case NL80211_IFTYPE_STATION:
10787 	case NL80211_IFTYPE_P2P_CLIENT:
10788 		break;
10789 	default:
10790 		return -EOPNOTSUPP;
10791 	}
10792 
10793 	if (!info->attrs[NL80211_ATTR_MAC])
10794 		return -EINVAL;
10795 
10796 	addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
10797 
10798 	wdev_lock(wdev);
10799 	rdev_tdls_cancel_channel_switch(rdev, dev, addr);
10800 	wdev_unlock(wdev);
10801 
10802 	return 0;
10803 }
10804 
10805 #define NL80211_FLAG_NEED_WIPHY		0x01
10806 #define NL80211_FLAG_NEED_NETDEV	0x02
10807 #define NL80211_FLAG_NEED_RTNL		0x04
10808 #define NL80211_FLAG_CHECK_NETDEV_UP	0x08
10809 #define NL80211_FLAG_NEED_NETDEV_UP	(NL80211_FLAG_NEED_NETDEV |\
10810 					 NL80211_FLAG_CHECK_NETDEV_UP)
10811 #define NL80211_FLAG_NEED_WDEV		0x10
10812 /* If a netdev is associated, it must be UP, P2P must be started */
10813 #define NL80211_FLAG_NEED_WDEV_UP	(NL80211_FLAG_NEED_WDEV |\
10814 					 NL80211_FLAG_CHECK_NETDEV_UP)
10815 #define NL80211_FLAG_CLEAR_SKB		0x20
10816 
10817 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
10818 			    struct genl_info *info)
10819 {
10820 	struct cfg80211_registered_device *rdev;
10821 	struct wireless_dev *wdev;
10822 	struct net_device *dev;
10823 	bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL;
10824 
10825 	if (rtnl)
10826 		rtnl_lock();
10827 
10828 	if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) {
10829 		rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
10830 		if (IS_ERR(rdev)) {
10831 			if (rtnl)
10832 				rtnl_unlock();
10833 			return PTR_ERR(rdev);
10834 		}
10835 		info->user_ptr[0] = rdev;
10836 	} else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV ||
10837 		   ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
10838 		ASSERT_RTNL();
10839 
10840 		wdev = __cfg80211_wdev_from_attrs(genl_info_net(info),
10841 						  info->attrs);
10842 		if (IS_ERR(wdev)) {
10843 			if (rtnl)
10844 				rtnl_unlock();
10845 			return PTR_ERR(wdev);
10846 		}
10847 
10848 		dev = wdev->netdev;
10849 		rdev = wiphy_to_rdev(wdev->wiphy);
10850 
10851 		if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) {
10852 			if (!dev) {
10853 				if (rtnl)
10854 					rtnl_unlock();
10855 				return -EINVAL;
10856 			}
10857 
10858 			info->user_ptr[1] = dev;
10859 		} else {
10860 			info->user_ptr[1] = wdev;
10861 		}
10862 
10863 		if (dev) {
10864 			if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
10865 			    !netif_running(dev)) {
10866 				if (rtnl)
10867 					rtnl_unlock();
10868 				return -ENETDOWN;
10869 			}
10870 
10871 			dev_hold(dev);
10872 		} else if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP) {
10873 			if (!wdev->p2p_started) {
10874 				if (rtnl)
10875 					rtnl_unlock();
10876 				return -ENETDOWN;
10877 			}
10878 		}
10879 
10880 		info->user_ptr[0] = rdev;
10881 	}
10882 
10883 	return 0;
10884 }
10885 
10886 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
10887 			      struct genl_info *info)
10888 {
10889 	if (info->user_ptr[1]) {
10890 		if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
10891 			struct wireless_dev *wdev = info->user_ptr[1];
10892 
10893 			if (wdev->netdev)
10894 				dev_put(wdev->netdev);
10895 		} else {
10896 			dev_put(info->user_ptr[1]);
10897 		}
10898 	}
10899 
10900 	if (ops->internal_flags & NL80211_FLAG_NEED_RTNL)
10901 		rtnl_unlock();
10902 
10903 	/* If needed, clear the netlink message payload from the SKB
10904 	 * as it might contain key data that shouldn't stick around on
10905 	 * the heap after the SKB is freed. The netlink message header
10906 	 * is still needed for further processing, so leave it intact.
10907 	 */
10908 	if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) {
10909 		struct nlmsghdr *nlh = nlmsg_hdr(skb);
10910 
10911 		memset(nlmsg_data(nlh), 0, nlmsg_len(nlh));
10912 	}
10913 }
10914 
10915 static const struct genl_ops nl80211_ops[] = {
10916 	{
10917 		.cmd = NL80211_CMD_GET_WIPHY,
10918 		.doit = nl80211_get_wiphy,
10919 		.dumpit = nl80211_dump_wiphy,
10920 		.done = nl80211_dump_wiphy_done,
10921 		.policy = nl80211_policy,
10922 		/* can be retrieved by unprivileged users */
10923 		.internal_flags = NL80211_FLAG_NEED_WIPHY |
10924 				  NL80211_FLAG_NEED_RTNL,
10925 	},
10926 	{
10927 		.cmd = NL80211_CMD_SET_WIPHY,
10928 		.doit = nl80211_set_wiphy,
10929 		.policy = nl80211_policy,
10930 		.flags = GENL_ADMIN_PERM,
10931 		.internal_flags = NL80211_FLAG_NEED_RTNL,
10932 	},
10933 	{
10934 		.cmd = NL80211_CMD_GET_INTERFACE,
10935 		.doit = nl80211_get_interface,
10936 		.dumpit = nl80211_dump_interface,
10937 		.policy = nl80211_policy,
10938 		/* can be retrieved by unprivileged users */
10939 		.internal_flags = NL80211_FLAG_NEED_WDEV |
10940 				  NL80211_FLAG_NEED_RTNL,
10941 	},
10942 	{
10943 		.cmd = NL80211_CMD_SET_INTERFACE,
10944 		.doit = nl80211_set_interface,
10945 		.policy = nl80211_policy,
10946 		.flags = GENL_ADMIN_PERM,
10947 		.internal_flags = NL80211_FLAG_NEED_NETDEV |
10948 				  NL80211_FLAG_NEED_RTNL,
10949 	},
10950 	{
10951 		.cmd = NL80211_CMD_NEW_INTERFACE,
10952 		.doit = nl80211_new_interface,
10953 		.policy = nl80211_policy,
10954 		.flags = GENL_ADMIN_PERM,
10955 		.internal_flags = NL80211_FLAG_NEED_WIPHY |
10956 				  NL80211_FLAG_NEED_RTNL,
10957 	},
10958 	{
10959 		.cmd = NL80211_CMD_DEL_INTERFACE,
10960 		.doit = nl80211_del_interface,
10961 		.policy = nl80211_policy,
10962 		.flags = GENL_ADMIN_PERM,
10963 		.internal_flags = NL80211_FLAG_NEED_WDEV |
10964 				  NL80211_FLAG_NEED_RTNL,
10965 	},
10966 	{
10967 		.cmd = NL80211_CMD_GET_KEY,
10968 		.doit = nl80211_get_key,
10969 		.policy = nl80211_policy,
10970 		.flags = GENL_ADMIN_PERM,
10971 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
10972 				  NL80211_FLAG_NEED_RTNL,
10973 	},
10974 	{
10975 		.cmd = NL80211_CMD_SET_KEY,
10976 		.doit = nl80211_set_key,
10977 		.policy = nl80211_policy,
10978 		.flags = GENL_ADMIN_PERM,
10979 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
10980 				  NL80211_FLAG_NEED_RTNL |
10981 				  NL80211_FLAG_CLEAR_SKB,
10982 	},
10983 	{
10984 		.cmd = NL80211_CMD_NEW_KEY,
10985 		.doit = nl80211_new_key,
10986 		.policy = nl80211_policy,
10987 		.flags = GENL_ADMIN_PERM,
10988 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
10989 				  NL80211_FLAG_NEED_RTNL |
10990 				  NL80211_FLAG_CLEAR_SKB,
10991 	},
10992 	{
10993 		.cmd = NL80211_CMD_DEL_KEY,
10994 		.doit = nl80211_del_key,
10995 		.policy = nl80211_policy,
10996 		.flags = GENL_ADMIN_PERM,
10997 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
10998 				  NL80211_FLAG_NEED_RTNL,
10999 	},
11000 	{
11001 		.cmd = NL80211_CMD_SET_BEACON,
11002 		.policy = nl80211_policy,
11003 		.flags = GENL_ADMIN_PERM,
11004 		.doit = nl80211_set_beacon,
11005 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11006 				  NL80211_FLAG_NEED_RTNL,
11007 	},
11008 	{
11009 		.cmd = NL80211_CMD_START_AP,
11010 		.policy = nl80211_policy,
11011 		.flags = GENL_ADMIN_PERM,
11012 		.doit = nl80211_start_ap,
11013 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11014 				  NL80211_FLAG_NEED_RTNL,
11015 	},
11016 	{
11017 		.cmd = NL80211_CMD_STOP_AP,
11018 		.policy = nl80211_policy,
11019 		.flags = GENL_ADMIN_PERM,
11020 		.doit = nl80211_stop_ap,
11021 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11022 				  NL80211_FLAG_NEED_RTNL,
11023 	},
11024 	{
11025 		.cmd = NL80211_CMD_GET_STATION,
11026 		.doit = nl80211_get_station,
11027 		.dumpit = nl80211_dump_station,
11028 		.policy = nl80211_policy,
11029 		.internal_flags = NL80211_FLAG_NEED_NETDEV |
11030 				  NL80211_FLAG_NEED_RTNL,
11031 	},
11032 	{
11033 		.cmd = NL80211_CMD_SET_STATION,
11034 		.doit = nl80211_set_station,
11035 		.policy = nl80211_policy,
11036 		.flags = GENL_ADMIN_PERM,
11037 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11038 				  NL80211_FLAG_NEED_RTNL,
11039 	},
11040 	{
11041 		.cmd = NL80211_CMD_NEW_STATION,
11042 		.doit = nl80211_new_station,
11043 		.policy = nl80211_policy,
11044 		.flags = GENL_ADMIN_PERM,
11045 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11046 				  NL80211_FLAG_NEED_RTNL,
11047 	},
11048 	{
11049 		.cmd = NL80211_CMD_DEL_STATION,
11050 		.doit = nl80211_del_station,
11051 		.policy = nl80211_policy,
11052 		.flags = GENL_ADMIN_PERM,
11053 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11054 				  NL80211_FLAG_NEED_RTNL,
11055 	},
11056 	{
11057 		.cmd = NL80211_CMD_GET_MPATH,
11058 		.doit = nl80211_get_mpath,
11059 		.dumpit = nl80211_dump_mpath,
11060 		.policy = nl80211_policy,
11061 		.flags = GENL_ADMIN_PERM,
11062 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11063 				  NL80211_FLAG_NEED_RTNL,
11064 	},
11065 	{
11066 		.cmd = NL80211_CMD_GET_MPP,
11067 		.doit = nl80211_get_mpp,
11068 		.dumpit = nl80211_dump_mpp,
11069 		.policy = nl80211_policy,
11070 		.flags = GENL_ADMIN_PERM,
11071 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11072 				  NL80211_FLAG_NEED_RTNL,
11073 	},
11074 	{
11075 		.cmd = NL80211_CMD_SET_MPATH,
11076 		.doit = nl80211_set_mpath,
11077 		.policy = nl80211_policy,
11078 		.flags = GENL_ADMIN_PERM,
11079 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11080 				  NL80211_FLAG_NEED_RTNL,
11081 	},
11082 	{
11083 		.cmd = NL80211_CMD_NEW_MPATH,
11084 		.doit = nl80211_new_mpath,
11085 		.policy = nl80211_policy,
11086 		.flags = GENL_ADMIN_PERM,
11087 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11088 				  NL80211_FLAG_NEED_RTNL,
11089 	},
11090 	{
11091 		.cmd = NL80211_CMD_DEL_MPATH,
11092 		.doit = nl80211_del_mpath,
11093 		.policy = nl80211_policy,
11094 		.flags = GENL_ADMIN_PERM,
11095 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11096 				  NL80211_FLAG_NEED_RTNL,
11097 	},
11098 	{
11099 		.cmd = NL80211_CMD_SET_BSS,
11100 		.doit = nl80211_set_bss,
11101 		.policy = nl80211_policy,
11102 		.flags = GENL_ADMIN_PERM,
11103 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11104 				  NL80211_FLAG_NEED_RTNL,
11105 	},
11106 	{
11107 		.cmd = NL80211_CMD_GET_REG,
11108 		.doit = nl80211_get_reg_do,
11109 		.dumpit = nl80211_get_reg_dump,
11110 		.policy = nl80211_policy,
11111 		.internal_flags = NL80211_FLAG_NEED_RTNL,
11112 		/* can be retrieved by unprivileged users */
11113 	},
11114 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
11115 	{
11116 		.cmd = NL80211_CMD_SET_REG,
11117 		.doit = nl80211_set_reg,
11118 		.policy = nl80211_policy,
11119 		.flags = GENL_ADMIN_PERM,
11120 		.internal_flags = NL80211_FLAG_NEED_RTNL,
11121 	},
11122 #endif
11123 	{
11124 		.cmd = NL80211_CMD_REQ_SET_REG,
11125 		.doit = nl80211_req_set_reg,
11126 		.policy = nl80211_policy,
11127 		.flags = GENL_ADMIN_PERM,
11128 	},
11129 	{
11130 		.cmd = NL80211_CMD_GET_MESH_CONFIG,
11131 		.doit = nl80211_get_mesh_config,
11132 		.policy = nl80211_policy,
11133 		/* can be retrieved by unprivileged users */
11134 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11135 				  NL80211_FLAG_NEED_RTNL,
11136 	},
11137 	{
11138 		.cmd = NL80211_CMD_SET_MESH_CONFIG,
11139 		.doit = nl80211_update_mesh_config,
11140 		.policy = nl80211_policy,
11141 		.flags = GENL_ADMIN_PERM,
11142 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11143 				  NL80211_FLAG_NEED_RTNL,
11144 	},
11145 	{
11146 		.cmd = NL80211_CMD_TRIGGER_SCAN,
11147 		.doit = nl80211_trigger_scan,
11148 		.policy = nl80211_policy,
11149 		.flags = GENL_ADMIN_PERM,
11150 		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
11151 				  NL80211_FLAG_NEED_RTNL,
11152 	},
11153 	{
11154 		.cmd = NL80211_CMD_ABORT_SCAN,
11155 		.doit = nl80211_abort_scan,
11156 		.policy = nl80211_policy,
11157 		.flags = GENL_ADMIN_PERM,
11158 		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
11159 				  NL80211_FLAG_NEED_RTNL,
11160 	},
11161 	{
11162 		.cmd = NL80211_CMD_GET_SCAN,
11163 		.policy = nl80211_policy,
11164 		.dumpit = nl80211_dump_scan,
11165 	},
11166 	{
11167 		.cmd = NL80211_CMD_START_SCHED_SCAN,
11168 		.doit = nl80211_start_sched_scan,
11169 		.policy = nl80211_policy,
11170 		.flags = GENL_ADMIN_PERM,
11171 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11172 				  NL80211_FLAG_NEED_RTNL,
11173 	},
11174 	{
11175 		.cmd = NL80211_CMD_STOP_SCHED_SCAN,
11176 		.doit = nl80211_stop_sched_scan,
11177 		.policy = nl80211_policy,
11178 		.flags = GENL_ADMIN_PERM,
11179 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11180 				  NL80211_FLAG_NEED_RTNL,
11181 	},
11182 	{
11183 		.cmd = NL80211_CMD_AUTHENTICATE,
11184 		.doit = nl80211_authenticate,
11185 		.policy = nl80211_policy,
11186 		.flags = GENL_ADMIN_PERM,
11187 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11188 				  NL80211_FLAG_NEED_RTNL |
11189 				  NL80211_FLAG_CLEAR_SKB,
11190 	},
11191 	{
11192 		.cmd = NL80211_CMD_ASSOCIATE,
11193 		.doit = nl80211_associate,
11194 		.policy = nl80211_policy,
11195 		.flags = GENL_ADMIN_PERM,
11196 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11197 				  NL80211_FLAG_NEED_RTNL,
11198 	},
11199 	{
11200 		.cmd = NL80211_CMD_DEAUTHENTICATE,
11201 		.doit = nl80211_deauthenticate,
11202 		.policy = nl80211_policy,
11203 		.flags = GENL_ADMIN_PERM,
11204 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11205 				  NL80211_FLAG_NEED_RTNL,
11206 	},
11207 	{
11208 		.cmd = NL80211_CMD_DISASSOCIATE,
11209 		.doit = nl80211_disassociate,
11210 		.policy = nl80211_policy,
11211 		.flags = GENL_ADMIN_PERM,
11212 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11213 				  NL80211_FLAG_NEED_RTNL,
11214 	},
11215 	{
11216 		.cmd = NL80211_CMD_JOIN_IBSS,
11217 		.doit = nl80211_join_ibss,
11218 		.policy = nl80211_policy,
11219 		.flags = GENL_ADMIN_PERM,
11220 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11221 				  NL80211_FLAG_NEED_RTNL,
11222 	},
11223 	{
11224 		.cmd = NL80211_CMD_LEAVE_IBSS,
11225 		.doit = nl80211_leave_ibss,
11226 		.policy = nl80211_policy,
11227 		.flags = GENL_ADMIN_PERM,
11228 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11229 				  NL80211_FLAG_NEED_RTNL,
11230 	},
11231 #ifdef CONFIG_NL80211_TESTMODE
11232 	{
11233 		.cmd = NL80211_CMD_TESTMODE,
11234 		.doit = nl80211_testmode_do,
11235 		.dumpit = nl80211_testmode_dump,
11236 		.policy = nl80211_policy,
11237 		.flags = GENL_ADMIN_PERM,
11238 		.internal_flags = NL80211_FLAG_NEED_WIPHY |
11239 				  NL80211_FLAG_NEED_RTNL,
11240 	},
11241 #endif
11242 	{
11243 		.cmd = NL80211_CMD_CONNECT,
11244 		.doit = nl80211_connect,
11245 		.policy = nl80211_policy,
11246 		.flags = GENL_ADMIN_PERM,
11247 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11248 				  NL80211_FLAG_NEED_RTNL,
11249 	},
11250 	{
11251 		.cmd = NL80211_CMD_DISCONNECT,
11252 		.doit = nl80211_disconnect,
11253 		.policy = nl80211_policy,
11254 		.flags = GENL_ADMIN_PERM,
11255 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11256 				  NL80211_FLAG_NEED_RTNL,
11257 	},
11258 	{
11259 		.cmd = NL80211_CMD_SET_WIPHY_NETNS,
11260 		.doit = nl80211_wiphy_netns,
11261 		.policy = nl80211_policy,
11262 		.flags = GENL_ADMIN_PERM,
11263 		.internal_flags = NL80211_FLAG_NEED_WIPHY |
11264 				  NL80211_FLAG_NEED_RTNL,
11265 	},
11266 	{
11267 		.cmd = NL80211_CMD_GET_SURVEY,
11268 		.policy = nl80211_policy,
11269 		.dumpit = nl80211_dump_survey,
11270 	},
11271 	{
11272 		.cmd = NL80211_CMD_SET_PMKSA,
11273 		.doit = nl80211_setdel_pmksa,
11274 		.policy = nl80211_policy,
11275 		.flags = GENL_ADMIN_PERM,
11276 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11277 				  NL80211_FLAG_NEED_RTNL,
11278 	},
11279 	{
11280 		.cmd = NL80211_CMD_DEL_PMKSA,
11281 		.doit = nl80211_setdel_pmksa,
11282 		.policy = nl80211_policy,
11283 		.flags = GENL_ADMIN_PERM,
11284 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11285 				  NL80211_FLAG_NEED_RTNL,
11286 	},
11287 	{
11288 		.cmd = NL80211_CMD_FLUSH_PMKSA,
11289 		.doit = nl80211_flush_pmksa,
11290 		.policy = nl80211_policy,
11291 		.flags = GENL_ADMIN_PERM,
11292 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11293 				  NL80211_FLAG_NEED_RTNL,
11294 	},
11295 	{
11296 		.cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
11297 		.doit = nl80211_remain_on_channel,
11298 		.policy = nl80211_policy,
11299 		.flags = GENL_ADMIN_PERM,
11300 		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
11301 				  NL80211_FLAG_NEED_RTNL,
11302 	},
11303 	{
11304 		.cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
11305 		.doit = nl80211_cancel_remain_on_channel,
11306 		.policy = nl80211_policy,
11307 		.flags = GENL_ADMIN_PERM,
11308 		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
11309 				  NL80211_FLAG_NEED_RTNL,
11310 	},
11311 	{
11312 		.cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
11313 		.doit = nl80211_set_tx_bitrate_mask,
11314 		.policy = nl80211_policy,
11315 		.flags = GENL_ADMIN_PERM,
11316 		.internal_flags = NL80211_FLAG_NEED_NETDEV |
11317 				  NL80211_FLAG_NEED_RTNL,
11318 	},
11319 	{
11320 		.cmd = NL80211_CMD_REGISTER_FRAME,
11321 		.doit = nl80211_register_mgmt,
11322 		.policy = nl80211_policy,
11323 		.flags = GENL_ADMIN_PERM,
11324 		.internal_flags = NL80211_FLAG_NEED_WDEV |
11325 				  NL80211_FLAG_NEED_RTNL,
11326 	},
11327 	{
11328 		.cmd = NL80211_CMD_FRAME,
11329 		.doit = nl80211_tx_mgmt,
11330 		.policy = nl80211_policy,
11331 		.flags = GENL_ADMIN_PERM,
11332 		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
11333 				  NL80211_FLAG_NEED_RTNL,
11334 	},
11335 	{
11336 		.cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
11337 		.doit = nl80211_tx_mgmt_cancel_wait,
11338 		.policy = nl80211_policy,
11339 		.flags = GENL_ADMIN_PERM,
11340 		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
11341 				  NL80211_FLAG_NEED_RTNL,
11342 	},
11343 	{
11344 		.cmd = NL80211_CMD_SET_POWER_SAVE,
11345 		.doit = nl80211_set_power_save,
11346 		.policy = nl80211_policy,
11347 		.flags = GENL_ADMIN_PERM,
11348 		.internal_flags = NL80211_FLAG_NEED_NETDEV |
11349 				  NL80211_FLAG_NEED_RTNL,
11350 	},
11351 	{
11352 		.cmd = NL80211_CMD_GET_POWER_SAVE,
11353 		.doit = nl80211_get_power_save,
11354 		.policy = nl80211_policy,
11355 		/* can be retrieved by unprivileged users */
11356 		.internal_flags = NL80211_FLAG_NEED_NETDEV |
11357 				  NL80211_FLAG_NEED_RTNL,
11358 	},
11359 	{
11360 		.cmd = NL80211_CMD_SET_CQM,
11361 		.doit = nl80211_set_cqm,
11362 		.policy = nl80211_policy,
11363 		.flags = GENL_ADMIN_PERM,
11364 		.internal_flags = NL80211_FLAG_NEED_NETDEV |
11365 				  NL80211_FLAG_NEED_RTNL,
11366 	},
11367 	{
11368 		.cmd = NL80211_CMD_SET_CHANNEL,
11369 		.doit = nl80211_set_channel,
11370 		.policy = nl80211_policy,
11371 		.flags = GENL_ADMIN_PERM,
11372 		.internal_flags = NL80211_FLAG_NEED_NETDEV |
11373 				  NL80211_FLAG_NEED_RTNL,
11374 	},
11375 	{
11376 		.cmd = NL80211_CMD_SET_WDS_PEER,
11377 		.doit = nl80211_set_wds_peer,
11378 		.policy = nl80211_policy,
11379 		.flags = GENL_ADMIN_PERM,
11380 		.internal_flags = NL80211_FLAG_NEED_NETDEV |
11381 				  NL80211_FLAG_NEED_RTNL,
11382 	},
11383 	{
11384 		.cmd = NL80211_CMD_JOIN_MESH,
11385 		.doit = nl80211_join_mesh,
11386 		.policy = nl80211_policy,
11387 		.flags = GENL_ADMIN_PERM,
11388 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11389 				  NL80211_FLAG_NEED_RTNL,
11390 	},
11391 	{
11392 		.cmd = NL80211_CMD_LEAVE_MESH,
11393 		.doit = nl80211_leave_mesh,
11394 		.policy = nl80211_policy,
11395 		.flags = GENL_ADMIN_PERM,
11396 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11397 				  NL80211_FLAG_NEED_RTNL,
11398 	},
11399 	{
11400 		.cmd = NL80211_CMD_JOIN_OCB,
11401 		.doit = nl80211_join_ocb,
11402 		.policy = nl80211_policy,
11403 		.flags = GENL_ADMIN_PERM,
11404 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11405 				  NL80211_FLAG_NEED_RTNL,
11406 	},
11407 	{
11408 		.cmd = NL80211_CMD_LEAVE_OCB,
11409 		.doit = nl80211_leave_ocb,
11410 		.policy = nl80211_policy,
11411 		.flags = GENL_ADMIN_PERM,
11412 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11413 				  NL80211_FLAG_NEED_RTNL,
11414 	},
11415 #ifdef CONFIG_PM
11416 	{
11417 		.cmd = NL80211_CMD_GET_WOWLAN,
11418 		.doit = nl80211_get_wowlan,
11419 		.policy = nl80211_policy,
11420 		/* can be retrieved by unprivileged users */
11421 		.internal_flags = NL80211_FLAG_NEED_WIPHY |
11422 				  NL80211_FLAG_NEED_RTNL,
11423 	},
11424 	{
11425 		.cmd = NL80211_CMD_SET_WOWLAN,
11426 		.doit = nl80211_set_wowlan,
11427 		.policy = nl80211_policy,
11428 		.flags = GENL_ADMIN_PERM,
11429 		.internal_flags = NL80211_FLAG_NEED_WIPHY |
11430 				  NL80211_FLAG_NEED_RTNL,
11431 	},
11432 #endif
11433 	{
11434 		.cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
11435 		.doit = nl80211_set_rekey_data,
11436 		.policy = nl80211_policy,
11437 		.flags = GENL_ADMIN_PERM,
11438 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11439 				  NL80211_FLAG_NEED_RTNL |
11440 				  NL80211_FLAG_CLEAR_SKB,
11441 	},
11442 	{
11443 		.cmd = NL80211_CMD_TDLS_MGMT,
11444 		.doit = nl80211_tdls_mgmt,
11445 		.policy = nl80211_policy,
11446 		.flags = GENL_ADMIN_PERM,
11447 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11448 				  NL80211_FLAG_NEED_RTNL,
11449 	},
11450 	{
11451 		.cmd = NL80211_CMD_TDLS_OPER,
11452 		.doit = nl80211_tdls_oper,
11453 		.policy = nl80211_policy,
11454 		.flags = GENL_ADMIN_PERM,
11455 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11456 				  NL80211_FLAG_NEED_RTNL,
11457 	},
11458 	{
11459 		.cmd = NL80211_CMD_UNEXPECTED_FRAME,
11460 		.doit = nl80211_register_unexpected_frame,
11461 		.policy = nl80211_policy,
11462 		.flags = GENL_ADMIN_PERM,
11463 		.internal_flags = NL80211_FLAG_NEED_NETDEV |
11464 				  NL80211_FLAG_NEED_RTNL,
11465 	},
11466 	{
11467 		.cmd = NL80211_CMD_PROBE_CLIENT,
11468 		.doit = nl80211_probe_client,
11469 		.policy = nl80211_policy,
11470 		.flags = GENL_ADMIN_PERM,
11471 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11472 				  NL80211_FLAG_NEED_RTNL,
11473 	},
11474 	{
11475 		.cmd = NL80211_CMD_REGISTER_BEACONS,
11476 		.doit = nl80211_register_beacons,
11477 		.policy = nl80211_policy,
11478 		.flags = GENL_ADMIN_PERM,
11479 		.internal_flags = NL80211_FLAG_NEED_WIPHY |
11480 				  NL80211_FLAG_NEED_RTNL,
11481 	},
11482 	{
11483 		.cmd = NL80211_CMD_SET_NOACK_MAP,
11484 		.doit = nl80211_set_noack_map,
11485 		.policy = nl80211_policy,
11486 		.flags = GENL_ADMIN_PERM,
11487 		.internal_flags = NL80211_FLAG_NEED_NETDEV |
11488 				  NL80211_FLAG_NEED_RTNL,
11489 	},
11490 	{
11491 		.cmd = NL80211_CMD_START_P2P_DEVICE,
11492 		.doit = nl80211_start_p2p_device,
11493 		.policy = nl80211_policy,
11494 		.flags = GENL_ADMIN_PERM,
11495 		.internal_flags = NL80211_FLAG_NEED_WDEV |
11496 				  NL80211_FLAG_NEED_RTNL,
11497 	},
11498 	{
11499 		.cmd = NL80211_CMD_STOP_P2P_DEVICE,
11500 		.doit = nl80211_stop_p2p_device,
11501 		.policy = nl80211_policy,
11502 		.flags = GENL_ADMIN_PERM,
11503 		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
11504 				  NL80211_FLAG_NEED_RTNL,
11505 	},
11506 	{
11507 		.cmd = NL80211_CMD_SET_MCAST_RATE,
11508 		.doit = nl80211_set_mcast_rate,
11509 		.policy = nl80211_policy,
11510 		.flags = GENL_ADMIN_PERM,
11511 		.internal_flags = NL80211_FLAG_NEED_NETDEV |
11512 				  NL80211_FLAG_NEED_RTNL,
11513 	},
11514 	{
11515 		.cmd = NL80211_CMD_SET_MAC_ACL,
11516 		.doit = nl80211_set_mac_acl,
11517 		.policy = nl80211_policy,
11518 		.flags = GENL_ADMIN_PERM,
11519 		.internal_flags = NL80211_FLAG_NEED_NETDEV |
11520 				  NL80211_FLAG_NEED_RTNL,
11521 	},
11522 	{
11523 		.cmd = NL80211_CMD_RADAR_DETECT,
11524 		.doit = nl80211_start_radar_detection,
11525 		.policy = nl80211_policy,
11526 		.flags = GENL_ADMIN_PERM,
11527 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11528 				  NL80211_FLAG_NEED_RTNL,
11529 	},
11530 	{
11531 		.cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
11532 		.doit = nl80211_get_protocol_features,
11533 		.policy = nl80211_policy,
11534 	},
11535 	{
11536 		.cmd = NL80211_CMD_UPDATE_FT_IES,
11537 		.doit = nl80211_update_ft_ies,
11538 		.policy = nl80211_policy,
11539 		.flags = GENL_ADMIN_PERM,
11540 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11541 				  NL80211_FLAG_NEED_RTNL,
11542 	},
11543 	{
11544 		.cmd = NL80211_CMD_CRIT_PROTOCOL_START,
11545 		.doit = nl80211_crit_protocol_start,
11546 		.policy = nl80211_policy,
11547 		.flags = GENL_ADMIN_PERM,
11548 		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
11549 				  NL80211_FLAG_NEED_RTNL,
11550 	},
11551 	{
11552 		.cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
11553 		.doit = nl80211_crit_protocol_stop,
11554 		.policy = nl80211_policy,
11555 		.flags = GENL_ADMIN_PERM,
11556 		.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
11557 				  NL80211_FLAG_NEED_RTNL,
11558 	},
11559 	{
11560 		.cmd = NL80211_CMD_GET_COALESCE,
11561 		.doit = nl80211_get_coalesce,
11562 		.policy = nl80211_policy,
11563 		.internal_flags = NL80211_FLAG_NEED_WIPHY |
11564 				  NL80211_FLAG_NEED_RTNL,
11565 	},
11566 	{
11567 		.cmd = NL80211_CMD_SET_COALESCE,
11568 		.doit = nl80211_set_coalesce,
11569 		.policy = nl80211_policy,
11570 		.flags = GENL_ADMIN_PERM,
11571 		.internal_flags = NL80211_FLAG_NEED_WIPHY |
11572 				  NL80211_FLAG_NEED_RTNL,
11573 	},
11574 	{
11575 		.cmd = NL80211_CMD_CHANNEL_SWITCH,
11576 		.doit = nl80211_channel_switch,
11577 		.policy = nl80211_policy,
11578 		.flags = GENL_ADMIN_PERM,
11579 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11580 				  NL80211_FLAG_NEED_RTNL,
11581 	},
11582 	{
11583 		.cmd = NL80211_CMD_VENDOR,
11584 		.doit = nl80211_vendor_cmd,
11585 		.dumpit = nl80211_vendor_cmd_dump,
11586 		.policy = nl80211_policy,
11587 		.flags = GENL_ADMIN_PERM,
11588 		.internal_flags = NL80211_FLAG_NEED_WIPHY |
11589 				  NL80211_FLAG_NEED_RTNL,
11590 	},
11591 	{
11592 		.cmd = NL80211_CMD_SET_QOS_MAP,
11593 		.doit = nl80211_set_qos_map,
11594 		.policy = nl80211_policy,
11595 		.flags = GENL_ADMIN_PERM,
11596 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11597 				  NL80211_FLAG_NEED_RTNL,
11598 	},
11599 	{
11600 		.cmd = NL80211_CMD_ADD_TX_TS,
11601 		.doit = nl80211_add_tx_ts,
11602 		.policy = nl80211_policy,
11603 		.flags = GENL_ADMIN_PERM,
11604 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11605 				  NL80211_FLAG_NEED_RTNL,
11606 	},
11607 	{
11608 		.cmd = NL80211_CMD_DEL_TX_TS,
11609 		.doit = nl80211_del_tx_ts,
11610 		.policy = nl80211_policy,
11611 		.flags = GENL_ADMIN_PERM,
11612 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11613 				  NL80211_FLAG_NEED_RTNL,
11614 	},
11615 	{
11616 		.cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH,
11617 		.doit = nl80211_tdls_channel_switch,
11618 		.policy = nl80211_policy,
11619 		.flags = GENL_ADMIN_PERM,
11620 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11621 				  NL80211_FLAG_NEED_RTNL,
11622 	},
11623 	{
11624 		.cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
11625 		.doit = nl80211_tdls_cancel_channel_switch,
11626 		.policy = nl80211_policy,
11627 		.flags = GENL_ADMIN_PERM,
11628 		.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
11629 				  NL80211_FLAG_NEED_RTNL,
11630 	},
11631 };
11632 
11633 /* notification functions */
11634 
11635 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
11636 			  enum nl80211_commands cmd)
11637 {
11638 	struct sk_buff *msg;
11639 	struct nl80211_dump_wiphy_state state = {};
11640 
11641 	WARN_ON(cmd != NL80211_CMD_NEW_WIPHY &&
11642 		cmd != NL80211_CMD_DEL_WIPHY);
11643 
11644 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11645 	if (!msg)
11646 		return;
11647 
11648 	if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) {
11649 		nlmsg_free(msg);
11650 		return;
11651 	}
11652 
11653 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11654 				NL80211_MCGRP_CONFIG, GFP_KERNEL);
11655 }
11656 
11657 static int nl80211_add_scan_req(struct sk_buff *msg,
11658 				struct cfg80211_registered_device *rdev)
11659 {
11660 	struct cfg80211_scan_request *req = rdev->scan_req;
11661 	struct nlattr *nest;
11662 	int i;
11663 
11664 	if (WARN_ON(!req))
11665 		return 0;
11666 
11667 	nest = nla_nest_start(msg, NL80211_ATTR_SCAN_SSIDS);
11668 	if (!nest)
11669 		goto nla_put_failure;
11670 	for (i = 0; i < req->n_ssids; i++) {
11671 		if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid))
11672 			goto nla_put_failure;
11673 	}
11674 	nla_nest_end(msg, nest);
11675 
11676 	nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
11677 	if (!nest)
11678 		goto nla_put_failure;
11679 	for (i = 0; i < req->n_channels; i++) {
11680 		if (nla_put_u32(msg, i, req->channels[i]->center_freq))
11681 			goto nla_put_failure;
11682 	}
11683 	nla_nest_end(msg, nest);
11684 
11685 	if (req->ie &&
11686 	    nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie))
11687 		goto nla_put_failure;
11688 
11689 	if (req->flags &&
11690 	    nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags))
11691 		goto nla_put_failure;
11692 
11693 	return 0;
11694  nla_put_failure:
11695 	return -ENOBUFS;
11696 }
11697 
11698 static int nl80211_send_scan_msg(struct sk_buff *msg,
11699 				 struct cfg80211_registered_device *rdev,
11700 				 struct wireless_dev *wdev,
11701 				 u32 portid, u32 seq, int flags,
11702 				 u32 cmd)
11703 {
11704 	void *hdr;
11705 
11706 	hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
11707 	if (!hdr)
11708 		return -1;
11709 
11710 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11711 	    (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
11712 					 wdev->netdev->ifindex)) ||
11713 	    nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
11714 		goto nla_put_failure;
11715 
11716 	/* ignore errors and send incomplete event anyway */
11717 	nl80211_add_scan_req(msg, rdev);
11718 
11719 	genlmsg_end(msg, hdr);
11720 	return 0;
11721 
11722  nla_put_failure:
11723 	genlmsg_cancel(msg, hdr);
11724 	return -EMSGSIZE;
11725 }
11726 
11727 static int
11728 nl80211_send_sched_scan_msg(struct sk_buff *msg,
11729 			    struct cfg80211_registered_device *rdev,
11730 			    struct net_device *netdev,
11731 			    u32 portid, u32 seq, int flags, u32 cmd)
11732 {
11733 	void *hdr;
11734 
11735 	hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
11736 	if (!hdr)
11737 		return -1;
11738 
11739 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11740 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
11741 		goto nla_put_failure;
11742 
11743 	genlmsg_end(msg, hdr);
11744 	return 0;
11745 
11746  nla_put_failure:
11747 	genlmsg_cancel(msg, hdr);
11748 	return -EMSGSIZE;
11749 }
11750 
11751 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
11752 			     struct wireless_dev *wdev)
11753 {
11754 	struct sk_buff *msg;
11755 
11756 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11757 	if (!msg)
11758 		return;
11759 
11760 	if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
11761 				  NL80211_CMD_TRIGGER_SCAN) < 0) {
11762 		nlmsg_free(msg);
11763 		return;
11764 	}
11765 
11766 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11767 				NL80211_MCGRP_SCAN, GFP_KERNEL);
11768 }
11769 
11770 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
11771 				       struct wireless_dev *wdev, bool aborted)
11772 {
11773 	struct sk_buff *msg;
11774 
11775 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11776 	if (!msg)
11777 		return NULL;
11778 
11779 	if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
11780 				  aborted ? NL80211_CMD_SCAN_ABORTED :
11781 					    NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
11782 		nlmsg_free(msg);
11783 		return NULL;
11784 	}
11785 
11786 	return msg;
11787 }
11788 
11789 void nl80211_send_scan_result(struct cfg80211_registered_device *rdev,
11790 			      struct sk_buff *msg)
11791 {
11792 	if (!msg)
11793 		return;
11794 
11795 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11796 				NL80211_MCGRP_SCAN, GFP_KERNEL);
11797 }
11798 
11799 void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev,
11800 				     struct net_device *netdev)
11801 {
11802 	struct sk_buff *msg;
11803 
11804 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11805 	if (!msg)
11806 		return;
11807 
11808 	if (nl80211_send_sched_scan_msg(msg, rdev, netdev, 0, 0, 0,
11809 					NL80211_CMD_SCHED_SCAN_RESULTS) < 0) {
11810 		nlmsg_free(msg);
11811 		return;
11812 	}
11813 
11814 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11815 				NL80211_MCGRP_SCAN, GFP_KERNEL);
11816 }
11817 
11818 void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
11819 			     struct net_device *netdev, u32 cmd)
11820 {
11821 	struct sk_buff *msg;
11822 
11823 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11824 	if (!msg)
11825 		return;
11826 
11827 	if (nl80211_send_sched_scan_msg(msg, rdev, netdev, 0, 0, 0, cmd) < 0) {
11828 		nlmsg_free(msg);
11829 		return;
11830 	}
11831 
11832 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11833 				NL80211_MCGRP_SCAN, GFP_KERNEL);
11834 }
11835 
11836 static bool nl80211_reg_change_event_fill(struct sk_buff *msg,
11837 					  struct regulatory_request *request)
11838 {
11839 	/* Userspace can always count this one always being set */
11840 	if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator))
11841 		goto nla_put_failure;
11842 
11843 	if (request->alpha2[0] == '0' && request->alpha2[1] == '0') {
11844 		if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
11845 			       NL80211_REGDOM_TYPE_WORLD))
11846 			goto nla_put_failure;
11847 	} else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') {
11848 		if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
11849 			       NL80211_REGDOM_TYPE_CUSTOM_WORLD))
11850 			goto nla_put_failure;
11851 	} else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
11852 		   request->intersect) {
11853 		if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
11854 			       NL80211_REGDOM_TYPE_INTERSECTION))
11855 			goto nla_put_failure;
11856 	} else {
11857 		if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
11858 			       NL80211_REGDOM_TYPE_COUNTRY) ||
11859 		    nla_put_string(msg, NL80211_ATTR_REG_ALPHA2,
11860 				   request->alpha2))
11861 			goto nla_put_failure;
11862 	}
11863 
11864 	if (request->wiphy_idx != WIPHY_IDX_INVALID) {
11865 		struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx);
11866 
11867 		if (wiphy &&
11868 		    nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx))
11869 			goto nla_put_failure;
11870 
11871 		if (wiphy &&
11872 		    wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
11873 		    nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
11874 			goto nla_put_failure;
11875 	}
11876 
11877 	return true;
11878 
11879 nla_put_failure:
11880 	return false;
11881 }
11882 
11883 /*
11884  * This can happen on global regulatory changes or device specific settings
11885  * based on custom regulatory domains.
11886  */
11887 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id,
11888 				     struct regulatory_request *request)
11889 {
11890 	struct sk_buff *msg;
11891 	void *hdr;
11892 
11893 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11894 	if (!msg)
11895 		return;
11896 
11897 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id);
11898 	if (!hdr) {
11899 		nlmsg_free(msg);
11900 		return;
11901 	}
11902 
11903 	if (nl80211_reg_change_event_fill(msg, request) == false)
11904 		goto nla_put_failure;
11905 
11906 	genlmsg_end(msg, hdr);
11907 
11908 	rcu_read_lock();
11909 	genlmsg_multicast_allns(&nl80211_fam, msg, 0,
11910 				NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
11911 	rcu_read_unlock();
11912 
11913 	return;
11914 
11915 nla_put_failure:
11916 	genlmsg_cancel(msg, hdr);
11917 	nlmsg_free(msg);
11918 }
11919 
11920 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
11921 				    struct net_device *netdev,
11922 				    const u8 *buf, size_t len,
11923 				    enum nl80211_commands cmd, gfp_t gfp,
11924 				    int uapsd_queues)
11925 {
11926 	struct sk_buff *msg;
11927 	void *hdr;
11928 
11929 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11930 	if (!msg)
11931 		return;
11932 
11933 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
11934 	if (!hdr) {
11935 		nlmsg_free(msg);
11936 		return;
11937 	}
11938 
11939 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11940 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
11941 	    nla_put(msg, NL80211_ATTR_FRAME, len, buf))
11942 		goto nla_put_failure;
11943 
11944 	if (uapsd_queues >= 0) {
11945 		struct nlattr *nla_wmm =
11946 			nla_nest_start(msg, NL80211_ATTR_STA_WME);
11947 		if (!nla_wmm)
11948 			goto nla_put_failure;
11949 
11950 		if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES,
11951 			       uapsd_queues))
11952 			goto nla_put_failure;
11953 
11954 		nla_nest_end(msg, nla_wmm);
11955 	}
11956 
11957 	genlmsg_end(msg, hdr);
11958 
11959 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11960 				NL80211_MCGRP_MLME, gfp);
11961 	return;
11962 
11963  nla_put_failure:
11964 	genlmsg_cancel(msg, hdr);
11965 	nlmsg_free(msg);
11966 }
11967 
11968 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
11969 			  struct net_device *netdev, const u8 *buf,
11970 			  size_t len, gfp_t gfp)
11971 {
11972 	nl80211_send_mlme_event(rdev, netdev, buf, len,
11973 				NL80211_CMD_AUTHENTICATE, gfp, -1);
11974 }
11975 
11976 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
11977 			   struct net_device *netdev, const u8 *buf,
11978 			   size_t len, gfp_t gfp, int uapsd_queues)
11979 {
11980 	nl80211_send_mlme_event(rdev, netdev, buf, len,
11981 				NL80211_CMD_ASSOCIATE, gfp, uapsd_queues);
11982 }
11983 
11984 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
11985 			 struct net_device *netdev, const u8 *buf,
11986 			 size_t len, gfp_t gfp)
11987 {
11988 	nl80211_send_mlme_event(rdev, netdev, buf, len,
11989 				NL80211_CMD_DEAUTHENTICATE, gfp, -1);
11990 }
11991 
11992 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
11993 			   struct net_device *netdev, const u8 *buf,
11994 			   size_t len, gfp_t gfp)
11995 {
11996 	nl80211_send_mlme_event(rdev, netdev, buf, len,
11997 				NL80211_CMD_DISASSOCIATE, gfp, -1);
11998 }
11999 
12000 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
12001 				  size_t len)
12002 {
12003 	struct wireless_dev *wdev = dev->ieee80211_ptr;
12004 	struct wiphy *wiphy = wdev->wiphy;
12005 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12006 	const struct ieee80211_mgmt *mgmt = (void *)buf;
12007 	u32 cmd;
12008 
12009 	if (WARN_ON(len < 2))
12010 		return;
12011 
12012 	if (ieee80211_is_deauth(mgmt->frame_control))
12013 		cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE;
12014 	else
12015 		cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
12016 
12017 	trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
12018 	nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1);
12019 }
12020 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
12021 
12022 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
12023 				      struct net_device *netdev, int cmd,
12024 				      const u8 *addr, gfp_t gfp)
12025 {
12026 	struct sk_buff *msg;
12027 	void *hdr;
12028 
12029 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12030 	if (!msg)
12031 		return;
12032 
12033 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
12034 	if (!hdr) {
12035 		nlmsg_free(msg);
12036 		return;
12037 	}
12038 
12039 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12040 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
12041 	    nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
12042 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
12043 		goto nla_put_failure;
12044 
12045 	genlmsg_end(msg, hdr);
12046 
12047 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12048 				NL80211_MCGRP_MLME, gfp);
12049 	return;
12050 
12051  nla_put_failure:
12052 	genlmsg_cancel(msg, hdr);
12053 	nlmsg_free(msg);
12054 }
12055 
12056 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
12057 			       struct net_device *netdev, const u8 *addr,
12058 			       gfp_t gfp)
12059 {
12060 	nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
12061 				  addr, gfp);
12062 }
12063 
12064 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
12065 				struct net_device *netdev, const u8 *addr,
12066 				gfp_t gfp)
12067 {
12068 	nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
12069 				  addr, gfp);
12070 }
12071 
12072 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
12073 				 struct net_device *netdev, const u8 *bssid,
12074 				 const u8 *req_ie, size_t req_ie_len,
12075 				 const u8 *resp_ie, size_t resp_ie_len,
12076 				 u16 status, gfp_t gfp)
12077 {
12078 	struct sk_buff *msg;
12079 	void *hdr;
12080 
12081 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12082 	if (!msg)
12083 		return;
12084 
12085 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
12086 	if (!hdr) {
12087 		nlmsg_free(msg);
12088 		return;
12089 	}
12090 
12091 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12092 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
12093 	    (bssid && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) ||
12094 	    nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, status) ||
12095 	    (req_ie &&
12096 	     nla_put(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie)) ||
12097 	    (resp_ie &&
12098 	     nla_put(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie)))
12099 		goto nla_put_failure;
12100 
12101 	genlmsg_end(msg, hdr);
12102 
12103 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12104 				NL80211_MCGRP_MLME, gfp);
12105 	return;
12106 
12107  nla_put_failure:
12108 	genlmsg_cancel(msg, hdr);
12109 	nlmsg_free(msg);
12110 
12111 }
12112 
12113 void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
12114 			 struct net_device *netdev, const u8 *bssid,
12115 			 const u8 *req_ie, size_t req_ie_len,
12116 			 const u8 *resp_ie, size_t resp_ie_len, gfp_t gfp)
12117 {
12118 	struct sk_buff *msg;
12119 	void *hdr;
12120 
12121 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12122 	if (!msg)
12123 		return;
12124 
12125 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
12126 	if (!hdr) {
12127 		nlmsg_free(msg);
12128 		return;
12129 	}
12130 
12131 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12132 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
12133 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) ||
12134 	    (req_ie &&
12135 	     nla_put(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie)) ||
12136 	    (resp_ie &&
12137 	     nla_put(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie)))
12138 		goto nla_put_failure;
12139 
12140 	genlmsg_end(msg, hdr);
12141 
12142 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12143 				NL80211_MCGRP_MLME, gfp);
12144 	return;
12145 
12146  nla_put_failure:
12147 	genlmsg_cancel(msg, hdr);
12148 	nlmsg_free(msg);
12149 
12150 }
12151 
12152 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
12153 			       struct net_device *netdev, u16 reason,
12154 			       const u8 *ie, size_t ie_len, bool from_ap)
12155 {
12156 	struct sk_buff *msg;
12157 	void *hdr;
12158 
12159 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
12160 	if (!msg)
12161 		return;
12162 
12163 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
12164 	if (!hdr) {
12165 		nlmsg_free(msg);
12166 		return;
12167 	}
12168 
12169 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12170 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
12171 	    (from_ap && reason &&
12172 	     nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) ||
12173 	    (from_ap &&
12174 	     nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) ||
12175 	    (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie)))
12176 		goto nla_put_failure;
12177 
12178 	genlmsg_end(msg, hdr);
12179 
12180 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12181 				NL80211_MCGRP_MLME, GFP_KERNEL);
12182 	return;
12183 
12184  nla_put_failure:
12185 	genlmsg_cancel(msg, hdr);
12186 	nlmsg_free(msg);
12187 
12188 }
12189 
12190 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
12191 			     struct net_device *netdev, const u8 *bssid,
12192 			     gfp_t gfp)
12193 {
12194 	struct sk_buff *msg;
12195 	void *hdr;
12196 
12197 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12198 	if (!msg)
12199 		return;
12200 
12201 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
12202 	if (!hdr) {
12203 		nlmsg_free(msg);
12204 		return;
12205 	}
12206 
12207 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12208 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
12209 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
12210 		goto nla_put_failure;
12211 
12212 	genlmsg_end(msg, hdr);
12213 
12214 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12215 				NL80211_MCGRP_MLME, gfp);
12216 	return;
12217 
12218  nla_put_failure:
12219 	genlmsg_cancel(msg, hdr);
12220 	nlmsg_free(msg);
12221 }
12222 
12223 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
12224 					const u8* ie, u8 ie_len, gfp_t gfp)
12225 {
12226 	struct wireless_dev *wdev = dev->ieee80211_ptr;
12227 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
12228 	struct sk_buff *msg;
12229 	void *hdr;
12230 
12231 	if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
12232 		return;
12233 
12234 	trace_cfg80211_notify_new_peer_candidate(dev, addr);
12235 
12236 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12237 	if (!msg)
12238 		return;
12239 
12240 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
12241 	if (!hdr) {
12242 		nlmsg_free(msg);
12243 		return;
12244 	}
12245 
12246 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12247 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
12248 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
12249 	    (ie_len && ie &&
12250 	     nla_put(msg, NL80211_ATTR_IE, ie_len , ie)))
12251 		goto nla_put_failure;
12252 
12253 	genlmsg_end(msg, hdr);
12254 
12255 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12256 				NL80211_MCGRP_MLME, gfp);
12257 	return;
12258 
12259  nla_put_failure:
12260 	genlmsg_cancel(msg, hdr);
12261 	nlmsg_free(msg);
12262 }
12263 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
12264 
12265 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
12266 				 struct net_device *netdev, const u8 *addr,
12267 				 enum nl80211_key_type key_type, int key_id,
12268 				 const u8 *tsc, gfp_t gfp)
12269 {
12270 	struct sk_buff *msg;
12271 	void *hdr;
12272 
12273 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12274 	if (!msg)
12275 		return;
12276 
12277 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
12278 	if (!hdr) {
12279 		nlmsg_free(msg);
12280 		return;
12281 	}
12282 
12283 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12284 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
12285 	    (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) ||
12286 	    nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) ||
12287 	    (key_id != -1 &&
12288 	     nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) ||
12289 	    (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc)))
12290 		goto nla_put_failure;
12291 
12292 	genlmsg_end(msg, hdr);
12293 
12294 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12295 				NL80211_MCGRP_MLME, gfp);
12296 	return;
12297 
12298  nla_put_failure:
12299 	genlmsg_cancel(msg, hdr);
12300 	nlmsg_free(msg);
12301 }
12302 
12303 void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
12304 				    struct ieee80211_channel *channel_before,
12305 				    struct ieee80211_channel *channel_after)
12306 {
12307 	struct sk_buff *msg;
12308 	void *hdr;
12309 	struct nlattr *nl_freq;
12310 
12311 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
12312 	if (!msg)
12313 		return;
12314 
12315 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
12316 	if (!hdr) {
12317 		nlmsg_free(msg);
12318 		return;
12319 	}
12320 
12321 	/*
12322 	 * Since we are applying the beacon hint to a wiphy we know its
12323 	 * wiphy_idx is valid
12324 	 */
12325 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
12326 		goto nla_put_failure;
12327 
12328 	/* Before */
12329 	nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_BEFORE);
12330 	if (!nl_freq)
12331 		goto nla_put_failure;
12332 	if (nl80211_msg_put_channel(msg, channel_before, false))
12333 		goto nla_put_failure;
12334 	nla_nest_end(msg, nl_freq);
12335 
12336 	/* After */
12337 	nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_AFTER);
12338 	if (!nl_freq)
12339 		goto nla_put_failure;
12340 	if (nl80211_msg_put_channel(msg, channel_after, false))
12341 		goto nla_put_failure;
12342 	nla_nest_end(msg, nl_freq);
12343 
12344 	genlmsg_end(msg, hdr);
12345 
12346 	rcu_read_lock();
12347 	genlmsg_multicast_allns(&nl80211_fam, msg, 0,
12348 				NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
12349 	rcu_read_unlock();
12350 
12351 	return;
12352 
12353 nla_put_failure:
12354 	genlmsg_cancel(msg, hdr);
12355 	nlmsg_free(msg);
12356 }
12357 
12358 static void nl80211_send_remain_on_chan_event(
12359 	int cmd, struct cfg80211_registered_device *rdev,
12360 	struct wireless_dev *wdev, u64 cookie,
12361 	struct ieee80211_channel *chan,
12362 	unsigned int duration, gfp_t gfp)
12363 {
12364 	struct sk_buff *msg;
12365 	void *hdr;
12366 
12367 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12368 	if (!msg)
12369 		return;
12370 
12371 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
12372 	if (!hdr) {
12373 		nlmsg_free(msg);
12374 		return;
12375 	}
12376 
12377 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12378 	    (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
12379 					 wdev->netdev->ifindex)) ||
12380 	    nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
12381 	    nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) ||
12382 	    nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
12383 			NL80211_CHAN_NO_HT) ||
12384 	    nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
12385 		goto nla_put_failure;
12386 
12387 	if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL &&
12388 	    nla_put_u32(msg, NL80211_ATTR_DURATION, duration))
12389 		goto nla_put_failure;
12390 
12391 	genlmsg_end(msg, hdr);
12392 
12393 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12394 				NL80211_MCGRP_MLME, gfp);
12395 	return;
12396 
12397  nla_put_failure:
12398 	genlmsg_cancel(msg, hdr);
12399 	nlmsg_free(msg);
12400 }
12401 
12402 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
12403 			       struct ieee80211_channel *chan,
12404 			       unsigned int duration, gfp_t gfp)
12405 {
12406 	struct wiphy *wiphy = wdev->wiphy;
12407 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12408 
12409 	trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
12410 	nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
12411 					  rdev, wdev, cookie, chan,
12412 					  duration, gfp);
12413 }
12414 EXPORT_SYMBOL(cfg80211_ready_on_channel);
12415 
12416 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
12417 					struct ieee80211_channel *chan,
12418 					gfp_t gfp)
12419 {
12420 	struct wiphy *wiphy = wdev->wiphy;
12421 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12422 
12423 	trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
12424 	nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
12425 					  rdev, wdev, cookie, chan, 0, gfp);
12426 }
12427 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
12428 
12429 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
12430 		      struct station_info *sinfo, gfp_t gfp)
12431 {
12432 	struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
12433 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12434 	struct sk_buff *msg;
12435 
12436 	trace_cfg80211_new_sta(dev, mac_addr, sinfo);
12437 
12438 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12439 	if (!msg)
12440 		return;
12441 
12442 	if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0,
12443 				 rdev, dev, mac_addr, sinfo) < 0) {
12444 		nlmsg_free(msg);
12445 		return;
12446 	}
12447 
12448 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12449 				NL80211_MCGRP_MLME, gfp);
12450 }
12451 EXPORT_SYMBOL(cfg80211_new_sta);
12452 
12453 void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
12454 			    struct station_info *sinfo, gfp_t gfp)
12455 {
12456 	struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
12457 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12458 	struct sk_buff *msg;
12459 	struct station_info empty_sinfo = {};
12460 
12461 	if (!sinfo)
12462 		sinfo = &empty_sinfo;
12463 
12464 	trace_cfg80211_del_sta(dev, mac_addr);
12465 
12466 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12467 	if (!msg)
12468 		return;
12469 
12470 	if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0,
12471 				 rdev, dev, mac_addr, sinfo) < 0) {
12472 		nlmsg_free(msg);
12473 		return;
12474 	}
12475 
12476 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12477 				NL80211_MCGRP_MLME, gfp);
12478 }
12479 EXPORT_SYMBOL(cfg80211_del_sta_sinfo);
12480 
12481 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
12482 			  enum nl80211_connect_failed_reason reason,
12483 			  gfp_t gfp)
12484 {
12485 	struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
12486 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12487 	struct sk_buff *msg;
12488 	void *hdr;
12489 
12490 	msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
12491 	if (!msg)
12492 		return;
12493 
12494 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
12495 	if (!hdr) {
12496 		nlmsg_free(msg);
12497 		return;
12498 	}
12499 
12500 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
12501 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
12502 	    nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
12503 		goto nla_put_failure;
12504 
12505 	genlmsg_end(msg, hdr);
12506 
12507 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12508 				NL80211_MCGRP_MLME, gfp);
12509 	return;
12510 
12511  nla_put_failure:
12512 	genlmsg_cancel(msg, hdr);
12513 	nlmsg_free(msg);
12514 }
12515 EXPORT_SYMBOL(cfg80211_conn_failed);
12516 
12517 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
12518 				       const u8 *addr, gfp_t gfp)
12519 {
12520 	struct wireless_dev *wdev = dev->ieee80211_ptr;
12521 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
12522 	struct sk_buff *msg;
12523 	void *hdr;
12524 	u32 nlportid = ACCESS_ONCE(wdev->ap_unexpected_nlportid);
12525 
12526 	if (!nlportid)
12527 		return false;
12528 
12529 	msg = nlmsg_new(100, gfp);
12530 	if (!msg)
12531 		return true;
12532 
12533 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
12534 	if (!hdr) {
12535 		nlmsg_free(msg);
12536 		return true;
12537 	}
12538 
12539 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12540 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
12541 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
12542 		goto nla_put_failure;
12543 
12544 	genlmsg_end(msg, hdr);
12545 	genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
12546 	return true;
12547 
12548  nla_put_failure:
12549 	genlmsg_cancel(msg, hdr);
12550 	nlmsg_free(msg);
12551 	return true;
12552 }
12553 
12554 bool cfg80211_rx_spurious_frame(struct net_device *dev,
12555 				const u8 *addr, gfp_t gfp)
12556 {
12557 	struct wireless_dev *wdev = dev->ieee80211_ptr;
12558 	bool ret;
12559 
12560 	trace_cfg80211_rx_spurious_frame(dev, addr);
12561 
12562 	if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
12563 		    wdev->iftype != NL80211_IFTYPE_P2P_GO)) {
12564 		trace_cfg80211_return_bool(false);
12565 		return false;
12566 	}
12567 	ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME,
12568 					 addr, gfp);
12569 	trace_cfg80211_return_bool(ret);
12570 	return ret;
12571 }
12572 EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
12573 
12574 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
12575 					const u8 *addr, gfp_t gfp)
12576 {
12577 	struct wireless_dev *wdev = dev->ieee80211_ptr;
12578 	bool ret;
12579 
12580 	trace_cfg80211_rx_unexpected_4addr_frame(dev, addr);
12581 
12582 	if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
12583 		    wdev->iftype != NL80211_IFTYPE_P2P_GO &&
12584 		    wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
12585 		trace_cfg80211_return_bool(false);
12586 		return false;
12587 	}
12588 	ret = __nl80211_unexpected_frame(dev,
12589 					 NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
12590 					 addr, gfp);
12591 	trace_cfg80211_return_bool(ret);
12592 	return ret;
12593 }
12594 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
12595 
12596 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
12597 		      struct wireless_dev *wdev, u32 nlportid,
12598 		      int freq, int sig_dbm,
12599 		      const u8 *buf, size_t len, u32 flags, gfp_t gfp)
12600 {
12601 	struct net_device *netdev = wdev->netdev;
12602 	struct sk_buff *msg;
12603 	void *hdr;
12604 
12605 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12606 	if (!msg)
12607 		return -ENOMEM;
12608 
12609 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
12610 	if (!hdr) {
12611 		nlmsg_free(msg);
12612 		return -ENOMEM;
12613 	}
12614 
12615 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12616 	    (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
12617 					netdev->ifindex)) ||
12618 	    nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
12619 	    nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
12620 	    (sig_dbm &&
12621 	     nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
12622 	    nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
12623 	    (flags &&
12624 	     nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags)))
12625 		goto nla_put_failure;
12626 
12627 	genlmsg_end(msg, hdr);
12628 
12629 	return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
12630 
12631  nla_put_failure:
12632 	genlmsg_cancel(msg, hdr);
12633 	nlmsg_free(msg);
12634 	return -ENOBUFS;
12635 }
12636 
12637 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
12638 			     const u8 *buf, size_t len, bool ack, gfp_t gfp)
12639 {
12640 	struct wiphy *wiphy = wdev->wiphy;
12641 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12642 	struct net_device *netdev = wdev->netdev;
12643 	struct sk_buff *msg;
12644 	void *hdr;
12645 
12646 	trace_cfg80211_mgmt_tx_status(wdev, cookie, ack);
12647 
12648 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12649 	if (!msg)
12650 		return;
12651 
12652 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS);
12653 	if (!hdr) {
12654 		nlmsg_free(msg);
12655 		return;
12656 	}
12657 
12658 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12659 	    (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
12660 				   netdev->ifindex)) ||
12661 	    nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
12662 	    nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
12663 	    nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) ||
12664 	    (ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
12665 		goto nla_put_failure;
12666 
12667 	genlmsg_end(msg, hdr);
12668 
12669 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12670 				NL80211_MCGRP_MLME, gfp);
12671 	return;
12672 
12673  nla_put_failure:
12674 	genlmsg_cancel(msg, hdr);
12675 	nlmsg_free(msg);
12676 }
12677 EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
12678 
12679 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev,
12680 					    const char *mac, gfp_t gfp)
12681 {
12682 	struct wireless_dev *wdev = dev->ieee80211_ptr;
12683 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
12684 	struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12685 	void **cb;
12686 
12687 	if (!msg)
12688 		return NULL;
12689 
12690 	cb = (void **)msg->cb;
12691 
12692 	cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
12693 	if (!cb[0]) {
12694 		nlmsg_free(msg);
12695 		return NULL;
12696 	}
12697 
12698 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12699 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
12700 		goto nla_put_failure;
12701 
12702 	if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
12703 		goto nla_put_failure;
12704 
12705 	cb[1] = nla_nest_start(msg, NL80211_ATTR_CQM);
12706 	if (!cb[1])
12707 		goto nla_put_failure;
12708 
12709 	cb[2] = rdev;
12710 
12711 	return msg;
12712  nla_put_failure:
12713 	nlmsg_free(msg);
12714 	return NULL;
12715 }
12716 
12717 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp)
12718 {
12719 	void **cb = (void **)msg->cb;
12720 	struct cfg80211_registered_device *rdev = cb[2];
12721 
12722 	nla_nest_end(msg, cb[1]);
12723 	genlmsg_end(msg, cb[0]);
12724 
12725 	memset(msg->cb, 0, sizeof(msg->cb));
12726 
12727 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12728 				NL80211_MCGRP_MLME, gfp);
12729 }
12730 
12731 void cfg80211_cqm_rssi_notify(struct net_device *dev,
12732 			      enum nl80211_cqm_rssi_threshold_event rssi_event,
12733 			      gfp_t gfp)
12734 {
12735 	struct sk_buff *msg;
12736 
12737 	trace_cfg80211_cqm_rssi_notify(dev, rssi_event);
12738 
12739 	if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
12740 		    rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
12741 		return;
12742 
12743 	msg = cfg80211_prepare_cqm(dev, NULL, gfp);
12744 	if (!msg)
12745 		return;
12746 
12747 	if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
12748 			rssi_event))
12749 		goto nla_put_failure;
12750 
12751 	cfg80211_send_cqm(msg, gfp);
12752 
12753 	return;
12754 
12755  nla_put_failure:
12756 	nlmsg_free(msg);
12757 }
12758 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
12759 
12760 void cfg80211_cqm_txe_notify(struct net_device *dev,
12761 			     const u8 *peer, u32 num_packets,
12762 			     u32 rate, u32 intvl, gfp_t gfp)
12763 {
12764 	struct sk_buff *msg;
12765 
12766 	msg = cfg80211_prepare_cqm(dev, peer, gfp);
12767 	if (!msg)
12768 		return;
12769 
12770 	if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets))
12771 		goto nla_put_failure;
12772 
12773 	if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate))
12774 		goto nla_put_failure;
12775 
12776 	if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl))
12777 		goto nla_put_failure;
12778 
12779 	cfg80211_send_cqm(msg, gfp);
12780 	return;
12781 
12782  nla_put_failure:
12783 	nlmsg_free(msg);
12784 }
12785 EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
12786 
12787 void cfg80211_cqm_pktloss_notify(struct net_device *dev,
12788 				 const u8 *peer, u32 num_packets, gfp_t gfp)
12789 {
12790 	struct sk_buff *msg;
12791 
12792 	trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
12793 
12794 	msg = cfg80211_prepare_cqm(dev, peer, gfp);
12795 	if (!msg)
12796 		return;
12797 
12798 	if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets))
12799 		goto nla_put_failure;
12800 
12801 	cfg80211_send_cqm(msg, gfp);
12802 	return;
12803 
12804  nla_put_failure:
12805 	nlmsg_free(msg);
12806 }
12807 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
12808 
12809 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp)
12810 {
12811 	struct sk_buff *msg;
12812 
12813 	msg = cfg80211_prepare_cqm(dev, NULL, gfp);
12814 	if (!msg)
12815 		return;
12816 
12817 	if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT))
12818 		goto nla_put_failure;
12819 
12820 	cfg80211_send_cqm(msg, gfp);
12821 	return;
12822 
12823  nla_put_failure:
12824 	nlmsg_free(msg);
12825 }
12826 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify);
12827 
12828 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
12829 				     struct net_device *netdev, const u8 *bssid,
12830 				     const u8 *replay_ctr, gfp_t gfp)
12831 {
12832 	struct sk_buff *msg;
12833 	struct nlattr *rekey_attr;
12834 	void *hdr;
12835 
12836 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12837 	if (!msg)
12838 		return;
12839 
12840 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD);
12841 	if (!hdr) {
12842 		nlmsg_free(msg);
12843 		return;
12844 	}
12845 
12846 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12847 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
12848 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
12849 		goto nla_put_failure;
12850 
12851 	rekey_attr = nla_nest_start(msg, NL80211_ATTR_REKEY_DATA);
12852 	if (!rekey_attr)
12853 		goto nla_put_failure;
12854 
12855 	if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR,
12856 		    NL80211_REPLAY_CTR_LEN, replay_ctr))
12857 		goto nla_put_failure;
12858 
12859 	nla_nest_end(msg, rekey_attr);
12860 
12861 	genlmsg_end(msg, hdr);
12862 
12863 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12864 				NL80211_MCGRP_MLME, gfp);
12865 	return;
12866 
12867  nla_put_failure:
12868 	genlmsg_cancel(msg, hdr);
12869 	nlmsg_free(msg);
12870 }
12871 
12872 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
12873 			       const u8 *replay_ctr, gfp_t gfp)
12874 {
12875 	struct wireless_dev *wdev = dev->ieee80211_ptr;
12876 	struct wiphy *wiphy = wdev->wiphy;
12877 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12878 
12879 	trace_cfg80211_gtk_rekey_notify(dev, bssid);
12880 	nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
12881 }
12882 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
12883 
12884 static void
12885 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
12886 			       struct net_device *netdev, int index,
12887 			       const u8 *bssid, bool preauth, gfp_t gfp)
12888 {
12889 	struct sk_buff *msg;
12890 	struct nlattr *attr;
12891 	void *hdr;
12892 
12893 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12894 	if (!msg)
12895 		return;
12896 
12897 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE);
12898 	if (!hdr) {
12899 		nlmsg_free(msg);
12900 		return;
12901 	}
12902 
12903 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12904 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
12905 		goto nla_put_failure;
12906 
12907 	attr = nla_nest_start(msg, NL80211_ATTR_PMKSA_CANDIDATE);
12908 	if (!attr)
12909 		goto nla_put_failure;
12910 
12911 	if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) ||
12912 	    nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) ||
12913 	    (preauth &&
12914 	     nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH)))
12915 		goto nla_put_failure;
12916 
12917 	nla_nest_end(msg, attr);
12918 
12919 	genlmsg_end(msg, hdr);
12920 
12921 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12922 				NL80211_MCGRP_MLME, gfp);
12923 	return;
12924 
12925  nla_put_failure:
12926 	genlmsg_cancel(msg, hdr);
12927 	nlmsg_free(msg);
12928 }
12929 
12930 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
12931 				     const u8 *bssid, bool preauth, gfp_t gfp)
12932 {
12933 	struct wireless_dev *wdev = dev->ieee80211_ptr;
12934 	struct wiphy *wiphy = wdev->wiphy;
12935 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12936 
12937 	trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
12938 	nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
12939 }
12940 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
12941 
12942 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
12943 				     struct net_device *netdev,
12944 				     struct cfg80211_chan_def *chandef,
12945 				     gfp_t gfp,
12946 				     enum nl80211_commands notif,
12947 				     u8 count)
12948 {
12949 	struct sk_buff *msg;
12950 	void *hdr;
12951 
12952 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12953 	if (!msg)
12954 		return;
12955 
12956 	hdr = nl80211hdr_put(msg, 0, 0, 0, notif);
12957 	if (!hdr) {
12958 		nlmsg_free(msg);
12959 		return;
12960 	}
12961 
12962 	if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
12963 		goto nla_put_failure;
12964 
12965 	if (nl80211_send_chandef(msg, chandef))
12966 		goto nla_put_failure;
12967 
12968 	if ((notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) &&
12969 	    (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)))
12970 			goto nla_put_failure;
12971 
12972 	genlmsg_end(msg, hdr);
12973 
12974 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
12975 				NL80211_MCGRP_MLME, gfp);
12976 	return;
12977 
12978  nla_put_failure:
12979 	genlmsg_cancel(msg, hdr);
12980 	nlmsg_free(msg);
12981 }
12982 
12983 void cfg80211_ch_switch_notify(struct net_device *dev,
12984 			       struct cfg80211_chan_def *chandef)
12985 {
12986 	struct wireless_dev *wdev = dev->ieee80211_ptr;
12987 	struct wiphy *wiphy = wdev->wiphy;
12988 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12989 
12990 	ASSERT_WDEV_LOCK(wdev);
12991 
12992 	trace_cfg80211_ch_switch_notify(dev, chandef);
12993 
12994 	wdev->chandef = *chandef;
12995 	wdev->preset_chandef = *chandef;
12996 	nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
12997 				 NL80211_CMD_CH_SWITCH_NOTIFY, 0);
12998 }
12999 EXPORT_SYMBOL(cfg80211_ch_switch_notify);
13000 
13001 void cfg80211_ch_switch_started_notify(struct net_device *dev,
13002 				       struct cfg80211_chan_def *chandef,
13003 				       u8 count)
13004 {
13005 	struct wireless_dev *wdev = dev->ieee80211_ptr;
13006 	struct wiphy *wiphy = wdev->wiphy;
13007 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
13008 
13009 	trace_cfg80211_ch_switch_started_notify(dev, chandef);
13010 
13011 	nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
13012 				 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, count);
13013 }
13014 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
13015 
13016 void
13017 nl80211_radar_notify(struct cfg80211_registered_device *rdev,
13018 		     const struct cfg80211_chan_def *chandef,
13019 		     enum nl80211_radar_event event,
13020 		     struct net_device *netdev, gfp_t gfp)
13021 {
13022 	struct sk_buff *msg;
13023 	void *hdr;
13024 
13025 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13026 	if (!msg)
13027 		return;
13028 
13029 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT);
13030 	if (!hdr) {
13031 		nlmsg_free(msg);
13032 		return;
13033 	}
13034 
13035 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
13036 		goto nla_put_failure;
13037 
13038 	/* NOP and radar events don't need a netdev parameter */
13039 	if (netdev) {
13040 		struct wireless_dev *wdev = netdev->ieee80211_ptr;
13041 
13042 		if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13043 		    nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
13044 			goto nla_put_failure;
13045 	}
13046 
13047 	if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
13048 		goto nla_put_failure;
13049 
13050 	if (nl80211_send_chandef(msg, chandef))
13051 		goto nla_put_failure;
13052 
13053 	genlmsg_end(msg, hdr);
13054 
13055 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13056 				NL80211_MCGRP_MLME, gfp);
13057 	return;
13058 
13059  nla_put_failure:
13060 	genlmsg_cancel(msg, hdr);
13061 	nlmsg_free(msg);
13062 }
13063 
13064 void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
13065 			   u64 cookie, bool acked, gfp_t gfp)
13066 {
13067 	struct wireless_dev *wdev = dev->ieee80211_ptr;
13068 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
13069 	struct sk_buff *msg;
13070 	void *hdr;
13071 
13072 	trace_cfg80211_probe_status(dev, addr, cookie, acked);
13073 
13074 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13075 
13076 	if (!msg)
13077 		return;
13078 
13079 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT);
13080 	if (!hdr) {
13081 		nlmsg_free(msg);
13082 		return;
13083 	}
13084 
13085 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13086 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
13087 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
13088 	    nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) ||
13089 	    (acked && nla_put_flag(msg, NL80211_ATTR_ACK)))
13090 		goto nla_put_failure;
13091 
13092 	genlmsg_end(msg, hdr);
13093 
13094 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13095 				NL80211_MCGRP_MLME, gfp);
13096 	return;
13097 
13098  nla_put_failure:
13099 	genlmsg_cancel(msg, hdr);
13100 	nlmsg_free(msg);
13101 }
13102 EXPORT_SYMBOL(cfg80211_probe_status);
13103 
13104 void cfg80211_report_obss_beacon(struct wiphy *wiphy,
13105 				 const u8 *frame, size_t len,
13106 				 int freq, int sig_dbm)
13107 {
13108 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
13109 	struct sk_buff *msg;
13110 	void *hdr;
13111 	struct cfg80211_beacon_registration *reg;
13112 
13113 	trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm);
13114 
13115 	spin_lock_bh(&rdev->beacon_registrations_lock);
13116 	list_for_each_entry(reg, &rdev->beacon_registrations, list) {
13117 		msg = nlmsg_new(len + 100, GFP_ATOMIC);
13118 		if (!msg) {
13119 			spin_unlock_bh(&rdev->beacon_registrations_lock);
13120 			return;
13121 		}
13122 
13123 		hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
13124 		if (!hdr)
13125 			goto nla_put_failure;
13126 
13127 		if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13128 		    (freq &&
13129 		     nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq)) ||
13130 		    (sig_dbm &&
13131 		     nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
13132 		    nla_put(msg, NL80211_ATTR_FRAME, len, frame))
13133 			goto nla_put_failure;
13134 
13135 		genlmsg_end(msg, hdr);
13136 
13137 		genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid);
13138 	}
13139 	spin_unlock_bh(&rdev->beacon_registrations_lock);
13140 	return;
13141 
13142  nla_put_failure:
13143 	spin_unlock_bh(&rdev->beacon_registrations_lock);
13144 	if (hdr)
13145 		genlmsg_cancel(msg, hdr);
13146 	nlmsg_free(msg);
13147 }
13148 EXPORT_SYMBOL(cfg80211_report_obss_beacon);
13149 
13150 #ifdef CONFIG_PM
13151 static int cfg80211_net_detect_results(struct sk_buff *msg,
13152 				       struct cfg80211_wowlan_wakeup *wakeup)
13153 {
13154 	struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect;
13155 	struct nlattr *nl_results, *nl_match, *nl_freqs;
13156 	int i, j;
13157 
13158 	nl_results = nla_nest_start(
13159 		msg, NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS);
13160 	if (!nl_results)
13161 		return -EMSGSIZE;
13162 
13163 	for (i = 0; i < nd->n_matches; i++) {
13164 		struct cfg80211_wowlan_nd_match *match = nd->matches[i];
13165 
13166 		nl_match = nla_nest_start(msg, i);
13167 		if (!nl_match)
13168 			break;
13169 
13170 		/* The SSID attribute is optional in nl80211, but for
13171 		 * simplicity reasons it's always present in the
13172 		 * cfg80211 structure.  If a driver can't pass the
13173 		 * SSID, that needs to be changed.  A zero length SSID
13174 		 * is still a valid SSID (wildcard), so it cannot be
13175 		 * used for this purpose.
13176 		 */
13177 		if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len,
13178 			    match->ssid.ssid)) {
13179 			nla_nest_cancel(msg, nl_match);
13180 			goto out;
13181 		}
13182 
13183 		if (match->n_channels) {
13184 			nl_freqs = nla_nest_start(
13185 				msg, NL80211_ATTR_SCAN_FREQUENCIES);
13186 			if (!nl_freqs) {
13187 				nla_nest_cancel(msg, nl_match);
13188 				goto out;
13189 			}
13190 
13191 			for (j = 0; j < match->n_channels; j++) {
13192 				if (nla_put_u32(msg, j, match->channels[j])) {
13193 					nla_nest_cancel(msg, nl_freqs);
13194 					nla_nest_cancel(msg, nl_match);
13195 					goto out;
13196 				}
13197 			}
13198 
13199 			nla_nest_end(msg, nl_freqs);
13200 		}
13201 
13202 		nla_nest_end(msg, nl_match);
13203 	}
13204 
13205 out:
13206 	nla_nest_end(msg, nl_results);
13207 	return 0;
13208 }
13209 
13210 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
13211 				   struct cfg80211_wowlan_wakeup *wakeup,
13212 				   gfp_t gfp)
13213 {
13214 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
13215 	struct sk_buff *msg;
13216 	void *hdr;
13217 	int size = 200;
13218 
13219 	trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup);
13220 
13221 	if (wakeup)
13222 		size += wakeup->packet_present_len;
13223 
13224 	msg = nlmsg_new(size, gfp);
13225 	if (!msg)
13226 		return;
13227 
13228 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN);
13229 	if (!hdr)
13230 		goto free_msg;
13231 
13232 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13233 	    nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
13234 		goto free_msg;
13235 
13236 	if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
13237 					wdev->netdev->ifindex))
13238 		goto free_msg;
13239 
13240 	if (wakeup) {
13241 		struct nlattr *reasons;
13242 
13243 		reasons = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
13244 		if (!reasons)
13245 			goto free_msg;
13246 
13247 		if (wakeup->disconnect &&
13248 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT))
13249 			goto free_msg;
13250 		if (wakeup->magic_pkt &&
13251 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT))
13252 			goto free_msg;
13253 		if (wakeup->gtk_rekey_failure &&
13254 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE))
13255 			goto free_msg;
13256 		if (wakeup->eap_identity_req &&
13257 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST))
13258 			goto free_msg;
13259 		if (wakeup->four_way_handshake &&
13260 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE))
13261 			goto free_msg;
13262 		if (wakeup->rfkill_release &&
13263 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))
13264 			goto free_msg;
13265 
13266 		if (wakeup->pattern_idx >= 0 &&
13267 		    nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
13268 				wakeup->pattern_idx))
13269 			goto free_msg;
13270 
13271 		if (wakeup->tcp_match &&
13272 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH))
13273 			goto free_msg;
13274 
13275 		if (wakeup->tcp_connlost &&
13276 		    nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST))
13277 			goto free_msg;
13278 
13279 		if (wakeup->tcp_nomoretokens &&
13280 		    nla_put_flag(msg,
13281 				 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS))
13282 			goto free_msg;
13283 
13284 		if (wakeup->packet) {
13285 			u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211;
13286 			u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN;
13287 
13288 			if (!wakeup->packet_80211) {
13289 				pkt_attr =
13290 					NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023;
13291 				len_attr =
13292 					NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN;
13293 			}
13294 
13295 			if (wakeup->packet_len &&
13296 			    nla_put_u32(msg, len_attr, wakeup->packet_len))
13297 				goto free_msg;
13298 
13299 			if (nla_put(msg, pkt_attr, wakeup->packet_present_len,
13300 				    wakeup->packet))
13301 				goto free_msg;
13302 		}
13303 
13304 		if (wakeup->net_detect &&
13305 		    cfg80211_net_detect_results(msg, wakeup))
13306 				goto free_msg;
13307 
13308 		nla_nest_end(msg, reasons);
13309 	}
13310 
13311 	genlmsg_end(msg, hdr);
13312 
13313 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13314 				NL80211_MCGRP_MLME, gfp);
13315 	return;
13316 
13317  free_msg:
13318 	nlmsg_free(msg);
13319 }
13320 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup);
13321 #endif
13322 
13323 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
13324 				enum nl80211_tdls_operation oper,
13325 				u16 reason_code, gfp_t gfp)
13326 {
13327 	struct wireless_dev *wdev = dev->ieee80211_ptr;
13328 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
13329 	struct sk_buff *msg;
13330 	void *hdr;
13331 
13332 	trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper,
13333 					 reason_code);
13334 
13335 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13336 	if (!msg)
13337 		return;
13338 
13339 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER);
13340 	if (!hdr) {
13341 		nlmsg_free(msg);
13342 		return;
13343 	}
13344 
13345 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13346 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
13347 	    nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) ||
13348 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) ||
13349 	    (reason_code > 0 &&
13350 	     nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code)))
13351 		goto nla_put_failure;
13352 
13353 	genlmsg_end(msg, hdr);
13354 
13355 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13356 				NL80211_MCGRP_MLME, gfp);
13357 	return;
13358 
13359  nla_put_failure:
13360 	genlmsg_cancel(msg, hdr);
13361 	nlmsg_free(msg);
13362 }
13363 EXPORT_SYMBOL(cfg80211_tdls_oper_request);
13364 
13365 static int nl80211_netlink_notify(struct notifier_block * nb,
13366 				  unsigned long state,
13367 				  void *_notify)
13368 {
13369 	struct netlink_notify *notify = _notify;
13370 	struct cfg80211_registered_device *rdev;
13371 	struct wireless_dev *wdev;
13372 	struct cfg80211_beacon_registration *reg, *tmp;
13373 
13374 	if (state != NETLINK_URELEASE)
13375 		return NOTIFY_DONE;
13376 
13377 	rcu_read_lock();
13378 
13379 	list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
13380 		bool schedule_destroy_work = false;
13381 		bool schedule_scan_stop = false;
13382 		struct cfg80211_sched_scan_request *sched_scan_req =
13383 			rcu_dereference(rdev->sched_scan_req);
13384 
13385 		if (sched_scan_req && notify->portid &&
13386 		    sched_scan_req->owner_nlportid == notify->portid)
13387 			schedule_scan_stop = true;
13388 
13389 		list_for_each_entry_rcu(wdev, &rdev->wdev_list, list) {
13390 			cfg80211_mlme_unregister_socket(wdev, notify->portid);
13391 
13392 			if (wdev->owner_nlportid == notify->portid)
13393 				schedule_destroy_work = true;
13394 		}
13395 
13396 		spin_lock_bh(&rdev->beacon_registrations_lock);
13397 		list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations,
13398 					 list) {
13399 			if (reg->nlportid == notify->portid) {
13400 				list_del(&reg->list);
13401 				kfree(reg);
13402 				break;
13403 			}
13404 		}
13405 		spin_unlock_bh(&rdev->beacon_registrations_lock);
13406 
13407 		if (schedule_destroy_work) {
13408 			struct cfg80211_iface_destroy *destroy;
13409 
13410 			destroy = kzalloc(sizeof(*destroy), GFP_ATOMIC);
13411 			if (destroy) {
13412 				destroy->nlportid = notify->portid;
13413 				spin_lock(&rdev->destroy_list_lock);
13414 				list_add(&destroy->list, &rdev->destroy_list);
13415 				spin_unlock(&rdev->destroy_list_lock);
13416 				schedule_work(&rdev->destroy_work);
13417 			}
13418 		} else if (schedule_scan_stop) {
13419 			sched_scan_req->owner_nlportid = 0;
13420 
13421 			if (rdev->ops->sched_scan_stop &&
13422 			    rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN)
13423 				schedule_work(&rdev->sched_scan_stop_wk);
13424 		}
13425 	}
13426 
13427 	rcu_read_unlock();
13428 
13429 	/*
13430 	 * It is possible that the user space process that is controlling the
13431 	 * indoor setting disappeared, so notify the regulatory core.
13432 	 */
13433 	regulatory_netlink_notify(notify->portid);
13434 	return NOTIFY_OK;
13435 }
13436 
13437 static struct notifier_block nl80211_netlink_notifier = {
13438 	.notifier_call = nl80211_netlink_notify,
13439 };
13440 
13441 void cfg80211_ft_event(struct net_device *netdev,
13442 		       struct cfg80211_ft_event_params *ft_event)
13443 {
13444 	struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
13445 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
13446 	struct sk_buff *msg;
13447 	void *hdr;
13448 
13449 	trace_cfg80211_ft_event(wiphy, netdev, ft_event);
13450 
13451 	if (!ft_event->target_ap)
13452 		return;
13453 
13454 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13455 	if (!msg)
13456 		return;
13457 
13458 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT);
13459 	if (!hdr)
13460 		goto out;
13461 
13462 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13463 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13464 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap))
13465 		goto out;
13466 
13467 	if (ft_event->ies &&
13468 	    nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies))
13469 		goto out;
13470 	if (ft_event->ric_ies &&
13471 	    nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len,
13472 		    ft_event->ric_ies))
13473 		goto out;
13474 
13475 	genlmsg_end(msg, hdr);
13476 
13477 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13478 				NL80211_MCGRP_MLME, GFP_KERNEL);
13479 	return;
13480  out:
13481 	nlmsg_free(msg);
13482 }
13483 EXPORT_SYMBOL(cfg80211_ft_event);
13484 
13485 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp)
13486 {
13487 	struct cfg80211_registered_device *rdev;
13488 	struct sk_buff *msg;
13489 	void *hdr;
13490 	u32 nlportid;
13491 
13492 	rdev = wiphy_to_rdev(wdev->wiphy);
13493 	if (!rdev->crit_proto_nlportid)
13494 		return;
13495 
13496 	nlportid = rdev->crit_proto_nlportid;
13497 	rdev->crit_proto_nlportid = 0;
13498 
13499 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13500 	if (!msg)
13501 		return;
13502 
13503 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP);
13504 	if (!hdr)
13505 		goto nla_put_failure;
13506 
13507 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13508 	    nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
13509 		goto nla_put_failure;
13510 
13511 	genlmsg_end(msg, hdr);
13512 
13513 	genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
13514 	return;
13515 
13516  nla_put_failure:
13517 	if (hdr)
13518 		genlmsg_cancel(msg, hdr);
13519 	nlmsg_free(msg);
13520 
13521 }
13522 EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
13523 
13524 void nl80211_send_ap_stopped(struct wireless_dev *wdev)
13525 {
13526 	struct wiphy *wiphy = wdev->wiphy;
13527 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
13528 	struct sk_buff *msg;
13529 	void *hdr;
13530 
13531 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13532 	if (!msg)
13533 		return;
13534 
13535 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP);
13536 	if (!hdr)
13537 		goto out;
13538 
13539 	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13540 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) ||
13541 	    nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
13542 		goto out;
13543 
13544 	genlmsg_end(msg, hdr);
13545 
13546 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
13547 				NL80211_MCGRP_MLME, GFP_KERNEL);
13548 	return;
13549  out:
13550 	nlmsg_free(msg);
13551 }
13552 
13553 /* initialisation/exit functions */
13554 
13555 int nl80211_init(void)
13556 {
13557 	int err;
13558 
13559 	err = genl_register_family_with_ops_groups(&nl80211_fam, nl80211_ops,
13560 						   nl80211_mcgrps);
13561 	if (err)
13562 		return err;
13563 
13564 	err = netlink_register_notifier(&nl80211_netlink_notifier);
13565 	if (err)
13566 		goto err_out;
13567 
13568 	return 0;
13569  err_out:
13570 	genl_unregister_family(&nl80211_fam);
13571 	return err;
13572 }
13573 
13574 void nl80211_exit(void)
13575 {
13576 	netlink_unregister_notifier(&nl80211_netlink_notifier);
13577 	genl_unregister_family(&nl80211_fam);
13578 }
13579