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         nla_nest_end(skb, data);
6646         genlmsg_end(skb, hdr);
6647
6648         if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
6649                 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), skb, 0,
6650                         nl80211_vendor_mcgrp.id, gfp);
6651         else
6652                 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), skb, 0,
6653                         nl80211_testmode_mcgrp.id, gfp);
6654 }
6655 EXPORT_SYMBOL(__cfg80211_send_event_skb);
6656 #endif
6657
6658 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
6659 {
6660         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6661         struct net_device *dev = info->user_ptr[1];
6662         struct cfg80211_connect_params connect;
6663         struct wiphy *wiphy;
6664         struct cfg80211_cached_keys *connkeys = NULL;
6665         int err;
6666
6667         memset(&connect, 0, sizeof(connect));
6668
6669         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6670                 return -EINVAL;
6671
6672         if (!info->attrs[NL80211_ATTR_SSID] ||
6673             !nla_len(info->attrs[NL80211_ATTR_SSID]))
6674                 return -EINVAL;
6675
6676         if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
6677                 connect.auth_type =
6678                         nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
6679                 if (!nl80211_valid_auth_type(rdev, connect.auth_type,
6680                                              NL80211_CMD_CONNECT))
6681                         return -EINVAL;
6682         } else
6683                 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
6684
6685         connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
6686
6687         err = nl80211_crypto_settings(rdev, info, &connect.crypto,
6688                                       NL80211_MAX_NR_CIPHER_SUITES);
6689         if (err)
6690                 return err;
6691
6692         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
6693             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
6694                 return -EOPNOTSUPP;
6695
6696         wiphy = &rdev->wiphy;
6697
6698         connect.bg_scan_period = -1;
6699         if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] &&
6700                 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) {
6701                 connect.bg_scan_period =
6702                         nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]);
6703         }
6704
6705         if (info->attrs[NL80211_ATTR_MAC])
6706                 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
6707         connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
6708         connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
6709
6710         if (info->attrs[NL80211_ATTR_IE]) {
6711                 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
6712                 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6713         }
6714
6715         if (info->attrs[NL80211_ATTR_USE_MFP]) {
6716                 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
6717                 if (connect.mfp != NL80211_MFP_REQUIRED &&
6718                     connect.mfp != NL80211_MFP_NO)
6719                         return -EINVAL;
6720         } else {
6721                 connect.mfp = NL80211_MFP_NO;
6722         }
6723
6724         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
6725                 connect.channel =
6726                         ieee80211_get_channel(wiphy,
6727                             nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
6728                 if (!connect.channel ||
6729                     connect.channel->flags & IEEE80211_CHAN_DISABLED)
6730                         return -EINVAL;
6731         }
6732
6733         if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
6734                 connkeys = nl80211_parse_connkeys(rdev,
6735                                           info->attrs[NL80211_ATTR_KEYS], NULL);
6736                 if (IS_ERR(connkeys))
6737                         return PTR_ERR(connkeys);
6738         }
6739
6740         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
6741                 connect.flags |= ASSOC_REQ_DISABLE_HT;
6742
6743         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
6744                 memcpy(&connect.ht_capa_mask,
6745                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
6746                        sizeof(connect.ht_capa_mask));
6747
6748         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
6749                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
6750                         kfree(connkeys);
6751                         return -EINVAL;
6752                 }
6753                 memcpy(&connect.ht_capa,
6754                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
6755                        sizeof(connect.ht_capa));
6756         }
6757
6758         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
6759                 connect.flags |= ASSOC_REQ_DISABLE_VHT;
6760
6761         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
6762                 memcpy(&connect.vht_capa_mask,
6763                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
6764                        sizeof(connect.vht_capa_mask));
6765
6766         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
6767                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
6768                         kfree(connkeys);
6769                         return -EINVAL;
6770                 }
6771                 memcpy(&connect.vht_capa,
6772                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
6773                        sizeof(connect.vht_capa));
6774         }
6775
6776         err = cfg80211_connect(rdev, dev, &connect, connkeys);
6777         if (err)
6778                 kfree(connkeys);
6779         return err;
6780 }
6781
6782 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
6783 {
6784         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6785         struct net_device *dev = info->user_ptr[1];
6786         u16 reason;
6787
6788         if (!info->attrs[NL80211_ATTR_REASON_CODE])
6789                 reason = WLAN_REASON_DEAUTH_LEAVING;
6790         else
6791                 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
6792
6793         if (reason == 0)
6794                 return -EINVAL;
6795
6796         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
6797             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
6798                 return -EOPNOTSUPP;
6799
6800         return cfg80211_disconnect(rdev, dev, reason, true);
6801 }
6802
6803 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
6804 {
6805         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6806         struct net *net;
6807         int err;
6808         u32 pid;
6809
6810         if (!info->attrs[NL80211_ATTR_PID])
6811                 return -EINVAL;
6812
6813         pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
6814
6815         net = get_net_ns_by_pid(pid);
6816         if (IS_ERR(net))
6817                 return PTR_ERR(net);
6818
6819         err = 0;
6820
6821         /* check if anything to do */
6822         if (!net_eq(wiphy_net(&rdev->wiphy), net))
6823                 err = cfg80211_switch_netns(rdev, net);
6824
6825         put_net(net);
6826         return err;
6827 }
6828
6829 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
6830 {
6831         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6832         int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev,
6833                         struct cfg80211_pmksa *pmksa) = NULL;
6834         struct net_device *dev = info->user_ptr[1];
6835         struct cfg80211_pmksa pmksa;
6836
6837         memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
6838
6839         if (!info->attrs[NL80211_ATTR_MAC])
6840                 return -EINVAL;
6841
6842         if (!info->attrs[NL80211_ATTR_PMKID])
6843                 return -EINVAL;
6844
6845         pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
6846         pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
6847
6848         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
6849             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
6850                 return -EOPNOTSUPP;
6851
6852         switch (info->genlhdr->cmd) {
6853         case NL80211_CMD_SET_PMKSA:
6854                 rdev_ops = rdev->ops->set_pmksa;
6855                 break;
6856         case NL80211_CMD_DEL_PMKSA:
6857                 rdev_ops = rdev->ops->del_pmksa;
6858                 break;
6859         default:
6860                 WARN_ON(1);
6861                 break;
6862         }
6863
6864         if (!rdev_ops)
6865                 return -EOPNOTSUPP;
6866
6867         return rdev_ops(&rdev->wiphy, dev, &pmksa);
6868 }
6869
6870 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
6871 {
6872         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6873         struct net_device *dev = info->user_ptr[1];
6874
6875         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
6876             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
6877                 return -EOPNOTSUPP;
6878
6879         if (!rdev->ops->flush_pmksa)
6880                 return -EOPNOTSUPP;
6881
6882         return rdev_flush_pmksa(rdev, dev);
6883 }
6884
6885 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
6886 {
6887         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6888         struct net_device *dev = info->user_ptr[1];
6889         u8 action_code, dialog_token;
6890         u16 status_code;
6891         u8 *peer;
6892
6893         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
6894             !rdev->ops->tdls_mgmt)
6895                 return -EOPNOTSUPP;
6896
6897         if (!info->attrs[NL80211_ATTR_TDLS_ACTION] ||
6898             !info->attrs[NL80211_ATTR_STATUS_CODE] ||
6899             !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] ||
6900             !info->attrs[NL80211_ATTR_IE] ||
6901             !info->attrs[NL80211_ATTR_MAC])
6902                 return -EINVAL;
6903
6904         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
6905         action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
6906         status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
6907         dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
6908
6909         return rdev_tdls_mgmt(rdev, dev, peer, action_code,
6910                               dialog_token, status_code,
6911                               nla_data(info->attrs[NL80211_ATTR_IE]),
6912                               nla_len(info->attrs[NL80211_ATTR_IE]));
6913 }
6914
6915 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info)
6916 {
6917         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6918         struct net_device *dev = info->user_ptr[1];
6919         enum nl80211_tdls_operation operation;
6920         u8 *peer;
6921
6922         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
6923             !rdev->ops->tdls_oper)
6924                 return -EOPNOTSUPP;
6925
6926         if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] ||
6927             !info->attrs[NL80211_ATTR_MAC])
6928                 return -EINVAL;
6929
6930         operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]);
6931         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
6932
6933         return rdev_tdls_oper(rdev, dev, peer, operation);
6934 }
6935
6936 static int nl80211_remain_on_channel(struct sk_buff *skb,
6937                                      struct genl_info *info)
6938 {
6939         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6940         struct wireless_dev *wdev = info->user_ptr[1];
6941         struct cfg80211_chan_def chandef;
6942         struct sk_buff *msg;
6943         void *hdr;
6944         u64 cookie;
6945         u32 duration;
6946         int err;
6947
6948         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
6949             !info->attrs[NL80211_ATTR_DURATION])
6950                 return -EINVAL;
6951
6952         duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
6953
6954         if (!rdev->ops->remain_on_channel ||
6955             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL))
6956                 return -EOPNOTSUPP;
6957
6958         /*
6959          * We should be on that channel for at least a minimum amount of
6960          * time (10ms) but no longer than the driver supports.
6961          */
6962         if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
6963             duration > rdev->wiphy.max_remain_on_channel_duration)
6964                 return -EINVAL;
6965
6966         err = nl80211_parse_chandef(rdev, info, &chandef);
6967         if (err)
6968                 return err;
6969
6970         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
6971         if (!msg)
6972                 return -ENOMEM;
6973
6974         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
6975                              NL80211_CMD_REMAIN_ON_CHANNEL);
6976         if (!hdr) {
6977                 err = -ENOBUFS;
6978                 goto free_msg;
6979         }
6980
6981         err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
6982                                      duration, &cookie);
6983
6984         if (err)
6985                 goto free_msg;
6986
6987         if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
6988                 goto nla_put_failure;
6989
6990         genlmsg_end(msg, hdr);
6991
6992         return genlmsg_reply(msg, info);
6993
6994  nla_put_failure:
6995         err = -ENOBUFS;
6996  free_msg:
6997         nlmsg_free(msg);
6998         return err;
6999 }
7000
7001 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
7002                                             struct genl_info *info)
7003 {
7004         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7005         struct wireless_dev *wdev = info->user_ptr[1];
7006         u64 cookie;
7007
7008         if (!info->attrs[NL80211_ATTR_COOKIE])
7009                 return -EINVAL;
7010
7011         if (!rdev->ops->cancel_remain_on_channel)
7012                 return -EOPNOTSUPP;
7013
7014         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
7015
7016         return rdev_cancel_remain_on_channel(rdev, wdev, cookie);
7017 }
7018
7019 static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
7020                            u8 *rates, u8 rates_len)
7021 {
7022         u8 i;
7023         u32 mask = 0;
7024
7025         for (i = 0; i < rates_len; i++) {
7026                 int rate = (rates[i] & 0x7f) * 5;
7027                 int ridx;
7028                 for (ridx = 0; ridx < sband->n_bitrates; ridx++) {
7029                         struct ieee80211_rate *srate =
7030                                 &sband->bitrates[ridx];
7031                         if (rate == srate->bitrate) {
7032                                 mask |= 1 << ridx;
7033                                 break;
7034                         }
7035                 }
7036                 if (ridx == sband->n_bitrates)
7037                         return 0; /* rate not found */
7038         }
7039
7040         return mask;
7041 }
7042
7043 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband,
7044                                u8 *rates, u8 rates_len,
7045                                u8 mcs[IEEE80211_HT_MCS_MASK_LEN])
7046 {
7047         u8 i;
7048
7049         memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN);
7050
7051         for (i = 0; i < rates_len; i++) {
7052                 int ridx, rbit;
7053
7054                 ridx = rates[i] / 8;
7055                 rbit = BIT(rates[i] % 8);
7056
7057                 /* check validity */
7058                 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN))
7059                         return false;
7060
7061                 /* check availability */
7062                 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit)
7063                         mcs[ridx] |= rbit;
7064                 else
7065                         return false;
7066         }
7067
7068         return true;
7069 }
7070
7071 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
7072         [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY,
7073                                     .len = NL80211_MAX_SUPP_RATES },
7074         [NL80211_TXRATE_MCS] = { .type = NLA_BINARY,
7075                                  .len = NL80211_MAX_SUPP_HT_RATES },
7076 };
7077
7078 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
7079                                        struct genl_info *info)
7080 {
7081         struct nlattr *tb[NL80211_TXRATE_MAX + 1];
7082         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7083         struct cfg80211_bitrate_mask mask;
7084         int rem, i;
7085         struct net_device *dev = info->user_ptr[1];
7086         struct nlattr *tx_rates;
7087         struct ieee80211_supported_band *sband;
7088
7089         if (info->attrs[NL80211_ATTR_TX_RATES] == NULL)
7090                 return -EINVAL;
7091
7092         if (!rdev->ops->set_bitrate_mask)
7093                 return -EOPNOTSUPP;
7094
7095         memset(&mask, 0, sizeof(mask));
7096         /* Default to all rates enabled */
7097         for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
7098                 sband = rdev->wiphy.bands[i];
7099                 mask.control[i].legacy =
7100                         sband ? (1 << sband->n_bitrates) - 1 : 0;
7101                 if (sband)
7102                         memcpy(mask.control[i].mcs,
7103                                sband->ht_cap.mcs.rx_mask,
7104                                sizeof(mask.control[i].mcs));
7105                 else
7106                         memset(mask.control[i].mcs, 0,
7107                                sizeof(mask.control[i].mcs));
7108         }
7109
7110         /*
7111          * The nested attribute uses enum nl80211_band as the index. This maps
7112          * directly to the enum ieee80211_band values used in cfg80211.
7113          */
7114         BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
7115         nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem)
7116         {
7117                 enum ieee80211_band band = nla_type(tx_rates);
7118                 if (band < 0 || band >= IEEE80211_NUM_BANDS)
7119                         return -EINVAL;
7120                 sband = rdev->wiphy.bands[band];
7121                 if (sband == NULL)
7122                         return -EINVAL;
7123                 nla_parse(tb, NL80211_TXRATE_MAX, nla_data(tx_rates),
7124                           nla_len(tx_rates), nl80211_txattr_policy);
7125                 if (tb[NL80211_TXRATE_LEGACY]) {
7126                         mask.control[band].legacy = rateset_to_mask(
7127                                 sband,
7128                                 nla_data(tb[NL80211_TXRATE_LEGACY]),
7129                                 nla_len(tb[NL80211_TXRATE_LEGACY]));
7130                         if ((mask.control[band].legacy == 0) &&
7131                             nla_len(tb[NL80211_TXRATE_LEGACY]))
7132                                 return -EINVAL;
7133                 }
7134                 if (tb[NL80211_TXRATE_MCS]) {
7135                         if (!ht_rateset_to_mask(
7136                                         sband,
7137                                         nla_data(tb[NL80211_TXRATE_MCS]),
7138                                         nla_len(tb[NL80211_TXRATE_MCS]),
7139                                         mask.control[band].mcs))
7140                                 return -EINVAL;
7141                 }
7142
7143                 if (mask.control[band].legacy == 0) {
7144                         /* don't allow empty legacy rates if HT
7145                          * is not even supported. */
7146                         if (!rdev->wiphy.bands[band]->ht_cap.ht_supported)
7147                                 return -EINVAL;
7148
7149                         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
7150                                 if (mask.control[band].mcs[i])
7151                                         break;
7152
7153                         /* legacy and mcs rates may not be both empty */
7154                         if (i == IEEE80211_HT_MCS_MASK_LEN)
7155                                 return -EINVAL;
7156                 }
7157         }
7158
7159         return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
7160 }
7161
7162 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
7163 {
7164         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7165         struct wireless_dev *wdev = info->user_ptr[1];
7166         u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
7167
7168         if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
7169                 return -EINVAL;
7170
7171         if (info->attrs[NL80211_ATTR_FRAME_TYPE])
7172                 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
7173
7174         switch (wdev->iftype) {
7175         case NL80211_IFTYPE_STATION:
7176         case NL80211_IFTYPE_ADHOC:
7177         case NL80211_IFTYPE_P2P_CLIENT:
7178         case NL80211_IFTYPE_AP:
7179         case NL80211_IFTYPE_AP_VLAN:
7180         case NL80211_IFTYPE_MESH_POINT:
7181         case NL80211_IFTYPE_P2P_GO:
7182         case NL80211_IFTYPE_P2P_DEVICE:
7183                 break;
7184         default:
7185                 return -EOPNOTSUPP;
7186         }
7187
7188         /* not much point in registering if we can't reply */
7189         if (!rdev->ops->mgmt_tx)
7190                 return -EOPNOTSUPP;
7191
7192         return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type,
7193                         nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
7194                         nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]));
7195 }
7196
7197 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
7198 {
7199         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7200         struct wireless_dev *wdev = info->user_ptr[1];
7201         struct cfg80211_chan_def chandef;
7202         int err;
7203         void *hdr = NULL;
7204         u64 cookie;
7205         struct sk_buff *msg = NULL;
7206         unsigned int wait = 0;
7207         bool offchan, no_cck, dont_wait_for_ack;
7208
7209         dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK];
7210
7211         if (!info->attrs[NL80211_ATTR_FRAME])
7212                 return -EINVAL;
7213
7214         if (!rdev->ops->mgmt_tx)
7215                 return -EOPNOTSUPP;
7216
7217         switch (wdev->iftype) {
7218         case NL80211_IFTYPE_STATION:
7219         case NL80211_IFTYPE_ADHOC:
7220         case NL80211_IFTYPE_P2P_CLIENT:
7221         case NL80211_IFTYPE_AP:
7222         case NL80211_IFTYPE_AP_VLAN:
7223         case NL80211_IFTYPE_MESH_POINT:
7224         case NL80211_IFTYPE_P2P_GO:
7225         case NL80211_IFTYPE_P2P_DEVICE:
7226                 break;
7227         default:
7228                 return -EOPNOTSUPP;
7229         }
7230
7231         if (info->attrs[NL80211_ATTR_DURATION]) {
7232                 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
7233                         return -EINVAL;
7234                 wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
7235
7236                 /*
7237                  * We should wait on the channel for at least a minimum amount
7238                  * of time (10ms) but no longer than the driver supports.
7239                  */
7240                 if (wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
7241                     wait > rdev->wiphy.max_remain_on_channel_duration)
7242                         return -EINVAL;
7243
7244         }
7245
7246         offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
7247
7248         if (offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
7249                 return -EINVAL;
7250
7251         no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
7252
7253         err = nl80211_parse_chandef(rdev, info, &chandef);
7254         if (err)
7255                 return err;
7256
7257         if (!dont_wait_for_ack) {
7258                 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7259                 if (!msg)
7260                         return -ENOMEM;
7261
7262                 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
7263                                      NL80211_CMD_FRAME);
7264                 if (!hdr) {
7265                         err = -ENOBUFS;
7266                         goto free_msg;
7267                 }
7268         }
7269
7270         err = cfg80211_mlme_mgmt_tx(rdev, wdev, chandef.chan, offchan, wait,
7271                                     nla_data(info->attrs[NL80211_ATTR_FRAME]),
7272                                     nla_len(info->attrs[NL80211_ATTR_FRAME]),
7273                                     no_cck, dont_wait_for_ack, &cookie);
7274         if (err)
7275                 goto free_msg;
7276
7277         if (msg) {
7278                 if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
7279                         goto nla_put_failure;
7280
7281                 genlmsg_end(msg, hdr);
7282                 return genlmsg_reply(msg, info);
7283         }
7284
7285         return 0;
7286
7287  nla_put_failure:
7288         err = -ENOBUFS;
7289  free_msg:
7290         nlmsg_free(msg);
7291         return err;
7292 }
7293
7294 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
7295 {
7296         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7297         struct wireless_dev *wdev = info->user_ptr[1];
7298         u64 cookie;
7299
7300         if (!info->attrs[NL80211_ATTR_COOKIE])
7301                 return -EINVAL;
7302
7303         if (!rdev->ops->mgmt_tx_cancel_wait)
7304                 return -EOPNOTSUPP;
7305
7306         switch (wdev->iftype) {
7307         case NL80211_IFTYPE_STATION:
7308         case NL80211_IFTYPE_ADHOC:
7309         case NL80211_IFTYPE_P2P_CLIENT:
7310         case NL80211_IFTYPE_AP:
7311         case NL80211_IFTYPE_AP_VLAN:
7312         case NL80211_IFTYPE_P2P_GO:
7313         case NL80211_IFTYPE_P2P_DEVICE:
7314                 break;
7315         default:
7316                 return -EOPNOTSUPP;
7317         }
7318
7319         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
7320
7321         return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie);
7322 }
7323
7324 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
7325 {
7326         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7327         struct wireless_dev *wdev;
7328         struct net_device *dev = info->user_ptr[1];
7329         u8 ps_state;
7330         bool state;
7331         int err;
7332
7333         if (!info->attrs[NL80211_ATTR_PS_STATE])
7334                 return -EINVAL;
7335
7336         ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
7337
7338         if (ps_state != NL80211_PS_DISABLED && ps_state != NL80211_PS_ENABLED)
7339                 return -EINVAL;
7340
7341         wdev = dev->ieee80211_ptr;
7342
7343         if (!rdev->ops->set_power_mgmt)
7344                 return -EOPNOTSUPP;
7345
7346         state = (ps_state == NL80211_PS_ENABLED) ? true : false;
7347
7348         if (state == wdev->ps)
7349                 return 0;
7350
7351         err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout);
7352         if (!err)
7353                 wdev->ps = state;
7354         return err;
7355 }
7356
7357 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
7358 {
7359         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7360         enum nl80211_ps_state ps_state;
7361         struct wireless_dev *wdev;
7362         struct net_device *dev = info->user_ptr[1];
7363         struct sk_buff *msg;
7364         void *hdr;
7365         int err;
7366
7367         wdev = dev->ieee80211_ptr;
7368
7369         if (!rdev->ops->set_power_mgmt)
7370                 return -EOPNOTSUPP;
7371
7372         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7373         if (!msg)
7374                 return -ENOMEM;
7375
7376         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
7377                              NL80211_CMD_GET_POWER_SAVE);
7378         if (!hdr) {
7379                 err = -ENOBUFS;
7380                 goto free_msg;
7381         }
7382
7383         if (wdev->ps)
7384                 ps_state = NL80211_PS_ENABLED;
7385         else
7386                 ps_state = NL80211_PS_DISABLED;
7387
7388         if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state))
7389                 goto nla_put_failure;
7390
7391         genlmsg_end(msg, hdr);
7392         return genlmsg_reply(msg, info);
7393
7394  nla_put_failure:
7395         err = -ENOBUFS;
7396  free_msg:
7397         nlmsg_free(msg);
7398         return err;
7399 }
7400
7401 static struct nla_policy
7402 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] __read_mostly = {
7403         [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_U32 },
7404         [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 },
7405         [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
7406         [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
7407         [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
7408         [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
7409 };
7410
7411 static int nl80211_set_cqm_txe(struct genl_info *info,
7412                                u32 rate, u32 pkts, u32 intvl)
7413 {
7414         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7415         struct wireless_dev *wdev;
7416         struct net_device *dev = info->user_ptr[1];
7417
7418         if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL)
7419                 return -EINVAL;
7420
7421         wdev = dev->ieee80211_ptr;
7422
7423         if (!rdev->ops->set_cqm_txe_config)
7424                 return -EOPNOTSUPP;
7425
7426         if (wdev->iftype != NL80211_IFTYPE_STATION &&
7427             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
7428                 return -EOPNOTSUPP;
7429
7430         return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl);
7431 }
7432
7433 static int nl80211_set_cqm_rssi(struct genl_info *info,
7434                                 s32 threshold, u32 hysteresis)
7435 {
7436         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7437         struct wireless_dev *wdev;
7438         struct net_device *dev = info->user_ptr[1];
7439
7440         if (threshold > 0)
7441                 return -EINVAL;
7442
7443         wdev = dev->ieee80211_ptr;
7444
7445         if (!rdev->ops->set_cqm_rssi_config)
7446                 return -EOPNOTSUPP;
7447
7448         if (wdev->iftype != NL80211_IFTYPE_STATION &&
7449             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
7450                 return -EOPNOTSUPP;
7451
7452         return rdev_set_cqm_rssi_config(rdev, dev, threshold, hysteresis);
7453 }
7454
7455 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
7456 {
7457         struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1];
7458         struct nlattr *cqm;
7459         int err;
7460
7461         cqm = info->attrs[NL80211_ATTR_CQM];
7462         if (!cqm) {
7463                 err = -EINVAL;
7464                 goto out;
7465         }
7466
7467         err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm,
7468                                nl80211_attr_cqm_policy);
7469         if (err)
7470                 goto out;
7471
7472         if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
7473             attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
7474                 s32 threshold;
7475                 u32 hysteresis;
7476                 threshold = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
7477                 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
7478                 err = nl80211_set_cqm_rssi(info, threshold, hysteresis);
7479         } else if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
7480                    attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
7481                    attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
7482                 u32 rate, pkts, intvl;
7483                 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
7484                 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
7485                 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
7486                 err = nl80211_set_cqm_txe(info, rate, pkts, intvl);
7487         } else
7488                 err = -EINVAL;
7489
7490 out:
7491         return err;
7492 }
7493
7494 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
7495 {
7496         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7497         struct net_device *dev = info->user_ptr[1];
7498         struct mesh_config cfg;
7499         struct mesh_setup setup;
7500         int err;
7501
7502         /* start with default */
7503         memcpy(&cfg, &default_mesh_config, sizeof(cfg));
7504         memcpy(&setup, &default_mesh_setup, sizeof(setup));
7505
7506         if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
7507                 /* and parse parameters if given */
7508                 err = nl80211_parse_mesh_config(info, &cfg, NULL);
7509                 if (err)
7510                         return err;
7511         }
7512
7513         if (!info->attrs[NL80211_ATTR_MESH_ID] ||
7514             !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
7515                 return -EINVAL;
7516
7517         setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
7518         setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
7519
7520         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
7521             !nl80211_parse_mcast_rate(rdev, setup.mcast_rate,
7522                             nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
7523                         return -EINVAL;
7524
7525         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
7526                 setup.beacon_interval =
7527                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
7528                 if (setup.beacon_interval < 10 ||
7529                     setup.beacon_interval > 10000)
7530                         return -EINVAL;
7531         }
7532
7533         if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
7534                 setup.dtim_period =
7535                         nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
7536                 if (setup.dtim_period < 1 || setup.dtim_period > 100)
7537                         return -EINVAL;
7538         }
7539
7540         if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
7541                 /* parse additional setup parameters if given */
7542                 err = nl80211_parse_mesh_setup(info, &setup);
7543                 if (err)
7544                         return err;
7545         }
7546
7547         if (setup.user_mpm)
7548                 cfg.auto_open_plinks = false;
7549
7550         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
7551                 err = nl80211_parse_chandef(rdev, info, &setup.chandef);
7552                 if (err)
7553                         return err;
7554         } else {
7555                 /* cfg80211_join_mesh() will sort it out */
7556                 setup.chandef.chan = NULL;
7557         }
7558
7559         return cfg80211_join_mesh(rdev, dev, &setup, &cfg);
7560 }
7561
7562 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
7563 {
7564         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7565         struct net_device *dev = info->user_ptr[1];
7566
7567         return cfg80211_leave_mesh(rdev, dev);
7568 }
7569
7570 #ifdef CONFIG_PM
7571 static int nl80211_send_wowlan_patterns(struct sk_buff *msg,
7572                                         struct cfg80211_registered_device *rdev)
7573 {
7574         struct nlattr *nl_pats, *nl_pat;
7575         int i, pat_len;
7576
7577         if (!rdev->wowlan->n_patterns)
7578                 return 0;
7579
7580         nl_pats = nla_nest_start(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN);
7581         if (!nl_pats)
7582                 return -ENOBUFS;
7583
7584         for (i = 0; i < rdev->wowlan->n_patterns; i++) {
7585                 nl_pat = nla_nest_start(msg, i + 1);
7586                 if (!nl_pat)
7587                         return -ENOBUFS;
7588                 pat_len = rdev->wowlan->patterns[i].pattern_len;
7589                 if (nla_put(msg, NL80211_WOWLAN_PKTPAT_MASK,
7590                             DIV_ROUND_UP(pat_len, 8),
7591                             rdev->wowlan->patterns[i].mask) ||
7592                     nla_put(msg, NL80211_WOWLAN_PKTPAT_PATTERN,
7593                             pat_len, rdev->wowlan->patterns[i].pattern) ||
7594                     nla_put_u32(msg, NL80211_WOWLAN_PKTPAT_OFFSET,
7595                                 rdev->wowlan->patterns[i].pkt_offset))
7596                         return -ENOBUFS;
7597                 nla_nest_end(msg, nl_pat);
7598         }
7599         nla_nest_end(msg, nl_pats);
7600
7601         return 0;
7602 }
7603
7604 static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
7605                                    struct cfg80211_wowlan_tcp *tcp)
7606 {
7607         struct nlattr *nl_tcp;
7608
7609         if (!tcp)
7610                 return 0;
7611
7612         nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
7613         if (!nl_tcp)
7614                 return -ENOBUFS;
7615
7616         if (nla_put_be32(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) ||
7617             nla_put_be32(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) ||
7618             nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) ||
7619             nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) ||
7620             nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) ||
7621             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
7622                     tcp->payload_len, tcp->payload) ||
7623             nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
7624                         tcp->data_interval) ||
7625             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
7626                     tcp->wake_len, tcp->wake_data) ||
7627             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK,
7628                     DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask))
7629                 return -ENOBUFS;
7630
7631         if (tcp->payload_seq.len &&
7632             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
7633                     sizeof(tcp->payload_seq), &tcp->payload_seq))
7634                 return -ENOBUFS;
7635
7636         if (tcp->payload_tok.len &&
7637             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
7638                     sizeof(tcp->payload_tok) + tcp->tokens_size,
7639                     &tcp->payload_tok))
7640                 return -ENOBUFS;
7641
7642         nla_nest_end(msg, nl_tcp);
7643
7644         return 0;
7645 }
7646
7647 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
7648 {
7649         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7650         struct sk_buff *msg;
7651         void *hdr;
7652         u32 size = NLMSG_DEFAULT_SIZE;
7653
7654         if (!rdev->wiphy.wowlan.flags && !rdev->wiphy.wowlan.n_patterns &&
7655             !rdev->wiphy.wowlan.tcp)
7656                 return -EOPNOTSUPP;
7657
7658         if (rdev->wowlan && rdev->wowlan->tcp) {
7659                 /* adjust size to have room for all the data */
7660                 size += rdev->wowlan->tcp->tokens_size +
7661                         rdev->wowlan->tcp->payload_len +
7662                         rdev->wowlan->tcp->wake_len +
7663                         rdev->wowlan->tcp->wake_len / 8;
7664         }
7665
7666         msg = nlmsg_new(size, GFP_KERNEL);
7667         if (!msg)
7668                 return -ENOMEM;
7669
7670         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
7671                              NL80211_CMD_GET_WOWLAN);
7672         if (!hdr)
7673                 goto nla_put_failure;
7674
7675         if (rdev->wowlan) {
7676                 struct nlattr *nl_wowlan;
7677
7678                 nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
7679                 if (!nl_wowlan)
7680                         goto nla_put_failure;
7681
7682                 if ((rdev->wowlan->any &&
7683                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
7684                     (rdev->wowlan->disconnect &&
7685                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
7686                     (rdev->wowlan->magic_pkt &&
7687                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
7688                     (rdev->wowlan->gtk_rekey_failure &&
7689                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
7690                     (rdev->wowlan->eap_identity_req &&
7691                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
7692                     (rdev->wowlan->four_way_handshake &&
7693                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
7694                     (rdev->wowlan->rfkill_release &&
7695                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
7696                         goto nla_put_failure;
7697
7698                 if (nl80211_send_wowlan_patterns(msg, rdev))
7699                         goto nla_put_failure;
7700
7701                 if (nl80211_send_wowlan_tcp(msg, rdev->wowlan->tcp))
7702                         goto nla_put_failure;
7703
7704                 nla_nest_end(msg, nl_wowlan);
7705         }
7706
7707         genlmsg_end(msg, hdr);
7708         return genlmsg_reply(msg, info);
7709
7710 nla_put_failure:
7711         nlmsg_free(msg);
7712         return -ENOBUFS;
7713 }
7714
7715 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev,
7716                                     struct nlattr *attr,
7717                                     struct cfg80211_wowlan *trig)
7718 {
7719         struct nlattr *tb[NUM_NL80211_WOWLAN_TCP];
7720         struct cfg80211_wowlan_tcp *cfg;
7721         struct nl80211_wowlan_tcp_data_token *tok = NULL;
7722         struct nl80211_wowlan_tcp_data_seq *seq = NULL;
7723         u32 size;
7724         u32 data_size, wake_size, tokens_size = 0, wake_mask_size;
7725         int err, port;
7726
7727         if (!rdev->wiphy.wowlan.tcp)
7728                 return -EINVAL;
7729
7730         err = nla_parse(tb, MAX_NL80211_WOWLAN_TCP,
7731                         nla_data(attr), nla_len(attr),
7732                         nl80211_wowlan_tcp_policy);
7733         if (err)
7734                 return err;
7735
7736         if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] ||
7737             !tb[NL80211_WOWLAN_TCP_DST_IPV4] ||
7738             !tb[NL80211_WOWLAN_TCP_DST_MAC] ||
7739             !tb[NL80211_WOWLAN_TCP_DST_PORT] ||
7740             !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] ||
7741             !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] ||
7742             !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] ||
7743             !tb[NL80211_WOWLAN_TCP_WAKE_MASK])
7744                 return -EINVAL;
7745
7746         data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]);
7747         if (data_size > rdev->wiphy.wowlan.tcp->data_payload_max)
7748                 return -EINVAL;
7749
7750         if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) >
7751                         rdev->wiphy.wowlan.tcp->data_interval_max ||
7752             nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0)
7753                 return -EINVAL;
7754
7755         wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]);
7756         if (wake_size > rdev->wiphy.wowlan.tcp->wake_payload_max)
7757                 return -EINVAL;
7758
7759         wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]);
7760         if (wake_mask_size != DIV_ROUND_UP(wake_size, 8))
7761                 return -EINVAL;
7762
7763         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) {
7764                 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
7765
7766                 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
7767                 tokens_size = tokln - sizeof(*tok);
7768
7769                 if (!tok->len || tokens_size % tok->len)
7770                         return -EINVAL;
7771                 if (!rdev->wiphy.wowlan.tcp->tok)
7772                         return -EINVAL;
7773                 if (tok->len > rdev->wiphy.wowlan.tcp->tok->max_len)
7774                         return -EINVAL;
7775                 if (tok->len < rdev->wiphy.wowlan.tcp->tok->min_len)
7776                         return -EINVAL;
7777                 if (tokens_size > rdev->wiphy.wowlan.tcp->tok->bufsize)
7778                         return -EINVAL;
7779                 if (tok->offset + tok->len > data_size)
7780                         return -EINVAL;
7781         }
7782
7783         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) {
7784                 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]);
7785                 if (!rdev->wiphy.wowlan.tcp->seq)
7786                         return -EINVAL;
7787                 if (seq->len == 0 || seq->len > 4)
7788                         return -EINVAL;
7789                 if (seq->len + seq->offset > data_size)
7790                         return -EINVAL;
7791         }
7792
7793         size = sizeof(*cfg);
7794         size += data_size;
7795         size += wake_size + wake_mask_size;
7796         size += tokens_size;
7797
7798         cfg = kzalloc(size, GFP_KERNEL);
7799         if (!cfg)
7800                 return -ENOMEM;
7801         cfg->src = nla_get_be32(tb[NL80211_WOWLAN_TCP_SRC_IPV4]);
7802         cfg->dst = nla_get_be32(tb[NL80211_WOWLAN_TCP_DST_IPV4]);
7803         memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]),
7804                ETH_ALEN);
7805         if (tb[NL80211_WOWLAN_TCP_SRC_PORT])
7806                 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]);
7807         else
7808                 port = 0;
7809 #ifdef CONFIG_INET
7810         /* allocate a socket and port for it and use it */
7811         err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM,
7812                             IPPROTO_TCP, &cfg->sock, 1);
7813         if (err) {
7814                 kfree(cfg);
7815                 return err;
7816         }
7817         if (inet_csk_get_port(cfg->sock->sk, port)) {
7818                 sock_release(cfg->sock);
7819                 kfree(cfg);
7820                 return -EADDRINUSE;
7821         }
7822         cfg->src_port = inet_sk(cfg->sock->sk)->inet_num;
7823 #else
7824         if (!port) {
7825                 kfree(cfg);
7826                 return -EINVAL;
7827         }
7828         cfg->src_port = port;
7829 #endif
7830
7831         cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]);
7832         cfg->payload_len = data_size;
7833         cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size;
7834         memcpy((void *)cfg->payload,
7835                nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]),
7836                data_size);
7837         if (seq)
7838                 cfg->payload_seq = *seq;
7839         cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]);
7840         cfg->wake_len = wake_size;
7841         cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size;
7842         memcpy((void *)cfg->wake_data,
7843                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]),
7844                wake_size);
7845         cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size +
7846                          data_size + wake_size;
7847         memcpy((void *)cfg->wake_mask,
7848                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]),
7849                wake_mask_size);
7850         if (tok) {
7851                 cfg->tokens_size = tokens_size;
7852                 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size);
7853         }
7854
7855         trig->tcp = cfg;
7856
7857         return 0;
7858 }
7859
7860 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
7861 {
7862         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7863         struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG];
7864         struct cfg80211_wowlan new_triggers = {};
7865         struct cfg80211_wowlan *ntrig;
7866         struct wiphy_wowlan_support *wowlan = &rdev->wiphy.wowlan;
7867         int err, i;
7868         bool prev_enabled = rdev->wowlan;
7869
7870         if (!rdev->wiphy.wowlan.flags && !rdev->wiphy.wowlan.n_patterns &&
7871             !rdev->wiphy.wowlan.tcp)
7872                 return -EOPNOTSUPP;
7873
7874         if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) {
7875                 cfg80211_rdev_free_wowlan(rdev);
7876                 rdev->wowlan = NULL;
7877                 goto set_wakeup;
7878         }
7879
7880         err = nla_parse(tb, MAX_NL80211_WOWLAN_TRIG,
7881                         nla_data(info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]),
7882                         nla_len(info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]),
7883                         nl80211_wowlan_policy);
7884         if (err)
7885                 return err;
7886
7887         if (tb[NL80211_WOWLAN_TRIG_ANY]) {
7888                 if (!(wowlan->flags & WIPHY_WOWLAN_ANY))
7889                         return -EINVAL;
7890                 new_triggers.any = true;
7891         }
7892
7893         if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) {
7894                 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT))
7895                         return -EINVAL;
7896                 new_triggers.disconnect = true;
7897         }
7898
7899         if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) {
7900                 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT))
7901                         return -EINVAL;
7902                 new_triggers.magic_pkt = true;
7903         }
7904
7905         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED])
7906                 return -EINVAL;
7907
7908         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) {
7909                 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE))
7910                         return -EINVAL;
7911                 new_triggers.gtk_rekey_failure = true;
7912         }
7913
7914         if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) {
7915                 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ))
7916                         return -EINVAL;
7917                 new_triggers.eap_identity_req = true;
7918         }
7919
7920         if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) {
7921                 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE))
7922                         return -EINVAL;
7923                 new_triggers.four_way_handshake = true;
7924         }
7925
7926         if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) {
7927                 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE))
7928                         return -EINVAL;
7929                 new_triggers.rfkill_release = true;
7930         }
7931
7932         if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) {
7933                 struct nlattr *pat;
7934                 int n_patterns = 0;
7935                 int rem, pat_len, mask_len, pkt_offset;
7936                 struct nlattr *pat_tb[NUM_NL80211_WOWLAN_PKTPAT];
7937
7938                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
7939                                     rem)
7940                         n_patterns++;
7941                 if (n_patterns > wowlan->n_patterns)
7942                         return -EINVAL;
7943
7944                 new_triggers.patterns = kcalloc(n_patterns,
7945                                                 sizeof(new_triggers.patterns[0]),
7946                                                 GFP_KERNEL);
7947                 if (!new_triggers.patterns)
7948                         return -ENOMEM;
7949
7950                 new_triggers.n_patterns = n_patterns;
7951                 i = 0;
7952
7953                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
7954                                     rem) {
7955                         nla_parse(pat_tb, MAX_NL80211_WOWLAN_PKTPAT,
7956                                   nla_data(pat), nla_len(pat), NULL);
7957                         err = -EINVAL;
7958                         if (!pat_tb[NL80211_WOWLAN_PKTPAT_MASK] ||
7959                             !pat_tb[NL80211_WOWLAN_PKTPAT_PATTERN])
7960                                 goto error;
7961                         pat_len = nla_len(pat_tb[NL80211_WOWLAN_PKTPAT_PATTERN]);
7962                         mask_len = DIV_ROUND_UP(pat_len, 8);
7963                         if (nla_len(pat_tb[NL80211_WOWLAN_PKTPAT_MASK]) !=
7964                             mask_len)
7965                                 goto error;
7966                         if (pat_len > wowlan->pattern_max_len ||
7967                             pat_len < wowlan->pattern_min_len)
7968                                 goto error;
7969
7970                         if (!pat_tb[NL80211_WOWLAN_PKTPAT_OFFSET])
7971                                 pkt_offset = 0;
7972                         else
7973                                 pkt_offset = nla_get_u32(
7974                                         pat_tb[NL80211_WOWLAN_PKTPAT_OFFSET]);
7975                         if (pkt_offset > wowlan->max_pkt_offset)
7976                                 goto error;
7977                         new_triggers.patterns[i].pkt_offset = pkt_offset;
7978
7979                         new_triggers.patterns[i].mask =
7980                                 kmalloc(mask_len + pat_len, GFP_KERNEL);
7981                         if (!new_triggers.patterns[i].mask) {
7982                                 err = -ENOMEM;
7983                                 goto error;
7984                         }
7985                         new_triggers.patterns[i].pattern =
7986                                 new_triggers.patterns[i].mask + mask_len;
7987                         memcpy(new_triggers.patterns[i].mask,
7988                                nla_data(pat_tb[NL80211_WOWLAN_PKTPAT_MASK]),
7989                                mask_len);
7990                         new_triggers.patterns[i].pattern_len = pat_len;
7991                         memcpy(new_triggers.patterns[i].pattern,
7992                                nla_data(pat_tb[NL80211_WOWLAN_PKTPAT_PATTERN]),
7993                                pat_len);
7994                         i++;
7995                 }
7996         }
7997
7998         if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) {
7999                 err = nl80211_parse_wowlan_tcp(
8000                         rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION],
8001                         &new_triggers);
8002                 if (err)
8003                         goto error;
8004         }
8005
8006         ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL);
8007         if (!ntrig) {
8008                 err = -ENOMEM;
8009                 goto error;
8010         }
8011         cfg80211_rdev_free_wowlan(rdev);
8012         rdev->wowlan = ntrig;
8013
8014  set_wakeup:
8015         if (rdev->ops->set_wakeup && prev_enabled != !!rdev->wowlan)
8016                 rdev_set_wakeup(rdev, rdev->wowlan);
8017
8018         return 0;
8019  error:
8020         for (i = 0; i < new_triggers.n_patterns; i++)
8021                 kfree(new_triggers.patterns[i].mask);
8022         kfree(new_triggers.patterns);
8023         if (new_triggers.tcp && new_triggers.tcp->sock)
8024                 sock_release(new_triggers.tcp->sock);
8025         kfree(new_triggers.tcp);
8026         return err;
8027 }
8028 #endif
8029
8030 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
8031 {
8032         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8033         struct net_device *dev = info->user_ptr[1];
8034         struct wireless_dev *wdev = dev->ieee80211_ptr;
8035         struct nlattr *tb[NUM_NL80211_REKEY_DATA];
8036         struct cfg80211_gtk_rekey_data rekey_data;
8037         int err;
8038
8039         if (!info->attrs[NL80211_ATTR_REKEY_DATA])
8040                 return -EINVAL;
8041
8042         err = nla_parse(tb, MAX_NL80211_REKEY_DATA,
8043                         nla_data(info->attrs[NL80211_ATTR_REKEY_DATA]),
8044                         nla_len(info->attrs[NL80211_ATTR_REKEY_DATA]),
8045                         nl80211_rekey_policy);
8046         if (err)
8047                 return err;
8048
8049         if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN)
8050                 return -ERANGE;
8051         if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN)
8052                 return -ERANGE;
8053         if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN)
8054                 return -ERANGE;
8055
8056         memcpy(rekey_data.kek, nla_data(tb[NL80211_REKEY_DATA_KEK]),
8057                NL80211_KEK_LEN);
8058         memcpy(rekey_data.kck, nla_data(tb[NL80211_REKEY_DATA_KCK]),
8059                NL80211_KCK_LEN);
8060         memcpy(rekey_data.replay_ctr,
8061                nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]),
8062                NL80211_REPLAY_CTR_LEN);
8063
8064         wdev_lock(wdev);
8065         if (!wdev->current_bss) {
8066                 err = -ENOTCONN;
8067                 goto out;
8068         }
8069
8070         if (!rdev->ops->set_rekey_data) {
8071                 err = -EOPNOTSUPP;
8072                 goto out;
8073         }
8074
8075         err = rdev_set_rekey_data(rdev, dev, &rekey_data);
8076  out:
8077         wdev_unlock(wdev);
8078         return err;
8079 }
8080
8081 static int nl80211_register_unexpected_frame(struct sk_buff *skb,
8082                                              struct genl_info *info)
8083 {
8084         struct net_device *dev = info->user_ptr[1];
8085         struct wireless_dev *wdev = dev->ieee80211_ptr;
8086
8087         if (wdev->iftype != NL80211_IFTYPE_AP &&
8088             wdev->iftype != NL80211_IFTYPE_P2P_GO)
8089                 return -EINVAL;
8090
8091         if (wdev->ap_unexpected_nlportid)
8092                 return -EBUSY;
8093
8094         wdev->ap_unexpected_nlportid = info->snd_portid;
8095         return 0;
8096 }
8097
8098 static int nl80211_probe_client(struct sk_buff *skb,
8099                                 struct genl_info *info)
8100 {
8101         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8102         struct net_device *dev = info->user_ptr[1];
8103         struct wireless_dev *wdev = dev->ieee80211_ptr;
8104         struct sk_buff *msg;
8105         void *hdr;
8106         const u8 *addr;
8107         u64 cookie;
8108         int err;
8109
8110         if (wdev->iftype != NL80211_IFTYPE_AP &&
8111             wdev->iftype != NL80211_IFTYPE_P2P_GO)
8112                 return -EOPNOTSUPP;
8113
8114         if (!info->attrs[NL80211_ATTR_MAC])
8115                 return -EINVAL;
8116
8117         if (!rdev->ops->probe_client)
8118                 return -EOPNOTSUPP;
8119
8120         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
8121         if (!msg)
8122                 return -ENOMEM;
8123
8124         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8125                              NL80211_CMD_PROBE_CLIENT);
8126         if (!hdr) {
8127                 err = -ENOBUFS;
8128                 goto free_msg;
8129         }
8130
8131         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
8132
8133         err = rdev_probe_client(rdev, dev, addr, &cookie);
8134         if (err)
8135                 goto free_msg;
8136
8137         if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
8138                 goto nla_put_failure;
8139
8140         genlmsg_end(msg, hdr);
8141
8142         return genlmsg_reply(msg, info);
8143
8144  nla_put_failure:
8145         err = -ENOBUFS;
8146  free_msg:
8147         nlmsg_free(msg);
8148         return err;
8149 }
8150
8151 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info)
8152 {
8153         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8154         struct cfg80211_beacon_registration *reg, *nreg;
8155         int rv;
8156
8157         if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS))
8158                 return -EOPNOTSUPP;
8159
8160         nreg = kzalloc(sizeof(*nreg), GFP_KERNEL);
8161         if (!nreg)
8162                 return -ENOMEM;
8163
8164         /* First, check if already registered. */
8165         spin_lock_bh(&rdev->beacon_registrations_lock);
8166         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
8167                 if (reg->nlportid == info->snd_portid) {
8168                         rv = -EALREADY;
8169                         goto out_err;
8170                 }
8171         }
8172         /* Add it to the list */
8173         nreg->nlportid = info->snd_portid;
8174         list_add(&nreg->list, &rdev->beacon_registrations);
8175
8176         spin_unlock_bh(&rdev->beacon_registrations_lock);
8177
8178         return 0;
8179 out_err:
8180         spin_unlock_bh(&rdev->beacon_registrations_lock);
8181         kfree(nreg);
8182         return rv;
8183 }
8184
8185 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
8186 {
8187         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8188         struct wireless_dev *wdev = info->user_ptr[1];
8189         int err;
8190
8191         if (!rdev->ops->start_p2p_device)
8192                 return -EOPNOTSUPP;
8193
8194         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
8195                 return -EOPNOTSUPP;
8196
8197         if (wdev->p2p_started)
8198                 return 0;
8199
8200         mutex_lock(&rdev->devlist_mtx);
8201         err = cfg80211_can_add_interface(rdev, wdev->iftype);
8202         mutex_unlock(&rdev->devlist_mtx);
8203         if (err)
8204                 return err;
8205
8206         err = rdev_start_p2p_device(rdev, wdev);
8207         if (err)
8208                 return err;
8209
8210         wdev->p2p_started = true;
8211         mutex_lock(&rdev->devlist_mtx);
8212         rdev->opencount++;
8213         mutex_unlock(&rdev->devlist_mtx);
8214
8215         return 0;
8216 }
8217
8218 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info)
8219 {
8220         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8221         struct wireless_dev *wdev = info->user_ptr[1];
8222
8223         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
8224                 return -EOPNOTSUPP;
8225
8226         if (!rdev->ops->stop_p2p_device)
8227                 return -EOPNOTSUPP;
8228
8229         mutex_lock(&rdev->devlist_mtx);
8230         mutex_lock(&rdev->sched_scan_mtx);
8231         cfg80211_stop_p2p_device(rdev, wdev);
8232         mutex_unlock(&rdev->sched_scan_mtx);
8233         mutex_unlock(&rdev->devlist_mtx);
8234
8235         return 0;
8236 }
8237
8238 static int nl80211_get_protocol_features(struct sk_buff *skb,
8239                                          struct genl_info *info)
8240 {
8241         void *hdr;
8242         struct sk_buff *msg;
8243
8244         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
8245         if (!msg)
8246                 return -ENOMEM;
8247
8248         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8249                              NL80211_CMD_GET_PROTOCOL_FEATURES);
8250         if (!hdr)
8251                 goto nla_put_failure;
8252
8253         if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES,
8254                         NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP))
8255                 goto nla_put_failure;
8256
8257         genlmsg_end(msg, hdr);
8258         return genlmsg_reply(msg, info);
8259
8260  nla_put_failure:
8261         kfree_skb(msg);
8262         return -ENOBUFS;
8263 }
8264
8265 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info)
8266 {
8267         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8268         struct cfg80211_update_ft_ies_params ft_params;
8269         struct net_device *dev = info->user_ptr[1];
8270
8271         if (!rdev->ops->update_ft_ies)
8272                 return -EOPNOTSUPP;
8273
8274         if (!info->attrs[NL80211_ATTR_MDID] ||
8275             !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8276                 return -EINVAL;
8277
8278         memset(&ft_params, 0, sizeof(ft_params));
8279         ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]);
8280         ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8281         ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8282
8283         return rdev_update_ft_ies(rdev, dev, &ft_params);
8284 }
8285
8286 static int nl80211_crit_protocol_start(struct sk_buff *skb,
8287                                        struct genl_info *info)
8288 {
8289         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8290         struct wireless_dev *wdev = info->user_ptr[1];
8291         enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC;
8292         u16 duration;
8293         int ret;
8294
8295         if (!rdev->ops->crit_proto_start)
8296                 return -EOPNOTSUPP;
8297
8298         if (WARN_ON(!rdev->ops->crit_proto_stop))
8299                 return -EINVAL;
8300
8301         if (rdev->crit_proto_nlportid)
8302                 return -EBUSY;
8303
8304         /* determine protocol if provided */
8305         if (info->attrs[NL80211_ATTR_CRIT_PROT_ID])
8306                 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]);
8307
8308         if (proto >= NUM_NL80211_CRIT_PROTO)
8309                 return -EINVAL;
8310
8311         /* timeout must be provided */
8312         if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION])
8313                 return -EINVAL;
8314
8315         duration =
8316                 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
8317
8318         if (duration > NL80211_CRIT_PROTO_MAX_DURATION)
8319                 return -ERANGE;
8320
8321         ret = rdev_crit_proto_start(rdev, wdev, proto, duration);
8322         if (!ret)
8323                 rdev->crit_proto_nlportid = info->snd_portid;
8324
8325         return ret;
8326 }
8327
8328 static int nl80211_crit_protocol_stop(struct sk_buff *skb,
8329                                       struct genl_info *info)
8330 {
8331         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8332         struct wireless_dev *wdev = info->user_ptr[1];
8333
8334         if (!rdev->ops->crit_proto_stop)
8335                 return -EOPNOTSUPP;
8336
8337         if (rdev->crit_proto_nlportid) {
8338                 rdev->crit_proto_nlportid = 0;
8339                 rdev_crit_proto_stop(rdev, wdev);
8340         }
8341         return 0;
8342 }
8343
8344 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
8345 {
8346         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8347         struct wireless_dev *wdev =
8348                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
8349         int i, err;
8350         u32 vid, subcmd;
8351
8352         if (!rdev || !rdev->wiphy.vendor_commands)
8353                 return -EOPNOTSUPP;
8354
8355         if (IS_ERR(wdev)) {
8356                 err = PTR_ERR(wdev);
8357                 if (err != -EINVAL)
8358                         return err;
8359                 wdev = NULL;
8360         } else if (wdev->wiphy != &rdev->wiphy) {
8361                 return -EINVAL;
8362         }
8363
8364         if (!info->attrs[NL80211_ATTR_VENDOR_ID] ||
8365             !info->attrs[NL80211_ATTR_VENDOR_SUBCMD])
8366                 return -EINVAL;
8367
8368         vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]);
8369         subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]);
8370         for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
8371                 const struct wiphy_vendor_command *vcmd;
8372                 void *data = NULL;
8373                 int len = 0;
8374
8375                 vcmd = &rdev->wiphy.vendor_commands[i];
8376
8377                 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
8378                         continue;
8379
8380                 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
8381                                    WIPHY_VENDOR_CMD_NEED_NETDEV)) {
8382                         if (!wdev)
8383                                 return -EINVAL;
8384                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
8385                             !wdev->netdev)
8386                                 return -EINVAL;
8387
8388                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
8389                                 if (!wdev->netdev ||
8390                                     !netif_running(wdev->netdev))
8391                                         return -ENETDOWN;
8392                         }
8393                 } else {
8394                         wdev = NULL;
8395                 }
8396
8397                 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
8398                         data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
8399                         len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
8400                 }
8401
8402                 rdev->cur_cmd_info = info;
8403                 err = rdev->wiphy.vendor_commands[i].doit(&rdev->wiphy, wdev,
8404                                                                 data, len);
8405                 rdev->cur_cmd_info = NULL;
8406                 return err;
8407         }
8408
8409         return -EOPNOTSUPP;
8410 }
8411
8412 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
8413                                            enum nl80211_commands cmd,
8414                                            enum nl80211_attrs attr,
8415                                            int approxlen)
8416 {
8417         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
8418
8419         if (WARN_ON(!rdev->cur_cmd_info))
8420                 return NULL;
8421
8422         return __cfg80211_alloc_vendor_skb(rdev, approxlen,
8423                                            0,
8424                                            0,
8425                                            cmd, attr, NULL, GFP_KERNEL);
8426 }
8427 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb);
8428
8429 int cfg80211_vendor_cmd_reply(struct sk_buff *skb)
8430 {
8431         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
8432         void *hdr = ((void **)skb->cb)[1];
8433         struct nlattr *data = ((void **)skb->cb)[2];
8434
8435         if (WARN_ON(!rdev->cur_cmd_info)) {
8436                 kfree_skb(skb);
8437                 return -EINVAL;
8438         }
8439
8440         nla_nest_end(skb, data);
8441         genlmsg_end(skb, hdr);
8442         return genlmsg_reply(skb, rdev->cur_cmd_info);
8443 }
8444 EXPORT_SYMBOL(cfg80211_vendor_cmd_reply);
8445
8446 #define NL80211_FLAG_NEED_WIPHY         0x01
8447 #define NL80211_FLAG_NEED_NETDEV        0x02
8448 #define NL80211_FLAG_NEED_RTNL          0x04
8449 #define NL80211_FLAG_CHECK_NETDEV_UP    0x08
8450 #define NL80211_FLAG_NEED_NETDEV_UP     (NL80211_FLAG_NEED_NETDEV |\
8451                                          NL80211_FLAG_CHECK_NETDEV_UP)
8452 #define NL80211_FLAG_NEED_WDEV          0x10
8453 /* If a netdev is associated, it must be UP, P2P must be started */
8454 #define NL80211_FLAG_NEED_WDEV_UP       (NL80211_FLAG_NEED_WDEV |\
8455                                          NL80211_FLAG_CHECK_NETDEV_UP)
8456
8457 static int nl80211_pre_doit(struct genl_ops *ops, struct sk_buff *skb,
8458                             struct genl_info *info)
8459 {
8460         struct cfg80211_registered_device *rdev;
8461         struct wireless_dev *wdev;
8462         struct net_device *dev;
8463         bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL;
8464
8465         if (rtnl)
8466                 rtnl_lock();
8467
8468         if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) {
8469                 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
8470                 if (IS_ERR(rdev)) {
8471                         if (rtnl)
8472                                 rtnl_unlock();
8473                         return PTR_ERR(rdev);
8474                 }
8475                 info->user_ptr[0] = rdev;
8476         } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV ||
8477                    ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
8478                 mutex_lock(&cfg80211_mutex);
8479                 wdev = __cfg80211_wdev_from_attrs(genl_info_net(info),
8480                                                   info->attrs);
8481                 if (IS_ERR(wdev)) {
8482                         mutex_unlock(&cfg80211_mutex);
8483                         if (rtnl)
8484                                 rtnl_unlock();
8485                         return PTR_ERR(wdev);
8486                 }
8487
8488                 dev = wdev->netdev;
8489                 rdev = wiphy_to_dev(wdev->wiphy);
8490
8491                 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) {
8492                         if (!dev) {
8493                                 mutex_unlock(&cfg80211_mutex);
8494                                 if (rtnl)
8495                                         rtnl_unlock();
8496                                 return -EINVAL;
8497                         }
8498
8499                         info->user_ptr[1] = dev;
8500                 } else {
8501                         info->user_ptr[1] = wdev;
8502                 }
8503
8504                 if (dev) {
8505                         if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
8506                             !netif_running(dev)) {
8507                                 mutex_unlock(&cfg80211_mutex);
8508                                 if (rtnl)
8509                                         rtnl_unlock();
8510                                 return -ENETDOWN;
8511                         }
8512
8513                         dev_hold(dev);
8514                 } else if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP) {
8515                         if (!wdev->p2p_started) {
8516                                 mutex_unlock(&cfg80211_mutex);
8517                                 if (rtnl)
8518                                         rtnl_unlock();
8519                                 return -ENETDOWN;
8520                         }
8521                 }
8522
8523                 cfg80211_lock_rdev(rdev);
8524
8525                 mutex_unlock(&cfg80211_mutex);
8526
8527                 info->user_ptr[0] = rdev;
8528         }
8529
8530         return 0;
8531 }
8532
8533 static void nl80211_post_doit(struct genl_ops *ops, struct sk_buff *skb,
8534                               struct genl_info *info)
8535 {
8536         if (info->user_ptr[0])
8537                 cfg80211_unlock_rdev(info->user_ptr[0]);
8538         if (info->user_ptr[1]) {
8539                 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
8540                         struct wireless_dev *wdev = info->user_ptr[1];
8541
8542                         if (wdev->netdev)
8543                                 dev_put(wdev->netdev);
8544                 } else {
8545                         dev_put(info->user_ptr[1]);
8546                 }
8547         }
8548         if (ops->internal_flags & NL80211_FLAG_NEED_RTNL)
8549                 rtnl_unlock();
8550 }
8551
8552 static struct genl_ops nl80211_ops[] = {
8553         {
8554                 .cmd = NL80211_CMD_GET_WIPHY,
8555                 .doit = nl80211_get_wiphy,
8556                 .dumpit = nl80211_dump_wiphy,
8557                 .policy = nl80211_policy,
8558                 /* can be retrieved by unprivileged users */
8559                 .internal_flags = NL80211_FLAG_NEED_WIPHY,
8560         },
8561         {
8562                 .cmd = NL80211_CMD_SET_WIPHY,
8563                 .doit = nl80211_set_wiphy,
8564                 .policy = nl80211_policy,
8565                 .flags = GENL_ADMIN_PERM,
8566                 .internal_flags = NL80211_FLAG_NEED_RTNL,
8567         },
8568         {
8569                 .cmd = NL80211_CMD_GET_INTERFACE,
8570                 .doit = nl80211_get_interface,
8571                 .dumpit = nl80211_dump_interface,
8572                 .policy = nl80211_policy,
8573                 /* can be retrieved by unprivileged users */
8574                 .internal_flags = NL80211_FLAG_NEED_WDEV,
8575         },
8576         {
8577                 .cmd = NL80211_CMD_SET_INTERFACE,
8578                 .doit = nl80211_set_interface,
8579                 .policy = nl80211_policy,
8580                 .flags = GENL_ADMIN_PERM,
8581                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
8582                                   NL80211_FLAG_NEED_RTNL,
8583         },
8584         {
8585                 .cmd = NL80211_CMD_NEW_INTERFACE,
8586                 .doit = nl80211_new_interface,
8587                 .policy = nl80211_policy,
8588                 .flags = GENL_ADMIN_PERM,
8589                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
8590                                   NL80211_FLAG_NEED_RTNL,
8591         },
8592         {
8593                 .cmd = NL80211_CMD_DEL_INTERFACE,
8594                 .doit = nl80211_del_interface,
8595                 .policy = nl80211_policy,
8596                 .flags = GENL_ADMIN_PERM,
8597                 .internal_flags = NL80211_FLAG_NEED_WDEV |
8598                                   NL80211_FLAG_NEED_RTNL,
8599         },
8600         {
8601                 .cmd = NL80211_CMD_GET_KEY,
8602                 .doit = nl80211_get_key,
8603                 .policy = nl80211_policy,
8604                 .flags = GENL_ADMIN_PERM,
8605                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8606                                   NL80211_FLAG_NEED_RTNL,
8607         },
8608         {
8609                 .cmd = NL80211_CMD_SET_KEY,
8610                 .doit = nl80211_set_key,
8611                 .policy = nl80211_policy,
8612                 .flags = GENL_ADMIN_PERM,
8613                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8614                                   NL80211_FLAG_NEED_RTNL,
8615         },
8616         {
8617                 .cmd = NL80211_CMD_NEW_KEY,
8618                 .doit = nl80211_new_key,
8619                 .policy = nl80211_policy,
8620                 .flags = GENL_ADMIN_PERM,
8621                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8622                                   NL80211_FLAG_NEED_RTNL,
8623         },
8624         {
8625                 .cmd = NL80211_CMD_DEL_KEY,
8626                 .doit = nl80211_del_key,
8627                 .policy = nl80211_policy,
8628                 .flags = GENL_ADMIN_PERM,
8629                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8630                                   NL80211_FLAG_NEED_RTNL,
8631         },
8632         {
8633                 .cmd = NL80211_CMD_SET_BEACON,
8634                 .policy = nl80211_policy,
8635                 .flags = GENL_ADMIN_PERM,
8636                 .doit = nl80211_set_beacon,
8637                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8638                                   NL80211_FLAG_NEED_RTNL,
8639         },
8640         {
8641                 .cmd = NL80211_CMD_START_AP,
8642                 .policy = nl80211_policy,
8643                 .flags = GENL_ADMIN_PERM,
8644                 .doit = nl80211_start_ap,
8645                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8646                                   NL80211_FLAG_NEED_RTNL,
8647         },
8648         {
8649                 .cmd = NL80211_CMD_STOP_AP,
8650                 .policy = nl80211_policy,
8651                 .flags = GENL_ADMIN_PERM,
8652                 .doit = nl80211_stop_ap,
8653                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8654                                   NL80211_FLAG_NEED_RTNL,
8655         },
8656         {
8657                 .cmd = NL80211_CMD_GET_STATION,
8658                 .doit = nl80211_get_station,
8659                 .dumpit = nl80211_dump_station,
8660                 .policy = nl80211_policy,
8661                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
8662                                   NL80211_FLAG_NEED_RTNL,
8663         },
8664         {
8665                 .cmd = NL80211_CMD_SET_STATION,
8666                 .doit = nl80211_set_station,
8667                 .policy = nl80211_policy,
8668                 .flags = GENL_ADMIN_PERM,
8669                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8670                                   NL80211_FLAG_NEED_RTNL,
8671         },
8672         {
8673                 .cmd = NL80211_CMD_NEW_STATION,
8674                 .doit = nl80211_new_station,
8675                 .policy = nl80211_policy,
8676                 .flags = GENL_ADMIN_PERM,
8677                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8678                                   NL80211_FLAG_NEED_RTNL,
8679         },
8680         {
8681                 .cmd = NL80211_CMD_DEL_STATION,
8682                 .doit = nl80211_del_station,
8683                 .policy = nl80211_policy,
8684                 .flags = GENL_ADMIN_PERM,
8685                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8686                                   NL80211_FLAG_NEED_RTNL,
8687         },
8688         {
8689                 .cmd = NL80211_CMD_GET_MPATH,
8690                 .doit = nl80211_get_mpath,
8691                 .dumpit = nl80211_dump_mpath,
8692                 .policy = nl80211_policy,
8693                 .flags = GENL_ADMIN_PERM,
8694                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8695                                   NL80211_FLAG_NEED_RTNL,
8696         },
8697         {
8698                 .cmd = NL80211_CMD_SET_MPATH,
8699                 .doit = nl80211_set_mpath,
8700                 .policy = nl80211_policy,
8701                 .flags = GENL_ADMIN_PERM,
8702                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8703                                   NL80211_FLAG_NEED_RTNL,
8704         },
8705         {
8706                 .cmd = NL80211_CMD_NEW_MPATH,
8707                 .doit = nl80211_new_mpath,
8708                 .policy = nl80211_policy,
8709                 .flags = GENL_ADMIN_PERM,
8710                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8711                                   NL80211_FLAG_NEED_RTNL,
8712         },
8713         {
8714                 .cmd = NL80211_CMD_DEL_MPATH,
8715                 .doit = nl80211_del_mpath,
8716                 .policy = nl80211_policy,
8717                 .flags = GENL_ADMIN_PERM,
8718                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8719                                   NL80211_FLAG_NEED_RTNL,
8720         },
8721         {
8722                 .cmd = NL80211_CMD_SET_BSS,
8723                 .doit = nl80211_set_bss,
8724                 .policy = nl80211_policy,
8725                 .flags = GENL_ADMIN_PERM,
8726                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8727                                   NL80211_FLAG_NEED_RTNL,
8728         },
8729         {
8730                 .cmd = NL80211_CMD_GET_REG,
8731                 .doit = nl80211_get_reg,
8732                 .policy = nl80211_policy,
8733                 /* can be retrieved by unprivileged users */
8734         },
8735         {
8736                 .cmd = NL80211_CMD_SET_REG,
8737                 .doit = nl80211_set_reg,
8738                 .policy = nl80211_policy,
8739                 .flags = GENL_ADMIN_PERM,
8740         },
8741         {
8742                 .cmd = NL80211_CMD_REQ_SET_REG,
8743                 .doit = nl80211_req_set_reg,
8744                 .policy = nl80211_policy,
8745                 .flags = GENL_ADMIN_PERM,
8746         },
8747         {
8748                 .cmd = NL80211_CMD_GET_MESH_CONFIG,
8749                 .doit = nl80211_get_mesh_config,
8750                 .policy = nl80211_policy,
8751                 /* can be retrieved by unprivileged users */
8752                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8753                                   NL80211_FLAG_NEED_RTNL,
8754         },
8755         {
8756                 .cmd = NL80211_CMD_SET_MESH_CONFIG,
8757                 .doit = nl80211_update_mesh_config,
8758                 .policy = nl80211_policy,
8759                 .flags = GENL_ADMIN_PERM,
8760                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8761                                   NL80211_FLAG_NEED_RTNL,
8762         },
8763         {
8764                 .cmd = NL80211_CMD_TRIGGER_SCAN,
8765                 .doit = nl80211_trigger_scan,
8766                 .policy = nl80211_policy,
8767                 .flags = GENL_ADMIN_PERM,
8768                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
8769                                   NL80211_FLAG_NEED_RTNL,
8770         },
8771         {
8772                 .cmd = NL80211_CMD_GET_SCAN,
8773                 .policy = nl80211_policy,
8774                 .dumpit = nl80211_dump_scan,
8775         },
8776         {
8777                 .cmd = NL80211_CMD_START_SCHED_SCAN,
8778                 .doit = nl80211_start_sched_scan,
8779                 .policy = nl80211_policy,
8780                 .flags = GENL_ADMIN_PERM,
8781                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8782                                   NL80211_FLAG_NEED_RTNL,
8783         },
8784         {
8785                 .cmd = NL80211_CMD_STOP_SCHED_SCAN,
8786                 .doit = nl80211_stop_sched_scan,
8787                 .policy = nl80211_policy,
8788                 .flags = GENL_ADMIN_PERM,
8789                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8790                                   NL80211_FLAG_NEED_RTNL,
8791         },
8792         {
8793                 .cmd = NL80211_CMD_AUTHENTICATE,
8794                 .doit = nl80211_authenticate,
8795                 .policy = nl80211_policy,
8796                 .flags = GENL_ADMIN_PERM,
8797                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8798                                   NL80211_FLAG_NEED_RTNL,
8799         },
8800         {
8801                 .cmd = NL80211_CMD_ASSOCIATE,
8802                 .doit = nl80211_associate,
8803                 .policy = nl80211_policy,
8804                 .flags = GENL_ADMIN_PERM,
8805                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8806                                   NL80211_FLAG_NEED_RTNL,
8807         },
8808         {
8809                 .cmd = NL80211_CMD_DEAUTHENTICATE,
8810                 .doit = nl80211_deauthenticate,
8811                 .policy = nl80211_policy,
8812                 .flags = GENL_ADMIN_PERM,
8813                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8814                                   NL80211_FLAG_NEED_RTNL,
8815         },
8816         {
8817                 .cmd = NL80211_CMD_DISASSOCIATE,
8818                 .doit = nl80211_disassociate,
8819                 .policy = nl80211_policy,
8820                 .flags = GENL_ADMIN_PERM,
8821                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8822                                   NL80211_FLAG_NEED_RTNL,
8823         },
8824         {
8825                 .cmd = NL80211_CMD_JOIN_IBSS,
8826                 .doit = nl80211_join_ibss,
8827                 .policy = nl80211_policy,
8828                 .flags = GENL_ADMIN_PERM,
8829                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8830                                   NL80211_FLAG_NEED_RTNL,
8831         },
8832         {
8833                 .cmd = NL80211_CMD_LEAVE_IBSS,
8834                 .doit = nl80211_leave_ibss,
8835                 .policy = nl80211_policy,
8836                 .flags = GENL_ADMIN_PERM,
8837                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8838                                   NL80211_FLAG_NEED_RTNL,
8839         },
8840 #ifdef CONFIG_NL80211_TESTMODE
8841         {
8842                 .cmd = NL80211_CMD_TESTMODE,
8843                 .doit = nl80211_testmode_do,
8844                 .dumpit = nl80211_testmode_dump,
8845                 .policy = nl80211_policy,
8846                 .flags = GENL_ADMIN_PERM,
8847                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
8848                                   NL80211_FLAG_NEED_RTNL,
8849         },
8850 #endif
8851         {
8852                 .cmd = NL80211_CMD_CONNECT,
8853                 .doit = nl80211_connect,
8854                 .policy = nl80211_policy,
8855                 .flags = GENL_ADMIN_PERM,
8856                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8857                                   NL80211_FLAG_NEED_RTNL,
8858         },
8859         {
8860                 .cmd = NL80211_CMD_DISCONNECT,
8861                 .doit = nl80211_disconnect,
8862                 .policy = nl80211_policy,
8863                 .flags = GENL_ADMIN_PERM,
8864                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8865                                   NL80211_FLAG_NEED_RTNL,
8866         },
8867         {
8868                 .cmd = NL80211_CMD_SET_WIPHY_NETNS,
8869                 .doit = nl80211_wiphy_netns,
8870                 .policy = nl80211_policy,
8871                 .flags = GENL_ADMIN_PERM,
8872                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
8873                                   NL80211_FLAG_NEED_RTNL,
8874         },
8875         {
8876                 .cmd = NL80211_CMD_GET_SURVEY,
8877                 .policy = nl80211_policy,
8878                 .dumpit = nl80211_dump_survey,
8879         },
8880         {
8881                 .cmd = NL80211_CMD_SET_PMKSA,
8882                 .doit = nl80211_setdel_pmksa,
8883                 .policy = nl80211_policy,
8884                 .flags = GENL_ADMIN_PERM,
8885                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8886                                   NL80211_FLAG_NEED_RTNL,
8887         },
8888         {
8889                 .cmd = NL80211_CMD_DEL_PMKSA,
8890                 .doit = nl80211_setdel_pmksa,
8891                 .policy = nl80211_policy,
8892                 .flags = GENL_ADMIN_PERM,
8893                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8894                                   NL80211_FLAG_NEED_RTNL,
8895         },
8896         {
8897                 .cmd = NL80211_CMD_FLUSH_PMKSA,
8898                 .doit = nl80211_flush_pmksa,
8899                 .policy = nl80211_policy,
8900                 .flags = GENL_ADMIN_PERM,
8901                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8902                                   NL80211_FLAG_NEED_RTNL,
8903         },
8904         {
8905                 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
8906                 .doit = nl80211_remain_on_channel,
8907                 .policy = nl80211_policy,
8908                 .flags = GENL_ADMIN_PERM,
8909                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
8910                                   NL80211_FLAG_NEED_RTNL,
8911         },
8912         {
8913                 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
8914                 .doit = nl80211_cancel_remain_on_channel,
8915                 .policy = nl80211_policy,
8916                 .flags = GENL_ADMIN_PERM,
8917                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
8918                                   NL80211_FLAG_NEED_RTNL,
8919         },
8920         {
8921                 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
8922                 .doit = nl80211_set_tx_bitrate_mask,
8923                 .policy = nl80211_policy,
8924                 .flags = GENL_ADMIN_PERM,
8925                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
8926                                   NL80211_FLAG_NEED_RTNL,
8927         },
8928         {
8929                 .cmd = NL80211_CMD_REGISTER_FRAME,
8930                 .doit = nl80211_register_mgmt,
8931                 .policy = nl80211_policy,
8932                 .flags = GENL_ADMIN_PERM,
8933                 .internal_flags = NL80211_FLAG_NEED_WDEV |
8934                                   NL80211_FLAG_NEED_RTNL,
8935         },
8936         {
8937                 .cmd = NL80211_CMD_FRAME,
8938                 .doit = nl80211_tx_mgmt,
8939                 .policy = nl80211_policy,
8940                 .flags = GENL_ADMIN_PERM,
8941                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
8942                                   NL80211_FLAG_NEED_RTNL,
8943         },
8944         {
8945                 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
8946                 .doit = nl80211_tx_mgmt_cancel_wait,
8947                 .policy = nl80211_policy,
8948                 .flags = GENL_ADMIN_PERM,
8949                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
8950                                   NL80211_FLAG_NEED_RTNL,
8951         },
8952         {
8953                 .cmd = NL80211_CMD_SET_POWER_SAVE,
8954                 .doit = nl80211_set_power_save,
8955                 .policy = nl80211_policy,
8956                 .flags = GENL_ADMIN_PERM,
8957                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
8958                                   NL80211_FLAG_NEED_RTNL,
8959         },
8960         {
8961                 .cmd = NL80211_CMD_GET_POWER_SAVE,
8962                 .doit = nl80211_get_power_save,
8963                 .policy = nl80211_policy,
8964                 /* can be retrieved by unprivileged users */
8965                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
8966                                   NL80211_FLAG_NEED_RTNL,
8967         },
8968         {
8969                 .cmd = NL80211_CMD_SET_CQM,
8970                 .doit = nl80211_set_cqm,
8971                 .policy = nl80211_policy,
8972                 .flags = GENL_ADMIN_PERM,
8973                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
8974                                   NL80211_FLAG_NEED_RTNL,
8975         },
8976         {
8977                 .cmd = NL80211_CMD_SET_CHANNEL,
8978                 .doit = nl80211_set_channel,
8979                 .policy = nl80211_policy,
8980                 .flags = GENL_ADMIN_PERM,
8981                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
8982                                   NL80211_FLAG_NEED_RTNL,
8983         },
8984         {
8985                 .cmd = NL80211_CMD_SET_WDS_PEER,
8986                 .doit = nl80211_set_wds_peer,
8987                 .policy = nl80211_policy,
8988                 .flags = GENL_ADMIN_PERM,
8989                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
8990                                   NL80211_FLAG_NEED_RTNL,
8991         },
8992         {
8993                 .cmd = NL80211_CMD_JOIN_MESH,
8994                 .doit = nl80211_join_mesh,
8995                 .policy = nl80211_policy,
8996                 .flags = GENL_ADMIN_PERM,
8997                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
8998                                   NL80211_FLAG_NEED_RTNL,
8999         },
9000         {
9001                 .cmd = NL80211_CMD_LEAVE_MESH,
9002                 .doit = nl80211_leave_mesh,
9003                 .policy = nl80211_policy,
9004                 .flags = GENL_ADMIN_PERM,
9005                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9006                                   NL80211_FLAG_NEED_RTNL,
9007         },
9008 #ifdef CONFIG_PM
9009         {
9010                 .cmd = NL80211_CMD_GET_WOWLAN,
9011                 .doit = nl80211_get_wowlan,
9012                 .policy = nl80211_policy,
9013                 /* can be retrieved by unprivileged users */
9014                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9015                                   NL80211_FLAG_NEED_RTNL,
9016         },
9017         {
9018                 .cmd = NL80211_CMD_SET_WOWLAN,
9019                 .doit = nl80211_set_wowlan,
9020                 .policy = nl80211_policy,
9021                 .flags = GENL_ADMIN_PERM,
9022                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9023                                   NL80211_FLAG_NEED_RTNL,
9024         },
9025 #endif
9026         {
9027                 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
9028                 .doit = nl80211_set_rekey_data,
9029                 .policy = nl80211_policy,
9030                 .flags = GENL_ADMIN_PERM,
9031                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9032                                   NL80211_FLAG_NEED_RTNL,
9033         },
9034         {
9035                 .cmd = NL80211_CMD_TDLS_MGMT,
9036                 .doit = nl80211_tdls_mgmt,
9037                 .policy = nl80211_policy,
9038                 .flags = GENL_ADMIN_PERM,
9039                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9040                                   NL80211_FLAG_NEED_RTNL,
9041         },
9042         {
9043                 .cmd = NL80211_CMD_TDLS_OPER,
9044                 .doit = nl80211_tdls_oper,
9045                 .policy = nl80211_policy,
9046                 .flags = GENL_ADMIN_PERM,
9047                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9048                                   NL80211_FLAG_NEED_RTNL,
9049         },
9050         {
9051                 .cmd = NL80211_CMD_UNEXPECTED_FRAME,
9052                 .doit = nl80211_register_unexpected_frame,
9053                 .policy = nl80211_policy,
9054                 .flags = GENL_ADMIN_PERM,
9055                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9056                                   NL80211_FLAG_NEED_RTNL,
9057         },
9058         {
9059                 .cmd = NL80211_CMD_PROBE_CLIENT,
9060                 .doit = nl80211_probe_client,
9061                 .policy = nl80211_policy,
9062                 .flags = GENL_ADMIN_PERM,
9063                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9064                                   NL80211_FLAG_NEED_RTNL,
9065         },
9066         {
9067                 .cmd = NL80211_CMD_REGISTER_BEACONS,
9068                 .doit = nl80211_register_beacons,
9069                 .policy = nl80211_policy,
9070                 .flags = GENL_ADMIN_PERM,
9071                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9072                                   NL80211_FLAG_NEED_RTNL,
9073         },
9074         {
9075                 .cmd = NL80211_CMD_SET_NOACK_MAP,
9076                 .doit = nl80211_set_noack_map,
9077                 .policy = nl80211_policy,
9078                 .flags = GENL_ADMIN_PERM,
9079                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9080                                   NL80211_FLAG_NEED_RTNL,
9081         },
9082         {
9083                 .cmd = NL80211_CMD_START_P2P_DEVICE,
9084                 .doit = nl80211_start_p2p_device,
9085                 .policy = nl80211_policy,
9086                 .flags = GENL_ADMIN_PERM,
9087                 .internal_flags = NL80211_FLAG_NEED_WDEV |
9088                                   NL80211_FLAG_NEED_RTNL,
9089         },
9090         {
9091                 .cmd = NL80211_CMD_STOP_P2P_DEVICE,
9092                 .doit = nl80211_stop_p2p_device,
9093                 .policy = nl80211_policy,
9094                 .flags = GENL_ADMIN_PERM,
9095                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9096                                   NL80211_FLAG_NEED_RTNL,
9097         },
9098         {
9099                 .cmd = NL80211_CMD_SET_MCAST_RATE,
9100                 .doit = nl80211_set_mcast_rate,
9101                 .policy = nl80211_policy,
9102                 .flags = GENL_ADMIN_PERM,
9103                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9104                                   NL80211_FLAG_NEED_RTNL,
9105         },
9106         {
9107                 .cmd = NL80211_CMD_SET_MAC_ACL,
9108                 .doit = nl80211_set_mac_acl,
9109                 .policy = nl80211_policy,
9110                 .flags = GENL_ADMIN_PERM,
9111                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9112                                   NL80211_FLAG_NEED_RTNL,
9113         },
9114         {
9115                 .cmd = NL80211_CMD_RADAR_DETECT,
9116                 .doit = nl80211_start_radar_detection,
9117                 .policy = nl80211_policy,
9118                 .flags = GENL_ADMIN_PERM,
9119                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9120                                   NL80211_FLAG_NEED_RTNL,
9121         },
9122         {
9123                 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
9124                 .doit = nl80211_get_protocol_features,
9125                 .policy = nl80211_policy,
9126         },
9127         {
9128                 .cmd = NL80211_CMD_UPDATE_FT_IES,
9129                 .doit = nl80211_update_ft_ies,
9130                 .policy = nl80211_policy,
9131                 .flags = GENL_ADMIN_PERM,
9132                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9133                                   NL80211_FLAG_NEED_RTNL,
9134         },
9135         {
9136                 .cmd = NL80211_CMD_CRIT_PROTOCOL_START,
9137                 .doit = nl80211_crit_protocol_start,
9138                 .policy = nl80211_policy,
9139                 .flags = GENL_ADMIN_PERM,
9140                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9141                                   NL80211_FLAG_NEED_RTNL,
9142         },
9143         {
9144                 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
9145                 .doit = nl80211_crit_protocol_stop,
9146                 .policy = nl80211_policy,
9147                 .flags = GENL_ADMIN_PERM,
9148                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9149                                   NL80211_FLAG_NEED_RTNL,
9150         },
9151         {
9152                 .cmd = NL80211_CMD_VENDOR,
9153                 .doit = nl80211_vendor_cmd,
9154                 .policy = nl80211_policy,
9155                 .flags = GENL_ADMIN_PERM,
9156                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9157                                   NL80211_FLAG_NEED_RTNL,
9158         },
9159 };
9160
9161 static struct genl_multicast_group nl80211_mlme_mcgrp = {
9162         .name = "mlme",
9163 };
9164
9165 /* multicast groups */
9166 static struct genl_multicast_group nl80211_config_mcgrp = {
9167         .name = "config",
9168 };
9169 static struct genl_multicast_group nl80211_scan_mcgrp = {
9170         .name = "scan",
9171 };
9172 static struct genl_multicast_group nl80211_regulatory_mcgrp = {
9173         .name = "regulatory",
9174 };
9175
9176 /* notification functions */
9177
9178 void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev)
9179 {
9180         struct sk_buff *msg;
9181
9182         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9183         if (!msg)
9184                 return;
9185
9186         if (nl80211_send_wiphy(rdev, msg, 0, 0, 0,
9187                                false, NULL, NULL, NULL) < 0) {
9188                 nlmsg_free(msg);
9189                 return;
9190         }
9191
9192         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9193                                 nl80211_config_mcgrp.id, GFP_KERNEL);
9194 }
9195
9196 static int nl80211_add_scan_req(struct sk_buff *msg,
9197                                 struct cfg80211_registered_device *rdev)
9198 {
9199         struct cfg80211_scan_request *req = rdev->scan_req;
9200         struct nlattr *nest;
9201         int i;
9202
9203         lockdep_assert_held(&rdev->sched_scan_mtx);
9204
9205         if (WARN_ON(!req))
9206                 return 0;
9207
9208         nest = nla_nest_start(msg, NL80211_ATTR_SCAN_SSIDS);
9209         if (!nest)
9210                 goto nla_put_failure;
9211         for (i = 0; i < req->n_ssids; i++) {
9212                 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid))
9213                         goto nla_put_failure;
9214         }
9215         nla_nest_end(msg, nest);
9216
9217         nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
9218         if (!nest)
9219                 goto nla_put_failure;
9220         for (i = 0; i < req->n_channels; i++) {
9221                 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
9222                         goto nla_put_failure;
9223         }
9224         nla_nest_end(msg, nest);
9225
9226         if (req->ie &&
9227             nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie))
9228                 goto nla_put_failure;
9229
9230         if (req->flags)
9231                 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags);
9232
9233         return 0;
9234  nla_put_failure:
9235         return -ENOBUFS;
9236 }
9237
9238 static int nl80211_send_scan_msg(struct sk_buff *msg,
9239                                  struct cfg80211_registered_device *rdev,
9240                                  struct wireless_dev *wdev,
9241                                  u32 portid, u32 seq, int flags,
9242                                  u32 cmd)
9243 {
9244         void *hdr;
9245
9246         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
9247         if (!hdr)
9248                 return -1;
9249
9250         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9251             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
9252                                          wdev->netdev->ifindex)) ||
9253             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
9254                 goto nla_put_failure;
9255
9256         /* ignore errors and send incomplete event anyway */
9257         nl80211_add_scan_req(msg, rdev);
9258
9259         return genlmsg_end(msg, hdr);
9260
9261  nla_put_failure:
9262         genlmsg_cancel(msg, hdr);
9263         return -EMSGSIZE;
9264 }
9265
9266 static int
9267 nl80211_send_sched_scan_msg(struct sk_buff *msg,
9268                             struct cfg80211_registered_device *rdev,
9269                             struct net_device *netdev,
9270                             u32 portid, u32 seq, int flags, u32 cmd)
9271 {
9272         void *hdr;
9273
9274         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
9275         if (!hdr)
9276                 return -1;
9277
9278         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9279             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
9280                 goto nla_put_failure;
9281
9282         return genlmsg_end(msg, hdr);
9283
9284  nla_put_failure:
9285         genlmsg_cancel(msg, hdr);
9286         return -EMSGSIZE;
9287 }
9288
9289 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
9290                              struct wireless_dev *wdev)
9291 {
9292         struct sk_buff *msg;
9293
9294         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9295         if (!msg)
9296                 return;
9297
9298         if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
9299                                   NL80211_CMD_TRIGGER_SCAN) < 0) {
9300                 nlmsg_free(msg);
9301                 return;
9302         }
9303
9304         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9305                                 nl80211_scan_mcgrp.id, GFP_KERNEL);
9306 }
9307
9308 void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
9309                             struct wireless_dev *wdev)
9310 {
9311         struct sk_buff *msg;
9312
9313         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9314         if (!msg)
9315                 return;
9316
9317         if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
9318                                   NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
9319                 nlmsg_free(msg);
9320                 return;
9321         }
9322
9323         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9324                                 nl80211_scan_mcgrp.id, GFP_KERNEL);
9325 }
9326
9327 void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
9328                                struct wireless_dev *wdev)
9329 {
9330         struct sk_buff *msg;
9331
9332         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9333         if (!msg)
9334                 return;
9335
9336         if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
9337                                   NL80211_CMD_SCAN_ABORTED) < 0) {
9338                 nlmsg_free(msg);
9339                 return;
9340         }
9341
9342         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9343                                 nl80211_scan_mcgrp.id, GFP_KERNEL);
9344 }
9345
9346 void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev,
9347                                      struct net_device *netdev)
9348 {
9349         struct sk_buff *msg;
9350
9351         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9352         if (!msg)
9353                 return;
9354
9355         if (nl80211_send_sched_scan_msg(msg, rdev, netdev, 0, 0, 0,
9356                                         NL80211_CMD_SCHED_SCAN_RESULTS) < 0) {
9357                 nlmsg_free(msg);
9358                 return;
9359         }
9360
9361         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9362                                 nl80211_scan_mcgrp.id, GFP_KERNEL);
9363 }
9364
9365 void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
9366                              struct net_device *netdev, u32 cmd)
9367 {
9368         struct sk_buff *msg;
9369
9370         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9371         if (!msg)
9372                 return;
9373
9374         if (nl80211_send_sched_scan_msg(msg, rdev, netdev, 0, 0, 0, cmd) < 0) {
9375                 nlmsg_free(msg);
9376                 return;
9377         }
9378
9379         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9380                                 nl80211_scan_mcgrp.id, GFP_KERNEL);
9381 }
9382
9383 /*
9384  * This can happen on global regulatory changes or device specific settings
9385  * based on custom world regulatory domains.
9386  */
9387 void nl80211_send_reg_change_event(struct regulatory_request *request)
9388 {
9389         struct sk_buff *msg;
9390         void *hdr;
9391
9392         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9393         if (!msg)
9394                 return;
9395
9396         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_CHANGE);
9397         if (!hdr) {
9398                 nlmsg_free(msg);
9399                 return;
9400         }
9401
9402         /* Userspace can always count this one always being set */
9403         if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator))
9404                 goto nla_put_failure;
9405
9406         if (request->alpha2[0] == '0' && request->alpha2[1] == '0') {
9407                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
9408                                NL80211_REGDOM_TYPE_WORLD))
9409                         goto nla_put_failure;
9410         } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') {
9411                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
9412                                NL80211_REGDOM_TYPE_CUSTOM_WORLD))
9413                         goto nla_put_failure;
9414         } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
9415                    request->intersect) {
9416                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
9417                                NL80211_REGDOM_TYPE_INTERSECTION))
9418                         goto nla_put_failure;
9419         } else {
9420                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
9421                                NL80211_REGDOM_TYPE_COUNTRY) ||
9422                     nla_put_string(msg, NL80211_ATTR_REG_ALPHA2,
9423                                    request->alpha2))
9424                         goto nla_put_failure;
9425         }
9426
9427         if (request->wiphy_idx != WIPHY_IDX_INVALID &&
9428             nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx))
9429                 goto nla_put_failure;
9430
9431         genlmsg_end(msg, hdr);
9432
9433         rcu_read_lock();
9434         genlmsg_multicast_allns(msg, 0, nl80211_regulatory_mcgrp.id,
9435                                 GFP_ATOMIC);
9436         rcu_read_unlock();
9437
9438         return;
9439
9440 nla_put_failure:
9441         genlmsg_cancel(msg, hdr);
9442         nlmsg_free(msg);
9443 }
9444
9445 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
9446                                     struct net_device *netdev,
9447                                     const u8 *buf, size_t len,
9448                                     enum nl80211_commands cmd, gfp_t gfp)
9449 {
9450         struct sk_buff *msg;
9451         void *hdr;
9452
9453         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9454         if (!msg)
9455                 return;
9456
9457         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
9458         if (!hdr) {
9459                 nlmsg_free(msg);
9460                 return;
9461         }
9462
9463         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9464             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
9465             nla_put(msg, NL80211_ATTR_FRAME, len, buf))
9466                 goto nla_put_failure;
9467
9468         genlmsg_end(msg, hdr);
9469
9470         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9471                                 nl80211_mlme_mcgrp.id, gfp);
9472         return;
9473
9474  nla_put_failure:
9475         genlmsg_cancel(msg, hdr);
9476         nlmsg_free(msg);
9477 }
9478
9479 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
9480                           struct net_device *netdev, const u8 *buf,
9481                           size_t len, gfp_t gfp)
9482 {
9483         nl80211_send_mlme_event(rdev, netdev, buf, len,
9484                                 NL80211_CMD_AUTHENTICATE, gfp);
9485 }
9486
9487 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
9488                            struct net_device *netdev, const u8 *buf,
9489                            size_t len, gfp_t gfp)
9490 {
9491         nl80211_send_mlme_event(rdev, netdev, buf, len,
9492                                 NL80211_CMD_ASSOCIATE, gfp);
9493 }
9494
9495 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
9496                          struct net_device *netdev, const u8 *buf,
9497                          size_t len, gfp_t gfp)
9498 {
9499         nl80211_send_mlme_event(rdev, netdev, buf, len,
9500                                 NL80211_CMD_DEAUTHENTICATE, gfp);
9501 }
9502
9503 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
9504                            struct net_device *netdev, const u8 *buf,
9505                            size_t len, gfp_t gfp)
9506 {
9507         nl80211_send_mlme_event(rdev, netdev, buf, len,
9508                                 NL80211_CMD_DISASSOCIATE, gfp);
9509 }
9510
9511 void cfg80211_send_unprot_deauth(struct net_device *dev, const u8 *buf,
9512                                  size_t len)
9513 {
9514         struct wireless_dev *wdev = dev->ieee80211_ptr;
9515         struct wiphy *wiphy = wdev->wiphy;
9516         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9517
9518         trace_cfg80211_send_unprot_deauth(dev);
9519         nl80211_send_mlme_event(rdev, dev, buf, len,
9520                                 NL80211_CMD_UNPROT_DEAUTHENTICATE, GFP_ATOMIC);
9521 }
9522 EXPORT_SYMBOL(cfg80211_send_unprot_deauth);
9523
9524 void cfg80211_send_unprot_disassoc(struct net_device *dev, const u8 *buf,
9525                                    size_t len)
9526 {
9527         struct wireless_dev *wdev = dev->ieee80211_ptr;
9528         struct wiphy *wiphy = wdev->wiphy;
9529         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9530
9531         trace_cfg80211_send_unprot_disassoc(dev);
9532         nl80211_send_mlme_event(rdev, dev, buf, len,
9533                                 NL80211_CMD_UNPROT_DISASSOCIATE, GFP_ATOMIC);
9534 }
9535 EXPORT_SYMBOL(cfg80211_send_unprot_disassoc);
9536
9537 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
9538                                       struct net_device *netdev, int cmd,
9539                                       const u8 *addr, gfp_t gfp)
9540 {
9541         struct sk_buff *msg;
9542         void *hdr;
9543
9544         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9545         if (!msg)
9546                 return;
9547
9548         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
9549         if (!hdr) {
9550                 nlmsg_free(msg);
9551                 return;
9552         }
9553
9554         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9555             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
9556             nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
9557             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
9558                 goto nla_put_failure;
9559
9560         genlmsg_end(msg, hdr);
9561
9562         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9563                                 nl80211_mlme_mcgrp.id, gfp);
9564         return;
9565
9566  nla_put_failure:
9567         genlmsg_cancel(msg, hdr);
9568         nlmsg_free(msg);
9569 }
9570
9571 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
9572                                struct net_device *netdev, const u8 *addr,
9573                                gfp_t gfp)
9574 {
9575         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
9576                                   addr, gfp);
9577 }
9578
9579 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
9580                                 struct net_device *netdev, const u8 *addr,
9581                                 gfp_t gfp)
9582 {
9583         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
9584                                   addr, gfp);
9585 }
9586
9587 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
9588                                  struct net_device *netdev, const u8 *bssid,
9589                                  const u8 *req_ie, size_t req_ie_len,
9590                                  const u8 *resp_ie, size_t resp_ie_len,
9591                                  u16 status, gfp_t gfp)
9592 {
9593         struct sk_buff *msg;
9594         void *hdr;
9595
9596         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9597         if (!msg)
9598                 return;
9599
9600         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
9601         if (!hdr) {
9602                 nlmsg_free(msg);
9603                 return;
9604         }
9605
9606         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9607             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
9608             (bssid && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) ||
9609             nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, status) ||
9610             (req_ie &&
9611              nla_put(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie)) ||
9612             (resp_ie &&
9613              nla_put(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie)))
9614                 goto nla_put_failure;
9615
9616         genlmsg_end(msg, hdr);
9617
9618         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9619                                 nl80211_mlme_mcgrp.id, gfp);
9620         return;
9621
9622  nla_put_failure:
9623         genlmsg_cancel(msg, hdr);
9624         nlmsg_free(msg);
9625
9626 }
9627
9628 void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
9629                          struct net_device *netdev, const u8 *bssid,
9630                          const u8 *req_ie, size_t req_ie_len,
9631                          const u8 *resp_ie, size_t resp_ie_len, gfp_t gfp)
9632 {
9633         struct sk_buff *msg;
9634         void *hdr;
9635
9636         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9637         if (!msg)
9638                 return;
9639
9640         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
9641         if (!hdr) {
9642                 nlmsg_free(msg);
9643                 return;
9644         }
9645
9646         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9647             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
9648             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) ||
9649             (req_ie &&
9650              nla_put(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie)) ||
9651             (resp_ie &&
9652              nla_put(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie)))
9653                 goto nla_put_failure;
9654
9655         genlmsg_end(msg, hdr);
9656
9657         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9658                                 nl80211_mlme_mcgrp.id, gfp);
9659         return;
9660
9661  nla_put_failure:
9662         genlmsg_cancel(msg, hdr);
9663         nlmsg_free(msg);
9664
9665 }
9666
9667 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
9668                                struct net_device *netdev, u16 reason,
9669                                const u8 *ie, size_t ie_len, bool from_ap)
9670 {
9671         struct sk_buff *msg;
9672         void *hdr;
9673
9674         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9675         if (!msg)
9676                 return;
9677
9678         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
9679         if (!hdr) {
9680                 nlmsg_free(msg);
9681                 return;
9682         }
9683
9684         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9685             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
9686             (from_ap && reason &&
9687              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) ||
9688             (from_ap &&
9689              nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) ||
9690             (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie)))
9691                 goto nla_put_failure;
9692
9693         genlmsg_end(msg, hdr);
9694
9695         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9696                                 nl80211_mlme_mcgrp.id, GFP_KERNEL);
9697         return;
9698
9699  nla_put_failure:
9700         genlmsg_cancel(msg, hdr);
9701         nlmsg_free(msg);
9702
9703 }
9704
9705 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
9706                              struct net_device *netdev, const u8 *bssid,
9707                              gfp_t gfp)
9708 {
9709         struct sk_buff *msg;
9710         void *hdr;
9711
9712         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9713         if (!msg)
9714                 return;
9715
9716         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
9717         if (!hdr) {
9718                 nlmsg_free(msg);
9719                 return;
9720         }
9721
9722         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9723             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
9724             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
9725                 goto nla_put_failure;
9726
9727         genlmsg_end(msg, hdr);
9728
9729         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9730                                 nl80211_mlme_mcgrp.id, gfp);
9731         return;
9732
9733  nla_put_failure:
9734         genlmsg_cancel(msg, hdr);
9735         nlmsg_free(msg);
9736 }
9737
9738 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
9739                                         const u8* ie, u8 ie_len, gfp_t gfp)
9740 {
9741         struct wireless_dev *wdev = dev->ieee80211_ptr;
9742         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
9743         struct sk_buff *msg;
9744         void *hdr;
9745
9746         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
9747                 return;
9748
9749         trace_cfg80211_notify_new_peer_candidate(dev, addr);
9750
9751         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9752         if (!msg)
9753                 return;
9754
9755         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
9756         if (!hdr) {
9757                 nlmsg_free(msg);
9758                 return;
9759         }
9760
9761         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9762             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
9763             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
9764             (ie_len && ie &&
9765              nla_put(msg, NL80211_ATTR_IE, ie_len , ie)))
9766                 goto nla_put_failure;
9767
9768         genlmsg_end(msg, hdr);
9769
9770         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9771                                 nl80211_mlme_mcgrp.id, gfp);
9772         return;
9773
9774  nla_put_failure:
9775         genlmsg_cancel(msg, hdr);
9776         nlmsg_free(msg);
9777 }
9778 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
9779
9780 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
9781                                  struct net_device *netdev, const u8 *addr,
9782                                  enum nl80211_key_type key_type, int key_id,
9783                                  const u8 *tsc, gfp_t gfp)
9784 {
9785         struct sk_buff *msg;
9786         void *hdr;
9787
9788         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9789         if (!msg)
9790                 return;
9791
9792         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
9793         if (!hdr) {
9794                 nlmsg_free(msg);
9795                 return;
9796         }
9797
9798         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9799             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
9800             (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) ||
9801             nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) ||
9802             (key_id != -1 &&
9803              nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) ||
9804             (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc)))
9805                 goto nla_put_failure;
9806
9807         genlmsg_end(msg, hdr);
9808
9809         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9810                                 nl80211_mlme_mcgrp.id, gfp);
9811         return;
9812
9813  nla_put_failure:
9814         genlmsg_cancel(msg, hdr);
9815         nlmsg_free(msg);
9816 }
9817
9818 void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
9819                                     struct ieee80211_channel *channel_before,
9820                                     struct ieee80211_channel *channel_after)
9821 {
9822         struct sk_buff *msg;
9823         void *hdr;
9824         struct nlattr *nl_freq;
9825
9826         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
9827         if (!msg)
9828                 return;
9829
9830         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
9831         if (!hdr) {
9832                 nlmsg_free(msg);
9833                 return;
9834         }
9835
9836         /*
9837          * Since we are applying the beacon hint to a wiphy we know its
9838          * wiphy_idx is valid
9839          */
9840         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
9841                 goto nla_put_failure;
9842
9843         /* Before */
9844         nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_BEFORE);
9845         if (!nl_freq)
9846                 goto nla_put_failure;
9847         if (nl80211_msg_put_channel(msg, channel_before, false))
9848                 goto nla_put_failure;
9849         nla_nest_end(msg, nl_freq);
9850
9851         /* After */
9852         nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_AFTER);
9853         if (!nl_freq)
9854                 goto nla_put_failure;
9855         if (nl80211_msg_put_channel(msg, channel_after, false))
9856                 goto nla_put_failure;
9857         nla_nest_end(msg, nl_freq);
9858
9859         genlmsg_end(msg, hdr);
9860
9861         rcu_read_lock();
9862         genlmsg_multicast_allns(msg, 0, nl80211_regulatory_mcgrp.id,
9863                                 GFP_ATOMIC);
9864         rcu_read_unlock();
9865
9866         return;
9867
9868 nla_put_failure:
9869         genlmsg_cancel(msg, hdr);
9870         nlmsg_free(msg);
9871 }
9872
9873 static void nl80211_send_remain_on_chan_event(
9874         int cmd, struct cfg80211_registered_device *rdev,
9875         struct wireless_dev *wdev, u64 cookie,
9876         struct ieee80211_channel *chan,
9877         unsigned int duration, gfp_t gfp)
9878 {
9879         struct sk_buff *msg;
9880         void *hdr;
9881
9882         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9883         if (!msg)
9884                 return;
9885
9886         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
9887         if (!hdr) {
9888                 nlmsg_free(msg);
9889                 return;
9890         }
9891
9892         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9893             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
9894                                          wdev->netdev->ifindex)) ||
9895             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
9896             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) ||
9897             nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
9898                         NL80211_CHAN_NO_HT) ||
9899             nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
9900                 goto nla_put_failure;
9901
9902         if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL &&
9903             nla_put_u32(msg, NL80211_ATTR_DURATION, duration))
9904                 goto nla_put_failure;
9905
9906         genlmsg_end(msg, hdr);
9907
9908         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9909                                 nl80211_mlme_mcgrp.id, gfp);
9910         return;
9911
9912  nla_put_failure:
9913         genlmsg_cancel(msg, hdr);
9914         nlmsg_free(msg);
9915 }
9916
9917 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
9918                                struct ieee80211_channel *chan,
9919                                unsigned int duration, gfp_t gfp)
9920 {
9921         struct wiphy *wiphy = wdev->wiphy;
9922         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9923
9924         trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
9925         nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
9926                                           rdev, wdev, cookie, chan,
9927                                           duration, gfp);
9928 }
9929 EXPORT_SYMBOL(cfg80211_ready_on_channel);
9930
9931 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
9932                                         struct ieee80211_channel *chan,
9933                                         gfp_t gfp)
9934 {
9935         struct wiphy *wiphy = wdev->wiphy;
9936         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9937
9938         trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
9939         nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
9940                                           rdev, wdev, cookie, chan, 0, gfp);
9941 }
9942 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
9943
9944 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
9945                       struct station_info *sinfo, gfp_t gfp)
9946 {
9947         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
9948         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9949         struct sk_buff *msg;
9950
9951         trace_cfg80211_new_sta(dev, mac_addr, sinfo);
9952
9953         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9954         if (!msg)
9955                 return;
9956
9957         if (nl80211_send_station(msg, 0, 0, 0,
9958                                  rdev, dev, mac_addr, sinfo) < 0) {
9959                 nlmsg_free(msg);
9960                 return;
9961         }
9962
9963         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9964                                 nl80211_mlme_mcgrp.id, gfp);
9965 }
9966 EXPORT_SYMBOL(cfg80211_new_sta);
9967
9968 void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp)
9969 {
9970         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
9971         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9972         struct sk_buff *msg;
9973         void *hdr;
9974
9975         trace_cfg80211_del_sta(dev, mac_addr);
9976
9977         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9978         if (!msg)
9979                 return;
9980
9981         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_STATION);
9982         if (!hdr) {
9983                 nlmsg_free(msg);
9984                 return;
9985         }
9986
9987         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
9988             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
9989                 goto nla_put_failure;
9990
9991         genlmsg_end(msg, hdr);
9992
9993         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9994                                 nl80211_mlme_mcgrp.id, gfp);
9995         return;
9996
9997  nla_put_failure:
9998         genlmsg_cancel(msg, hdr);
9999         nlmsg_free(msg);
10000 }
10001 EXPORT_SYMBOL(cfg80211_del_sta);
10002
10003 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
10004                           enum nl80211_connect_failed_reason reason,
10005                           gfp_t gfp)
10006 {
10007         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
10008         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10009         struct sk_buff *msg;
10010         void *hdr;
10011
10012         msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
10013         if (!msg)
10014                 return;
10015
10016         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
10017         if (!hdr) {
10018                 nlmsg_free(msg);
10019                 return;
10020         }
10021
10022         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10023             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
10024             nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
10025                 goto nla_put_failure;
10026
10027         genlmsg_end(msg, hdr);
10028
10029         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10030                                 nl80211_mlme_mcgrp.id, gfp);
10031         return;
10032
10033  nla_put_failure:
10034         genlmsg_cancel(msg, hdr);
10035         nlmsg_free(msg);
10036 }
10037 EXPORT_SYMBOL(cfg80211_conn_failed);
10038
10039 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
10040                                        const u8 *addr, gfp_t gfp)
10041 {
10042         struct wireless_dev *wdev = dev->ieee80211_ptr;
10043         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
10044         struct sk_buff *msg;
10045         void *hdr;
10046         int err;
10047         u32 nlportid = ACCESS_ONCE(wdev->ap_unexpected_nlportid);
10048
10049         if (!nlportid)
10050                 return false;
10051
10052         msg = nlmsg_new(100, gfp);
10053         if (!msg)
10054                 return true;
10055
10056         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
10057         if (!hdr) {
10058                 nlmsg_free(msg);
10059                 return true;
10060         }
10061
10062         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10063             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10064             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
10065                 goto nla_put_failure;
10066
10067         err = genlmsg_end(msg, hdr);
10068         if (err < 0) {
10069                 nlmsg_free(msg);
10070                 return true;
10071         }
10072
10073         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
10074         return true;
10075
10076  nla_put_failure:
10077         genlmsg_cancel(msg, hdr);
10078         nlmsg_free(msg);
10079         return true;
10080 }
10081
10082 bool cfg80211_rx_spurious_frame(struct net_device *dev,
10083                                 const u8 *addr, gfp_t gfp)
10084 {
10085         struct wireless_dev *wdev = dev->ieee80211_ptr;
10086         bool ret;
10087
10088         trace_cfg80211_rx_spurious_frame(dev, addr);
10089
10090         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
10091                     wdev->iftype != NL80211_IFTYPE_P2P_GO)) {
10092                 trace_cfg80211_return_bool(false);
10093                 return false;
10094         }
10095         ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME,
10096                                          addr, gfp);
10097         trace_cfg80211_return_bool(ret);
10098         return ret;
10099 }
10100 EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
10101
10102 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
10103                                         const u8 *addr, gfp_t gfp)
10104 {
10105         struct wireless_dev *wdev = dev->ieee80211_ptr;
10106         bool ret;
10107
10108         trace_cfg80211_rx_unexpected_4addr_frame(dev, addr);
10109
10110         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
10111                     wdev->iftype != NL80211_IFTYPE_P2P_GO &&
10112                     wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
10113                 trace_cfg80211_return_bool(false);
10114                 return false;
10115         }
10116         ret = __nl80211_unexpected_frame(dev,
10117                                          NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
10118                                          addr, gfp);
10119         trace_cfg80211_return_bool(ret);
10120         return ret;
10121 }
10122 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
10123
10124 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
10125                       struct wireless_dev *wdev, u32 nlportid,
10126                       int freq, int sig_dbm,
10127                       const u8 *buf, size_t len, gfp_t gfp)
10128 {
10129         struct net_device *netdev = wdev->netdev;
10130         struct sk_buff *msg;
10131         void *hdr;
10132
10133         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10134         if (!msg)
10135                 return -ENOMEM;
10136
10137         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
10138         if (!hdr) {
10139                 nlmsg_free(msg);
10140                 return -ENOMEM;
10141         }
10142
10143         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10144             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
10145                                         netdev->ifindex)) ||
10146             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
10147             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
10148             (sig_dbm &&
10149              nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
10150             nla_put(msg, NL80211_ATTR_FRAME, len, buf))
10151                 goto nla_put_failure;
10152
10153         genlmsg_end(msg, hdr);
10154
10155         return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
10156
10157  nla_put_failure:
10158         genlmsg_cancel(msg, hdr);
10159         nlmsg_free(msg);
10160         return -ENOBUFS;
10161 }
10162
10163 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
10164                              const u8 *buf, size_t len, bool ack, gfp_t gfp)
10165 {
10166         struct wiphy *wiphy = wdev->wiphy;
10167         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10168         struct net_device *netdev = wdev->netdev;
10169         struct sk_buff *msg;
10170         void *hdr;
10171
10172         trace_cfg80211_mgmt_tx_status(wdev, cookie, ack);
10173
10174         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10175         if (!msg)
10176                 return;
10177
10178         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS);
10179         if (!hdr) {
10180                 nlmsg_free(msg);
10181                 return;
10182         }
10183
10184         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10185             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
10186                                    netdev->ifindex)) ||
10187             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
10188             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
10189             nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) ||
10190             (ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
10191                 goto nla_put_failure;
10192
10193         genlmsg_end(msg, hdr);
10194
10195         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10196                                 nl80211_mlme_mcgrp.id, gfp);
10197         return;
10198
10199  nla_put_failure:
10200         genlmsg_cancel(msg, hdr);
10201         nlmsg_free(msg);
10202 }
10203 EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
10204
10205 void cfg80211_cqm_rssi_notify(struct net_device *dev,
10206                               enum nl80211_cqm_rssi_threshold_event rssi_event,
10207                               gfp_t gfp)
10208 {
10209         struct wireless_dev *wdev = dev->ieee80211_ptr;
10210         struct wiphy *wiphy = wdev->wiphy;
10211         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10212         struct sk_buff *msg;
10213         struct nlattr *pinfoattr;
10214         void *hdr;
10215
10216         trace_cfg80211_cqm_rssi_notify(dev, rssi_event);
10217
10218         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10219         if (!msg)
10220                 return;
10221
10222         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
10223         if (!hdr) {
10224                 nlmsg_free(msg);
10225                 return;
10226         }
10227
10228         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10229             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
10230                 goto nla_put_failure;
10231
10232         pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM);
10233         if (!pinfoattr)
10234                 goto nla_put_failure;
10235
10236         if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
10237                         rssi_event))
10238                 goto nla_put_failure;
10239
10240         nla_nest_end(msg, pinfoattr);
10241
10242         genlmsg_end(msg, hdr);
10243
10244         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10245                                 nl80211_mlme_mcgrp.id, gfp);
10246         return;
10247
10248  nla_put_failure:
10249         genlmsg_cancel(msg, hdr);
10250         nlmsg_free(msg);
10251 }
10252 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
10253
10254 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
10255                                      struct net_device *netdev, const u8 *bssid,
10256                                      const u8 *replay_ctr, gfp_t gfp)
10257 {
10258         struct sk_buff *msg;
10259         struct nlattr *rekey_attr;
10260         void *hdr;
10261
10262         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10263         if (!msg)
10264                 return;
10265
10266         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD);
10267         if (!hdr) {
10268                 nlmsg_free(msg);
10269                 return;
10270         }
10271
10272         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10273             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10274             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
10275                 goto nla_put_failure;
10276
10277         rekey_attr = nla_nest_start(msg, NL80211_ATTR_REKEY_DATA);
10278         if (!rekey_attr)
10279                 goto nla_put_failure;
10280
10281         if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR,
10282                     NL80211_REPLAY_CTR_LEN, replay_ctr))
10283                 goto nla_put_failure;
10284
10285         nla_nest_end(msg, rekey_attr);
10286
10287         genlmsg_end(msg, hdr);
10288
10289         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10290                                 nl80211_mlme_mcgrp.id, gfp);
10291         return;
10292
10293  nla_put_failure:
10294         genlmsg_cancel(msg, hdr);
10295         nlmsg_free(msg);
10296 }
10297
10298 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
10299                                const u8 *replay_ctr, gfp_t gfp)
10300 {
10301         struct wireless_dev *wdev = dev->ieee80211_ptr;
10302         struct wiphy *wiphy = wdev->wiphy;
10303         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10304
10305         trace_cfg80211_gtk_rekey_notify(dev, bssid);
10306         nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
10307 }
10308 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
10309
10310 static void
10311 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
10312                                struct net_device *netdev, int index,
10313                                const u8 *bssid, bool preauth, gfp_t gfp)
10314 {
10315         struct sk_buff *msg;
10316         struct nlattr *attr;
10317         void *hdr;
10318
10319         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10320         if (!msg)
10321                 return;
10322
10323         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE);
10324         if (!hdr) {
10325                 nlmsg_free(msg);
10326                 return;
10327         }
10328
10329         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10330             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
10331                 goto nla_put_failure;
10332
10333         attr = nla_nest_start(msg, NL80211_ATTR_PMKSA_CANDIDATE);
10334         if (!attr)
10335                 goto nla_put_failure;
10336
10337         if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) ||
10338             nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) ||
10339             (preauth &&
10340              nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH)))
10341                 goto nla_put_failure;
10342
10343         nla_nest_end(msg, attr);
10344
10345         genlmsg_end(msg, hdr);
10346
10347         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10348                                 nl80211_mlme_mcgrp.id, gfp);
10349         return;
10350
10351  nla_put_failure:
10352         genlmsg_cancel(msg, hdr);
10353         nlmsg_free(msg);
10354 }
10355
10356 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
10357                                      const u8 *bssid, bool preauth, gfp_t gfp)
10358 {
10359         struct wireless_dev *wdev = dev->ieee80211_ptr;
10360         struct wiphy *wiphy = wdev->wiphy;
10361         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10362
10363         trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
10364         nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
10365 }
10366 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
10367
10368 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
10369                                      struct net_device *netdev,
10370                                      struct cfg80211_chan_def *chandef,
10371                                      gfp_t gfp)
10372 {
10373         struct sk_buff *msg;
10374         void *hdr;
10375
10376         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10377         if (!msg)
10378                 return;
10379
10380         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CH_SWITCH_NOTIFY);
10381         if (!hdr) {
10382                 nlmsg_free(msg);
10383                 return;
10384         }
10385
10386         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
10387                 goto nla_put_failure;
10388
10389         if (nl80211_send_chandef(msg, chandef))
10390                 goto nla_put_failure;
10391
10392         genlmsg_end(msg, hdr);
10393
10394         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10395                                 nl80211_mlme_mcgrp.id, gfp);
10396         return;
10397
10398  nla_put_failure:
10399         genlmsg_cancel(msg, hdr);
10400         nlmsg_free(msg);
10401 }
10402
10403 void cfg80211_ch_switch_notify(struct net_device *dev,
10404                                struct cfg80211_chan_def *chandef)
10405 {
10406         struct wireless_dev *wdev = dev->ieee80211_ptr;
10407         struct wiphy *wiphy = wdev->wiphy;
10408         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10409
10410         trace_cfg80211_ch_switch_notify(dev, chandef);
10411
10412         wdev_lock(wdev);
10413
10414         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
10415                     wdev->iftype != NL80211_IFTYPE_P2P_GO))
10416                 goto out;
10417
10418         wdev->channel = chandef->chan;
10419         nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL);
10420 out:
10421         wdev_unlock(wdev);
10422         return;
10423 }
10424 EXPORT_SYMBOL(cfg80211_ch_switch_notify);
10425
10426 void cfg80211_cqm_txe_notify(struct net_device *dev,
10427                              const u8 *peer, u32 num_packets,
10428                              u32 rate, u32 intvl, gfp_t gfp)
10429 {
10430         struct wireless_dev *wdev = dev->ieee80211_ptr;
10431         struct wiphy *wiphy = wdev->wiphy;
10432         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10433         struct sk_buff *msg;
10434         struct nlattr *pinfoattr;
10435         void *hdr;
10436
10437         msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
10438         if (!msg)
10439                 return;
10440
10441         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
10442         if (!hdr) {
10443                 nlmsg_free(msg);
10444                 return;
10445         }
10446
10447         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10448             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10449             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer))
10450                 goto nla_put_failure;
10451
10452         pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM);
10453         if (!pinfoattr)
10454                 goto nla_put_failure;
10455
10456         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets))
10457                 goto nla_put_failure;
10458
10459         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate))
10460                 goto nla_put_failure;
10461
10462         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl))
10463                 goto nla_put_failure;
10464
10465         nla_nest_end(msg, pinfoattr);
10466
10467         genlmsg_end(msg, hdr);
10468
10469         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10470                                 nl80211_mlme_mcgrp.id, gfp);
10471         return;
10472
10473  nla_put_failure:
10474         genlmsg_cancel(msg, hdr);
10475         nlmsg_free(msg);
10476 }
10477 EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
10478
10479 void
10480 nl80211_radar_notify(struct cfg80211_registered_device *rdev,
10481                      struct cfg80211_chan_def *chandef,
10482                      enum nl80211_radar_event event,
10483                      struct net_device *netdev, gfp_t gfp)
10484 {
10485         struct sk_buff *msg;
10486         void *hdr;
10487
10488         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10489         if (!msg)
10490                 return;
10491
10492         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT);
10493         if (!hdr) {
10494                 nlmsg_free(msg);
10495                 return;
10496         }
10497
10498         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
10499                 goto nla_put_failure;
10500
10501         /* NOP and radar events don't need a netdev parameter */
10502         if (netdev) {
10503                 struct wireless_dev *wdev = netdev->ieee80211_ptr;
10504
10505                 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10506                     nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
10507                         goto nla_put_failure;
10508         }
10509
10510         if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
10511                 goto nla_put_failure;
10512
10513         if (nl80211_send_chandef(msg, chandef))
10514                 goto nla_put_failure;
10515
10516         if (genlmsg_end(msg, hdr) < 0) {
10517                 nlmsg_free(msg);
10518                 return;
10519         }
10520
10521         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10522                                 nl80211_mlme_mcgrp.id, gfp);
10523         return;
10524
10525  nla_put_failure:
10526         genlmsg_cancel(msg, hdr);
10527         nlmsg_free(msg);
10528 }
10529
10530 void cfg80211_cqm_pktloss_notify(struct net_device *dev,
10531                                  const u8 *peer, u32 num_packets, gfp_t gfp)
10532 {
10533         struct wireless_dev *wdev = dev->ieee80211_ptr;
10534         struct wiphy *wiphy = wdev->wiphy;
10535         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10536         struct sk_buff *msg;
10537         struct nlattr *pinfoattr;
10538         void *hdr;
10539
10540         trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
10541
10542         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10543         if (!msg)
10544                 return;
10545
10546         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
10547         if (!hdr) {
10548                 nlmsg_free(msg);
10549                 return;
10550         }
10551
10552         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10553             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10554             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer))
10555                 goto nla_put_failure;
10556
10557         pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM);
10558         if (!pinfoattr)
10559                 goto nla_put_failure;
10560
10561         if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets))
10562                 goto nla_put_failure;
10563
10564         nla_nest_end(msg, pinfoattr);
10565
10566         genlmsg_end(msg, hdr);
10567
10568         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10569                                 nl80211_mlme_mcgrp.id, gfp);
10570         return;
10571
10572  nla_put_failure:
10573         genlmsg_cancel(msg, hdr);
10574         nlmsg_free(msg);
10575 }
10576 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
10577
10578 void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
10579                            u64 cookie, bool acked, gfp_t gfp)
10580 {
10581         struct wireless_dev *wdev = dev->ieee80211_ptr;
10582         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
10583         struct sk_buff *msg;
10584         void *hdr;
10585         int err;
10586
10587         trace_cfg80211_probe_status(dev, addr, cookie, acked);
10588
10589         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10590
10591         if (!msg)
10592                 return;
10593
10594         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT);
10595         if (!hdr) {
10596                 nlmsg_free(msg);
10597                 return;
10598         }
10599
10600         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10601             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10602             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
10603             nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) ||
10604             (acked && nla_put_flag(msg, NL80211_ATTR_ACK)))
10605                 goto nla_put_failure;
10606
10607         err = genlmsg_end(msg, hdr);
10608         if (err < 0) {
10609                 nlmsg_free(msg);
10610                 return;
10611         }
10612
10613         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10614                                 nl80211_mlme_mcgrp.id, gfp);
10615         return;
10616
10617  nla_put_failure:
10618         genlmsg_cancel(msg, hdr);
10619         nlmsg_free(msg);
10620 }
10621 EXPORT_SYMBOL(cfg80211_probe_status);
10622
10623 void cfg80211_report_obss_beacon(struct wiphy *wiphy,
10624                                  const u8 *frame, size_t len,
10625                                  int freq, int sig_dbm)
10626 {
10627         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10628         struct sk_buff *msg;
10629         void *hdr;
10630         struct cfg80211_beacon_registration *reg;
10631
10632         trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm);
10633
10634         spin_lock_bh(&rdev->beacon_registrations_lock);
10635         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
10636                 msg = nlmsg_new(len + 100, GFP_ATOMIC);
10637                 if (!msg) {
10638                         spin_unlock_bh(&rdev->beacon_registrations_lock);
10639                         return;
10640                 }
10641
10642                 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
10643                 if (!hdr)
10644                         goto nla_put_failure;
10645
10646                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10647                     (freq &&
10648                      nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq)) ||
10649                     (sig_dbm &&
10650                      nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
10651                     nla_put(msg, NL80211_ATTR_FRAME, len, frame))
10652                         goto nla_put_failure;
10653
10654                 genlmsg_end(msg, hdr);
10655
10656                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid);
10657         }
10658         spin_unlock_bh(&rdev->beacon_registrations_lock);
10659         return;
10660
10661  nla_put_failure:
10662         spin_unlock_bh(&rdev->beacon_registrations_lock);
10663         if (hdr)
10664                 genlmsg_cancel(msg, hdr);
10665         nlmsg_free(msg);
10666 }
10667 EXPORT_SYMBOL(cfg80211_report_obss_beacon);
10668
10669 #ifdef CONFIG_PM
10670 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
10671                                    struct cfg80211_wowlan_wakeup *wakeup,
10672                                    gfp_t gfp)
10673 {
10674         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
10675         struct sk_buff *msg;
10676         void *hdr;
10677         int err, size = 200;
10678
10679         trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup);
10680
10681         if (wakeup)
10682                 size += wakeup->packet_present_len;
10683
10684         msg = nlmsg_new(size, gfp);
10685         if (!msg)
10686                 return;
10687
10688         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN);
10689         if (!hdr)
10690                 goto free_msg;
10691
10692         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10693             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
10694                 goto free_msg;
10695
10696         if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
10697                                         wdev->netdev->ifindex))
10698                 goto free_msg;
10699
10700         if (wakeup) {
10701                 struct nlattr *reasons;
10702
10703                 reasons = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
10704
10705                 if (wakeup->disconnect &&
10706                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT))
10707                         goto free_msg;
10708                 if (wakeup->magic_pkt &&
10709                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT))
10710                         goto free_msg;
10711                 if (wakeup->gtk_rekey_failure &&
10712                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE))
10713                         goto free_msg;
10714                 if (wakeup->eap_identity_req &&
10715                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST))
10716                         goto free_msg;
10717                 if (wakeup->four_way_handshake &&
10718                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE))
10719                         goto free_msg;
10720                 if (wakeup->rfkill_release &&
10721                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))
10722                         goto free_msg;
10723
10724                 if (wakeup->pattern_idx >= 0 &&
10725                     nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
10726                                 wakeup->pattern_idx))
10727                         goto free_msg;
10728
10729                 if (wakeup->tcp_match)
10730                         nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH);
10731
10732                 if (wakeup->tcp_connlost)
10733                         nla_put_flag(msg,
10734                                      NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST);
10735
10736                 if (wakeup->tcp_nomoretokens)
10737                         nla_put_flag(msg,
10738                                 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS);
10739
10740                 if (wakeup->packet) {
10741                         u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211;
10742                         u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN;
10743
10744                         if (!wakeup->packet_80211) {
10745                                 pkt_attr =
10746                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023;
10747                                 len_attr =
10748                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN;
10749                         }
10750
10751                         if (wakeup->packet_len &&
10752                             nla_put_u32(msg, len_attr, wakeup->packet_len))
10753                                 goto free_msg;
10754
10755                         if (nla_put(msg, pkt_attr, wakeup->packet_present_len,
10756                                     wakeup->packet))
10757                                 goto free_msg;
10758                 }
10759
10760                 nla_nest_end(msg, reasons);
10761         }
10762
10763         err = genlmsg_end(msg, hdr);
10764         if (err < 0)
10765                 goto free_msg;
10766
10767         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10768                                 nl80211_mlme_mcgrp.id, gfp);
10769         return;
10770
10771  free_msg:
10772         nlmsg_free(msg);
10773 }
10774 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup);
10775 #endif
10776
10777 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
10778                                 enum nl80211_tdls_operation oper,
10779                                 u16 reason_code, gfp_t gfp)
10780 {
10781         struct wireless_dev *wdev = dev->ieee80211_ptr;
10782         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
10783         struct sk_buff *msg;
10784         void *hdr;
10785         int err;
10786
10787         trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper,
10788                                          reason_code);
10789
10790         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10791         if (!msg)
10792                 return;
10793
10794         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER);
10795         if (!hdr) {
10796                 nlmsg_free(msg);
10797                 return;
10798         }
10799
10800         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10801             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10802             nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) ||
10803             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) ||
10804             (reason_code > 0 &&
10805              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code)))
10806                 goto nla_put_failure;
10807
10808         err = genlmsg_end(msg, hdr);
10809         if (err < 0) {
10810                 nlmsg_free(msg);
10811                 return;
10812         }
10813
10814         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10815                                 nl80211_mlme_mcgrp.id, gfp);
10816         return;
10817
10818  nla_put_failure:
10819         genlmsg_cancel(msg, hdr);
10820         nlmsg_free(msg);
10821 }
10822 EXPORT_SYMBOL(cfg80211_tdls_oper_request);
10823
10824 static int nl80211_netlink_notify(struct notifier_block * nb,
10825                                   unsigned long state,
10826                                   void *_notify)
10827 {
10828         struct netlink_notify *notify = _notify;
10829         struct cfg80211_registered_device *rdev;
10830         struct wireless_dev *wdev;
10831         struct cfg80211_beacon_registration *reg, *tmp;
10832
10833         if (state != NETLINK_URELEASE)
10834                 return NOTIFY_DONE;
10835
10836         rcu_read_lock();
10837
10838         list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
10839                 list_for_each_entry_rcu(wdev, &rdev->wdev_list, list)
10840                         cfg80211_mlme_unregister_socket(wdev, notify->portid);
10841
10842                 spin_lock_bh(&rdev->beacon_registrations_lock);
10843                 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations,
10844                                          list) {
10845                         if (reg->nlportid == notify->portid) {
10846                                 list_del(&reg->list);
10847                                 kfree(reg);
10848                                 break;
10849                         }
10850                 }
10851                 spin_unlock_bh(&rdev->beacon_registrations_lock);
10852         }
10853
10854         rcu_read_unlock();
10855
10856         return NOTIFY_DONE;
10857 }
10858
10859 static struct notifier_block nl80211_netlink_notifier = {
10860         .notifier_call = nl80211_netlink_notify,
10861 };
10862
10863 void cfg80211_ft_event(struct net_device *netdev,
10864                        struct cfg80211_ft_event_params *ft_event)
10865 {
10866         struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
10867         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10868         struct sk_buff *msg;
10869         void *hdr;
10870         int err;
10871
10872         trace_cfg80211_ft_event(wiphy, netdev, ft_event);
10873
10874         if (!ft_event->target_ap)
10875                 return;
10876
10877         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10878         if (!msg)
10879                 return;
10880
10881         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT);
10882         if (!hdr) {
10883                 nlmsg_free(msg);
10884                 return;
10885         }
10886
10887         nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
10888         nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
10889         nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap);
10890         if (ft_event->ies)
10891                 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies);
10892         if (ft_event->ric_ies)
10893                 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len,
10894                         ft_event->ric_ies);
10895
10896         err = genlmsg_end(msg, hdr);
10897         if (err < 0) {
10898                 nlmsg_free(msg);
10899                 return;
10900         }
10901
10902         genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
10903                                 nl80211_mlme_mcgrp.id, GFP_KERNEL);
10904 }
10905 EXPORT_SYMBOL(cfg80211_ft_event);
10906
10907 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp)
10908 {
10909         struct cfg80211_registered_device *rdev;
10910         struct sk_buff *msg;
10911         void *hdr;
10912         u32 nlportid;
10913
10914         rdev = wiphy_to_dev(wdev->wiphy);
10915         if (!rdev->crit_proto_nlportid)
10916                 return;
10917
10918         nlportid = rdev->crit_proto_nlportid;
10919         rdev->crit_proto_nlportid = 0;
10920
10921         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10922         if (!msg)
10923                 return;
10924
10925         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP);
10926         if (!hdr)
10927                 goto nla_put_failure;
10928
10929         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10930             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
10931                 goto nla_put_failure;
10932
10933         genlmsg_end(msg, hdr);
10934
10935         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
10936         return;
10937
10938  nla_put_failure:
10939         if (hdr)
10940                 genlmsg_cancel(msg, hdr);
10941         nlmsg_free(msg);
10942
10943 }
10944 EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
10945
10946 /* initialisation/exit functions */
10947
10948 int nl80211_init(void)
10949 {
10950         int err;
10951
10952         err = genl_register_family_with_ops(&nl80211_fam,
10953                 nl80211_ops, ARRAY_SIZE(nl80211_ops));
10954         if (err)
10955                 return err;
10956
10957         err = genl_register_mc_group(&nl80211_fam, &nl80211_config_mcgrp);
10958         if (err)
10959                 goto err_out;
10960
10961         err = genl_register_mc_group(&nl80211_fam, &nl80211_scan_mcgrp);
10962         if (err)
10963                 goto err_out;
10964
10965         err = genl_register_mc_group(&nl80211_fam, &nl80211_regulatory_mcgrp);
10966         if (err)
10967                 goto err_out;
10968
10969         err = genl_register_mc_group(&nl80211_fam, &nl80211_mlme_mcgrp);
10970         if (err)
10971                 goto err_out;
10972
10973 #ifdef CONFIG_NL80211_TESTMODE
10974         err = genl_register_mc_group(&nl80211_fam, &nl80211_testmode_mcgrp);
10975         if (err)
10976                 goto err_out;
10977
10978         err = genl_register_mc_group(&nl80211_fam, &nl80211_vendor_mcgrp);
10979         if (err)
10980                 goto err_out;
10981 #endif
10982
10983         err = netlink_register_notifier(&nl80211_netlink_notifier);
10984         if (err)
10985                 goto err_out;
10986
10987         return 0;
10988  err_out:
10989         genl_unregister_family(&nl80211_fam);
10990         return err;
10991 }
10992
10993 void nl80211_exit(void)
10994 {
10995         netlink_unregister_notifier(&nl80211_netlink_notifier);
10996         genl_unregister_family(&nl80211_fam);
10997 }