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