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