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