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