xref: /linux/net/wireless/nl80211.c (revision 6000fc4d6f3e55ad52cce8d76317187fe01af2aa)
1 /*
2  * This is the new netlink-based wireless configuration interface.
3  *
4  * Copyright 2006-2009	Johannes Berg <johannes@sipsolutions.net>
5  */
6 
7 #include <linux/if.h>
8 #include <linux/module.h>
9 #include <linux/err.h>
10 #include <linux/list.h>
11 #include <linux/if_ether.h>
12 #include <linux/ieee80211.h>
13 #include <linux/nl80211.h>
14 #include <linux/rtnetlink.h>
15 #include <linux/netlink.h>
16 #include <linux/etherdevice.h>
17 #include <net/genetlink.h>
18 #include <net/cfg80211.h>
19 #include "core.h"
20 #include "nl80211.h"
21 #include "reg.h"
22 
23 /* the netlink family */
24 static struct genl_family nl80211_fam = {
25 	.id = GENL_ID_GENERATE,	/* don't bother with a hardcoded ID */
26 	.name = "nl80211",	/* have users key off the name instead */
27 	.hdrsize = 0,		/* no private header */
28 	.version = 1,		/* no particular meaning now */
29 	.maxattr = NL80211_ATTR_MAX,
30 };
31 
32 /* internal helper: get drv and dev */
33 static int get_drv_dev_by_info_ifindex(struct nlattr **attrs,
34 				       struct cfg80211_registered_device **drv,
35 				       struct net_device **dev)
36 {
37 	int ifindex;
38 
39 	if (!attrs[NL80211_ATTR_IFINDEX])
40 		return -EINVAL;
41 
42 	ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
43 	*dev = dev_get_by_index(&init_net, ifindex);
44 	if (!*dev)
45 		return -ENODEV;
46 
47 	*drv = cfg80211_get_dev_from_ifindex(ifindex);
48 	if (IS_ERR(*drv)) {
49 		dev_put(*dev);
50 		return PTR_ERR(*drv);
51 	}
52 
53 	return 0;
54 }
55 
56 /* policy for the attributes */
57 static struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] __read_mostly = {
58 	[NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
59 	[NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
60 				      .len = 20-1 },
61 	[NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED },
62 	[NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 },
63 	[NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 },
64 	[NL80211_ATTR_WIPHY_RETRY_SHORT] = { .type = NLA_U8 },
65 	[NL80211_ATTR_WIPHY_RETRY_LONG] = { .type = NLA_U8 },
66 	[NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 },
67 	[NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 },
68 
69 	[NL80211_ATTR_IFTYPE] = { .type = NLA_U32 },
70 	[NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
71 	[NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
72 
73 	[NL80211_ATTR_MAC] = { .type = NLA_BINARY, .len = ETH_ALEN },
74 
75 	[NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
76 				    .len = WLAN_MAX_KEY_LEN },
77 	[NL80211_ATTR_KEY_IDX] = { .type = NLA_U8 },
78 	[NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 },
79 	[NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG },
80 	[NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 8 },
81 
82 	[NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 },
83 	[NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 },
84 	[NL80211_ATTR_BEACON_HEAD] = { .type = NLA_BINARY,
85 				       .len = IEEE80211_MAX_DATA_LEN },
86 	[NL80211_ATTR_BEACON_TAIL] = { .type = NLA_BINARY,
87 				       .len = IEEE80211_MAX_DATA_LEN },
88 	[NL80211_ATTR_STA_AID] = { .type = NLA_U16 },
89 	[NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED },
90 	[NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 },
91 	[NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY,
92 					       .len = NL80211_MAX_SUPP_RATES },
93 	[NL80211_ATTR_STA_PLINK_ACTION] = { .type = NLA_U8 },
94 	[NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 },
95 	[NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
96 	[NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
97 				.len = IEEE80211_MAX_MESH_ID_LEN },
98 	[NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 },
99 
100 	[NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 },
101 	[NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
102 
103 	[NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
104 	[NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
105 	[NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
106 	[NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY,
107 					   .len = NL80211_MAX_SUPP_RATES },
108 
109 	[NL80211_ATTR_MESH_PARAMS] = { .type = NLA_NESTED },
110 
111 	[NL80211_ATTR_HT_CAPABILITY] = { .type = NLA_BINARY,
112 					 .len = NL80211_HT_CAPABILITY_LEN },
113 
114 	[NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
115 	[NL80211_ATTR_IE] = { .type = NLA_BINARY,
116 			      .len = IEEE80211_MAX_DATA_LEN },
117 	[NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
118 	[NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
119 
120 	[NL80211_ATTR_SSID] = { .type = NLA_BINARY,
121 				.len = IEEE80211_MAX_SSID_LEN },
122 	[NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
123 	[NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
124 	[NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
125 	[NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
126 	[NL80211_ATTR_USE_MFP] = { .type = NLA_U32 },
127 	[NL80211_ATTR_STA_FLAGS2] = {
128 		.len = sizeof(struct nl80211_sta_flag_update),
129 	},
130 	[NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
131 };
132 
133 /* IE validation */
134 static bool is_valid_ie_attr(const struct nlattr *attr)
135 {
136 	const u8 *pos;
137 	int len;
138 
139 	if (!attr)
140 		return true;
141 
142 	pos = nla_data(attr);
143 	len = nla_len(attr);
144 
145 	while (len) {
146 		u8 elemlen;
147 
148 		if (len < 2)
149 			return false;
150 		len -= 2;
151 
152 		elemlen = pos[1];
153 		if (elemlen > len)
154 			return false;
155 
156 		len -= elemlen;
157 		pos += 2 + elemlen;
158 	}
159 
160 	return true;
161 }
162 
163 /* message building helper */
164 static inline void *nl80211hdr_put(struct sk_buff *skb, u32 pid, u32 seq,
165 				   int flags, u8 cmd)
166 {
167 	/* since there is no private header just add the generic one */
168 	return genlmsg_put(skb, pid, seq, &nl80211_fam, flags, cmd);
169 }
170 
171 static int nl80211_msg_put_channel(struct sk_buff *msg,
172 				   struct ieee80211_channel *chan)
173 {
174 	NLA_PUT_U32(msg, NL80211_FREQUENCY_ATTR_FREQ,
175 		    chan->center_freq);
176 
177 	if (chan->flags & IEEE80211_CHAN_DISABLED)
178 		NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_DISABLED);
179 	if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)
180 		NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_PASSIVE_SCAN);
181 	if (chan->flags & IEEE80211_CHAN_NO_IBSS)
182 		NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_NO_IBSS);
183 	if (chan->flags & IEEE80211_CHAN_RADAR)
184 		NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_RADAR);
185 
186 	NLA_PUT_U32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
187 		    DBM_TO_MBM(chan->max_power));
188 
189 	return 0;
190 
191  nla_put_failure:
192 	return -ENOBUFS;
193 }
194 
195 /* netlink command implementations */
196 
197 static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
198 			      struct cfg80211_registered_device *dev)
199 {
200 	void *hdr;
201 	struct nlattr *nl_bands, *nl_band;
202 	struct nlattr *nl_freqs, *nl_freq;
203 	struct nlattr *nl_rates, *nl_rate;
204 	struct nlattr *nl_modes;
205 	struct nlattr *nl_cmds;
206 	enum ieee80211_band band;
207 	struct ieee80211_channel *chan;
208 	struct ieee80211_rate *rate;
209 	int i;
210 	u16 ifmodes = dev->wiphy.interface_modes;
211 
212 	hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_WIPHY);
213 	if (!hdr)
214 		return -1;
215 
216 	NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, dev->wiphy_idx);
217 	NLA_PUT_STRING(msg, NL80211_ATTR_WIPHY_NAME, wiphy_name(&dev->wiphy));
218 
219 	NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
220 		   dev->wiphy.retry_short);
221 	NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
222 		   dev->wiphy.retry_long);
223 	NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
224 		    dev->wiphy.frag_threshold);
225 	NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
226 		    dev->wiphy.rts_threshold);
227 
228 	NLA_PUT_U8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
229 		   dev->wiphy.max_scan_ssids);
230 	NLA_PUT_U16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
231 		    dev->wiphy.max_scan_ie_len);
232 
233 	NLA_PUT(msg, NL80211_ATTR_CIPHER_SUITES,
234 		sizeof(u32) * dev->wiphy.n_cipher_suites,
235 		dev->wiphy.cipher_suites);
236 
237 	nl_modes = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_IFTYPES);
238 	if (!nl_modes)
239 		goto nla_put_failure;
240 
241 	i = 0;
242 	while (ifmodes) {
243 		if (ifmodes & 1)
244 			NLA_PUT_FLAG(msg, i);
245 		ifmodes >>= 1;
246 		i++;
247 	}
248 
249 	nla_nest_end(msg, nl_modes);
250 
251 	nl_bands = nla_nest_start(msg, NL80211_ATTR_WIPHY_BANDS);
252 	if (!nl_bands)
253 		goto nla_put_failure;
254 
255 	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
256 		if (!dev->wiphy.bands[band])
257 			continue;
258 
259 		nl_band = nla_nest_start(msg, band);
260 		if (!nl_band)
261 			goto nla_put_failure;
262 
263 		/* add HT info */
264 		if (dev->wiphy.bands[band]->ht_cap.ht_supported) {
265 			NLA_PUT(msg, NL80211_BAND_ATTR_HT_MCS_SET,
266 				sizeof(dev->wiphy.bands[band]->ht_cap.mcs),
267 				&dev->wiphy.bands[band]->ht_cap.mcs);
268 			NLA_PUT_U16(msg, NL80211_BAND_ATTR_HT_CAPA,
269 				dev->wiphy.bands[band]->ht_cap.cap);
270 			NLA_PUT_U8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
271 				dev->wiphy.bands[band]->ht_cap.ampdu_factor);
272 			NLA_PUT_U8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
273 				dev->wiphy.bands[band]->ht_cap.ampdu_density);
274 		}
275 
276 		/* add frequencies */
277 		nl_freqs = nla_nest_start(msg, NL80211_BAND_ATTR_FREQS);
278 		if (!nl_freqs)
279 			goto nla_put_failure;
280 
281 		for (i = 0; i < dev->wiphy.bands[band]->n_channels; i++) {
282 			nl_freq = nla_nest_start(msg, i);
283 			if (!nl_freq)
284 				goto nla_put_failure;
285 
286 			chan = &dev->wiphy.bands[band]->channels[i];
287 
288 			if (nl80211_msg_put_channel(msg, chan))
289 				goto nla_put_failure;
290 
291 			nla_nest_end(msg, nl_freq);
292 		}
293 
294 		nla_nest_end(msg, nl_freqs);
295 
296 		/* add bitrates */
297 		nl_rates = nla_nest_start(msg, NL80211_BAND_ATTR_RATES);
298 		if (!nl_rates)
299 			goto nla_put_failure;
300 
301 		for (i = 0; i < dev->wiphy.bands[band]->n_bitrates; i++) {
302 			nl_rate = nla_nest_start(msg, i);
303 			if (!nl_rate)
304 				goto nla_put_failure;
305 
306 			rate = &dev->wiphy.bands[band]->bitrates[i];
307 			NLA_PUT_U32(msg, NL80211_BITRATE_ATTR_RATE,
308 				    rate->bitrate);
309 			if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE)
310 				NLA_PUT_FLAG(msg,
311 					NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE);
312 
313 			nla_nest_end(msg, nl_rate);
314 		}
315 
316 		nla_nest_end(msg, nl_rates);
317 
318 		nla_nest_end(msg, nl_band);
319 	}
320 	nla_nest_end(msg, nl_bands);
321 
322 	nl_cmds = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_COMMANDS);
323 	if (!nl_cmds)
324 		goto nla_put_failure;
325 
326 	i = 0;
327 #define CMD(op, n)						\
328 	 do {							\
329 		if (dev->ops->op) {				\
330 			i++;					\
331 			NLA_PUT_U32(msg, i, NL80211_CMD_ ## n);	\
332 		}						\
333 	} while (0)
334 
335 	CMD(add_virtual_intf, NEW_INTERFACE);
336 	CMD(change_virtual_intf, SET_INTERFACE);
337 	CMD(add_key, NEW_KEY);
338 	CMD(add_beacon, NEW_BEACON);
339 	CMD(add_station, NEW_STATION);
340 	CMD(add_mpath, NEW_MPATH);
341 	CMD(set_mesh_params, SET_MESH_PARAMS);
342 	CMD(change_bss, SET_BSS);
343 	CMD(auth, AUTHENTICATE);
344 	CMD(assoc, ASSOCIATE);
345 	CMD(deauth, DEAUTHENTICATE);
346 	CMD(disassoc, DISASSOCIATE);
347 	CMD(join_ibss, JOIN_IBSS);
348 
349 #undef CMD
350 	nla_nest_end(msg, nl_cmds);
351 
352 	return genlmsg_end(msg, hdr);
353 
354  nla_put_failure:
355 	genlmsg_cancel(msg, hdr);
356 	return -EMSGSIZE;
357 }
358 
359 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
360 {
361 	int idx = 0;
362 	int start = cb->args[0];
363 	struct cfg80211_registered_device *dev;
364 
365 	mutex_lock(&cfg80211_mutex);
366 	list_for_each_entry(dev, &cfg80211_drv_list, list) {
367 		if (++idx <= start)
368 			continue;
369 		if (nl80211_send_wiphy(skb, NETLINK_CB(cb->skb).pid,
370 				       cb->nlh->nlmsg_seq, NLM_F_MULTI,
371 				       dev) < 0) {
372 			idx--;
373 			break;
374 		}
375 	}
376 	mutex_unlock(&cfg80211_mutex);
377 
378 	cb->args[0] = idx;
379 
380 	return skb->len;
381 }
382 
383 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
384 {
385 	struct sk_buff *msg;
386 	struct cfg80211_registered_device *dev;
387 
388 	dev = cfg80211_get_dev_from_info(info);
389 	if (IS_ERR(dev))
390 		return PTR_ERR(dev);
391 
392 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
393 	if (!msg)
394 		goto out_err;
395 
396 	if (nl80211_send_wiphy(msg, info->snd_pid, info->snd_seq, 0, dev) < 0)
397 		goto out_free;
398 
399 	cfg80211_put_dev(dev);
400 
401 	return genlmsg_unicast(msg, info->snd_pid);
402 
403  out_free:
404 	nlmsg_free(msg);
405  out_err:
406 	cfg80211_put_dev(dev);
407 	return -ENOBUFS;
408 }
409 
410 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
411 	[NL80211_TXQ_ATTR_QUEUE]		= { .type = NLA_U8 },
412 	[NL80211_TXQ_ATTR_TXOP]			= { .type = NLA_U16 },
413 	[NL80211_TXQ_ATTR_CWMIN]		= { .type = NLA_U16 },
414 	[NL80211_TXQ_ATTR_CWMAX]		= { .type = NLA_U16 },
415 	[NL80211_TXQ_ATTR_AIFS]			= { .type = NLA_U8 },
416 };
417 
418 static int parse_txq_params(struct nlattr *tb[],
419 			    struct ieee80211_txq_params *txq_params)
420 {
421 	if (!tb[NL80211_TXQ_ATTR_QUEUE] || !tb[NL80211_TXQ_ATTR_TXOP] ||
422 	    !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
423 	    !tb[NL80211_TXQ_ATTR_AIFS])
424 		return -EINVAL;
425 
426 	txq_params->queue = nla_get_u8(tb[NL80211_TXQ_ATTR_QUEUE]);
427 	txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
428 	txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
429 	txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
430 	txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
431 
432 	return 0;
433 }
434 
435 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
436 {
437 	struct cfg80211_registered_device *rdev;
438 	int result = 0, rem_txq_params = 0;
439 	struct nlattr *nl_txq_params;
440 	u32 changed;
441 	u8 retry_short = 0, retry_long = 0;
442 	u32 frag_threshold = 0, rts_threshold = 0;
443 
444 	rtnl_lock();
445 
446 	mutex_lock(&cfg80211_mutex);
447 
448 	rdev = __cfg80211_drv_from_info(info);
449 	if (IS_ERR(rdev)) {
450 		mutex_unlock(&cfg80211_mutex);
451 		result = PTR_ERR(rdev);
452 		goto unlock;
453 	}
454 
455 	mutex_lock(&rdev->mtx);
456 
457 	if (info->attrs[NL80211_ATTR_WIPHY_NAME])
458 		result = cfg80211_dev_rename(
459 			rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
460 
461 	mutex_unlock(&cfg80211_mutex);
462 
463 	if (result)
464 		goto bad_res;
465 
466 	if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
467 		struct ieee80211_txq_params txq_params;
468 		struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
469 
470 		if (!rdev->ops->set_txq_params) {
471 			result = -EOPNOTSUPP;
472 			goto bad_res;
473 		}
474 
475 		nla_for_each_nested(nl_txq_params,
476 				    info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
477 				    rem_txq_params) {
478 			nla_parse(tb, NL80211_TXQ_ATTR_MAX,
479 				  nla_data(nl_txq_params),
480 				  nla_len(nl_txq_params),
481 				  txq_params_policy);
482 			result = parse_txq_params(tb, &txq_params);
483 			if (result)
484 				goto bad_res;
485 
486 			result = rdev->ops->set_txq_params(&rdev->wiphy,
487 							   &txq_params);
488 			if (result)
489 				goto bad_res;
490 		}
491 	}
492 
493 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
494 		enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
495 		struct ieee80211_channel *chan;
496 		struct ieee80211_sta_ht_cap *ht_cap;
497 		u32 freq;
498 
499 		if (!rdev->ops->set_channel) {
500 			result = -EOPNOTSUPP;
501 			goto bad_res;
502 		}
503 
504 		result = -EINVAL;
505 
506 		if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
507 			channel_type = nla_get_u32(info->attrs[
508 					   NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
509 			if (channel_type != NL80211_CHAN_NO_HT &&
510 			    channel_type != NL80211_CHAN_HT20 &&
511 			    channel_type != NL80211_CHAN_HT40PLUS &&
512 			    channel_type != NL80211_CHAN_HT40MINUS)
513 				goto bad_res;
514 		}
515 
516 		freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
517 		chan = ieee80211_get_channel(&rdev->wiphy, freq);
518 
519 		/* Primary channel not allowed */
520 		if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
521 			goto bad_res;
522 
523 		if (channel_type == NL80211_CHAN_HT40MINUS &&
524 		    (chan->flags & IEEE80211_CHAN_NO_HT40MINUS))
525 			goto bad_res;
526 		else if (channel_type == NL80211_CHAN_HT40PLUS &&
527 			 (chan->flags & IEEE80211_CHAN_NO_HT40PLUS))
528 			goto bad_res;
529 
530 		/*
531 		 * At this point we know if that if HT40 was requested
532 		 * we are allowed to use it and the extension channel
533 		 * exists.
534 		 */
535 
536 		ht_cap = &rdev->wiphy.bands[chan->band]->ht_cap;
537 
538 		/* no HT capabilities or intolerant */
539 		if (channel_type != NL80211_CHAN_NO_HT) {
540 			if (!ht_cap->ht_supported)
541 				goto bad_res;
542 			if (!(ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) ||
543 			    (ht_cap->cap & IEEE80211_HT_CAP_40MHZ_INTOLERANT))
544 				goto bad_res;
545 		}
546 
547 		result = rdev->ops->set_channel(&rdev->wiphy, chan,
548 						channel_type);
549 		if (result)
550 			goto bad_res;
551 	}
552 
553 	changed = 0;
554 
555 	if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
556 		retry_short = nla_get_u8(
557 			info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
558 		if (retry_short == 0) {
559 			result = -EINVAL;
560 			goto bad_res;
561 		}
562 		changed |= WIPHY_PARAM_RETRY_SHORT;
563 	}
564 
565 	if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
566 		retry_long = nla_get_u8(
567 			info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
568 		if (retry_long == 0) {
569 			result = -EINVAL;
570 			goto bad_res;
571 		}
572 		changed |= WIPHY_PARAM_RETRY_LONG;
573 	}
574 
575 	if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
576 		frag_threshold = nla_get_u32(
577 			info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
578 		if (frag_threshold < 256) {
579 			result = -EINVAL;
580 			goto bad_res;
581 		}
582 		if (frag_threshold != (u32) -1) {
583 			/*
584 			 * Fragments (apart from the last one) are required to
585 			 * have even length. Make the fragmentation code
586 			 * simpler by stripping LSB should someone try to use
587 			 * odd threshold value.
588 			 */
589 			frag_threshold &= ~0x1;
590 		}
591 		changed |= WIPHY_PARAM_FRAG_THRESHOLD;
592 	}
593 
594 	if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
595 		rts_threshold = nla_get_u32(
596 			info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
597 		changed |= WIPHY_PARAM_RTS_THRESHOLD;
598 	}
599 
600 	if (changed) {
601 		u8 old_retry_short, old_retry_long;
602 		u32 old_frag_threshold, old_rts_threshold;
603 
604 		if (!rdev->ops->set_wiphy_params) {
605 			result = -EOPNOTSUPP;
606 			goto bad_res;
607 		}
608 
609 		old_retry_short = rdev->wiphy.retry_short;
610 		old_retry_long = rdev->wiphy.retry_long;
611 		old_frag_threshold = rdev->wiphy.frag_threshold;
612 		old_rts_threshold = rdev->wiphy.rts_threshold;
613 
614 		if (changed & WIPHY_PARAM_RETRY_SHORT)
615 			rdev->wiphy.retry_short = retry_short;
616 		if (changed & WIPHY_PARAM_RETRY_LONG)
617 			rdev->wiphy.retry_long = retry_long;
618 		if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
619 			rdev->wiphy.frag_threshold = frag_threshold;
620 		if (changed & WIPHY_PARAM_RTS_THRESHOLD)
621 			rdev->wiphy.rts_threshold = rts_threshold;
622 
623 		result = rdev->ops->set_wiphy_params(&rdev->wiphy, changed);
624 		if (result) {
625 			rdev->wiphy.retry_short = old_retry_short;
626 			rdev->wiphy.retry_long = old_retry_long;
627 			rdev->wiphy.frag_threshold = old_frag_threshold;
628 			rdev->wiphy.rts_threshold = old_rts_threshold;
629 		}
630 	}
631 
632  bad_res:
633 	mutex_unlock(&rdev->mtx);
634  unlock:
635 	rtnl_unlock();
636 	return result;
637 }
638 
639 
640 static int nl80211_send_iface(struct sk_buff *msg, u32 pid, u32 seq, int flags,
641 			      struct cfg80211_registered_device *rdev,
642 			      struct net_device *dev)
643 {
644 	void *hdr;
645 
646 	hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_INTERFACE);
647 	if (!hdr)
648 		return -1;
649 
650 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
651 	NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
652 	NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, dev->name);
653 	NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, dev->ieee80211_ptr->iftype);
654 	return genlmsg_end(msg, hdr);
655 
656  nla_put_failure:
657 	genlmsg_cancel(msg, hdr);
658 	return -EMSGSIZE;
659 }
660 
661 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
662 {
663 	int wp_idx = 0;
664 	int if_idx = 0;
665 	int wp_start = cb->args[0];
666 	int if_start = cb->args[1];
667 	struct cfg80211_registered_device *dev;
668 	struct wireless_dev *wdev;
669 
670 	mutex_lock(&cfg80211_mutex);
671 	list_for_each_entry(dev, &cfg80211_drv_list, list) {
672 		if (wp_idx < wp_start) {
673 			wp_idx++;
674 			continue;
675 		}
676 		if_idx = 0;
677 
678 		mutex_lock(&dev->devlist_mtx);
679 		list_for_each_entry(wdev, &dev->netdev_list, list) {
680 			if (if_idx < if_start) {
681 				if_idx++;
682 				continue;
683 			}
684 			if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).pid,
685 					       cb->nlh->nlmsg_seq, NLM_F_MULTI,
686 					       dev, wdev->netdev) < 0) {
687 				mutex_unlock(&dev->devlist_mtx);
688 				goto out;
689 			}
690 			if_idx++;
691 		}
692 		mutex_unlock(&dev->devlist_mtx);
693 
694 		wp_idx++;
695 	}
696  out:
697 	mutex_unlock(&cfg80211_mutex);
698 
699 	cb->args[0] = wp_idx;
700 	cb->args[1] = if_idx;
701 
702 	return skb->len;
703 }
704 
705 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
706 {
707 	struct sk_buff *msg;
708 	struct cfg80211_registered_device *dev;
709 	struct net_device *netdev;
710 	int err;
711 
712 	err = get_drv_dev_by_info_ifindex(info->attrs, &dev, &netdev);
713 	if (err)
714 		return err;
715 
716 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
717 	if (!msg)
718 		goto out_err;
719 
720 	if (nl80211_send_iface(msg, info->snd_pid, info->snd_seq, 0,
721 			       dev, netdev) < 0)
722 		goto out_free;
723 
724 	dev_put(netdev);
725 	cfg80211_put_dev(dev);
726 
727 	return genlmsg_unicast(msg, info->snd_pid);
728 
729  out_free:
730 	nlmsg_free(msg);
731  out_err:
732 	dev_put(netdev);
733 	cfg80211_put_dev(dev);
734 	return -ENOBUFS;
735 }
736 
737 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = {
738 	[NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG },
739 	[NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG },
740 	[NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG },
741 	[NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
742 	[NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
743 };
744 
745 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
746 {
747 	struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1];
748 	int flag;
749 
750 	*mntrflags = 0;
751 
752 	if (!nla)
753 		return -EINVAL;
754 
755 	if (nla_parse_nested(flags, NL80211_MNTR_FLAG_MAX,
756 			     nla, mntr_flags_policy))
757 		return -EINVAL;
758 
759 	for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
760 		if (flags[flag])
761 			*mntrflags |= (1<<flag);
762 
763 	return 0;
764 }
765 
766 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
767 {
768 	struct cfg80211_registered_device *drv;
769 	struct vif_params params;
770 	int err, ifindex;
771 	enum nl80211_iftype otype, ntype;
772 	struct net_device *dev;
773 	u32 _flags, *flags = NULL;
774 	bool change = false;
775 
776 	memset(&params, 0, sizeof(params));
777 
778 	rtnl_lock();
779 
780 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
781 	if (err)
782 		goto unlock_rtnl;
783 
784 	ifindex = dev->ifindex;
785 	otype = ntype = dev->ieee80211_ptr->iftype;
786 	dev_put(dev);
787 
788 	if (info->attrs[NL80211_ATTR_IFTYPE]) {
789 		ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
790 		if (otype != ntype)
791 			change = true;
792 		if (ntype > NL80211_IFTYPE_MAX) {
793 			err = -EINVAL;
794 			goto unlock;
795 		}
796 	}
797 
798 	if (!drv->ops->change_virtual_intf ||
799 	    !(drv->wiphy.interface_modes & (1 << ntype))) {
800 		err = -EOPNOTSUPP;
801 		goto unlock;
802 	}
803 
804 	if (info->attrs[NL80211_ATTR_MESH_ID]) {
805 		if (ntype != NL80211_IFTYPE_MESH_POINT) {
806 			err = -EINVAL;
807 			goto unlock;
808 		}
809 		params.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
810 		params.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
811 		change = true;
812 	}
813 
814 	if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
815 		if (ntype != NL80211_IFTYPE_MONITOR) {
816 			err = -EINVAL;
817 			goto unlock;
818 		}
819 		err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
820 					  &_flags);
821 		if (err)
822 			goto unlock;
823 
824 		flags = &_flags;
825 		change = true;
826 	}
827 
828 	if (change)
829 		err = drv->ops->change_virtual_intf(&drv->wiphy, ifindex,
830 						    ntype, flags, &params);
831 	else
832 		err = 0;
833 
834 	dev = __dev_get_by_index(&init_net, ifindex);
835 	WARN_ON(!dev || (!err && dev->ieee80211_ptr->iftype != ntype));
836 
837 	if (dev && !err && (ntype != otype)) {
838 		if (otype == NL80211_IFTYPE_ADHOC)
839 			cfg80211_clear_ibss(dev, false);
840 	}
841 
842  unlock:
843 	cfg80211_put_dev(drv);
844  unlock_rtnl:
845 	rtnl_unlock();
846 	return err;
847 }
848 
849 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
850 {
851 	struct cfg80211_registered_device *drv;
852 	struct vif_params params;
853 	int err;
854 	enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
855 	u32 flags;
856 
857 	memset(&params, 0, sizeof(params));
858 
859 	if (!info->attrs[NL80211_ATTR_IFNAME])
860 		return -EINVAL;
861 
862 	if (info->attrs[NL80211_ATTR_IFTYPE]) {
863 		type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
864 		if (type > NL80211_IFTYPE_MAX)
865 			return -EINVAL;
866 	}
867 
868 	rtnl_lock();
869 
870 	drv = cfg80211_get_dev_from_info(info);
871 	if (IS_ERR(drv)) {
872 		err = PTR_ERR(drv);
873 		goto unlock_rtnl;
874 	}
875 
876 	if (!drv->ops->add_virtual_intf ||
877 	    !(drv->wiphy.interface_modes & (1 << type))) {
878 		err = -EOPNOTSUPP;
879 		goto unlock;
880 	}
881 
882 	if (type == NL80211_IFTYPE_MESH_POINT &&
883 	    info->attrs[NL80211_ATTR_MESH_ID]) {
884 		params.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
885 		params.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
886 	}
887 
888 	err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ?
889 				  info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL,
890 				  &flags);
891 	err = drv->ops->add_virtual_intf(&drv->wiphy,
892 		nla_data(info->attrs[NL80211_ATTR_IFNAME]),
893 		type, err ? NULL : &flags, &params);
894 
895  unlock:
896 	cfg80211_put_dev(drv);
897  unlock_rtnl:
898 	rtnl_unlock();
899 	return err;
900 }
901 
902 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
903 {
904 	struct cfg80211_registered_device *drv;
905 	int ifindex, err;
906 	struct net_device *dev;
907 
908 	rtnl_lock();
909 
910 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
911 	if (err)
912 		goto unlock_rtnl;
913 	ifindex = dev->ifindex;
914 	dev_put(dev);
915 
916 	if (!drv->ops->del_virtual_intf) {
917 		err = -EOPNOTSUPP;
918 		goto out;
919 	}
920 
921 	err = drv->ops->del_virtual_intf(&drv->wiphy, ifindex);
922 
923  out:
924 	cfg80211_put_dev(drv);
925  unlock_rtnl:
926 	rtnl_unlock();
927 	return err;
928 }
929 
930 struct get_key_cookie {
931 	struct sk_buff *msg;
932 	int error;
933 };
934 
935 static void get_key_callback(void *c, struct key_params *params)
936 {
937 	struct get_key_cookie *cookie = c;
938 
939 	if (params->key)
940 		NLA_PUT(cookie->msg, NL80211_ATTR_KEY_DATA,
941 			params->key_len, params->key);
942 
943 	if (params->seq)
944 		NLA_PUT(cookie->msg, NL80211_ATTR_KEY_SEQ,
945 			params->seq_len, params->seq);
946 
947 	if (params->cipher)
948 		NLA_PUT_U32(cookie->msg, NL80211_ATTR_KEY_CIPHER,
949 			    params->cipher);
950 
951 	return;
952  nla_put_failure:
953 	cookie->error = 1;
954 }
955 
956 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
957 {
958 	struct cfg80211_registered_device *drv;
959 	int err;
960 	struct net_device *dev;
961 	u8 key_idx = 0;
962 	u8 *mac_addr = NULL;
963 	struct get_key_cookie cookie = {
964 		.error = 0,
965 	};
966 	void *hdr;
967 	struct sk_buff *msg;
968 
969 	if (info->attrs[NL80211_ATTR_KEY_IDX])
970 		key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
971 
972 	if (key_idx > 5)
973 		return -EINVAL;
974 
975 	if (info->attrs[NL80211_ATTR_MAC])
976 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
977 
978 	rtnl_lock();
979 
980 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
981 	if (err)
982 		goto unlock_rtnl;
983 
984 	if (!drv->ops->get_key) {
985 		err = -EOPNOTSUPP;
986 		goto out;
987 	}
988 
989 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
990 	if (!msg) {
991 		err = -ENOMEM;
992 		goto out;
993 	}
994 
995 	hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
996 			     NL80211_CMD_NEW_KEY);
997 
998 	if (IS_ERR(hdr)) {
999 		err = PTR_ERR(hdr);
1000 		goto free_msg;
1001 	}
1002 
1003 	cookie.msg = msg;
1004 
1005 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
1006 	NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_idx);
1007 	if (mac_addr)
1008 		NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr);
1009 
1010 	err = drv->ops->get_key(&drv->wiphy, dev, key_idx, mac_addr,
1011 				&cookie, get_key_callback);
1012 
1013 	if (err)
1014 		goto free_msg;
1015 
1016 	if (cookie.error)
1017 		goto nla_put_failure;
1018 
1019 	genlmsg_end(msg, hdr);
1020 	err = genlmsg_unicast(msg, info->snd_pid);
1021 	goto out;
1022 
1023  nla_put_failure:
1024 	err = -ENOBUFS;
1025  free_msg:
1026 	nlmsg_free(msg);
1027  out:
1028 	cfg80211_put_dev(drv);
1029 	dev_put(dev);
1030  unlock_rtnl:
1031 	rtnl_unlock();
1032 
1033 	return err;
1034 }
1035 
1036 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
1037 {
1038 	struct cfg80211_registered_device *drv;
1039 	int err;
1040 	struct net_device *dev;
1041 	u8 key_idx;
1042 	int (*func)(struct wiphy *wiphy, struct net_device *netdev,
1043 		    u8 key_index);
1044 
1045 	if (!info->attrs[NL80211_ATTR_KEY_IDX])
1046 		return -EINVAL;
1047 
1048 	key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
1049 
1050 	if (info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]) {
1051 		if (key_idx < 4 || key_idx > 5)
1052 			return -EINVAL;
1053 	} else if (key_idx > 3)
1054 		return -EINVAL;
1055 
1056 	/* currently only support setting default key */
1057 	if (!info->attrs[NL80211_ATTR_KEY_DEFAULT] &&
1058 	    !info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT])
1059 		return -EINVAL;
1060 
1061 	rtnl_lock();
1062 
1063 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
1064 	if (err)
1065 		goto unlock_rtnl;
1066 
1067 	if (info->attrs[NL80211_ATTR_KEY_DEFAULT])
1068 		func = drv->ops->set_default_key;
1069 	else
1070 		func = drv->ops->set_default_mgmt_key;
1071 
1072 	if (!func) {
1073 		err = -EOPNOTSUPP;
1074 		goto out;
1075 	}
1076 
1077 	err = func(&drv->wiphy, dev, key_idx);
1078 #ifdef CONFIG_WIRELESS_EXT
1079 	if (!err) {
1080 		if (func == drv->ops->set_default_key)
1081 			dev->ieee80211_ptr->wext.default_key = key_idx;
1082 		else
1083 			dev->ieee80211_ptr->wext.default_mgmt_key = key_idx;
1084 	}
1085 #endif
1086 
1087  out:
1088 	cfg80211_put_dev(drv);
1089 	dev_put(dev);
1090 
1091  unlock_rtnl:
1092 	rtnl_unlock();
1093 
1094 	return err;
1095 }
1096 
1097 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
1098 {
1099 	struct cfg80211_registered_device *drv;
1100 	int err, i;
1101 	struct net_device *dev;
1102 	struct key_params params;
1103 	u8 key_idx = 0;
1104 	u8 *mac_addr = NULL;
1105 
1106 	memset(&params, 0, sizeof(params));
1107 
1108 	if (!info->attrs[NL80211_ATTR_KEY_CIPHER])
1109 		return -EINVAL;
1110 
1111 	if (info->attrs[NL80211_ATTR_KEY_DATA]) {
1112 		params.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
1113 		params.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
1114 	}
1115 
1116 	if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
1117 		params.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
1118 		params.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
1119 	}
1120 
1121 	if (info->attrs[NL80211_ATTR_KEY_IDX])
1122 		key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
1123 
1124 	params.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
1125 
1126 	if (info->attrs[NL80211_ATTR_MAC])
1127 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
1128 
1129 	if (cfg80211_validate_key_settings(&params, key_idx, mac_addr))
1130 		return -EINVAL;
1131 
1132 	rtnl_lock();
1133 
1134 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
1135 	if (err)
1136 		goto unlock_rtnl;
1137 
1138 	for (i = 0; i < drv->wiphy.n_cipher_suites; i++)
1139 		if (params.cipher == drv->wiphy.cipher_suites[i])
1140 			break;
1141 	if (i == drv->wiphy.n_cipher_suites) {
1142 		err = -EINVAL;
1143 		goto out;
1144 	}
1145 
1146 	if (!drv->ops->add_key) {
1147 		err = -EOPNOTSUPP;
1148 		goto out;
1149 	}
1150 
1151 	err = drv->ops->add_key(&drv->wiphy, dev, key_idx, mac_addr, &params);
1152 
1153  out:
1154 	cfg80211_put_dev(drv);
1155 	dev_put(dev);
1156  unlock_rtnl:
1157 	rtnl_unlock();
1158 
1159 	return err;
1160 }
1161 
1162 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
1163 {
1164 	struct cfg80211_registered_device *drv;
1165 	int err;
1166 	struct net_device *dev;
1167 	u8 key_idx = 0;
1168 	u8 *mac_addr = NULL;
1169 
1170 	if (info->attrs[NL80211_ATTR_KEY_IDX])
1171 		key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
1172 
1173 	if (key_idx > 5)
1174 		return -EINVAL;
1175 
1176 	if (info->attrs[NL80211_ATTR_MAC])
1177 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
1178 
1179 	rtnl_lock();
1180 
1181 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
1182 	if (err)
1183 		goto unlock_rtnl;
1184 
1185 	if (!drv->ops->del_key) {
1186 		err = -EOPNOTSUPP;
1187 		goto out;
1188 	}
1189 
1190 	err = drv->ops->del_key(&drv->wiphy, dev, key_idx, mac_addr);
1191 
1192 #ifdef CONFIG_WIRELESS_EXT
1193 	if (!err) {
1194 		if (key_idx == dev->ieee80211_ptr->wext.default_key)
1195 			dev->ieee80211_ptr->wext.default_key = -1;
1196 		else if (key_idx == dev->ieee80211_ptr->wext.default_mgmt_key)
1197 			dev->ieee80211_ptr->wext.default_mgmt_key = -1;
1198 	}
1199 #endif
1200 
1201  out:
1202 	cfg80211_put_dev(drv);
1203 	dev_put(dev);
1204 
1205  unlock_rtnl:
1206 	rtnl_unlock();
1207 
1208 	return err;
1209 }
1210 
1211 static int nl80211_addset_beacon(struct sk_buff *skb, struct genl_info *info)
1212 {
1213         int (*call)(struct wiphy *wiphy, struct net_device *dev,
1214 		    struct beacon_parameters *info);
1215 	struct cfg80211_registered_device *drv;
1216 	int err;
1217 	struct net_device *dev;
1218 	struct beacon_parameters params;
1219 	int haveinfo = 0;
1220 
1221 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_BEACON_TAIL]))
1222 		return -EINVAL;
1223 
1224 	rtnl_lock();
1225 
1226 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
1227 	if (err)
1228 		goto unlock_rtnl;
1229 
1230 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP) {
1231 		err = -EOPNOTSUPP;
1232 		goto out;
1233 	}
1234 
1235 	switch (info->genlhdr->cmd) {
1236 	case NL80211_CMD_NEW_BEACON:
1237 		/* these are required for NEW_BEACON */
1238 		if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
1239 		    !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
1240 		    !info->attrs[NL80211_ATTR_BEACON_HEAD]) {
1241 			err = -EINVAL;
1242 			goto out;
1243 		}
1244 
1245 		call = drv->ops->add_beacon;
1246 		break;
1247 	case NL80211_CMD_SET_BEACON:
1248 		call = drv->ops->set_beacon;
1249 		break;
1250 	default:
1251 		WARN_ON(1);
1252 		err = -EOPNOTSUPP;
1253 		goto out;
1254 	}
1255 
1256 	if (!call) {
1257 		err = -EOPNOTSUPP;
1258 		goto out;
1259 	}
1260 
1261 	memset(&params, 0, sizeof(params));
1262 
1263 	if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
1264 		params.interval =
1265 		    nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
1266 		haveinfo = 1;
1267 	}
1268 
1269 	if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
1270 		params.dtim_period =
1271 		    nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
1272 		haveinfo = 1;
1273 	}
1274 
1275 	if (info->attrs[NL80211_ATTR_BEACON_HEAD]) {
1276 		params.head = nla_data(info->attrs[NL80211_ATTR_BEACON_HEAD]);
1277 		params.head_len =
1278 		    nla_len(info->attrs[NL80211_ATTR_BEACON_HEAD]);
1279 		haveinfo = 1;
1280 	}
1281 
1282 	if (info->attrs[NL80211_ATTR_BEACON_TAIL]) {
1283 		params.tail = nla_data(info->attrs[NL80211_ATTR_BEACON_TAIL]);
1284 		params.tail_len =
1285 		    nla_len(info->attrs[NL80211_ATTR_BEACON_TAIL]);
1286 		haveinfo = 1;
1287 	}
1288 
1289 	if (!haveinfo) {
1290 		err = -EINVAL;
1291 		goto out;
1292 	}
1293 
1294 	err = call(&drv->wiphy, dev, &params);
1295 
1296  out:
1297 	cfg80211_put_dev(drv);
1298 	dev_put(dev);
1299  unlock_rtnl:
1300 	rtnl_unlock();
1301 
1302 	return err;
1303 }
1304 
1305 static int nl80211_del_beacon(struct sk_buff *skb, struct genl_info *info)
1306 {
1307 	struct cfg80211_registered_device *drv;
1308 	int err;
1309 	struct net_device *dev;
1310 
1311 	rtnl_lock();
1312 
1313 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
1314 	if (err)
1315 		goto unlock_rtnl;
1316 
1317 	if (!drv->ops->del_beacon) {
1318 		err = -EOPNOTSUPP;
1319 		goto out;
1320 	}
1321 
1322 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP) {
1323 		err = -EOPNOTSUPP;
1324 		goto out;
1325 	}
1326 	err = drv->ops->del_beacon(&drv->wiphy, dev);
1327 
1328  out:
1329 	cfg80211_put_dev(drv);
1330 	dev_put(dev);
1331  unlock_rtnl:
1332 	rtnl_unlock();
1333 
1334 	return err;
1335 }
1336 
1337 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
1338 	[NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG },
1339 	[NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
1340 	[NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
1341 	[NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
1342 };
1343 
1344 static int parse_station_flags(struct genl_info *info,
1345 			       struct station_parameters *params)
1346 {
1347 	struct nlattr *flags[NL80211_STA_FLAG_MAX + 1];
1348 	struct nlattr *nla;
1349 	int flag;
1350 
1351 	/*
1352 	 * Try parsing the new attribute first so userspace
1353 	 * can specify both for older kernels.
1354 	 */
1355 	nla = info->attrs[NL80211_ATTR_STA_FLAGS2];
1356 	if (nla) {
1357 		struct nl80211_sta_flag_update *sta_flags;
1358 
1359 		sta_flags = nla_data(nla);
1360 		params->sta_flags_mask = sta_flags->mask;
1361 		params->sta_flags_set = sta_flags->set;
1362 		if ((params->sta_flags_mask |
1363 		     params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID))
1364 			return -EINVAL;
1365 		return 0;
1366 	}
1367 
1368 	/* if present, parse the old attribute */
1369 
1370 	nla = info->attrs[NL80211_ATTR_STA_FLAGS];
1371 	if (!nla)
1372 		return 0;
1373 
1374 	if (nla_parse_nested(flags, NL80211_STA_FLAG_MAX,
1375 			     nla, sta_flags_policy))
1376 		return -EINVAL;
1377 
1378 	params->sta_flags_mask = (1 << __NL80211_STA_FLAG_AFTER_LAST) - 1;
1379 	params->sta_flags_mask &= ~1;
1380 
1381 	for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++)
1382 		if (flags[flag])
1383 			params->sta_flags_set |= (1<<flag);
1384 
1385 	return 0;
1386 }
1387 
1388 static u16 nl80211_calculate_bitrate(struct rate_info *rate)
1389 {
1390 	int modulation, streams, bitrate;
1391 
1392 	if (!(rate->flags & RATE_INFO_FLAGS_MCS))
1393 		return rate->legacy;
1394 
1395 	/* the formula below does only work for MCS values smaller than 32 */
1396 	if (rate->mcs >= 32)
1397 		return 0;
1398 
1399 	modulation = rate->mcs & 7;
1400 	streams = (rate->mcs >> 3) + 1;
1401 
1402 	bitrate = (rate->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) ?
1403 			13500000 : 6500000;
1404 
1405 	if (modulation < 4)
1406 		bitrate *= (modulation + 1);
1407 	else if (modulation == 4)
1408 		bitrate *= (modulation + 2);
1409 	else
1410 		bitrate *= (modulation + 3);
1411 
1412 	bitrate *= streams;
1413 
1414 	if (rate->flags & RATE_INFO_FLAGS_SHORT_GI)
1415 		bitrate = (bitrate / 9) * 10;
1416 
1417 	/* do NOT round down here */
1418 	return (bitrate + 50000) / 100000;
1419 }
1420 
1421 static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
1422 				int flags, struct net_device *dev,
1423 				u8 *mac_addr, struct station_info *sinfo)
1424 {
1425 	void *hdr;
1426 	struct nlattr *sinfoattr, *txrate;
1427 	u16 bitrate;
1428 
1429 	hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_STATION);
1430 	if (!hdr)
1431 		return -1;
1432 
1433 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
1434 	NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr);
1435 
1436 	sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO);
1437 	if (!sinfoattr)
1438 		goto nla_put_failure;
1439 	if (sinfo->filled & STATION_INFO_INACTIVE_TIME)
1440 		NLA_PUT_U32(msg, NL80211_STA_INFO_INACTIVE_TIME,
1441 			    sinfo->inactive_time);
1442 	if (sinfo->filled & STATION_INFO_RX_BYTES)
1443 		NLA_PUT_U32(msg, NL80211_STA_INFO_RX_BYTES,
1444 			    sinfo->rx_bytes);
1445 	if (sinfo->filled & STATION_INFO_TX_BYTES)
1446 		NLA_PUT_U32(msg, NL80211_STA_INFO_TX_BYTES,
1447 			    sinfo->tx_bytes);
1448 	if (sinfo->filled & STATION_INFO_LLID)
1449 		NLA_PUT_U16(msg, NL80211_STA_INFO_LLID,
1450 			    sinfo->llid);
1451 	if (sinfo->filled & STATION_INFO_PLID)
1452 		NLA_PUT_U16(msg, NL80211_STA_INFO_PLID,
1453 			    sinfo->plid);
1454 	if (sinfo->filled & STATION_INFO_PLINK_STATE)
1455 		NLA_PUT_U8(msg, NL80211_STA_INFO_PLINK_STATE,
1456 			    sinfo->plink_state);
1457 	if (sinfo->filled & STATION_INFO_SIGNAL)
1458 		NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL,
1459 			   sinfo->signal);
1460 	if (sinfo->filled & STATION_INFO_TX_BITRATE) {
1461 		txrate = nla_nest_start(msg, NL80211_STA_INFO_TX_BITRATE);
1462 		if (!txrate)
1463 			goto nla_put_failure;
1464 
1465 		/* nl80211_calculate_bitrate will return 0 for mcs >= 32 */
1466 		bitrate = nl80211_calculate_bitrate(&sinfo->txrate);
1467 		if (bitrate > 0)
1468 			NLA_PUT_U16(msg, NL80211_RATE_INFO_BITRATE, bitrate);
1469 
1470 		if (sinfo->txrate.flags & RATE_INFO_FLAGS_MCS)
1471 			NLA_PUT_U8(msg, NL80211_RATE_INFO_MCS,
1472 				    sinfo->txrate.mcs);
1473 		if (sinfo->txrate.flags & RATE_INFO_FLAGS_40_MHZ_WIDTH)
1474 			NLA_PUT_FLAG(msg, NL80211_RATE_INFO_40_MHZ_WIDTH);
1475 		if (sinfo->txrate.flags & RATE_INFO_FLAGS_SHORT_GI)
1476 			NLA_PUT_FLAG(msg, NL80211_RATE_INFO_SHORT_GI);
1477 
1478 		nla_nest_end(msg, txrate);
1479 	}
1480 	if (sinfo->filled & STATION_INFO_RX_PACKETS)
1481 		NLA_PUT_U32(msg, NL80211_STA_INFO_RX_PACKETS,
1482 			    sinfo->rx_packets);
1483 	if (sinfo->filled & STATION_INFO_TX_PACKETS)
1484 		NLA_PUT_U32(msg, NL80211_STA_INFO_TX_PACKETS,
1485 			    sinfo->tx_packets);
1486 	nla_nest_end(msg, sinfoattr);
1487 
1488 	return genlmsg_end(msg, hdr);
1489 
1490  nla_put_failure:
1491 	genlmsg_cancel(msg, hdr);
1492 	return -EMSGSIZE;
1493 }
1494 
1495 static int nl80211_dump_station(struct sk_buff *skb,
1496 				struct netlink_callback *cb)
1497 {
1498 	struct station_info sinfo;
1499 	struct cfg80211_registered_device *dev;
1500 	struct net_device *netdev;
1501 	u8 mac_addr[ETH_ALEN];
1502 	int ifidx = cb->args[0];
1503 	int sta_idx = cb->args[1];
1504 	int err;
1505 
1506 	if (!ifidx) {
1507 		err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
1508 				  nl80211_fam.attrbuf, nl80211_fam.maxattr,
1509 				  nl80211_policy);
1510 		if (err)
1511 			return err;
1512 
1513 		if (!nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX])
1514 			return -EINVAL;
1515 
1516 		ifidx = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX]);
1517 		if (!ifidx)
1518 			return -EINVAL;
1519 	}
1520 
1521 	rtnl_lock();
1522 
1523 	netdev = __dev_get_by_index(&init_net, ifidx);
1524 	if (!netdev) {
1525 		err = -ENODEV;
1526 		goto out_rtnl;
1527 	}
1528 
1529 	dev = cfg80211_get_dev_from_ifindex(ifidx);
1530 	if (IS_ERR(dev)) {
1531 		err = PTR_ERR(dev);
1532 		goto out_rtnl;
1533 	}
1534 
1535 	if (!dev->ops->dump_station) {
1536 		err = -EOPNOTSUPP;
1537 		goto out_err;
1538 	}
1539 
1540 	while (1) {
1541 		err = dev->ops->dump_station(&dev->wiphy, netdev, sta_idx,
1542 					     mac_addr, &sinfo);
1543 		if (err == -ENOENT)
1544 			break;
1545 		if (err)
1546 			goto out_err;
1547 
1548 		if (nl80211_send_station(skb,
1549 				NETLINK_CB(cb->skb).pid,
1550 				cb->nlh->nlmsg_seq, NLM_F_MULTI,
1551 				netdev, mac_addr,
1552 				&sinfo) < 0)
1553 			goto out;
1554 
1555 		sta_idx++;
1556 	}
1557 
1558 
1559  out:
1560 	cb->args[1] = sta_idx;
1561 	err = skb->len;
1562  out_err:
1563 	cfg80211_put_dev(dev);
1564  out_rtnl:
1565 	rtnl_unlock();
1566 
1567 	return err;
1568 }
1569 
1570 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
1571 {
1572 	struct cfg80211_registered_device *drv;
1573 	int err;
1574 	struct net_device *dev;
1575 	struct station_info sinfo;
1576 	struct sk_buff *msg;
1577 	u8 *mac_addr = NULL;
1578 
1579 	memset(&sinfo, 0, sizeof(sinfo));
1580 
1581 	if (!info->attrs[NL80211_ATTR_MAC])
1582 		return -EINVAL;
1583 
1584 	mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
1585 
1586 	rtnl_lock();
1587 
1588 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
1589 	if (err)
1590 		goto out_rtnl;
1591 
1592 	if (!drv->ops->get_station) {
1593 		err = -EOPNOTSUPP;
1594 		goto out;
1595 	}
1596 
1597 	err = drv->ops->get_station(&drv->wiphy, dev, mac_addr, &sinfo);
1598 	if (err)
1599 		goto out;
1600 
1601 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
1602 	if (!msg)
1603 		goto out;
1604 
1605 	if (nl80211_send_station(msg, info->snd_pid, info->snd_seq, 0,
1606 				 dev, mac_addr, &sinfo) < 0)
1607 		goto out_free;
1608 
1609 	err = genlmsg_unicast(msg, info->snd_pid);
1610 	goto out;
1611 
1612  out_free:
1613 	nlmsg_free(msg);
1614  out:
1615 	cfg80211_put_dev(drv);
1616 	dev_put(dev);
1617  out_rtnl:
1618 	rtnl_unlock();
1619 
1620 	return err;
1621 }
1622 
1623 /*
1624  * Get vlan interface making sure it is on the right wiphy.
1625  */
1626 static int get_vlan(struct nlattr *vlanattr,
1627 		    struct cfg80211_registered_device *rdev,
1628 		    struct net_device **vlan)
1629 {
1630 	*vlan = NULL;
1631 
1632 	if (vlanattr) {
1633 		*vlan = dev_get_by_index(&init_net, nla_get_u32(vlanattr));
1634 		if (!*vlan)
1635 			return -ENODEV;
1636 		if (!(*vlan)->ieee80211_ptr)
1637 			return -EINVAL;
1638 		if ((*vlan)->ieee80211_ptr->wiphy != &rdev->wiphy)
1639 			return -EINVAL;
1640 	}
1641 	return 0;
1642 }
1643 
1644 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
1645 {
1646 	struct cfg80211_registered_device *drv;
1647 	int err;
1648 	struct net_device *dev;
1649 	struct station_parameters params;
1650 	u8 *mac_addr = NULL;
1651 
1652 	memset(&params, 0, sizeof(params));
1653 
1654 	params.listen_interval = -1;
1655 
1656 	if (info->attrs[NL80211_ATTR_STA_AID])
1657 		return -EINVAL;
1658 
1659 	if (!info->attrs[NL80211_ATTR_MAC])
1660 		return -EINVAL;
1661 
1662 	mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
1663 
1664 	if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
1665 		params.supported_rates =
1666 			nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
1667 		params.supported_rates_len =
1668 			nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
1669 	}
1670 
1671 	if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
1672 		params.listen_interval =
1673 		    nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
1674 
1675 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
1676 		params.ht_capa =
1677 			nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
1678 
1679 	if (parse_station_flags(info, &params))
1680 		return -EINVAL;
1681 
1682 	if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
1683 		params.plink_action =
1684 		    nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
1685 
1686 	rtnl_lock();
1687 
1688 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
1689 	if (err)
1690 		goto out_rtnl;
1691 
1692 	err = get_vlan(info->attrs[NL80211_ATTR_STA_VLAN], drv, &params.vlan);
1693 	if (err)
1694 		goto out;
1695 
1696 	/* validate settings */
1697 	err = 0;
1698 
1699 	switch (dev->ieee80211_ptr->iftype) {
1700 	case NL80211_IFTYPE_AP:
1701 	case NL80211_IFTYPE_AP_VLAN:
1702 		/* disallow mesh-specific things */
1703 		if (params.plink_action)
1704 			err = -EINVAL;
1705 		break;
1706 	case NL80211_IFTYPE_STATION:
1707 		/* disallow everything but AUTHORIZED flag */
1708 		if (params.plink_action)
1709 			err = -EINVAL;
1710 		if (params.vlan)
1711 			err = -EINVAL;
1712 		if (params.supported_rates)
1713 			err = -EINVAL;
1714 		if (params.ht_capa)
1715 			err = -EINVAL;
1716 		if (params.listen_interval >= 0)
1717 			err = -EINVAL;
1718 		if (params.sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
1719 			err = -EINVAL;
1720 		break;
1721 	case NL80211_IFTYPE_MESH_POINT:
1722 		/* disallow things mesh doesn't support */
1723 		if (params.vlan)
1724 			err = -EINVAL;
1725 		if (params.ht_capa)
1726 			err = -EINVAL;
1727 		if (params.listen_interval >= 0)
1728 			err = -EINVAL;
1729 		if (params.supported_rates)
1730 			err = -EINVAL;
1731 		if (params.sta_flags_mask)
1732 			err = -EINVAL;
1733 		break;
1734 	default:
1735 		err = -EINVAL;
1736 	}
1737 
1738 	if (err)
1739 		goto out;
1740 
1741 	if (!drv->ops->change_station) {
1742 		err = -EOPNOTSUPP;
1743 		goto out;
1744 	}
1745 
1746 	err = drv->ops->change_station(&drv->wiphy, dev, mac_addr, &params);
1747 
1748  out:
1749 	if (params.vlan)
1750 		dev_put(params.vlan);
1751 	cfg80211_put_dev(drv);
1752 	dev_put(dev);
1753  out_rtnl:
1754 	rtnl_unlock();
1755 
1756 	return err;
1757 }
1758 
1759 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
1760 {
1761 	struct cfg80211_registered_device *drv;
1762 	int err;
1763 	struct net_device *dev;
1764 	struct station_parameters params;
1765 	u8 *mac_addr = NULL;
1766 
1767 	memset(&params, 0, sizeof(params));
1768 
1769 	if (!info->attrs[NL80211_ATTR_MAC])
1770 		return -EINVAL;
1771 
1772 	if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
1773 		return -EINVAL;
1774 
1775 	if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
1776 		return -EINVAL;
1777 
1778 	mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
1779 	params.supported_rates =
1780 		nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
1781 	params.supported_rates_len =
1782 		nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
1783 	params.listen_interval =
1784 		nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
1785 
1786 	if (info->attrs[NL80211_ATTR_STA_AID]) {
1787 		params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
1788 		if (!params.aid || params.aid > IEEE80211_MAX_AID)
1789 			return -EINVAL;
1790 	}
1791 
1792 	if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
1793 		params.ht_capa =
1794 			nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
1795 
1796 	if (parse_station_flags(info, &params))
1797 		return -EINVAL;
1798 
1799 	rtnl_lock();
1800 
1801 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
1802 	if (err)
1803 		goto out_rtnl;
1804 
1805 	err = get_vlan(info->attrs[NL80211_ATTR_STA_VLAN], drv, &params.vlan);
1806 	if (err)
1807 		goto out;
1808 
1809 	/* validate settings */
1810 	err = 0;
1811 
1812 	switch (dev->ieee80211_ptr->iftype) {
1813 	case NL80211_IFTYPE_AP:
1814 	case NL80211_IFTYPE_AP_VLAN:
1815 		/* all ok but must have AID */
1816 		if (!params.aid)
1817 			err = -EINVAL;
1818 		break;
1819 	case NL80211_IFTYPE_MESH_POINT:
1820 		/* disallow things mesh doesn't support */
1821 		if (params.vlan)
1822 			err = -EINVAL;
1823 		if (params.aid)
1824 			err = -EINVAL;
1825 		if (params.ht_capa)
1826 			err = -EINVAL;
1827 		if (params.listen_interval >= 0)
1828 			err = -EINVAL;
1829 		if (params.supported_rates)
1830 			err = -EINVAL;
1831 		if (params.sta_flags_mask)
1832 			err = -EINVAL;
1833 		break;
1834 	default:
1835 		err = -EINVAL;
1836 	}
1837 
1838 	if (err)
1839 		goto out;
1840 
1841 	if (!drv->ops->add_station) {
1842 		err = -EOPNOTSUPP;
1843 		goto out;
1844 	}
1845 
1846 	if (!netif_running(dev)) {
1847 		err = -ENETDOWN;
1848 		goto out;
1849 	}
1850 
1851 	err = drv->ops->add_station(&drv->wiphy, dev, mac_addr, &params);
1852 
1853  out:
1854 	if (params.vlan)
1855 		dev_put(params.vlan);
1856 	cfg80211_put_dev(drv);
1857 	dev_put(dev);
1858  out_rtnl:
1859 	rtnl_unlock();
1860 
1861 	return err;
1862 }
1863 
1864 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
1865 {
1866 	struct cfg80211_registered_device *drv;
1867 	int err;
1868 	struct net_device *dev;
1869 	u8 *mac_addr = NULL;
1870 
1871 	if (info->attrs[NL80211_ATTR_MAC])
1872 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
1873 
1874 	rtnl_lock();
1875 
1876 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
1877 	if (err)
1878 		goto out_rtnl;
1879 
1880 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
1881 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
1882 	    dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) {
1883 		err = -EINVAL;
1884 		goto out;
1885 	}
1886 
1887 	if (!drv->ops->del_station) {
1888 		err = -EOPNOTSUPP;
1889 		goto out;
1890 	}
1891 
1892 	err = drv->ops->del_station(&drv->wiphy, dev, mac_addr);
1893 
1894  out:
1895 	cfg80211_put_dev(drv);
1896 	dev_put(dev);
1897  out_rtnl:
1898 	rtnl_unlock();
1899 
1900 	return err;
1901 }
1902 
1903 static int nl80211_send_mpath(struct sk_buff *msg, u32 pid, u32 seq,
1904 				int flags, struct net_device *dev,
1905 				u8 *dst, u8 *next_hop,
1906 				struct mpath_info *pinfo)
1907 {
1908 	void *hdr;
1909 	struct nlattr *pinfoattr;
1910 
1911 	hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_STATION);
1912 	if (!hdr)
1913 		return -1;
1914 
1915 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
1916 	NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, dst);
1917 	NLA_PUT(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop);
1918 
1919 	pinfoattr = nla_nest_start(msg, NL80211_ATTR_MPATH_INFO);
1920 	if (!pinfoattr)
1921 		goto nla_put_failure;
1922 	if (pinfo->filled & MPATH_INFO_FRAME_QLEN)
1923 		NLA_PUT_U32(msg, NL80211_MPATH_INFO_FRAME_QLEN,
1924 			    pinfo->frame_qlen);
1925 	if (pinfo->filled & MPATH_INFO_DSN)
1926 		NLA_PUT_U32(msg, NL80211_MPATH_INFO_DSN,
1927 			    pinfo->dsn);
1928 	if (pinfo->filled & MPATH_INFO_METRIC)
1929 		NLA_PUT_U32(msg, NL80211_MPATH_INFO_METRIC,
1930 			    pinfo->metric);
1931 	if (pinfo->filled & MPATH_INFO_EXPTIME)
1932 		NLA_PUT_U32(msg, NL80211_MPATH_INFO_EXPTIME,
1933 			    pinfo->exptime);
1934 	if (pinfo->filled & MPATH_INFO_FLAGS)
1935 		NLA_PUT_U8(msg, NL80211_MPATH_INFO_FLAGS,
1936 			    pinfo->flags);
1937 	if (pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT)
1938 		NLA_PUT_U32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
1939 			    pinfo->discovery_timeout);
1940 	if (pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES)
1941 		NLA_PUT_U8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES,
1942 			    pinfo->discovery_retries);
1943 
1944 	nla_nest_end(msg, pinfoattr);
1945 
1946 	return genlmsg_end(msg, hdr);
1947 
1948  nla_put_failure:
1949 	genlmsg_cancel(msg, hdr);
1950 	return -EMSGSIZE;
1951 }
1952 
1953 static int nl80211_dump_mpath(struct sk_buff *skb,
1954 			      struct netlink_callback *cb)
1955 {
1956 	struct mpath_info pinfo;
1957 	struct cfg80211_registered_device *dev;
1958 	struct net_device *netdev;
1959 	u8 dst[ETH_ALEN];
1960 	u8 next_hop[ETH_ALEN];
1961 	int ifidx = cb->args[0];
1962 	int path_idx = cb->args[1];
1963 	int err;
1964 
1965 	if (!ifidx) {
1966 		err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
1967 				  nl80211_fam.attrbuf, nl80211_fam.maxattr,
1968 				  nl80211_policy);
1969 		if (err)
1970 			return err;
1971 
1972 		if (!nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX])
1973 			return -EINVAL;
1974 
1975 		ifidx = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX]);
1976 		if (!ifidx)
1977 			return -EINVAL;
1978 	}
1979 
1980 	rtnl_lock();
1981 
1982 	netdev = __dev_get_by_index(&init_net, ifidx);
1983 	if (!netdev) {
1984 		err = -ENODEV;
1985 		goto out_rtnl;
1986 	}
1987 
1988 	dev = cfg80211_get_dev_from_ifindex(ifidx);
1989 	if (IS_ERR(dev)) {
1990 		err = PTR_ERR(dev);
1991 		goto out_rtnl;
1992 	}
1993 
1994 	if (!dev->ops->dump_mpath) {
1995 		err = -EOPNOTSUPP;
1996 		goto out_err;
1997 	}
1998 
1999 	if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) {
2000 		err = -EOPNOTSUPP;
2001 		goto out;
2002 	}
2003 
2004 	while (1) {
2005 		err = dev->ops->dump_mpath(&dev->wiphy, netdev, path_idx,
2006 					   dst, next_hop, &pinfo);
2007 		if (err == -ENOENT)
2008 			break;
2009 		if (err)
2010 			goto out_err;
2011 
2012 		if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).pid,
2013 				       cb->nlh->nlmsg_seq, NLM_F_MULTI,
2014 				       netdev, dst, next_hop,
2015 				       &pinfo) < 0)
2016 			goto out;
2017 
2018 		path_idx++;
2019 	}
2020 
2021 
2022  out:
2023 	cb->args[1] = path_idx;
2024 	err = skb->len;
2025  out_err:
2026 	cfg80211_put_dev(dev);
2027  out_rtnl:
2028 	rtnl_unlock();
2029 
2030 	return err;
2031 }
2032 
2033 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
2034 {
2035 	struct cfg80211_registered_device *drv;
2036 	int err;
2037 	struct net_device *dev;
2038 	struct mpath_info pinfo;
2039 	struct sk_buff *msg;
2040 	u8 *dst = NULL;
2041 	u8 next_hop[ETH_ALEN];
2042 
2043 	memset(&pinfo, 0, sizeof(pinfo));
2044 
2045 	if (!info->attrs[NL80211_ATTR_MAC])
2046 		return -EINVAL;
2047 
2048 	dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
2049 
2050 	rtnl_lock();
2051 
2052 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
2053 	if (err)
2054 		goto out_rtnl;
2055 
2056 	if (!drv->ops->get_mpath) {
2057 		err = -EOPNOTSUPP;
2058 		goto out;
2059 	}
2060 
2061 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) {
2062 		err = -EOPNOTSUPP;
2063 		goto out;
2064 	}
2065 
2066 	err = drv->ops->get_mpath(&drv->wiphy, dev, dst, next_hop, &pinfo);
2067 	if (err)
2068 		goto out;
2069 
2070 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2071 	if (!msg)
2072 		goto out;
2073 
2074 	if (nl80211_send_mpath(msg, info->snd_pid, info->snd_seq, 0,
2075 				 dev, dst, next_hop, &pinfo) < 0)
2076 		goto out_free;
2077 
2078 	err = genlmsg_unicast(msg, info->snd_pid);
2079 	goto out;
2080 
2081  out_free:
2082 	nlmsg_free(msg);
2083  out:
2084 	cfg80211_put_dev(drv);
2085 	dev_put(dev);
2086  out_rtnl:
2087 	rtnl_unlock();
2088 
2089 	return err;
2090 }
2091 
2092 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
2093 {
2094 	struct cfg80211_registered_device *drv;
2095 	int err;
2096 	struct net_device *dev;
2097 	u8 *dst = NULL;
2098 	u8 *next_hop = NULL;
2099 
2100 	if (!info->attrs[NL80211_ATTR_MAC])
2101 		return -EINVAL;
2102 
2103 	if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
2104 		return -EINVAL;
2105 
2106 	dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
2107 	next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
2108 
2109 	rtnl_lock();
2110 
2111 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
2112 	if (err)
2113 		goto out_rtnl;
2114 
2115 	if (!drv->ops->change_mpath) {
2116 		err = -EOPNOTSUPP;
2117 		goto out;
2118 	}
2119 
2120 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) {
2121 		err = -EOPNOTSUPP;
2122 		goto out;
2123 	}
2124 
2125 	if (!netif_running(dev)) {
2126 		err = -ENETDOWN;
2127 		goto out;
2128 	}
2129 
2130 	err = drv->ops->change_mpath(&drv->wiphy, dev, dst, next_hop);
2131 
2132  out:
2133 	cfg80211_put_dev(drv);
2134 	dev_put(dev);
2135  out_rtnl:
2136 	rtnl_unlock();
2137 
2138 	return err;
2139 }
2140 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
2141 {
2142 	struct cfg80211_registered_device *drv;
2143 	int err;
2144 	struct net_device *dev;
2145 	u8 *dst = NULL;
2146 	u8 *next_hop = NULL;
2147 
2148 	if (!info->attrs[NL80211_ATTR_MAC])
2149 		return -EINVAL;
2150 
2151 	if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
2152 		return -EINVAL;
2153 
2154 	dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
2155 	next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
2156 
2157 	rtnl_lock();
2158 
2159 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
2160 	if (err)
2161 		goto out_rtnl;
2162 
2163 	if (!drv->ops->add_mpath) {
2164 		err = -EOPNOTSUPP;
2165 		goto out;
2166 	}
2167 
2168 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) {
2169 		err = -EOPNOTSUPP;
2170 		goto out;
2171 	}
2172 
2173 	if (!netif_running(dev)) {
2174 		err = -ENETDOWN;
2175 		goto out;
2176 	}
2177 
2178 	err = drv->ops->add_mpath(&drv->wiphy, dev, dst, next_hop);
2179 
2180  out:
2181 	cfg80211_put_dev(drv);
2182 	dev_put(dev);
2183  out_rtnl:
2184 	rtnl_unlock();
2185 
2186 	return err;
2187 }
2188 
2189 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
2190 {
2191 	struct cfg80211_registered_device *drv;
2192 	int err;
2193 	struct net_device *dev;
2194 	u8 *dst = NULL;
2195 
2196 	if (info->attrs[NL80211_ATTR_MAC])
2197 		dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
2198 
2199 	rtnl_lock();
2200 
2201 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
2202 	if (err)
2203 		goto out_rtnl;
2204 
2205 	if (!drv->ops->del_mpath) {
2206 		err = -EOPNOTSUPP;
2207 		goto out;
2208 	}
2209 
2210 	err = drv->ops->del_mpath(&drv->wiphy, dev, dst);
2211 
2212  out:
2213 	cfg80211_put_dev(drv);
2214 	dev_put(dev);
2215  out_rtnl:
2216 	rtnl_unlock();
2217 
2218 	return err;
2219 }
2220 
2221 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
2222 {
2223 	struct cfg80211_registered_device *drv;
2224 	int err;
2225 	struct net_device *dev;
2226 	struct bss_parameters params;
2227 
2228 	memset(&params, 0, sizeof(params));
2229 	/* default to not changing parameters */
2230 	params.use_cts_prot = -1;
2231 	params.use_short_preamble = -1;
2232 	params.use_short_slot_time = -1;
2233 
2234 	if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
2235 		params.use_cts_prot =
2236 		    nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
2237 	if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE])
2238 		params.use_short_preamble =
2239 		    nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
2240 	if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME])
2241 		params.use_short_slot_time =
2242 		    nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
2243 	if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
2244 		params.basic_rates =
2245 			nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
2246 		params.basic_rates_len =
2247 			nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
2248 	}
2249 
2250 	rtnl_lock();
2251 
2252 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
2253 	if (err)
2254 		goto out_rtnl;
2255 
2256 	if (!drv->ops->change_bss) {
2257 		err = -EOPNOTSUPP;
2258 		goto out;
2259 	}
2260 
2261 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP) {
2262 		err = -EOPNOTSUPP;
2263 		goto out;
2264 	}
2265 
2266 	err = drv->ops->change_bss(&drv->wiphy, dev, &params);
2267 
2268  out:
2269 	cfg80211_put_dev(drv);
2270 	dev_put(dev);
2271  out_rtnl:
2272 	rtnl_unlock();
2273 
2274 	return err;
2275 }
2276 
2277 static const struct nla_policy
2278 	reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
2279 	[NL80211_ATTR_REG_RULE_FLAGS]		= { .type = NLA_U32 },
2280 	[NL80211_ATTR_FREQ_RANGE_START]		= { .type = NLA_U32 },
2281 	[NL80211_ATTR_FREQ_RANGE_END]		= { .type = NLA_U32 },
2282 	[NL80211_ATTR_FREQ_RANGE_MAX_BW]	= { .type = NLA_U32 },
2283 	[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]	= { .type = NLA_U32 },
2284 	[NL80211_ATTR_POWER_RULE_MAX_EIRP]	= { .type = NLA_U32 },
2285 };
2286 
2287 static int parse_reg_rule(struct nlattr *tb[],
2288 	struct ieee80211_reg_rule *reg_rule)
2289 {
2290 	struct ieee80211_freq_range *freq_range = &reg_rule->freq_range;
2291 	struct ieee80211_power_rule *power_rule = &reg_rule->power_rule;
2292 
2293 	if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
2294 		return -EINVAL;
2295 	if (!tb[NL80211_ATTR_FREQ_RANGE_START])
2296 		return -EINVAL;
2297 	if (!tb[NL80211_ATTR_FREQ_RANGE_END])
2298 		return -EINVAL;
2299 	if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
2300 		return -EINVAL;
2301 	if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
2302 		return -EINVAL;
2303 
2304 	reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
2305 
2306 	freq_range->start_freq_khz =
2307 		nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
2308 	freq_range->end_freq_khz =
2309 		nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
2310 	freq_range->max_bandwidth_khz =
2311 		nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
2312 
2313 	power_rule->max_eirp =
2314 		nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
2315 
2316 	if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
2317 		power_rule->max_antenna_gain =
2318 			nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
2319 
2320 	return 0;
2321 }
2322 
2323 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
2324 {
2325 	int r;
2326 	char *data = NULL;
2327 
2328 	/*
2329 	 * You should only get this when cfg80211 hasn't yet initialized
2330 	 * completely when built-in to the kernel right between the time
2331 	 * window between nl80211_init() and regulatory_init(), if that is
2332 	 * even possible.
2333 	 */
2334 	mutex_lock(&cfg80211_mutex);
2335 	if (unlikely(!cfg80211_regdomain)) {
2336 		mutex_unlock(&cfg80211_mutex);
2337 		return -EINPROGRESS;
2338 	}
2339 	mutex_unlock(&cfg80211_mutex);
2340 
2341 	if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
2342 		return -EINVAL;
2343 
2344 	data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
2345 
2346 #ifdef CONFIG_WIRELESS_OLD_REGULATORY
2347 	/* We ignore world regdom requests with the old regdom setup */
2348 	if (is_world_regdom(data))
2349 		return -EINVAL;
2350 #endif
2351 
2352 	r = regulatory_hint_user(data);
2353 
2354 	return r;
2355 }
2356 
2357 static int nl80211_get_mesh_params(struct sk_buff *skb,
2358 	struct genl_info *info)
2359 {
2360 	struct cfg80211_registered_device *drv;
2361 	struct mesh_config cur_params;
2362 	int err;
2363 	struct net_device *dev;
2364 	void *hdr;
2365 	struct nlattr *pinfoattr;
2366 	struct sk_buff *msg;
2367 
2368 	rtnl_lock();
2369 
2370 	/* Look up our device */
2371 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
2372 	if (err)
2373 		goto out_rtnl;
2374 
2375 	if (!drv->ops->get_mesh_params) {
2376 		err = -EOPNOTSUPP;
2377 		goto out;
2378 	}
2379 
2380 	/* Get the mesh params */
2381 	err = drv->ops->get_mesh_params(&drv->wiphy, dev, &cur_params);
2382 	if (err)
2383 		goto out;
2384 
2385 	/* Draw up a netlink message to send back */
2386 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2387 	if (!msg) {
2388 		err = -ENOBUFS;
2389 		goto out;
2390 	}
2391 	hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
2392 			     NL80211_CMD_GET_MESH_PARAMS);
2393 	if (!hdr)
2394 		goto nla_put_failure;
2395 	pinfoattr = nla_nest_start(msg, NL80211_ATTR_MESH_PARAMS);
2396 	if (!pinfoattr)
2397 		goto nla_put_failure;
2398 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
2399 	NLA_PUT_U16(msg, NL80211_MESHCONF_RETRY_TIMEOUT,
2400 			cur_params.dot11MeshRetryTimeout);
2401 	NLA_PUT_U16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT,
2402 			cur_params.dot11MeshConfirmTimeout);
2403 	NLA_PUT_U16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT,
2404 			cur_params.dot11MeshHoldingTimeout);
2405 	NLA_PUT_U16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
2406 			cur_params.dot11MeshMaxPeerLinks);
2407 	NLA_PUT_U8(msg, NL80211_MESHCONF_MAX_RETRIES,
2408 			cur_params.dot11MeshMaxRetries);
2409 	NLA_PUT_U8(msg, NL80211_MESHCONF_TTL,
2410 			cur_params.dot11MeshTTL);
2411 	NLA_PUT_U8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
2412 			cur_params.auto_open_plinks);
2413 	NLA_PUT_U8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
2414 			cur_params.dot11MeshHWMPmaxPREQretries);
2415 	NLA_PUT_U32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME,
2416 			cur_params.path_refresh_time);
2417 	NLA_PUT_U16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
2418 			cur_params.min_discovery_timeout);
2419 	NLA_PUT_U32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
2420 			cur_params.dot11MeshHWMPactivePathTimeout);
2421 	NLA_PUT_U16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
2422 			cur_params.dot11MeshHWMPpreqMinInterval);
2423 	NLA_PUT_U16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
2424 			cur_params.dot11MeshHWMPnetDiameterTraversalTime);
2425 	nla_nest_end(msg, pinfoattr);
2426 	genlmsg_end(msg, hdr);
2427 	err = genlmsg_unicast(msg, info->snd_pid);
2428 	goto out;
2429 
2430  nla_put_failure:
2431 	genlmsg_cancel(msg, hdr);
2432 	err = -EMSGSIZE;
2433  out:
2434 	/* Cleanup */
2435 	cfg80211_put_dev(drv);
2436 	dev_put(dev);
2437  out_rtnl:
2438 	rtnl_unlock();
2439 
2440 	return err;
2441 }
2442 
2443 #define FILL_IN_MESH_PARAM_IF_SET(table, cfg, param, mask, attr_num, nla_fn) \
2444 do {\
2445 	if (table[attr_num]) {\
2446 		cfg.param = nla_fn(table[attr_num]); \
2447 		mask |= (1 << (attr_num - 1)); \
2448 	} \
2449 } while (0);\
2450 
2451 static struct nla_policy
2452 nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] __read_mostly = {
2453 	[NL80211_MESHCONF_RETRY_TIMEOUT] = { .type = NLA_U16 },
2454 	[NL80211_MESHCONF_CONFIRM_TIMEOUT] = { .type = NLA_U16 },
2455 	[NL80211_MESHCONF_HOLDING_TIMEOUT] = { .type = NLA_U16 },
2456 	[NL80211_MESHCONF_MAX_PEER_LINKS] = { .type = NLA_U16 },
2457 	[NL80211_MESHCONF_MAX_RETRIES] = { .type = NLA_U8 },
2458 	[NL80211_MESHCONF_TTL] = { .type = NLA_U8 },
2459 	[NL80211_MESHCONF_AUTO_OPEN_PLINKS] = { .type = NLA_U8 },
2460 
2461 	[NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 },
2462 	[NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 },
2463 	[NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = { .type = NLA_U16 },
2464 	[NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
2465 	[NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = { .type = NLA_U16 },
2466 	[NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = { .type = NLA_U16 },
2467 };
2468 
2469 static int nl80211_set_mesh_params(struct sk_buff *skb, struct genl_info *info)
2470 {
2471 	int err;
2472 	u32 mask;
2473 	struct cfg80211_registered_device *drv;
2474 	struct net_device *dev;
2475 	struct mesh_config cfg;
2476 	struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1];
2477 	struct nlattr *parent_attr;
2478 
2479 	parent_attr = info->attrs[NL80211_ATTR_MESH_PARAMS];
2480 	if (!parent_attr)
2481 		return -EINVAL;
2482 	if (nla_parse_nested(tb, NL80211_MESHCONF_ATTR_MAX,
2483 			parent_attr, nl80211_meshconf_params_policy))
2484 		return -EINVAL;
2485 
2486 	rtnl_lock();
2487 
2488 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
2489 	if (err)
2490 		goto out_rtnl;
2491 
2492 	if (!drv->ops->set_mesh_params) {
2493 		err = -EOPNOTSUPP;
2494 		goto out;
2495 	}
2496 
2497 	/* This makes sure that there aren't more than 32 mesh config
2498 	 * parameters (otherwise our bitfield scheme would not work.) */
2499 	BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
2500 
2501 	/* Fill in the params struct */
2502 	mask = 0;
2503 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout,
2504 			mask, NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16);
2505 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout,
2506 			mask, NL80211_MESHCONF_CONFIRM_TIMEOUT, nla_get_u16);
2507 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout,
2508 			mask, NL80211_MESHCONF_HOLDING_TIMEOUT, nla_get_u16);
2509 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks,
2510 			mask, NL80211_MESHCONF_MAX_PEER_LINKS, nla_get_u16);
2511 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries,
2512 			mask, NL80211_MESHCONF_MAX_RETRIES, nla_get_u8);
2513 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL,
2514 			mask, NL80211_MESHCONF_TTL, nla_get_u8);
2515 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks,
2516 			mask, NL80211_MESHCONF_AUTO_OPEN_PLINKS, nla_get_u8);
2517 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries,
2518 			mask, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
2519 			nla_get_u8);
2520 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time,
2521 			mask, NL80211_MESHCONF_PATH_REFRESH_TIME, nla_get_u32);
2522 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout,
2523 			mask, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
2524 			nla_get_u16);
2525 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout,
2526 			mask, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
2527 			nla_get_u32);
2528 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval,
2529 			mask, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
2530 			nla_get_u16);
2531 	FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
2532 			dot11MeshHWMPnetDiameterTraversalTime,
2533 			mask, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
2534 			nla_get_u16);
2535 
2536 	/* Apply changes */
2537 	err = drv->ops->set_mesh_params(&drv->wiphy, dev, &cfg, mask);
2538 
2539  out:
2540 	/* cleanup */
2541 	cfg80211_put_dev(drv);
2542 	dev_put(dev);
2543  out_rtnl:
2544 	rtnl_unlock();
2545 
2546 	return err;
2547 }
2548 
2549 #undef FILL_IN_MESH_PARAM_IF_SET
2550 
2551 static int nl80211_get_reg(struct sk_buff *skb, struct genl_info *info)
2552 {
2553 	struct sk_buff *msg;
2554 	void *hdr = NULL;
2555 	struct nlattr *nl_reg_rules;
2556 	unsigned int i;
2557 	int err = -EINVAL;
2558 
2559 	mutex_lock(&cfg80211_mutex);
2560 
2561 	if (!cfg80211_regdomain)
2562 		goto out;
2563 
2564 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2565 	if (!msg) {
2566 		err = -ENOBUFS;
2567 		goto out;
2568 	}
2569 
2570 	hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
2571 			     NL80211_CMD_GET_REG);
2572 	if (!hdr)
2573 		goto nla_put_failure;
2574 
2575 	NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2,
2576 		cfg80211_regdomain->alpha2);
2577 
2578 	nl_reg_rules = nla_nest_start(msg, NL80211_ATTR_REG_RULES);
2579 	if (!nl_reg_rules)
2580 		goto nla_put_failure;
2581 
2582 	for (i = 0; i < cfg80211_regdomain->n_reg_rules; i++) {
2583 		struct nlattr *nl_reg_rule;
2584 		const struct ieee80211_reg_rule *reg_rule;
2585 		const struct ieee80211_freq_range *freq_range;
2586 		const struct ieee80211_power_rule *power_rule;
2587 
2588 		reg_rule = &cfg80211_regdomain->reg_rules[i];
2589 		freq_range = &reg_rule->freq_range;
2590 		power_rule = &reg_rule->power_rule;
2591 
2592 		nl_reg_rule = nla_nest_start(msg, i);
2593 		if (!nl_reg_rule)
2594 			goto nla_put_failure;
2595 
2596 		NLA_PUT_U32(msg, NL80211_ATTR_REG_RULE_FLAGS,
2597 			reg_rule->flags);
2598 		NLA_PUT_U32(msg, NL80211_ATTR_FREQ_RANGE_START,
2599 			freq_range->start_freq_khz);
2600 		NLA_PUT_U32(msg, NL80211_ATTR_FREQ_RANGE_END,
2601 			freq_range->end_freq_khz);
2602 		NLA_PUT_U32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW,
2603 			freq_range->max_bandwidth_khz);
2604 		NLA_PUT_U32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
2605 			power_rule->max_antenna_gain);
2606 		NLA_PUT_U32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP,
2607 			power_rule->max_eirp);
2608 
2609 		nla_nest_end(msg, nl_reg_rule);
2610 	}
2611 
2612 	nla_nest_end(msg, nl_reg_rules);
2613 
2614 	genlmsg_end(msg, hdr);
2615 	err = genlmsg_unicast(msg, info->snd_pid);
2616 	goto out;
2617 
2618 nla_put_failure:
2619 	genlmsg_cancel(msg, hdr);
2620 	err = -EMSGSIZE;
2621 out:
2622 	mutex_unlock(&cfg80211_mutex);
2623 	return err;
2624 }
2625 
2626 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
2627 {
2628 	struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
2629 	struct nlattr *nl_reg_rule;
2630 	char *alpha2 = NULL;
2631 	int rem_reg_rules = 0, r = 0;
2632 	u32 num_rules = 0, rule_idx = 0, size_of_regd;
2633 	struct ieee80211_regdomain *rd = NULL;
2634 
2635 	if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
2636 		return -EINVAL;
2637 
2638 	if (!info->attrs[NL80211_ATTR_REG_RULES])
2639 		return -EINVAL;
2640 
2641 	alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
2642 
2643 	nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
2644 			rem_reg_rules) {
2645 		num_rules++;
2646 		if (num_rules > NL80211_MAX_SUPP_REG_RULES)
2647 			return -EINVAL;
2648 	}
2649 
2650 	mutex_lock(&cfg80211_mutex);
2651 
2652 	if (!reg_is_valid_request(alpha2)) {
2653 		r = -EINVAL;
2654 		goto bad_reg;
2655 	}
2656 
2657 	size_of_regd = sizeof(struct ieee80211_regdomain) +
2658 		(num_rules * sizeof(struct ieee80211_reg_rule));
2659 
2660 	rd = kzalloc(size_of_regd, GFP_KERNEL);
2661 	if (!rd) {
2662 		r = -ENOMEM;
2663 		goto bad_reg;
2664 	}
2665 
2666 	rd->n_reg_rules = num_rules;
2667 	rd->alpha2[0] = alpha2[0];
2668 	rd->alpha2[1] = alpha2[1];
2669 
2670 	nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
2671 			rem_reg_rules) {
2672 		nla_parse(tb, NL80211_REG_RULE_ATTR_MAX,
2673 			nla_data(nl_reg_rule), nla_len(nl_reg_rule),
2674 			reg_rule_policy);
2675 		r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
2676 		if (r)
2677 			goto bad_reg;
2678 
2679 		rule_idx++;
2680 
2681 		if (rule_idx > NL80211_MAX_SUPP_REG_RULES) {
2682 			r = -EINVAL;
2683 			goto bad_reg;
2684 		}
2685 	}
2686 
2687 	BUG_ON(rule_idx != num_rules);
2688 
2689 	r = set_regdom(rd);
2690 
2691 	mutex_unlock(&cfg80211_mutex);
2692 
2693 	return r;
2694 
2695  bad_reg:
2696 	mutex_unlock(&cfg80211_mutex);
2697 	kfree(rd);
2698 	return r;
2699 }
2700 
2701 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
2702 {
2703 	struct cfg80211_registered_device *drv;
2704 	struct net_device *dev;
2705 	struct cfg80211_scan_request *request;
2706 	struct cfg80211_ssid *ssid;
2707 	struct ieee80211_channel *channel;
2708 	struct nlattr *attr;
2709 	struct wiphy *wiphy;
2710 	int err, tmp, n_ssids = 0, n_channels = 0, i;
2711 	enum ieee80211_band band;
2712 	size_t ie_len;
2713 
2714 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
2715 		return -EINVAL;
2716 
2717 	rtnl_lock();
2718 
2719 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
2720 	if (err)
2721 		goto out_rtnl;
2722 
2723 	wiphy = &drv->wiphy;
2724 
2725 	if (!drv->ops->scan) {
2726 		err = -EOPNOTSUPP;
2727 		goto out;
2728 	}
2729 
2730 	if (!netif_running(dev)) {
2731 		err = -ENETDOWN;
2732 		goto out;
2733 	}
2734 
2735 	if (drv->scan_req) {
2736 		err = -EBUSY;
2737 		goto out;
2738 	}
2739 
2740 	if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
2741 		nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp)
2742 			n_channels++;
2743 		if (!n_channels) {
2744 			err = -EINVAL;
2745 			goto out;
2746 		}
2747 	} else {
2748 		for (band = 0; band < IEEE80211_NUM_BANDS; band++)
2749 			if (wiphy->bands[band])
2750 				n_channels += wiphy->bands[band]->n_channels;
2751 	}
2752 
2753 	if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
2754 		nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
2755 			n_ssids++;
2756 
2757 	if (n_ssids > wiphy->max_scan_ssids) {
2758 		err = -EINVAL;
2759 		goto out;
2760 	}
2761 
2762 	if (info->attrs[NL80211_ATTR_IE])
2763 		ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
2764 	else
2765 		ie_len = 0;
2766 
2767 	if (ie_len > wiphy->max_scan_ie_len) {
2768 		err = -EINVAL;
2769 		goto out;
2770 	}
2771 
2772 	request = kzalloc(sizeof(*request)
2773 			+ sizeof(*ssid) * n_ssids
2774 			+ sizeof(channel) * n_channels
2775 			+ ie_len, GFP_KERNEL);
2776 	if (!request) {
2777 		err = -ENOMEM;
2778 		goto out;
2779 	}
2780 
2781 	request->channels = (void *)((char *)request + sizeof(*request));
2782 	request->n_channels = n_channels;
2783 	if (n_ssids)
2784 		request->ssids = (void *)(request->channels + n_channels);
2785 	request->n_ssids = n_ssids;
2786 	if (ie_len) {
2787 		if (request->ssids)
2788 			request->ie = (void *)(request->ssids + n_ssids);
2789 		else
2790 			request->ie = (void *)(request->channels + n_channels);
2791 	}
2792 
2793 	if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
2794 		/* user specified, bail out if channel not found */
2795 		request->n_channels = n_channels;
2796 		i = 0;
2797 		nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) {
2798 			request->channels[i] = ieee80211_get_channel(wiphy, nla_get_u32(attr));
2799 			if (!request->channels[i]) {
2800 				err = -EINVAL;
2801 				goto out_free;
2802 			}
2803 			i++;
2804 		}
2805 	} else {
2806 		/* all channels */
2807 		i = 0;
2808 		for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
2809 			int j;
2810 			if (!wiphy->bands[band])
2811 				continue;
2812 			for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
2813 				request->channels[i] = &wiphy->bands[band]->channels[j];
2814 				i++;
2815 			}
2816 		}
2817 	}
2818 
2819 	i = 0;
2820 	if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) {
2821 		nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
2822 			if (request->ssids[i].ssid_len > IEEE80211_MAX_SSID_LEN) {
2823 				err = -EINVAL;
2824 				goto out_free;
2825 			}
2826 			memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
2827 			request->ssids[i].ssid_len = nla_len(attr);
2828 			i++;
2829 		}
2830 	}
2831 
2832 	if (info->attrs[NL80211_ATTR_IE]) {
2833 		request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
2834 		memcpy((void *)request->ie,
2835 		       nla_data(info->attrs[NL80211_ATTR_IE]),
2836 		       request->ie_len);
2837 	}
2838 
2839 	request->ifidx = dev->ifindex;
2840 	request->wiphy = &drv->wiphy;
2841 
2842 	drv->scan_req = request;
2843 	err = drv->ops->scan(&drv->wiphy, dev, request);
2844 
2845  out_free:
2846 	if (err) {
2847 		drv->scan_req = NULL;
2848 		kfree(request);
2849 	}
2850  out:
2851 	cfg80211_put_dev(drv);
2852 	dev_put(dev);
2853  out_rtnl:
2854 	rtnl_unlock();
2855 
2856 	return err;
2857 }
2858 
2859 static int nl80211_send_bss(struct sk_buff *msg, u32 pid, u32 seq, int flags,
2860 			    struct cfg80211_registered_device *rdev,
2861 			    struct net_device *dev,
2862 			    struct cfg80211_bss *res)
2863 {
2864 	void *hdr;
2865 	struct nlattr *bss;
2866 
2867 	hdr = nl80211hdr_put(msg, pid, seq, flags,
2868 			     NL80211_CMD_NEW_SCAN_RESULTS);
2869 	if (!hdr)
2870 		return -1;
2871 
2872 	NLA_PUT_U32(msg, NL80211_ATTR_SCAN_GENERATION,
2873 		    rdev->bss_generation);
2874 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
2875 
2876 	bss = nla_nest_start(msg, NL80211_ATTR_BSS);
2877 	if (!bss)
2878 		goto nla_put_failure;
2879 	if (!is_zero_ether_addr(res->bssid))
2880 		NLA_PUT(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid);
2881 	if (res->information_elements && res->len_information_elements)
2882 		NLA_PUT(msg, NL80211_BSS_INFORMATION_ELEMENTS,
2883 			res->len_information_elements,
2884 			res->information_elements);
2885 	if (res->tsf)
2886 		NLA_PUT_U64(msg, NL80211_BSS_TSF, res->tsf);
2887 	if (res->beacon_interval)
2888 		NLA_PUT_U16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval);
2889 	NLA_PUT_U16(msg, NL80211_BSS_CAPABILITY, res->capability);
2890 	NLA_PUT_U32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq);
2891 
2892 	switch (rdev->wiphy.signal_type) {
2893 	case CFG80211_SIGNAL_TYPE_MBM:
2894 		NLA_PUT_U32(msg, NL80211_BSS_SIGNAL_MBM, res->signal);
2895 		break;
2896 	case CFG80211_SIGNAL_TYPE_UNSPEC:
2897 		NLA_PUT_U8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal);
2898 		break;
2899 	default:
2900 		break;
2901 	}
2902 
2903 	nla_nest_end(msg, bss);
2904 
2905 	return genlmsg_end(msg, hdr);
2906 
2907  nla_put_failure:
2908 	genlmsg_cancel(msg, hdr);
2909 	return -EMSGSIZE;
2910 }
2911 
2912 static int nl80211_dump_scan(struct sk_buff *skb,
2913 			     struct netlink_callback *cb)
2914 {
2915 	struct cfg80211_registered_device *dev;
2916 	struct net_device *netdev;
2917 	struct cfg80211_internal_bss *scan;
2918 	int ifidx = cb->args[0];
2919 	int start = cb->args[1], idx = 0;
2920 	int err;
2921 
2922 	if (!ifidx) {
2923 		err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
2924 				  nl80211_fam.attrbuf, nl80211_fam.maxattr,
2925 				  nl80211_policy);
2926 		if (err)
2927 			return err;
2928 
2929 		if (!nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX])
2930 			return -EINVAL;
2931 
2932 		ifidx = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX]);
2933 		if (!ifidx)
2934 			return -EINVAL;
2935 		cb->args[0] = ifidx;
2936 	}
2937 
2938 	netdev = dev_get_by_index(&init_net, ifidx);
2939 	if (!netdev)
2940 		return -ENODEV;
2941 
2942 	dev = cfg80211_get_dev_from_ifindex(ifidx);
2943 	if (IS_ERR(dev)) {
2944 		err = PTR_ERR(dev);
2945 		goto out_put_netdev;
2946 	}
2947 
2948 	spin_lock_bh(&dev->bss_lock);
2949 	cfg80211_bss_expire(dev);
2950 
2951 	list_for_each_entry(scan, &dev->bss_list, list) {
2952 		if (++idx <= start)
2953 			continue;
2954 		if (nl80211_send_bss(skb,
2955 				NETLINK_CB(cb->skb).pid,
2956 				cb->nlh->nlmsg_seq, NLM_F_MULTI,
2957 				dev, netdev, &scan->pub) < 0) {
2958 			idx--;
2959 			goto out;
2960 		}
2961 	}
2962 
2963  out:
2964 	spin_unlock_bh(&dev->bss_lock);
2965 
2966 	cb->args[1] = idx;
2967 	err = skb->len;
2968 	cfg80211_put_dev(dev);
2969  out_put_netdev:
2970 	dev_put(netdev);
2971 
2972 	return err;
2973 }
2974 
2975 static bool nl80211_valid_auth_type(enum nl80211_auth_type auth_type)
2976 {
2977 	return auth_type == NL80211_AUTHTYPE_OPEN_SYSTEM ||
2978 		auth_type == NL80211_AUTHTYPE_SHARED_KEY ||
2979 		auth_type == NL80211_AUTHTYPE_FT ||
2980 		auth_type == NL80211_AUTHTYPE_NETWORK_EAP;
2981 }
2982 
2983 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
2984 {
2985 	struct cfg80211_registered_device *drv;
2986 	struct net_device *dev;
2987 	struct cfg80211_auth_request req;
2988 	struct wiphy *wiphy;
2989 	int err;
2990 
2991 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
2992 		return -EINVAL;
2993 
2994 	if (!info->attrs[NL80211_ATTR_MAC])
2995 		return -EINVAL;
2996 
2997 	if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
2998 		return -EINVAL;
2999 
3000 	rtnl_lock();
3001 
3002 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
3003 	if (err)
3004 		goto unlock_rtnl;
3005 
3006 	if (!drv->ops->auth) {
3007 		err = -EOPNOTSUPP;
3008 		goto out;
3009 	}
3010 
3011 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) {
3012 		err = -EOPNOTSUPP;
3013 		goto out;
3014 	}
3015 
3016 	if (!netif_running(dev)) {
3017 		err = -ENETDOWN;
3018 		goto out;
3019 	}
3020 
3021 	wiphy = &drv->wiphy;
3022 	memset(&req, 0, sizeof(req));
3023 
3024 	req.peer_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3025 
3026 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
3027 		req.chan = ieee80211_get_channel(
3028 			wiphy,
3029 			nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
3030 		if (!req.chan) {
3031 			err = -EINVAL;
3032 			goto out;
3033 		}
3034 	}
3035 
3036 	if (info->attrs[NL80211_ATTR_SSID]) {
3037 		req.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
3038 		req.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
3039 	}
3040 
3041 	if (info->attrs[NL80211_ATTR_IE]) {
3042 		req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
3043 		req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
3044 	}
3045 
3046 	req.auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
3047 	if (!nl80211_valid_auth_type(req.auth_type)) {
3048 		err = -EINVAL;
3049 		goto out;
3050 	}
3051 
3052 	err = drv->ops->auth(&drv->wiphy, dev, &req);
3053 
3054 out:
3055 	cfg80211_put_dev(drv);
3056 	dev_put(dev);
3057 unlock_rtnl:
3058 	rtnl_unlock();
3059 	return err;
3060 }
3061 
3062 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
3063 {
3064 	struct cfg80211_registered_device *drv;
3065 	struct net_device *dev;
3066 	struct cfg80211_assoc_request req;
3067 	struct wiphy *wiphy;
3068 	int err;
3069 
3070 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
3071 		return -EINVAL;
3072 
3073 	if (!info->attrs[NL80211_ATTR_MAC] ||
3074 	    !info->attrs[NL80211_ATTR_SSID])
3075 		return -EINVAL;
3076 
3077 	rtnl_lock();
3078 
3079 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
3080 	if (err)
3081 		goto unlock_rtnl;
3082 
3083 	if (!drv->ops->assoc) {
3084 		err = -EOPNOTSUPP;
3085 		goto out;
3086 	}
3087 
3088 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) {
3089 		err = -EOPNOTSUPP;
3090 		goto out;
3091 	}
3092 
3093 	if (!netif_running(dev)) {
3094 		err = -ENETDOWN;
3095 		goto out;
3096 	}
3097 
3098 	wiphy = &drv->wiphy;
3099 	memset(&req, 0, sizeof(req));
3100 
3101 	req.peer_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3102 
3103 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
3104 		req.chan = ieee80211_get_channel(
3105 			wiphy,
3106 			nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
3107 		if (!req.chan) {
3108 			err = -EINVAL;
3109 			goto out;
3110 		}
3111 	}
3112 
3113 	req.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
3114 	req.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
3115 
3116 	if (info->attrs[NL80211_ATTR_IE]) {
3117 		req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
3118 		req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
3119 	}
3120 
3121 	if (info->attrs[NL80211_ATTR_USE_MFP]) {
3122 		enum nl80211_mfp use_mfp =
3123 			nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
3124 		if (use_mfp == NL80211_MFP_REQUIRED)
3125 			req.use_mfp = true;
3126 		else if (use_mfp != NL80211_MFP_NO) {
3127 			err = -EINVAL;
3128 			goto out;
3129 		}
3130 	}
3131 
3132 	req.control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
3133 
3134 	err = drv->ops->assoc(&drv->wiphy, dev, &req);
3135 
3136 out:
3137 	cfg80211_put_dev(drv);
3138 	dev_put(dev);
3139 unlock_rtnl:
3140 	rtnl_unlock();
3141 	return err;
3142 }
3143 
3144 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
3145 {
3146 	struct cfg80211_registered_device *drv;
3147 	struct net_device *dev;
3148 	struct cfg80211_deauth_request req;
3149 	struct wiphy *wiphy;
3150 	int err;
3151 
3152 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
3153 		return -EINVAL;
3154 
3155 	if (!info->attrs[NL80211_ATTR_MAC])
3156 		return -EINVAL;
3157 
3158 	if (!info->attrs[NL80211_ATTR_REASON_CODE])
3159 		return -EINVAL;
3160 
3161 	rtnl_lock();
3162 
3163 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
3164 	if (err)
3165 		goto unlock_rtnl;
3166 
3167 	if (!drv->ops->deauth) {
3168 		err = -EOPNOTSUPP;
3169 		goto out;
3170 	}
3171 
3172 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) {
3173 		err = -EOPNOTSUPP;
3174 		goto out;
3175 	}
3176 
3177 	if (!netif_running(dev)) {
3178 		err = -ENETDOWN;
3179 		goto out;
3180 	}
3181 
3182 	wiphy = &drv->wiphy;
3183 	memset(&req, 0, sizeof(req));
3184 
3185 	req.peer_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3186 
3187 	req.reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
3188 	if (req.reason_code == 0) {
3189 		/* Reason Code 0 is reserved */
3190 		err = -EINVAL;
3191 		goto out;
3192 	}
3193 
3194 	if (info->attrs[NL80211_ATTR_IE]) {
3195 		req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
3196 		req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
3197 	}
3198 
3199 	err = drv->ops->deauth(&drv->wiphy, dev, &req);
3200 
3201 out:
3202 	cfg80211_put_dev(drv);
3203 	dev_put(dev);
3204 unlock_rtnl:
3205 	rtnl_unlock();
3206 	return err;
3207 }
3208 
3209 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
3210 {
3211 	struct cfg80211_registered_device *drv;
3212 	struct net_device *dev;
3213 	struct cfg80211_disassoc_request req;
3214 	struct wiphy *wiphy;
3215 	int err;
3216 
3217 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
3218 		return -EINVAL;
3219 
3220 	if (!info->attrs[NL80211_ATTR_MAC])
3221 		return -EINVAL;
3222 
3223 	if (!info->attrs[NL80211_ATTR_REASON_CODE])
3224 		return -EINVAL;
3225 
3226 	rtnl_lock();
3227 
3228 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
3229 	if (err)
3230 		goto unlock_rtnl;
3231 
3232 	if (!drv->ops->disassoc) {
3233 		err = -EOPNOTSUPP;
3234 		goto out;
3235 	}
3236 
3237 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) {
3238 		err = -EOPNOTSUPP;
3239 		goto out;
3240 	}
3241 
3242 	if (!netif_running(dev)) {
3243 		err = -ENETDOWN;
3244 		goto out;
3245 	}
3246 
3247 	wiphy = &drv->wiphy;
3248 	memset(&req, 0, sizeof(req));
3249 
3250 	req.peer_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3251 
3252 	req.reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
3253 	if (req.reason_code == 0) {
3254 		/* Reason Code 0 is reserved */
3255 		err = -EINVAL;
3256 		goto out;
3257 	}
3258 
3259 	if (info->attrs[NL80211_ATTR_IE]) {
3260 		req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
3261 		req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
3262 	}
3263 
3264 	err = drv->ops->disassoc(&drv->wiphy, dev, &req);
3265 
3266 out:
3267 	cfg80211_put_dev(drv);
3268 	dev_put(dev);
3269 unlock_rtnl:
3270 	rtnl_unlock();
3271 	return err;
3272 }
3273 
3274 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
3275 {
3276 	struct cfg80211_registered_device *drv;
3277 	struct net_device *dev;
3278 	struct cfg80211_ibss_params ibss;
3279 	struct wiphy *wiphy;
3280 	int err;
3281 
3282 	memset(&ibss, 0, sizeof(ibss));
3283 
3284 	if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
3285 		return -EINVAL;
3286 
3287 	if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
3288 	    !info->attrs[NL80211_ATTR_SSID] ||
3289 	    !nla_len(info->attrs[NL80211_ATTR_SSID]))
3290 		return -EINVAL;
3291 
3292 	ibss.beacon_interval = 100;
3293 
3294 	if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
3295 		ibss.beacon_interval =
3296 			nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
3297 		if (ibss.beacon_interval < 1 || ibss.beacon_interval > 10000)
3298 			return -EINVAL;
3299 	}
3300 
3301 	rtnl_lock();
3302 
3303 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
3304 	if (err)
3305 		goto unlock_rtnl;
3306 
3307 	if (!drv->ops->join_ibss) {
3308 		err = -EOPNOTSUPP;
3309 		goto out;
3310 	}
3311 
3312 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) {
3313 		err = -EOPNOTSUPP;
3314 		goto out;
3315 	}
3316 
3317 	if (!netif_running(dev)) {
3318 		err = -ENETDOWN;
3319 		goto out;
3320 	}
3321 
3322 	wiphy = &drv->wiphy;
3323 
3324 	if (info->attrs[NL80211_ATTR_MAC])
3325 		ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
3326 	ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
3327 	ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
3328 
3329 	if (info->attrs[NL80211_ATTR_IE]) {
3330 		ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
3331 		ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
3332 	}
3333 
3334 	ibss.channel = ieee80211_get_channel(wiphy,
3335 		nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
3336 	if (!ibss.channel ||
3337 	    ibss.channel->flags & IEEE80211_CHAN_NO_IBSS ||
3338 	    ibss.channel->flags & IEEE80211_CHAN_DISABLED) {
3339 		err = -EINVAL;
3340 		goto out;
3341 	}
3342 
3343 	ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
3344 
3345 	err = cfg80211_join_ibss(drv, dev, &ibss);
3346 
3347 out:
3348 	cfg80211_put_dev(drv);
3349 	dev_put(dev);
3350 unlock_rtnl:
3351 	rtnl_unlock();
3352 	return err;
3353 }
3354 
3355 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
3356 {
3357 	struct cfg80211_registered_device *drv;
3358 	struct net_device *dev;
3359 	int err;
3360 
3361 	rtnl_lock();
3362 
3363 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
3364 	if (err)
3365 		goto unlock_rtnl;
3366 
3367 	if (!drv->ops->leave_ibss) {
3368 		err = -EOPNOTSUPP;
3369 		goto out;
3370 	}
3371 
3372 	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) {
3373 		err = -EOPNOTSUPP;
3374 		goto out;
3375 	}
3376 
3377 	if (!netif_running(dev)) {
3378 		err = -ENETDOWN;
3379 		goto out;
3380 	}
3381 
3382 	err = cfg80211_leave_ibss(drv, dev, false);
3383 
3384 out:
3385 	cfg80211_put_dev(drv);
3386 	dev_put(dev);
3387 unlock_rtnl:
3388 	rtnl_unlock();
3389 	return err;
3390 }
3391 
3392 static struct genl_ops nl80211_ops[] = {
3393 	{
3394 		.cmd = NL80211_CMD_GET_WIPHY,
3395 		.doit = nl80211_get_wiphy,
3396 		.dumpit = nl80211_dump_wiphy,
3397 		.policy = nl80211_policy,
3398 		/* can be retrieved by unprivileged users */
3399 	},
3400 	{
3401 		.cmd = NL80211_CMD_SET_WIPHY,
3402 		.doit = nl80211_set_wiphy,
3403 		.policy = nl80211_policy,
3404 		.flags = GENL_ADMIN_PERM,
3405 	},
3406 	{
3407 		.cmd = NL80211_CMD_GET_INTERFACE,
3408 		.doit = nl80211_get_interface,
3409 		.dumpit = nl80211_dump_interface,
3410 		.policy = nl80211_policy,
3411 		/* can be retrieved by unprivileged users */
3412 	},
3413 	{
3414 		.cmd = NL80211_CMD_SET_INTERFACE,
3415 		.doit = nl80211_set_interface,
3416 		.policy = nl80211_policy,
3417 		.flags = GENL_ADMIN_PERM,
3418 	},
3419 	{
3420 		.cmd = NL80211_CMD_NEW_INTERFACE,
3421 		.doit = nl80211_new_interface,
3422 		.policy = nl80211_policy,
3423 		.flags = GENL_ADMIN_PERM,
3424 	},
3425 	{
3426 		.cmd = NL80211_CMD_DEL_INTERFACE,
3427 		.doit = nl80211_del_interface,
3428 		.policy = nl80211_policy,
3429 		.flags = GENL_ADMIN_PERM,
3430 	},
3431 	{
3432 		.cmd = NL80211_CMD_GET_KEY,
3433 		.doit = nl80211_get_key,
3434 		.policy = nl80211_policy,
3435 		.flags = GENL_ADMIN_PERM,
3436 	},
3437 	{
3438 		.cmd = NL80211_CMD_SET_KEY,
3439 		.doit = nl80211_set_key,
3440 		.policy = nl80211_policy,
3441 		.flags = GENL_ADMIN_PERM,
3442 	},
3443 	{
3444 		.cmd = NL80211_CMD_NEW_KEY,
3445 		.doit = nl80211_new_key,
3446 		.policy = nl80211_policy,
3447 		.flags = GENL_ADMIN_PERM,
3448 	},
3449 	{
3450 		.cmd = NL80211_CMD_DEL_KEY,
3451 		.doit = nl80211_del_key,
3452 		.policy = nl80211_policy,
3453 		.flags = GENL_ADMIN_PERM,
3454 	},
3455 	{
3456 		.cmd = NL80211_CMD_SET_BEACON,
3457 		.policy = nl80211_policy,
3458 		.flags = GENL_ADMIN_PERM,
3459 		.doit = nl80211_addset_beacon,
3460 	},
3461 	{
3462 		.cmd = NL80211_CMD_NEW_BEACON,
3463 		.policy = nl80211_policy,
3464 		.flags = GENL_ADMIN_PERM,
3465 		.doit = nl80211_addset_beacon,
3466 	},
3467 	{
3468 		.cmd = NL80211_CMD_DEL_BEACON,
3469 		.policy = nl80211_policy,
3470 		.flags = GENL_ADMIN_PERM,
3471 		.doit = nl80211_del_beacon,
3472 	},
3473 	{
3474 		.cmd = NL80211_CMD_GET_STATION,
3475 		.doit = nl80211_get_station,
3476 		.dumpit = nl80211_dump_station,
3477 		.policy = nl80211_policy,
3478 	},
3479 	{
3480 		.cmd = NL80211_CMD_SET_STATION,
3481 		.doit = nl80211_set_station,
3482 		.policy = nl80211_policy,
3483 		.flags = GENL_ADMIN_PERM,
3484 	},
3485 	{
3486 		.cmd = NL80211_CMD_NEW_STATION,
3487 		.doit = nl80211_new_station,
3488 		.policy = nl80211_policy,
3489 		.flags = GENL_ADMIN_PERM,
3490 	},
3491 	{
3492 		.cmd = NL80211_CMD_DEL_STATION,
3493 		.doit = nl80211_del_station,
3494 		.policy = nl80211_policy,
3495 		.flags = GENL_ADMIN_PERM,
3496 	},
3497 	{
3498 		.cmd = NL80211_CMD_GET_MPATH,
3499 		.doit = nl80211_get_mpath,
3500 		.dumpit = nl80211_dump_mpath,
3501 		.policy = nl80211_policy,
3502 		.flags = GENL_ADMIN_PERM,
3503 	},
3504 	{
3505 		.cmd = NL80211_CMD_SET_MPATH,
3506 		.doit = nl80211_set_mpath,
3507 		.policy = nl80211_policy,
3508 		.flags = GENL_ADMIN_PERM,
3509 	},
3510 	{
3511 		.cmd = NL80211_CMD_NEW_MPATH,
3512 		.doit = nl80211_new_mpath,
3513 		.policy = nl80211_policy,
3514 		.flags = GENL_ADMIN_PERM,
3515 	},
3516 	{
3517 		.cmd = NL80211_CMD_DEL_MPATH,
3518 		.doit = nl80211_del_mpath,
3519 		.policy = nl80211_policy,
3520 		.flags = GENL_ADMIN_PERM,
3521 	},
3522 	{
3523 		.cmd = NL80211_CMD_SET_BSS,
3524 		.doit = nl80211_set_bss,
3525 		.policy = nl80211_policy,
3526 		.flags = GENL_ADMIN_PERM,
3527 	},
3528 	{
3529 		.cmd = NL80211_CMD_GET_REG,
3530 		.doit = nl80211_get_reg,
3531 		.policy = nl80211_policy,
3532 		/* can be retrieved by unprivileged users */
3533 	},
3534 	{
3535 		.cmd = NL80211_CMD_SET_REG,
3536 		.doit = nl80211_set_reg,
3537 		.policy = nl80211_policy,
3538 		.flags = GENL_ADMIN_PERM,
3539 	},
3540 	{
3541 		.cmd = NL80211_CMD_REQ_SET_REG,
3542 		.doit = nl80211_req_set_reg,
3543 		.policy = nl80211_policy,
3544 		.flags = GENL_ADMIN_PERM,
3545 	},
3546 	{
3547 		.cmd = NL80211_CMD_GET_MESH_PARAMS,
3548 		.doit = nl80211_get_mesh_params,
3549 		.policy = nl80211_policy,
3550 		/* can be retrieved by unprivileged users */
3551 	},
3552 	{
3553 		.cmd = NL80211_CMD_SET_MESH_PARAMS,
3554 		.doit = nl80211_set_mesh_params,
3555 		.policy = nl80211_policy,
3556 		.flags = GENL_ADMIN_PERM,
3557 	},
3558 	{
3559 		.cmd = NL80211_CMD_TRIGGER_SCAN,
3560 		.doit = nl80211_trigger_scan,
3561 		.policy = nl80211_policy,
3562 		.flags = GENL_ADMIN_PERM,
3563 	},
3564 	{
3565 		.cmd = NL80211_CMD_GET_SCAN,
3566 		.policy = nl80211_policy,
3567 		.dumpit = nl80211_dump_scan,
3568 	},
3569 	{
3570 		.cmd = NL80211_CMD_AUTHENTICATE,
3571 		.doit = nl80211_authenticate,
3572 		.policy = nl80211_policy,
3573 		.flags = GENL_ADMIN_PERM,
3574 	},
3575 	{
3576 		.cmd = NL80211_CMD_ASSOCIATE,
3577 		.doit = nl80211_associate,
3578 		.policy = nl80211_policy,
3579 		.flags = GENL_ADMIN_PERM,
3580 	},
3581 	{
3582 		.cmd = NL80211_CMD_DEAUTHENTICATE,
3583 		.doit = nl80211_deauthenticate,
3584 		.policy = nl80211_policy,
3585 		.flags = GENL_ADMIN_PERM,
3586 	},
3587 	{
3588 		.cmd = NL80211_CMD_DISASSOCIATE,
3589 		.doit = nl80211_disassociate,
3590 		.policy = nl80211_policy,
3591 		.flags = GENL_ADMIN_PERM,
3592 	},
3593 	{
3594 		.cmd = NL80211_CMD_JOIN_IBSS,
3595 		.doit = nl80211_join_ibss,
3596 		.policy = nl80211_policy,
3597 		.flags = GENL_ADMIN_PERM,
3598 	},
3599 	{
3600 		.cmd = NL80211_CMD_LEAVE_IBSS,
3601 		.doit = nl80211_leave_ibss,
3602 		.policy = nl80211_policy,
3603 		.flags = GENL_ADMIN_PERM,
3604 	},
3605 };
3606 static struct genl_multicast_group nl80211_mlme_mcgrp = {
3607 	.name = "mlme",
3608 };
3609 
3610 /* multicast groups */
3611 static struct genl_multicast_group nl80211_config_mcgrp = {
3612 	.name = "config",
3613 };
3614 static struct genl_multicast_group nl80211_scan_mcgrp = {
3615 	.name = "scan",
3616 };
3617 static struct genl_multicast_group nl80211_regulatory_mcgrp = {
3618 	.name = "regulatory",
3619 };
3620 
3621 /* notification functions */
3622 
3623 void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev)
3624 {
3625 	struct sk_buff *msg;
3626 
3627 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3628 	if (!msg)
3629 		return;
3630 
3631 	if (nl80211_send_wiphy(msg, 0, 0, 0, rdev) < 0) {
3632 		nlmsg_free(msg);
3633 		return;
3634 	}
3635 
3636 	genlmsg_multicast(msg, 0, nl80211_config_mcgrp.id, GFP_KERNEL);
3637 }
3638 
3639 static int nl80211_add_scan_req(struct sk_buff *msg,
3640 				struct cfg80211_registered_device *rdev)
3641 {
3642 	struct cfg80211_scan_request *req = rdev->scan_req;
3643 	struct nlattr *nest;
3644 	int i;
3645 
3646 	if (WARN_ON(!req))
3647 		return 0;
3648 
3649 	nest = nla_nest_start(msg, NL80211_ATTR_SCAN_SSIDS);
3650 	if (!nest)
3651 		goto nla_put_failure;
3652 	for (i = 0; i < req->n_ssids; i++)
3653 		NLA_PUT(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid);
3654 	nla_nest_end(msg, nest);
3655 
3656 	nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
3657 	if (!nest)
3658 		goto nla_put_failure;
3659 	for (i = 0; i < req->n_channels; i++)
3660 		NLA_PUT_U32(msg, i, req->channels[i]->center_freq);
3661 	nla_nest_end(msg, nest);
3662 
3663 	if (req->ie)
3664 		NLA_PUT(msg, NL80211_ATTR_IE, req->ie_len, req->ie);
3665 
3666 	return 0;
3667  nla_put_failure:
3668 	return -ENOBUFS;
3669 }
3670 
3671 static int nl80211_send_scan_donemsg(struct sk_buff *msg,
3672 				     struct cfg80211_registered_device *rdev,
3673 				     struct net_device *netdev,
3674 				     u32 pid, u32 seq, int flags,
3675 				     u32 cmd)
3676 {
3677 	void *hdr;
3678 
3679 	hdr = nl80211hdr_put(msg, pid, seq, flags, cmd);
3680 	if (!hdr)
3681 		return -1;
3682 
3683 	NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
3684 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
3685 
3686 	/* ignore errors and send incomplete event anyway */
3687 	nl80211_add_scan_req(msg, rdev);
3688 
3689 	return genlmsg_end(msg, hdr);
3690 
3691  nla_put_failure:
3692 	genlmsg_cancel(msg, hdr);
3693 	return -EMSGSIZE;
3694 }
3695 
3696 void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
3697 			    struct net_device *netdev)
3698 {
3699 	struct sk_buff *msg;
3700 
3701 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3702 	if (!msg)
3703 		return;
3704 
3705 	if (nl80211_send_scan_donemsg(msg, rdev, netdev, 0, 0, 0,
3706 				      NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
3707 		nlmsg_free(msg);
3708 		return;
3709 	}
3710 
3711 	genlmsg_multicast(msg, 0, nl80211_scan_mcgrp.id, GFP_KERNEL);
3712 }
3713 
3714 void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
3715 			       struct net_device *netdev)
3716 {
3717 	struct sk_buff *msg;
3718 
3719 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3720 	if (!msg)
3721 		return;
3722 
3723 	if (nl80211_send_scan_donemsg(msg, rdev, netdev, 0, 0, 0,
3724 				      NL80211_CMD_SCAN_ABORTED) < 0) {
3725 		nlmsg_free(msg);
3726 		return;
3727 	}
3728 
3729 	genlmsg_multicast(msg, 0, nl80211_scan_mcgrp.id, GFP_KERNEL);
3730 }
3731 
3732 /*
3733  * This can happen on global regulatory changes or device specific settings
3734  * based on custom world regulatory domains.
3735  */
3736 void nl80211_send_reg_change_event(struct regulatory_request *request)
3737 {
3738 	struct sk_buff *msg;
3739 	void *hdr;
3740 
3741 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3742 	if (!msg)
3743 		return;
3744 
3745 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_CHANGE);
3746 	if (!hdr) {
3747 		nlmsg_free(msg);
3748 		return;
3749 	}
3750 
3751 	/* Userspace can always count this one always being set */
3752 	NLA_PUT_U8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator);
3753 
3754 	if (request->alpha2[0] == '0' && request->alpha2[1] == '0')
3755 		NLA_PUT_U8(msg, NL80211_ATTR_REG_TYPE,
3756 			   NL80211_REGDOM_TYPE_WORLD);
3757 	else if (request->alpha2[0] == '9' && request->alpha2[1] == '9')
3758 		NLA_PUT_U8(msg, NL80211_ATTR_REG_TYPE,
3759 			   NL80211_REGDOM_TYPE_CUSTOM_WORLD);
3760 	else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
3761 		 request->intersect)
3762 		NLA_PUT_U8(msg, NL80211_ATTR_REG_TYPE,
3763 			   NL80211_REGDOM_TYPE_INTERSECTION);
3764 	else {
3765 		NLA_PUT_U8(msg, NL80211_ATTR_REG_TYPE,
3766 			   NL80211_REGDOM_TYPE_COUNTRY);
3767 		NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2, request->alpha2);
3768 	}
3769 
3770 	if (wiphy_idx_valid(request->wiphy_idx))
3771 		NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx);
3772 
3773 	if (genlmsg_end(msg, hdr) < 0) {
3774 		nlmsg_free(msg);
3775 		return;
3776 	}
3777 
3778 	genlmsg_multicast(msg, 0, nl80211_regulatory_mcgrp.id, GFP_KERNEL);
3779 
3780 	return;
3781 
3782 nla_put_failure:
3783 	genlmsg_cancel(msg, hdr);
3784 	nlmsg_free(msg);
3785 }
3786 
3787 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
3788 				    struct net_device *netdev,
3789 				    const u8 *buf, size_t len,
3790 				    enum nl80211_commands cmd)
3791 {
3792 	struct sk_buff *msg;
3793 	void *hdr;
3794 
3795 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
3796 	if (!msg)
3797 		return;
3798 
3799 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
3800 	if (!hdr) {
3801 		nlmsg_free(msg);
3802 		return;
3803 	}
3804 
3805 	NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
3806 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
3807 	NLA_PUT(msg, NL80211_ATTR_FRAME, len, buf);
3808 
3809 	if (genlmsg_end(msg, hdr) < 0) {
3810 		nlmsg_free(msg);
3811 		return;
3812 	}
3813 
3814 	genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, GFP_ATOMIC);
3815 	return;
3816 
3817  nla_put_failure:
3818 	genlmsg_cancel(msg, hdr);
3819 	nlmsg_free(msg);
3820 }
3821 
3822 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
3823 			  struct net_device *netdev, const u8 *buf, size_t len)
3824 {
3825 	nl80211_send_mlme_event(rdev, netdev, buf, len,
3826 				NL80211_CMD_AUTHENTICATE);
3827 }
3828 
3829 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
3830 			   struct net_device *netdev, const u8 *buf,
3831 			   size_t len)
3832 {
3833 	nl80211_send_mlme_event(rdev, netdev, buf, len, NL80211_CMD_ASSOCIATE);
3834 }
3835 
3836 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
3837 			 struct net_device *netdev, const u8 *buf, size_t len)
3838 {
3839 	nl80211_send_mlme_event(rdev, netdev, buf, len,
3840 				NL80211_CMD_DEAUTHENTICATE);
3841 }
3842 
3843 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
3844 			   struct net_device *netdev, const u8 *buf,
3845 			   size_t len)
3846 {
3847 	nl80211_send_mlme_event(rdev, netdev, buf, len,
3848 				NL80211_CMD_DISASSOCIATE);
3849 }
3850 
3851 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
3852 				      struct net_device *netdev, int cmd,
3853 				      const u8 *addr)
3854 {
3855 	struct sk_buff *msg;
3856 	void *hdr;
3857 
3858 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
3859 	if (!msg)
3860 		return;
3861 
3862 	hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
3863 	if (!hdr) {
3864 		nlmsg_free(msg);
3865 		return;
3866 	}
3867 
3868 	NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
3869 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
3870 	NLA_PUT_FLAG(msg, NL80211_ATTR_TIMED_OUT);
3871 	NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
3872 
3873 	if (genlmsg_end(msg, hdr) < 0) {
3874 		nlmsg_free(msg);
3875 		return;
3876 	}
3877 
3878 	genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, GFP_ATOMIC);
3879 	return;
3880 
3881  nla_put_failure:
3882 	genlmsg_cancel(msg, hdr);
3883 	nlmsg_free(msg);
3884 }
3885 
3886 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
3887 			       struct net_device *netdev, const u8 *addr)
3888 {
3889 	nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
3890 				  addr);
3891 }
3892 
3893 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
3894 				struct net_device *netdev, const u8 *addr)
3895 {
3896 	nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE, addr);
3897 }
3898 
3899 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
3900 			     struct net_device *netdev, const u8 *bssid,
3901 			     gfp_t gfp)
3902 {
3903 	struct sk_buff *msg;
3904 	void *hdr;
3905 
3906 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
3907 	if (!msg)
3908 		return;
3909 
3910 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
3911 	if (!hdr) {
3912 		nlmsg_free(msg);
3913 		return;
3914 	}
3915 
3916 	NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
3917 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
3918 	NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid);
3919 
3920 	if (genlmsg_end(msg, hdr) < 0) {
3921 		nlmsg_free(msg);
3922 		return;
3923 	}
3924 
3925 	genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, gfp);
3926 	return;
3927 
3928  nla_put_failure:
3929 	genlmsg_cancel(msg, hdr);
3930 	nlmsg_free(msg);
3931 }
3932 
3933 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
3934 				 struct net_device *netdev, const u8 *addr,
3935 				 enum nl80211_key_type key_type, int key_id,
3936 				 const u8 *tsc)
3937 {
3938 	struct sk_buff *msg;
3939 	void *hdr;
3940 
3941 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
3942 	if (!msg)
3943 		return;
3944 
3945 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
3946 	if (!hdr) {
3947 		nlmsg_free(msg);
3948 		return;
3949 	}
3950 
3951 	NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
3952 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
3953 	if (addr)
3954 		NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
3955 	NLA_PUT_U32(msg, NL80211_ATTR_KEY_TYPE, key_type);
3956 	NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_id);
3957 	if (tsc)
3958 		NLA_PUT(msg, NL80211_ATTR_KEY_SEQ, 6, tsc);
3959 
3960 	if (genlmsg_end(msg, hdr) < 0) {
3961 		nlmsg_free(msg);
3962 		return;
3963 	}
3964 
3965 	genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, GFP_ATOMIC);
3966 	return;
3967 
3968  nla_put_failure:
3969 	genlmsg_cancel(msg, hdr);
3970 	nlmsg_free(msg);
3971 }
3972 
3973 void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
3974 				    struct ieee80211_channel *channel_before,
3975 				    struct ieee80211_channel *channel_after)
3976 {
3977 	struct sk_buff *msg;
3978 	void *hdr;
3979 	struct nlattr *nl_freq;
3980 
3981 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
3982 	if (!msg)
3983 		return;
3984 
3985 	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
3986 	if (!hdr) {
3987 		nlmsg_free(msg);
3988 		return;
3989 	}
3990 
3991 	/*
3992 	 * Since we are applying the beacon hint to a wiphy we know its
3993 	 * wiphy_idx is valid
3994 	 */
3995 	NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy));
3996 
3997 	/* Before */
3998 	nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_BEFORE);
3999 	if (!nl_freq)
4000 		goto nla_put_failure;
4001 	if (nl80211_msg_put_channel(msg, channel_before))
4002 		goto nla_put_failure;
4003 	nla_nest_end(msg, nl_freq);
4004 
4005 	/* After */
4006 	nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_AFTER);
4007 	if (!nl_freq)
4008 		goto nla_put_failure;
4009 	if (nl80211_msg_put_channel(msg, channel_after))
4010 		goto nla_put_failure;
4011 	nla_nest_end(msg, nl_freq);
4012 
4013 	if (genlmsg_end(msg, hdr) < 0) {
4014 		nlmsg_free(msg);
4015 		return;
4016 	}
4017 
4018 	genlmsg_multicast(msg, 0, nl80211_regulatory_mcgrp.id, GFP_ATOMIC);
4019 
4020 	return;
4021 
4022 nla_put_failure:
4023 	genlmsg_cancel(msg, hdr);
4024 	nlmsg_free(msg);
4025 }
4026 
4027 /* initialisation/exit functions */
4028 
4029 int nl80211_init(void)
4030 {
4031 	int err;
4032 
4033 	err = genl_register_family_with_ops(&nl80211_fam,
4034 		nl80211_ops, ARRAY_SIZE(nl80211_ops));
4035 	if (err)
4036 		return err;
4037 
4038 	err = genl_register_mc_group(&nl80211_fam, &nl80211_config_mcgrp);
4039 	if (err)
4040 		goto err_out;
4041 
4042 	err = genl_register_mc_group(&nl80211_fam, &nl80211_scan_mcgrp);
4043 	if (err)
4044 		goto err_out;
4045 
4046 	err = genl_register_mc_group(&nl80211_fam, &nl80211_regulatory_mcgrp);
4047 	if (err)
4048 		goto err_out;
4049 
4050 	err = genl_register_mc_group(&nl80211_fam, &nl80211_mlme_mcgrp);
4051 	if (err)
4052 		goto err_out;
4053 
4054 	return 0;
4055  err_out:
4056 	genl_unregister_family(&nl80211_fam);
4057 	return err;
4058 }
4059 
4060 void nl80211_exit(void)
4061 {
4062 	genl_unregister_family(&nl80211_fam);
4063 }
4064