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