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