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