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