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