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