]> asedeno.scripts.mit.edu Git - linux.git/blob - net/wireless/nl80211.c
Merge tag 'Wimplicit-fallthrough-5.3-rc4' of git://git.kernel.org/pub/scm/linux/kerne...
[linux.git] / net / wireless / nl80211.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * This is the new netlink-based wireless configuration interface.
4  *
5  * Copyright 2006-2010  Johannes Berg <johannes@sipsolutions.net>
6  * Copyright 2013-2014  Intel Mobile Communications GmbH
7  * Copyright 2015-2017  Intel Deutschland GmbH
8  * Copyright (C) 2018-2019 Intel Corporation
9  */
10
11 #include <linux/if.h>
12 #include <linux/module.h>
13 #include <linux/err.h>
14 #include <linux/slab.h>
15 #include <linux/list.h>
16 #include <linux/if_ether.h>
17 #include <linux/ieee80211.h>
18 #include <linux/nl80211.h>
19 #include <linux/rtnetlink.h>
20 #include <linux/netlink.h>
21 #include <linux/nospec.h>
22 #include <linux/etherdevice.h>
23 #include <net/net_namespace.h>
24 #include <net/genetlink.h>
25 #include <net/cfg80211.h>
26 #include <net/sock.h>
27 #include <net/inet_connection_sock.h>
28 #include "core.h"
29 #include "nl80211.h"
30 #include "reg.h"
31 #include "rdev-ops.h"
32
33 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
34                                    struct genl_info *info,
35                                    struct cfg80211_crypto_settings *settings,
36                                    int cipher_limit);
37
38 /* the netlink family */
39 static struct genl_family nl80211_fam;
40
41 /* multicast groups */
42 enum nl80211_multicast_groups {
43         NL80211_MCGRP_CONFIG,
44         NL80211_MCGRP_SCAN,
45         NL80211_MCGRP_REGULATORY,
46         NL80211_MCGRP_MLME,
47         NL80211_MCGRP_VENDOR,
48         NL80211_MCGRP_NAN,
49         NL80211_MCGRP_TESTMODE /* keep last - ifdef! */
50 };
51
52 static const struct genl_multicast_group nl80211_mcgrps[] = {
53         [NL80211_MCGRP_CONFIG] = { .name = NL80211_MULTICAST_GROUP_CONFIG },
54         [NL80211_MCGRP_SCAN] = { .name = NL80211_MULTICAST_GROUP_SCAN },
55         [NL80211_MCGRP_REGULATORY] = { .name = NL80211_MULTICAST_GROUP_REG },
56         [NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME },
57         [NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR },
58         [NL80211_MCGRP_NAN] = { .name = NL80211_MULTICAST_GROUP_NAN },
59 #ifdef CONFIG_NL80211_TESTMODE
60         [NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE }
61 #endif
62 };
63
64 /* returns ERR_PTR values */
65 static struct wireless_dev *
66 __cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs)
67 {
68         struct cfg80211_registered_device *rdev;
69         struct wireless_dev *result = NULL;
70         bool have_ifidx = attrs[NL80211_ATTR_IFINDEX];
71         bool have_wdev_id = attrs[NL80211_ATTR_WDEV];
72         u64 wdev_id;
73         int wiphy_idx = -1;
74         int ifidx = -1;
75
76         ASSERT_RTNL();
77
78         if (!have_ifidx && !have_wdev_id)
79                 return ERR_PTR(-EINVAL);
80
81         if (have_ifidx)
82                 ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
83         if (have_wdev_id) {
84                 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
85                 wiphy_idx = wdev_id >> 32;
86         }
87
88         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
89                 struct wireless_dev *wdev;
90
91                 if (wiphy_net(&rdev->wiphy) != netns)
92                         continue;
93
94                 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx)
95                         continue;
96
97                 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
98                         if (have_ifidx && wdev->netdev &&
99                             wdev->netdev->ifindex == ifidx) {
100                                 result = wdev;
101                                 break;
102                         }
103                         if (have_wdev_id && wdev->identifier == (u32)wdev_id) {
104                                 result = wdev;
105                                 break;
106                         }
107                 }
108
109                 if (result)
110                         break;
111         }
112
113         if (result)
114                 return result;
115         return ERR_PTR(-ENODEV);
116 }
117
118 static struct cfg80211_registered_device *
119 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs)
120 {
121         struct cfg80211_registered_device *rdev = NULL, *tmp;
122         struct net_device *netdev;
123
124         ASSERT_RTNL();
125
126         if (!attrs[NL80211_ATTR_WIPHY] &&
127             !attrs[NL80211_ATTR_IFINDEX] &&
128             !attrs[NL80211_ATTR_WDEV])
129                 return ERR_PTR(-EINVAL);
130
131         if (attrs[NL80211_ATTR_WIPHY])
132                 rdev = cfg80211_rdev_by_wiphy_idx(
133                                 nla_get_u32(attrs[NL80211_ATTR_WIPHY]));
134
135         if (attrs[NL80211_ATTR_WDEV]) {
136                 u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
137                 struct wireless_dev *wdev;
138                 bool found = false;
139
140                 tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32);
141                 if (tmp) {
142                         /* make sure wdev exists */
143                         list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) {
144                                 if (wdev->identifier != (u32)wdev_id)
145                                         continue;
146                                 found = true;
147                                 break;
148                         }
149
150                         if (!found)
151                                 tmp = NULL;
152
153                         if (rdev && tmp != rdev)
154                                 return ERR_PTR(-EINVAL);
155                         rdev = tmp;
156                 }
157         }
158
159         if (attrs[NL80211_ATTR_IFINDEX]) {
160                 int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
161
162                 netdev = __dev_get_by_index(netns, ifindex);
163                 if (netdev) {
164                         if (netdev->ieee80211_ptr)
165                                 tmp = wiphy_to_rdev(
166                                         netdev->ieee80211_ptr->wiphy);
167                         else
168                                 tmp = NULL;
169
170                         /* not wireless device -- return error */
171                         if (!tmp)
172                                 return ERR_PTR(-EINVAL);
173
174                         /* mismatch -- return error */
175                         if (rdev && tmp != rdev)
176                                 return ERR_PTR(-EINVAL);
177
178                         rdev = tmp;
179                 }
180         }
181
182         if (!rdev)
183                 return ERR_PTR(-ENODEV);
184
185         if (netns != wiphy_net(&rdev->wiphy))
186                 return ERR_PTR(-ENODEV);
187
188         return rdev;
189 }
190
191 /*
192  * This function returns a pointer to the driver
193  * that the genl_info item that is passed refers to.
194  *
195  * The result of this can be a PTR_ERR and hence must
196  * be checked with IS_ERR() for errors.
197  */
198 static struct cfg80211_registered_device *
199 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info)
200 {
201         return __cfg80211_rdev_from_attrs(netns, info->attrs);
202 }
203
204 static int validate_ie_attr(const struct nlattr *attr,
205                             struct netlink_ext_ack *extack)
206 {
207         const u8 *data = nla_data(attr);
208         unsigned int len = nla_len(attr);
209         const struct element *elem;
210
211         for_each_element(elem, data, len) {
212                 /* nothing */
213         }
214
215         if (for_each_element_completed(elem, data, len))
216                 return 0;
217
218         NL_SET_ERR_MSG_ATTR(extack, attr, "malformed information elements");
219         return -EINVAL;
220 }
221
222 /* policy for the attributes */
223 static const struct nla_policy
224 nl80211_ftm_responder_policy[NL80211_FTM_RESP_ATTR_MAX + 1] = {
225         [NL80211_FTM_RESP_ATTR_ENABLED] = { .type = NLA_FLAG, },
226         [NL80211_FTM_RESP_ATTR_LCI] = { .type = NLA_BINARY,
227                                         .len = U8_MAX },
228         [NL80211_FTM_RESP_ATTR_CIVICLOC] = { .type = NLA_BINARY,
229                                              .len = U8_MAX },
230 };
231
232 static const struct nla_policy
233 nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX + 1] = {
234         [NL80211_PMSR_FTM_REQ_ATTR_ASAP] = { .type = NLA_FLAG },
235         [NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE] = { .type = NLA_U32 },
236         [NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP] =
237                 NLA_POLICY_MAX(NLA_U8, 15),
238         [NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD] = { .type = NLA_U16 },
239         [NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION] =
240                 NLA_POLICY_MAX(NLA_U8, 15),
241         [NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST] =
242                 NLA_POLICY_MAX(NLA_U8, 31),
243         [NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES] = { .type = NLA_U8 },
244         [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI] = { .type = NLA_FLAG },
245         [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG },
246 };
247
248 static const struct nla_policy
249 nl80211_pmsr_req_data_policy[NL80211_PMSR_TYPE_MAX + 1] = {
250         [NL80211_PMSR_TYPE_FTM] =
251                 NLA_POLICY_NESTED(nl80211_pmsr_ftm_req_attr_policy),
252 };
253
254 static const struct nla_policy
255 nl80211_pmsr_req_attr_policy[NL80211_PMSR_REQ_ATTR_MAX + 1] = {
256         [NL80211_PMSR_REQ_ATTR_DATA] =
257                 NLA_POLICY_NESTED(nl80211_pmsr_req_data_policy),
258         [NL80211_PMSR_REQ_ATTR_GET_AP_TSF] = { .type = NLA_FLAG },
259 };
260
261 static const struct nla_policy
262 nl80211_psmr_peer_attr_policy[NL80211_PMSR_PEER_ATTR_MAX + 1] = {
263         [NL80211_PMSR_PEER_ATTR_ADDR] = NLA_POLICY_ETH_ADDR,
264         /*
265          * we could specify this again to be the top-level policy,
266          * but that would open us up to recursion problems ...
267          */
268         [NL80211_PMSR_PEER_ATTR_CHAN] = { .type = NLA_NESTED },
269         [NL80211_PMSR_PEER_ATTR_REQ] =
270                 NLA_POLICY_NESTED(nl80211_pmsr_req_attr_policy),
271         [NL80211_PMSR_PEER_ATTR_RESP] = { .type = NLA_REJECT },
272 };
273
274 static const struct nla_policy
275 nl80211_pmsr_attr_policy[NL80211_PMSR_ATTR_MAX + 1] = {
276         [NL80211_PMSR_ATTR_MAX_PEERS] = { .type = NLA_REJECT },
277         [NL80211_PMSR_ATTR_REPORT_AP_TSF] = { .type = NLA_REJECT },
278         [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR] = { .type = NLA_REJECT },
279         [NL80211_PMSR_ATTR_TYPE_CAPA] = { .type = NLA_REJECT },
280         [NL80211_PMSR_ATTR_PEERS] =
281                 NLA_POLICY_NESTED_ARRAY(nl80211_psmr_peer_attr_policy),
282 };
283
284 const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
285         [NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
286         [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
287                                       .len = 20-1 },
288         [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED },
289
290         [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 },
291         [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 },
292         [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 },
293         [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 },
294         [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 },
295
296         [NL80211_ATTR_WIPHY_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1),
297         [NL80211_ATTR_WIPHY_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1),
298         [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 },
299         [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 },
300         [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 },
301         [NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG },
302
303         [NL80211_ATTR_IFTYPE] = NLA_POLICY_MAX(NLA_U32, NL80211_IFTYPE_MAX),
304         [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
305         [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
306
307         [NL80211_ATTR_MAC] = { .type = NLA_EXACT_LEN_WARN, .len = ETH_ALEN },
308         [NL80211_ATTR_PREV_BSSID] = {
309                 .type = NLA_EXACT_LEN_WARN,
310                 .len = ETH_ALEN
311         },
312
313         [NL80211_ATTR_KEY] = { .type = NLA_NESTED, },
314         [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
315                                     .len = WLAN_MAX_KEY_LEN },
316         [NL80211_ATTR_KEY_IDX] = NLA_POLICY_MAX(NLA_U8, 5),
317         [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 },
318         [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG },
319         [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
320         [NL80211_ATTR_KEY_TYPE] =
321                 NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES),
322
323         [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 },
324         [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 },
325         [NL80211_ATTR_BEACON_HEAD] = { .type = NLA_BINARY,
326                                        .len = IEEE80211_MAX_DATA_LEN },
327         [NL80211_ATTR_BEACON_TAIL] =
328                 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
329                                        IEEE80211_MAX_DATA_LEN),
330         [NL80211_ATTR_STA_AID] =
331                 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
332         [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED },
333         [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 },
334         [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY,
335                                                .len = NL80211_MAX_SUPP_RATES },
336         [NL80211_ATTR_STA_PLINK_ACTION] =
337                 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1),
338         [NL80211_ATTR_STA_TX_POWER_SETTING] =
339                 NLA_POLICY_RANGE(NLA_U8,
340                                  NL80211_TX_POWER_AUTOMATIC,
341                                  NL80211_TX_POWER_FIXED),
342         [NL80211_ATTR_STA_TX_POWER] = { .type = NLA_S16 },
343         [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 },
344         [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
345         [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
346                                    .len = IEEE80211_MAX_MESH_ID_LEN },
347         [NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 },
348
349         [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 },
350         [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
351
352         [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
353         [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
354         [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
355         [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY,
356                                            .len = NL80211_MAX_SUPP_RATES },
357         [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 },
358
359         [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED },
360         [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG },
361
362         [NL80211_ATTR_HT_CAPABILITY] = {
363                 .type = NLA_EXACT_LEN_WARN,
364                 .len = NL80211_HT_CAPABILITY_LEN
365         },
366
367         [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
368         [NL80211_ATTR_IE] = NLA_POLICY_VALIDATE_FN(NLA_BINARY,
369                                                    validate_ie_attr,
370                                                    IEEE80211_MAX_DATA_LEN),
371         [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
372         [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
373
374         [NL80211_ATTR_SSID] = { .type = NLA_BINARY,
375                                 .len = IEEE80211_MAX_SSID_LEN },
376         [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
377         [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
378         [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
379         [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
380         [NL80211_ATTR_USE_MFP] = NLA_POLICY_RANGE(NLA_U32,
381                                                   NL80211_MFP_NO,
382                                                   NL80211_MFP_OPTIONAL),
383         [NL80211_ATTR_STA_FLAGS2] = {
384                 .len = sizeof(struct nl80211_sta_flag_update),
385         },
386         [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
387         [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 },
388         [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG },
389         [NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG },
390         [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG },
391         [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 },
392         [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 },
393         [NL80211_ATTR_PID] = { .type = NLA_U32 },
394         [NL80211_ATTR_4ADDR] = { .type = NLA_U8 },
395         [NL80211_ATTR_PMKID] = {
396                 .type = NLA_EXACT_LEN_WARN,
397                 .len = WLAN_PMKID_LEN
398         },
399         [NL80211_ATTR_DURATION] = { .type = NLA_U32 },
400         [NL80211_ATTR_COOKIE] = { .type = NLA_U64 },
401         [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED },
402         [NL80211_ATTR_FRAME] = { .type = NLA_BINARY,
403                                  .len = IEEE80211_MAX_DATA_LEN },
404         [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, },
405         [NL80211_ATTR_PS_STATE] = NLA_POLICY_RANGE(NLA_U32,
406                                                    NL80211_PS_DISABLED,
407                                                    NL80211_PS_ENABLED),
408         [NL80211_ATTR_CQM] = { .type = NLA_NESTED, },
409         [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG },
410         [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 },
411         [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
412         [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
413         [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
414         [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 },
415         [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 },
416         [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 },
417         [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG },
418         [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
419         [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED },
420         [NL80211_ATTR_STA_PLINK_STATE] =
421                 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1),
422         [NL80211_ATTR_MESH_PEER_AID] =
423                 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
424         [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 },
425         [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED },
426         [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED },
427         [NL80211_ATTR_HIDDEN_SSID] =
428                 NLA_POLICY_RANGE(NLA_U32,
429                                  NL80211_HIDDEN_SSID_NOT_IN_USE,
430                                  NL80211_HIDDEN_SSID_ZERO_CONTENTS),
431         [NL80211_ATTR_IE_PROBE_RESP] =
432                 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
433                                        IEEE80211_MAX_DATA_LEN),
434         [NL80211_ATTR_IE_ASSOC_RESP] =
435                 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
436                                        IEEE80211_MAX_DATA_LEN),
437         [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG },
438         [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED },
439         [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG },
440         [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 },
441         [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 },
442         [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 },
443         [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG },
444         [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG },
445         [NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG },
446         [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
447         [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
448                                       .len = IEEE80211_MAX_DATA_LEN },
449         [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 },
450         [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG },
451         [NL80211_ATTR_HT_CAPABILITY_MASK] = {
452                 .len = NL80211_HT_CAPABILITY_LEN
453         },
454         [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 },
455         [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 },
456         [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 },
457         [NL80211_ATTR_WDEV] = { .type = NLA_U64 },
458         [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 },
459         [NL80211_ATTR_AUTH_DATA] = { .type = NLA_BINARY, },
460         [NL80211_ATTR_VHT_CAPABILITY] = {
461                 .type = NLA_EXACT_LEN_WARN,
462                 .len = NL80211_VHT_CAPABILITY_LEN
463         },
464         [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
465         [NL80211_ATTR_P2P_CTWINDOW] = NLA_POLICY_MAX(NLA_U8, 127),
466         [NL80211_ATTR_P2P_OPPPS] = NLA_POLICY_MAX(NLA_U8, 1),
467         [NL80211_ATTR_LOCAL_MESH_POWER_MODE] =
468                 NLA_POLICY_RANGE(NLA_U32,
469                                  NL80211_MESH_POWER_UNKNOWN + 1,
470                                  NL80211_MESH_POWER_MAX),
471         [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 },
472         [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
473         [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
474         [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, },
475         [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, },
476         [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG },
477         [NL80211_ATTR_VHT_CAPABILITY_MASK] = {
478                 .len = NL80211_VHT_CAPABILITY_LEN,
479         },
480         [NL80211_ATTR_MDID] = { .type = NLA_U16 },
481         [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
482                                   .len = IEEE80211_MAX_DATA_LEN },
483         [NL80211_ATTR_PEER_AID] =
484                 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
485         [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 },
486         [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG },
487         [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
488         [NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_BINARY },
489         [NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_BINARY },
490         [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY },
491         [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY },
492         [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG },
493         [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 },
494         [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 },
495         [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 },
496         [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
497         [NL80211_ATTR_QOS_MAP] = { .type = NLA_BINARY,
498                                    .len = IEEE80211_QOS_MAP_LEN_MAX },
499         [NL80211_ATTR_MAC_HINT] = {
500                 .type = NLA_EXACT_LEN_WARN,
501                 .len = ETH_ALEN
502         },
503         [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 },
504         [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 },
505         [NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG },
506         [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY },
507         [NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG },
508         [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1),
509         [NL80211_ATTR_USER_PRIO] =
510                 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1),
511         [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 },
512         [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 },
513         [NL80211_ATTR_MAC_MASK] = {
514                 .type = NLA_EXACT_LEN_WARN,
515                 .len = ETH_ALEN
516         },
517         [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG },
518         [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 },
519         [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 },
520         [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG },
521         [NL80211_ATTR_PBSS] = { .type = NLA_FLAG },
522         [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED },
523         [NL80211_ATTR_STA_SUPPORT_P2P_PS] =
524                 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1),
525         [NL80211_ATTR_MU_MIMO_GROUP_DATA] = {
526                 .len = VHT_MUMIMO_GROUPS_DATA_LEN
527         },
528         [NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = {
529                 .type = NLA_EXACT_LEN_WARN,
530                 .len = ETH_ALEN
531         },
532         [NL80211_ATTR_NAN_MASTER_PREF] = NLA_POLICY_MIN(NLA_U8, 1),
533         [NL80211_ATTR_BANDS] = { .type = NLA_U32 },
534         [NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED },
535         [NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY,
536                                     .len = FILS_MAX_KEK_LEN },
537         [NL80211_ATTR_FILS_NONCES] = {
538                 .type = NLA_EXACT_LEN_WARN,
539                 .len = 2 * FILS_NONCE_LEN
540         },
541         [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, },
542         [NL80211_ATTR_BSSID] = { .type = NLA_EXACT_LEN_WARN, .len = ETH_ALEN },
543         [NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 },
544         [NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = {
545                 .len = sizeof(struct nl80211_bss_select_rssi_adjust)
546         },
547         [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 },
548         [NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY,
549                                              .len = FILS_ERP_MAX_USERNAME_LEN },
550         [NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY,
551                                           .len = FILS_ERP_MAX_REALM_LEN },
552         [NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 },
553         [NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY,
554                                         .len = FILS_ERP_MAX_RRK_LEN },
555         [NL80211_ATTR_FILS_CACHE_ID] = { .type = NLA_EXACT_LEN_WARN, .len = 2 },
556         [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN },
557         [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG },
558         [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG },
559
560         [NL80211_ATTR_TXQ_LIMIT] = { .type = NLA_U32 },
561         [NL80211_ATTR_TXQ_MEMORY_LIMIT] = { .type = NLA_U32 },
562         [NL80211_ATTR_TXQ_QUANTUM] = { .type = NLA_U32 },
563         [NL80211_ATTR_HE_CAPABILITY] = { .type = NLA_BINARY,
564                                          .len = NL80211_HE_MAX_CAPABILITY_LEN },
565
566         [NL80211_ATTR_FTM_RESPONDER] = {
567                 .type = NLA_NESTED,
568                 .validation_data = nl80211_ftm_responder_policy,
569         },
570         [NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1),
571         [NL80211_ATTR_PEER_MEASUREMENTS] =
572                 NLA_POLICY_NESTED(nl80211_pmsr_attr_policy),
573         [NL80211_ATTR_AIRTIME_WEIGHT] = NLA_POLICY_MIN(NLA_U16, 1),
574         [NL80211_ATTR_SAE_PASSWORD] = { .type = NLA_BINARY,
575                                         .len = SAE_PASSWORD_MAX_LEN },
576         [NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG },
577 };
578
579 /* policy for the key attributes */
580 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
581         [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
582         [NL80211_KEY_IDX] = { .type = NLA_U8 },
583         [NL80211_KEY_CIPHER] = { .type = NLA_U32 },
584         [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
585         [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG },
586         [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG },
587         [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
588         [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
589         [NL80211_KEY_MODE] = NLA_POLICY_RANGE(NLA_U8, 0, NL80211_KEY_SET_TX),
590 };
591
592 /* policy for the key default flags */
593 static const struct nla_policy
594 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = {
595         [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG },
596         [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG },
597 };
598
599 #ifdef CONFIG_PM
600 /* policy for WoWLAN attributes */
601 static const struct nla_policy
602 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = {
603         [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG },
604         [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG },
605         [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG },
606         [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED },
607         [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG },
608         [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG },
609         [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG },
610         [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG },
611         [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED },
612         [NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED },
613 };
614
615 static const struct nla_policy
616 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = {
617         [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 },
618         [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 },
619         [NL80211_WOWLAN_TCP_DST_MAC] = {
620                 .type = NLA_EXACT_LEN_WARN,
621                 .len = ETH_ALEN
622         },
623         [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 },
624         [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 },
625         [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = { .type = NLA_MIN_LEN, .len = 1 },
626         [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = {
627                 .len = sizeof(struct nl80211_wowlan_tcp_data_seq)
628         },
629         [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = {
630                 .len = sizeof(struct nl80211_wowlan_tcp_data_token)
631         },
632         [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 },
633         [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = { .type = NLA_MIN_LEN, .len = 1 },
634         [NL80211_WOWLAN_TCP_WAKE_MASK] = { .type = NLA_MIN_LEN, .len = 1 },
635 };
636 #endif /* CONFIG_PM */
637
638 /* policy for coalesce rule attributes */
639 static const struct nla_policy
640 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = {
641         [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 },
642         [NL80211_ATTR_COALESCE_RULE_CONDITION] =
643                 NLA_POLICY_RANGE(NLA_U32,
644                                  NL80211_COALESCE_CONDITION_MATCH,
645                                  NL80211_COALESCE_CONDITION_NO_MATCH),
646         [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED },
647 };
648
649 /* policy for GTK rekey offload attributes */
650 static const struct nla_policy
651 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
652         [NL80211_REKEY_DATA_KEK] = {
653                 .type = NLA_EXACT_LEN_WARN,
654                 .len = NL80211_KEK_LEN,
655         },
656         [NL80211_REKEY_DATA_KCK] = {
657                 .type = NLA_EXACT_LEN_WARN,
658                 .len = NL80211_KCK_LEN,
659         },
660         [NL80211_REKEY_DATA_REPLAY_CTR] = {
661                 .type = NLA_EXACT_LEN_WARN,
662                 .len = NL80211_REPLAY_CTR_LEN
663         },
664 };
665
666 static const struct nla_policy
667 nl80211_match_band_rssi_policy[NUM_NL80211_BANDS] = {
668         [NL80211_BAND_2GHZ] = { .type = NLA_S32 },
669         [NL80211_BAND_5GHZ] = { .type = NLA_S32 },
670         [NL80211_BAND_60GHZ] = { .type = NLA_S32 },
671 };
672
673 static const struct nla_policy
674 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = {
675         [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY,
676                                                  .len = IEEE80211_MAX_SSID_LEN },
677         [NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = {
678                 .type = NLA_EXACT_LEN_WARN,
679                 .len = ETH_ALEN
680         },
681         [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 },
682         [NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI] =
683                 NLA_POLICY_NESTED(nl80211_match_band_rssi_policy),
684 };
685
686 static const struct nla_policy
687 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = {
688         [NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 },
689         [NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 },
690 };
691
692 static const struct nla_policy
693 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = {
694         [NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG },
695         [NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 },
696         [NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = {
697                 .len = sizeof(struct nl80211_bss_select_rssi_adjust)
698         },
699 };
700
701 /* policy for NAN function attributes */
702 static const struct nla_policy
703 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = {
704         [NL80211_NAN_FUNC_TYPE] = { .type = NLA_U8 },
705         [NL80211_NAN_FUNC_SERVICE_ID] = {
706                                     .len = NL80211_NAN_FUNC_SERVICE_ID_LEN },
707         [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 },
708         [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG },
709         [NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG },
710         [NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 },
711         [NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 },
712         [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = {
713                 .type = NLA_EXACT_LEN_WARN,
714                 .len = ETH_ALEN
715         },
716         [NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG },
717         [NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 },
718         [NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY,
719                         .len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN },
720         [NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED },
721         [NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED },
722         [NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED },
723         [NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 },
724         [NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 },
725 };
726
727 /* policy for Service Response Filter attributes */
728 static const struct nla_policy
729 nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = {
730         [NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG },
731         [NL80211_NAN_SRF_BF] = { .type = NLA_BINARY,
732                                  .len =  NL80211_NAN_FUNC_SRF_MAX_LEN },
733         [NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 },
734         [NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED },
735 };
736
737 /* policy for packet pattern attributes */
738 static const struct nla_policy
739 nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = {
740         [NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, },
741         [NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, },
742         [NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 },
743 };
744
745 int nl80211_prepare_wdev_dump(struct netlink_callback *cb,
746                               struct cfg80211_registered_device **rdev,
747                               struct wireless_dev **wdev)
748 {
749         int err;
750
751         if (!cb->args[0]) {
752                 err = nlmsg_parse_deprecated(cb->nlh,
753                                              GENL_HDRLEN + nl80211_fam.hdrsize,
754                                              genl_family_attrbuf(&nl80211_fam),
755                                              nl80211_fam.maxattr,
756                                              nl80211_policy, NULL);
757                 if (err)
758                         return err;
759
760                 *wdev = __cfg80211_wdev_from_attrs(
761                                         sock_net(cb->skb->sk),
762                                         genl_family_attrbuf(&nl80211_fam));
763                 if (IS_ERR(*wdev))
764                         return PTR_ERR(*wdev);
765                 *rdev = wiphy_to_rdev((*wdev)->wiphy);
766                 /* 0 is the first index - add 1 to parse only once */
767                 cb->args[0] = (*rdev)->wiphy_idx + 1;
768                 cb->args[1] = (*wdev)->identifier;
769         } else {
770                 /* subtract the 1 again here */
771                 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
772                 struct wireless_dev *tmp;
773
774                 if (!wiphy)
775                         return -ENODEV;
776                 *rdev = wiphy_to_rdev(wiphy);
777                 *wdev = NULL;
778
779                 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) {
780                         if (tmp->identifier == cb->args[1]) {
781                                 *wdev = tmp;
782                                 break;
783                         }
784                 }
785
786                 if (!*wdev)
787                         return -ENODEV;
788         }
789
790         return 0;
791 }
792
793 /* message building helper */
794 void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
795                      int flags, u8 cmd)
796 {
797         /* since there is no private header just add the generic one */
798         return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd);
799 }
800
801 static int nl80211_msg_put_wmm_rules(struct sk_buff *msg,
802                                      const struct ieee80211_reg_rule *rule)
803 {
804         int j;
805         struct nlattr *nl_wmm_rules =
806                 nla_nest_start_noflag(msg, NL80211_FREQUENCY_ATTR_WMM);
807
808         if (!nl_wmm_rules)
809                 goto nla_put_failure;
810
811         for (j = 0; j < IEEE80211_NUM_ACS; j++) {
812                 struct nlattr *nl_wmm_rule = nla_nest_start_noflag(msg, j);
813
814                 if (!nl_wmm_rule)
815                         goto nla_put_failure;
816
817                 if (nla_put_u16(msg, NL80211_WMMR_CW_MIN,
818                                 rule->wmm_rule.client[j].cw_min) ||
819                     nla_put_u16(msg, NL80211_WMMR_CW_MAX,
820                                 rule->wmm_rule.client[j].cw_max) ||
821                     nla_put_u8(msg, NL80211_WMMR_AIFSN,
822                                rule->wmm_rule.client[j].aifsn) ||
823                     nla_put_u16(msg, NL80211_WMMR_TXOP,
824                                 rule->wmm_rule.client[j].cot))
825                         goto nla_put_failure;
826
827                 nla_nest_end(msg, nl_wmm_rule);
828         }
829         nla_nest_end(msg, nl_wmm_rules);
830
831         return 0;
832
833 nla_put_failure:
834         return -ENOBUFS;
835 }
836
837 static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy,
838                                    struct ieee80211_channel *chan,
839                                    bool large)
840 {
841         /* Some channels must be completely excluded from the
842          * list to protect old user-space tools from breaking
843          */
844         if (!large && chan->flags &
845             (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ))
846                 return 0;
847
848         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ,
849                         chan->center_freq))
850                 goto nla_put_failure;
851
852         if ((chan->flags & IEEE80211_CHAN_DISABLED) &&
853             nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED))
854                 goto nla_put_failure;
855         if (chan->flags & IEEE80211_CHAN_NO_IR) {
856                 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR))
857                         goto nla_put_failure;
858                 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS))
859                         goto nla_put_failure;
860         }
861         if (chan->flags & IEEE80211_CHAN_RADAR) {
862                 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
863                         goto nla_put_failure;
864                 if (large) {
865                         u32 time;
866
867                         time = elapsed_jiffies_msecs(chan->dfs_state_entered);
868
869                         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE,
870                                         chan->dfs_state))
871                                 goto nla_put_failure;
872                         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME,
873                                         time))
874                                 goto nla_put_failure;
875                         if (nla_put_u32(msg,
876                                         NL80211_FREQUENCY_ATTR_DFS_CAC_TIME,
877                                         chan->dfs_cac_ms))
878                                 goto nla_put_failure;
879                 }
880         }
881
882         if (large) {
883                 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
884                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
885                         goto nla_put_failure;
886                 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) &&
887                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS))
888                         goto nla_put_failure;
889                 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) &&
890                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ))
891                         goto nla_put_failure;
892                 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) &&
893                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ))
894                         goto nla_put_failure;
895                 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) &&
896                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY))
897                         goto nla_put_failure;
898                 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) &&
899                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT))
900                         goto nla_put_failure;
901                 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) &&
902                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ))
903                         goto nla_put_failure;
904                 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) &&
905                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ))
906                         goto nla_put_failure;
907         }
908
909         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
910                         DBM_TO_MBM(chan->max_power)))
911                 goto nla_put_failure;
912
913         if (large) {
914                 const struct ieee80211_reg_rule *rule =
915                         freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq));
916
917                 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) {
918                         if (nl80211_msg_put_wmm_rules(msg, rule))
919                                 goto nla_put_failure;
920                 }
921         }
922
923         return 0;
924
925  nla_put_failure:
926         return -ENOBUFS;
927 }
928
929 static bool nl80211_put_txq_stats(struct sk_buff *msg,
930                                   struct cfg80211_txq_stats *txqstats,
931                                   int attrtype)
932 {
933         struct nlattr *txqattr;
934
935 #define PUT_TXQVAL_U32(attr, memb) do {                                   \
936         if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) &&         \
937             nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \
938                 return false;                                             \
939         } while (0)
940
941         txqattr = nla_nest_start_noflag(msg, attrtype);
942         if (!txqattr)
943                 return false;
944
945         PUT_TXQVAL_U32(BACKLOG_BYTES, backlog_bytes);
946         PUT_TXQVAL_U32(BACKLOG_PACKETS, backlog_packets);
947         PUT_TXQVAL_U32(FLOWS, flows);
948         PUT_TXQVAL_U32(DROPS, drops);
949         PUT_TXQVAL_U32(ECN_MARKS, ecn_marks);
950         PUT_TXQVAL_U32(OVERLIMIT, overlimit);
951         PUT_TXQVAL_U32(OVERMEMORY, overmemory);
952         PUT_TXQVAL_U32(COLLISIONS, collisions);
953         PUT_TXQVAL_U32(TX_BYTES, tx_bytes);
954         PUT_TXQVAL_U32(TX_PACKETS, tx_packets);
955         PUT_TXQVAL_U32(MAX_FLOWS, max_flows);
956         nla_nest_end(msg, txqattr);
957
958 #undef PUT_TXQVAL_U32
959         return true;
960 }
961
962 /* netlink command implementations */
963
964 struct key_parse {
965         struct key_params p;
966         int idx;
967         int type;
968         bool def, defmgmt;
969         bool def_uni, def_multi;
970 };
971
972 static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key,
973                                  struct key_parse *k)
974 {
975         struct nlattr *tb[NL80211_KEY_MAX + 1];
976         int err = nla_parse_nested_deprecated(tb, NL80211_KEY_MAX, key,
977                                               nl80211_key_policy,
978                                               info->extack);
979         if (err)
980                 return err;
981
982         k->def = !!tb[NL80211_KEY_DEFAULT];
983         k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT];
984
985         if (k->def) {
986                 k->def_uni = true;
987                 k->def_multi = true;
988         }
989         if (k->defmgmt)
990                 k->def_multi = true;
991
992         if (tb[NL80211_KEY_IDX])
993                 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]);
994
995         if (tb[NL80211_KEY_DATA]) {
996                 k->p.key = nla_data(tb[NL80211_KEY_DATA]);
997                 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]);
998         }
999
1000         if (tb[NL80211_KEY_SEQ]) {
1001                 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]);
1002                 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]);
1003         }
1004
1005         if (tb[NL80211_KEY_CIPHER])
1006                 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]);
1007
1008         if (tb[NL80211_KEY_TYPE])
1009                 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]);
1010
1011         if (tb[NL80211_KEY_DEFAULT_TYPES]) {
1012                 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
1013
1014                 err = nla_parse_nested_deprecated(kdt,
1015                                                   NUM_NL80211_KEY_DEFAULT_TYPES - 1,
1016                                                   tb[NL80211_KEY_DEFAULT_TYPES],
1017                                                   nl80211_key_default_policy,
1018                                                   info->extack);
1019                 if (err)
1020                         return err;
1021
1022                 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
1023                 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
1024         }
1025
1026         if (tb[NL80211_KEY_MODE])
1027                 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]);
1028
1029         return 0;
1030 }
1031
1032 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
1033 {
1034         if (info->attrs[NL80211_ATTR_KEY_DATA]) {
1035                 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
1036                 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
1037         }
1038
1039         if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
1040                 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
1041                 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
1042         }
1043
1044         if (info->attrs[NL80211_ATTR_KEY_IDX])
1045                 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
1046
1047         if (info->attrs[NL80211_ATTR_KEY_CIPHER])
1048                 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
1049
1050         k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
1051         k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
1052
1053         if (k->def) {
1054                 k->def_uni = true;
1055                 k->def_multi = true;
1056         }
1057         if (k->defmgmt)
1058                 k->def_multi = true;
1059
1060         if (info->attrs[NL80211_ATTR_KEY_TYPE])
1061                 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
1062
1063         if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
1064                 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
1065                 int err = nla_parse_nested_deprecated(kdt,
1066                                                       NUM_NL80211_KEY_DEFAULT_TYPES - 1,
1067                                                       info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
1068                                                       nl80211_key_default_policy,
1069                                                       info->extack);
1070                 if (err)
1071                         return err;
1072
1073                 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
1074                 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
1075         }
1076
1077         return 0;
1078 }
1079
1080 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
1081 {
1082         int err;
1083
1084         memset(k, 0, sizeof(*k));
1085         k->idx = -1;
1086         k->type = -1;
1087
1088         if (info->attrs[NL80211_ATTR_KEY])
1089                 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k);
1090         else
1091                 err = nl80211_parse_key_old(info, k);
1092
1093         if (err)
1094                 return err;
1095
1096         if (k->def && k->defmgmt) {
1097                 GENL_SET_ERR_MSG(info, "key with def && defmgmt is invalid");
1098                 return -EINVAL;
1099         }
1100
1101         if (k->defmgmt) {
1102                 if (k->def_uni || !k->def_multi) {
1103                         GENL_SET_ERR_MSG(info, "defmgmt key must be mcast");
1104                         return -EINVAL;
1105                 }
1106         }
1107
1108         if (k->idx != -1) {
1109                 if (k->defmgmt) {
1110                         if (k->idx < 4 || k->idx > 5) {
1111                                 GENL_SET_ERR_MSG(info,
1112                                                  "defmgmt key idx not 4 or 5");
1113                                 return -EINVAL;
1114                         }
1115                 } else if (k->def) {
1116                         if (k->idx < 0 || k->idx > 3) {
1117                                 GENL_SET_ERR_MSG(info, "def key idx not 0-3");
1118                                 return -EINVAL;
1119                         }
1120                 } else {
1121                         if (k->idx < 0 || k->idx > 5) {
1122                                 GENL_SET_ERR_MSG(info, "key idx not 0-5");
1123                                 return -EINVAL;
1124                         }
1125                 }
1126         }
1127
1128         return 0;
1129 }
1130
1131 static struct cfg80211_cached_keys *
1132 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
1133                        struct genl_info *info, bool *no_ht)
1134 {
1135         struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS];
1136         struct key_parse parse;
1137         struct nlattr *key;
1138         struct cfg80211_cached_keys *result;
1139         int rem, err, def = 0;
1140         bool have_key = false;
1141
1142         nla_for_each_nested(key, keys, rem) {
1143                 have_key = true;
1144                 break;
1145         }
1146
1147         if (!have_key)
1148                 return NULL;
1149
1150         result = kzalloc(sizeof(*result), GFP_KERNEL);
1151         if (!result)
1152                 return ERR_PTR(-ENOMEM);
1153
1154         result->def = -1;
1155
1156         nla_for_each_nested(key, keys, rem) {
1157                 memset(&parse, 0, sizeof(parse));
1158                 parse.idx = -1;
1159
1160                 err = nl80211_parse_key_new(info, key, &parse);
1161                 if (err)
1162                         goto error;
1163                 err = -EINVAL;
1164                 if (!parse.p.key)
1165                         goto error;
1166                 if (parse.idx < 0 || parse.idx > 3) {
1167                         GENL_SET_ERR_MSG(info, "key index out of range [0-3]");
1168                         goto error;
1169                 }
1170                 if (parse.def) {
1171                         if (def) {
1172                                 GENL_SET_ERR_MSG(info,
1173                                                  "only one key can be default");
1174                                 goto error;
1175                         }
1176                         def = 1;
1177                         result->def = parse.idx;
1178                         if (!parse.def_uni || !parse.def_multi)
1179                                 goto error;
1180                 } else if (parse.defmgmt)
1181                         goto error;
1182                 err = cfg80211_validate_key_settings(rdev, &parse.p,
1183                                                      parse.idx, false, NULL);
1184                 if (err)
1185                         goto error;
1186                 if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 &&
1187                     parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) {
1188                         GENL_SET_ERR_MSG(info, "connect key must be WEP");
1189                         err = -EINVAL;
1190                         goto error;
1191                 }
1192                 result->params[parse.idx].cipher = parse.p.cipher;
1193                 result->params[parse.idx].key_len = parse.p.key_len;
1194                 result->params[parse.idx].key = result->data[parse.idx];
1195                 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len);
1196
1197                 /* must be WEP key if we got here */
1198                 if (no_ht)
1199                         *no_ht = true;
1200         }
1201
1202         if (result->def < 0) {
1203                 err = -EINVAL;
1204                 GENL_SET_ERR_MSG(info, "need a default/TX key");
1205                 goto error;
1206         }
1207
1208         return result;
1209  error:
1210         kfree(result);
1211         return ERR_PTR(err);
1212 }
1213
1214 static int nl80211_key_allowed(struct wireless_dev *wdev)
1215 {
1216         ASSERT_WDEV_LOCK(wdev);
1217
1218         switch (wdev->iftype) {
1219         case NL80211_IFTYPE_AP:
1220         case NL80211_IFTYPE_AP_VLAN:
1221         case NL80211_IFTYPE_P2P_GO:
1222         case NL80211_IFTYPE_MESH_POINT:
1223                 break;
1224         case NL80211_IFTYPE_ADHOC:
1225         case NL80211_IFTYPE_STATION:
1226         case NL80211_IFTYPE_P2P_CLIENT:
1227                 if (!wdev->current_bss)
1228                         return -ENOLINK;
1229                 break;
1230         case NL80211_IFTYPE_UNSPECIFIED:
1231         case NL80211_IFTYPE_OCB:
1232         case NL80211_IFTYPE_MONITOR:
1233         case NL80211_IFTYPE_NAN:
1234         case NL80211_IFTYPE_P2P_DEVICE:
1235         case NL80211_IFTYPE_WDS:
1236         case NUM_NL80211_IFTYPES:
1237                 return -EINVAL;
1238         }
1239
1240         return 0;
1241 }
1242
1243 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy,
1244                                                         struct nlattr *tb)
1245 {
1246         struct ieee80211_channel *chan;
1247
1248         if (tb == NULL)
1249                 return NULL;
1250         chan = ieee80211_get_channel(wiphy, nla_get_u32(tb));
1251         if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
1252                 return NULL;
1253         return chan;
1254 }
1255
1256 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
1257 {
1258         struct nlattr *nl_modes = nla_nest_start_noflag(msg, attr);
1259         int i;
1260
1261         if (!nl_modes)
1262                 goto nla_put_failure;
1263
1264         i = 0;
1265         while (ifmodes) {
1266                 if ((ifmodes & 1) && nla_put_flag(msg, i))
1267                         goto nla_put_failure;
1268                 ifmodes >>= 1;
1269                 i++;
1270         }
1271
1272         nla_nest_end(msg, nl_modes);
1273         return 0;
1274
1275 nla_put_failure:
1276         return -ENOBUFS;
1277 }
1278
1279 static int nl80211_put_iface_combinations(struct wiphy *wiphy,
1280                                           struct sk_buff *msg,
1281                                           bool large)
1282 {
1283         struct nlattr *nl_combis;
1284         int i, j;
1285
1286         nl_combis = nla_nest_start_noflag(msg,
1287                                           NL80211_ATTR_INTERFACE_COMBINATIONS);
1288         if (!nl_combis)
1289                 goto nla_put_failure;
1290
1291         for (i = 0; i < wiphy->n_iface_combinations; i++) {
1292                 const struct ieee80211_iface_combination *c;
1293                 struct nlattr *nl_combi, *nl_limits;
1294
1295                 c = &wiphy->iface_combinations[i];
1296
1297                 nl_combi = nla_nest_start_noflag(msg, i + 1);
1298                 if (!nl_combi)
1299                         goto nla_put_failure;
1300
1301                 nl_limits = nla_nest_start_noflag(msg,
1302                                                   NL80211_IFACE_COMB_LIMITS);
1303                 if (!nl_limits)
1304                         goto nla_put_failure;
1305
1306                 for (j = 0; j < c->n_limits; j++) {
1307                         struct nlattr *nl_limit;
1308
1309                         nl_limit = nla_nest_start_noflag(msg, j + 1);
1310                         if (!nl_limit)
1311                                 goto nla_put_failure;
1312                         if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX,
1313                                         c->limits[j].max))
1314                                 goto nla_put_failure;
1315                         if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
1316                                                 c->limits[j].types))
1317                                 goto nla_put_failure;
1318                         nla_nest_end(msg, nl_limit);
1319                 }
1320
1321                 nla_nest_end(msg, nl_limits);
1322
1323                 if (c->beacon_int_infra_match &&
1324                     nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
1325                         goto nla_put_failure;
1326                 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
1327                                 c->num_different_channels) ||
1328                     nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
1329                                 c->max_interfaces))
1330                         goto nla_put_failure;
1331                 if (large &&
1332                     (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
1333                                 c->radar_detect_widths) ||
1334                      nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
1335                                 c->radar_detect_regions)))
1336                         goto nla_put_failure;
1337                 if (c->beacon_int_min_gcd &&
1338                     nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD,
1339                                 c->beacon_int_min_gcd))
1340                         goto nla_put_failure;
1341
1342                 nla_nest_end(msg, nl_combi);
1343         }
1344
1345         nla_nest_end(msg, nl_combis);
1346
1347         return 0;
1348 nla_put_failure:
1349         return -ENOBUFS;
1350 }
1351
1352 #ifdef CONFIG_PM
1353 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev,
1354                                         struct sk_buff *msg)
1355 {
1356         const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp;
1357         struct nlattr *nl_tcp;
1358
1359         if (!tcp)
1360                 return 0;
1361
1362         nl_tcp = nla_nest_start_noflag(msg,
1363                                        NL80211_WOWLAN_TRIG_TCP_CONNECTION);
1364         if (!nl_tcp)
1365                 return -ENOBUFS;
1366
1367         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
1368                         tcp->data_payload_max))
1369                 return -ENOBUFS;
1370
1371         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
1372                         tcp->data_payload_max))
1373                 return -ENOBUFS;
1374
1375         if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ))
1376                 return -ENOBUFS;
1377
1378         if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
1379                                 sizeof(*tcp->tok), tcp->tok))
1380                 return -ENOBUFS;
1381
1382         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
1383                         tcp->data_interval_max))
1384                 return -ENOBUFS;
1385
1386         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
1387                         tcp->wake_payload_max))
1388                 return -ENOBUFS;
1389
1390         nla_nest_end(msg, nl_tcp);
1391         return 0;
1392 }
1393
1394 static int nl80211_send_wowlan(struct sk_buff *msg,
1395                                struct cfg80211_registered_device *rdev,
1396                                bool large)
1397 {
1398         struct nlattr *nl_wowlan;
1399
1400         if (!rdev->wiphy.wowlan)
1401                 return 0;
1402
1403         nl_wowlan = nla_nest_start_noflag(msg,
1404                                           NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED);
1405         if (!nl_wowlan)
1406                 return -ENOBUFS;
1407
1408         if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) &&
1409              nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
1410             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) &&
1411              nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
1412             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) &&
1413              nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
1414             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) &&
1415              nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) ||
1416             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
1417              nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
1418             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) &&
1419              nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
1420             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) &&
1421              nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
1422             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) &&
1423              nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
1424                 return -ENOBUFS;
1425
1426         if (rdev->wiphy.wowlan->n_patterns) {
1427                 struct nl80211_pattern_support pat = {
1428                         .max_patterns = rdev->wiphy.wowlan->n_patterns,
1429                         .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len,
1430                         .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len,
1431                         .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset,
1432                 };
1433
1434                 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
1435                             sizeof(pat), &pat))
1436                         return -ENOBUFS;
1437         }
1438
1439         if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) &&
1440             nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT,
1441                         rdev->wiphy.wowlan->max_nd_match_sets))
1442                 return -ENOBUFS;
1443
1444         if (large && nl80211_send_wowlan_tcp_caps(rdev, msg))
1445                 return -ENOBUFS;
1446
1447         nla_nest_end(msg, nl_wowlan);
1448
1449         return 0;
1450 }
1451 #endif
1452
1453 static int nl80211_send_coalesce(struct sk_buff *msg,
1454                                  struct cfg80211_registered_device *rdev)
1455 {
1456         struct nl80211_coalesce_rule_support rule;
1457
1458         if (!rdev->wiphy.coalesce)
1459                 return 0;
1460
1461         rule.max_rules = rdev->wiphy.coalesce->n_rules;
1462         rule.max_delay = rdev->wiphy.coalesce->max_delay;
1463         rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns;
1464         rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len;
1465         rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len;
1466         rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset;
1467
1468         if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule))
1469                 return -ENOBUFS;
1470
1471         return 0;
1472 }
1473
1474 static int
1475 nl80211_send_iftype_data(struct sk_buff *msg,
1476                          const struct ieee80211_sband_iftype_data *iftdata)
1477 {
1478         const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap;
1479
1480         if (nl80211_put_iftypes(msg, NL80211_BAND_IFTYPE_ATTR_IFTYPES,
1481                                 iftdata->types_mask))
1482                 return -ENOBUFS;
1483
1484         if (he_cap->has_he) {
1485                 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC,
1486                             sizeof(he_cap->he_cap_elem.mac_cap_info),
1487                             he_cap->he_cap_elem.mac_cap_info) ||
1488                     nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY,
1489                             sizeof(he_cap->he_cap_elem.phy_cap_info),
1490                             he_cap->he_cap_elem.phy_cap_info) ||
1491                     nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET,
1492                             sizeof(he_cap->he_mcs_nss_supp),
1493                             &he_cap->he_mcs_nss_supp) ||
1494                     nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE,
1495                             sizeof(he_cap->ppe_thres), he_cap->ppe_thres))
1496                         return -ENOBUFS;
1497         }
1498
1499         return 0;
1500 }
1501
1502 static int nl80211_send_band_rateinfo(struct sk_buff *msg,
1503                                       struct ieee80211_supported_band *sband)
1504 {
1505         struct nlattr *nl_rates, *nl_rate;
1506         struct ieee80211_rate *rate;
1507         int i;
1508
1509         /* add HT info */
1510         if (sband->ht_cap.ht_supported &&
1511             (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET,
1512                      sizeof(sband->ht_cap.mcs),
1513                      &sband->ht_cap.mcs) ||
1514              nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA,
1515                          sband->ht_cap.cap) ||
1516              nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
1517                         sband->ht_cap.ampdu_factor) ||
1518              nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
1519                         sband->ht_cap.ampdu_density)))
1520                 return -ENOBUFS;
1521
1522         /* add VHT info */
1523         if (sband->vht_cap.vht_supported &&
1524             (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET,
1525                      sizeof(sband->vht_cap.vht_mcs),
1526                      &sband->vht_cap.vht_mcs) ||
1527              nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA,
1528                          sband->vht_cap.cap)))
1529                 return -ENOBUFS;
1530
1531         if (sband->n_iftype_data) {
1532                 struct nlattr *nl_iftype_data =
1533                         nla_nest_start_noflag(msg,
1534                                               NL80211_BAND_ATTR_IFTYPE_DATA);
1535                 int err;
1536
1537                 if (!nl_iftype_data)
1538                         return -ENOBUFS;
1539
1540                 for (i = 0; i < sband->n_iftype_data; i++) {
1541                         struct nlattr *iftdata;
1542
1543                         iftdata = nla_nest_start_noflag(msg, i + 1);
1544                         if (!iftdata)
1545                                 return -ENOBUFS;
1546
1547                         err = nl80211_send_iftype_data(msg,
1548                                                        &sband->iftype_data[i]);
1549                         if (err)
1550                                 return err;
1551
1552                         nla_nest_end(msg, iftdata);
1553                 }
1554
1555                 nla_nest_end(msg, nl_iftype_data);
1556         }
1557
1558         /* add bitrates */
1559         nl_rates = nla_nest_start_noflag(msg, NL80211_BAND_ATTR_RATES);
1560         if (!nl_rates)
1561                 return -ENOBUFS;
1562
1563         for (i = 0; i < sband->n_bitrates; i++) {
1564                 nl_rate = nla_nest_start_noflag(msg, i);
1565                 if (!nl_rate)
1566                         return -ENOBUFS;
1567
1568                 rate = &sband->bitrates[i];
1569                 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE,
1570                                 rate->bitrate))
1571                         return -ENOBUFS;
1572                 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) &&
1573                     nla_put_flag(msg,
1574                                  NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE))
1575                         return -ENOBUFS;
1576
1577                 nla_nest_end(msg, nl_rate);
1578         }
1579
1580         nla_nest_end(msg, nl_rates);
1581
1582         return 0;
1583 }
1584
1585 static int
1586 nl80211_send_mgmt_stypes(struct sk_buff *msg,
1587                          const struct ieee80211_txrx_stypes *mgmt_stypes)
1588 {
1589         u16 stypes;
1590         struct nlattr *nl_ftypes, *nl_ifs;
1591         enum nl80211_iftype ift;
1592         int i;
1593
1594         if (!mgmt_stypes)
1595                 return 0;
1596
1597         nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_TX_FRAME_TYPES);
1598         if (!nl_ifs)
1599                 return -ENOBUFS;
1600
1601         for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1602                 nl_ftypes = nla_nest_start_noflag(msg, ift);
1603                 if (!nl_ftypes)
1604                         return -ENOBUFS;
1605                 i = 0;
1606                 stypes = mgmt_stypes[ift].tx;
1607                 while (stypes) {
1608                         if ((stypes & 1) &&
1609                             nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1610                                         (i << 4) | IEEE80211_FTYPE_MGMT))
1611                                 return -ENOBUFS;
1612                         stypes >>= 1;
1613                         i++;
1614                 }
1615                 nla_nest_end(msg, nl_ftypes);
1616         }
1617
1618         nla_nest_end(msg, nl_ifs);
1619
1620         nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_RX_FRAME_TYPES);
1621         if (!nl_ifs)
1622                 return -ENOBUFS;
1623
1624         for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1625                 nl_ftypes = nla_nest_start_noflag(msg, ift);
1626                 if (!nl_ftypes)
1627                         return -ENOBUFS;
1628                 i = 0;
1629                 stypes = mgmt_stypes[ift].rx;
1630                 while (stypes) {
1631                         if ((stypes & 1) &&
1632                             nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1633                                         (i << 4) | IEEE80211_FTYPE_MGMT))
1634                                 return -ENOBUFS;
1635                         stypes >>= 1;
1636                         i++;
1637                 }
1638                 nla_nest_end(msg, nl_ftypes);
1639         }
1640         nla_nest_end(msg, nl_ifs);
1641
1642         return 0;
1643 }
1644
1645 #define CMD(op, n)                                                      \
1646          do {                                                           \
1647                 if (rdev->ops->op) {                                    \
1648                         i++;                                            \
1649                         if (nla_put_u32(msg, i, NL80211_CMD_ ## n))     \
1650                                 goto nla_put_failure;                   \
1651                 }                                                       \
1652         } while (0)
1653
1654 static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev,
1655                                         struct sk_buff *msg)
1656 {
1657         int i = 0;
1658
1659         /*
1660          * do *NOT* add anything into this function, new things need to be
1661          * advertised only to new versions of userspace that can deal with
1662          * the split (and they can't possibly care about new features...
1663          */
1664         CMD(add_virtual_intf, NEW_INTERFACE);
1665         CMD(change_virtual_intf, SET_INTERFACE);
1666         CMD(add_key, NEW_KEY);
1667         CMD(start_ap, START_AP);
1668         CMD(add_station, NEW_STATION);
1669         CMD(add_mpath, NEW_MPATH);
1670         CMD(update_mesh_config, SET_MESH_CONFIG);
1671         CMD(change_bss, SET_BSS);
1672         CMD(auth, AUTHENTICATE);
1673         CMD(assoc, ASSOCIATE);
1674         CMD(deauth, DEAUTHENTICATE);
1675         CMD(disassoc, DISASSOCIATE);
1676         CMD(join_ibss, JOIN_IBSS);
1677         CMD(join_mesh, JOIN_MESH);
1678         CMD(set_pmksa, SET_PMKSA);
1679         CMD(del_pmksa, DEL_PMKSA);
1680         CMD(flush_pmksa, FLUSH_PMKSA);
1681         if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)
1682                 CMD(remain_on_channel, REMAIN_ON_CHANNEL);
1683         CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
1684         CMD(mgmt_tx, FRAME);
1685         CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL);
1686         if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) {
1687                 i++;
1688                 if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS))
1689                         goto nla_put_failure;
1690         }
1691         if (rdev->ops->set_monitor_channel || rdev->ops->start_ap ||
1692             rdev->ops->join_mesh) {
1693                 i++;
1694                 if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL))
1695                         goto nla_put_failure;
1696         }
1697         CMD(set_wds_peer, SET_WDS_PEER);
1698         if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) {
1699                 CMD(tdls_mgmt, TDLS_MGMT);
1700                 CMD(tdls_oper, TDLS_OPER);
1701         }
1702         if (rdev->wiphy.max_sched_scan_reqs)
1703                 CMD(sched_scan_start, START_SCHED_SCAN);
1704         CMD(probe_client, PROBE_CLIENT);
1705         CMD(set_noack_map, SET_NOACK_MAP);
1706         if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) {
1707                 i++;
1708                 if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS))
1709                         goto nla_put_failure;
1710         }
1711         CMD(start_p2p_device, START_P2P_DEVICE);
1712         CMD(set_mcast_rate, SET_MCAST_RATE);
1713 #ifdef CONFIG_NL80211_TESTMODE
1714         CMD(testmode_cmd, TESTMODE);
1715 #endif
1716
1717         if (rdev->ops->connect || rdev->ops->auth) {
1718                 i++;
1719                 if (nla_put_u32(msg, i, NL80211_CMD_CONNECT))
1720                         goto nla_put_failure;
1721         }
1722
1723         if (rdev->ops->disconnect || rdev->ops->deauth) {
1724                 i++;
1725                 if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT))
1726                         goto nla_put_failure;
1727         }
1728
1729         return i;
1730  nla_put_failure:
1731         return -ENOBUFS;
1732 }
1733
1734 static int
1735 nl80211_send_pmsr_ftm_capa(const struct cfg80211_pmsr_capabilities *cap,
1736                            struct sk_buff *msg)
1737 {
1738         struct nlattr *ftm;
1739
1740         if (!cap->ftm.supported)
1741                 return 0;
1742
1743         ftm = nla_nest_start_noflag(msg, NL80211_PMSR_TYPE_FTM);
1744         if (!ftm)
1745                 return -ENOBUFS;
1746
1747         if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP))
1748                 return -ENOBUFS;
1749         if (cap->ftm.non_asap &&
1750             nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP))
1751                 return -ENOBUFS;
1752         if (cap->ftm.request_lci &&
1753             nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI))
1754                 return -ENOBUFS;
1755         if (cap->ftm.request_civicloc &&
1756             nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC))
1757                 return -ENOBUFS;
1758         if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES,
1759                         cap->ftm.preambles))
1760                 return -ENOBUFS;
1761         if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS,
1762                         cap->ftm.bandwidths))
1763                 return -ENOBUFS;
1764         if (cap->ftm.max_bursts_exponent >= 0 &&
1765             nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT,
1766                         cap->ftm.max_bursts_exponent))
1767                 return -ENOBUFS;
1768         if (cap->ftm.max_ftms_per_burst &&
1769             nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST,
1770                         cap->ftm.max_ftms_per_burst))
1771                 return -ENOBUFS;
1772
1773         nla_nest_end(msg, ftm);
1774         return 0;
1775 }
1776
1777 static int nl80211_send_pmsr_capa(struct cfg80211_registered_device *rdev,
1778                                   struct sk_buff *msg)
1779 {
1780         const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa;
1781         struct nlattr *pmsr, *caps;
1782
1783         if (!cap)
1784                 return 0;
1785
1786         /*
1787          * we don't need to clean up anything here since the caller
1788          * will genlmsg_cancel() if we fail
1789          */
1790
1791         pmsr = nla_nest_start_noflag(msg, NL80211_ATTR_PEER_MEASUREMENTS);
1792         if (!pmsr)
1793                 return -ENOBUFS;
1794
1795         if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers))
1796                 return -ENOBUFS;
1797
1798         if (cap->report_ap_tsf &&
1799             nla_put_flag(msg, NL80211_PMSR_ATTR_REPORT_AP_TSF))
1800                 return -ENOBUFS;
1801
1802         if (cap->randomize_mac_addr &&
1803             nla_put_flag(msg, NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR))
1804                 return -ENOBUFS;
1805
1806         caps = nla_nest_start_noflag(msg, NL80211_PMSR_ATTR_TYPE_CAPA);
1807         if (!caps)
1808                 return -ENOBUFS;
1809
1810         if (nl80211_send_pmsr_ftm_capa(cap, msg))
1811                 return -ENOBUFS;
1812
1813         nla_nest_end(msg, caps);
1814         nla_nest_end(msg, pmsr);
1815
1816         return 0;
1817 }
1818
1819 struct nl80211_dump_wiphy_state {
1820         s64 filter_wiphy;
1821         long start;
1822         long split_start, band_start, chan_start, capa_start;
1823         bool split;
1824 };
1825
1826 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
1827                               enum nl80211_commands cmd,
1828                               struct sk_buff *msg, u32 portid, u32 seq,
1829                               int flags, struct nl80211_dump_wiphy_state *state)
1830 {
1831         void *hdr;
1832         struct nlattr *nl_bands, *nl_band;
1833         struct nlattr *nl_freqs, *nl_freq;
1834         struct nlattr *nl_cmds;
1835         enum nl80211_band band;
1836         struct ieee80211_channel *chan;
1837         int i;
1838         const struct ieee80211_txrx_stypes *mgmt_stypes =
1839                                 rdev->wiphy.mgmt_stypes;
1840         u32 features;
1841
1842         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
1843         if (!hdr)
1844                 return -ENOBUFS;
1845
1846         if (WARN_ON(!state))
1847                 return -EINVAL;
1848
1849         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
1850             nla_put_string(msg, NL80211_ATTR_WIPHY_NAME,
1851                            wiphy_name(&rdev->wiphy)) ||
1852             nla_put_u32(msg, NL80211_ATTR_GENERATION,
1853                         cfg80211_rdev_list_generation))
1854                 goto nla_put_failure;
1855
1856         if (cmd != NL80211_CMD_NEW_WIPHY)
1857                 goto finish;
1858
1859         switch (state->split_start) {
1860         case 0:
1861                 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
1862                                rdev->wiphy.retry_short) ||
1863                     nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
1864                                rdev->wiphy.retry_long) ||
1865                     nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
1866                                 rdev->wiphy.frag_threshold) ||
1867                     nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
1868                                 rdev->wiphy.rts_threshold) ||
1869                     nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS,
1870                                rdev->wiphy.coverage_class) ||
1871                     nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
1872                                rdev->wiphy.max_scan_ssids) ||
1873                     nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
1874                                rdev->wiphy.max_sched_scan_ssids) ||
1875                     nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
1876                                 rdev->wiphy.max_scan_ie_len) ||
1877                     nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
1878                                 rdev->wiphy.max_sched_scan_ie_len) ||
1879                     nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS,
1880                                rdev->wiphy.max_match_sets) ||
1881                     nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS,
1882                                 rdev->wiphy.max_sched_scan_plans) ||
1883                     nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL,
1884                                 rdev->wiphy.max_sched_scan_plan_interval) ||
1885                     nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
1886                                 rdev->wiphy.max_sched_scan_plan_iterations))
1887                         goto nla_put_failure;
1888
1889                 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) &&
1890                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN))
1891                         goto nla_put_failure;
1892                 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
1893                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH))
1894                         goto nla_put_failure;
1895                 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) &&
1896                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD))
1897                         goto nla_put_failure;
1898                 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) &&
1899                     nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT))
1900                         goto nla_put_failure;
1901                 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) &&
1902                     nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT))
1903                         goto nla_put_failure;
1904                 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) &&
1905                     nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP))
1906                         goto nla_put_failure;
1907                 state->split_start++;
1908                 if (state->split)
1909                         break;
1910                 /* fall through */
1911         case 1:
1912                 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES,
1913                             sizeof(u32) * rdev->wiphy.n_cipher_suites,
1914                             rdev->wiphy.cipher_suites))
1915                         goto nla_put_failure;
1916
1917                 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS,
1918                                rdev->wiphy.max_num_pmkids))
1919                         goto nla_put_failure;
1920
1921                 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
1922                     nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE))
1923                         goto nla_put_failure;
1924
1925                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
1926                                 rdev->wiphy.available_antennas_tx) ||
1927                     nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
1928                                 rdev->wiphy.available_antennas_rx))
1929                         goto nla_put_failure;
1930
1931                 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) &&
1932                     nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD,
1933                                 rdev->wiphy.probe_resp_offload))
1934                         goto nla_put_failure;
1935
1936                 if ((rdev->wiphy.available_antennas_tx ||
1937                      rdev->wiphy.available_antennas_rx) &&
1938                     rdev->ops->get_antenna) {
1939                         u32 tx_ant = 0, rx_ant = 0;
1940                         int res;
1941
1942                         res = rdev_get_antenna(rdev, &tx_ant, &rx_ant);
1943                         if (!res) {
1944                                 if (nla_put_u32(msg,
1945                                                 NL80211_ATTR_WIPHY_ANTENNA_TX,
1946                                                 tx_ant) ||
1947                                     nla_put_u32(msg,
1948                                                 NL80211_ATTR_WIPHY_ANTENNA_RX,
1949                                                 rx_ant))
1950                                         goto nla_put_failure;
1951                         }
1952                 }
1953
1954                 state->split_start++;
1955                 if (state->split)
1956                         break;
1957                 /* fall through */
1958         case 2:
1959                 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
1960                                         rdev->wiphy.interface_modes))
1961                                 goto nla_put_failure;
1962                 state->split_start++;
1963                 if (state->split)
1964                         break;
1965                 /* fall through */
1966         case 3:
1967                 nl_bands = nla_nest_start_noflag(msg,
1968                                                  NL80211_ATTR_WIPHY_BANDS);
1969                 if (!nl_bands)
1970                         goto nla_put_failure;
1971
1972                 for (band = state->band_start;
1973                      band < NUM_NL80211_BANDS; band++) {
1974                         struct ieee80211_supported_band *sband;
1975
1976                         sband = rdev->wiphy.bands[band];
1977
1978                         if (!sband)
1979                                 continue;
1980
1981                         nl_band = nla_nest_start_noflag(msg, band);
1982                         if (!nl_band)
1983                                 goto nla_put_failure;
1984
1985                         switch (state->chan_start) {
1986                         case 0:
1987                                 if (nl80211_send_band_rateinfo(msg, sband))
1988                                         goto nla_put_failure;
1989                                 state->chan_start++;
1990                                 if (state->split)
1991                                         break;
1992                                 /* fall through */
1993                         default:
1994                                 /* add frequencies */
1995                                 nl_freqs = nla_nest_start_noflag(msg,
1996                                                                  NL80211_BAND_ATTR_FREQS);
1997                                 if (!nl_freqs)
1998                                         goto nla_put_failure;
1999
2000                                 for (i = state->chan_start - 1;
2001                                      i < sband->n_channels;
2002                                      i++) {
2003                                         nl_freq = nla_nest_start_noflag(msg,
2004                                                                         i);
2005                                         if (!nl_freq)
2006                                                 goto nla_put_failure;
2007
2008                                         chan = &sband->channels[i];
2009
2010                                         if (nl80211_msg_put_channel(
2011                                                         msg, &rdev->wiphy, chan,
2012                                                         state->split))
2013                                                 goto nla_put_failure;
2014
2015                                         nla_nest_end(msg, nl_freq);
2016                                         if (state->split)
2017                                                 break;
2018                                 }
2019                                 if (i < sband->n_channels)
2020                                         state->chan_start = i + 2;
2021                                 else
2022                                         state->chan_start = 0;
2023                                 nla_nest_end(msg, nl_freqs);
2024                         }
2025
2026                         nla_nest_end(msg, nl_band);
2027
2028                         if (state->split) {
2029                                 /* start again here */
2030                                 if (state->chan_start)
2031                                         band--;
2032                                 break;
2033                         }
2034                 }
2035                 nla_nest_end(msg, nl_bands);
2036
2037                 if (band < NUM_NL80211_BANDS)
2038                         state->band_start = band + 1;
2039                 else
2040                         state->band_start = 0;
2041
2042                 /* if bands & channels are done, continue outside */
2043                 if (state->band_start == 0 && state->chan_start == 0)
2044                         state->split_start++;
2045                 if (state->split)
2046                         break;
2047                 /* fall through */
2048         case 4:
2049                 nl_cmds = nla_nest_start_noflag(msg,
2050                                                 NL80211_ATTR_SUPPORTED_COMMANDS);
2051                 if (!nl_cmds)
2052                         goto nla_put_failure;
2053
2054                 i = nl80211_add_commands_unsplit(rdev, msg);
2055                 if (i < 0)
2056                         goto nla_put_failure;
2057                 if (state->split) {
2058                         CMD(crit_proto_start, CRIT_PROTOCOL_START);
2059                         CMD(crit_proto_stop, CRIT_PROTOCOL_STOP);
2060                         if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)
2061                                 CMD(channel_switch, CHANNEL_SWITCH);
2062                         CMD(set_qos_map, SET_QOS_MAP);
2063                         if (rdev->wiphy.features &
2064                                         NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)
2065                                 CMD(add_tx_ts, ADD_TX_TS);
2066                         CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST);
2067                         CMD(update_connect_params, UPDATE_CONNECT_PARAMS);
2068                 }
2069 #undef CMD
2070
2071                 nla_nest_end(msg, nl_cmds);
2072                 state->split_start++;
2073                 if (state->split)
2074                         break;
2075                 /* fall through */
2076         case 5:
2077                 if (rdev->ops->remain_on_channel &&
2078                     (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) &&
2079                     nla_put_u32(msg,
2080                                 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
2081                                 rdev->wiphy.max_remain_on_channel_duration))
2082                         goto nla_put_failure;
2083
2084                 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) &&
2085                     nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK))
2086                         goto nla_put_failure;
2087
2088                 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes))
2089                         goto nla_put_failure;
2090                 state->split_start++;
2091                 if (state->split)
2092                         break;
2093                 /* fall through */
2094         case 6:
2095 #ifdef CONFIG_PM
2096                 if (nl80211_send_wowlan(msg, rdev, state->split))
2097                         goto nla_put_failure;
2098                 state->split_start++;
2099                 if (state->split)
2100                         break;
2101 #else
2102                 state->split_start++;
2103 #endif
2104                 /* fall through */
2105         case 7:
2106                 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
2107                                         rdev->wiphy.software_iftypes))
2108                         goto nla_put_failure;
2109
2110                 if (nl80211_put_iface_combinations(&rdev->wiphy, msg,
2111                                                    state->split))
2112                         goto nla_put_failure;
2113
2114                 state->split_start++;
2115                 if (state->split)
2116                         break;
2117                 /* fall through */
2118         case 8:
2119                 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) &&
2120                     nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME,
2121                                 rdev->wiphy.ap_sme_capa))
2122                         goto nla_put_failure;
2123
2124                 features = rdev->wiphy.features;
2125                 /*
2126                  * We can only add the per-channel limit information if the
2127                  * dump is split, otherwise it makes it too big. Therefore
2128                  * only advertise it in that case.
2129                  */
2130                 if (state->split)
2131                         features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS;
2132                 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features))
2133                         goto nla_put_failure;
2134
2135                 if (rdev->wiphy.ht_capa_mod_mask &&
2136                     nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK,
2137                             sizeof(*rdev->wiphy.ht_capa_mod_mask),
2138                             rdev->wiphy.ht_capa_mod_mask))
2139                         goto nla_put_failure;
2140
2141                 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME &&
2142                     rdev->wiphy.max_acl_mac_addrs &&
2143                     nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX,
2144                                 rdev->wiphy.max_acl_mac_addrs))
2145                         goto nla_put_failure;
2146
2147                 /*
2148                  * Any information below this point is only available to
2149                  * applications that can deal with it being split. This
2150                  * helps ensure that newly added capabilities don't break
2151                  * older tools by overrunning their buffers.
2152                  *
2153                  * We still increment split_start so that in the split
2154                  * case we'll continue with more data in the next round,
2155                  * but break unconditionally so unsplit data stops here.
2156                  */
2157                 state->split_start++;
2158                 break;
2159         case 9:
2160                 if (rdev->wiphy.extended_capabilities &&
2161                     (nla_put(msg, NL80211_ATTR_EXT_CAPA,
2162                              rdev->wiphy.extended_capabilities_len,
2163                              rdev->wiphy.extended_capabilities) ||
2164                      nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
2165                              rdev->wiphy.extended_capabilities_len,
2166                              rdev->wiphy.extended_capabilities_mask)))
2167                         goto nla_put_failure;
2168
2169                 if (rdev->wiphy.vht_capa_mod_mask &&
2170                     nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK,
2171                             sizeof(*rdev->wiphy.vht_capa_mod_mask),
2172                             rdev->wiphy.vht_capa_mod_mask))
2173                         goto nla_put_failure;
2174
2175                 state->split_start++;
2176                 break;
2177         case 10:
2178                 if (nl80211_send_coalesce(msg, rdev))
2179                         goto nla_put_failure;
2180
2181                 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) &&
2182                     (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) ||
2183                      nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ)))
2184                         goto nla_put_failure;
2185
2186                 if (rdev->wiphy.max_ap_assoc_sta &&
2187                     nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA,
2188                                 rdev->wiphy.max_ap_assoc_sta))
2189                         goto nla_put_failure;
2190
2191                 state->split_start++;
2192                 break;
2193         case 11:
2194                 if (rdev->wiphy.n_vendor_commands) {
2195                         const struct nl80211_vendor_cmd_info *info;
2196                         struct nlattr *nested;
2197
2198                         nested = nla_nest_start_noflag(msg,
2199                                                        NL80211_ATTR_VENDOR_DATA);
2200                         if (!nested)
2201                                 goto nla_put_failure;
2202
2203                         for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
2204                                 info = &rdev->wiphy.vendor_commands[i].info;
2205                                 if (nla_put(msg, i + 1, sizeof(*info), info))
2206                                         goto nla_put_failure;
2207                         }
2208                         nla_nest_end(msg, nested);
2209                 }
2210
2211                 if (rdev->wiphy.n_vendor_events) {
2212                         const struct nl80211_vendor_cmd_info *info;
2213                         struct nlattr *nested;
2214
2215                         nested = nla_nest_start_noflag(msg,
2216                                                        NL80211_ATTR_VENDOR_EVENTS);
2217                         if (!nested)
2218                                 goto nla_put_failure;
2219
2220                         for (i = 0; i < rdev->wiphy.n_vendor_events; i++) {
2221                                 info = &rdev->wiphy.vendor_events[i];
2222                                 if (nla_put(msg, i + 1, sizeof(*info), info))
2223                                         goto nla_put_failure;
2224                         }
2225                         nla_nest_end(msg, nested);
2226                 }
2227                 state->split_start++;
2228                 break;
2229         case 12:
2230                 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH &&
2231                     nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS,
2232                                rdev->wiphy.max_num_csa_counters))
2233                         goto nla_put_failure;
2234
2235                 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
2236                     nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
2237                         goto nla_put_failure;
2238
2239                 if (rdev->wiphy.max_sched_scan_reqs &&
2240                     nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS,
2241                                 rdev->wiphy.max_sched_scan_reqs))
2242                         goto nla_put_failure;
2243
2244                 if (nla_put(msg, NL80211_ATTR_EXT_FEATURES,
2245                             sizeof(rdev->wiphy.ext_features),
2246                             rdev->wiphy.ext_features))
2247                         goto nla_put_failure;
2248
2249                 if (rdev->wiphy.bss_select_support) {
2250                         struct nlattr *nested;
2251                         u32 bss_select_support = rdev->wiphy.bss_select_support;
2252
2253                         nested = nla_nest_start_noflag(msg,
2254                                                        NL80211_ATTR_BSS_SELECT);
2255                         if (!nested)
2256                                 goto nla_put_failure;
2257
2258                         i = 0;
2259                         while (bss_select_support) {
2260                                 if ((bss_select_support & 1) &&
2261                                     nla_put_flag(msg, i))
2262                                         goto nla_put_failure;
2263                                 i++;
2264                                 bss_select_support >>= 1;
2265                         }
2266                         nla_nest_end(msg, nested);
2267                 }
2268
2269                 state->split_start++;
2270                 break;
2271         case 13:
2272                 if (rdev->wiphy.num_iftype_ext_capab &&
2273                     rdev->wiphy.iftype_ext_capab) {
2274                         struct nlattr *nested_ext_capab, *nested;
2275
2276                         nested = nla_nest_start_noflag(msg,
2277                                                        NL80211_ATTR_IFTYPE_EXT_CAPA);
2278                         if (!nested)
2279                                 goto nla_put_failure;
2280
2281                         for (i = state->capa_start;
2282                              i < rdev->wiphy.num_iftype_ext_capab; i++) {
2283                                 const struct wiphy_iftype_ext_capab *capab;
2284
2285                                 capab = &rdev->wiphy.iftype_ext_capab[i];
2286
2287                                 nested_ext_capab = nla_nest_start_noflag(msg,
2288                                                                          i);
2289                                 if (!nested_ext_capab ||
2290                                     nla_put_u32(msg, NL80211_ATTR_IFTYPE,
2291                                                 capab->iftype) ||
2292                                     nla_put(msg, NL80211_ATTR_EXT_CAPA,
2293                                             capab->extended_capabilities_len,
2294                                             capab->extended_capabilities) ||
2295                                     nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
2296                                             capab->extended_capabilities_len,
2297                                             capab->extended_capabilities_mask))
2298                                         goto nla_put_failure;
2299
2300                                 nla_nest_end(msg, nested_ext_capab);
2301                                 if (state->split)
2302                                         break;
2303                         }
2304                         nla_nest_end(msg, nested);
2305                         if (i < rdev->wiphy.num_iftype_ext_capab) {
2306                                 state->capa_start = i + 1;
2307                                 break;
2308                         }
2309                 }
2310
2311                 if (nla_put_u32(msg, NL80211_ATTR_BANDS,
2312                                 rdev->wiphy.nan_supported_bands))
2313                         goto nla_put_failure;
2314
2315                 if (wiphy_ext_feature_isset(&rdev->wiphy,
2316                                             NL80211_EXT_FEATURE_TXQS)) {
2317                         struct cfg80211_txq_stats txqstats = {};
2318                         int res;
2319
2320                         res = rdev_get_txq_stats(rdev, NULL, &txqstats);
2321                         if (!res &&
2322                             !nl80211_put_txq_stats(msg, &txqstats,
2323                                                    NL80211_ATTR_TXQ_STATS))
2324                                 goto nla_put_failure;
2325
2326                         if (nla_put_u32(msg, NL80211_ATTR_TXQ_LIMIT,
2327                                         rdev->wiphy.txq_limit))
2328                                 goto nla_put_failure;
2329                         if (nla_put_u32(msg, NL80211_ATTR_TXQ_MEMORY_LIMIT,
2330                                         rdev->wiphy.txq_memory_limit))
2331                                 goto nla_put_failure;
2332                         if (nla_put_u32(msg, NL80211_ATTR_TXQ_QUANTUM,
2333                                         rdev->wiphy.txq_quantum))
2334                                 goto nla_put_failure;
2335                 }
2336
2337                 state->split_start++;
2338                 break;
2339         case 14:
2340                 if (nl80211_send_pmsr_capa(rdev, msg))
2341                         goto nla_put_failure;
2342
2343                 state->split_start++;
2344                 break;
2345         case 15:
2346                 if (rdev->wiphy.akm_suites &&
2347                     nla_put(msg, NL80211_ATTR_AKM_SUITES,
2348                             sizeof(u32) * rdev->wiphy.n_akm_suites,
2349                             rdev->wiphy.akm_suites))
2350                         goto nla_put_failure;
2351
2352                 /* done */
2353                 state->split_start = 0;
2354                 break;
2355         }
2356  finish:
2357         genlmsg_end(msg, hdr);
2358         return 0;
2359
2360  nla_put_failure:
2361         genlmsg_cancel(msg, hdr);
2362         return -EMSGSIZE;
2363 }
2364
2365 static int nl80211_dump_wiphy_parse(struct sk_buff *skb,
2366                                     struct netlink_callback *cb,
2367                                     struct nl80211_dump_wiphy_state *state)
2368 {
2369         struct nlattr **tb = genl_family_attrbuf(&nl80211_fam);
2370         int ret = nlmsg_parse_deprecated(cb->nlh,
2371                                          GENL_HDRLEN + nl80211_fam.hdrsize,
2372                                          tb, nl80211_fam.maxattr,
2373                                          nl80211_policy, NULL);
2374         /* ignore parse errors for backward compatibility */
2375         if (ret)
2376                 return 0;
2377
2378         state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP];
2379         if (tb[NL80211_ATTR_WIPHY])
2380                 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
2381         if (tb[NL80211_ATTR_WDEV])
2382                 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32;
2383         if (tb[NL80211_ATTR_IFINDEX]) {
2384                 struct net_device *netdev;
2385                 struct cfg80211_registered_device *rdev;
2386                 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
2387
2388                 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx);
2389                 if (!netdev)
2390                         return -ENODEV;
2391                 if (netdev->ieee80211_ptr) {
2392                         rdev = wiphy_to_rdev(
2393                                 netdev->ieee80211_ptr->wiphy);
2394                         state->filter_wiphy = rdev->wiphy_idx;
2395                 }
2396         }
2397
2398         return 0;
2399 }
2400
2401 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
2402 {
2403         int idx = 0, ret;
2404         struct nl80211_dump_wiphy_state *state = (void *)cb->args[0];
2405         struct cfg80211_registered_device *rdev;
2406
2407         rtnl_lock();
2408         if (!state) {
2409                 state = kzalloc(sizeof(*state), GFP_KERNEL);
2410                 if (!state) {
2411                         rtnl_unlock();
2412                         return -ENOMEM;
2413                 }
2414                 state->filter_wiphy = -1;
2415                 ret = nl80211_dump_wiphy_parse(skb, cb, state);
2416                 if (ret) {
2417                         kfree(state);
2418                         rtnl_unlock();
2419                         return ret;
2420                 }
2421                 cb->args[0] = (long)state;
2422         }
2423
2424         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
2425                 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
2426                         continue;
2427                 if (++idx <= state->start)
2428                         continue;
2429                 if (state->filter_wiphy != -1 &&
2430                     state->filter_wiphy != rdev->wiphy_idx)
2431                         continue;
2432                 /* attempt to fit multiple wiphy data chunks into the skb */
2433                 do {
2434                         ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY,
2435                                                  skb,
2436                                                  NETLINK_CB(cb->skb).portid,
2437                                                  cb->nlh->nlmsg_seq,
2438                                                  NLM_F_MULTI, state);
2439                         if (ret < 0) {
2440                                 /*
2441                                  * If sending the wiphy data didn't fit (ENOBUFS
2442                                  * or EMSGSIZE returned), this SKB is still
2443                                  * empty (so it's not too big because another
2444                                  * wiphy dataset is already in the skb) and
2445                                  * we've not tried to adjust the dump allocation
2446                                  * yet ... then adjust the alloc size to be
2447                                  * bigger, and return 1 but with the empty skb.
2448                                  * This results in an empty message being RX'ed
2449                                  * in userspace, but that is ignored.
2450                                  *
2451                                  * We can then retry with the larger buffer.
2452                                  */
2453                                 if ((ret == -ENOBUFS || ret == -EMSGSIZE) &&
2454                                     !skb->len && !state->split &&
2455                                     cb->min_dump_alloc < 4096) {
2456                                         cb->min_dump_alloc = 4096;
2457                                         state->split_start = 0;
2458                                         rtnl_unlock();
2459                                         return 1;
2460                                 }
2461                                 idx--;
2462                                 break;
2463                         }
2464                 } while (state->split_start > 0);
2465                 break;
2466         }
2467         rtnl_unlock();
2468
2469         state->start = idx;
2470
2471         return skb->len;
2472 }
2473
2474 static int nl80211_dump_wiphy_done(struct netlink_callback *cb)
2475 {
2476         kfree((void *)cb->args[0]);
2477         return 0;
2478 }
2479
2480 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
2481 {
2482         struct sk_buff *msg;
2483         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2484         struct nl80211_dump_wiphy_state state = {};
2485
2486         msg = nlmsg_new(4096, GFP_KERNEL);
2487         if (!msg)
2488                 return -ENOMEM;
2489
2490         if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg,
2491                                info->snd_portid, info->snd_seq, 0,
2492                                &state) < 0) {
2493                 nlmsg_free(msg);
2494                 return -ENOBUFS;
2495         }
2496
2497         return genlmsg_reply(msg, info);
2498 }
2499
2500 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
2501         [NL80211_TXQ_ATTR_QUEUE]                = { .type = NLA_U8 },
2502         [NL80211_TXQ_ATTR_TXOP]                 = { .type = NLA_U16 },
2503         [NL80211_TXQ_ATTR_CWMIN]                = { .type = NLA_U16 },
2504         [NL80211_TXQ_ATTR_CWMAX]                = { .type = NLA_U16 },
2505         [NL80211_TXQ_ATTR_AIFS]                 = { .type = NLA_U8 },
2506 };
2507
2508 static int parse_txq_params(struct nlattr *tb[],
2509                             struct ieee80211_txq_params *txq_params)
2510 {
2511         u8 ac;
2512
2513         if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] ||
2514             !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
2515             !tb[NL80211_TXQ_ATTR_AIFS])
2516                 return -EINVAL;
2517
2518         ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]);
2519         txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
2520         txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
2521         txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
2522         txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
2523
2524         if (ac >= NL80211_NUM_ACS)
2525                 return -EINVAL;
2526         txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS);
2527         return 0;
2528 }
2529
2530 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
2531 {
2532         /*
2533          * You can only set the channel explicitly for WDS interfaces,
2534          * all others have their channel managed via their respective
2535          * "establish a connection" command (connect, join, ...)
2536          *
2537          * For AP/GO and mesh mode, the channel can be set with the
2538          * channel userspace API, but is only stored and passed to the
2539          * low-level driver when the AP starts or the mesh is joined.
2540          * This is for backward compatibility, userspace can also give
2541          * the channel in the start-ap or join-mesh commands instead.
2542          *
2543          * Monitors are special as they are normally slaved to
2544          * whatever else is going on, so they have their own special
2545          * operation to set the monitor channel if possible.
2546          */
2547         return !wdev ||
2548                 wdev->iftype == NL80211_IFTYPE_AP ||
2549                 wdev->iftype == NL80211_IFTYPE_MESH_POINT ||
2550                 wdev->iftype == NL80211_IFTYPE_MONITOR ||
2551                 wdev->iftype == NL80211_IFTYPE_P2P_GO;
2552 }
2553
2554 int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
2555                           struct genl_info *info,
2556                           struct cfg80211_chan_def *chandef)
2557 {
2558         struct netlink_ext_ack *extack = info->extack;
2559         struct nlattr **attrs = info->attrs;
2560         u32 control_freq;
2561
2562         if (!attrs[NL80211_ATTR_WIPHY_FREQ])
2563                 return -EINVAL;
2564
2565         control_freq = nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ]);
2566
2567         chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq);
2568         chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
2569         chandef->center_freq1 = control_freq;
2570         chandef->center_freq2 = 0;
2571
2572         /* Primary channel not allowed */
2573         if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) {
2574                 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ],
2575                                     "Channel is disabled");
2576                 return -EINVAL;
2577         }
2578
2579         if (attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
2580                 enum nl80211_channel_type chantype;
2581
2582                 chantype = nla_get_u32(attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
2583
2584                 switch (chantype) {
2585                 case NL80211_CHAN_NO_HT:
2586                 case NL80211_CHAN_HT20:
2587                 case NL80211_CHAN_HT40PLUS:
2588                 case NL80211_CHAN_HT40MINUS:
2589                         cfg80211_chandef_create(chandef, chandef->chan,
2590                                                 chantype);
2591                         /* user input for center_freq is incorrect */
2592                         if (attrs[NL80211_ATTR_CENTER_FREQ1] &&
2593                             chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) {
2594                                 NL_SET_ERR_MSG_ATTR(extack,
2595                                                     attrs[NL80211_ATTR_CENTER_FREQ1],
2596                                                     "bad center frequency 1");
2597                                 return -EINVAL;
2598                         }
2599                         /* center_freq2 must be zero */
2600                         if (attrs[NL80211_ATTR_CENTER_FREQ2] &&
2601                             nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2])) {
2602                                 NL_SET_ERR_MSG_ATTR(extack,
2603                                                     attrs[NL80211_ATTR_CENTER_FREQ2],
2604                                                     "center frequency 2 can't be used");
2605                                 return -EINVAL;
2606                         }
2607                         break;
2608                 default:
2609                         NL_SET_ERR_MSG_ATTR(extack,
2610                                             attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE],
2611                                             "invalid channel type");
2612                         return -EINVAL;
2613                 }
2614         } else if (attrs[NL80211_ATTR_CHANNEL_WIDTH]) {
2615                 chandef->width =
2616                         nla_get_u32(attrs[NL80211_ATTR_CHANNEL_WIDTH]);
2617                 if (attrs[NL80211_ATTR_CENTER_FREQ1])
2618                         chandef->center_freq1 =
2619                                 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1]);
2620                 if (attrs[NL80211_ATTR_CENTER_FREQ2])
2621                         chandef->center_freq2 =
2622                                 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2]);
2623         }
2624
2625         if (!cfg80211_chandef_valid(chandef)) {
2626                 NL_SET_ERR_MSG(extack, "invalid channel definition");
2627                 return -EINVAL;
2628         }
2629
2630         if (!cfg80211_chandef_usable(&rdev->wiphy, chandef,
2631                                      IEEE80211_CHAN_DISABLED)) {
2632                 NL_SET_ERR_MSG(extack, "(extension) channel is disabled");
2633                 return -EINVAL;
2634         }
2635
2636         if ((chandef->width == NL80211_CHAN_WIDTH_5 ||
2637              chandef->width == NL80211_CHAN_WIDTH_10) &&
2638             !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) {
2639                 NL_SET_ERR_MSG(extack, "5/10 MHz not supported");
2640                 return -EINVAL;
2641         }
2642
2643         return 0;
2644 }
2645
2646 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
2647                                  struct net_device *dev,
2648                                  struct genl_info *info)
2649 {
2650         struct cfg80211_chan_def chandef;
2651         int result;
2652         enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR;
2653         struct wireless_dev *wdev = NULL;
2654
2655         if (dev)
2656                 wdev = dev->ieee80211_ptr;
2657         if (!nl80211_can_set_dev_channel(wdev))
2658                 return -EOPNOTSUPP;
2659         if (wdev)
2660                 iftype = wdev->iftype;
2661
2662         result = nl80211_parse_chandef(rdev, info, &chandef);
2663         if (result)
2664                 return result;
2665
2666         switch (iftype) {
2667         case NL80211_IFTYPE_AP:
2668         case NL80211_IFTYPE_P2P_GO:
2669                 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
2670                                                    iftype)) {
2671                         result = -EINVAL;
2672                         break;
2673                 }
2674                 if (wdev->beacon_interval) {
2675                         if (!dev || !rdev->ops->set_ap_chanwidth ||
2676                             !(rdev->wiphy.features &
2677                               NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) {
2678                                 result = -EBUSY;
2679                                 break;
2680                         }
2681
2682                         /* Only allow dynamic channel width changes */
2683                         if (chandef.chan != wdev->preset_chandef.chan) {
2684                                 result = -EBUSY;
2685                                 break;
2686                         }
2687                         result = rdev_set_ap_chanwidth(rdev, dev, &chandef);
2688                         if (result)
2689                                 break;
2690                 }
2691                 wdev->preset_chandef = chandef;
2692                 result = 0;
2693                 break;
2694         case NL80211_IFTYPE_MESH_POINT:
2695                 result = cfg80211_set_mesh_channel(rdev, wdev, &chandef);
2696                 break;
2697         case NL80211_IFTYPE_MONITOR:
2698                 result = cfg80211_set_monitor_channel(rdev, &chandef);
2699                 break;
2700         default:
2701                 result = -EINVAL;
2702         }
2703
2704         return result;
2705 }
2706
2707 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
2708 {
2709         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2710         struct net_device *netdev = info->user_ptr[1];
2711
2712         return __nl80211_set_channel(rdev, netdev, info);
2713 }
2714
2715 static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info)
2716 {
2717         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2718         struct net_device *dev = info->user_ptr[1];
2719         struct wireless_dev *wdev = dev->ieee80211_ptr;
2720         const u8 *bssid;
2721
2722         if (!info->attrs[NL80211_ATTR_MAC])
2723                 return -EINVAL;
2724
2725         if (netif_running(dev))
2726                 return -EBUSY;
2727
2728         if (!rdev->ops->set_wds_peer)
2729                 return -EOPNOTSUPP;
2730
2731         if (wdev->iftype != NL80211_IFTYPE_WDS)
2732                 return -EOPNOTSUPP;
2733
2734         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
2735         return rdev_set_wds_peer(rdev, dev, bssid);
2736 }
2737
2738 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
2739 {
2740         struct cfg80211_registered_device *rdev;
2741         struct net_device *netdev = NULL;
2742         struct wireless_dev *wdev;
2743         int result = 0, rem_txq_params = 0;
2744         struct nlattr *nl_txq_params;
2745         u32 changed;
2746         u8 retry_short = 0, retry_long = 0;
2747         u32 frag_threshold = 0, rts_threshold = 0;
2748         u8 coverage_class = 0;
2749         u32 txq_limit = 0, txq_memory_limit = 0, txq_quantum = 0;
2750
2751         ASSERT_RTNL();
2752
2753         /*
2754          * Try to find the wiphy and netdev. Normally this
2755          * function shouldn't need the netdev, but this is
2756          * done for backward compatibility -- previously
2757          * setting the channel was done per wiphy, but now
2758          * it is per netdev. Previous userland like hostapd
2759          * also passed a netdev to set_wiphy, so that it is
2760          * possible to let that go to the right netdev!
2761          */
2762
2763         if (info->attrs[NL80211_ATTR_IFINDEX]) {
2764                 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
2765
2766                 netdev = __dev_get_by_index(genl_info_net(info), ifindex);
2767                 if (netdev && netdev->ieee80211_ptr)
2768                         rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy);
2769                 else
2770                         netdev = NULL;
2771         }
2772
2773         if (!netdev) {
2774                 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info),
2775                                                   info->attrs);
2776                 if (IS_ERR(rdev))
2777                         return PTR_ERR(rdev);
2778                 wdev = NULL;
2779                 netdev = NULL;
2780                 result = 0;
2781         } else
2782                 wdev = netdev->ieee80211_ptr;
2783
2784         /*
2785          * end workaround code, by now the rdev is available
2786          * and locked, and wdev may or may not be NULL.
2787          */
2788
2789         if (info->attrs[NL80211_ATTR_WIPHY_NAME])
2790                 result = cfg80211_dev_rename(
2791                         rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
2792
2793         if (result)
2794                 return result;
2795
2796         if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
2797                 struct ieee80211_txq_params txq_params;
2798                 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
2799
2800                 if (!rdev->ops->set_txq_params)
2801                         return -EOPNOTSUPP;
2802
2803                 if (!netdev)
2804                         return -EINVAL;
2805
2806                 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
2807                     netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
2808                         return -EINVAL;
2809
2810                 if (!netif_running(netdev))
2811                         return -ENETDOWN;
2812
2813                 nla_for_each_nested(nl_txq_params,
2814                                     info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
2815                                     rem_txq_params) {
2816                         result = nla_parse_nested_deprecated(tb,
2817                                                              NL80211_TXQ_ATTR_MAX,
2818                                                              nl_txq_params,
2819                                                              txq_params_policy,
2820                                                              info->extack);
2821                         if (result)
2822                                 return result;
2823                         result = parse_txq_params(tb, &txq_params);
2824                         if (result)
2825                                 return result;
2826
2827                         result = rdev_set_txq_params(rdev, netdev,
2828                                                      &txq_params);
2829                         if (result)
2830                                 return result;
2831                 }
2832         }
2833
2834         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
2835                 result = __nl80211_set_channel(
2836                         rdev,
2837                         nl80211_can_set_dev_channel(wdev) ? netdev : NULL,
2838                         info);
2839                 if (result)
2840                         return result;
2841         }
2842
2843         if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
2844                 struct wireless_dev *txp_wdev = wdev;
2845                 enum nl80211_tx_power_setting type;
2846                 int idx, mbm = 0;
2847
2848                 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER))
2849                         txp_wdev = NULL;
2850
2851                 if (!rdev->ops->set_tx_power)
2852                         return -EOPNOTSUPP;
2853
2854                 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
2855                 type = nla_get_u32(info->attrs[idx]);
2856
2857                 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
2858                     (type != NL80211_TX_POWER_AUTOMATIC))
2859                         return -EINVAL;
2860
2861                 if (type != NL80211_TX_POWER_AUTOMATIC) {
2862                         idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
2863                         mbm = nla_get_u32(info->attrs[idx]);
2864                 }
2865
2866                 result = rdev_set_tx_power(rdev, txp_wdev, type, mbm);
2867                 if (result)
2868                         return result;
2869         }
2870
2871         if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
2872             info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
2873                 u32 tx_ant, rx_ant;
2874
2875                 if ((!rdev->wiphy.available_antennas_tx &&
2876                      !rdev->wiphy.available_antennas_rx) ||
2877                     !rdev->ops->set_antenna)
2878                         return -EOPNOTSUPP;
2879
2880                 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
2881                 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
2882
2883                 /* reject antenna configurations which don't match the
2884                  * available antenna masks, except for the "all" mask */
2885                 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
2886                     (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx)))
2887                         return -EINVAL;
2888
2889                 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
2890                 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
2891
2892                 result = rdev_set_antenna(rdev, tx_ant, rx_ant);
2893                 if (result)
2894                         return result;
2895         }
2896
2897         changed = 0;
2898
2899         if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
2900                 retry_short = nla_get_u8(
2901                         info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
2902
2903                 changed |= WIPHY_PARAM_RETRY_SHORT;
2904         }
2905
2906         if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
2907                 retry_long = nla_get_u8(
2908                         info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
2909
2910                 changed |= WIPHY_PARAM_RETRY_LONG;
2911         }
2912
2913         if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
2914                 frag_threshold = nla_get_u32(
2915                         info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
2916                 if (frag_threshold < 256)
2917                         return -EINVAL;
2918
2919                 if (frag_threshold != (u32) -1) {
2920                         /*
2921                          * Fragments (apart from the last one) are required to
2922                          * have even length. Make the fragmentation code
2923                          * simpler by stripping LSB should someone try to use
2924                          * odd threshold value.
2925                          */
2926                         frag_threshold &= ~0x1;
2927                 }
2928                 changed |= WIPHY_PARAM_FRAG_THRESHOLD;
2929         }
2930
2931         if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
2932                 rts_threshold = nla_get_u32(
2933                         info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
2934                 changed |= WIPHY_PARAM_RTS_THRESHOLD;
2935         }
2936
2937         if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
2938                 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK])
2939                         return -EINVAL;
2940
2941                 coverage_class = nla_get_u8(
2942                         info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
2943                 changed |= WIPHY_PARAM_COVERAGE_CLASS;
2944         }
2945
2946         if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) {
2947                 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION))
2948                         return -EOPNOTSUPP;
2949
2950                 changed |= WIPHY_PARAM_DYN_ACK;
2951         }
2952
2953         if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) {
2954                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
2955                                              NL80211_EXT_FEATURE_TXQS))
2956                         return -EOPNOTSUPP;
2957                 txq_limit = nla_get_u32(
2958                         info->attrs[NL80211_ATTR_TXQ_LIMIT]);
2959                 changed |= WIPHY_PARAM_TXQ_LIMIT;
2960         }
2961
2962         if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) {
2963                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
2964                                              NL80211_EXT_FEATURE_TXQS))
2965                         return -EOPNOTSUPP;
2966                 txq_memory_limit = nla_get_u32(
2967                         info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]);
2968                 changed |= WIPHY_PARAM_TXQ_MEMORY_LIMIT;
2969         }
2970
2971         if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) {
2972                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
2973                                              NL80211_EXT_FEATURE_TXQS))
2974                         return -EOPNOTSUPP;
2975                 txq_quantum = nla_get_u32(
2976                         info->attrs[NL80211_ATTR_TXQ_QUANTUM]);
2977                 changed |= WIPHY_PARAM_TXQ_QUANTUM;
2978         }
2979
2980         if (changed) {
2981                 u8 old_retry_short, old_retry_long;
2982                 u32 old_frag_threshold, old_rts_threshold;
2983                 u8 old_coverage_class;
2984                 u32 old_txq_limit, old_txq_memory_limit, old_txq_quantum;
2985
2986                 if (!rdev->ops->set_wiphy_params)
2987                         return -EOPNOTSUPP;
2988
2989                 old_retry_short = rdev->wiphy.retry_short;
2990                 old_retry_long = rdev->wiphy.retry_long;
2991                 old_frag_threshold = rdev->wiphy.frag_threshold;
2992                 old_rts_threshold = rdev->wiphy.rts_threshold;
2993                 old_coverage_class = rdev->wiphy.coverage_class;
2994                 old_txq_limit = rdev->wiphy.txq_limit;
2995                 old_txq_memory_limit = rdev->wiphy.txq_memory_limit;
2996                 old_txq_quantum = rdev->wiphy.txq_quantum;
2997
2998                 if (changed & WIPHY_PARAM_RETRY_SHORT)
2999                         rdev->wiphy.retry_short = retry_short;
3000                 if (changed & WIPHY_PARAM_RETRY_LONG)
3001                         rdev->wiphy.retry_long = retry_long;
3002                 if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
3003                         rdev->wiphy.frag_threshold = frag_threshold;
3004                 if (changed & WIPHY_PARAM_RTS_THRESHOLD)
3005                         rdev->wiphy.rts_threshold = rts_threshold;
3006                 if (changed & WIPHY_PARAM_COVERAGE_CLASS)
3007                         rdev->wiphy.coverage_class = coverage_class;
3008                 if (changed & WIPHY_PARAM_TXQ_LIMIT)
3009                         rdev->wiphy.txq_limit = txq_limit;
3010                 if (changed & WIPHY_PARAM_TXQ_MEMORY_LIMIT)
3011                         rdev->wiphy.txq_memory_limit = txq_memory_limit;
3012                 if (changed & WIPHY_PARAM_TXQ_QUANTUM)
3013                         rdev->wiphy.txq_quantum = txq_quantum;
3014
3015                 result = rdev_set_wiphy_params(rdev, changed);
3016                 if (result) {
3017                         rdev->wiphy.retry_short = old_retry_short;
3018                         rdev->wiphy.retry_long = old_retry_long;
3019                         rdev->wiphy.frag_threshold = old_frag_threshold;
3020                         rdev->wiphy.rts_threshold = old_rts_threshold;
3021                         rdev->wiphy.coverage_class = old_coverage_class;
3022                         rdev->wiphy.txq_limit = old_txq_limit;
3023                         rdev->wiphy.txq_memory_limit = old_txq_memory_limit;
3024                         rdev->wiphy.txq_quantum = old_txq_quantum;
3025                         return result;
3026                 }
3027         }
3028         return 0;
3029 }
3030
3031 static int nl80211_send_chandef(struct sk_buff *msg,
3032                                 const struct cfg80211_chan_def *chandef)
3033 {
3034         if (WARN_ON(!cfg80211_chandef_valid(chandef)))
3035                 return -EINVAL;
3036
3037         if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ,
3038                         chandef->chan->center_freq))
3039                 return -ENOBUFS;
3040         switch (chandef->width) {
3041         case NL80211_CHAN_WIDTH_20_NOHT:
3042         case NL80211_CHAN_WIDTH_20:
3043         case NL80211_CHAN_WIDTH_40:
3044                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
3045                                 cfg80211_get_chandef_type(chandef)))
3046                         return -ENOBUFS;
3047                 break;
3048         default:
3049                 break;
3050         }
3051         if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width))
3052                 return -ENOBUFS;
3053         if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1))
3054                 return -ENOBUFS;
3055         if (chandef->center_freq2 &&
3056             nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2))
3057                 return -ENOBUFS;
3058         return 0;
3059 }
3060
3061 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags,
3062                               struct cfg80211_registered_device *rdev,
3063                               struct wireless_dev *wdev,
3064                               enum nl80211_commands cmd)
3065 {
3066         struct net_device *dev = wdev->netdev;
3067         void *hdr;
3068
3069         WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE &&
3070                 cmd != NL80211_CMD_DEL_INTERFACE &&
3071                 cmd != NL80211_CMD_SET_INTERFACE);
3072
3073         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
3074         if (!hdr)
3075                 return -1;
3076
3077         if (dev &&
3078             (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
3079              nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name)))
3080                 goto nla_put_failure;
3081
3082         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
3083             nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) ||
3084             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
3085                               NL80211_ATTR_PAD) ||
3086             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) ||
3087             nla_put_u32(msg, NL80211_ATTR_GENERATION,
3088                         rdev->devlist_generation ^
3089                         (cfg80211_rdev_list_generation << 2)) ||
3090             nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr))
3091                 goto nla_put_failure;
3092
3093         if (rdev->ops->get_channel) {
3094                 int ret;
3095                 struct cfg80211_chan_def chandef;
3096
3097                 ret = rdev_get_channel(rdev, wdev, &chandef);
3098                 if (ret == 0) {
3099                         if (nl80211_send_chandef(msg, &chandef))
3100                                 goto nla_put_failure;
3101                 }
3102         }
3103
3104         if (rdev->ops->get_tx_power) {
3105                 int dbm, ret;
3106
3107                 ret = rdev_get_tx_power(rdev, wdev, &dbm);
3108                 if (ret == 0 &&
3109                     nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
3110                                 DBM_TO_MBM(dbm)))
3111                         goto nla_put_failure;
3112         }
3113
3114         wdev_lock(wdev);
3115         switch (wdev->iftype) {
3116         case NL80211_IFTYPE_AP:
3117                 if (wdev->ssid_len &&
3118                     nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid))
3119                         goto nla_put_failure_locked;
3120                 break;
3121         case NL80211_IFTYPE_STATION:
3122         case NL80211_IFTYPE_P2P_CLIENT:
3123         case NL80211_IFTYPE_ADHOC: {
3124                 const u8 *ssid_ie;
3125                 if (!wdev->current_bss)
3126                         break;
3127                 rcu_read_lock();
3128                 ssid_ie = ieee80211_bss_get_ie(&wdev->current_bss->pub,
3129                                                WLAN_EID_SSID);
3130                 if (ssid_ie &&
3131                     nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2))
3132                         goto nla_put_failure_rcu_locked;
3133                 rcu_read_unlock();
3134                 break;
3135                 }
3136         default:
3137                 /* nothing */
3138                 break;
3139         }
3140         wdev_unlock(wdev);
3141
3142         if (rdev->ops->get_txq_stats) {
3143                 struct cfg80211_txq_stats txqstats = {};
3144                 int ret = rdev_get_txq_stats(rdev, wdev, &txqstats);
3145
3146                 if (ret == 0 &&
3147                     !nl80211_put_txq_stats(msg, &txqstats,
3148                                            NL80211_ATTR_TXQ_STATS))
3149                         goto nla_put_failure;
3150         }
3151
3152         genlmsg_end(msg, hdr);
3153         return 0;
3154
3155  nla_put_failure_rcu_locked:
3156         rcu_read_unlock();
3157  nla_put_failure_locked:
3158         wdev_unlock(wdev);
3159  nla_put_failure:
3160         genlmsg_cancel(msg, hdr);
3161         return -EMSGSIZE;
3162 }
3163
3164 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
3165 {
3166         int wp_idx = 0;
3167         int if_idx = 0;
3168         int wp_start = cb->args[0];
3169         int if_start = cb->args[1];
3170         int filter_wiphy = -1;
3171         struct cfg80211_registered_device *rdev;
3172         struct wireless_dev *wdev;
3173         int ret;
3174
3175         rtnl_lock();
3176         if (!cb->args[2]) {
3177                 struct nl80211_dump_wiphy_state state = {
3178                         .filter_wiphy = -1,
3179                 };
3180
3181                 ret = nl80211_dump_wiphy_parse(skb, cb, &state);
3182                 if (ret)
3183                         goto out_unlock;
3184
3185                 filter_wiphy = state.filter_wiphy;
3186
3187                 /*
3188                  * if filtering, set cb->args[2] to +1 since 0 is the default
3189                  * value needed to determine that parsing is necessary.
3190                  */
3191                 if (filter_wiphy >= 0)
3192                         cb->args[2] = filter_wiphy + 1;
3193                 else
3194                         cb->args[2] = -1;
3195         } else if (cb->args[2] > 0) {
3196                 filter_wiphy = cb->args[2] - 1;
3197         }
3198
3199         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
3200                 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
3201                         continue;
3202                 if (wp_idx < wp_start) {
3203                         wp_idx++;
3204                         continue;
3205                 }
3206
3207                 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx)
3208                         continue;
3209
3210                 if_idx = 0;
3211
3212                 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
3213                         if (if_idx < if_start) {
3214                                 if_idx++;
3215                                 continue;
3216                         }
3217                         if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid,
3218                                                cb->nlh->nlmsg_seq, NLM_F_MULTI,
3219                                                rdev, wdev,
3220                                                NL80211_CMD_NEW_INTERFACE) < 0) {
3221                                 goto out;
3222                         }
3223                         if_idx++;
3224                 }
3225
3226                 wp_idx++;
3227         }
3228  out:
3229         cb->args[0] = wp_idx;
3230         cb->args[1] = if_idx;
3231
3232         ret = skb->len;
3233  out_unlock:
3234         rtnl_unlock();
3235
3236         return ret;
3237 }
3238
3239 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
3240 {
3241         struct sk_buff *msg;
3242         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3243         struct wireless_dev *wdev = info->user_ptr[1];
3244
3245         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3246         if (!msg)
3247                 return -ENOMEM;
3248
3249         if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
3250                                rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) {
3251                 nlmsg_free(msg);
3252                 return -ENOBUFS;
3253         }
3254
3255         return genlmsg_reply(msg, info);
3256 }
3257
3258 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = {
3259         [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG },
3260         [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG },
3261         [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG },
3262         [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
3263         [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
3264         [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG },
3265 };
3266
3267 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
3268 {
3269         struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1];
3270         int flag;
3271
3272         *mntrflags = 0;
3273
3274         if (!nla)
3275                 return -EINVAL;
3276
3277         if (nla_parse_nested_deprecated(flags, NL80211_MNTR_FLAG_MAX, nla, mntr_flags_policy, NULL))
3278                 return -EINVAL;
3279
3280         for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
3281                 if (flags[flag])
3282                         *mntrflags |= (1<<flag);
3283
3284         *mntrflags |= MONITOR_FLAG_CHANGED;
3285
3286         return 0;
3287 }
3288
3289 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev,
3290                                      enum nl80211_iftype type,
3291                                      struct genl_info *info,
3292                                      struct vif_params *params)
3293 {
3294         bool change = false;
3295         int err;
3296
3297         if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
3298                 if (type != NL80211_IFTYPE_MONITOR)
3299                         return -EINVAL;
3300
3301                 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
3302                                           &params->flags);
3303                 if (err)
3304                         return err;
3305
3306                 change = true;
3307         }
3308
3309         if (params->flags & MONITOR_FLAG_ACTIVE &&
3310             !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
3311                 return -EOPNOTSUPP;
3312
3313         if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) {
3314                 const u8 *mumimo_groups;
3315                 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
3316
3317                 if (type != NL80211_IFTYPE_MONITOR)
3318                         return -EINVAL;
3319
3320                 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
3321                         return -EOPNOTSUPP;
3322
3323                 mumimo_groups =
3324                         nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]);
3325
3326                 /* bits 0 and 63 are reserved and must be zero */
3327                 if ((mumimo_groups[0] & BIT(0)) ||
3328                     (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7)))
3329                         return -EINVAL;
3330
3331                 params->vht_mumimo_groups = mumimo_groups;
3332                 change = true;
3333         }
3334
3335         if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) {
3336                 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
3337
3338                 if (type != NL80211_IFTYPE_MONITOR)
3339                         return -EINVAL;
3340
3341                 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
3342                         return -EOPNOTSUPP;
3343
3344                 params->vht_mumimo_follow_addr =
3345                         nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]);
3346                 change = true;
3347         }
3348
3349         return change ? 1 : 0;
3350 }
3351
3352 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev,
3353                                struct net_device *netdev, u8 use_4addr,
3354                                enum nl80211_iftype iftype)
3355 {
3356         if (!use_4addr) {
3357                 if (netdev && (netdev->priv_flags & IFF_BRIDGE_PORT))
3358                         return -EBUSY;
3359                 return 0;
3360         }
3361
3362         switch (iftype) {
3363         case NL80211_IFTYPE_AP_VLAN:
3364                 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP)
3365                         return 0;
3366                 break;
3367         case NL80211_IFTYPE_STATION:
3368                 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION)
3369                         return 0;
3370                 break;
3371         default:
3372                 break;
3373         }
3374
3375         return -EOPNOTSUPP;
3376 }
3377
3378 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
3379 {
3380         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3381         struct vif_params params;
3382         int err;
3383         enum nl80211_iftype otype, ntype;
3384         struct net_device *dev = info->user_ptr[1];
3385         bool change = false;
3386
3387         memset(&params, 0, sizeof(params));
3388
3389         otype = ntype = dev->ieee80211_ptr->iftype;
3390
3391         if (info->attrs[NL80211_ATTR_IFTYPE]) {
3392                 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
3393                 if (otype != ntype)
3394                         change = true;
3395         }
3396
3397         if (info->attrs[NL80211_ATTR_MESH_ID]) {
3398                 struct wireless_dev *wdev = dev->ieee80211_ptr;
3399
3400                 if (ntype != NL80211_IFTYPE_MESH_POINT)
3401                         return -EINVAL;
3402                 if (netif_running(dev))
3403                         return -EBUSY;
3404
3405                 wdev_lock(wdev);
3406                 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
3407                              IEEE80211_MAX_MESH_ID_LEN);
3408                 wdev->mesh_id_up_len =
3409                         nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
3410                 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
3411                        wdev->mesh_id_up_len);
3412                 wdev_unlock(wdev);
3413         }
3414
3415         if (info->attrs[NL80211_ATTR_4ADDR]) {
3416                 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
3417                 change = true;
3418                 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype);
3419                 if (err)
3420                         return err;
3421         } else {
3422                 params.use_4addr = -1;
3423         }
3424
3425         err = nl80211_parse_mon_options(rdev, ntype, info, &params);
3426         if (err < 0)
3427                 return err;
3428         if (err > 0)
3429                 change = true;
3430
3431         if (change)
3432                 err = cfg80211_change_iface(rdev, dev, ntype, &params);
3433         else
3434                 err = 0;
3435
3436         if (!err && params.use_4addr != -1)
3437                 dev->ieee80211_ptr->use_4addr = params.use_4addr;
3438
3439         if (change && !err) {
3440                 struct wireless_dev *wdev = dev->ieee80211_ptr;
3441
3442                 nl80211_notify_iface(rdev, wdev, NL80211_CMD_SET_INTERFACE);
3443         }
3444
3445         return err;
3446 }
3447
3448 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
3449 {
3450         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3451         struct vif_params params;
3452         struct wireless_dev *wdev;
3453         struct sk_buff *msg;
3454         int err;
3455         enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
3456
3457         /* to avoid failing a new interface creation due to pending removal */
3458         cfg80211_destroy_ifaces(rdev);
3459
3460         memset(&params, 0, sizeof(params));
3461
3462         if (!info->attrs[NL80211_ATTR_IFNAME])
3463                 return -EINVAL;
3464
3465         if (info->attrs[NL80211_ATTR_IFTYPE])
3466                 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
3467
3468         if (!rdev->ops->add_virtual_intf)
3469                 return -EOPNOTSUPP;
3470
3471         if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN ||
3472              rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) &&
3473             info->attrs[NL80211_ATTR_MAC]) {
3474                 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC],
3475                            ETH_ALEN);
3476                 if (!is_valid_ether_addr(params.macaddr))
3477                         return -EADDRNOTAVAIL;
3478         }
3479
3480         if (info->attrs[NL80211_ATTR_4ADDR]) {
3481                 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
3482                 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type);
3483                 if (err)
3484                         return err;
3485         }
3486
3487         if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0))
3488                 return -EOPNOTSUPP;
3489
3490         err = nl80211_parse_mon_options(rdev, type, info, &params);
3491         if (err < 0)
3492                 return err;
3493
3494         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3495         if (!msg)
3496                 return -ENOMEM;
3497
3498         wdev = rdev_add_virtual_intf(rdev,
3499                                 nla_data(info->attrs[NL80211_ATTR_IFNAME]),
3500                                 NET_NAME_USER, type, &params);
3501         if (WARN_ON(!wdev)) {
3502                 nlmsg_free(msg);
3503                 return -EPROTO;
3504         } else if (IS_ERR(wdev)) {
3505                 nlmsg_free(msg);
3506                 return PTR_ERR(wdev);
3507         }
3508
3509         if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
3510                 wdev->owner_nlportid = info->snd_portid;
3511
3512         switch (type) {
3513         case NL80211_IFTYPE_MESH_POINT:
3514                 if (!info->attrs[NL80211_ATTR_MESH_ID])
3515                         break;
3516                 wdev_lock(wdev);
3517                 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
3518                              IEEE80211_MAX_MESH_ID_LEN);
3519                 wdev->mesh_id_up_len =
3520                         nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
3521                 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
3522                        wdev->mesh_id_up_len);
3523                 wdev_unlock(wdev);
3524                 break;
3525         case NL80211_IFTYPE_NAN:
3526         case NL80211_IFTYPE_P2P_DEVICE:
3527                 /*
3528                  * P2P Device and NAN do not have a netdev, so don't go
3529                  * through the netdev notifier and must be added here
3530                  */
3531                 cfg80211_init_wdev(rdev, wdev);
3532                 break;
3533         default:
3534                 break;
3535         }
3536
3537         if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
3538                                rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) {
3539                 nlmsg_free(msg);
3540                 return -ENOBUFS;
3541         }
3542
3543         return genlmsg_reply(msg, info);
3544 }
3545
3546 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
3547 {
3548         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3549         struct wireless_dev *wdev = info->user_ptr[1];
3550
3551         if (!rdev->ops->del_virtual_intf)
3552                 return -EOPNOTSUPP;
3553
3554         /*
3555          * If we remove a wireless device without a netdev then clear
3556          * user_ptr[1] so that nl80211_post_doit won't dereference it
3557          * to check if it needs to do dev_put(). Otherwise it crashes
3558          * since the wdev has been freed, unlike with a netdev where
3559          * we need the dev_put() for the netdev to really be freed.
3560          */
3561         if (!wdev->netdev)
3562                 info->user_ptr[1] = NULL;
3563
3564         return rdev_del_virtual_intf(rdev, wdev);
3565 }
3566
3567 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info)
3568 {
3569         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3570         struct net_device *dev = info->user_ptr[1];
3571         u16 noack_map;
3572
3573         if (!info->attrs[NL80211_ATTR_NOACK_MAP])
3574                 return -EINVAL;
3575
3576         if (!rdev->ops->set_noack_map)
3577                 return -EOPNOTSUPP;
3578
3579         noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]);
3580
3581         return rdev_set_noack_map(rdev, dev, noack_map);
3582 }
3583
3584 struct get_key_cookie {
3585         struct sk_buff *msg;
3586         int error;
3587         int idx;
3588 };
3589
3590 static void get_key_callback(void *c, struct key_params *params)
3591 {
3592         struct nlattr *key;
3593         struct get_key_cookie *cookie = c;
3594
3595         if ((params->key &&
3596              nla_put(cookie->msg, NL80211_ATTR_KEY_DATA,
3597                      params->key_len, params->key)) ||
3598             (params->seq &&
3599              nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ,
3600                      params->seq_len, params->seq)) ||
3601             (params->cipher &&
3602              nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER,
3603                          params->cipher)))
3604                 goto nla_put_failure;
3605
3606         key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY);
3607         if (!key)
3608                 goto nla_put_failure;
3609
3610         if ((params->key &&
3611              nla_put(cookie->msg, NL80211_KEY_DATA,
3612                      params->key_len, params->key)) ||
3613             (params->seq &&
3614              nla_put(cookie->msg, NL80211_KEY_SEQ,
3615                      params->seq_len, params->seq)) ||
3616             (params->cipher &&
3617              nla_put_u32(cookie->msg, NL80211_KEY_CIPHER,
3618                          params->cipher)))
3619                 goto nla_put_failure;
3620
3621         if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx))
3622                 goto nla_put_failure;
3623
3624         nla_nest_end(cookie->msg, key);
3625
3626         return;
3627  nla_put_failure:
3628         cookie->error = 1;
3629 }
3630
3631 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
3632 {
3633         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3634         int err;
3635         struct net_device *dev = info->user_ptr[1];
3636         u8 key_idx = 0;
3637         const u8 *mac_addr = NULL;
3638         bool pairwise;
3639         struct get_key_cookie cookie = {
3640                 .error = 0,
3641         };
3642         void *hdr;
3643         struct sk_buff *msg;
3644
3645         if (info->attrs[NL80211_ATTR_KEY_IDX])
3646                 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
3647
3648         if (info->attrs[NL80211_ATTR_MAC])
3649                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3650
3651         pairwise = !!mac_addr;
3652         if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
3653                 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
3654
3655                 if (kt != NL80211_KEYTYPE_GROUP &&
3656                     kt != NL80211_KEYTYPE_PAIRWISE)
3657                         return -EINVAL;
3658                 pairwise = kt == NL80211_KEYTYPE_PAIRWISE;
3659         }
3660
3661         if (!rdev->ops->get_key)
3662                 return -EOPNOTSUPP;
3663
3664         if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
3665                 return -ENOENT;
3666
3667         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3668         if (!msg)
3669                 return -ENOMEM;
3670
3671         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
3672                              NL80211_CMD_NEW_KEY);
3673         if (!hdr)
3674                 goto nla_put_failure;
3675
3676         cookie.msg = msg;
3677         cookie.idx = key_idx;
3678
3679         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
3680             nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx))
3681                 goto nla_put_failure;
3682         if (mac_addr &&
3683             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
3684                 goto nla_put_failure;
3685
3686         err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie,
3687                            get_key_callback);
3688
3689         if (err)
3690                 goto free_msg;
3691
3692         if (cookie.error)
3693                 goto nla_put_failure;
3694
3695         genlmsg_end(msg, hdr);
3696         return genlmsg_reply(msg, info);
3697
3698  nla_put_failure:
3699         err = -ENOBUFS;
3700  free_msg:
3701         nlmsg_free(msg);
3702         return err;
3703 }
3704
3705 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
3706 {
3707         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3708         struct key_parse key;
3709         int err;
3710         struct net_device *dev = info->user_ptr[1];
3711
3712         err = nl80211_parse_key(info, &key);
3713         if (err)
3714                 return err;
3715
3716         if (key.idx < 0)
3717                 return -EINVAL;
3718
3719         /* Only support setting default key and
3720          * Extended Key ID action NL80211_KEY_SET_TX.
3721          */
3722         if (!key.def && !key.defmgmt &&
3723             !(key.p.mode == NL80211_KEY_SET_TX))
3724                 return -EINVAL;
3725
3726         wdev_lock(dev->ieee80211_ptr);
3727
3728         if (key.def) {
3729                 if (!rdev->ops->set_default_key) {
3730                         err = -EOPNOTSUPP;
3731                         goto out;
3732                 }
3733
3734                 err = nl80211_key_allowed(dev->ieee80211_ptr);
3735                 if (err)
3736                         goto out;
3737
3738                 err = rdev_set_default_key(rdev, dev, key.idx,
3739                                                  key.def_uni, key.def_multi);
3740
3741                 if (err)
3742                         goto out;
3743
3744 #ifdef CONFIG_CFG80211_WEXT
3745                 dev->ieee80211_ptr->wext.default_key = key.idx;
3746 #endif
3747         } else if (key.defmgmt) {
3748                 if (key.def_uni || !key.def_multi) {
3749                         err = -EINVAL;
3750                         goto out;
3751                 }
3752
3753                 if (!rdev->ops->set_default_mgmt_key) {
3754                         err = -EOPNOTSUPP;
3755                         goto out;
3756                 }
3757
3758                 err = nl80211_key_allowed(dev->ieee80211_ptr);
3759                 if (err)
3760                         goto out;
3761
3762                 err = rdev_set_default_mgmt_key(rdev, dev, key.idx);
3763                 if (err)
3764                         goto out;
3765
3766 #ifdef CONFIG_CFG80211_WEXT
3767                 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx;
3768 #endif
3769         } else if (key.p.mode == NL80211_KEY_SET_TX &&
3770                    wiphy_ext_feature_isset(&rdev->wiphy,
3771                                            NL80211_EXT_FEATURE_EXT_KEY_ID)) {
3772                 u8 *mac_addr = NULL;
3773
3774                 if (info->attrs[NL80211_ATTR_MAC])
3775                         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3776
3777                 if (!mac_addr || key.idx < 0 || key.idx > 1) {
3778                         err = -EINVAL;
3779                         goto out;
3780                 }
3781
3782                 err = rdev_add_key(rdev, dev, key.idx,
3783                                    NL80211_KEYTYPE_PAIRWISE,
3784                                    mac_addr, &key.p);
3785         } else {
3786                 err = -EINVAL;
3787         }
3788  out:
3789         wdev_unlock(dev->ieee80211_ptr);
3790
3791         return err;
3792 }
3793
3794 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
3795 {
3796         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3797         int err;
3798         struct net_device *dev = info->user_ptr[1];
3799         struct key_parse key;
3800         const u8 *mac_addr = NULL;
3801
3802         err = nl80211_parse_key(info, &key);
3803         if (err)
3804                 return err;
3805
3806         if (!key.p.key)
3807                 return -EINVAL;
3808
3809         if (info->attrs[NL80211_ATTR_MAC])
3810                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3811
3812         if (key.type == -1) {
3813                 if (mac_addr)
3814                         key.type = NL80211_KEYTYPE_PAIRWISE;
3815                 else
3816                         key.type = NL80211_KEYTYPE_GROUP;
3817         }
3818
3819         /* for now */
3820         if (key.type != NL80211_KEYTYPE_PAIRWISE &&
3821             key.type != NL80211_KEYTYPE_GROUP)
3822                 return -EINVAL;
3823
3824         if (!rdev->ops->add_key)
3825                 return -EOPNOTSUPP;
3826
3827         if (cfg80211_validate_key_settings(rdev, &key.p, key.idx,
3828                                            key.type == NL80211_KEYTYPE_PAIRWISE,
3829                                            mac_addr))
3830                 return -EINVAL;
3831
3832         wdev_lock(dev->ieee80211_ptr);
3833         err = nl80211_key_allowed(dev->ieee80211_ptr);
3834         if (!err)
3835                 err = rdev_add_key(rdev, dev, key.idx,
3836                                    key.type == NL80211_KEYTYPE_PAIRWISE,
3837                                     mac_addr, &key.p);
3838         wdev_unlock(dev->ieee80211_ptr);
3839
3840         return err;
3841 }
3842
3843 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
3844 {
3845         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3846         int err;
3847         struct net_device *dev = info->user_ptr[1];
3848         u8 *mac_addr = NULL;
3849         struct key_parse key;
3850
3851         err = nl80211_parse_key(info, &key);
3852         if (err)
3853                 return err;
3854
3855         if (info->attrs[NL80211_ATTR_MAC])
3856                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3857
3858         if (key.type == -1) {
3859                 if (mac_addr)
3860                         key.type = NL80211_KEYTYPE_PAIRWISE;
3861                 else
3862                         key.type = NL80211_KEYTYPE_GROUP;
3863         }
3864
3865         /* for now */
3866         if (key.type != NL80211_KEYTYPE_PAIRWISE &&
3867             key.type != NL80211_KEYTYPE_GROUP)
3868                 return -EINVAL;
3869
3870         if (!rdev->ops->del_key)
3871                 return -EOPNOTSUPP;
3872
3873         wdev_lock(dev->ieee80211_ptr);
3874         err = nl80211_key_allowed(dev->ieee80211_ptr);
3875
3876         if (key.type == NL80211_KEYTYPE_GROUP && mac_addr &&
3877             !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
3878                 err = -ENOENT;
3879
3880         if (!err)
3881                 err = rdev_del_key(rdev, dev, key.idx,
3882                                    key.type == NL80211_KEYTYPE_PAIRWISE,
3883                                    mac_addr);
3884
3885 #ifdef CONFIG_CFG80211_WEXT
3886         if (!err) {
3887                 if (key.idx == dev->ieee80211_ptr->wext.default_key)
3888                         dev->ieee80211_ptr->wext.default_key = -1;
3889                 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key)
3890                         dev->ieee80211_ptr->wext.default_mgmt_key = -1;
3891         }
3892 #endif
3893         wdev_unlock(dev->ieee80211_ptr);
3894
3895         return err;
3896 }
3897
3898 /* This function returns an error or the number of nested attributes */
3899 static int validate_acl_mac_addrs(struct nlattr *nl_attr)
3900 {
3901         struct nlattr *attr;
3902         int n_entries = 0, tmp;
3903
3904         nla_for_each_nested(attr, nl_attr, tmp) {
3905                 if (nla_len(attr) != ETH_ALEN)
3906                         return -EINVAL;
3907
3908                 n_entries++;
3909         }
3910
3911         return n_entries;
3912 }
3913
3914 /*
3915  * This function parses ACL information and allocates memory for ACL data.
3916  * On successful return, the calling function is responsible to free the
3917  * ACL buffer returned by this function.
3918  */
3919 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy,
3920                                                 struct genl_info *info)
3921 {
3922         enum nl80211_acl_policy acl_policy;
3923         struct nlattr *attr;
3924         struct cfg80211_acl_data *acl;
3925         int i = 0, n_entries, tmp;
3926
3927         if (!wiphy->max_acl_mac_addrs)
3928                 return ERR_PTR(-EOPNOTSUPP);
3929
3930         if (!info->attrs[NL80211_ATTR_ACL_POLICY])
3931                 return ERR_PTR(-EINVAL);
3932
3933         acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]);
3934         if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED &&
3935             acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED)
3936                 return ERR_PTR(-EINVAL);
3937
3938         if (!info->attrs[NL80211_ATTR_MAC_ADDRS])
3939                 return ERR_PTR(-EINVAL);
3940
3941         n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]);
3942         if (n_entries < 0)
3943                 return ERR_PTR(n_entries);
3944
3945         if (n_entries > wiphy->max_acl_mac_addrs)
3946                 return ERR_PTR(-ENOTSUPP);
3947
3948         acl = kzalloc(struct_size(acl, mac_addrs, n_entries), GFP_KERNEL);
3949         if (!acl)
3950                 return ERR_PTR(-ENOMEM);
3951
3952         nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) {
3953                 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN);
3954                 i++;
3955         }
3956
3957         acl->n_acl_entries = n_entries;
3958         acl->acl_policy = acl_policy;
3959
3960         return acl;
3961 }
3962
3963 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info)
3964 {
3965         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3966         struct net_device *dev = info->user_ptr[1];
3967         struct cfg80211_acl_data *acl;
3968         int err;
3969
3970         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3971             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3972                 return -EOPNOTSUPP;
3973
3974         if (!dev->ieee80211_ptr->beacon_interval)
3975                 return -EINVAL;
3976
3977         acl = parse_acl_data(&rdev->wiphy, info);
3978         if (IS_ERR(acl))
3979                 return PTR_ERR(acl);
3980
3981         err = rdev_set_mac_acl(rdev, dev, acl);
3982
3983         kfree(acl);
3984
3985         return err;
3986 }
3987
3988 static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
3989                            u8 *rates, u8 rates_len)
3990 {
3991         u8 i;
3992         u32 mask = 0;
3993
3994         for (i = 0; i < rates_len; i++) {
3995                 int rate = (rates[i] & 0x7f) * 5;
3996                 int ridx;
3997
3998                 for (ridx = 0; ridx < sband->n_bitrates; ridx++) {
3999                         struct ieee80211_rate *srate =
4000                                 &sband->bitrates[ridx];
4001                         if (rate == srate->bitrate) {
4002                                 mask |= 1 << ridx;
4003                                 break;
4004                         }
4005                 }
4006                 if (ridx == sband->n_bitrates)
4007                         return 0; /* rate not found */
4008         }
4009
4010         return mask;
4011 }
4012
4013 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband,
4014                                u8 *rates, u8 rates_len,
4015                                u8 mcs[IEEE80211_HT_MCS_MASK_LEN])
4016 {
4017         u8 i;
4018
4019         memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN);
4020
4021         for (i = 0; i < rates_len; i++) {
4022                 int ridx, rbit;
4023
4024                 ridx = rates[i] / 8;
4025                 rbit = BIT(rates[i] % 8);
4026
4027                 /* check validity */
4028                 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN))
4029                         return false;
4030
4031                 /* check availability */
4032                 ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN);
4033                 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit)
4034                         mcs[ridx] |= rbit;
4035                 else
4036                         return false;
4037         }
4038
4039         return true;
4040 }
4041
4042 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map)
4043 {
4044         u16 mcs_mask = 0;
4045
4046         switch (vht_mcs_map) {
4047         case IEEE80211_VHT_MCS_NOT_SUPPORTED:
4048                 break;
4049         case IEEE80211_VHT_MCS_SUPPORT_0_7:
4050                 mcs_mask = 0x00FF;
4051                 break;
4052         case IEEE80211_VHT_MCS_SUPPORT_0_8:
4053                 mcs_mask = 0x01FF;
4054                 break;
4055         case IEEE80211_VHT_MCS_SUPPORT_0_9:
4056                 mcs_mask = 0x03FF;
4057                 break;
4058         default:
4059                 break;
4060         }
4061
4062         return mcs_mask;
4063 }
4064
4065 static void vht_build_mcs_mask(u16 vht_mcs_map,
4066                                u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
4067 {
4068         u8 nss;
4069
4070         for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
4071                 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03);
4072                 vht_mcs_map >>= 2;
4073         }
4074 }
4075
4076 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband,
4077                              struct nl80211_txrate_vht *txrate,
4078                              u16 mcs[NL80211_VHT_NSS_MAX])
4079 {
4080         u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
4081         u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {};
4082         u8 i;
4083
4084         if (!sband->vht_cap.vht_supported)
4085                 return false;
4086
4087         memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX);
4088
4089         /* Build vht_mcs_mask from VHT capabilities */
4090         vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask);
4091
4092         for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
4093                 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
4094                         mcs[i] = txrate->mcs[i];
4095                 else
4096                         return false;
4097         }
4098
4099         return true;
4100 }
4101
4102 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
4103         [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY,
4104                                     .len = NL80211_MAX_SUPP_RATES },
4105         [NL80211_TXRATE_HT] = { .type = NLA_BINARY,
4106                                 .len = NL80211_MAX_SUPP_HT_RATES },
4107         [NL80211_TXRATE_VHT] = {
4108                 .type = NLA_EXACT_LEN_WARN,
4109                 .len = sizeof(struct nl80211_txrate_vht),
4110         },
4111         [NL80211_TXRATE_GI] = { .type = NLA_U8 },
4112 };
4113
4114 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
4115                                          struct cfg80211_bitrate_mask *mask)
4116 {
4117         struct nlattr *tb[NL80211_TXRATE_MAX + 1];
4118         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4119         int rem, i;
4120         struct nlattr *tx_rates;
4121         struct ieee80211_supported_band *sband;
4122         u16 vht_tx_mcs_map;
4123
4124         memset(mask, 0, sizeof(*mask));
4125         /* Default to all rates enabled */
4126         for (i = 0; i < NUM_NL80211_BANDS; i++) {
4127                 sband = rdev->wiphy.bands[i];
4128
4129                 if (!sband)
4130                         continue;
4131
4132                 mask->control[i].legacy = (1 << sband->n_bitrates) - 1;
4133                 memcpy(mask->control[i].ht_mcs,
4134                        sband->ht_cap.mcs.rx_mask,
4135                        sizeof(mask->control[i].ht_mcs));
4136
4137                 if (!sband->vht_cap.vht_supported)
4138                         continue;
4139
4140                 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
4141                 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs);
4142         }
4143
4144         /* if no rates are given set it back to the defaults */
4145         if (!info->attrs[NL80211_ATTR_TX_RATES])
4146                 goto out;
4147
4148         /* The nested attribute uses enum nl80211_band as the index. This maps
4149          * directly to the enum nl80211_band values used in cfg80211.
4150          */
4151         BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
4152         nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem) {
4153                 enum nl80211_band band = nla_type(tx_rates);
4154                 int err;
4155
4156                 if (band < 0 || band >= NUM_NL80211_BANDS)
4157                         return -EINVAL;
4158                 sband = rdev->wiphy.bands[band];
4159                 if (sband == NULL)
4160                         return -EINVAL;
4161                 err = nla_parse_nested_deprecated(tb, NL80211_TXRATE_MAX,
4162                                                   tx_rates,
4163                                                   nl80211_txattr_policy,
4164                                                   info->extack);
4165                 if (err)
4166                         return err;
4167                 if (tb[NL80211_TXRATE_LEGACY]) {
4168                         mask->control[band].legacy = rateset_to_mask(
4169                                 sband,
4170                                 nla_data(tb[NL80211_TXRATE_LEGACY]),
4171                                 nla_len(tb[NL80211_TXRATE_LEGACY]));
4172                         if ((mask->control[band].legacy == 0) &&
4173                             nla_len(tb[NL80211_TXRATE_LEGACY]))
4174                                 return -EINVAL;
4175                 }
4176                 if (tb[NL80211_TXRATE_HT]) {
4177                         if (!ht_rateset_to_mask(
4178                                         sband,
4179                                         nla_data(tb[NL80211_TXRATE_HT]),
4180                                         nla_len(tb[NL80211_TXRATE_HT]),
4181                                         mask->control[band].ht_mcs))
4182                                 return -EINVAL;
4183                 }
4184                 if (tb[NL80211_TXRATE_VHT]) {
4185                         if (!vht_set_mcs_mask(
4186                                         sband,
4187                                         nla_data(tb[NL80211_TXRATE_VHT]),
4188                                         mask->control[band].vht_mcs))
4189                                 return -EINVAL;
4190                 }
4191                 if (tb[NL80211_TXRATE_GI]) {
4192                         mask->control[band].gi =
4193                                 nla_get_u8(tb[NL80211_TXRATE_GI]);
4194                         if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI)
4195                                 return -EINVAL;
4196                 }
4197
4198                 if (mask->control[band].legacy == 0) {
4199                         /* don't allow empty legacy rates if HT or VHT
4200                          * are not even supported.
4201                          */
4202                         if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported ||
4203                               rdev->wiphy.bands[band]->vht_cap.vht_supported))
4204                                 return -EINVAL;
4205
4206                         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
4207                                 if (mask->control[band].ht_mcs[i])
4208                                         goto out;
4209
4210                         for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
4211                                 if (mask->control[band].vht_mcs[i])
4212                                         goto out;
4213
4214                         /* legacy and mcs rates may not be both empty */
4215                         return -EINVAL;
4216                 }
4217         }
4218
4219 out:
4220         return 0;
4221 }
4222
4223 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev,
4224                                    enum nl80211_band band,
4225                                    struct cfg80211_bitrate_mask *beacon_rate)
4226 {
4227         u32 count_ht, count_vht, i;
4228         u32 rate = beacon_rate->control[band].legacy;
4229
4230         /* Allow only one rate */
4231         if (hweight32(rate) > 1)
4232                 return -EINVAL;
4233
4234         count_ht = 0;
4235         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
4236                 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) {
4237                         return -EINVAL;
4238                 } else if (beacon_rate->control[band].ht_mcs[i]) {
4239                         count_ht++;
4240                         if (count_ht > 1)
4241                                 return -EINVAL;
4242                 }
4243                 if (count_ht && rate)
4244                         return -EINVAL;
4245         }
4246
4247         count_vht = 0;
4248         for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
4249                 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) {
4250                         return -EINVAL;
4251                 } else if (beacon_rate->control[band].vht_mcs[i]) {
4252                         count_vht++;
4253                         if (count_vht > 1)
4254                                 return -EINVAL;
4255                 }
4256                 if (count_vht && rate)
4257                         return -EINVAL;
4258         }
4259
4260         if ((count_ht && count_vht) || (!rate && !count_ht && !count_vht))
4261                 return -EINVAL;
4262
4263         if (rate &&
4264             !wiphy_ext_feature_isset(&rdev->wiphy,
4265                                      NL80211_EXT_FEATURE_BEACON_RATE_LEGACY))
4266                 return -EINVAL;
4267         if (count_ht &&
4268             !wiphy_ext_feature_isset(&rdev->wiphy,
4269                                      NL80211_EXT_FEATURE_BEACON_RATE_HT))
4270                 return -EINVAL;
4271         if (count_vht &&
4272             !wiphy_ext_feature_isset(&rdev->wiphy,
4273                                      NL80211_EXT_FEATURE_BEACON_RATE_VHT))
4274                 return -EINVAL;
4275
4276         return 0;
4277 }
4278
4279 static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev,
4280                                 struct nlattr *attrs[],
4281                                 struct cfg80211_beacon_data *bcn)
4282 {
4283         bool haveinfo = false;
4284         int err;
4285
4286         memset(bcn, 0, sizeof(*bcn));
4287
4288         if (attrs[NL80211_ATTR_BEACON_HEAD]) {
4289                 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]);
4290                 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]);
4291                 if (!bcn->head_len)
4292                         return -EINVAL;
4293                 haveinfo = true;
4294         }
4295
4296         if (attrs[NL80211_ATTR_BEACON_TAIL]) {
4297                 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]);
4298                 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]);
4299                 haveinfo = true;
4300         }
4301
4302         if (!haveinfo)
4303                 return -EINVAL;
4304
4305         if (attrs[NL80211_ATTR_IE]) {
4306                 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]);
4307                 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]);
4308         }
4309
4310         if (attrs[NL80211_ATTR_IE_PROBE_RESP]) {
4311                 bcn->proberesp_ies =
4312                         nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]);
4313                 bcn->proberesp_ies_len =
4314                         nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]);
4315         }
4316
4317         if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) {
4318                 bcn->assocresp_ies =
4319                         nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
4320                 bcn->assocresp_ies_len =
4321                         nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
4322         }
4323
4324         if (attrs[NL80211_ATTR_PROBE_RESP]) {
4325                 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]);
4326                 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]);
4327         }
4328
4329         if (attrs[NL80211_ATTR_FTM_RESPONDER]) {
4330                 struct nlattr *tb[NL80211_FTM_RESP_ATTR_MAX + 1];
4331
4332                 err = nla_parse_nested_deprecated(tb,
4333                                                   NL80211_FTM_RESP_ATTR_MAX,
4334                                                   attrs[NL80211_ATTR_FTM_RESPONDER],
4335                                                   NULL, NULL);
4336                 if (err)
4337                         return err;
4338
4339                 if (tb[NL80211_FTM_RESP_ATTR_ENABLED] &&
4340                     wiphy_ext_feature_isset(&rdev->wiphy,
4341                                             NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER))
4342                         bcn->ftm_responder = 1;
4343                 else
4344                         return -EOPNOTSUPP;
4345
4346                 if (tb[NL80211_FTM_RESP_ATTR_LCI]) {
4347                         bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]);
4348                         bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]);
4349                 }
4350
4351                 if (tb[NL80211_FTM_RESP_ATTR_CIVICLOC]) {
4352                         bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]);
4353                         bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]);
4354                 }
4355         } else {
4356                 bcn->ftm_responder = -1;
4357         }
4358
4359         return 0;
4360 }
4361
4362 static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params,
4363                                             const u8 *rates)
4364 {
4365         int i;
4366
4367         if (!rates)
4368                 return;
4369
4370         for (i = 0; i < rates[1]; i++) {
4371                 if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
4372                         params->ht_required = true;
4373                 if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY)
4374                         params->vht_required = true;
4375         }
4376 }
4377
4378 /*
4379  * Since the nl80211 API didn't include, from the beginning, attributes about
4380  * HT/VHT requirements/capabilities, we parse them out of the IEs for the
4381  * benefit of drivers that rebuild IEs in the firmware.
4382  */
4383 static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params)
4384 {
4385         const struct cfg80211_beacon_data *bcn = &params->beacon;
4386         size_t ies_len = bcn->tail_len;
4387         const u8 *ies = bcn->tail;
4388         const u8 *rates;
4389         const u8 *cap;
4390
4391         rates = cfg80211_find_ie(WLAN_EID_SUPP_RATES, ies, ies_len);
4392         nl80211_check_ap_rate_selectors(params, rates);
4393
4394         rates = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, ies, ies_len);
4395         nl80211_check_ap_rate_selectors(params, rates);
4396
4397         cap = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, ies, ies_len);
4398         if (cap && cap[1] >= sizeof(*params->ht_cap))
4399                 params->ht_cap = (void *)(cap + 2);
4400         cap = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, ies, ies_len);
4401         if (cap && cap[1] >= sizeof(*params->vht_cap))
4402                 params->vht_cap = (void *)(cap + 2);
4403         cap = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_CAPABILITY, ies, ies_len);
4404         if (cap && cap[1] >= sizeof(*params->he_cap) + 1)
4405                 params->he_cap = (void *)(cap + 3);
4406 }
4407
4408 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
4409                                    struct cfg80211_ap_settings *params)
4410 {
4411         struct wireless_dev *wdev;
4412         bool ret = false;
4413
4414         list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
4415                 if (wdev->iftype != NL80211_IFTYPE_AP &&
4416                     wdev->iftype != NL80211_IFTYPE_P2P_GO)
4417                         continue;
4418
4419                 if (!wdev->preset_chandef.chan)
4420                         continue;
4421
4422                 params->chandef = wdev->preset_chandef;
4423                 ret = true;
4424                 break;
4425         }
4426
4427         return ret;
4428 }
4429
4430 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
4431                                     enum nl80211_auth_type auth_type,
4432                                     enum nl80211_commands cmd)
4433 {
4434         if (auth_type > NL80211_AUTHTYPE_MAX)
4435                 return false;
4436
4437         switch (cmd) {
4438         case NL80211_CMD_AUTHENTICATE:
4439                 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
4440                     auth_type == NL80211_AUTHTYPE_SAE)
4441                         return false;
4442                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
4443                                              NL80211_EXT_FEATURE_FILS_STA) &&
4444                     (auth_type == NL80211_AUTHTYPE_FILS_SK ||
4445                      auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
4446                      auth_type == NL80211_AUTHTYPE_FILS_PK))
4447                         return false;
4448                 return true;
4449         case NL80211_CMD_CONNECT:
4450                 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
4451                     !wiphy_ext_feature_isset(&rdev->wiphy,
4452                                              NL80211_EXT_FEATURE_SAE_OFFLOAD) &&
4453                     auth_type == NL80211_AUTHTYPE_SAE)
4454                         return false;
4455
4456                 /* FILS with SK PFS or PK not supported yet */
4457                 if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
4458                     auth_type == NL80211_AUTHTYPE_FILS_PK)
4459                         return false;
4460                 if (!wiphy_ext_feature_isset(
4461                             &rdev->wiphy,
4462                             NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
4463                     auth_type == NL80211_AUTHTYPE_FILS_SK)
4464                         return false;
4465                 return true;
4466         case NL80211_CMD_START_AP:
4467                 /* SAE not supported yet */
4468                 if (auth_type == NL80211_AUTHTYPE_SAE)
4469                         return false;
4470                 /* FILS not supported yet */
4471                 if (auth_type == NL80211_AUTHTYPE_FILS_SK ||
4472                     auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
4473                     auth_type == NL80211_AUTHTYPE_FILS_PK)
4474                         return false;
4475                 return true;
4476         default:
4477                 return false;
4478         }
4479 }
4480
4481 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
4482 {
4483         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4484         struct net_device *dev = info->user_ptr[1];
4485         struct wireless_dev *wdev = dev->ieee80211_ptr;
4486         struct cfg80211_ap_settings params;
4487         int err;
4488
4489         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
4490             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4491                 return -EOPNOTSUPP;
4492
4493         if (!rdev->ops->start_ap)
4494                 return -EOPNOTSUPP;
4495
4496         if (wdev->beacon_interval)
4497                 return -EALREADY;
4498
4499         memset(&params, 0, sizeof(params));
4500
4501         /* these are required for START_AP */
4502         if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
4503             !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
4504             !info->attrs[NL80211_ATTR_BEACON_HEAD])
4505                 return -EINVAL;
4506
4507         err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon);
4508         if (err)
4509                 return err;
4510
4511         params.beacon_interval =
4512                 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
4513         params.dtim_period =
4514                 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
4515
4516         err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype,
4517                                            params.beacon_interval);
4518         if (err)
4519                 return err;
4520
4521         /*
4522          * In theory, some of these attributes should be required here
4523          * but since they were not used when the command was originally
4524          * added, keep them optional for old user space programs to let
4525          * them continue to work with drivers that do not need the
4526          * additional information -- drivers must check!
4527          */
4528         if (info->attrs[NL80211_ATTR_SSID]) {
4529                 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
4530                 params.ssid_len =
4531                         nla_len(info->attrs[NL80211_ATTR_SSID]);
4532                 if (params.ssid_len == 0 ||
4533                     params.ssid_len > IEEE80211_MAX_SSID_LEN)
4534                         return -EINVAL;
4535         }
4536
4537         if (info->attrs[NL80211_ATTR_HIDDEN_SSID])
4538                 params.hidden_ssid = nla_get_u32(
4539                         info->attrs[NL80211_ATTR_HIDDEN_SSID]);
4540
4541         params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
4542
4543         if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
4544                 params.auth_type = nla_get_u32(
4545                         info->attrs[NL80211_ATTR_AUTH_TYPE]);
4546                 if (!nl80211_valid_auth_type(rdev, params.auth_type,
4547                                              NL80211_CMD_START_AP))
4548                         return -EINVAL;
4549         } else
4550                 params.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
4551
4552         err = nl80211_crypto_settings(rdev, info, &params.crypto,
4553                                       NL80211_MAX_NR_CIPHER_SUITES);
4554         if (err)
4555                 return err;
4556
4557         if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) {
4558                 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER))
4559                         return -EOPNOTSUPP;
4560                 params.inactivity_timeout = nla_get_u16(
4561                         info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]);
4562         }
4563
4564         if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
4565                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4566                         return -EINVAL;
4567                 params.p2p_ctwindow =
4568                         nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
4569                 if (params.p2p_ctwindow != 0 &&
4570                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
4571                         return -EINVAL;
4572         }
4573
4574         if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
4575                 u8 tmp;
4576
4577                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4578                         return -EINVAL;
4579                 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
4580                 params.p2p_opp_ps = tmp;
4581                 if (params.p2p_opp_ps != 0 &&
4582                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
4583                         return -EINVAL;
4584         }
4585
4586         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
4587                 err = nl80211_parse_chandef(rdev, info, &params.chandef);
4588                 if (err)
4589                         return err;
4590         } else if (wdev->preset_chandef.chan) {
4591                 params.chandef = wdev->preset_chandef;
4592         } else if (!nl80211_get_ap_channel(rdev, &params))
4593                 return -EINVAL;
4594
4595         if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef,
4596                                            wdev->iftype))
4597                 return -EINVAL;
4598
4599         if (info->attrs[NL80211_ATTR_TX_RATES]) {
4600                 err = nl80211_parse_tx_bitrate_mask(info, &params.beacon_rate);
4601                 if (err)
4602                         return err;
4603
4604                 err = validate_beacon_tx_rate(rdev, params.chandef.chan->band,
4605                                               &params.beacon_rate);
4606                 if (err)
4607                         return err;
4608         }
4609
4610         if (info->attrs[NL80211_ATTR_SMPS_MODE]) {
4611                 params.smps_mode =
4612                         nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]);
4613                 switch (params.smps_mode) {
4614                 case NL80211_SMPS_OFF:
4615                         break;
4616                 case NL80211_SMPS_STATIC:
4617                         if (!(rdev->wiphy.features &
4618                               NL80211_FEATURE_STATIC_SMPS))
4619                                 return -EINVAL;
4620                         break;
4621                 case NL80211_SMPS_DYNAMIC:
4622                         if (!(rdev->wiphy.features &
4623                               NL80211_FEATURE_DYNAMIC_SMPS))
4624                                 return -EINVAL;
4625                         break;
4626                 default:
4627                         return -EINVAL;
4628                 }
4629         } else {
4630                 params.smps_mode = NL80211_SMPS_OFF;
4631         }
4632
4633         params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
4634         if (params.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ])
4635                 return -EOPNOTSUPP;
4636
4637         if (info->attrs[NL80211_ATTR_ACL_POLICY]) {
4638                 params.acl = parse_acl_data(&rdev->wiphy, info);
4639                 if (IS_ERR(params.acl))
4640                         return PTR_ERR(params.acl);
4641         }
4642
4643         params.twt_responder =
4644                     nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]);
4645
4646         nl80211_calculate_ap_params(&params);
4647
4648         if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])
4649                 params.flags |= AP_SETTINGS_EXTERNAL_AUTH_SUPPORT;
4650
4651         wdev_lock(wdev);
4652         err = rdev_start_ap(rdev, dev, &params);
4653         if (!err) {
4654                 wdev->preset_chandef = params.chandef;
4655                 wdev->beacon_interval = params.beacon_interval;
4656                 wdev->chandef = params.chandef;
4657                 wdev->ssid_len = params.ssid_len;
4658                 memcpy(wdev->ssid, params.ssid, wdev->ssid_len);
4659
4660                 if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
4661                         wdev->conn_owner_nlportid = info->snd_portid;
4662         }
4663         wdev_unlock(wdev);
4664
4665         kfree(params.acl);
4666
4667         return err;
4668 }
4669
4670 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
4671 {
4672         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4673         struct net_device *dev = info->user_ptr[1];
4674         struct wireless_dev *wdev = dev->ieee80211_ptr;
4675         struct cfg80211_beacon_data params;
4676         int err;
4677
4678         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
4679             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4680                 return -EOPNOTSUPP;
4681
4682         if (!rdev->ops->change_beacon)
4683                 return -EOPNOTSUPP;
4684
4685         if (!wdev->beacon_interval)
4686                 return -EINVAL;
4687
4688         err = nl80211_parse_beacon(rdev, info->attrs, &params);
4689         if (err)
4690                 return err;
4691
4692         wdev_lock(wdev);
4693         err = rdev_change_beacon(rdev, dev, &params);
4694         wdev_unlock(wdev);
4695
4696         return err;
4697 }
4698
4699 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info)
4700 {
4701         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4702         struct net_device *dev = info->user_ptr[1];
4703
4704         return cfg80211_stop_ap(rdev, dev, false);
4705 }
4706
4707 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
4708         [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG },
4709         [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
4710         [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
4711         [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
4712         [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG },
4713         [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG },
4714 };
4715
4716 static int parse_station_flags(struct genl_info *info,
4717                                enum nl80211_iftype iftype,
4718                                struct station_parameters *params)
4719 {
4720         struct nlattr *flags[NL80211_STA_FLAG_MAX + 1];
4721         struct nlattr *nla;
4722         int flag;
4723
4724         /*
4725          * Try parsing the new attribute first so userspace
4726          * can specify both for older kernels.
4727          */
4728         nla = info->attrs[NL80211_ATTR_STA_FLAGS2];
4729         if (nla) {
4730                 struct nl80211_sta_flag_update *sta_flags;
4731
4732                 sta_flags = nla_data(nla);
4733                 params->sta_flags_mask = sta_flags->mask;
4734                 params->sta_flags_set = sta_flags->set;
4735                 params->sta_flags_set &= params->sta_flags_mask;
4736                 if ((params->sta_flags_mask |
4737                      params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID))
4738                         return -EINVAL;
4739                 return 0;
4740         }
4741
4742         /* if present, parse the old attribute */
4743
4744         nla = info->attrs[NL80211_ATTR_STA_FLAGS];
4745         if (!nla)
4746                 return 0;
4747
4748         if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack))
4749                 return -EINVAL;
4750
4751         /*
4752          * Only allow certain flags for interface types so that
4753          * other attributes are silently ignored. Remember that
4754          * this is backward compatibility code with old userspace
4755          * and shouldn't be hit in other cases anyway.
4756          */
4757         switch (iftype) {
4758         case NL80211_IFTYPE_AP:
4759         case NL80211_IFTYPE_AP_VLAN:
4760         case NL80211_IFTYPE_P2P_GO:
4761                 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
4762                                          BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
4763                                          BIT(NL80211_STA_FLAG_WME) |
4764                                          BIT(NL80211_STA_FLAG_MFP);
4765                 break;
4766         case NL80211_IFTYPE_P2P_CLIENT:
4767         case NL80211_IFTYPE_STATION:
4768                 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
4769                                          BIT(NL80211_STA_FLAG_TDLS_PEER);
4770                 break;
4771         case NL80211_IFTYPE_MESH_POINT:
4772                 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4773                                          BIT(NL80211_STA_FLAG_MFP) |
4774                                          BIT(NL80211_STA_FLAG_AUTHORIZED);
4775                 break;
4776         default:
4777                 return -EINVAL;
4778         }
4779
4780         for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) {
4781                 if (flags[flag]) {
4782                         params->sta_flags_set |= (1<<flag);
4783
4784                         /* no longer support new API additions in old API */
4785                         if (flag > NL80211_STA_FLAG_MAX_OLD_API)
4786                                 return -EINVAL;
4787                 }
4788         }
4789
4790         return 0;
4791 }
4792
4793 bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, int attr)
4794 {
4795         struct nlattr *rate;
4796         u32 bitrate;
4797         u16 bitrate_compat;
4798         enum nl80211_rate_info rate_flg;
4799
4800         rate = nla_nest_start_noflag(msg, attr);
4801         if (!rate)
4802                 return false;
4803
4804         /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
4805         bitrate = cfg80211_calculate_bitrate(info);
4806         /* report 16-bit bitrate only if we can */
4807         bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0;
4808         if (bitrate > 0 &&
4809             nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate))
4810                 return false;
4811         if (bitrate_compat > 0 &&
4812             nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat))
4813                 return false;
4814
4815         switch (info->bw) {
4816         case RATE_INFO_BW_5:
4817                 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH;
4818                 break;
4819         case RATE_INFO_BW_10:
4820                 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH;
4821                 break;
4822         default:
4823                 WARN_ON(1);
4824                 /* fall through */
4825         case RATE_INFO_BW_20:
4826                 rate_flg = 0;
4827                 break;
4828         case RATE_INFO_BW_40:
4829                 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH;
4830                 break;
4831         case RATE_INFO_BW_80:
4832                 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH;
4833                 break;
4834         case RATE_INFO_BW_160:
4835                 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH;
4836                 break;
4837         case RATE_INFO_BW_HE_RU:
4838                 rate_flg = 0;
4839                 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS));
4840         }
4841
4842         if (rate_flg && nla_put_flag(msg, rate_flg))
4843                 return false;
4844
4845         if (info->flags & RATE_INFO_FLAGS_MCS) {
4846                 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs))
4847                         return false;
4848                 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
4849                     nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
4850                         return false;
4851         } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) {
4852                 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs))
4853                         return false;
4854                 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss))
4855                         return false;
4856                 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
4857                     nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
4858                         return false;
4859         } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) {
4860                 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs))
4861                         return false;
4862                 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss))
4863                         return false;
4864                 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi))
4865                         return false;
4866                 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm))
4867                         return false;
4868                 if (info->bw == RATE_INFO_BW_HE_RU &&
4869                     nla_put_u8(msg, NL80211_RATE_INFO_HE_RU_ALLOC,
4870                                info->he_ru_alloc))
4871                         return false;
4872         }
4873
4874         nla_nest_end(msg, rate);
4875         return true;
4876 }
4877
4878 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal,
4879                                int id)
4880 {
4881         void *attr;
4882         int i = 0;
4883
4884         if (!mask)
4885                 return true;
4886
4887         attr = nla_nest_start_noflag(msg, id);
4888         if (!attr)
4889                 return false;
4890
4891         for (i = 0; i < IEEE80211_MAX_CHAINS; i++) {
4892                 if (!(mask & BIT(i)))
4893                         continue;
4894
4895                 if (nla_put_u8(msg, i, signal[i]))
4896                         return false;
4897         }
4898
4899         nla_nest_end(msg, attr);
4900
4901         return true;
4902 }
4903
4904 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
4905                                 u32 seq, int flags,
4906                                 struct cfg80211_registered_device *rdev,
4907                                 struct net_device *dev,
4908                                 const u8 *mac_addr, struct station_info *sinfo)
4909 {
4910         void *hdr;
4911         struct nlattr *sinfoattr, *bss_param;
4912
4913         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
4914         if (!hdr) {
4915                 cfg80211_sinfo_release_content(sinfo);
4916                 return -1;
4917         }
4918
4919         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
4920             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
4921             nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation))
4922                 goto nla_put_failure;
4923
4924         sinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_STA_INFO);
4925         if (!sinfoattr)
4926                 goto nla_put_failure;
4927
4928 #define PUT_SINFO(attr, memb, type) do {                                \
4929         BUILD_BUG_ON(sizeof(type) == sizeof(u64));                      \
4930         if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) &&       \
4931             nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr,            \
4932                              sinfo->memb))                              \
4933                 goto nla_put_failure;                                   \
4934         } while (0)
4935 #define PUT_SINFO_U64(attr, memb) do {                                  \
4936         if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) &&       \
4937             nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr,           \
4938                               sinfo->memb, NL80211_STA_INFO_PAD))       \
4939                 goto nla_put_failure;                                   \
4940         } while (0)
4941
4942         PUT_SINFO(CONNECTED_TIME, connected_time, u32);
4943         PUT_SINFO(INACTIVE_TIME, inactive_time, u32);
4944
4945         if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) |
4946                              BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) &&
4947             nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES,
4948                         (u32)sinfo->rx_bytes))
4949                 goto nla_put_failure;
4950
4951         if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) |
4952                              BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) &&
4953             nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES,
4954                         (u32)sinfo->tx_bytes))
4955                 goto nla_put_failure;
4956
4957         PUT_SINFO_U64(RX_BYTES64, rx_bytes);
4958         PUT_SINFO_U64(TX_BYTES64, tx_bytes);
4959         PUT_SINFO(LLID, llid, u16);
4960         PUT_SINFO(PLID, plid, u16);
4961         PUT_SINFO(PLINK_STATE, plink_state, u8);
4962         PUT_SINFO_U64(RX_DURATION, rx_duration);
4963         PUT_SINFO_U64(TX_DURATION, tx_duration);
4964
4965         if (wiphy_ext_feature_isset(&rdev->wiphy,
4966                                     NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
4967                 PUT_SINFO(AIRTIME_WEIGHT, airtime_weight, u16);
4968
4969         switch (rdev->wiphy.signal_type) {
4970         case CFG80211_SIGNAL_TYPE_MBM:
4971                 PUT_SINFO(SIGNAL, signal, u8);
4972                 PUT_SINFO(SIGNAL_AVG, signal_avg, u8);
4973                 break;
4974         default:
4975                 break;
4976         }
4977         if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) {
4978                 if (!nl80211_put_signal(msg, sinfo->chains,
4979                                         sinfo->chain_signal,
4980                                         NL80211_STA_INFO_CHAIN_SIGNAL))
4981                         goto nla_put_failure;
4982         }
4983         if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) {
4984                 if (!nl80211_put_signal(msg, sinfo->chains,
4985                                         sinfo->chain_signal_avg,
4986                                         NL80211_STA_INFO_CHAIN_SIGNAL_AVG))
4987                         goto nla_put_failure;
4988         }
4989         if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) {
4990                 if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
4991                                           NL80211_STA_INFO_TX_BITRATE))
4992                         goto nla_put_failure;
4993         }
4994         if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) {
4995                 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate,
4996                                           NL80211_STA_INFO_RX_BITRATE))
4997                         goto nla_put_failure;
4998         }
4999
5000         PUT_SINFO(RX_PACKETS, rx_packets, u32);
5001         PUT_SINFO(TX_PACKETS, tx_packets, u32);
5002         PUT_SINFO(TX_RETRIES, tx_retries, u32);
5003         PUT_SINFO(TX_FAILED, tx_failed, u32);
5004         PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32);
5005         PUT_SINFO(AIRTIME_LINK_METRIC, airtime_link_metric, u32);
5006         PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32);
5007         PUT_SINFO(LOCAL_PM, local_pm, u32);
5008         PUT_SINFO(PEER_PM, peer_pm, u32);
5009         PUT_SINFO(NONPEER_PM, nonpeer_pm, u32);
5010         PUT_SINFO(CONNECTED_TO_GATE, connected_to_gate, u8);
5011
5012         if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) {
5013                 bss_param = nla_nest_start_noflag(msg,
5014                                                   NL80211_STA_INFO_BSS_PARAM);
5015                 if (!bss_param)
5016                         goto nla_put_failure;
5017
5018                 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) &&
5019                      nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) ||
5020                     ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) &&
5021                      nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) ||
5022                     ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) &&
5023                      nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) ||
5024                     nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD,
5025                                sinfo->bss_param.dtim_period) ||
5026                     nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL,
5027                                 sinfo->bss_param.beacon_interval))
5028                         goto nla_put_failure;
5029
5030                 nla_nest_end(msg, bss_param);
5031         }
5032         if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) &&
5033             nla_put(msg, NL80211_STA_INFO_STA_FLAGS,
5034                     sizeof(struct nl80211_sta_flag_update),
5035                     &sinfo->sta_flags))
5036                 goto nla_put_failure;
5037
5038         PUT_SINFO_U64(T_OFFSET, t_offset);
5039         PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc);
5040         PUT_SINFO_U64(BEACON_RX, rx_beacon);
5041         PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
5042         PUT_SINFO(RX_MPDUS, rx_mpdu_count, u32);
5043         PUT_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32);
5044         if (wiphy_ext_feature_isset(&rdev->wiphy,
5045                                     NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) {
5046                 PUT_SINFO(ACK_SIGNAL, ack_signal, u8);
5047                 PUT_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8);
5048         }
5049
5050 #undef PUT_SINFO
5051 #undef PUT_SINFO_U64
5052
5053         if (sinfo->pertid) {
5054                 struct nlattr *tidsattr;
5055                 int tid;
5056
5057                 tidsattr = nla_nest_start_noflag(msg,
5058                                                  NL80211_STA_INFO_TID_STATS);
5059                 if (!tidsattr)
5060                         goto nla_put_failure;
5061
5062                 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) {
5063                         struct cfg80211_tid_stats *tidstats;
5064                         struct nlattr *tidattr;
5065
5066                         tidstats = &sinfo->pertid[tid];
5067
5068                         if (!tidstats->filled)
5069                                 continue;
5070
5071                         tidattr = nla_nest_start_noflag(msg, tid + 1);
5072                         if (!tidattr)
5073                                 goto nla_put_failure;
5074
5075 #define PUT_TIDVAL_U64(attr, memb) do {                                 \
5076         if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) &&       \
5077             nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr,          \
5078                               tidstats->memb, NL80211_TID_STATS_PAD))   \
5079                 goto nla_put_failure;                                   \
5080         } while (0)
5081
5082                         PUT_TIDVAL_U64(RX_MSDU, rx_msdu);
5083                         PUT_TIDVAL_U64(TX_MSDU, tx_msdu);
5084                         PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries);
5085                         PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed);
5086
5087 #undef PUT_TIDVAL_U64
5088                         if ((tidstats->filled &
5089                              BIT(NL80211_TID_STATS_TXQ_STATS)) &&
5090                             !nl80211_put_txq_stats(msg, &tidstats->txq_stats,
5091                                                    NL80211_TID_STATS_TXQ_STATS))
5092                                 goto nla_put_failure;
5093
5094                         nla_nest_end(msg, tidattr);
5095                 }
5096
5097                 nla_nest_end(msg, tidsattr);
5098         }
5099
5100         nla_nest_end(msg, sinfoattr);
5101
5102         if (sinfo->assoc_req_ies_len &&
5103             nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len,
5104                     sinfo->assoc_req_ies))
5105                 goto nla_put_failure;
5106
5107         cfg80211_sinfo_release_content(sinfo);
5108         genlmsg_end(msg, hdr);
5109         return 0;
5110
5111  nla_put_failure:
5112         cfg80211_sinfo_release_content(sinfo);
5113         genlmsg_cancel(msg, hdr);
5114         return -EMSGSIZE;
5115 }
5116
5117 static int nl80211_dump_station(struct sk_buff *skb,
5118                                 struct netlink_callback *cb)
5119 {
5120         struct station_info sinfo;
5121         struct cfg80211_registered_device *rdev;
5122         struct wireless_dev *wdev;
5123         u8 mac_addr[ETH_ALEN];
5124         int sta_idx = cb->args[2];
5125         int err;
5126
5127         rtnl_lock();
5128         err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
5129         if (err)
5130                 goto out_err;
5131
5132         if (!wdev->netdev) {
5133                 err = -EINVAL;
5134                 goto out_err;
5135         }
5136
5137         if (!rdev->ops->dump_station) {
5138                 err = -EOPNOTSUPP;
5139                 goto out_err;
5140         }
5141
5142         while (1) {
5143                 memset(&sinfo, 0, sizeof(sinfo));
5144                 err = rdev_dump_station(rdev, wdev->netdev, sta_idx,
5145                                         mac_addr, &sinfo);
5146                 if (err == -ENOENT)
5147                         break;
5148                 if (err)
5149                         goto out_err;
5150
5151                 if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION,
5152                                 NETLINK_CB(cb->skb).portid,
5153                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
5154                                 rdev, wdev->netdev, mac_addr,
5155                                 &sinfo) < 0)
5156                         goto out;
5157
5158                 sta_idx++;
5159         }
5160
5161  out:
5162         cb->args[2] = sta_idx;
5163         err = skb->len;
5164  out_err:
5165         rtnl_unlock();
5166
5167         return err;
5168 }
5169
5170 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
5171 {
5172         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5173         struct net_device *dev = info->user_ptr[1];
5174         struct station_info sinfo;
5175         struct sk_buff *msg;
5176         u8 *mac_addr = NULL;
5177         int err;
5178
5179         memset(&sinfo, 0, sizeof(sinfo));
5180
5181         if (!info->attrs[NL80211_ATTR_MAC])
5182                 return -EINVAL;
5183
5184         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
5185
5186         if (!rdev->ops->get_station)
5187                 return -EOPNOTSUPP;
5188
5189         err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
5190         if (err)
5191                 return err;
5192
5193         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
5194         if (!msg) {
5195                 cfg80211_sinfo_release_content(&sinfo);
5196                 return -ENOMEM;
5197         }
5198
5199         if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION,
5200                                  info->snd_portid, info->snd_seq, 0,
5201                                  rdev, dev, mac_addr, &sinfo) < 0) {
5202                 nlmsg_free(msg);
5203                 return -ENOBUFS;
5204         }
5205
5206         return genlmsg_reply(msg, info);
5207 }
5208
5209 int cfg80211_check_station_change(struct wiphy *wiphy,
5210                                   struct station_parameters *params,
5211                                   enum cfg80211_station_type statype)
5212 {
5213         if (params->listen_interval != -1 &&
5214             statype != CFG80211_STA_AP_CLIENT_UNASSOC)
5215                 return -EINVAL;
5216
5217         if (params->support_p2p_ps != -1 &&
5218             statype != CFG80211_STA_AP_CLIENT_UNASSOC)
5219                 return -EINVAL;
5220
5221         if (params->aid &&
5222             !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) &&
5223             statype != CFG80211_STA_AP_CLIENT_UNASSOC)
5224                 return -EINVAL;
5225
5226         /* When you run into this, adjust the code below for the new flag */
5227         BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
5228
5229         switch (statype) {
5230         case CFG80211_STA_MESH_PEER_KERNEL:
5231         case CFG80211_STA_MESH_PEER_USER:
5232                 /*
5233                  * No ignoring the TDLS flag here -- the userspace mesh
5234                  * code doesn't have the bug of including TDLS in the
5235                  * mask everywhere.
5236                  */
5237                 if (params->sta_flags_mask &
5238                                 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
5239                                   BIT(NL80211_STA_FLAG_MFP) |
5240                                   BIT(NL80211_STA_FLAG_AUTHORIZED)))
5241                         return -EINVAL;
5242                 break;
5243         case CFG80211_STA_TDLS_PEER_SETUP:
5244         case CFG80211_STA_TDLS_PEER_ACTIVE:
5245                 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
5246                         return -EINVAL;
5247                 /* ignore since it can't change */
5248                 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
5249                 break;
5250         default:
5251                 /* disallow mesh-specific things */
5252                 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION)
5253                         return -EINVAL;
5254                 if (params->local_pm)
5255                         return -EINVAL;
5256                 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
5257                         return -EINVAL;
5258         }
5259
5260         if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
5261             statype != CFG80211_STA_TDLS_PEER_ACTIVE) {
5262                 /* TDLS can't be set, ... */
5263                 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
5264                         return -EINVAL;
5265                 /*
5266                  * ... but don't bother the driver with it. This works around
5267                  * a hostapd/wpa_supplicant issue -- it always includes the
5268                  * TLDS_PEER flag in the mask even for AP mode.
5269                  */
5270                 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
5271         }
5272
5273         if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
5274             statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
5275                 /* reject other things that can't change */
5276                 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD)
5277                         return -EINVAL;
5278                 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY)
5279                         return -EINVAL;
5280                 if (params->supported_rates)
5281                         return -EINVAL;
5282                 if (params->ext_capab || params->ht_capa || params->vht_capa ||
5283                     params->he_capa)
5284                         return -EINVAL;
5285         }
5286
5287         if (statype != CFG80211_STA_AP_CLIENT &&
5288             statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
5289                 if (params->vlan)
5290                         return -EINVAL;
5291         }
5292
5293         switch (statype) {
5294         case CFG80211_STA_AP_MLME_CLIENT:
5295                 /* Use this only for authorizing/unauthorizing a station */
5296                 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)))
5297                         return -EOPNOTSUPP;
5298                 break;
5299         case CFG80211_STA_AP_CLIENT:
5300         case CFG80211_STA_AP_CLIENT_UNASSOC:
5301                 /* accept only the listed bits */
5302                 if (params->sta_flags_mask &
5303                                 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
5304                                   BIT(NL80211_STA_FLAG_AUTHENTICATED) |
5305                                   BIT(NL80211_STA_FLAG_ASSOCIATED) |
5306                                   BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
5307                                   BIT(NL80211_STA_FLAG_WME) |
5308                                   BIT(NL80211_STA_FLAG_MFP)))
5309                         return -EINVAL;
5310
5311                 /* but authenticated/associated only if driver handles it */
5312                 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
5313                     params->sta_flags_mask &
5314                                 (BIT(NL80211_STA_FLAG_AUTHENTICATED) |
5315                                  BIT(NL80211_STA_FLAG_ASSOCIATED)))
5316                         return -EINVAL;
5317                 break;
5318         case CFG80211_STA_IBSS:
5319         case CFG80211_STA_AP_STA:
5320                 /* reject any changes other than AUTHORIZED */
5321                 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
5322                         return -EINVAL;
5323                 break;
5324         case CFG80211_STA_TDLS_PEER_SETUP:
5325                 /* reject any changes other than AUTHORIZED or WME */
5326                 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
5327                                                BIT(NL80211_STA_FLAG_WME)))
5328                         return -EINVAL;
5329                 /* force (at least) rates when authorizing */
5330                 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) &&
5331                     !params->supported_rates)
5332                         return -EINVAL;
5333                 break;
5334         case CFG80211_STA_TDLS_PEER_ACTIVE:
5335                 /* reject any changes */
5336                 return -EINVAL;
5337         case CFG80211_STA_MESH_PEER_KERNEL:
5338                 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
5339                         return -EINVAL;
5340                 break;
5341         case CFG80211_STA_MESH_PEER_USER:
5342                 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION &&
5343                     params->plink_action != NL80211_PLINK_ACTION_BLOCK)
5344                         return -EINVAL;
5345                 break;
5346         }
5347
5348         /*
5349          * Older kernel versions ignored this attribute entirely, so don't
5350          * reject attempts to update it but mark it as unused instead so the
5351          * driver won't look at the data.
5352          */
5353         if (statype != CFG80211_STA_AP_CLIENT_UNASSOC &&
5354             statype != CFG80211_STA_TDLS_PEER_SETUP)
5355                 params->opmode_notif_used = false;
5356
5357         return 0;
5358 }
5359 EXPORT_SYMBOL(cfg80211_check_station_change);
5360
5361 /*
5362  * Get vlan interface making sure it is running and on the right wiphy.
5363  */
5364 static struct net_device *get_vlan(struct genl_info *info,
5365                                    struct cfg80211_registered_device *rdev)
5366 {
5367         struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN];
5368         struct net_device *v;
5369         int ret;
5370
5371         if (!vlanattr)
5372                 return NULL;
5373
5374         v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr));
5375         if (!v)
5376                 return ERR_PTR(-ENODEV);
5377
5378         if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) {
5379                 ret = -EINVAL;
5380                 goto error;
5381         }
5382
5383         if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
5384             v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
5385             v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
5386                 ret = -EINVAL;
5387                 goto error;
5388         }
5389
5390         if (!netif_running(v)) {
5391                 ret = -ENETDOWN;
5392                 goto error;
5393         }
5394
5395         return v;
5396  error:
5397         dev_put(v);
5398         return ERR_PTR(ret);
5399 }
5400
5401 static const struct nla_policy
5402 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = {
5403         [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 },
5404         [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 },
5405 };
5406
5407 static int nl80211_parse_sta_wme(struct genl_info *info,
5408                                  struct station_parameters *params)
5409 {
5410         struct nlattr *tb[NL80211_STA_WME_MAX + 1];
5411         struct nlattr *nla;
5412         int err;
5413
5414         /* parse WME attributes if present */
5415         if (!info->attrs[NL80211_ATTR_STA_WME])
5416                 return 0;
5417
5418         nla = info->attrs[NL80211_ATTR_STA_WME];
5419         err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla,
5420                                           nl80211_sta_wme_policy,
5421                                           info->extack);
5422         if (err)
5423                 return err;
5424
5425         if (tb[NL80211_STA_WME_UAPSD_QUEUES])
5426                 params->uapsd_queues = nla_get_u8(
5427                         tb[NL80211_STA_WME_UAPSD_QUEUES]);
5428         if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK)
5429                 return -EINVAL;
5430
5431         if (tb[NL80211_STA_WME_MAX_SP])
5432                 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]);
5433
5434         if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK)
5435                 return -EINVAL;
5436
5437         params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD;
5438
5439         return 0;
5440 }
5441
5442 static int nl80211_parse_sta_channel_info(struct genl_info *info,
5443                                       struct station_parameters *params)
5444 {
5445         if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
5446                 params->supported_channels =
5447                      nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
5448                 params->supported_channels_len =
5449                      nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
5450                 /*
5451                  * Need to include at least one (first channel, number of
5452                  * channels) tuple for each subband, and must have proper
5453                  * tuples for the rest of the data as well.
5454                  */
5455                 if (params->supported_channels_len < 2)
5456                         return -EINVAL;
5457                 if (params->supported_channels_len % 2)
5458                         return -EINVAL;
5459         }
5460
5461         if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
5462                 params->supported_oper_classes =
5463                  nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
5464                 params->supported_oper_classes_len =
5465                   nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
5466                 /*
5467                  * The value of the Length field of the Supported Operating
5468                  * Classes element is between 2 and 253.
5469                  */
5470                 if (params->supported_oper_classes_len < 2 ||
5471                     params->supported_oper_classes_len > 253)
5472                         return -EINVAL;
5473         }
5474         return 0;
5475 }
5476
5477 static int nl80211_set_station_tdls(struct genl_info *info,
5478                                     struct station_parameters *params)
5479 {
5480         int err;
5481         /* Dummy STA entry gets updated once the peer capabilities are known */
5482         if (info->attrs[NL80211_ATTR_PEER_AID])
5483                 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
5484         if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
5485                 params->ht_capa =
5486                         nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
5487         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
5488                 params->vht_capa =
5489                         nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
5490         if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) {
5491                 params->he_capa =
5492                         nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
5493                 params->he_capa_len =
5494                         nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
5495
5496                 if (params->he_capa_len < NL80211_HE_MIN_CAPABILITY_LEN)
5497                         return -EINVAL;
5498         }
5499
5500         err = nl80211_parse_sta_channel_info(info, params);
5501         if (err)
5502                 return err;
5503
5504         return nl80211_parse_sta_wme(info, params);
5505 }
5506
5507 static int nl80211_parse_sta_txpower_setting(struct genl_info *info,
5508                                              struct station_parameters *params)
5509 {
5510         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5511         int idx;
5512
5513         if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) {
5514                 if (!rdev->ops->set_tx_power ||
5515                     !wiphy_ext_feature_isset(&rdev->wiphy,
5516                                          NL80211_EXT_FEATURE_STA_TX_PWR))
5517                         return -EOPNOTSUPP;
5518
5519                 idx = NL80211_ATTR_STA_TX_POWER_SETTING;
5520                 params->txpwr.type = nla_get_u8(info->attrs[idx]);
5521
5522                 if (params->txpwr.type == NL80211_TX_POWER_LIMITED) {
5523                         idx = NL80211_ATTR_STA_TX_POWER;
5524
5525                         if (info->attrs[idx])
5526                                 params->txpwr.power =
5527                                         nla_get_s16(info->attrs[idx]);
5528                         else
5529                                 return -EINVAL;
5530                 }
5531                 params->sta_modify_mask |= STATION_PARAM_APPLY_STA_TXPOWER;
5532         }
5533
5534         return 0;
5535 }
5536
5537 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
5538 {
5539         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5540         struct net_device *dev = info->user_ptr[1];
5541         struct station_parameters params;
5542         u8 *mac_addr;
5543         int err;
5544
5545         memset(&params, 0, sizeof(params));
5546
5547         if (!rdev->ops->change_station)
5548                 return -EOPNOTSUPP;
5549
5550         /*
5551          * AID and listen_interval properties can be set only for unassociated
5552          * station. Include these parameters here and will check them in
5553          * cfg80211_check_station_change().
5554          */
5555         if (info->attrs[NL80211_ATTR_STA_AID])
5556                 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
5557
5558         if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
5559                 params.listen_interval =
5560                      nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
5561         else
5562                 params.listen_interval = -1;
5563
5564         if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS])
5565                 params.support_p2p_ps =
5566                         nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
5567         else
5568                 params.support_p2p_ps = -1;
5569
5570         if (!info->attrs[NL80211_ATTR_MAC])
5571                 return -EINVAL;
5572
5573         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
5574
5575         if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
5576                 params.supported_rates =
5577                         nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
5578                 params.supported_rates_len =
5579                         nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
5580         }
5581
5582         if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
5583                 params.capability =
5584                         nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
5585                 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
5586         }
5587
5588         if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
5589                 params.ext_capab =
5590                         nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
5591                 params.ext_capab_len =
5592                         nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
5593         }
5594
5595         if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
5596                 return -EINVAL;
5597
5598         if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
5599                 params.plink_action =
5600                         nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
5601
5602         if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) {
5603                 params.plink_state =
5604                         nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]);
5605                 if (info->attrs[NL80211_ATTR_MESH_PEER_AID])
5606                         params.peer_aid = nla_get_u16(
5607                                 info->attrs[NL80211_ATTR_MESH_PEER_AID]);
5608                 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE;
5609         }
5610
5611         if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE])
5612                 params.local_pm = nla_get_u32(
5613                         info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]);
5614
5615         if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
5616                 params.opmode_notif_used = true;
5617                 params.opmode_notif =
5618                         nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
5619         }
5620
5621         if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT])
5622                 params.airtime_weight =
5623                         nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]);
5624
5625         if (params.airtime_weight &&
5626             !wiphy_ext_feature_isset(&rdev->wiphy,
5627                                      NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
5628                 return -EOPNOTSUPP;
5629
5630         err = nl80211_parse_sta_txpower_setting(info, &params);
5631         if (err)
5632                 return err;
5633
5634         /* Include parameters for TDLS peer (will check later) */
5635         err = nl80211_set_station_tdls(info, &params);
5636         if (err)
5637                 return err;
5638
5639         params.vlan = get_vlan(info, rdev);
5640         if (IS_ERR(params.vlan))
5641                 return PTR_ERR(params.vlan);
5642
5643         switch (dev->ieee80211_ptr->iftype) {
5644         case NL80211_IFTYPE_AP:
5645         case NL80211_IFTYPE_AP_VLAN:
5646         case NL80211_IFTYPE_P2P_GO:
5647         case NL80211_IFTYPE_P2P_CLIENT:
5648         case NL80211_IFTYPE_STATION:
5649         case NL80211_IFTYPE_ADHOC:
5650         case NL80211_IFTYPE_MESH_POINT:
5651                 break;
5652         default:
5653                 err = -EOPNOTSUPP;
5654                 goto out_put_vlan;
5655         }
5656
5657         /* driver will call cfg80211_check_station_change() */
5658         err = rdev_change_station(rdev, dev, mac_addr, &params);
5659
5660  out_put_vlan:
5661         if (params.vlan)
5662                 dev_put(params.vlan);
5663
5664         return err;
5665 }
5666
5667 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
5668 {
5669         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5670         int err;
5671         struct net_device *dev = info->user_ptr[1];
5672         struct station_parameters params;
5673         u8 *mac_addr = NULL;
5674         u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
5675                          BIT(NL80211_STA_FLAG_ASSOCIATED);
5676
5677         memset(&params, 0, sizeof(params));
5678
5679         if (!rdev->ops->add_station)
5680                 return -EOPNOTSUPP;
5681
5682         if (!info->attrs[NL80211_ATTR_MAC])
5683                 return -EINVAL;
5684
5685         if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
5686                 return -EINVAL;
5687
5688         if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
5689                 return -EINVAL;
5690
5691         if (!info->attrs[NL80211_ATTR_STA_AID] &&
5692             !info->attrs[NL80211_ATTR_PEER_AID])
5693                 return -EINVAL;
5694
5695         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
5696         params.supported_rates =
5697                 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
5698         params.supported_rates_len =
5699                 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
5700         params.listen_interval =
5701                 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
5702
5703         if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
5704                 params.support_p2p_ps =
5705                         nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
5706         } else {
5707                 /*
5708                  * if not specified, assume it's supported for P2P GO interface,
5709                  * and is NOT supported for AP interface
5710                  */
5711                 params.support_p2p_ps =
5712                         dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO;
5713         }
5714
5715         if (info->attrs[NL80211_ATTR_PEER_AID])
5716                 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
5717         else
5718                 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
5719
5720         if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
5721                 params.capability =
5722                         nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
5723                 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
5724         }
5725
5726         if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
5727                 params.ext_capab =
5728                         nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
5729                 params.ext_capab_len =
5730                         nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
5731         }
5732
5733         if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
5734                 params.ht_capa =
5735                         nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
5736
5737         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
5738                 params.vht_capa =
5739                         nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
5740
5741         if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) {
5742                 params.he_capa =
5743                         nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
5744                 params.he_capa_len =
5745                         nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
5746
5747                 /* max len is validated in nla policy */
5748                 if (params.he_capa_len < NL80211_HE_MIN_CAPABILITY_LEN)
5749                         return -EINVAL;
5750         }
5751
5752         if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
5753                 params.opmode_notif_used = true;
5754                 params.opmode_notif =
5755                         nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
5756         }
5757
5758         if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
5759                 params.plink_action =
5760                         nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
5761
5762         if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT])
5763                 params.airtime_weight =
5764                         nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]);
5765
5766         if (params.airtime_weight &&
5767             !wiphy_ext_feature_isset(&rdev->wiphy,
5768                                      NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
5769                 return -EOPNOTSUPP;
5770
5771         err = nl80211_parse_sta_txpower_setting(info, &params);
5772         if (err)
5773                 return err;
5774
5775         err = nl80211_parse_sta_channel_info(info, &params);
5776         if (err)
5777                 return err;
5778
5779         err = nl80211_parse_sta_wme(info, &params);
5780         if (err)
5781                 return err;
5782
5783         if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
5784                 return -EINVAL;
5785
5786         /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT
5787          * as userspace might just pass through the capabilities from the IEs
5788          * directly, rather than enforcing this restriction and returning an
5789          * error in this case.
5790          */
5791         if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) {
5792                 params.ht_capa = NULL;
5793                 params.vht_capa = NULL;
5794
5795                 /* HE requires WME */
5796                 if (params.he_capa_len)
5797                         return -EINVAL;
5798         }
5799
5800         /* When you run into this, adjust the code below for the new flag */
5801         BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
5802
5803         switch (dev->ieee80211_ptr->iftype) {
5804         case NL80211_IFTYPE_AP:
5805         case NL80211_IFTYPE_AP_VLAN:
5806         case NL80211_IFTYPE_P2P_GO:
5807                 /* ignore WME attributes if iface/sta is not capable */
5808                 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) ||
5809                     !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME)))
5810                         params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
5811
5812                 /* TDLS peers cannot be added */
5813                 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
5814                     info->attrs[NL80211_ATTR_PEER_AID])
5815                         return -EINVAL;
5816                 /* but don't bother the driver with it */
5817                 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
5818
5819                 /* allow authenticated/associated only if driver handles it */
5820                 if (!(rdev->wiphy.features &
5821                                 NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
5822                     params.sta_flags_mask & auth_assoc)
5823                         return -EINVAL;
5824
5825                 /* Older userspace, or userspace wanting to be compatible with
5826                  * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth
5827                  * and assoc flags in the mask, but assumes the station will be
5828                  * added as associated anyway since this was the required driver
5829                  * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was
5830                  * introduced.
5831                  * In order to not bother drivers with this quirk in the API
5832                  * set the flags in both the mask and set for new stations in
5833                  * this case.
5834                  */
5835                 if (!(params.sta_flags_mask & auth_assoc)) {
5836                         params.sta_flags_mask |= auth_assoc;
5837                         params.sta_flags_set |= auth_assoc;
5838                 }
5839
5840                 /* must be last in here for error handling */
5841                 params.vlan = get_vlan(info, rdev);
5842                 if (IS_ERR(params.vlan))
5843                         return PTR_ERR(params.vlan);
5844                 break;
5845         case NL80211_IFTYPE_MESH_POINT:
5846                 /* ignore uAPSD data */
5847                 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
5848
5849                 /* associated is disallowed */
5850                 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED))
5851                         return -EINVAL;
5852                 /* TDLS peers cannot be added */
5853                 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
5854                     info->attrs[NL80211_ATTR_PEER_AID])
5855                         return -EINVAL;
5856                 break;
5857         case NL80211_IFTYPE_STATION:
5858         case NL80211_IFTYPE_P2P_CLIENT:
5859                 /* ignore uAPSD data */
5860                 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
5861
5862                 /* these are disallowed */
5863                 if (params.sta_flags_mask &
5864                                 (BIT(NL80211_STA_FLAG_ASSOCIATED) |
5865                                  BIT(NL80211_STA_FLAG_AUTHENTICATED)))
5866                         return -EINVAL;
5867                 /* Only TDLS peers can be added */
5868                 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
5869                         return -EINVAL;
5870                 /* Can only add if TDLS ... */
5871                 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS))
5872                         return -EOPNOTSUPP;
5873                 /* ... with external setup is supported */
5874                 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP))
5875                         return -EOPNOTSUPP;
5876                 /*
5877                  * Older wpa_supplicant versions always mark the TDLS peer
5878                  * as authorized, but it shouldn't yet be.
5879                  */
5880                 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED);
5881                 break;
5882         default:
5883                 return -EOPNOTSUPP;
5884         }
5885
5886         /* be aware of params.vlan when changing code here */
5887
5888         err = rdev_add_station(rdev, dev, mac_addr, &params);
5889
5890         if (params.vlan)
5891                 dev_put(params.vlan);
5892         return err;
5893 }
5894
5895 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
5896 {
5897         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5898         struct net_device *dev = info->user_ptr[1];
5899         struct station_del_parameters params;
5900
5901         memset(&params, 0, sizeof(params));
5902
5903         if (info->attrs[NL80211_ATTR_MAC])
5904                 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]);
5905
5906         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
5907             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
5908             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
5909             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5910                 return -EINVAL;
5911
5912         if (!rdev->ops->del_station)
5913                 return -EOPNOTSUPP;
5914
5915         if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) {
5916                 params.subtype =
5917                         nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]);
5918                 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 &&
5919                     params.subtype != IEEE80211_STYPE_DEAUTH >> 4)
5920                         return -EINVAL;
5921         } else {
5922                 /* Default to Deauthentication frame */
5923                 params.subtype = IEEE80211_STYPE_DEAUTH >> 4;
5924         }
5925
5926         if (info->attrs[NL80211_ATTR_REASON_CODE]) {
5927                 params.reason_code =
5928                         nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
5929                 if (params.reason_code == 0)
5930                         return -EINVAL; /* 0 is reserved */
5931         } else {
5932                 /* Default to reason code 2 */
5933                 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID;
5934         }
5935
5936         return rdev_del_station(rdev, dev, &params);
5937 }
5938
5939 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq,
5940                                 int flags, struct net_device *dev,
5941                                 u8 *dst, u8 *next_hop,
5942                                 struct mpath_info *pinfo)
5943 {
5944         void *hdr;
5945         struct nlattr *pinfoattr;
5946
5947         hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH);
5948         if (!hdr)
5949                 return -1;
5950
5951         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
5952             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) ||
5953             nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) ||
5954             nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation))
5955                 goto nla_put_failure;
5956
5957         pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MPATH_INFO);
5958         if (!pinfoattr)
5959                 goto nla_put_failure;
5960         if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) &&
5961             nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN,
5962                         pinfo->frame_qlen))
5963                 goto nla_put_failure;
5964         if (((pinfo->filled & MPATH_INFO_SN) &&
5965              nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) ||
5966             ((pinfo->filled & MPATH_INFO_METRIC) &&
5967              nla_put_u32(msg, NL80211_MPATH_INFO_METRIC,
5968                          pinfo->metric)) ||
5969             ((pinfo->filled & MPATH_INFO_EXPTIME) &&
5970              nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME,
5971                          pinfo->exptime)) ||
5972             ((pinfo->filled & MPATH_INFO_FLAGS) &&
5973              nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS,
5974                         pinfo->flags)) ||
5975             ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) &&
5976              nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
5977                          pinfo->discovery_timeout)) ||
5978             ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) &&
5979              nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES,
5980                         pinfo->discovery_retries)) ||
5981             ((pinfo->filled & MPATH_INFO_HOP_COUNT) &&
5982              nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT,
5983                         pinfo->hop_count)) ||
5984             ((pinfo->filled & MPATH_INFO_PATH_CHANGE) &&
5985              nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE,
5986                          pinfo->path_change_count)))
5987                 goto nla_put_failure;
5988
5989         nla_nest_end(msg, pinfoattr);
5990
5991         genlmsg_end(msg, hdr);
5992         return 0;
5993
5994  nla_put_failure:
5995         genlmsg_cancel(msg, hdr);
5996         return -EMSGSIZE;
5997 }
5998
5999 static int nl80211_dump_mpath(struct sk_buff *skb,
6000                               struct netlink_callback *cb)
6001 {
6002         struct mpath_info pinfo;
6003         struct cfg80211_registered_device *rdev;
6004         struct wireless_dev *wdev;
6005         u8 dst[ETH_ALEN];
6006         u8 next_hop[ETH_ALEN];
6007         int path_idx = cb->args[2];
6008         int err;
6009
6010         rtnl_lock();
6011         err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
6012         if (err)
6013                 goto out_err;
6014
6015         if (!rdev->ops->dump_mpath) {
6016                 err = -EOPNOTSUPP;
6017                 goto out_err;
6018         }
6019
6020         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
6021                 err = -EOPNOTSUPP;
6022                 goto out_err;
6023         }
6024
6025         while (1) {
6026                 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst,
6027                                       next_hop, &pinfo);
6028                 if (err == -ENOENT)
6029                         break;
6030                 if (err)
6031                         goto out_err;
6032
6033                 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
6034                                        cb->nlh->nlmsg_seq, NLM_F_MULTI,
6035                                        wdev->netdev, dst, next_hop,
6036                                        &pinfo) < 0)
6037                         goto out;
6038
6039                 path_idx++;
6040         }
6041
6042  out:
6043         cb->args[2] = path_idx;
6044         err = skb->len;
6045  out_err:
6046         rtnl_unlock();
6047         return err;
6048 }
6049
6050 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
6051 {
6052         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6053         int err;
6054         struct net_device *dev = info->user_ptr[1];
6055         struct mpath_info pinfo;
6056         struct sk_buff *msg;
6057         u8 *dst = NULL;
6058         u8 next_hop[ETH_ALEN];
6059
6060         memset(&pinfo, 0, sizeof(pinfo));
6061
6062         if (!info->attrs[NL80211_ATTR_MAC])
6063                 return -EINVAL;
6064
6065         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
6066
6067         if (!rdev->ops->get_mpath)
6068                 return -EOPNOTSUPP;
6069
6070         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
6071                 return -EOPNOTSUPP;
6072
6073         err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo);
6074         if (err)
6075                 return err;
6076
6077         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
6078         if (!msg)
6079                 return -ENOMEM;
6080
6081         if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
6082                                  dev, dst, next_hop, &pinfo) < 0) {
6083                 nlmsg_free(msg);
6084                 return -ENOBUFS;
6085         }
6086
6087         return genlmsg_reply(msg, info);
6088 }
6089
6090 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
6091 {
6092         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6093         struct net_device *dev = info->user_ptr[1];
6094         u8 *dst = NULL;
6095         u8 *next_hop = NULL;
6096
6097         if (!info->attrs[NL80211_ATTR_MAC])
6098                 return -EINVAL;
6099
6100         if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
6101                 return -EINVAL;
6102
6103         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
6104         next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
6105
6106         if (!rdev->ops->change_mpath)
6107                 return -EOPNOTSUPP;
6108
6109         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
6110                 return -EOPNOTSUPP;
6111
6112         return rdev_change_mpath(rdev, dev, dst, next_hop);
6113 }
6114
6115 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
6116 {
6117         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6118         struct net_device *dev = info->user_ptr[1];
6119         u8 *dst = NULL;
6120         u8 *next_hop = NULL;
6121
6122         if (!info->attrs[NL80211_ATTR_MAC])
6123                 return -EINVAL;
6124
6125         if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
6126                 return -EINVAL;
6127
6128         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
6129         next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
6130
6131         if (!rdev->ops->add_mpath)
6132                 return -EOPNOTSUPP;
6133
6134         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
6135                 return -EOPNOTSUPP;
6136
6137         return rdev_add_mpath(rdev, dev, dst, next_hop);
6138 }
6139
6140 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
6141 {
6142         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6143         struct net_device *dev = info->user_ptr[1];
6144         u8 *dst = NULL;
6145
6146         if (info->attrs[NL80211_ATTR_MAC])
6147                 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
6148
6149         if (!rdev->ops->del_mpath)
6150                 return -EOPNOTSUPP;
6151
6152         return rdev_del_mpath(rdev, dev, dst);
6153 }
6154
6155 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info)
6156 {
6157         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6158         int err;
6159         struct net_device *dev = info->user_ptr[1];
6160         struct mpath_info pinfo;
6161         struct sk_buff *msg;
6162         u8 *dst = NULL;
6163         u8 mpp[ETH_ALEN];
6164
6165         memset(&pinfo, 0, sizeof(pinfo));
6166
6167         if (!info->attrs[NL80211_ATTR_MAC])
6168                 return -EINVAL;
6169
6170         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
6171
6172         if (!rdev->ops->get_mpp)
6173                 return -EOPNOTSUPP;
6174
6175         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
6176                 return -EOPNOTSUPP;
6177
6178         err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo);
6179         if (err)
6180                 return err;
6181
6182         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
6183         if (!msg)
6184                 return -ENOMEM;
6185
6186         if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
6187                                dev, dst, mpp, &pinfo) < 0) {
6188                 nlmsg_free(msg);
6189                 return -ENOBUFS;
6190         }
6191
6192         return genlmsg_reply(msg, info);
6193 }
6194
6195 static int nl80211_dump_mpp(struct sk_buff *skb,
6196                             struct netlink_callback *cb)
6197 {
6198         struct mpath_info pinfo;
6199         struct cfg80211_registered_device *rdev;
6200         struct wireless_dev *wdev;
6201         u8 dst[ETH_ALEN];
6202         u8 mpp[ETH_ALEN];
6203         int path_idx = cb->args[2];
6204         int err;
6205
6206         rtnl_lock();
6207         err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
6208         if (err)
6209                 goto out_err;
6210
6211         if (!rdev->ops->dump_mpp) {
6212                 err = -EOPNOTSUPP;
6213                 goto out_err;
6214         }
6215
6216         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
6217                 err = -EOPNOTSUPP;
6218                 goto out_err;
6219         }
6220
6221         while (1) {
6222                 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst,
6223                                     mpp, &pinfo);
6224                 if (err == -ENOENT)
6225                         break;
6226                 if (err)
6227                         goto out_err;
6228
6229                 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
6230                                        cb->nlh->nlmsg_seq, NLM_F_MULTI,
6231                                        wdev->netdev, dst, mpp,
6232                                        &pinfo) < 0)
6233                         goto out;
6234
6235                 path_idx++;
6236         }
6237
6238  out:
6239         cb->args[2] = path_idx;
6240         err = skb->len;
6241  out_err:
6242         rtnl_unlock();
6243         return err;
6244 }
6245
6246 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
6247 {
6248         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6249         struct net_device *dev = info->user_ptr[1];
6250         struct wireless_dev *wdev = dev->ieee80211_ptr;
6251         struct bss_parameters params;
6252         int err;
6253
6254         memset(&params, 0, sizeof(params));
6255         /* default to not changing parameters */
6256         params.use_cts_prot = -1;
6257         params.use_short_preamble = -1;
6258         params.use_short_slot_time = -1;
6259         params.ap_isolate = -1;
6260         params.ht_opmode = -1;
6261         params.p2p_ctwindow = -1;
6262         params.p2p_opp_ps = -1;
6263
6264         if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
6265                 params.use_cts_prot =
6266                     nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
6267         if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE])
6268                 params.use_short_preamble =
6269                     nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
6270         if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME])
6271                 params.use_short_slot_time =
6272                     nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
6273         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
6274                 params.basic_rates =
6275                         nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
6276                 params.basic_rates_len =
6277                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
6278         }
6279         if (info->attrs[NL80211_ATTR_AP_ISOLATE])
6280                 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]);
6281         if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE])
6282                 params.ht_opmode =
6283                         nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]);
6284
6285         if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
6286                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
6287                         return -EINVAL;
6288                 params.p2p_ctwindow =
6289                         nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
6290                 if (params.p2p_ctwindow != 0 &&
6291                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
6292                         return -EINVAL;
6293         }
6294
6295         if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
6296                 u8 tmp;
6297
6298                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
6299                         return -EINVAL;
6300                 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
6301                 params.p2p_opp_ps = tmp;
6302                 if (params.p2p_opp_ps &&
6303                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
6304                         return -EINVAL;
6305         }
6306
6307         if (!rdev->ops->change_bss)
6308                 return -EOPNOTSUPP;
6309
6310         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
6311             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
6312                 return -EOPNOTSUPP;
6313
6314         wdev_lock(wdev);
6315         err = rdev_change_bss(rdev, dev, &params);
6316         wdev_unlock(wdev);
6317
6318         return err;
6319 }
6320
6321 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
6322 {
6323         char *data = NULL;
6324         bool is_indoor;
6325         enum nl80211_user_reg_hint_type user_reg_hint_type;
6326         u32 owner_nlportid;
6327
6328         /*
6329          * You should only get this when cfg80211 hasn't yet initialized
6330          * completely when built-in to the kernel right between the time
6331          * window between nl80211_init() and regulatory_init(), if that is
6332          * even possible.
6333          */
6334         if (unlikely(!rcu_access_pointer(cfg80211_regdomain)))
6335                 return -EINPROGRESS;
6336
6337         if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE])
6338                 user_reg_hint_type =
6339                   nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]);
6340         else
6341                 user_reg_hint_type = NL80211_USER_REG_HINT_USER;
6342
6343         switch (user_reg_hint_type) {
6344         case NL80211_USER_REG_HINT_USER:
6345         case NL80211_USER_REG_HINT_CELL_BASE:
6346                 if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
6347                         return -EINVAL;
6348
6349                 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
6350                 return regulatory_hint_user(data, user_reg_hint_type);
6351         case NL80211_USER_REG_HINT_INDOOR:
6352                 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
6353                         owner_nlportid = info->snd_portid;
6354                         is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR];
6355                 } else {
6356                         owner_nlportid = 0;
6357                         is_indoor = true;
6358                 }
6359
6360                 return regulatory_hint_indoor(is_indoor, owner_nlportid);
6361         default:
6362                 return -EINVAL;
6363         }
6364 }
6365
6366 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info)
6367 {
6368         return reg_reload_regdb();
6369 }
6370
6371 static int nl80211_get_mesh_config(struct sk_buff *skb,
6372                                    struct genl_info *info)
6373 {
6374         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6375         struct net_device *dev = info->user_ptr[1];
6376         struct wireless_dev *wdev = dev->ieee80211_ptr;
6377         struct mesh_config cur_params;
6378         int err = 0;
6379         void *hdr;
6380         struct nlattr *pinfoattr;
6381         struct sk_buff *msg;
6382
6383         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
6384                 return -EOPNOTSUPP;
6385
6386         if (!rdev->ops->get_mesh_config)
6387                 return -EOPNOTSUPP;
6388
6389         wdev_lock(wdev);
6390         /* If not connected, get default parameters */
6391         if (!wdev->mesh_id_len)
6392                 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params));
6393         else
6394                 err = rdev_get_mesh_config(rdev, dev, &cur_params);
6395         wdev_unlock(wdev);
6396
6397         if (err)
6398                 return err;
6399
6400         /* Draw up a netlink message to send back */
6401         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
6402         if (!msg)
6403                 return -ENOMEM;
6404         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
6405                              NL80211_CMD_GET_MESH_CONFIG);
6406         if (!hdr)
6407                 goto out;
6408         pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MESH_CONFIG);
6409         if (!pinfoattr)
6410                 goto nla_put_failure;
6411         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
6412             nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT,
6413                         cur_params.dot11MeshRetryTimeout) ||
6414             nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT,
6415                         cur_params.dot11MeshConfirmTimeout) ||
6416             nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT,
6417                         cur_params.dot11MeshHoldingTimeout) ||
6418             nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
6419                         cur_params.dot11MeshMaxPeerLinks) ||
6420             nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES,
6421                        cur_params.dot11MeshMaxRetries) ||
6422             nla_put_u8(msg, NL80211_MESHCONF_TTL,
6423                        cur_params.dot11MeshTTL) ||
6424             nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL,
6425                        cur_params.element_ttl) ||
6426             nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
6427                        cur_params.auto_open_plinks) ||
6428             nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
6429                         cur_params.dot11MeshNbrOffsetMaxNeighbor) ||
6430             nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
6431                        cur_params.dot11MeshHWMPmaxPREQretries) ||
6432             nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME,
6433                         cur_params.path_refresh_time) ||
6434             nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
6435                         cur_params.min_discovery_timeout) ||
6436             nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
6437                         cur_params.dot11MeshHWMPactivePathTimeout) ||
6438             nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
6439                         cur_params.dot11MeshHWMPpreqMinInterval) ||
6440             nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
6441                         cur_params.dot11MeshHWMPperrMinInterval) ||
6442             nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
6443                         cur_params.dot11MeshHWMPnetDiameterTraversalTime) ||
6444             nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE,
6445                        cur_params.dot11MeshHWMPRootMode) ||
6446             nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
6447                         cur_params.dot11MeshHWMPRannInterval) ||
6448             nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
6449                        cur_params.dot11MeshGateAnnouncementProtocol) ||
6450             nla_put_u8(msg, NL80211_MESHCONF_FORWARDING,
6451                        cur_params.dot11MeshForwarding) ||
6452             nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD,
6453                         cur_params.rssi_threshold) ||
6454             nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE,
6455                         cur_params.ht_opmode) ||
6456             nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
6457                         cur_params.dot11MeshHWMPactivePathToRootTimeout) ||
6458             nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
6459                         cur_params.dot11MeshHWMProotInterval) ||
6460             nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
6461                         cur_params.dot11MeshHWMPconfirmationInterval) ||
6462             nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE,
6463                         cur_params.power_mode) ||
6464             nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW,
6465                         cur_params.dot11MeshAwakeWindowDuration) ||
6466             nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT,
6467                         cur_params.plink_timeout) ||
6468             nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE,
6469                        cur_params.dot11MeshConnectedToMeshGate))
6470                 goto nla_put_failure;
6471         nla_nest_end(msg, pinfoattr);
6472         genlmsg_end(msg, hdr);
6473         return genlmsg_reply(msg, info);
6474
6475  nla_put_failure:
6476  out:
6477         nlmsg_free(msg);
6478         return -ENOBUFS;
6479 }
6480
6481 static const struct nla_policy
6482 nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = {
6483         [NL80211_MESHCONF_RETRY_TIMEOUT] =
6484                 NLA_POLICY_RANGE(NLA_U16, 1, 255),
6485         [NL80211_MESHCONF_CONFIRM_TIMEOUT] =
6486                 NLA_POLICY_RANGE(NLA_U16, 1, 255),
6487         [NL80211_MESHCONF_HOLDING_TIMEOUT] =
6488                 NLA_POLICY_RANGE(NLA_U16, 1, 255),
6489         [NL80211_MESHCONF_MAX_PEER_LINKS] =
6490                 NLA_POLICY_RANGE(NLA_U16, 0, 255),
6491         [NL80211_MESHCONF_MAX_RETRIES] = NLA_POLICY_MAX(NLA_U8, 16),
6492         [NL80211_MESHCONF_TTL] = NLA_POLICY_MIN(NLA_U8, 1),
6493         [NL80211_MESHCONF_ELEMENT_TTL] = NLA_POLICY_MIN(NLA_U8, 1),
6494         [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = NLA_POLICY_MAX(NLA_U8, 1),
6495         [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] =
6496                 NLA_POLICY_RANGE(NLA_U32, 1, 255),
6497         [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 },
6498         [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 },
6499         [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = NLA_POLICY_MIN(NLA_U16, 1),
6500         [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
6501         [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] =
6502                 NLA_POLICY_MIN(NLA_U16, 1),
6503         [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] =
6504                 NLA_POLICY_MIN(NLA_U16, 1),
6505         [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] =
6506                 NLA_POLICY_MIN(NLA_U16, 1),
6507         [NL80211_MESHCONF_HWMP_ROOTMODE] = NLA_POLICY_MAX(NLA_U8, 4),
6508         [NL80211_MESHCONF_HWMP_RANN_INTERVAL] =
6509                 NLA_POLICY_MIN(NLA_U16, 1),
6510         [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = NLA_POLICY_MAX(NLA_U8, 1),
6511         [NL80211_MESHCONF_FORWARDING] = NLA_POLICY_MAX(NLA_U8, 1),
6512         [NL80211_MESHCONF_RSSI_THRESHOLD] =
6513                 NLA_POLICY_RANGE(NLA_S32, -255, 0),
6514         [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 },
6515         [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 },
6516         [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] =
6517                 NLA_POLICY_MIN(NLA_U16, 1),
6518         [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] =
6519                 NLA_POLICY_MIN(NLA_U16, 1),
6520         [NL80211_MESHCONF_POWER_MODE] =
6521                 NLA_POLICY_RANGE(NLA_U32,
6522                                  NL80211_MESH_POWER_ACTIVE,
6523                                  NL80211_MESH_POWER_MAX),
6524         [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 },
6525         [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 },
6526         [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
6527 };
6528
6529 static const struct nla_policy
6530         nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
6531         [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 },
6532         [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
6533         [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
6534         [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
6535         [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 },
6536         [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG },
6537         [NL80211_MESH_SETUP_IE] =
6538                 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
6539                                        IEEE80211_MAX_DATA_LEN),
6540         [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG },
6541 };
6542
6543 static int nl80211_parse_mesh_config(struct genl_info *info,
6544                                      struct mesh_config *cfg,
6545                                      u32 *mask_out)
6546 {
6547         struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1];
6548         u32 mask = 0;
6549         u16 ht_opmode;
6550
6551 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, mask, attr, fn)       \
6552 do {                                                                    \
6553         if (tb[attr]) {                                                 \
6554                 cfg->param = fn(tb[attr]);                              \
6555                 mask |= BIT((attr) - 1);                                \
6556         }                                                               \
6557 } while (0)
6558
6559         if (!info->attrs[NL80211_ATTR_MESH_CONFIG])
6560                 return -EINVAL;
6561         if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack))
6562                 return -EINVAL;
6563
6564         /* This makes sure that there aren't more than 32 mesh config
6565          * parameters (otherwise our bitfield scheme would not work.) */
6566         BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
6567
6568         /* Fill in the params struct */
6569         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, mask,
6570                                   NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16);
6571         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, mask,
6572                                   NL80211_MESHCONF_CONFIRM_TIMEOUT,
6573                                   nla_get_u16);
6574         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, mask,
6575                                   NL80211_MESHCONF_HOLDING_TIMEOUT,
6576                                   nla_get_u16);
6577         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, mask,
6578                                   NL80211_MESHCONF_MAX_PEER_LINKS,
6579                                   nla_get_u16);
6580         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, mask,
6581                                   NL80211_MESHCONF_MAX_RETRIES, nla_get_u8);
6582         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, mask,
6583                                   NL80211_MESHCONF_TTL, nla_get_u8);
6584         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, mask,
6585                                   NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8);
6586         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, mask,
6587                                   NL80211_MESHCONF_AUTO_OPEN_PLINKS,
6588                                   nla_get_u8);
6589         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor,
6590                                   mask,
6591                                   NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
6592                                   nla_get_u32);
6593         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, mask,
6594                                   NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
6595                                   nla_get_u8);
6596         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, mask,
6597                                   NL80211_MESHCONF_PATH_REFRESH_TIME,
6598                                   nla_get_u32);
6599         if (mask & BIT(NL80211_MESHCONF_PATH_REFRESH_TIME) &&
6600             (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535))
6601                 return -EINVAL;
6602         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, mask,
6603                                   NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
6604                                   nla_get_u16);
6605         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout,
6606                                   mask,
6607                                   NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
6608                                   nla_get_u32);
6609         if (mask & BIT(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT) &&
6610             (cfg->dot11MeshHWMPactivePathTimeout < 1 ||
6611              cfg->dot11MeshHWMPactivePathTimeout > 65535))
6612                 return -EINVAL;
6613         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, mask,
6614                                   NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
6615                                   nla_get_u16);
6616         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, mask,
6617                                   NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
6618                                   nla_get_u16);
6619         FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
6620                                   dot11MeshHWMPnetDiameterTraversalTime, mask,
6621                                   NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
6622                                   nla_get_u16);
6623         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, mask,
6624                                   NL80211_MESHCONF_HWMP_ROOTMODE, nla_get_u8);
6625         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, mask,
6626                                   NL80211_MESHCONF_HWMP_RANN_INTERVAL,
6627                                   nla_get_u16);
6628         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshGateAnnouncementProtocol,
6629                                   mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
6630                                   nla_get_u8);
6631         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, mask,
6632                                   NL80211_MESHCONF_FORWARDING, nla_get_u8);
6633         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask,
6634                                   NL80211_MESHCONF_RSSI_THRESHOLD,
6635                                   nla_get_s32);
6636         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask,
6637                                   NL80211_MESHCONF_CONNECTED_TO_GATE,
6638                                   nla_get_u8);
6639         /*
6640          * Check HT operation mode based on
6641          * IEEE 802.11-2016 9.4.2.57 HT Operation element.
6642          */
6643         if (tb[NL80211_MESHCONF_HT_OPMODE]) {
6644                 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]);
6645
6646                 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION |
6647                                   IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT |
6648                                   IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
6649                         return -EINVAL;
6650
6651                 /* NON_HT_STA bit is reserved, but some programs set it */
6652                 ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT;
6653
6654                 cfg->ht_opmode = ht_opmode;
6655                 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1));
6656         }
6657         FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
6658                                   dot11MeshHWMPactivePathToRootTimeout, mask,
6659                                   NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
6660                                   nla_get_u32);
6661         if (mask & BIT(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT) &&
6662             (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 ||
6663              cfg->dot11MeshHWMPactivePathToRootTimeout > 65535))
6664                 return -EINVAL;
6665         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, mask,
6666                                   NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
6667                                   nla_get_u16);
6668         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPconfirmationInterval,
6669                                   mask,
6670                                   NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
6671                                   nla_get_u16);
6672         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, mask,
6673                                   NL80211_MESHCONF_POWER_MODE, nla_get_u32);
6674         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, mask,
6675                                   NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16);
6676         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, mask,
6677                                   NL80211_MESHCONF_PLINK_TIMEOUT, nla_get_u32);
6678         if (mask_out)
6679                 *mask_out = mask;
6680
6681         return 0;
6682
6683 #undef FILL_IN_MESH_PARAM_IF_SET
6684 }
6685
6686 static int nl80211_parse_mesh_setup(struct genl_info *info,
6687                                      struct mesh_setup *setup)
6688 {
6689         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6690         struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1];
6691
6692         if (!info->attrs[NL80211_ATTR_MESH_SETUP])
6693                 return -EINVAL;
6694         if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack))
6695                 return -EINVAL;
6696
6697         if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])
6698                 setup->sync_method =
6699                 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ?
6700                  IEEE80211_SYNC_METHOD_VENDOR :
6701                  IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET;
6702
6703         if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])
6704                 setup->path_sel_proto =
6705                 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ?
6706                  IEEE80211_PATH_PROTOCOL_VENDOR :
6707                  IEEE80211_PATH_PROTOCOL_HWMP;
6708
6709         if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])
6710                 setup->path_metric =
6711                 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ?
6712                  IEEE80211_PATH_METRIC_VENDOR :
6713                  IEEE80211_PATH_METRIC_AIRTIME;
6714
6715         if (tb[NL80211_MESH_SETUP_IE]) {
6716                 struct nlattr *ieattr =
6717                         tb[NL80211_MESH_SETUP_IE];
6718                 setup->ie = nla_data(ieattr);
6719                 setup->ie_len = nla_len(ieattr);
6720         }
6721         if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] &&
6722             !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM))
6723                 return -EINVAL;
6724         setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]);
6725         setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]);
6726         setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]);
6727         if (setup->is_secure)
6728                 setup->user_mpm = true;
6729
6730         if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) {
6731                 if (!setup->user_mpm)
6732                         return -EINVAL;
6733                 setup->auth_id =
6734                         nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]);
6735         }
6736
6737         return 0;
6738 }
6739
6740 static int nl80211_update_mesh_config(struct sk_buff *skb,
6741                                       struct genl_info *info)
6742 {
6743         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6744         struct net_device *dev = info->user_ptr[1];
6745         struct wireless_dev *wdev = dev->ieee80211_ptr;
6746         struct mesh_config cfg;
6747         u32 mask;
6748         int err;
6749
6750         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
6751                 return -EOPNOTSUPP;
6752
6753         if (!rdev->ops->update_mesh_config)
6754                 return -EOPNOTSUPP;
6755
6756         err = nl80211_parse_mesh_config(info, &cfg, &mask);
6757         if (err)
6758                 return err;
6759
6760         wdev_lock(wdev);
6761         if (!wdev->mesh_id_len)
6762                 err = -ENOLINK;
6763
6764         if (!err)
6765                 err = rdev_update_mesh_config(rdev, dev, mask, &cfg);
6766
6767         wdev_unlock(wdev);
6768
6769         return err;
6770 }
6771
6772 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom,
6773                               struct sk_buff *msg)
6774 {
6775         struct nlattr *nl_reg_rules;
6776         unsigned int i;
6777
6778         if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) ||
6779             (regdom->dfs_region &&
6780              nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region)))
6781                 goto nla_put_failure;
6782
6783         nl_reg_rules = nla_nest_start_noflag(msg, NL80211_ATTR_REG_RULES);
6784         if (!nl_reg_rules)
6785                 goto nla_put_failure;
6786
6787         for (i = 0; i < regdom->n_reg_rules; i++) {
6788                 struct nlattr *nl_reg_rule;
6789                 const struct ieee80211_reg_rule *reg_rule;
6790                 const struct ieee80211_freq_range *freq_range;
6791                 const struct ieee80211_power_rule *power_rule;
6792                 unsigned int max_bandwidth_khz;
6793
6794                 reg_rule = &regdom->reg_rules[i];
6795                 freq_range = &reg_rule->freq_range;
6796                 power_rule = &reg_rule->power_rule;
6797
6798                 nl_reg_rule = nla_nest_start_noflag(msg, i);
6799                 if (!nl_reg_rule)
6800                         goto nla_put_failure;
6801
6802                 max_bandwidth_khz = freq_range->max_bandwidth_khz;
6803                 if (!max_bandwidth_khz)
6804                         max_bandwidth_khz = reg_get_max_bandwidth(regdom,
6805                                                                   reg_rule);
6806
6807                 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS,
6808                                 reg_rule->flags) ||
6809                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START,
6810                                 freq_range->start_freq_khz) ||
6811                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END,
6812                                 freq_range->end_freq_khz) ||
6813                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW,
6814                                 max_bandwidth_khz) ||
6815                     nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
6816                                 power_rule->max_antenna_gain) ||
6817                     nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP,
6818                                 power_rule->max_eirp) ||
6819                     nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME,
6820                                 reg_rule->dfs_cac_ms))
6821                         goto nla_put_failure;
6822
6823                 nla_nest_end(msg, nl_reg_rule);
6824         }
6825
6826         nla_nest_end(msg, nl_reg_rules);
6827         return 0;
6828
6829 nla_put_failure:
6830         return -EMSGSIZE;
6831 }
6832
6833 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info)
6834 {
6835         const struct ieee80211_regdomain *regdom = NULL;
6836         struct cfg80211_registered_device *rdev;
6837         struct wiphy *wiphy = NULL;
6838         struct sk_buff *msg;
6839         void *hdr;
6840
6841         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
6842         if (!msg)
6843                 return -ENOBUFS;
6844
6845         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
6846                              NL80211_CMD_GET_REG);
6847         if (!hdr)
6848                 goto put_failure;
6849
6850         if (info->attrs[NL80211_ATTR_WIPHY]) {
6851                 bool self_managed;
6852
6853                 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
6854                 if (IS_ERR(rdev)) {
6855                         nlmsg_free(msg);
6856                         return PTR_ERR(rdev);
6857                 }
6858
6859                 wiphy = &rdev->wiphy;
6860                 self_managed = wiphy->regulatory_flags &
6861                                REGULATORY_WIPHY_SELF_MANAGED;
6862                 regdom = get_wiphy_regdom(wiphy);
6863
6864                 /* a self-managed-reg device must have a private regdom */
6865                 if (WARN_ON(!regdom && self_managed)) {
6866                         nlmsg_free(msg);
6867                         return -EINVAL;
6868                 }
6869
6870                 if (regdom &&
6871                     nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
6872                         goto nla_put_failure;
6873         }
6874
6875         if (!wiphy && reg_last_request_cell_base() &&
6876             nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
6877                         NL80211_USER_REG_HINT_CELL_BASE))
6878                 goto nla_put_failure;
6879
6880         rcu_read_lock();
6881
6882         if (!regdom)
6883                 regdom = rcu_dereference(cfg80211_regdomain);
6884
6885         if (nl80211_put_regdom(regdom, msg))
6886                 goto nla_put_failure_rcu;
6887
6888         rcu_read_unlock();
6889
6890         genlmsg_end(msg, hdr);
6891         return genlmsg_reply(msg, info);
6892
6893 nla_put_failure_rcu:
6894         rcu_read_unlock();
6895 nla_put_failure:
6896 put_failure:
6897         nlmsg_free(msg);
6898         return -EMSGSIZE;
6899 }
6900
6901 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb,
6902                                u32 seq, int flags, struct wiphy *wiphy,
6903                                const struct ieee80211_regdomain *regdom)
6904 {
6905         void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
6906                                    NL80211_CMD_GET_REG);
6907
6908         if (!hdr)
6909                 return -1;
6910
6911         genl_dump_check_consistent(cb, hdr);
6912
6913         if (nl80211_put_regdom(regdom, msg))
6914                 goto nla_put_failure;
6915
6916         if (!wiphy && reg_last_request_cell_base() &&
6917             nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
6918                         NL80211_USER_REG_HINT_CELL_BASE))
6919                 goto nla_put_failure;
6920
6921         if (wiphy &&
6922             nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
6923                 goto nla_put_failure;
6924
6925         if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
6926             nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
6927                 goto nla_put_failure;
6928
6929         genlmsg_end(msg, hdr);
6930         return 0;
6931
6932 nla_put_failure:
6933         genlmsg_cancel(msg, hdr);
6934         return -EMSGSIZE;
6935 }
6936
6937 static int nl80211_get_reg_dump(struct sk_buff *skb,
6938                                 struct netlink_callback *cb)
6939 {
6940         const struct ieee80211_regdomain *regdom = NULL;
6941         struct cfg80211_registered_device *rdev;
6942         int err, reg_idx, start = cb->args[2];
6943
6944         rtnl_lock();
6945
6946         if (cfg80211_regdomain && start == 0) {
6947                 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
6948                                           NLM_F_MULTI, NULL,
6949                                           rtnl_dereference(cfg80211_regdomain));
6950                 if (err < 0)
6951                         goto out_err;
6952         }
6953
6954         /* the global regdom is idx 0 */
6955         reg_idx = 1;
6956         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
6957                 regdom = get_wiphy_regdom(&rdev->wiphy);
6958                 if (!regdom)
6959                         continue;
6960
6961                 if (++reg_idx <= start)
6962                         continue;
6963
6964                 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
6965                                           NLM_F_MULTI, &rdev->wiphy, regdom);
6966                 if (err < 0) {
6967                         reg_idx--;
6968                         break;
6969                 }
6970         }
6971
6972         cb->args[2] = reg_idx;
6973         err = skb->len;
6974 out_err:
6975         rtnl_unlock();
6976         return err;
6977 }
6978
6979 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
6980 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
6981         [NL80211_ATTR_REG_RULE_FLAGS]           = { .type = NLA_U32 },
6982         [NL80211_ATTR_FREQ_RANGE_START]         = { .type = NLA_U32 },
6983         [NL80211_ATTR_FREQ_RANGE_END]           = { .type = NLA_U32 },
6984         [NL80211_ATTR_FREQ_RANGE_MAX_BW]        = { .type = NLA_U32 },
6985         [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]  = { .type = NLA_U32 },
6986         [NL80211_ATTR_POWER_RULE_MAX_EIRP]      = { .type = NLA_U32 },
6987         [NL80211_ATTR_DFS_CAC_TIME]             = { .type = NLA_U32 },
6988 };
6989
6990 static int parse_reg_rule(struct nlattr *tb[],
6991         struct ieee80211_reg_rule *reg_rule)
6992 {
6993         struct ieee80211_freq_range *freq_range = &reg_rule->freq_range;
6994         struct ieee80211_power_rule *power_rule = &reg_rule->power_rule;
6995
6996         if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
6997                 return -EINVAL;
6998         if (!tb[NL80211_ATTR_FREQ_RANGE_START])
6999                 return -EINVAL;
7000         if (!tb[NL80211_ATTR_FREQ_RANGE_END])
7001                 return -EINVAL;
7002         if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
7003                 return -EINVAL;
7004         if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
7005                 return -EINVAL;
7006
7007         reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
7008
7009         freq_range->start_freq_khz =
7010                 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
7011         freq_range->end_freq_khz =
7012                 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
7013         freq_range->max_bandwidth_khz =
7014                 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
7015
7016         power_rule->max_eirp =
7017                 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
7018
7019         if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
7020                 power_rule->max_antenna_gain =
7021                         nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
7022
7023         if (tb[NL80211_ATTR_DFS_CAC_TIME])
7024                 reg_rule->dfs_cac_ms =
7025                         nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]);
7026
7027         return 0;
7028 }
7029
7030 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
7031 {
7032         struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
7033         struct nlattr *nl_reg_rule;
7034         char *alpha2;
7035         int rem_reg_rules, r;
7036         u32 num_rules = 0, rule_idx = 0;
7037         enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET;
7038         struct ieee80211_regdomain *rd;
7039
7040         if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
7041                 return -EINVAL;
7042
7043         if (!info->attrs[NL80211_ATTR_REG_RULES])
7044                 return -EINVAL;
7045
7046         alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
7047
7048         if (info->attrs[NL80211_ATTR_DFS_REGION])
7049                 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]);
7050
7051         nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
7052                             rem_reg_rules) {
7053                 num_rules++;
7054                 if (num_rules > NL80211_MAX_SUPP_REG_RULES)
7055                         return -EINVAL;
7056         }
7057
7058         if (!reg_is_valid_request(alpha2))
7059                 return -EINVAL;
7060
7061         rd = kzalloc(struct_size(rd, reg_rules, num_rules), GFP_KERNEL);
7062         if (!rd)
7063                 return -ENOMEM;
7064
7065         rd->n_reg_rules = num_rules;
7066         rd->alpha2[0] = alpha2[0];
7067         rd->alpha2[1] = alpha2[1];
7068
7069         /*
7070          * Disable DFS master mode if the DFS region was
7071          * not supported or known on this kernel.
7072          */
7073         if (reg_supported_dfs_region(dfs_region))
7074                 rd->dfs_region = dfs_region;
7075
7076         nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
7077                             rem_reg_rules) {
7078                 r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX,
7079                                                 nl_reg_rule, reg_rule_policy,
7080                                                 info->extack);
7081                 if (r)
7082                         goto bad_reg;
7083                 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
7084                 if (r)
7085                         goto bad_reg;
7086
7087                 rule_idx++;
7088
7089                 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) {
7090                         r = -EINVAL;
7091                         goto bad_reg;
7092                 }
7093         }
7094
7095         /* set_regdom takes ownership of rd */
7096         return set_regdom(rd, REGD_SOURCE_CRDA);
7097  bad_reg:
7098         kfree(rd);
7099         return r;
7100 }
7101 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */
7102
7103 static int validate_scan_freqs(struct nlattr *freqs)
7104 {
7105         struct nlattr *attr1, *attr2;
7106         int n_channels = 0, tmp1, tmp2;
7107
7108         nla_for_each_nested(attr1, freqs, tmp1)
7109                 if (nla_len(attr1) != sizeof(u32))
7110                         return 0;
7111
7112         nla_for_each_nested(attr1, freqs, tmp1) {
7113                 n_channels++;
7114                 /*
7115                  * Some hardware has a limited channel list for
7116                  * scanning, and it is pretty much nonsensical
7117                  * to scan for a channel twice, so disallow that
7118                  * and don't require drivers to check that the
7119                  * channel list they get isn't longer than what
7120                  * they can scan, as long as they can scan all
7121                  * the channels they registered at once.
7122                  */
7123                 nla_for_each_nested(attr2, freqs, tmp2)
7124                         if (attr1 != attr2 &&
7125                             nla_get_u32(attr1) == nla_get_u32(attr2))
7126                                 return 0;
7127         }
7128
7129         return n_channels;
7130 }
7131
7132 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b)
7133 {
7134         return b < NUM_NL80211_BANDS && wiphy->bands[b];
7135 }
7136
7137 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy,
7138                             struct cfg80211_bss_selection *bss_select)
7139 {
7140         struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1];
7141         struct nlattr *nest;
7142         int err;
7143         bool found = false;
7144         int i;
7145
7146         /* only process one nested attribute */
7147         nest = nla_data(nla);
7148         if (!nla_ok(nest, nla_len(nest)))
7149                 return -EINVAL;
7150
7151         err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX,
7152                                           nest, nl80211_bss_select_policy,
7153                                           NULL);
7154         if (err)
7155                 return err;
7156
7157         /* only one attribute may be given */
7158         for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) {
7159                 if (attr[i]) {
7160                         if (found)
7161                                 return -EINVAL;
7162                         found = true;
7163                 }
7164         }
7165
7166         bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID;
7167
7168         if (attr[NL80211_BSS_SELECT_ATTR_RSSI])
7169                 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI;
7170
7171         if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) {
7172                 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF;
7173                 bss_select->param.band_pref =
7174                         nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]);
7175                 if (!is_band_valid(wiphy, bss_select->param.band_pref))
7176                         return -EINVAL;
7177         }
7178
7179         if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) {
7180                 struct nl80211_bss_select_rssi_adjust *adj_param;
7181
7182                 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]);
7183                 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST;
7184                 bss_select->param.adjust.band = adj_param->band;
7185                 bss_select->param.adjust.delta = adj_param->delta;
7186                 if (!is_band_valid(wiphy, bss_select->param.adjust.band))
7187                         return -EINVAL;
7188         }
7189
7190         /* user-space did not provide behaviour attribute */
7191         if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID)
7192                 return -EINVAL;
7193
7194         if (!(wiphy->bss_select_support & BIT(bss_select->behaviour)))
7195                 return -EINVAL;
7196
7197         return 0;
7198 }
7199
7200 int nl80211_parse_random_mac(struct nlattr **attrs,
7201                              u8 *mac_addr, u8 *mac_addr_mask)
7202 {
7203         int i;
7204
7205         if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) {
7206                 eth_zero_addr(mac_addr);
7207                 eth_zero_addr(mac_addr_mask);
7208                 mac_addr[0] = 0x2;
7209                 mac_addr_mask[0] = 0x3;
7210
7211                 return 0;
7212         }
7213
7214         /* need both or none */
7215         if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK])
7216                 return -EINVAL;
7217
7218         memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN);
7219         memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN);
7220
7221         /* don't allow or configure an mcast address */
7222         if (!is_multicast_ether_addr(mac_addr_mask) ||
7223             is_multicast_ether_addr(mac_addr))
7224                 return -EINVAL;
7225
7226         /*
7227          * allow users to pass a MAC address that has bits set outside
7228          * of the mask, but don't bother drivers with having to deal
7229          * with such bits
7230          */
7231         for (i = 0; i < ETH_ALEN; i++)
7232                 mac_addr[i] &= mac_addr_mask[i];
7233
7234         return 0;
7235 }
7236
7237 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev)
7238 {
7239         ASSERT_WDEV_LOCK(wdev);
7240
7241         if (!cfg80211_beaconing_iface_active(wdev))
7242                 return true;
7243
7244         if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR))
7245                 return true;
7246
7247         return regulatory_pre_cac_allowed(wdev->wiphy);
7248 }
7249
7250 static bool nl80211_check_scan_feat(struct wiphy *wiphy, u32 flags, u32 flag,
7251                                     enum nl80211_ext_feature_index feat)
7252 {
7253         if (!(flags & flag))
7254                 return true;
7255         if (wiphy_ext_feature_isset(wiphy, feat))
7256                 return true;
7257         return false;
7258 }
7259
7260 static int
7261 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev,
7262                          void *request, struct nlattr **attrs,
7263                          bool is_sched_scan)
7264 {
7265         u8 *mac_addr, *mac_addr_mask;
7266         u32 *flags;
7267         enum nl80211_feature_flags randomness_flag;
7268
7269         if (!attrs[NL80211_ATTR_SCAN_FLAGS])
7270                 return 0;
7271
7272         if (is_sched_scan) {
7273                 struct cfg80211_sched_scan_request *req = request;
7274
7275                 randomness_flag = wdev ?
7276                                   NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR :
7277                                   NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
7278                 flags = &req->flags;
7279                 mac_addr = req->mac_addr;
7280                 mac_addr_mask = req->mac_addr_mask;
7281         } else {
7282                 struct cfg80211_scan_request *req = request;
7283
7284                 randomness_flag = NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
7285                 flags = &req->flags;
7286                 mac_addr = req->mac_addr;
7287                 mac_addr_mask = req->mac_addr_mask;
7288         }
7289
7290         *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]);
7291
7292         if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
7293              !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) ||
7294             !nl80211_check_scan_feat(wiphy, *flags,
7295                                      NL80211_SCAN_FLAG_LOW_SPAN,
7296                                      NL80211_EXT_FEATURE_LOW_SPAN_SCAN) ||
7297             !nl80211_check_scan_feat(wiphy, *flags,
7298                                      NL80211_SCAN_FLAG_LOW_POWER,
7299                                      NL80211_EXT_FEATURE_LOW_POWER_SCAN) ||
7300             !nl80211_check_scan_feat(wiphy, *flags,
7301                                      NL80211_SCAN_FLAG_HIGH_ACCURACY,
7302                                      NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN) ||
7303             !nl80211_check_scan_feat(wiphy, *flags,
7304                                      NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME,
7305                                      NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME) ||
7306             !nl80211_check_scan_feat(wiphy, *flags,
7307                                      NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP,
7308                                      NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP) ||
7309             !nl80211_check_scan_feat(wiphy, *flags,
7310                                      NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION,
7311                                      NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) ||
7312             !nl80211_check_scan_feat(wiphy, *flags,
7313                                      NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE,
7314                                      NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE) ||
7315             !nl80211_check_scan_feat(wiphy, *flags,
7316                                      NL80211_SCAN_FLAG_RANDOM_SN,
7317                                      NL80211_EXT_FEATURE_SCAN_RANDOM_SN) ||
7318             !nl80211_check_scan_feat(wiphy, *flags,
7319                                      NL80211_SCAN_FLAG_MIN_PREQ_CONTENT,
7320                                      NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT))
7321                 return -EOPNOTSUPP;
7322
7323         if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
7324                 int err;
7325
7326                 if (!(wiphy->features & randomness_flag) ||
7327                     (wdev && wdev->current_bss))
7328                         return -EOPNOTSUPP;
7329
7330                 err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask);
7331                 if (err)
7332                         return err;
7333         }
7334
7335         return 0;
7336 }
7337
7338 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
7339 {
7340         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7341         struct wireless_dev *wdev = info->user_ptr[1];
7342         struct cfg80211_scan_request *request;
7343         struct nlattr *attr;
7344         struct wiphy *wiphy;
7345         int err, tmp, n_ssids = 0, n_channels, i;
7346         size_t ie_len;
7347
7348         wiphy = &rdev->wiphy;
7349
7350         if (wdev->iftype == NL80211_IFTYPE_NAN)
7351                 return -EOPNOTSUPP;
7352
7353         if (!rdev->ops->scan)
7354                 return -EOPNOTSUPP;
7355
7356         if (rdev->scan_req || rdev->scan_msg) {
7357                 err = -EBUSY;
7358                 goto unlock;
7359         }
7360
7361         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
7362                 n_channels = validate_scan_freqs(
7363                                 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
7364                 if (!n_channels) {
7365                         err = -EINVAL;
7366                         goto unlock;
7367                 }
7368         } else {
7369                 n_channels = ieee80211_get_num_supported_channels(wiphy);
7370         }
7371
7372         if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
7373                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
7374                         n_ssids++;
7375
7376         if (n_ssids > wiphy->max_scan_ssids) {
7377                 err = -EINVAL;
7378                 goto unlock;
7379         }
7380
7381         if (info->attrs[NL80211_ATTR_IE])
7382                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
7383         else
7384                 ie_len = 0;
7385
7386         if (ie_len > wiphy->max_scan_ie_len) {
7387                 err = -EINVAL;
7388                 goto unlock;
7389         }
7390
7391         request = kzalloc(sizeof(*request)
7392                         + sizeof(*request->ssids) * n_ssids
7393                         + sizeof(*request->channels) * n_channels
7394                         + ie_len, GFP_KERNEL);
7395         if (!request) {
7396                 err = -ENOMEM;
7397                 goto unlock;
7398         }
7399
7400         if (n_ssids)
7401                 request->ssids = (void *)&request->channels[n_channels];
7402         request->n_ssids = n_ssids;
7403         if (ie_len) {
7404                 if (n_ssids)
7405                         request->ie = (void *)(request->ssids + n_ssids);
7406                 else
7407                         request->ie = (void *)(request->channels + n_channels);
7408         }
7409
7410         i = 0;
7411         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
7412                 /* user specified, bail out if channel not found */
7413                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) {
7414                         struct ieee80211_channel *chan;
7415
7416                         chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
7417
7418                         if (!chan) {
7419                                 err = -EINVAL;
7420                                 goto out_free;
7421                         }
7422
7423                         /* ignore disabled channels */
7424                         if (chan->flags & IEEE80211_CHAN_DISABLED)
7425                                 continue;
7426
7427                         request->channels[i] = chan;
7428                         i++;
7429                 }
7430         } else {
7431                 enum nl80211_band band;
7432
7433                 /* all channels */
7434                 for (band = 0; band < NUM_NL80211_BANDS; band++) {
7435                         int j;
7436
7437                         if (!wiphy->bands[band])
7438                                 continue;
7439                         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
7440                                 struct ieee80211_channel *chan;
7441
7442                                 chan = &wiphy->bands[band]->channels[j];
7443
7444                                 if (chan->flags & IEEE80211_CHAN_DISABLED)
7445                                         continue;
7446
7447                                 request->channels[i] = chan;
7448                                 i++;
7449                         }
7450                 }
7451         }
7452
7453         if (!i) {
7454                 err = -EINVAL;
7455                 goto out_free;
7456         }
7457
7458         request->n_channels = i;
7459
7460         wdev_lock(wdev);
7461         if (!cfg80211_off_channel_oper_allowed(wdev)) {
7462                 struct ieee80211_channel *chan;
7463
7464                 if (request->n_channels != 1) {
7465                         wdev_unlock(wdev);
7466                         err = -EBUSY;
7467                         goto out_free;
7468                 }
7469
7470                 chan = request->channels[0];
7471                 if (chan->center_freq != wdev->chandef.chan->center_freq) {
7472                         wdev_unlock(wdev);
7473                         err = -EBUSY;
7474                         goto out_free;
7475                 }
7476         }
7477         wdev_unlock(wdev);
7478
7479         i = 0;
7480         if (n_ssids) {
7481                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
7482                         if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
7483                                 err = -EINVAL;
7484                                 goto out_free;
7485                         }
7486                         request->ssids[i].ssid_len = nla_len(attr);
7487                         memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
7488                         i++;
7489                 }
7490         }
7491
7492         if (info->attrs[NL80211_ATTR_IE]) {
7493                 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
7494                 memcpy((void *)request->ie,
7495                        nla_data(info->attrs[NL80211_ATTR_IE]),
7496                        request->ie_len);
7497         }
7498
7499         for (i = 0; i < NUM_NL80211_BANDS; i++)
7500                 if (wiphy->bands[i])
7501                         request->rates[i] =
7502                                 (1 << wiphy->bands[i]->n_bitrates) - 1;
7503
7504         if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) {
7505                 nla_for_each_nested(attr,
7506                                     info->attrs[NL80211_ATTR_SCAN_SUPP_RATES],
7507                                     tmp) {
7508                         enum nl80211_band band = nla_type(attr);
7509
7510                         if (band < 0 || band >= NUM_NL80211_BANDS) {
7511                                 err = -EINVAL;
7512                                 goto out_free;
7513                         }
7514
7515                         if (!wiphy->bands[band])
7516                                 continue;
7517
7518                         err = ieee80211_get_ratemask(wiphy->bands[band],
7519                                                      nla_data(attr),
7520                                                      nla_len(attr),
7521                                                      &request->rates[band]);
7522                         if (err)
7523                                 goto out_free;
7524                 }
7525         }
7526
7527         if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) {
7528                 if (!wiphy_ext_feature_isset(wiphy,
7529                                         NL80211_EXT_FEATURE_SET_SCAN_DWELL)) {
7530                         err = -EOPNOTSUPP;
7531                         goto out_free;
7532                 }
7533
7534                 request->duration =
7535                         nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]);
7536                 request->duration_mandatory =
7537                         nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]);
7538         }
7539
7540         err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs,
7541                                        false);
7542         if (err)
7543                 goto out_free;
7544
7545         request->no_cck =
7546                 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
7547
7548         /* Initial implementation used NL80211_ATTR_MAC to set the specific
7549          * BSSID to scan for. This was problematic because that same attribute
7550          * was already used for another purpose (local random MAC address). The
7551          * NL80211_ATTR_BSSID attribute was added to fix this. For backwards
7552          * compatibility with older userspace components, also use the
7553          * NL80211_ATTR_MAC value here if it can be determined to be used for
7554          * the specific BSSID use case instead of the random MAC address
7555          * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use).
7556          */
7557         if (info->attrs[NL80211_ATTR_BSSID])
7558                 memcpy(request->bssid,
7559                        nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN);
7560         else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) &&
7561                  info->attrs[NL80211_ATTR_MAC])
7562                 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]),
7563                        ETH_ALEN);
7564         else
7565                 eth_broadcast_addr(request->bssid);
7566
7567         request->wdev = wdev;
7568         request->wiphy = &rdev->wiphy;
7569         request->scan_start = jiffies;
7570
7571         rdev->scan_req = request;
7572         err = rdev_scan(rdev, request);
7573
7574         if (!err) {
7575                 nl80211_send_scan_start(rdev, wdev);
7576                 if (wdev->netdev)
7577                         dev_hold(wdev->netdev);
7578         } else {
7579  out_free:
7580                 rdev->scan_req = NULL;
7581                 kfree(request);
7582         }
7583
7584  unlock:
7585         return err;
7586 }
7587
7588 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info)
7589 {
7590         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7591         struct wireless_dev *wdev = info->user_ptr[1];
7592
7593         if (!rdev->ops->abort_scan)
7594                 return -EOPNOTSUPP;
7595
7596         if (rdev->scan_msg)
7597                 return 0;
7598
7599         if (!rdev->scan_req)
7600                 return -ENOENT;
7601
7602         rdev_abort_scan(rdev, wdev);
7603         return 0;
7604 }
7605
7606 static int
7607 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans,
7608                                struct cfg80211_sched_scan_request *request,
7609                                struct nlattr **attrs)
7610 {
7611         int tmp, err, i = 0;
7612         struct nlattr *attr;
7613
7614         if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
7615                 u32 interval;
7616
7617                 /*
7618                  * If scan plans are not specified,
7619                  * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this
7620                  * case one scan plan will be set with the specified scan
7621                  * interval and infinite number of iterations.
7622                  */
7623                 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]);
7624                 if (!interval)
7625                         return -EINVAL;
7626
7627                 request->scan_plans[0].interval =
7628                         DIV_ROUND_UP(interval, MSEC_PER_SEC);
7629                 if (!request->scan_plans[0].interval)
7630                         return -EINVAL;
7631
7632                 if (request->scan_plans[0].interval >
7633                     wiphy->max_sched_scan_plan_interval)
7634                         request->scan_plans[0].interval =
7635                                 wiphy->max_sched_scan_plan_interval;
7636
7637                 return 0;
7638         }
7639
7640         nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) {
7641                 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1];
7642
7643                 if (WARN_ON(i >= n_plans))
7644                         return -EINVAL;
7645
7646                 err = nla_parse_nested_deprecated(plan,
7647                                                   NL80211_SCHED_SCAN_PLAN_MAX,
7648                                                   attr, nl80211_plan_policy,
7649                                                   NULL);
7650                 if (err)
7651                         return err;
7652
7653                 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL])
7654                         return -EINVAL;
7655
7656                 request->scan_plans[i].interval =
7657                         nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]);
7658                 if (!request->scan_plans[i].interval ||
7659                     request->scan_plans[i].interval >
7660                     wiphy->max_sched_scan_plan_interval)
7661                         return -EINVAL;
7662
7663                 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) {
7664                         request->scan_plans[i].iterations =
7665                                 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]);
7666                         if (!request->scan_plans[i].iterations ||
7667                             (request->scan_plans[i].iterations >
7668                              wiphy->max_sched_scan_plan_iterations))
7669                                 return -EINVAL;
7670                 } else if (i < n_plans - 1) {
7671                         /*
7672                          * All scan plans but the last one must specify
7673                          * a finite number of iterations
7674                          */
7675                         return -EINVAL;
7676                 }
7677
7678                 i++;
7679         }
7680
7681         /*
7682          * The last scan plan must not specify the number of
7683          * iterations, it is supposed to run infinitely
7684          */
7685         if (request->scan_plans[n_plans - 1].iterations)
7686                 return  -EINVAL;
7687
7688         return 0;
7689 }
7690
7691 static int
7692 nl80211_parse_sched_scan_per_band_rssi(struct wiphy *wiphy,
7693                                        struct cfg80211_match_set *match_sets,
7694                                        struct nlattr *tb_band_rssi,
7695                                        s32 rssi_thold)
7696 {
7697         struct nlattr *attr;
7698         int i, tmp, ret = 0;
7699
7700         if (!wiphy_ext_feature_isset(wiphy,
7701                     NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD)) {
7702                 if (tb_band_rssi)
7703                         ret = -EOPNOTSUPP;
7704                 else
7705                         for (i = 0; i < NUM_NL80211_BANDS; i++)
7706                                 match_sets->per_band_rssi_thold[i] =
7707                                         NL80211_SCAN_RSSI_THOLD_OFF;
7708                 return ret;
7709         }
7710
7711         for (i = 0; i < NUM_NL80211_BANDS; i++)
7712                 match_sets->per_band_rssi_thold[i] = rssi_thold;
7713
7714         nla_for_each_nested(attr, tb_band_rssi, tmp) {
7715                 enum nl80211_band band = nla_type(attr);
7716
7717                 if (band < 0 || band >= NUM_NL80211_BANDS)
7718                         return -EINVAL;
7719
7720                 match_sets->per_band_rssi_thold[band] = nla_get_s32(attr);
7721         }
7722
7723         return 0;
7724 }
7725
7726 static struct cfg80211_sched_scan_request *
7727 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
7728                          struct nlattr **attrs, int max_match_sets)
7729 {
7730         struct cfg80211_sched_scan_request *request;
7731         struct nlattr *attr;
7732         int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0;
7733         enum nl80211_band band;
7734         size_t ie_len;
7735         struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1];
7736         s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF;
7737
7738         if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
7739                 n_channels = validate_scan_freqs(
7740                                 attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
7741                 if (!n_channels)
7742                         return ERR_PTR(-EINVAL);
7743         } else {
7744                 n_channels = ieee80211_get_num_supported_channels(wiphy);
7745         }
7746
7747         if (attrs[NL80211_ATTR_SCAN_SSIDS])
7748                 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
7749                                     tmp)
7750                         n_ssids++;
7751
7752         if (n_ssids > wiphy->max_sched_scan_ssids)
7753                 return ERR_PTR(-EINVAL);
7754
7755         /*
7756          * First, count the number of 'real' matchsets. Due to an issue with
7757          * the old implementation, matchsets containing only the RSSI attribute
7758          * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default'
7759          * RSSI for all matchsets, rather than their own matchset for reporting
7760          * all APs with a strong RSSI. This is needed to be compatible with
7761          * older userspace that treated a matchset with only the RSSI as the
7762          * global RSSI for all other matchsets - if there are other matchsets.
7763          */
7764         if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
7765                 nla_for_each_nested(attr,
7766                                     attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
7767                                     tmp) {
7768                         struct nlattr *rssi;
7769
7770                         err = nla_parse_nested_deprecated(tb,
7771                                                           NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
7772                                                           attr,
7773                                                           nl80211_match_policy,
7774                                                           NULL);
7775                         if (err)
7776                                 return ERR_PTR(err);
7777
7778                         /* SSID and BSSID are mutually exclusive */
7779                         if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] &&
7780                             tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID])
7781                                 return ERR_PTR(-EINVAL);
7782
7783                         /* add other standalone attributes here */
7784                         if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] ||
7785                             tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) {
7786                                 n_match_sets++;
7787                                 continue;
7788                         }
7789                         rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
7790                         if (rssi)
7791                                 default_match_rssi = nla_get_s32(rssi);
7792                 }
7793         }
7794
7795         /* However, if there's no other matchset, add the RSSI one */
7796         if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
7797                 n_match_sets = 1;
7798
7799         if (n_match_sets > max_match_sets)
7800                 return ERR_PTR(-EINVAL);
7801
7802         if (attrs[NL80211_ATTR_IE])
7803                 ie_len = nla_len(attrs[NL80211_ATTR_IE]);
7804         else
7805                 ie_len = 0;
7806
7807         if (ie_len > wiphy->max_sched_scan_ie_len)
7808                 return ERR_PTR(-EINVAL);
7809
7810         if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
7811                 /*
7812                  * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since
7813                  * each scan plan already specifies its own interval
7814                  */
7815                 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
7816                         return ERR_PTR(-EINVAL);
7817
7818                 nla_for_each_nested(attr,
7819                                     attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp)
7820                         n_plans++;
7821         } else {
7822                 /*
7823                  * The scan interval attribute is kept for backward
7824                  * compatibility. If no scan plans are specified and sched scan
7825                  * interval is specified, one scan plan will be set with this
7826                  * scan interval and infinite number of iterations.
7827                  */
7828                 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
7829                         return ERR_PTR(-EINVAL);
7830
7831                 n_plans = 1;
7832         }
7833
7834         if (!n_plans || n_plans > wiphy->max_sched_scan_plans)
7835                 return ERR_PTR(-EINVAL);
7836
7837         if (!wiphy_ext_feature_isset(
7838                     wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) &&
7839             (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] ||
7840              attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]))
7841                 return ERR_PTR(-EINVAL);
7842
7843         request = kzalloc(sizeof(*request)
7844                         + sizeof(*request->ssids) * n_ssids
7845                         + sizeof(*request->match_sets) * n_match_sets
7846                         + sizeof(*request->scan_plans) * n_plans
7847                         + sizeof(*request->channels) * n_channels
7848                         + ie_len, GFP_KERNEL);
7849         if (!request)
7850                 return ERR_PTR(-ENOMEM);
7851
7852         if (n_ssids)
7853                 request->ssids = (void *)&request->channels[n_channels];
7854         request->n_ssids = n_ssids;
7855         if (ie_len) {
7856                 if (n_ssids)
7857                         request->ie = (void *)(request->ssids + n_ssids);
7858                 else
7859                         request->ie = (void *)(request->channels + n_channels);
7860         }
7861
7862         if (n_match_sets) {
7863                 if (request->ie)
7864                         request->match_sets = (void *)(request->ie + ie_len);
7865                 else if (n_ssids)
7866                         request->match_sets =
7867                                 (void *)(request->ssids + n_ssids);
7868                 else
7869                         request->match_sets =
7870                                 (void *)(request->channels + n_channels);
7871         }
7872         request->n_match_sets = n_match_sets;
7873
7874         if (n_match_sets)
7875                 request->scan_plans = (void *)(request->match_sets +
7876                                                n_match_sets);
7877         else if (request->ie)
7878                 request->scan_plans = (void *)(request->ie + ie_len);
7879         else if (n_ssids)
7880                 request->scan_plans = (void *)(request->ssids + n_ssids);
7881         else
7882                 request->scan_plans = (void *)(request->channels + n_channels);
7883
7884         request->n_scan_plans = n_plans;
7885
7886         i = 0;
7887         if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
7888                 /* user specified, bail out if channel not found */
7889                 nla_for_each_nested(attr,
7890                                     attrs[NL80211_ATTR_SCAN_FREQUENCIES],
7891                                     tmp) {
7892                         struct ieee80211_channel *chan;
7893
7894                         chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
7895
7896                         if (!chan) {
7897                                 err = -EINVAL;
7898                                 goto out_free;
7899                         }
7900
7901                         /* ignore disabled channels */
7902                         if (chan->flags & IEEE80211_CHAN_DISABLED)
7903                                 continue;
7904
7905                         request->channels[i] = chan;
7906                         i++;
7907                 }
7908         } else {
7909                 /* all channels */
7910                 for (band = 0; band < NUM_NL80211_BANDS; band++) {
7911                         int j;
7912
7913                         if (!wiphy->bands[band])
7914                                 continue;
7915                         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
7916                                 struct ieee80211_channel *chan;
7917
7918                                 chan = &wiphy->bands[band]->channels[j];
7919
7920                                 if (chan->flags & IEEE80211_CHAN_DISABLED)
7921                                         continue;
7922
7923                                 request->channels[i] = chan;
7924                                 i++;
7925                         }
7926                 }
7927         }
7928
7929         if (!i) {
7930                 err = -EINVAL;
7931                 goto out_free;
7932         }
7933
7934         request->n_channels = i;
7935
7936         i = 0;
7937         if (n_ssids) {
7938                 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
7939                                     tmp) {
7940                         if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
7941                                 err = -EINVAL;
7942                                 goto out_free;
7943                         }
7944                         request->ssids[i].ssid_len = nla_len(attr);
7945                         memcpy(request->ssids[i].ssid, nla_data(attr),
7946                                nla_len(attr));
7947                         i++;
7948                 }
7949         }
7950
7951         i = 0;
7952         if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
7953                 nla_for_each_nested(attr,
7954                                     attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
7955                                     tmp) {
7956                         struct nlattr *ssid, *bssid, *rssi;
7957
7958                         err = nla_parse_nested_deprecated(tb,
7959                                                           NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
7960                                                           attr,
7961                                                           nl80211_match_policy,
7962                                                           NULL);
7963                         if (err)
7964                                 goto out_free;
7965                         ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
7966                         bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID];
7967
7968                         if (!ssid && !bssid) {
7969                                 i++;
7970                                 continue;
7971                         }
7972
7973                         if (WARN_ON(i >= n_match_sets)) {
7974                                 /* this indicates a programming error,
7975                                  * the loop above should have verified
7976                                  * things properly
7977                                  */
7978                                 err = -EINVAL;
7979                                 goto out_free;
7980                         }
7981
7982                         if (ssid) {
7983                                 if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) {
7984                                         err = -EINVAL;
7985                                         goto out_free;
7986                                 }
7987                                 memcpy(request->match_sets[i].ssid.ssid,
7988                                        nla_data(ssid), nla_len(ssid));
7989                                 request->match_sets[i].ssid.ssid_len =
7990                                         nla_len(ssid);
7991                         }
7992                         if (bssid) {
7993                                 if (nla_len(bssid) != ETH_ALEN) {
7994                                         err = -EINVAL;
7995                                         goto out_free;
7996                                 }
7997                                 memcpy(request->match_sets[i].bssid,
7998                                        nla_data(bssid), ETH_ALEN);
7999                         }
8000
8001                         /* special attribute - old implementation w/a */
8002                         request->match_sets[i].rssi_thold = default_match_rssi;
8003                         rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
8004                         if (rssi)
8005                                 request->match_sets[i].rssi_thold =
8006                                         nla_get_s32(rssi);
8007
8008                         /* Parse per band RSSI attribute */
8009                         err = nl80211_parse_sched_scan_per_band_rssi(wiphy,
8010                                 &request->match_sets[i],
8011                                 tb[NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI],
8012                                 request->match_sets[i].rssi_thold);
8013                         if (err)
8014                                 goto out_free;
8015
8016                         i++;
8017                 }
8018
8019                 /* there was no other matchset, so the RSSI one is alone */
8020                 if (i == 0 && n_match_sets)
8021                         request->match_sets[0].rssi_thold = default_match_rssi;
8022
8023                 request->min_rssi_thold = INT_MAX;
8024                 for (i = 0; i < n_match_sets; i++)
8025                         request->min_rssi_thold =
8026                                 min(request->match_sets[i].rssi_thold,
8027                                     request->min_rssi_thold);
8028         } else {
8029                 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF;
8030         }
8031
8032         if (ie_len) {
8033                 request->ie_len = ie_len;
8034                 memcpy((void *)request->ie,
8035                        nla_data(attrs[NL80211_ATTR_IE]),
8036                        request->ie_len);
8037         }
8038
8039         err = nl80211_check_scan_flags(wiphy, wdev, request, attrs, true);
8040         if (err)
8041                 goto out_free;
8042
8043         if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY])
8044                 request->delay =
8045                         nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]);
8046
8047         if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) {
8048                 request->relative_rssi = nla_get_s8(
8049                         attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]);
8050                 request->relative_rssi_set = true;
8051         }
8052
8053         if (request->relative_rssi_set &&
8054             attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) {
8055                 struct nl80211_bss_select_rssi_adjust *rssi_adjust;
8056
8057                 rssi_adjust = nla_data(
8058                         attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]);
8059                 request->rssi_adjust.band = rssi_adjust->band;
8060                 request->rssi_adjust.delta = rssi_adjust->delta;
8061                 if (!is_band_valid(wiphy, request->rssi_adjust.band)) {
8062                         err = -EINVAL;
8063                         goto out_free;
8064                 }
8065         }
8066
8067         err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs);
8068         if (err)
8069                 goto out_free;
8070
8071         request->scan_start = jiffies;
8072
8073         return request;
8074
8075 out_free:
8076         kfree(request);
8077         return ERR_PTR(err);
8078 }
8079
8080 static int nl80211_start_sched_scan(struct sk_buff *skb,
8081                                     struct genl_info *info)
8082 {
8083         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8084         struct net_device *dev = info->user_ptr[1];
8085         struct wireless_dev *wdev = dev->ieee80211_ptr;
8086         struct cfg80211_sched_scan_request *sched_scan_req;
8087         bool want_multi;
8088         int err;
8089
8090         if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start)
8091                 return -EOPNOTSUPP;
8092
8093         want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI];
8094         err = cfg80211_sched_scan_req_possible(rdev, want_multi);
8095         if (err)
8096                 return err;
8097
8098         sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev,
8099                                                   info->attrs,
8100                                                   rdev->wiphy.max_match_sets);
8101
8102         err = PTR_ERR_OR_ZERO(sched_scan_req);
8103         if (err)
8104                 goto out_err;
8105
8106         /* leave request id zero for legacy request
8107          * or if driver does not support multi-scheduled scan
8108          */
8109         if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) {
8110                 while (!sched_scan_req->reqid)
8111                         sched_scan_req->reqid = cfg80211_assign_cookie(rdev);
8112         }
8113
8114         err = rdev_sched_scan_start(rdev, dev, sched_scan_req);
8115         if (err)
8116                 goto out_free;
8117
8118         sched_scan_req->dev = dev;
8119         sched_scan_req->wiphy = &rdev->wiphy;
8120
8121         if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
8122                 sched_scan_req->owner_nlportid = info->snd_portid;
8123
8124         cfg80211_add_sched_scan_req(rdev, sched_scan_req);
8125
8126         nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN);
8127         return 0;
8128
8129 out_free:
8130         kfree(sched_scan_req);
8131 out_err:
8132         return err;
8133 }
8134
8135 static int nl80211_stop_sched_scan(struct sk_buff *skb,
8136                                    struct genl_info *info)
8137 {
8138         struct cfg80211_sched_scan_request *req;
8139         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8140         u64 cookie;
8141
8142         if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop)
8143                 return -EOPNOTSUPP;
8144
8145         if (info->attrs[NL80211_ATTR_COOKIE]) {
8146                 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
8147                 return __cfg80211_stop_sched_scan(rdev, cookie, false);
8148         }
8149
8150         req = list_first_or_null_rcu(&rdev->sched_scan_req_list,
8151                                      struct cfg80211_sched_scan_request,
8152                                      list);
8153         if (!req || req->reqid ||
8154             (req->owner_nlportid &&
8155              req->owner_nlportid != info->snd_portid))
8156                 return -ENOENT;
8157
8158         return cfg80211_stop_sched_scan_req(rdev, req, false);
8159 }
8160
8161 static int nl80211_start_radar_detection(struct sk_buff *skb,
8162                                          struct genl_info *info)
8163 {
8164         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8165         struct net_device *dev = info->user_ptr[1];
8166         struct wireless_dev *wdev = dev->ieee80211_ptr;
8167         struct wiphy *wiphy = wdev->wiphy;
8168         struct cfg80211_chan_def chandef;
8169         enum nl80211_dfs_regions dfs_region;
8170         unsigned int cac_time_ms;
8171         int err;
8172
8173         dfs_region = reg_get_dfs_region(wiphy);
8174         if (dfs_region == NL80211_DFS_UNSET)
8175                 return -EINVAL;
8176
8177         err = nl80211_parse_chandef(rdev, info, &chandef);
8178         if (err)
8179                 return err;
8180
8181         if (netif_carrier_ok(dev))
8182                 return -EBUSY;
8183
8184         if (wdev->cac_started)
8185                 return -EBUSY;
8186
8187         err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype);
8188         if (err < 0)
8189                 return err;
8190
8191         if (err == 0)
8192                 return -EINVAL;
8193
8194         if (!cfg80211_chandef_dfs_usable(wiphy, &chandef))
8195                 return -EINVAL;
8196
8197         /* CAC start is offloaded to HW and can't be started manually */
8198         if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD))
8199                 return -EOPNOTSUPP;
8200
8201         if (!rdev->ops->start_radar_detection)
8202                 return -EOPNOTSUPP;
8203
8204         cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef);
8205         if (WARN_ON(!cac_time_ms))
8206                 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
8207
8208         err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms);
8209         if (!err) {
8210                 wdev->chandef = chandef;
8211                 wdev->cac_started = true;
8212                 wdev->cac_start_time = jiffies;
8213                 wdev->cac_time_ms = cac_time_ms;
8214         }
8215         return err;
8216 }
8217
8218 static int nl80211_notify_radar_detection(struct sk_buff *skb,
8219                                           struct genl_info *info)
8220 {
8221         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8222         struct net_device *dev = info->user_ptr[1];
8223         struct wireless_dev *wdev = dev->ieee80211_ptr;
8224         struct wiphy *wiphy = wdev->wiphy;
8225         struct cfg80211_chan_def chandef;
8226         enum nl80211_dfs_regions dfs_region;
8227         int err;
8228
8229         dfs_region = reg_get_dfs_region(wiphy);
8230         if (dfs_region == NL80211_DFS_UNSET) {
8231                 GENL_SET_ERR_MSG(info,
8232                                  "DFS Region is not set. Unexpected Radar indication");
8233                 return -EINVAL;
8234         }
8235
8236         err = nl80211_parse_chandef(rdev, info, &chandef);
8237         if (err) {
8238                 GENL_SET_ERR_MSG(info, "Unable to extract chandef info");
8239                 return err;
8240         }
8241
8242         err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype);
8243         if (err < 0) {
8244                 GENL_SET_ERR_MSG(info, "chandef is invalid");
8245                 return err;
8246         }
8247
8248         if (err == 0) {
8249                 GENL_SET_ERR_MSG(info,
8250                                  "Unexpected Radar indication for chandef/iftype");
8251                 return -EINVAL;
8252         }
8253
8254         /* Do not process this notification if radar is already detected
8255          * by kernel on this channel, and return success.
8256          */
8257         if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE)
8258                 return 0;
8259
8260         cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_UNAVAILABLE);
8261
8262         cfg80211_sched_dfs_chan_update(rdev);
8263
8264         rdev->radar_chandef = chandef;
8265
8266         /* Propagate this notification to other radios as well */
8267         queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk);
8268
8269         return 0;
8270 }
8271
8272 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
8273 {
8274         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8275         struct net_device *dev = info->user_ptr[1];
8276         struct wireless_dev *wdev = dev->ieee80211_ptr;
8277         struct cfg80211_csa_settings params;
8278         /* csa_attrs is defined static to avoid waste of stack size - this
8279          * function is called under RTNL lock, so this should not be a problem.
8280          */
8281         static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1];
8282         int err;
8283         bool need_new_beacon = false;
8284         bool need_handle_dfs_flag = true;
8285         int len, i;
8286         u32 cs_count;
8287
8288         if (!rdev->ops->channel_switch ||
8289             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
8290                 return -EOPNOTSUPP;
8291
8292         switch (dev->ieee80211_ptr->iftype) {
8293         case NL80211_IFTYPE_AP:
8294         case NL80211_IFTYPE_P2P_GO:
8295                 need_new_beacon = true;
8296                 /* For all modes except AP the handle_dfs flag needs to be
8297                  * supplied to tell the kernel that userspace will handle radar
8298                  * events when they happen. Otherwise a switch to a channel
8299                  * requiring DFS will be rejected.
8300                  */
8301                 need_handle_dfs_flag = false;
8302
8303                 /* useless if AP is not running */
8304                 if (!wdev->beacon_interval)
8305                         return -ENOTCONN;
8306                 break;
8307         case NL80211_IFTYPE_ADHOC:
8308                 if (!wdev->ssid_len)
8309                         return -ENOTCONN;
8310                 break;
8311         case NL80211_IFTYPE_MESH_POINT:
8312                 if (!wdev->mesh_id_len)
8313                         return -ENOTCONN;
8314                 break;
8315         default:
8316                 return -EOPNOTSUPP;
8317         }
8318
8319         memset(&params, 0, sizeof(params));
8320         params.beacon_csa.ftm_responder = -1;
8321
8322         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
8323             !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT])
8324                 return -EINVAL;
8325
8326         /* only important for AP, IBSS and mesh create IEs internally */
8327         if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES])
8328                 return -EINVAL;
8329
8330         /* Even though the attribute is u32, the specification says
8331          * u8, so let's make sure we don't overflow.
8332          */
8333         cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]);
8334         if (cs_count > 255)
8335                 return -EINVAL;
8336
8337         params.count = cs_count;
8338
8339         if (!need_new_beacon)
8340                 goto skip_beacons;
8341
8342         err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_after);
8343         if (err)
8344                 return err;
8345
8346         err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX,
8347                                           info->attrs[NL80211_ATTR_CSA_IES],
8348                                           nl80211_policy, info->extack);
8349         if (err)
8350                 return err;
8351
8352         err = nl80211_parse_beacon(rdev, csa_attrs, &params.beacon_csa);
8353         if (err)
8354                 return err;
8355
8356         if (!csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON])
8357                 return -EINVAL;
8358
8359         len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]);
8360         if (!len || (len % sizeof(u16)))
8361                 return -EINVAL;
8362
8363         params.n_counter_offsets_beacon = len / sizeof(u16);
8364         if (rdev->wiphy.max_num_csa_counters &&
8365             (params.n_counter_offsets_beacon >
8366              rdev->wiphy.max_num_csa_counters))
8367                 return -EINVAL;
8368
8369         params.counter_offsets_beacon =
8370                 nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]);
8371
8372         /* sanity checks - counters should fit and be the same */
8373         for (i = 0; i < params.n_counter_offsets_beacon; i++) {
8374                 u16 offset = params.counter_offsets_beacon[i];
8375
8376                 if (offset >= params.beacon_csa.tail_len)
8377                         return -EINVAL;
8378
8379                 if (params.beacon_csa.tail[offset] != params.count)
8380                         return -EINVAL;
8381         }
8382
8383         if (csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]) {
8384                 len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]);
8385                 if (!len || (len % sizeof(u16)))
8386                         return -EINVAL;
8387
8388                 params.n_counter_offsets_presp = len / sizeof(u16);
8389                 if (rdev->wiphy.max_num_csa_counters &&
8390                     (params.n_counter_offsets_presp >
8391                      rdev->wiphy.max_num_csa_counters))
8392                         return -EINVAL;
8393
8394                 params.counter_offsets_presp =
8395                         nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]);
8396
8397                 /* sanity checks - counters should fit and be the same */
8398                 for (i = 0; i < params.n_counter_offsets_presp; i++) {
8399                         u16 offset = params.counter_offsets_presp[i];
8400
8401                         if (offset >= params.beacon_csa.probe_resp_len)
8402                                 return -EINVAL;
8403
8404                         if (params.beacon_csa.probe_resp[offset] !=
8405                             params.count)
8406                                 return -EINVAL;
8407                 }
8408         }
8409
8410 skip_beacons:
8411         err = nl80211_parse_chandef(rdev, info, &params.chandef);
8412         if (err)
8413                 return err;
8414
8415         if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef,
8416                                            wdev->iftype))
8417                 return -EINVAL;
8418
8419         err = cfg80211_chandef_dfs_required(wdev->wiphy,
8420                                             &params.chandef,
8421                                             wdev->iftype);
8422         if (err < 0)
8423                 return err;
8424
8425         if (err > 0) {
8426                 params.radar_required = true;
8427                 if (need_handle_dfs_flag &&
8428                     !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) {
8429                         return -EINVAL;
8430                 }
8431         }
8432
8433         if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
8434                 params.block_tx = true;
8435
8436         wdev_lock(wdev);
8437         err = rdev_channel_switch(rdev, dev, &params);
8438         wdev_unlock(wdev);
8439
8440         return err;
8441 }
8442
8443 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
8444                             u32 seq, int flags,
8445                             struct cfg80211_registered_device *rdev,
8446                             struct wireless_dev *wdev,
8447                             struct cfg80211_internal_bss *intbss)
8448 {
8449         struct cfg80211_bss *res = &intbss->pub;
8450         const struct cfg80211_bss_ies *ies;
8451         void *hdr;
8452         struct nlattr *bss;
8453
8454         ASSERT_WDEV_LOCK(wdev);
8455
8456         hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
8457                              NL80211_CMD_NEW_SCAN_RESULTS);
8458         if (!hdr)
8459                 return -1;
8460
8461         genl_dump_check_consistent(cb, hdr);
8462
8463         if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation))
8464                 goto nla_put_failure;
8465         if (wdev->netdev &&
8466             nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex))
8467                 goto nla_put_failure;
8468         if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
8469                               NL80211_ATTR_PAD))
8470                 goto nla_put_failure;
8471
8472         bss = nla_nest_start_noflag(msg, NL80211_ATTR_BSS);
8473         if (!bss)
8474                 goto nla_put_failure;
8475         if ((!is_zero_ether_addr(res->bssid) &&
8476              nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid)))
8477                 goto nla_put_failure;
8478
8479         rcu_read_lock();
8480         /* indicate whether we have probe response data or not */
8481         if (rcu_access_pointer(res->proberesp_ies) &&
8482             nla_put_flag(msg, NL80211_BSS_PRESP_DATA))
8483                 goto fail_unlock_rcu;
8484
8485         /* this pointer prefers to be pointed to probe response data
8486          * but is always valid
8487          */
8488         ies = rcu_dereference(res->ies);
8489         if (ies) {
8490                 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf,
8491                                       NL80211_BSS_PAD))
8492                         goto fail_unlock_rcu;
8493                 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS,
8494                                         ies->len, ies->data))
8495                         goto fail_unlock_rcu;
8496         }
8497
8498         /* and this pointer is always (unless driver didn't know) beacon data */
8499         ies = rcu_dereference(res->beacon_ies);
8500         if (ies && ies->from_beacon) {
8501                 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf,
8502                                       NL80211_BSS_PAD))
8503                         goto fail_unlock_rcu;
8504                 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES,
8505                                         ies->len, ies->data))
8506                         goto fail_unlock_rcu;
8507         }
8508         rcu_read_unlock();
8509
8510         if (res->beacon_interval &&
8511             nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval))
8512                 goto nla_put_failure;
8513         if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) ||
8514             nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) ||
8515             nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) ||
8516             nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO,
8517                         jiffies_to_msecs(jiffies - intbss->ts)))
8518                 goto nla_put_failure;
8519
8520         if (intbss->parent_tsf &&
8521             (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF,
8522                                intbss->parent_tsf, NL80211_BSS_PAD) ||
8523              nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN,
8524                      intbss->parent_bssid)))
8525                 goto nla_put_failure;
8526
8527         if (intbss->ts_boottime &&
8528             nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME,
8529                               intbss->ts_boottime, NL80211_BSS_PAD))
8530                 goto nla_put_failure;
8531
8532         if (!nl80211_put_signal(msg, intbss->pub.chains,
8533                                 intbss->pub.chain_signal,
8534                                 NL80211_BSS_CHAIN_SIGNAL))
8535                 goto nla_put_failure;
8536
8537         switch (rdev->wiphy.signal_type) {
8538         case CFG80211_SIGNAL_TYPE_MBM:
8539                 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal))
8540                         goto nla_put_failure;
8541                 break;
8542         case CFG80211_SIGNAL_TYPE_UNSPEC:
8543                 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal))
8544                         goto nla_put_failure;
8545                 break;
8546         default:
8547                 break;
8548         }
8549
8550         switch (wdev->iftype) {
8551         case NL80211_IFTYPE_P2P_CLIENT:
8552         case NL80211_IFTYPE_STATION:
8553                 if (intbss == wdev->current_bss &&
8554                     nla_put_u32(msg, NL80211_BSS_STATUS,
8555                                 NL80211_BSS_STATUS_ASSOCIATED))
8556                         goto nla_put_failure;
8557                 break;
8558         case NL80211_IFTYPE_ADHOC:
8559                 if (intbss == wdev->current_bss &&
8560                     nla_put_u32(msg, NL80211_BSS_STATUS,
8561                                 NL80211_BSS_STATUS_IBSS_JOINED))
8562                         goto nla_put_failure;
8563                 break;
8564         default:
8565                 break;
8566         }
8567
8568         nla_nest_end(msg, bss);
8569
8570         genlmsg_end(msg, hdr);
8571         return 0;
8572
8573  fail_unlock_rcu:
8574         rcu_read_unlock();
8575  nla_put_failure:
8576         genlmsg_cancel(msg, hdr);
8577         return -EMSGSIZE;
8578 }
8579
8580 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb)
8581 {
8582         struct cfg80211_registered_device *rdev;
8583         struct cfg80211_internal_bss *scan;
8584         struct wireless_dev *wdev;
8585         int start = cb->args[2], idx = 0;
8586         int err;
8587
8588         rtnl_lock();
8589         err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
8590         if (err) {
8591                 rtnl_unlock();
8592                 return err;
8593         }
8594
8595         wdev_lock(wdev);
8596         spin_lock_bh(&rdev->bss_lock);
8597
8598         /*
8599          * dump_scan will be called multiple times to break up the scan results
8600          * into multiple messages.  It is unlikely that any more bss-es will be
8601          * expired after the first call, so only call only call this on the
8602          * first dump_scan invocation.
8603          */
8604         if (start == 0)
8605                 cfg80211_bss_expire(rdev);
8606
8607         cb->seq = rdev->bss_generation;
8608
8609         list_for_each_entry(scan, &rdev->bss_list, list) {
8610                 if (++idx <= start)
8611                         continue;
8612                 if (nl80211_send_bss(skb, cb,
8613                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
8614                                 rdev, wdev, scan) < 0) {
8615                         idx--;
8616                         break;
8617                 }
8618         }
8619
8620         spin_unlock_bh(&rdev->bss_lock);
8621         wdev_unlock(wdev);
8622
8623         cb->args[2] = idx;
8624         rtnl_unlock();
8625
8626         return skb->len;
8627 }
8628
8629 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq,
8630                                int flags, struct net_device *dev,
8631                                bool allow_radio_stats,
8632                                struct survey_info *survey)
8633 {
8634         void *hdr;
8635         struct nlattr *infoattr;
8636
8637         /* skip radio stats if userspace didn't request them */
8638         if (!survey->channel && !allow_radio_stats)
8639                 return 0;
8640
8641         hdr = nl80211hdr_put(msg, portid, seq, flags,
8642                              NL80211_CMD_NEW_SURVEY_RESULTS);
8643         if (!hdr)
8644                 return -ENOMEM;
8645
8646         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
8647                 goto nla_put_failure;
8648
8649         infoattr = nla_nest_start_noflag(msg, NL80211_ATTR_SURVEY_INFO);
8650         if (!infoattr)
8651                 goto nla_put_failure;
8652
8653         if (survey->channel &&
8654             nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY,
8655                         survey->channel->center_freq))
8656                 goto nla_put_failure;
8657
8658         if ((survey->filled & SURVEY_INFO_NOISE_DBM) &&
8659             nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise))
8660                 goto nla_put_failure;
8661         if ((survey->filled & SURVEY_INFO_IN_USE) &&
8662             nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE))
8663                 goto nla_put_failure;
8664         if ((survey->filled & SURVEY_INFO_TIME) &&
8665             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME,
8666                         survey->time, NL80211_SURVEY_INFO_PAD))
8667                 goto nla_put_failure;
8668         if ((survey->filled & SURVEY_INFO_TIME_BUSY) &&
8669             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY,
8670                               survey->time_busy, NL80211_SURVEY_INFO_PAD))
8671                 goto nla_put_failure;
8672         if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) &&
8673             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY,
8674                               survey->time_ext_busy, NL80211_SURVEY_INFO_PAD))
8675                 goto nla_put_failure;
8676         if ((survey->filled & SURVEY_INFO_TIME_RX) &&
8677             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX,
8678                               survey->time_rx, NL80211_SURVEY_INFO_PAD))
8679                 goto nla_put_failure;
8680         if ((survey->filled & SURVEY_INFO_TIME_TX) &&
8681             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX,
8682                               survey->time_tx, NL80211_SURVEY_INFO_PAD))
8683                 goto nla_put_failure;
8684         if ((survey->filled & SURVEY_INFO_TIME_SCAN) &&
8685             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN,
8686                               survey->time_scan, NL80211_SURVEY_INFO_PAD))
8687                 goto nla_put_failure;
8688
8689         nla_nest_end(msg, infoattr);
8690
8691         genlmsg_end(msg, hdr);
8692         return 0;
8693
8694  nla_put_failure:
8695         genlmsg_cancel(msg, hdr);
8696         return -EMSGSIZE;
8697 }
8698
8699 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
8700 {
8701         struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
8702         struct survey_info survey;
8703         struct cfg80211_registered_device *rdev;
8704         struct wireless_dev *wdev;
8705         int survey_idx = cb->args[2];
8706         int res;
8707         bool radio_stats;
8708
8709         rtnl_lock();
8710         res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
8711         if (res)
8712                 goto out_err;
8713
8714         /* prepare_wdev_dump parsed the attributes */
8715         radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
8716
8717         if (!wdev->netdev) {
8718                 res = -EINVAL;
8719                 goto out_err;
8720         }
8721
8722         if (!rdev->ops->dump_survey) {
8723                 res = -EOPNOTSUPP;
8724                 goto out_err;
8725         }
8726
8727         while (1) {
8728                 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey);
8729                 if (res == -ENOENT)
8730                         break;
8731                 if (res)
8732                         goto out_err;
8733
8734                 /* don't send disabled channels, but do send non-channel data */
8735                 if (survey.channel &&
8736                     survey.channel->flags & IEEE80211_CHAN_DISABLED) {
8737                         survey_idx++;
8738                         continue;
8739                 }
8740
8741                 if (nl80211_send_survey(skb,
8742                                 NETLINK_CB(cb->skb).portid,
8743                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
8744                                 wdev->netdev, radio_stats, &survey) < 0)
8745                         goto out;
8746                 survey_idx++;
8747         }
8748
8749  out:
8750         cb->args[2] = survey_idx;
8751         res = skb->len;
8752  out_err:
8753         rtnl_unlock();
8754         return res;
8755 }
8756
8757 static bool nl80211_valid_wpa_versions(u32 wpa_versions)
8758 {
8759         return !(wpa_versions & ~(NL80211_WPA_VERSION_1 |
8760                                   NL80211_WPA_VERSION_2 |
8761                                   NL80211_WPA_VERSION_3));
8762 }
8763
8764 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
8765 {
8766         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8767         struct net_device *dev = info->user_ptr[1];
8768         struct ieee80211_channel *chan;
8769         const u8 *bssid, *ssid, *ie = NULL, *auth_data = NULL;
8770         int err, ssid_len, ie_len = 0, auth_data_len = 0;
8771         enum nl80211_auth_type auth_type;
8772         struct key_parse key;
8773         bool local_state_change;
8774
8775         if (!info->attrs[NL80211_ATTR_MAC])
8776                 return -EINVAL;
8777
8778         if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
8779                 return -EINVAL;
8780
8781         if (!info->attrs[NL80211_ATTR_SSID])
8782                 return -EINVAL;
8783
8784         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
8785                 return -EINVAL;
8786
8787         err = nl80211_parse_key(info, &key);
8788         if (err)
8789                 return err;
8790
8791         if (key.idx >= 0) {
8792                 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP)
8793                         return -EINVAL;
8794                 if (!key.p.key || !key.p.key_len)
8795                         return -EINVAL;
8796                 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 ||
8797                      key.p.key_len != WLAN_KEY_LEN_WEP40) &&
8798                     (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 ||
8799                      key.p.key_len != WLAN_KEY_LEN_WEP104))
8800                         return -EINVAL;
8801                 if (key.idx > 3)
8802                         return -EINVAL;
8803         } else {
8804                 key.p.key_len = 0;
8805                 key.p.key = NULL;
8806         }
8807
8808         if (key.idx >= 0) {
8809                 int i;
8810                 bool ok = false;
8811
8812                 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) {
8813                         if (key.p.cipher == rdev->wiphy.cipher_suites[i]) {
8814                                 ok = true;
8815                                 break;
8816                         }
8817                 }
8818                 if (!ok)
8819                         return -EINVAL;
8820         }
8821
8822         if (!rdev->ops->auth)
8823                 return -EOPNOTSUPP;
8824
8825         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8826             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8827                 return -EOPNOTSUPP;
8828
8829         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8830         chan = nl80211_get_valid_chan(&rdev->wiphy,
8831                                       info->attrs[NL80211_ATTR_WIPHY_FREQ]);
8832         if (!chan)
8833                 return -EINVAL;
8834
8835         ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8836         ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8837
8838         if (info->attrs[NL80211_ATTR_IE]) {
8839                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8840                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8841         }
8842
8843         auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
8844         if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE))
8845                 return -EINVAL;
8846
8847         if ((auth_type == NL80211_AUTHTYPE_SAE ||
8848              auth_type == NL80211_AUTHTYPE_FILS_SK ||
8849              auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
8850              auth_type == NL80211_AUTHTYPE_FILS_PK) &&
8851             !info->attrs[NL80211_ATTR_AUTH_DATA])
8852                 return -EINVAL;
8853
8854         if (info->attrs[NL80211_ATTR_AUTH_DATA]) {
8855                 if (auth_type != NL80211_AUTHTYPE_SAE &&
8856                     auth_type != NL80211_AUTHTYPE_FILS_SK &&
8857                     auth_type != NL80211_AUTHTYPE_FILS_SK_PFS &&
8858                     auth_type != NL80211_AUTHTYPE_FILS_PK)
8859                         return -EINVAL;
8860                 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
8861                 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
8862                 /* need to include at least Auth Transaction and Status Code */
8863                 if (auth_data_len < 4)
8864                         return -EINVAL;
8865         }
8866
8867         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
8868
8869         /*
8870          * Since we no longer track auth state, ignore
8871          * requests to only change local state.
8872          */
8873         if (local_state_change)
8874                 return 0;
8875
8876         wdev_lock(dev->ieee80211_ptr);
8877         err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
8878                                  ssid, ssid_len, ie, ie_len,
8879                                  key.p.key, key.p.key_len, key.idx,
8880                                  auth_data, auth_data_len);
8881         wdev_unlock(dev->ieee80211_ptr);
8882         return err;
8883 }
8884
8885 static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev,
8886                                      struct genl_info *info)
8887 {
8888         if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
8889                 GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set");
8890                 return -EINVAL;
8891         }
8892
8893         if (!rdev->ops->tx_control_port ||
8894             !wiphy_ext_feature_isset(&rdev->wiphy,
8895                                      NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211))
8896                 return -EOPNOTSUPP;
8897
8898         return 0;
8899 }
8900
8901 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
8902                                    struct genl_info *info,
8903                                    struct cfg80211_crypto_settings *settings,
8904                                    int cipher_limit)
8905 {
8906         memset(settings, 0, sizeof(*settings));
8907
8908         settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
8909
8910         if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
8911                 u16 proto;
8912
8913                 proto = nla_get_u16(
8914                         info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
8915                 settings->control_port_ethertype = cpu_to_be16(proto);
8916                 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
8917                     proto != ETH_P_PAE)
8918                         return -EINVAL;
8919                 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT])
8920                         settings->control_port_no_encrypt = true;
8921         } else
8922                 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE);
8923
8924         if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
8925                 int r = validate_pae_over_nl80211(rdev, info);
8926
8927                 if (r < 0)
8928                         return r;
8929
8930                 settings->control_port_over_nl80211 = true;
8931         }
8932
8933         if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
8934                 void *data;
8935                 int len, i;
8936
8937                 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
8938                 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
8939                 settings->n_ciphers_pairwise = len / sizeof(u32);
8940
8941                 if (len % sizeof(u32))
8942                         return -EINVAL;
8943
8944                 if (settings->n_ciphers_pairwise > cipher_limit)
8945                         return -EINVAL;
8946
8947                 memcpy(settings->ciphers_pairwise, data, len);
8948
8949                 for (i = 0; i < settings->n_ciphers_pairwise; i++)
8950                         if (!cfg80211_supported_cipher_suite(
8951                                         &rdev->wiphy,
8952                                         settings->ciphers_pairwise[i]))
8953                                 return -EINVAL;
8954         }
8955
8956         if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
8957                 settings->cipher_group =
8958                         nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
8959                 if (!cfg80211_supported_cipher_suite(&rdev->wiphy,
8960                                                      settings->cipher_group))
8961                         return -EINVAL;
8962         }
8963
8964         if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) {
8965                 settings->wpa_versions =
8966                         nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
8967                 if (!nl80211_valid_wpa_versions(settings->wpa_versions))
8968                         return -EINVAL;
8969         }
8970
8971         if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
8972                 void *data;
8973                 int len;
8974
8975                 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
8976                 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
8977                 settings->n_akm_suites = len / sizeof(u32);
8978
8979                 if (len % sizeof(u32))
8980                         return -EINVAL;
8981
8982                 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
8983                         return -EINVAL;
8984
8985                 memcpy(settings->akm_suites, data, len);
8986         }
8987
8988         if (info->attrs[NL80211_ATTR_PMK]) {
8989                 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN)
8990                         return -EINVAL;
8991                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
8992                                              NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK))
8993                         return -EINVAL;
8994                 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]);
8995         }
8996
8997         if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) {
8998                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
8999                                              NL80211_EXT_FEATURE_SAE_OFFLOAD))
9000                         return -EINVAL;
9001                 settings->sae_pwd =
9002                         nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
9003                 settings->sae_pwd_len =
9004                         nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
9005         }
9006
9007         return 0;
9008 }
9009
9010 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
9011 {
9012         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9013         struct net_device *dev = info->user_ptr[1];
9014         struct ieee80211_channel *chan;
9015         struct cfg80211_assoc_request req = {};
9016         const u8 *bssid, *ssid;
9017         int err, ssid_len = 0;
9018
9019         if (dev->ieee80211_ptr->conn_owner_nlportid &&
9020             dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
9021                 return -EPERM;
9022
9023         if (!info->attrs[NL80211_ATTR_MAC] ||
9024             !info->attrs[NL80211_ATTR_SSID] ||
9025             !info->attrs[NL80211_ATTR_WIPHY_FREQ])
9026                 return -EINVAL;
9027
9028         if (!rdev->ops->assoc)
9029                 return -EOPNOTSUPP;
9030
9031         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9032             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9033                 return -EOPNOTSUPP;
9034
9035         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
9036
9037         chan = nl80211_get_valid_chan(&rdev->wiphy,
9038                                       info->attrs[NL80211_ATTR_WIPHY_FREQ]);
9039         if (!chan)
9040                 return -EINVAL;
9041
9042         ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
9043         ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
9044
9045         if (info->attrs[NL80211_ATTR_IE]) {
9046                 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
9047                 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9048         }
9049
9050         if (info->attrs[NL80211_ATTR_USE_MFP]) {
9051                 enum nl80211_mfp mfp =
9052                         nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
9053                 if (mfp == NL80211_MFP_REQUIRED)
9054                         req.use_mfp = true;
9055                 else if (mfp != NL80211_MFP_NO)
9056                         return -EINVAL;
9057         }
9058
9059         if (info->attrs[NL80211_ATTR_PREV_BSSID])
9060                 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
9061
9062         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
9063                 req.flags |= ASSOC_REQ_DISABLE_HT;
9064
9065         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
9066                 memcpy(&req.ht_capa_mask,
9067                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
9068                        sizeof(req.ht_capa_mask));
9069
9070         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
9071                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
9072                         return -EINVAL;
9073                 memcpy(&req.ht_capa,
9074                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
9075                        sizeof(req.ht_capa));
9076         }
9077
9078         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
9079                 req.flags |= ASSOC_REQ_DISABLE_VHT;
9080
9081         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
9082                 memcpy(&req.vht_capa_mask,
9083                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
9084                        sizeof(req.vht_capa_mask));
9085
9086         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
9087                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
9088                         return -EINVAL;
9089                 memcpy(&req.vht_capa,
9090                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
9091                        sizeof(req.vht_capa));
9092         }
9093
9094         if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
9095                 if (!((rdev->wiphy.features &
9096                         NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
9097                        (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
9098                     !wiphy_ext_feature_isset(&rdev->wiphy,
9099                                              NL80211_EXT_FEATURE_RRM))
9100                         return -EINVAL;
9101                 req.flags |= ASSOC_REQ_USE_RRM;
9102         }
9103
9104         if (info->attrs[NL80211_ATTR_FILS_KEK]) {
9105                 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]);
9106                 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]);
9107                 if (!info->attrs[NL80211_ATTR_FILS_NONCES])
9108                         return -EINVAL;
9109                 req.fils_nonces =
9110                         nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]);
9111         }
9112
9113         err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
9114         if (!err) {
9115                 wdev_lock(dev->ieee80211_ptr);
9116
9117                 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid,
9118                                           ssid, ssid_len, &req);
9119
9120                 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
9121                         dev->ieee80211_ptr->conn_owner_nlportid =
9122                                 info->snd_portid;
9123                         memcpy(dev->ieee80211_ptr->disconnect_bssid,
9124                                bssid, ETH_ALEN);
9125                 }
9126
9127                 wdev_unlock(dev->ieee80211_ptr);
9128         }
9129
9130         return err;
9131 }
9132
9133 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
9134 {
9135         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9136         struct net_device *dev = info->user_ptr[1];
9137         const u8 *ie = NULL, *bssid;
9138         int ie_len = 0, err;
9139         u16 reason_code;
9140         bool local_state_change;
9141
9142         if (dev->ieee80211_ptr->conn_owner_nlportid &&
9143             dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
9144                 return -EPERM;
9145
9146         if (!info->attrs[NL80211_ATTR_MAC])
9147                 return -EINVAL;
9148
9149         if (!info->attrs[NL80211_ATTR_REASON_CODE])
9150                 return -EINVAL;
9151
9152         if (!rdev->ops->deauth)
9153                 return -EOPNOTSUPP;
9154
9155         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9156             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9157                 return -EOPNOTSUPP;
9158
9159         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
9160
9161         reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
9162         if (reason_code == 0) {
9163                 /* Reason Code 0 is reserved */
9164                 return -EINVAL;
9165         }
9166
9167         if (info->attrs[NL80211_ATTR_IE]) {
9168                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
9169                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9170         }
9171
9172         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
9173
9174         wdev_lock(dev->ieee80211_ptr);
9175         err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code,
9176                                    local_state_change);
9177         wdev_unlock(dev->ieee80211_ptr);
9178         return err;
9179 }
9180
9181 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
9182 {
9183         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9184         struct net_device *dev = info->user_ptr[1];
9185         const u8 *ie = NULL, *bssid;
9186         int ie_len = 0, err;
9187         u16 reason_code;
9188         bool local_state_change;
9189
9190         if (dev->ieee80211_ptr->conn_owner_nlportid &&
9191             dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
9192                 return -EPERM;
9193
9194         if (!info->attrs[NL80211_ATTR_MAC])
9195                 return -EINVAL;
9196
9197         if (!info->attrs[NL80211_ATTR_REASON_CODE])
9198                 return -EINVAL;
9199
9200         if (!rdev->ops->disassoc)
9201                 return -EOPNOTSUPP;
9202
9203         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9204             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9205                 return -EOPNOTSUPP;
9206
9207         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
9208
9209         reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
9210         if (reason_code == 0) {
9211                 /* Reason Code 0 is reserved */
9212                 return -EINVAL;
9213         }
9214
9215         if (info->attrs[NL80211_ATTR_IE]) {
9216                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
9217                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9218         }
9219
9220         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
9221
9222         wdev_lock(dev->ieee80211_ptr);
9223         err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code,
9224                                      local_state_change);
9225         wdev_unlock(dev->ieee80211_ptr);
9226         return err;
9227 }
9228
9229 static bool
9230 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev,
9231                          int mcast_rate[NUM_NL80211_BANDS],
9232                          int rateval)
9233 {
9234         struct wiphy *wiphy = &rdev->wiphy;
9235         bool found = false;
9236         int band, i;
9237
9238         for (band = 0; band < NUM_NL80211_BANDS; band++) {
9239                 struct ieee80211_supported_band *sband;
9240
9241                 sband = wiphy->bands[band];
9242                 if (!sband)
9243                         continue;
9244
9245                 for (i = 0; i < sband->n_bitrates; i++) {
9246                         if (sband->bitrates[i].bitrate == rateval) {
9247                                 mcast_rate[band] = i + 1;
9248                                 found = true;
9249                                 break;
9250                         }
9251                 }
9252         }
9253
9254         return found;
9255 }
9256
9257 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
9258 {
9259         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9260         struct net_device *dev = info->user_ptr[1];
9261         struct cfg80211_ibss_params ibss;
9262         struct wiphy *wiphy;
9263         struct cfg80211_cached_keys *connkeys = NULL;
9264         int err;
9265
9266         memset(&ibss, 0, sizeof(ibss));
9267
9268         if (!info->attrs[NL80211_ATTR_SSID] ||
9269             !nla_len(info->attrs[NL80211_ATTR_SSID]))
9270                 return -EINVAL;
9271
9272         ibss.beacon_interval = 100;
9273
9274         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL])
9275                 ibss.beacon_interval =
9276                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
9277
9278         err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC,
9279                                            ibss.beacon_interval);
9280         if (err)
9281                 return err;
9282
9283         if (!rdev->ops->join_ibss)
9284                 return -EOPNOTSUPP;
9285
9286         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
9287                 return -EOPNOTSUPP;
9288
9289         wiphy = &rdev->wiphy;
9290
9291         if (info->attrs[NL80211_ATTR_MAC]) {
9292                 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
9293
9294                 if (!is_valid_ether_addr(ibss.bssid))
9295                         return -EINVAL;
9296         }
9297         ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
9298         ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
9299
9300         if (info->attrs[NL80211_ATTR_IE]) {
9301                 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
9302                 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9303         }
9304
9305         err = nl80211_parse_chandef(rdev, info, &ibss.chandef);
9306         if (err)
9307                 return err;
9308
9309         if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef,
9310                                      NL80211_IFTYPE_ADHOC))
9311                 return -EINVAL;
9312
9313         switch (ibss.chandef.width) {
9314         case NL80211_CHAN_WIDTH_5:
9315         case NL80211_CHAN_WIDTH_10:
9316         case NL80211_CHAN_WIDTH_20_NOHT:
9317                 break;
9318         case NL80211_CHAN_WIDTH_20:
9319         case NL80211_CHAN_WIDTH_40:
9320                 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
9321                         return -EINVAL;
9322                 break;
9323         case NL80211_CHAN_WIDTH_80:
9324         case NL80211_CHAN_WIDTH_80P80:
9325         case NL80211_CHAN_WIDTH_160:
9326                 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
9327                         return -EINVAL;
9328                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
9329                                              NL80211_EXT_FEATURE_VHT_IBSS))
9330                         return -EINVAL;
9331                 break;
9332         default:
9333                 return -EINVAL;
9334         }
9335
9336         ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
9337         ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
9338
9339         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
9340                 u8 *rates =
9341                         nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
9342                 int n_rates =
9343                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
9344                 struct ieee80211_supported_band *sband =
9345                         wiphy->bands[ibss.chandef.chan->band];
9346
9347                 err = ieee80211_get_ratemask(sband, rates, n_rates,
9348                                              &ibss.basic_rates);
9349                 if (err)
9350                         return err;
9351         }
9352
9353         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
9354                 memcpy(&ibss.ht_capa_mask,
9355                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
9356                        sizeof(ibss.ht_capa_mask));
9357
9358         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
9359                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
9360                         return -EINVAL;
9361                 memcpy(&ibss.ht_capa,
9362                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
9363                        sizeof(ibss.ht_capa));
9364         }
9365
9366         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
9367             !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate,
9368                         nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
9369                 return -EINVAL;
9370
9371         if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
9372                 bool no_ht = false;
9373
9374                 connkeys = nl80211_parse_connkeys(rdev, info, &no_ht);
9375                 if (IS_ERR(connkeys))
9376                         return PTR_ERR(connkeys);
9377
9378                 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) &&
9379                     no_ht) {
9380                         kzfree(connkeys);
9381                         return -EINVAL;
9382                 }
9383         }
9384
9385         ibss.control_port =
9386                 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]);
9387
9388         if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
9389                 int r = validate_pae_over_nl80211(rdev, info);
9390
9391                 if (r < 0) {
9392                         kzfree(connkeys);
9393                         return r;
9394                 }
9395
9396                 ibss.control_port_over_nl80211 = true;
9397         }
9398
9399         ibss.userspace_handles_dfs =
9400                 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
9401
9402         wdev_lock(dev->ieee80211_ptr);
9403         err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
9404         if (err)
9405                 kzfree(connkeys);
9406         else if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
9407                 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
9408         wdev_unlock(dev->ieee80211_ptr);
9409
9410         return err;
9411 }
9412
9413 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
9414 {
9415         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9416         struct net_device *dev = info->user_ptr[1];
9417
9418         if (!rdev->ops->leave_ibss)
9419                 return -EOPNOTSUPP;
9420
9421         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
9422                 return -EOPNOTSUPP;
9423
9424         return cfg80211_leave_ibss(rdev, dev, false);
9425 }
9426
9427 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info)
9428 {
9429         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9430         struct net_device *dev = info->user_ptr[1];
9431         int mcast_rate[NUM_NL80211_BANDS];
9432         u32 nla_rate;
9433         int err;
9434
9435         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
9436             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
9437             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB)
9438                 return -EOPNOTSUPP;
9439
9440         if (!rdev->ops->set_mcast_rate)
9441                 return -EOPNOTSUPP;
9442
9443         memset(mcast_rate, 0, sizeof(mcast_rate));
9444
9445         if (!info->attrs[NL80211_ATTR_MCAST_RATE])
9446                 return -EINVAL;
9447
9448         nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
9449         if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate))
9450                 return -EINVAL;
9451
9452         err = rdev_set_mcast_rate(rdev, dev, mcast_rate);
9453
9454         return err;
9455 }
9456
9457 static struct sk_buff *
9458 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
9459                             struct wireless_dev *wdev, int approxlen,
9460                             u32 portid, u32 seq, enum nl80211_commands cmd,
9461                             enum nl80211_attrs attr,
9462                             const struct nl80211_vendor_cmd_info *info,
9463                             gfp_t gfp)
9464 {
9465         struct sk_buff *skb;
9466         void *hdr;
9467         struct nlattr *data;
9468
9469         skb = nlmsg_new(approxlen + 100, gfp);
9470         if (!skb)
9471                 return NULL;
9472
9473         hdr = nl80211hdr_put(skb, portid, seq, 0, cmd);
9474         if (!hdr) {
9475                 kfree_skb(skb);
9476                 return NULL;
9477         }
9478
9479         if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
9480                 goto nla_put_failure;
9481
9482         if (info) {
9483                 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID,
9484                                 info->vendor_id))
9485                         goto nla_put_failure;
9486                 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD,
9487                                 info->subcmd))
9488                         goto nla_put_failure;
9489         }
9490
9491         if (wdev) {
9492                 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
9493                                       wdev_id(wdev), NL80211_ATTR_PAD))
9494                         goto nla_put_failure;
9495                 if (wdev->netdev &&
9496                     nla_put_u32(skb, NL80211_ATTR_IFINDEX,
9497                                 wdev->netdev->ifindex))
9498                         goto nla_put_failure;
9499         }
9500
9501         data = nla_nest_start_noflag(skb, attr);
9502         if (!data)
9503                 goto nla_put_failure;
9504
9505         ((void **)skb->cb)[0] = rdev;
9506         ((void **)skb->cb)[1] = hdr;
9507         ((void **)skb->cb)[2] = data;
9508
9509         return skb;
9510
9511  nla_put_failure:
9512         kfree_skb(skb);
9513         return NULL;
9514 }
9515
9516 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
9517                                            struct wireless_dev *wdev,
9518                                            enum nl80211_commands cmd,
9519                                            enum nl80211_attrs attr,
9520                                            unsigned int portid,
9521                                            int vendor_event_idx,
9522                                            int approxlen, gfp_t gfp)
9523 {
9524         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
9525         const struct nl80211_vendor_cmd_info *info;
9526
9527         switch (cmd) {
9528         case NL80211_CMD_TESTMODE:
9529                 if (WARN_ON(vendor_event_idx != -1))
9530                         return NULL;
9531                 info = NULL;
9532                 break;
9533         case NL80211_CMD_VENDOR:
9534                 if (WARN_ON(vendor_event_idx < 0 ||
9535                             vendor_event_idx >= wiphy->n_vendor_events))
9536                         return NULL;
9537                 info = &wiphy->vendor_events[vendor_event_idx];
9538                 break;
9539         default:
9540                 WARN_ON(1);
9541                 return NULL;
9542         }
9543
9544         return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, portid, 0,
9545                                            cmd, attr, info, gfp);
9546 }
9547 EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
9548
9549 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
9550 {
9551         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
9552         void *hdr = ((void **)skb->cb)[1];
9553         struct nlmsghdr *nlhdr = nlmsg_hdr(skb);
9554         struct nlattr *data = ((void **)skb->cb)[2];
9555         enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
9556
9557         /* clear CB data for netlink core to own from now on */
9558         memset(skb->cb, 0, sizeof(skb->cb));
9559
9560         nla_nest_end(skb, data);
9561         genlmsg_end(skb, hdr);
9562
9563         if (nlhdr->nlmsg_pid) {
9564                 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb,
9565                                 nlhdr->nlmsg_pid);
9566         } else {
9567                 if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
9568                         mcgrp = NL80211_MCGRP_VENDOR;
9569
9570                 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
9571                                         skb, 0, mcgrp, gfp);
9572         }
9573 }
9574 EXPORT_SYMBOL(__cfg80211_send_event_skb);
9575
9576 #ifdef CONFIG_NL80211_TESTMODE
9577 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
9578 {
9579         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9580         struct wireless_dev *wdev =
9581                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
9582         int err;
9583
9584         if (!rdev->ops->testmode_cmd)
9585                 return -EOPNOTSUPP;
9586
9587         if (IS_ERR(wdev)) {
9588                 err = PTR_ERR(wdev);
9589                 if (err != -EINVAL)
9590                         return err;
9591                 wdev = NULL;
9592         } else if (wdev->wiphy != &rdev->wiphy) {
9593                 return -EINVAL;
9594         }
9595
9596         if (!info->attrs[NL80211_ATTR_TESTDATA])
9597                 return -EINVAL;
9598
9599         rdev->cur_cmd_info = info;
9600         err = rdev_testmode_cmd(rdev, wdev,
9601                                 nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
9602                                 nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
9603         rdev->cur_cmd_info = NULL;
9604
9605         return err;
9606 }
9607
9608 static int nl80211_testmode_dump(struct sk_buff *skb,
9609                                  struct netlink_callback *cb)
9610 {
9611         struct cfg80211_registered_device *rdev;
9612         int err;
9613         long phy_idx;
9614         void *data = NULL;
9615         int data_len = 0;
9616
9617         rtnl_lock();
9618
9619         if (cb->args[0]) {
9620                 /*
9621                  * 0 is a valid index, but not valid for args[0],
9622                  * so we need to offset by 1.
9623                  */
9624                 phy_idx = cb->args[0] - 1;
9625
9626                 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
9627                 if (!rdev) {
9628                         err = -ENOENT;
9629                         goto out_err;
9630                 }
9631         } else {
9632                 struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
9633
9634                 err = nlmsg_parse_deprecated(cb->nlh,
9635                                              GENL_HDRLEN + nl80211_fam.hdrsize,
9636                                              attrbuf, nl80211_fam.maxattr,
9637                                              nl80211_policy, NULL);
9638                 if (err)
9639                         goto out_err;
9640
9641                 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
9642                 if (IS_ERR(rdev)) {
9643                         err = PTR_ERR(rdev);
9644                         goto out_err;
9645                 }
9646                 phy_idx = rdev->wiphy_idx;
9647
9648                 if (attrbuf[NL80211_ATTR_TESTDATA])
9649                         cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA];
9650         }
9651
9652         if (cb->args[1]) {
9653                 data = nla_data((void *)cb->args[1]);
9654                 data_len = nla_len((void *)cb->args[1]);
9655         }
9656
9657         if (!rdev->ops->testmode_dump) {
9658                 err = -EOPNOTSUPP;
9659                 goto out_err;
9660         }
9661
9662         while (1) {
9663                 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
9664                                            cb->nlh->nlmsg_seq, NLM_F_MULTI,
9665                                            NL80211_CMD_TESTMODE);
9666                 struct nlattr *tmdata;
9667
9668                 if (!hdr)
9669                         break;
9670
9671                 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) {
9672                         genlmsg_cancel(skb, hdr);
9673                         break;
9674                 }
9675
9676                 tmdata = nla_nest_start_noflag(skb, NL80211_ATTR_TESTDATA);
9677                 if (!tmdata) {
9678                         genlmsg_cancel(skb, hdr);
9679                         break;
9680                 }
9681                 err = rdev_testmode_dump(rdev, skb, cb, data, data_len);
9682                 nla_nest_end(skb, tmdata);
9683
9684                 if (err == -ENOBUFS || err == -ENOENT) {
9685                         genlmsg_cancel(skb, hdr);
9686                         break;
9687                 } else if (err) {
9688                         genlmsg_cancel(skb, hdr);
9689                         goto out_err;
9690                 }
9691
9692                 genlmsg_end(skb, hdr);
9693         }
9694
9695         err = skb->len;
9696         /* see above */
9697         cb->args[0] = phy_idx + 1;
9698  out_err:
9699         rtnl_unlock();
9700         return err;
9701 }
9702 #endif
9703
9704 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
9705 {
9706         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9707         struct net_device *dev = info->user_ptr[1];
9708         struct cfg80211_connect_params connect;
9709         struct wiphy *wiphy;
9710         struct cfg80211_cached_keys *connkeys = NULL;
9711         int err;
9712
9713         memset(&connect, 0, sizeof(connect));
9714
9715         if (!info->attrs[NL80211_ATTR_SSID] ||
9716             !nla_len(info->attrs[NL80211_ATTR_SSID]))
9717                 return -EINVAL;
9718
9719         if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
9720                 connect.auth_type =
9721                         nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
9722                 if (!nl80211_valid_auth_type(rdev, connect.auth_type,
9723                                              NL80211_CMD_CONNECT))
9724                         return -EINVAL;
9725         } else
9726                 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
9727
9728         connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
9729
9730         if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] &&
9731             !wiphy_ext_feature_isset(&rdev->wiphy,
9732                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
9733                 return -EINVAL;
9734         connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS];
9735
9736         err = nl80211_crypto_settings(rdev, info, &connect.crypto,
9737                                       NL80211_MAX_NR_CIPHER_SUITES);
9738         if (err)
9739                 return err;
9740
9741         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9742             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9743                 return -EOPNOTSUPP;
9744
9745         wiphy = &rdev->wiphy;
9746
9747         connect.bg_scan_period = -1;
9748         if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] &&
9749                 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) {
9750                 connect.bg_scan_period =
9751                         nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]);
9752         }
9753
9754         if (info->attrs[NL80211_ATTR_MAC])
9755                 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
9756         else if (info->attrs[NL80211_ATTR_MAC_HINT])
9757                 connect.bssid_hint =
9758                         nla_data(info->attrs[NL80211_ATTR_MAC_HINT]);
9759         connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
9760         connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
9761
9762         if (info->attrs[NL80211_ATTR_IE]) {
9763                 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
9764                 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9765         }
9766
9767         if (info->attrs[NL80211_ATTR_USE_MFP]) {
9768                 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
9769                 if (connect.mfp == NL80211_MFP_OPTIONAL &&
9770                     !wiphy_ext_feature_isset(&rdev->wiphy,
9771                                              NL80211_EXT_FEATURE_MFP_OPTIONAL))
9772                         return -EOPNOTSUPP;
9773         } else {
9774                 connect.mfp = NL80211_MFP_NO;
9775         }
9776
9777         if (info->attrs[NL80211_ATTR_PREV_BSSID])
9778                 connect.prev_bssid =
9779                         nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
9780
9781         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
9782                 connect.channel = nl80211_get_valid_chan(
9783                         wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ]);
9784                 if (!connect.channel)
9785                         return -EINVAL;
9786         } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) {
9787                 connect.channel_hint = nl80211_get_valid_chan(
9788                         wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]);
9789                 if (!connect.channel_hint)
9790                         return -EINVAL;
9791         }
9792
9793         if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
9794                 connkeys = nl80211_parse_connkeys(rdev, info, NULL);
9795                 if (IS_ERR(connkeys))
9796                         return PTR_ERR(connkeys);
9797         }
9798
9799         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
9800                 connect.flags |= ASSOC_REQ_DISABLE_HT;
9801
9802         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
9803                 memcpy(&connect.ht_capa_mask,
9804                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
9805                        sizeof(connect.ht_capa_mask));
9806
9807         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
9808                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
9809                         kzfree(connkeys);
9810                         return -EINVAL;
9811                 }
9812                 memcpy(&connect.ht_capa,
9813                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
9814                        sizeof(connect.ht_capa));
9815         }
9816
9817         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
9818                 connect.flags |= ASSOC_REQ_DISABLE_VHT;
9819
9820         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
9821                 memcpy(&connect.vht_capa_mask,
9822                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
9823                        sizeof(connect.vht_capa_mask));
9824
9825         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
9826                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
9827                         kzfree(connkeys);
9828                         return -EINVAL;
9829                 }
9830                 memcpy(&connect.vht_capa,
9831                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
9832                        sizeof(connect.vht_capa));
9833         }
9834
9835         if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
9836                 if (!((rdev->wiphy.features &
9837                         NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
9838                        (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
9839                     !wiphy_ext_feature_isset(&rdev->wiphy,
9840                                              NL80211_EXT_FEATURE_RRM)) {
9841                         kzfree(connkeys);
9842                         return -EINVAL;
9843                 }
9844                 connect.flags |= ASSOC_REQ_USE_RRM;
9845         }
9846
9847         connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
9848         if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) {
9849                 kzfree(connkeys);
9850                 return -EOPNOTSUPP;
9851         }
9852
9853         if (info->attrs[NL80211_ATTR_BSS_SELECT]) {
9854                 /* bss selection makes no sense if bssid is set */
9855                 if (connect.bssid) {
9856                         kzfree(connkeys);
9857                         return -EINVAL;
9858                 }
9859
9860                 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT],
9861                                        wiphy, &connect.bss_select);
9862                 if (err) {
9863                         kzfree(connkeys);
9864                         return err;
9865                 }
9866         }
9867
9868         if (wiphy_ext_feature_isset(&rdev->wiphy,
9869                                     NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
9870             info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
9871             info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
9872             info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
9873             info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
9874                 connect.fils_erp_username =
9875                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
9876                 connect.fils_erp_username_len =
9877                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
9878                 connect.fils_erp_realm =
9879                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
9880                 connect.fils_erp_realm_len =
9881                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
9882                 connect.fils_erp_next_seq_num =
9883                         nla_get_u16(
9884                            info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
9885                 connect.fils_erp_rrk =
9886                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
9887                 connect.fils_erp_rrk_len =
9888                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
9889         } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
9890                    info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
9891                    info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
9892                    info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
9893                 kzfree(connkeys);
9894                 return -EINVAL;
9895         }
9896
9897         if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) {
9898                 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
9899                         kzfree(connkeys);
9900                         GENL_SET_ERR_MSG(info,
9901                                          "external auth requires connection ownership");
9902                         return -EINVAL;
9903                 }
9904                 connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT;
9905         }
9906
9907         wdev_lock(dev->ieee80211_ptr);
9908
9909         err = cfg80211_connect(rdev, dev, &connect, connkeys,
9910                                connect.prev_bssid);
9911         if (err)
9912                 kzfree(connkeys);
9913
9914         if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
9915                 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
9916                 if (connect.bssid)
9917                         memcpy(dev->ieee80211_ptr->disconnect_bssid,
9918                                connect.bssid, ETH_ALEN);
9919                 else
9920                         memset(dev->ieee80211_ptr->disconnect_bssid,
9921                                0, ETH_ALEN);
9922         }
9923
9924         wdev_unlock(dev->ieee80211_ptr);
9925
9926         return err;
9927 }
9928
9929 static int nl80211_update_connect_params(struct sk_buff *skb,
9930                                          struct genl_info *info)
9931 {
9932         struct cfg80211_connect_params connect = {};
9933         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9934         struct net_device *dev = info->user_ptr[1];
9935         struct wireless_dev *wdev = dev->ieee80211_ptr;
9936         bool fils_sk_offload;
9937         u32 auth_type;
9938         u32 changed = 0;
9939         int ret;
9940
9941         if (!rdev->ops->update_connect_params)
9942                 return -EOPNOTSUPP;
9943
9944         if (info->attrs[NL80211_ATTR_IE]) {
9945                 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
9946                 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9947                 changed |= UPDATE_ASSOC_IES;
9948         }
9949
9950         fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy,
9951                                                   NL80211_EXT_FEATURE_FILS_SK_OFFLOAD);
9952
9953         /*
9954          * when driver supports fils-sk offload all attributes must be
9955          * provided. So the else covers "fils-sk-not-all" and
9956          * "no-fils-sk-any".
9957          */
9958         if (fils_sk_offload &&
9959             info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
9960             info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
9961             info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
9962             info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
9963                 connect.fils_erp_username =
9964                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
9965                 connect.fils_erp_username_len =
9966                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
9967                 connect.fils_erp_realm =
9968                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
9969                 connect.fils_erp_realm_len =
9970                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
9971                 connect.fils_erp_next_seq_num =
9972                         nla_get_u16(
9973                            info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
9974                 connect.fils_erp_rrk =
9975                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
9976                 connect.fils_erp_rrk_len =
9977                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
9978                 changed |= UPDATE_FILS_ERP_INFO;
9979         } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
9980                    info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
9981                    info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
9982                    info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
9983                 return -EINVAL;
9984         }
9985
9986         if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
9987                 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
9988                 if (!nl80211_valid_auth_type(rdev, auth_type,
9989                                              NL80211_CMD_CONNECT))
9990                         return -EINVAL;
9991
9992                 if (auth_type == NL80211_AUTHTYPE_FILS_SK &&
9993                     fils_sk_offload && !(changed & UPDATE_FILS_ERP_INFO))
9994                         return -EINVAL;
9995
9996                 connect.auth_type = auth_type;
9997                 changed |= UPDATE_AUTH_TYPE;
9998         }
9999
10000         wdev_lock(dev->ieee80211_ptr);
10001         if (!wdev->current_bss)
10002                 ret = -ENOLINK;
10003         else
10004                 ret = rdev_update_connect_params(rdev, dev, &connect, changed);
10005         wdev_unlock(dev->ieee80211_ptr);
10006
10007         return ret;
10008 }
10009
10010 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
10011 {
10012         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10013         struct net_device *dev = info->user_ptr[1];
10014         u16 reason;
10015         int ret;
10016
10017         if (dev->ieee80211_ptr->conn_owner_nlportid &&
10018             dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
10019                 return -EPERM;
10020
10021         if (!info->attrs[NL80211_ATTR_REASON_CODE])
10022                 reason = WLAN_REASON_DEAUTH_LEAVING;
10023         else
10024                 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
10025
10026         if (reason == 0)
10027                 return -EINVAL;
10028
10029         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
10030             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
10031                 return -EOPNOTSUPP;
10032
10033         wdev_lock(dev->ieee80211_ptr);
10034         ret = cfg80211_disconnect(rdev, dev, reason, true);
10035         wdev_unlock(dev->ieee80211_ptr);
10036         return ret;
10037 }
10038
10039 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
10040 {
10041         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10042         struct net *net;
10043         int err;
10044
10045         if (info->attrs[NL80211_ATTR_PID]) {
10046                 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
10047
10048                 net = get_net_ns_by_pid(pid);
10049         } else if (info->attrs[NL80211_ATTR_NETNS_FD]) {
10050                 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]);
10051
10052                 net = get_net_ns_by_fd(fd);
10053         } else {
10054                 return -EINVAL;
10055         }
10056
10057         if (IS_ERR(net))
10058                 return PTR_ERR(net);
10059
10060         err = 0;
10061
10062         /* check if anything to do */
10063         if (!net_eq(wiphy_net(&rdev->wiphy), net))
10064                 err = cfg80211_switch_netns(rdev, net);
10065
10066         put_net(net);
10067         return err;
10068 }
10069
10070 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
10071 {
10072         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10073         int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev,
10074                         struct cfg80211_pmksa *pmksa) = NULL;
10075         struct net_device *dev = info->user_ptr[1];
10076         struct cfg80211_pmksa pmksa;
10077
10078         memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
10079
10080         if (!info->attrs[NL80211_ATTR_PMKID])
10081                 return -EINVAL;
10082
10083         pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
10084
10085         if (info->attrs[NL80211_ATTR_MAC]) {
10086                 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
10087         } else if (info->attrs[NL80211_ATTR_SSID] &&
10088                    info->attrs[NL80211_ATTR_FILS_CACHE_ID] &&
10089                    (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA ||
10090                     info->attrs[NL80211_ATTR_PMK])) {
10091                 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
10092                 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
10093                 pmksa.cache_id =
10094                         nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]);
10095         } else {
10096                 return -EINVAL;
10097         }
10098         if (info->attrs[NL80211_ATTR_PMK]) {
10099                 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
10100                 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
10101         }
10102
10103         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
10104             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT &&
10105             !(dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP &&
10106               wiphy_ext_feature_isset(&rdev->wiphy,
10107                                       NL80211_EXT_FEATURE_AP_PMKSA_CACHING)))
10108                 return -EOPNOTSUPP;
10109
10110         switch (info->genlhdr->cmd) {
10111         case NL80211_CMD_SET_PMKSA:
10112                 rdev_ops = rdev->ops->set_pmksa;
10113                 break;
10114         case NL80211_CMD_DEL_PMKSA:
10115                 rdev_ops = rdev->ops->del_pmksa;
10116                 break;
10117         default:
10118                 WARN_ON(1);
10119                 break;
10120         }
10121
10122         if (!rdev_ops)
10123                 return -EOPNOTSUPP;
10124
10125         return rdev_ops(&rdev->wiphy, dev, &pmksa);
10126 }
10127
10128 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
10129 {
10130         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10131         struct net_device *dev = info->user_ptr[1];
10132
10133         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
10134             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
10135                 return -EOPNOTSUPP;
10136
10137         if (!rdev->ops->flush_pmksa)
10138                 return -EOPNOTSUPP;
10139
10140         return rdev_flush_pmksa(rdev, dev);
10141 }
10142
10143 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
10144 {
10145         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10146         struct net_device *dev = info->user_ptr[1];
10147         u8 action_code, dialog_token;
10148         u32 peer_capability = 0;
10149         u16 status_code;
10150         u8 *peer;
10151         bool initiator;
10152
10153         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
10154             !rdev->ops->tdls_mgmt)
10155                 return -EOPNOTSUPP;
10156
10157         if (!info->attrs[NL80211_ATTR_TDLS_ACTION] ||
10158             !info->attrs[NL80211_ATTR_STATUS_CODE] ||
10159             !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] ||
10160             !info->attrs[NL80211_ATTR_IE] ||
10161             !info->attrs[NL80211_ATTR_MAC])
10162                 return -EINVAL;
10163
10164         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
10165         action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
10166         status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
10167         dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
10168         initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]);
10169         if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
10170                 peer_capability =
10171                         nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
10172
10173         return rdev_tdls_mgmt(rdev, dev, peer, action_code,
10174                               dialog_token, status_code, peer_capability,
10175                               initiator,
10176                               nla_data(info->attrs[NL80211_ATTR_IE]),
10177                               nla_len(info->attrs[NL80211_ATTR_IE]));
10178 }
10179
10180 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info)
10181 {
10182         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10183         struct net_device *dev = info->user_ptr[1];
10184         enum nl80211_tdls_operation operation;
10185         u8 *peer;
10186
10187         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
10188             !rdev->ops->tdls_oper)
10189                 return -EOPNOTSUPP;
10190
10191         if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] ||
10192             !info->attrs[NL80211_ATTR_MAC])
10193                 return -EINVAL;
10194
10195         operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]);
10196         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
10197
10198         return rdev_tdls_oper(rdev, dev, peer, operation);
10199 }
10200
10201 static int nl80211_remain_on_channel(struct sk_buff *skb,
10202                                      struct genl_info *info)
10203 {
10204         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10205         struct wireless_dev *wdev = info->user_ptr[1];
10206         struct cfg80211_chan_def chandef;
10207         const struct cfg80211_chan_def *compat_chandef;
10208         struct sk_buff *msg;
10209         void *hdr;
10210         u64 cookie;
10211         u32 duration;
10212         int err;
10213
10214         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
10215             !info->attrs[NL80211_ATTR_DURATION])
10216                 return -EINVAL;
10217
10218         duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
10219
10220         if (!rdev->ops->remain_on_channel ||
10221             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL))
10222                 return -EOPNOTSUPP;
10223
10224         /*
10225          * We should be on that channel for at least a minimum amount of
10226          * time (10ms) but no longer than the driver supports.
10227          */
10228         if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
10229             duration > rdev->wiphy.max_remain_on_channel_duration)
10230                 return -EINVAL;
10231
10232         err = nl80211_parse_chandef(rdev, info, &chandef);
10233         if (err)
10234                 return err;
10235
10236         wdev_lock(wdev);
10237         if (!cfg80211_off_channel_oper_allowed(wdev) &&
10238             !cfg80211_chandef_identical(&wdev->chandef, &chandef)) {
10239                 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef,
10240                                                              &chandef);
10241                 if (compat_chandef != &chandef) {
10242                         wdev_unlock(wdev);
10243                         return -EBUSY;
10244                 }
10245         }
10246         wdev_unlock(wdev);
10247
10248         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10249         if (!msg)
10250                 return -ENOMEM;
10251
10252         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10253                              NL80211_CMD_REMAIN_ON_CHANNEL);
10254         if (!hdr) {
10255                 err = -ENOBUFS;
10256                 goto free_msg;
10257         }
10258
10259         err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
10260                                      duration, &cookie);
10261
10262         if (err)
10263                 goto free_msg;
10264
10265         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
10266                               NL80211_ATTR_PAD))
10267                 goto nla_put_failure;
10268
10269         genlmsg_end(msg, hdr);
10270
10271         return genlmsg_reply(msg, info);
10272
10273  nla_put_failure:
10274         err = -ENOBUFS;
10275  free_msg:
10276         nlmsg_free(msg);
10277         return err;
10278 }
10279
10280 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
10281                                             struct genl_info *info)
10282 {
10283         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10284         struct wireless_dev *wdev = info->user_ptr[1];
10285         u64 cookie;
10286
10287         if (!info->attrs[NL80211_ATTR_COOKIE])
10288                 return -EINVAL;
10289
10290         if (!rdev->ops->cancel_remain_on_channel)
10291                 return -EOPNOTSUPP;
10292
10293         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
10294
10295         return rdev_cancel_remain_on_channel(rdev, wdev, cookie);
10296 }
10297
10298 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
10299                                        struct genl_info *info)
10300 {
10301         struct cfg80211_bitrate_mask mask;
10302         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10303         struct net_device *dev = info->user_ptr[1];
10304         int err;
10305
10306         if (!rdev->ops->set_bitrate_mask)
10307                 return -EOPNOTSUPP;
10308
10309         err = nl80211_parse_tx_bitrate_mask(info, &mask);
10310         if (err)
10311                 return err;
10312
10313         return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
10314 }
10315
10316 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
10317 {
10318         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10319         struct wireless_dev *wdev = info->user_ptr[1];
10320         u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
10321
10322         if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
10323                 return -EINVAL;
10324
10325         if (info->attrs[NL80211_ATTR_FRAME_TYPE])
10326                 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
10327
10328         switch (wdev->iftype) {
10329         case NL80211_IFTYPE_STATION:
10330         case NL80211_IFTYPE_ADHOC:
10331         case NL80211_IFTYPE_P2P_CLIENT:
10332         case NL80211_IFTYPE_AP:
10333         case NL80211_IFTYPE_AP_VLAN:
10334         case NL80211_IFTYPE_MESH_POINT:
10335         case NL80211_IFTYPE_P2P_GO:
10336         case NL80211_IFTYPE_P2P_DEVICE:
10337                 break;
10338         case NL80211_IFTYPE_NAN:
10339         default:
10340                 return -EOPNOTSUPP;
10341         }
10342
10343         /* not much point in registering if we can't reply */
10344         if (!rdev->ops->mgmt_tx)
10345                 return -EOPNOTSUPP;
10346
10347         return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type,
10348                         nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
10349                         nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]));
10350 }
10351
10352 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
10353 {
10354         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10355         struct wireless_dev *wdev = info->user_ptr[1];
10356         struct cfg80211_chan_def chandef;
10357         int err;
10358         void *hdr = NULL;
10359         u64 cookie;
10360         struct sk_buff *msg = NULL;
10361         struct cfg80211_mgmt_tx_params params = {
10362                 .dont_wait_for_ack =
10363                         info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK],
10364         };
10365
10366         if (!info->attrs[NL80211_ATTR_FRAME])
10367                 return -EINVAL;
10368
10369         if (!rdev->ops->mgmt_tx)
10370                 return -EOPNOTSUPP;
10371
10372         switch (wdev->iftype) {
10373         case NL80211_IFTYPE_P2P_DEVICE:
10374                 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
10375                         return -EINVAL;
10376         case NL80211_IFTYPE_STATION:
10377         case NL80211_IFTYPE_ADHOC:
10378         case NL80211_IFTYPE_P2P_CLIENT:
10379         case NL80211_IFTYPE_AP:
10380         case NL80211_IFTYPE_AP_VLAN:
10381         case NL80211_IFTYPE_MESH_POINT:
10382         case NL80211_IFTYPE_P2P_GO:
10383                 break;
10384         case NL80211_IFTYPE_NAN:
10385         default:
10386                 return -EOPNOTSUPP;
10387         }
10388
10389         if (info->attrs[NL80211_ATTR_DURATION]) {
10390                 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
10391                         return -EINVAL;
10392                 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
10393
10394                 /*
10395                  * We should wait on the channel for at least a minimum amount
10396                  * of time (10ms) but no longer than the driver supports.
10397                  */
10398                 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
10399                     params.wait > rdev->wiphy.max_remain_on_channel_duration)
10400                         return -EINVAL;
10401         }
10402
10403         params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
10404
10405         if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
10406                 return -EINVAL;
10407
10408         params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
10409
10410         /* get the channel if any has been specified, otherwise pass NULL to
10411          * the driver. The latter will use the current one
10412          */
10413         chandef.chan = NULL;
10414         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
10415                 err = nl80211_parse_chandef(rdev, info, &chandef);
10416                 if (err)
10417                         return err;
10418         }
10419
10420         if (!chandef.chan && params.offchan)
10421                 return -EINVAL;
10422
10423         wdev_lock(wdev);
10424         if (params.offchan && !cfg80211_off_channel_oper_allowed(wdev)) {
10425                 wdev_unlock(wdev);
10426                 return -EBUSY;
10427         }
10428         wdev_unlock(wdev);
10429
10430         params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
10431         params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
10432
10433         if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) {
10434                 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
10435                 int i;
10436
10437                 if (len % sizeof(u16))
10438                         return -EINVAL;
10439
10440                 params.n_csa_offsets = len / sizeof(u16);
10441                 params.csa_offsets =
10442                         nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
10443
10444                 /* check that all the offsets fit the frame */
10445                 for (i = 0; i < params.n_csa_offsets; i++) {
10446                         if (params.csa_offsets[i] >= params.len)
10447                                 return -EINVAL;
10448                 }
10449         }
10450
10451         if (!params.dont_wait_for_ack) {
10452                 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10453                 if (!msg)
10454                         return -ENOMEM;
10455
10456                 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10457                                      NL80211_CMD_FRAME);
10458                 if (!hdr) {
10459                         err = -ENOBUFS;
10460                         goto free_msg;
10461                 }
10462         }
10463
10464         params.chan = chandef.chan;
10465         err = cfg80211_mlme_mgmt_tx(rdev, wdev, &params, &cookie);
10466         if (err)
10467                 goto free_msg;
10468
10469         if (msg) {
10470                 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
10471                                       NL80211_ATTR_PAD))
10472                         goto nla_put_failure;
10473
10474                 genlmsg_end(msg, hdr);
10475                 return genlmsg_reply(msg, info);
10476         }
10477
10478         return 0;
10479
10480  nla_put_failure:
10481         err = -ENOBUFS;
10482  free_msg:
10483         nlmsg_free(msg);
10484         return err;
10485 }
10486
10487 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
10488 {
10489         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10490         struct wireless_dev *wdev = info->user_ptr[1];
10491         u64 cookie;
10492
10493         if (!info->attrs[NL80211_ATTR_COOKIE])
10494                 return -EINVAL;
10495
10496         if (!rdev->ops->mgmt_tx_cancel_wait)
10497                 return -EOPNOTSUPP;
10498
10499         switch (wdev->iftype) {
10500         case NL80211_IFTYPE_STATION:
10501         case NL80211_IFTYPE_ADHOC:
10502         case NL80211_IFTYPE_P2P_CLIENT:
10503         case NL80211_IFTYPE_AP:
10504         case NL80211_IFTYPE_AP_VLAN:
10505         case NL80211_IFTYPE_P2P_GO:
10506         case NL80211_IFTYPE_P2P_DEVICE:
10507                 break;
10508         case NL80211_IFTYPE_NAN:
10509         default:
10510                 return -EOPNOTSUPP;
10511         }
10512
10513         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
10514
10515         return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie);
10516 }
10517
10518 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
10519 {
10520         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10521         struct wireless_dev *wdev;
10522         struct net_device *dev = info->user_ptr[1];
10523         u8 ps_state;
10524         bool state;
10525         int err;
10526
10527         if (!info->attrs[NL80211_ATTR_PS_STATE])
10528                 return -EINVAL;
10529
10530         ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
10531
10532         wdev = dev->ieee80211_ptr;
10533
10534         if (!rdev->ops->set_power_mgmt)
10535                 return -EOPNOTSUPP;
10536
10537         state = (ps_state == NL80211_PS_ENABLED) ? true : false;
10538
10539         if (state == wdev->ps)
10540                 return 0;
10541
10542         err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout);
10543         if (!err)
10544                 wdev->ps = state;
10545         return err;
10546 }
10547
10548 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
10549 {
10550         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10551         enum nl80211_ps_state ps_state;
10552         struct wireless_dev *wdev;
10553         struct net_device *dev = info->user_ptr[1];
10554         struct sk_buff *msg;
10555         void *hdr;
10556         int err;
10557
10558         wdev = dev->ieee80211_ptr;
10559
10560         if (!rdev->ops->set_power_mgmt)
10561                 return -EOPNOTSUPP;
10562
10563         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10564         if (!msg)
10565                 return -ENOMEM;
10566
10567         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10568                              NL80211_CMD_GET_POWER_SAVE);
10569         if (!hdr) {
10570                 err = -ENOBUFS;
10571                 goto free_msg;
10572         }
10573
10574         if (wdev->ps)
10575                 ps_state = NL80211_PS_ENABLED;
10576         else
10577                 ps_state = NL80211_PS_DISABLED;
10578
10579         if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state))
10580                 goto nla_put_failure;
10581
10582         genlmsg_end(msg, hdr);
10583         return genlmsg_reply(msg, info);
10584
10585  nla_put_failure:
10586         err = -ENOBUFS;
10587  free_msg:
10588         nlmsg_free(msg);
10589         return err;
10590 }
10591
10592 static const struct nla_policy
10593 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
10594         [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY },
10595         [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 },
10596         [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
10597         [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
10598         [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
10599         [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
10600         [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 },
10601 };
10602
10603 static int nl80211_set_cqm_txe(struct genl_info *info,
10604                                u32 rate, u32 pkts, u32 intvl)
10605 {
10606         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10607         struct net_device *dev = info->user_ptr[1];
10608         struct wireless_dev *wdev = dev->ieee80211_ptr;
10609
10610         if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL)
10611                 return -EINVAL;
10612
10613         if (!rdev->ops->set_cqm_txe_config)
10614                 return -EOPNOTSUPP;
10615
10616         if (wdev->iftype != NL80211_IFTYPE_STATION &&
10617             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
10618                 return -EOPNOTSUPP;
10619
10620         return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl);
10621 }
10622
10623 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
10624                                     struct net_device *dev)
10625 {
10626         struct wireless_dev *wdev = dev->ieee80211_ptr;
10627         s32 last, low, high;
10628         u32 hyst;
10629         int i, n, low_index;
10630         int err;
10631
10632         /* RSSI reporting disabled? */
10633         if (!wdev->cqm_config)
10634                 return rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0);
10635
10636         /*
10637          * Obtain current RSSI value if possible, if not and no RSSI threshold
10638          * event has been received yet, we should receive an event after a
10639          * connection is established and enough beacons received to calculate
10640          * the average.
10641          */
10642         if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss &&
10643             rdev->ops->get_station) {
10644                 struct station_info sinfo = {};
10645                 u8 *mac_addr;
10646
10647                 mac_addr = wdev->current_bss->pub.bssid;
10648
10649                 err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
10650                 if (err)
10651                         return err;
10652
10653                 if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG))
10654                         wdev->cqm_config->last_rssi_event_value =
10655                                 (s8) sinfo.rx_beacon_signal_avg;
10656         }
10657
10658         last = wdev->cqm_config->last_rssi_event_value;
10659         hyst = wdev->cqm_config->rssi_hyst;
10660         n = wdev->cqm_config->n_rssi_thresholds;
10661
10662         for (i = 0; i < n; i++)
10663                 if (last < wdev->cqm_config->rssi_thresholds[i])
10664                         break;
10665
10666         low_index = i - 1;
10667         if (low_index >= 0) {
10668                 low_index = array_index_nospec(low_index, n);
10669                 low = wdev->cqm_config->rssi_thresholds[low_index] - hyst;
10670         } else {
10671                 low = S32_MIN;
10672         }
10673         if (i < n) {
10674                 i = array_index_nospec(i, n);
10675                 high = wdev->cqm_config->rssi_thresholds[i] + hyst - 1;
10676         } else {
10677                 high = S32_MAX;
10678         }
10679
10680         return rdev_set_cqm_rssi_range_config(rdev, dev, low, high);
10681 }
10682
10683 static int nl80211_set_cqm_rssi(struct genl_info *info,
10684                                 const s32 *thresholds, int n_thresholds,
10685                                 u32 hysteresis)
10686 {
10687         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10688         struct net_device *dev = info->user_ptr[1];
10689         struct wireless_dev *wdev = dev->ieee80211_ptr;
10690         int i, err;
10691         s32 prev = S32_MIN;
10692
10693         /* Check all values negative and sorted */
10694         for (i = 0; i < n_thresholds; i++) {
10695                 if (thresholds[i] > 0 || thresholds[i] <= prev)
10696                         return -EINVAL;
10697
10698                 prev = thresholds[i];
10699         }
10700
10701         if (wdev->iftype != NL80211_IFTYPE_STATION &&
10702             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
10703                 return -EOPNOTSUPP;
10704
10705         wdev_lock(wdev);
10706         cfg80211_cqm_config_free(wdev);
10707         wdev_unlock(wdev);
10708
10709         if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) {
10710                 if (n_thresholds == 0 || thresholds[0] == 0) /* Disabling */
10711                         return rdev_set_cqm_rssi_config(rdev, dev, 0, 0);
10712
10713                 return rdev_set_cqm_rssi_config(rdev, dev,
10714                                                 thresholds[0], hysteresis);
10715         }
10716
10717         if (!wiphy_ext_feature_isset(&rdev->wiphy,
10718                                      NL80211_EXT_FEATURE_CQM_RSSI_LIST))
10719                 return -EOPNOTSUPP;
10720
10721         if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */
10722                 n_thresholds = 0;
10723
10724         wdev_lock(wdev);
10725         if (n_thresholds) {
10726                 struct cfg80211_cqm_config *cqm_config;
10727
10728                 cqm_config = kzalloc(sizeof(struct cfg80211_cqm_config) +
10729                                      n_thresholds * sizeof(s32), GFP_KERNEL);
10730                 if (!cqm_config) {
10731                         err = -ENOMEM;
10732                         goto unlock;
10733                 }
10734
10735                 cqm_config->rssi_hyst = hysteresis;
10736                 cqm_config->n_rssi_thresholds = n_thresholds;
10737                 memcpy(cqm_config->rssi_thresholds, thresholds,
10738                        n_thresholds * sizeof(s32));
10739
10740                 wdev->cqm_config = cqm_config;
10741         }
10742
10743         err = cfg80211_cqm_rssi_update(rdev, dev);
10744
10745 unlock:
10746         wdev_unlock(wdev);
10747
10748         return err;
10749 }
10750
10751 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
10752 {
10753         struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1];
10754         struct nlattr *cqm;
10755         int err;
10756
10757         cqm = info->attrs[NL80211_ATTR_CQM];
10758         if (!cqm)
10759                 return -EINVAL;
10760
10761         err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm,
10762                                           nl80211_attr_cqm_policy,
10763                                           info->extack);
10764         if (err)
10765                 return err;
10766
10767         if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
10768             attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
10769                 const s32 *thresholds =
10770                         nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
10771                 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
10772                 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
10773
10774                 if (len % 4)
10775                         return -EINVAL;
10776
10777                 return nl80211_set_cqm_rssi(info, thresholds, len / 4,
10778                                             hysteresis);
10779         }
10780
10781         if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
10782             attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
10783             attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
10784                 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
10785                 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
10786                 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
10787
10788                 return nl80211_set_cqm_txe(info, rate, pkts, intvl);
10789         }
10790
10791         return -EINVAL;
10792 }
10793
10794 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info)
10795 {
10796         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10797         struct net_device *dev = info->user_ptr[1];
10798         struct ocb_setup setup = {};
10799         int err;
10800
10801         err = nl80211_parse_chandef(rdev, info, &setup.chandef);
10802         if (err)
10803                 return err;
10804
10805         return cfg80211_join_ocb(rdev, dev, &setup);
10806 }
10807
10808 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info)
10809 {
10810         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10811         struct net_device *dev = info->user_ptr[1];
10812
10813         return cfg80211_leave_ocb(rdev, dev);
10814 }
10815
10816 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
10817 {
10818         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10819         struct net_device *dev = info->user_ptr[1];
10820         struct mesh_config cfg;
10821         struct mesh_setup setup;
10822         int err;
10823
10824         /* start with default */
10825         memcpy(&cfg, &default_mesh_config, sizeof(cfg));
10826         memcpy(&setup, &default_mesh_setup, sizeof(setup));
10827
10828         if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
10829                 /* and parse parameters if given */
10830                 err = nl80211_parse_mesh_config(info, &cfg, NULL);
10831                 if (err)
10832                         return err;
10833         }
10834
10835         if (!info->attrs[NL80211_ATTR_MESH_ID] ||
10836             !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
10837                 return -EINVAL;
10838
10839         setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
10840         setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
10841
10842         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
10843             !nl80211_parse_mcast_rate(rdev, setup.mcast_rate,
10844                             nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
10845                         return -EINVAL;
10846
10847         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
10848                 setup.beacon_interval =
10849                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
10850
10851                 err = cfg80211_validate_beacon_int(rdev,
10852                                                    NL80211_IFTYPE_MESH_POINT,
10853                                                    setup.beacon_interval);
10854                 if (err)
10855                         return err;
10856         }
10857
10858         if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
10859                 setup.dtim_period =
10860                         nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
10861                 if (setup.dtim_period < 1 || setup.dtim_period > 100)
10862                         return -EINVAL;
10863         }
10864
10865         if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
10866                 /* parse additional setup parameters if given */
10867                 err = nl80211_parse_mesh_setup(info, &setup);
10868                 if (err)
10869                         return err;
10870         }
10871
10872         if (setup.user_mpm)
10873                 cfg.auto_open_plinks = false;
10874
10875         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
10876                 err = nl80211_parse_chandef(rdev, info, &setup.chandef);
10877                 if (err)
10878                         return err;
10879         } else {
10880                 /* __cfg80211_join_mesh() will sort it out */
10881                 setup.chandef.chan = NULL;
10882         }
10883
10884         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
10885                 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
10886                 int n_rates =
10887                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
10888                 struct ieee80211_supported_band *sband;
10889
10890                 if (!setup.chandef.chan)
10891                         return -EINVAL;
10892
10893                 sband = rdev->wiphy.bands[setup.chandef.chan->band];
10894
10895                 err = ieee80211_get_ratemask(sband, rates, n_rates,
10896                                              &setup.basic_rates);
10897                 if (err)
10898                         return err;
10899         }
10900
10901         if (info->attrs[NL80211_ATTR_TX_RATES]) {
10902                 err = nl80211_parse_tx_bitrate_mask(info, &setup.beacon_rate);
10903                 if (err)
10904                         return err;
10905
10906                 if (!setup.chandef.chan)
10907                         return -EINVAL;
10908
10909                 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band,
10910                                               &setup.beacon_rate);
10911                 if (err)
10912                         return err;
10913         }
10914
10915         setup.userspace_handles_dfs =
10916                 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
10917
10918         if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
10919                 int r = validate_pae_over_nl80211(rdev, info);
10920
10921                 if (r < 0)
10922                         return r;
10923
10924                 setup.control_port_over_nl80211 = true;
10925         }
10926
10927         wdev_lock(dev->ieee80211_ptr);
10928         err = __cfg80211_join_mesh(rdev, dev, &setup, &cfg);
10929         if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER])
10930                 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
10931         wdev_unlock(dev->ieee80211_ptr);
10932
10933         return err;
10934 }
10935
10936 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
10937 {
10938         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10939         struct net_device *dev = info->user_ptr[1];
10940
10941         return cfg80211_leave_mesh(rdev, dev);
10942 }
10943
10944 #ifdef CONFIG_PM
10945 static int nl80211_send_wowlan_patterns(struct sk_buff *msg,
10946                                         struct cfg80211_registered_device *rdev)
10947 {
10948         struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config;
10949         struct nlattr *nl_pats, *nl_pat;
10950         int i, pat_len;
10951
10952         if (!wowlan->n_patterns)
10953                 return 0;
10954
10955         nl_pats = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN);
10956         if (!nl_pats)
10957                 return -ENOBUFS;
10958
10959         for (i = 0; i < wowlan->n_patterns; i++) {
10960                 nl_pat = nla_nest_start_noflag(msg, i + 1);
10961                 if (!nl_pat)
10962                         return -ENOBUFS;
10963                 pat_len = wowlan->patterns[i].pattern_len;
10964                 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8),
10965                             wowlan->patterns[i].mask) ||
10966                     nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
10967                             wowlan->patterns[i].pattern) ||
10968                     nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
10969                                 wowlan->patterns[i].pkt_offset))
10970                         return -ENOBUFS;
10971                 nla_nest_end(msg, nl_pat);
10972         }
10973         nla_nest_end(msg, nl_pats);
10974
10975         return 0;
10976 }
10977
10978 static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
10979                                    struct cfg80211_wowlan_tcp *tcp)
10980 {
10981         struct nlattr *nl_tcp;
10982
10983         if (!tcp)
10984                 return 0;
10985
10986         nl_tcp = nla_nest_start_noflag(msg,
10987                                        NL80211_WOWLAN_TRIG_TCP_CONNECTION);
10988         if (!nl_tcp)
10989                 return -ENOBUFS;
10990
10991         if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) ||
10992             nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) ||
10993             nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) ||
10994             nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) ||
10995             nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) ||
10996             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
10997                     tcp->payload_len, tcp->payload) ||
10998             nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
10999                         tcp->data_interval) ||
11000             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
11001                     tcp->wake_len, tcp->wake_data) ||
11002             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK,
11003                     DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask))
11004                 return -ENOBUFS;
11005
11006         if (tcp->payload_seq.len &&
11007             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
11008                     sizeof(tcp->payload_seq), &tcp->payload_seq))
11009                 return -ENOBUFS;
11010
11011         if (tcp->payload_tok.len &&
11012             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
11013                     sizeof(tcp->payload_tok) + tcp->tokens_size,
11014                     &tcp->payload_tok))
11015                 return -ENOBUFS;
11016
11017         nla_nest_end(msg, nl_tcp);
11018
11019         return 0;
11020 }
11021
11022 static int nl80211_send_wowlan_nd(struct sk_buff *msg,
11023                                   struct cfg80211_sched_scan_request *req)
11024 {
11025         struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan;
11026         int i;
11027
11028         if (!req)
11029                 return 0;
11030
11031         nd = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_NET_DETECT);
11032         if (!nd)
11033                 return -ENOBUFS;
11034
11035         if (req->n_scan_plans == 1 &&
11036             nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL,
11037                         req->scan_plans[0].interval * 1000))
11038                 return -ENOBUFS;
11039
11040         if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay))
11041                 return -ENOBUFS;
11042
11043         if (req->relative_rssi_set) {
11044                 struct nl80211_bss_select_rssi_adjust rssi_adjust;
11045
11046                 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI,
11047                                req->relative_rssi))
11048                         return -ENOBUFS;
11049
11050                 rssi_adjust.band = req->rssi_adjust.band;
11051                 rssi_adjust.delta = req->rssi_adjust.delta;
11052                 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST,
11053                             sizeof(rssi_adjust), &rssi_adjust))
11054                         return -ENOBUFS;
11055         }
11056
11057         freqs = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES);
11058         if (!freqs)
11059                 return -ENOBUFS;
11060
11061         for (i = 0; i < req->n_channels; i++) {
11062                 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
11063                         return -ENOBUFS;
11064         }
11065
11066         nla_nest_end(msg, freqs);
11067
11068         if (req->n_match_sets) {
11069                 matches = nla_nest_start_noflag(msg,
11070                                                 NL80211_ATTR_SCHED_SCAN_MATCH);
11071                 if (!matches)
11072                         return -ENOBUFS;
11073
11074                 for (i = 0; i < req->n_match_sets; i++) {
11075                         match = nla_nest_start_noflag(msg, i);
11076                         if (!match)
11077                                 return -ENOBUFS;
11078
11079                         if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
11080                                     req->match_sets[i].ssid.ssid_len,
11081                                     req->match_sets[i].ssid.ssid))
11082                                 return -ENOBUFS;
11083                         nla_nest_end(msg, match);
11084                 }
11085                 nla_nest_end(msg, matches);
11086         }
11087
11088         scan_plans = nla_nest_start_noflag(msg, NL80211_ATTR_SCHED_SCAN_PLANS);
11089         if (!scan_plans)
11090                 return -ENOBUFS;
11091
11092         for (i = 0; i < req->n_scan_plans; i++) {
11093                 scan_plan = nla_nest_start_noflag(msg, i + 1);
11094                 if (!scan_plan)
11095                         return -ENOBUFS;
11096
11097                 if (nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL,
11098                                 req->scan_plans[i].interval) ||
11099                     (req->scan_plans[i].iterations &&
11100                      nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS,
11101                                  req->scan_plans[i].iterations)))
11102                         return -ENOBUFS;
11103                 nla_nest_end(msg, scan_plan);
11104         }
11105         nla_nest_end(msg, scan_plans);
11106
11107         nla_nest_end(msg, nd);
11108
11109         return 0;
11110 }
11111
11112 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
11113 {
11114         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11115         struct sk_buff *msg;
11116         void *hdr;
11117         u32 size = NLMSG_DEFAULT_SIZE;
11118
11119         if (!rdev->wiphy.wowlan)
11120                 return -EOPNOTSUPP;
11121
11122         if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) {
11123                 /* adjust size to have room for all the data */
11124                 size += rdev->wiphy.wowlan_config->tcp->tokens_size +
11125                         rdev->wiphy.wowlan_config->tcp->payload_len +
11126                         rdev->wiphy.wowlan_config->tcp->wake_len +
11127                         rdev->wiphy.wowlan_config->tcp->wake_len / 8;
11128         }
11129
11130         msg = nlmsg_new(size, GFP_KERNEL);
11131         if (!msg)
11132                 return -ENOMEM;
11133
11134         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11135                              NL80211_CMD_GET_WOWLAN);
11136         if (!hdr)
11137                 goto nla_put_failure;
11138
11139         if (rdev->wiphy.wowlan_config) {
11140                 struct nlattr *nl_wowlan;
11141
11142                 nl_wowlan = nla_nest_start_noflag(msg,
11143                                                   NL80211_ATTR_WOWLAN_TRIGGERS);
11144                 if (!nl_wowlan)
11145                         goto nla_put_failure;
11146
11147                 if ((rdev->wiphy.wowlan_config->any &&
11148                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
11149                     (rdev->wiphy.wowlan_config->disconnect &&
11150                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
11151                     (rdev->wiphy.wowlan_config->magic_pkt &&
11152                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
11153                     (rdev->wiphy.wowlan_config->gtk_rekey_failure &&
11154                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
11155                     (rdev->wiphy.wowlan_config->eap_identity_req &&
11156                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
11157                     (rdev->wiphy.wowlan_config->four_way_handshake &&
11158                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
11159                     (rdev->wiphy.wowlan_config->rfkill_release &&
11160                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
11161                         goto nla_put_failure;
11162
11163                 if (nl80211_send_wowlan_patterns(msg, rdev))
11164                         goto nla_put_failure;
11165
11166                 if (nl80211_send_wowlan_tcp(msg,
11167                                             rdev->wiphy.wowlan_config->tcp))
11168                         goto nla_put_failure;
11169
11170                 if (nl80211_send_wowlan_nd(
11171                             msg,
11172                             rdev->wiphy.wowlan_config->nd_config))
11173                         goto nla_put_failure;
11174
11175                 nla_nest_end(msg, nl_wowlan);
11176         }
11177
11178         genlmsg_end(msg, hdr);
11179         return genlmsg_reply(msg, info);
11180
11181 nla_put_failure:
11182         nlmsg_free(msg);
11183         return -ENOBUFS;
11184 }
11185
11186 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev,
11187                                     struct nlattr *attr,
11188                                     struct cfg80211_wowlan *trig)
11189 {
11190         struct nlattr *tb[NUM_NL80211_WOWLAN_TCP];
11191         struct cfg80211_wowlan_tcp *cfg;
11192         struct nl80211_wowlan_tcp_data_token *tok = NULL;
11193         struct nl80211_wowlan_tcp_data_seq *seq = NULL;
11194         u32 size;
11195         u32 data_size, wake_size, tokens_size = 0, wake_mask_size;
11196         int err, port;
11197
11198         if (!rdev->wiphy.wowlan->tcp)
11199                 return -EINVAL;
11200
11201         err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr,
11202                                           nl80211_wowlan_tcp_policy, NULL);
11203         if (err)
11204                 return err;
11205
11206         if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] ||
11207             !tb[NL80211_WOWLAN_TCP_DST_IPV4] ||
11208             !tb[NL80211_WOWLAN_TCP_DST_MAC] ||
11209             !tb[NL80211_WOWLAN_TCP_DST_PORT] ||
11210             !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] ||
11211             !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] ||
11212             !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] ||
11213             !tb[NL80211_WOWLAN_TCP_WAKE_MASK])
11214                 return -EINVAL;
11215
11216         data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]);
11217         if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max)
11218                 return -EINVAL;
11219
11220         if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) >
11221                         rdev->wiphy.wowlan->tcp->data_interval_max ||
11222             nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0)
11223                 return -EINVAL;
11224
11225         wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]);
11226         if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max)
11227                 return -EINVAL;
11228
11229         wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]);
11230         if (wake_mask_size != DIV_ROUND_UP(wake_size, 8))
11231                 return -EINVAL;
11232
11233         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) {
11234                 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
11235
11236                 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
11237                 tokens_size = tokln - sizeof(*tok);
11238
11239                 if (!tok->len || tokens_size % tok->len)
11240                         return -EINVAL;
11241                 if (!rdev->wiphy.wowlan->tcp->tok)
11242                         return -EINVAL;
11243                 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len)
11244                         return -EINVAL;
11245                 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len)
11246                         return -EINVAL;
11247                 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize)
11248                         return -EINVAL;
11249                 if (tok->offset + tok->len > data_size)
11250                         return -EINVAL;
11251         }
11252
11253         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) {
11254                 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]);
11255                 if (!rdev->wiphy.wowlan->tcp->seq)
11256                         return -EINVAL;
11257                 if (seq->len == 0 || seq->len > 4)
11258                         return -EINVAL;
11259                 if (seq->len + seq->offset > data_size)
11260                         return -EINVAL;
11261         }
11262
11263         size = sizeof(*cfg);
11264         size += data_size;
11265         size += wake_size + wake_mask_size;
11266         size += tokens_size;
11267
11268         cfg = kzalloc(size, GFP_KERNEL);
11269         if (!cfg)
11270                 return -ENOMEM;
11271         cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]);
11272         cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]);
11273         memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]),
11274                ETH_ALEN);
11275         if (tb[NL80211_WOWLAN_TCP_SRC_PORT])
11276                 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]);
11277         else
11278                 port = 0;
11279 #ifdef CONFIG_INET
11280         /* allocate a socket and port for it and use it */
11281         err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM,
11282                             IPPROTO_TCP, &cfg->sock, 1);
11283         if (err) {
11284                 kfree(cfg);
11285                 return err;
11286         }
11287         if (inet_csk_get_port(cfg->sock->sk, port)) {
11288                 sock_release(cfg->sock);
11289                 kfree(cfg);
11290                 return -EADDRINUSE;
11291         }
11292         cfg->src_port = inet_sk(cfg->sock->sk)->inet_num;
11293 #else
11294         if (!port) {
11295                 kfree(cfg);
11296                 return -EINVAL;
11297         }
11298         cfg->src_port = port;
11299 #endif
11300
11301         cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]);
11302         cfg->payload_len = data_size;
11303         cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size;
11304         memcpy((void *)cfg->payload,
11305                nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]),
11306                data_size);
11307         if (seq)
11308                 cfg->payload_seq = *seq;
11309         cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]);
11310         cfg->wake_len = wake_size;
11311         cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size;
11312         memcpy((void *)cfg->wake_data,
11313                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]),
11314                wake_size);
11315         cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size +
11316                          data_size + wake_size;
11317         memcpy((void *)cfg->wake_mask,
11318                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]),
11319                wake_mask_size);
11320         if (tok) {
11321                 cfg->tokens_size = tokens_size;
11322                 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size);
11323         }
11324
11325         trig->tcp = cfg;
11326
11327         return 0;
11328 }
11329
11330 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev,
11331                                    const struct wiphy_wowlan_support *wowlan,
11332                                    struct nlattr *attr,
11333                                    struct cfg80211_wowlan *trig)
11334 {
11335         struct nlattr **tb;
11336         int err;
11337
11338         tb = kcalloc(NUM_NL80211_ATTR, sizeof(*tb), GFP_KERNEL);
11339         if (!tb)
11340                 return -ENOMEM;
11341
11342         if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) {
11343                 err = -EOPNOTSUPP;
11344                 goto out;
11345         }
11346
11347         err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr,
11348                                           nl80211_policy, NULL);
11349         if (err)
11350                 goto out;
11351
11352         trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb,
11353                                                    wowlan->max_nd_match_sets);
11354         err = PTR_ERR_OR_ZERO(trig->nd_config);
11355         if (err)
11356                 trig->nd_config = NULL;
11357
11358 out:
11359         kfree(tb);
11360         return err;
11361 }
11362
11363 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
11364 {
11365         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11366         struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG];
11367         struct cfg80211_wowlan new_triggers = {};
11368         struct cfg80211_wowlan *ntrig;
11369         const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan;
11370         int err, i;
11371         bool prev_enabled = rdev->wiphy.wowlan_config;
11372         bool regular = false;
11373
11374         if (!wowlan)
11375                 return -EOPNOTSUPP;
11376
11377         if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) {
11378                 cfg80211_rdev_free_wowlan(rdev);
11379                 rdev->wiphy.wowlan_config = NULL;
11380                 goto set_wakeup;
11381         }
11382
11383         err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG,
11384                                           info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS],
11385                                           nl80211_wowlan_policy, info->extack);
11386         if (err)
11387                 return err;
11388
11389         if (tb[NL80211_WOWLAN_TRIG_ANY]) {
11390                 if (!(wowlan->flags & WIPHY_WOWLAN_ANY))
11391                         return -EINVAL;
11392                 new_triggers.any = true;
11393         }
11394
11395         if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) {
11396                 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT))
11397                         return -EINVAL;
11398                 new_triggers.disconnect = true;
11399                 regular = true;
11400         }
11401
11402         if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) {
11403                 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT))
11404                         return -EINVAL;
11405                 new_triggers.magic_pkt = true;
11406                 regular = true;
11407         }
11408
11409         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED])
11410                 return -EINVAL;
11411
11412         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) {
11413                 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE))
11414                         return -EINVAL;
11415                 new_triggers.gtk_rekey_failure = true;
11416                 regular = true;
11417         }
11418
11419         if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) {
11420                 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ))
11421                         return -EINVAL;
11422                 new_triggers.eap_identity_req = true;
11423                 regular = true;
11424         }
11425
11426         if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) {
11427                 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE))
11428                         return -EINVAL;
11429                 new_triggers.four_way_handshake = true;
11430                 regular = true;
11431         }
11432
11433         if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) {
11434                 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE))
11435                         return -EINVAL;
11436                 new_triggers.rfkill_release = true;
11437                 regular = true;
11438         }
11439
11440         if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) {
11441                 struct nlattr *pat;
11442                 int n_patterns = 0;
11443                 int rem, pat_len, mask_len, pkt_offset;
11444                 struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
11445
11446                 regular = true;
11447
11448                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
11449                                     rem)
11450                         n_patterns++;
11451                 if (n_patterns > wowlan->n_patterns)
11452                         return -EINVAL;
11453
11454                 new_triggers.patterns = kcalloc(n_patterns,
11455                                                 sizeof(new_triggers.patterns[0]),
11456                                                 GFP_KERNEL);
11457                 if (!new_triggers.patterns)
11458                         return -ENOMEM;
11459
11460                 new_triggers.n_patterns = n_patterns;
11461                 i = 0;
11462
11463                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
11464                                     rem) {
11465                         u8 *mask_pat;
11466
11467                         err = nla_parse_nested_deprecated(pat_tb,
11468                                                           MAX_NL80211_PKTPAT,
11469                                                           pat,
11470                                                           nl80211_packet_pattern_policy,
11471                                                           info->extack);
11472                         if (err)
11473                                 goto error;
11474
11475                         err = -EINVAL;
11476                         if (!pat_tb[NL80211_PKTPAT_MASK] ||
11477                             !pat_tb[NL80211_PKTPAT_PATTERN])
11478                                 goto error;
11479                         pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
11480                         mask_len = DIV_ROUND_UP(pat_len, 8);
11481                         if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
11482                                 goto error;
11483                         if (pat_len > wowlan->pattern_max_len ||
11484                             pat_len < wowlan->pattern_min_len)
11485                                 goto error;
11486
11487                         if (!pat_tb[NL80211_PKTPAT_OFFSET])
11488                                 pkt_offset = 0;
11489                         else
11490                                 pkt_offset = nla_get_u32(
11491                                         pat_tb[NL80211_PKTPAT_OFFSET]);
11492                         if (pkt_offset > wowlan->max_pkt_offset)
11493                                 goto error;
11494                         new_triggers.patterns[i].pkt_offset = pkt_offset;
11495
11496                         mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
11497                         if (!mask_pat) {
11498                                 err = -ENOMEM;
11499                                 goto error;
11500                         }
11501                         new_triggers.patterns[i].mask = mask_pat;
11502                         memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
11503                                mask_len);
11504                         mask_pat += mask_len;
11505                         new_triggers.patterns[i].pattern = mask_pat;
11506                         new_triggers.patterns[i].pattern_len = pat_len;
11507                         memcpy(mask_pat,
11508                                nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
11509                                pat_len);
11510                         i++;
11511                 }
11512         }
11513
11514         if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) {
11515                 regular = true;
11516                 err = nl80211_parse_wowlan_tcp(
11517                         rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION],
11518                         &new_triggers);
11519                 if (err)
11520                         goto error;
11521         }
11522
11523         if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) {
11524                 regular = true;
11525                 err = nl80211_parse_wowlan_nd(
11526                         rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT],
11527                         &new_triggers);
11528                 if (err)
11529                         goto error;
11530         }
11531
11532         /* The 'any' trigger means the device continues operating more or less
11533          * as in its normal operation mode and wakes up the host on most of the
11534          * normal interrupts (like packet RX, ...)
11535          * It therefore makes little sense to combine with the more constrained
11536          * wakeup trigger modes.
11537          */
11538         if (new_triggers.any && regular) {
11539                 err = -EINVAL;
11540                 goto error;
11541         }
11542
11543         ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL);
11544         if (!ntrig) {
11545                 err = -ENOMEM;
11546                 goto error;
11547         }
11548         cfg80211_rdev_free_wowlan(rdev);
11549         rdev->wiphy.wowlan_config = ntrig;
11550
11551  set_wakeup:
11552         if (rdev->ops->set_wakeup &&
11553             prev_enabled != !!rdev->wiphy.wowlan_config)
11554                 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config);
11555
11556         return 0;
11557  error:
11558         for (i = 0; i < new_triggers.n_patterns; i++)
11559                 kfree(new_triggers.patterns[i].mask);
11560         kfree(new_triggers.patterns);
11561         if (new_triggers.tcp && new_triggers.tcp->sock)
11562                 sock_release(new_triggers.tcp->sock);
11563         kfree(new_triggers.tcp);
11564         kfree(new_triggers.nd_config);
11565         return err;
11566 }
11567 #endif
11568
11569 static int nl80211_send_coalesce_rules(struct sk_buff *msg,
11570                                        struct cfg80211_registered_device *rdev)
11571 {
11572         struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules;
11573         int i, j, pat_len;
11574         struct cfg80211_coalesce_rules *rule;
11575
11576         if (!rdev->coalesce->n_rules)
11577                 return 0;
11578
11579         nl_rules = nla_nest_start_noflag(msg, NL80211_ATTR_COALESCE_RULE);
11580         if (!nl_rules)
11581                 return -ENOBUFS;
11582
11583         for (i = 0; i < rdev->coalesce->n_rules; i++) {
11584                 nl_rule = nla_nest_start_noflag(msg, i + 1);
11585                 if (!nl_rule)
11586                         return -ENOBUFS;
11587
11588                 rule = &rdev->coalesce->rules[i];
11589                 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY,
11590                                 rule->delay))
11591                         return -ENOBUFS;
11592
11593                 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION,
11594                                 rule->condition))
11595                         return -ENOBUFS;
11596
11597                 nl_pats = nla_nest_start_noflag(msg,
11598                                                 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN);
11599                 if (!nl_pats)
11600                         return -ENOBUFS;
11601
11602                 for (j = 0; j < rule->n_patterns; j++) {
11603                         nl_pat = nla_nest_start_noflag(msg, j + 1);
11604                         if (!nl_pat)
11605                                 return -ENOBUFS;
11606                         pat_len = rule->patterns[j].pattern_len;
11607                         if (nla_put(msg, NL80211_PKTPAT_MASK,
11608                                     DIV_ROUND_UP(pat_len, 8),
11609                                     rule->patterns[j].mask) ||
11610                             nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
11611                                     rule->patterns[j].pattern) ||
11612                             nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
11613                                         rule->patterns[j].pkt_offset))
11614                                 return -ENOBUFS;
11615                         nla_nest_end(msg, nl_pat);
11616                 }
11617                 nla_nest_end(msg, nl_pats);
11618                 nla_nest_end(msg, nl_rule);
11619         }
11620         nla_nest_end(msg, nl_rules);
11621
11622         return 0;
11623 }
11624
11625 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info)
11626 {
11627         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11628         struct sk_buff *msg;
11629         void *hdr;
11630
11631         if (!rdev->wiphy.coalesce)
11632                 return -EOPNOTSUPP;
11633
11634         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11635         if (!msg)
11636                 return -ENOMEM;
11637
11638         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11639                              NL80211_CMD_GET_COALESCE);
11640         if (!hdr)
11641                 goto nla_put_failure;
11642
11643         if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev))
11644                 goto nla_put_failure;
11645
11646         genlmsg_end(msg, hdr);
11647         return genlmsg_reply(msg, info);
11648
11649 nla_put_failure:
11650         nlmsg_free(msg);
11651         return -ENOBUFS;
11652 }
11653
11654 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev)
11655 {
11656         struct cfg80211_coalesce *coalesce = rdev->coalesce;
11657         int i, j;
11658         struct cfg80211_coalesce_rules *rule;
11659
11660         if (!coalesce)
11661                 return;
11662
11663         for (i = 0; i < coalesce->n_rules; i++) {
11664                 rule = &coalesce->rules[i];
11665                 for (j = 0; j < rule->n_patterns; j++)
11666                         kfree(rule->patterns[j].mask);
11667                 kfree(rule->patterns);
11668         }
11669         kfree(coalesce->rules);
11670         kfree(coalesce);
11671         rdev->coalesce = NULL;
11672 }
11673
11674 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,
11675                                        struct nlattr *rule,
11676                                        struct cfg80211_coalesce_rules *new_rule)
11677 {
11678         int err, i;
11679         const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
11680         struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat;
11681         int rem, pat_len, mask_len, pkt_offset, n_patterns = 0;
11682         struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
11683
11684         err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX,
11685                                           rule, nl80211_coalesce_policy, NULL);
11686         if (err)
11687                 return err;
11688
11689         if (tb[NL80211_ATTR_COALESCE_RULE_DELAY])
11690                 new_rule->delay =
11691                         nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]);
11692         if (new_rule->delay > coalesce->max_delay)
11693                 return -EINVAL;
11694
11695         if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION])
11696                 new_rule->condition =
11697                         nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]);
11698
11699         if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN])
11700                 return -EINVAL;
11701
11702         nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
11703                             rem)
11704                 n_patterns++;
11705         if (n_patterns > coalesce->n_patterns)
11706                 return -EINVAL;
11707
11708         new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]),
11709                                      GFP_KERNEL);
11710         if (!new_rule->patterns)
11711                 return -ENOMEM;
11712
11713         new_rule->n_patterns = n_patterns;
11714         i = 0;
11715
11716         nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
11717                             rem) {
11718                 u8 *mask_pat;
11719
11720                 err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT,
11721                                                   pat,
11722                                                   nl80211_packet_pattern_policy,
11723                                                   NULL);
11724                 if (err)
11725                         return err;
11726
11727                 if (!pat_tb[NL80211_PKTPAT_MASK] ||
11728                     !pat_tb[NL80211_PKTPAT_PATTERN])
11729                         return -EINVAL;
11730                 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
11731                 mask_len = DIV_ROUND_UP(pat_len, 8);
11732                 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
11733                         return -EINVAL;
11734                 if (pat_len > coalesce->pattern_max_len ||
11735                     pat_len < coalesce->pattern_min_len)
11736                         return -EINVAL;
11737
11738                 if (!pat_tb[NL80211_PKTPAT_OFFSET])
11739                         pkt_offset = 0;
11740                 else
11741                         pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]);
11742                 if (pkt_offset > coalesce->max_pkt_offset)
11743                         return -EINVAL;
11744                 new_rule->patterns[i].pkt_offset = pkt_offset;
11745
11746                 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
11747                 if (!mask_pat)
11748                         return -ENOMEM;
11749
11750                 new_rule->patterns[i].mask = mask_pat;
11751                 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
11752                        mask_len);
11753
11754                 mask_pat += mask_len;
11755                 new_rule->patterns[i].pattern = mask_pat;
11756                 new_rule->patterns[i].pattern_len = pat_len;
11757                 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
11758                        pat_len);
11759                 i++;
11760         }
11761
11762         return 0;
11763 }
11764
11765 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info)
11766 {
11767         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11768         const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
11769         struct cfg80211_coalesce new_coalesce = {};
11770         struct cfg80211_coalesce *n_coalesce;
11771         int err, rem_rule, n_rules = 0, i, j;
11772         struct nlattr *rule;
11773         struct cfg80211_coalesce_rules *tmp_rule;
11774
11775         if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce)
11776                 return -EOPNOTSUPP;
11777
11778         if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) {
11779                 cfg80211_rdev_free_coalesce(rdev);
11780                 rdev_set_coalesce(rdev, NULL);
11781                 return 0;
11782         }
11783
11784         nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
11785                             rem_rule)
11786                 n_rules++;
11787         if (n_rules > coalesce->n_rules)
11788                 return -EINVAL;
11789
11790         new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]),
11791                                      GFP_KERNEL);
11792         if (!new_coalesce.rules)
11793                 return -ENOMEM;
11794
11795         new_coalesce.n_rules = n_rules;
11796         i = 0;
11797
11798         nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
11799                             rem_rule) {
11800                 err = nl80211_parse_coalesce_rule(rdev, rule,
11801                                                   &new_coalesce.rules[i]);
11802                 if (err)
11803                         goto error;
11804
11805                 i++;
11806         }
11807
11808         err = rdev_set_coalesce(rdev, &new_coalesce);
11809         if (err)
11810                 goto error;
11811
11812         n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL);
11813         if (!n_coalesce) {
11814                 err = -ENOMEM;
11815                 goto error;
11816         }
11817         cfg80211_rdev_free_coalesce(rdev);
11818         rdev->coalesce = n_coalesce;
11819
11820         return 0;
11821 error:
11822         for (i = 0; i < new_coalesce.n_rules; i++) {
11823                 tmp_rule = &new_coalesce.rules[i];
11824                 for (j = 0; j < tmp_rule->n_patterns; j++)
11825                         kfree(tmp_rule->patterns[j].mask);
11826                 kfree(tmp_rule->patterns);
11827         }
11828         kfree(new_coalesce.rules);
11829
11830         return err;
11831 }
11832
11833 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
11834 {
11835         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11836         struct net_device *dev = info->user_ptr[1];
11837         struct wireless_dev *wdev = dev->ieee80211_ptr;
11838         struct nlattr *tb[NUM_NL80211_REKEY_DATA];
11839         struct cfg80211_gtk_rekey_data rekey_data;
11840         int err;
11841
11842         if (!info->attrs[NL80211_ATTR_REKEY_DATA])
11843                 return -EINVAL;
11844
11845         err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA,
11846                                           info->attrs[NL80211_ATTR_REKEY_DATA],
11847                                           nl80211_rekey_policy, info->extack);
11848         if (err)
11849                 return err;
11850
11851         if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] ||
11852             !tb[NL80211_REKEY_DATA_KCK])
11853                 return -EINVAL;
11854         if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN)
11855                 return -ERANGE;
11856         if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN)
11857                 return -ERANGE;
11858         if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN)
11859                 return -ERANGE;
11860
11861         rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]);
11862         rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]);
11863         rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]);
11864
11865         wdev_lock(wdev);
11866         if (!wdev->current_bss) {
11867                 err = -ENOTCONN;
11868                 goto out;
11869         }
11870
11871         if (!rdev->ops->set_rekey_data) {
11872                 err = -EOPNOTSUPP;
11873                 goto out;
11874         }
11875
11876         err = rdev_set_rekey_data(rdev, dev, &rekey_data);
11877  out:
11878         wdev_unlock(wdev);
11879         return err;
11880 }
11881
11882 static int nl80211_register_unexpected_frame(struct sk_buff *skb,
11883                                              struct genl_info *info)
11884 {
11885         struct net_device *dev = info->user_ptr[1];
11886         struct wireless_dev *wdev = dev->ieee80211_ptr;
11887
11888         if (wdev->iftype != NL80211_IFTYPE_AP &&
11889             wdev->iftype != NL80211_IFTYPE_P2P_GO)
11890                 return -EINVAL;
11891
11892         if (wdev->ap_unexpected_nlportid)
11893                 return -EBUSY;
11894
11895         wdev->ap_unexpected_nlportid = info->snd_portid;
11896         return 0;
11897 }
11898
11899 static int nl80211_probe_client(struct sk_buff *skb,
11900                                 struct genl_info *info)
11901 {
11902         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11903         struct net_device *dev = info->user_ptr[1];
11904         struct wireless_dev *wdev = dev->ieee80211_ptr;
11905         struct sk_buff *msg;
11906         void *hdr;
11907         const u8 *addr;
11908         u64 cookie;
11909         int err;
11910
11911         if (wdev->iftype != NL80211_IFTYPE_AP &&
11912             wdev->iftype != NL80211_IFTYPE_P2P_GO)
11913                 return -EOPNOTSUPP;
11914
11915         if (!info->attrs[NL80211_ATTR_MAC])
11916                 return -EINVAL;
11917
11918         if (!rdev->ops->probe_client)
11919                 return -EOPNOTSUPP;
11920
11921         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11922         if (!msg)
11923                 return -ENOMEM;
11924
11925         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11926                              NL80211_CMD_PROBE_CLIENT);
11927         if (!hdr) {
11928                 err = -ENOBUFS;
11929                 goto free_msg;
11930         }
11931
11932         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
11933
11934         err = rdev_probe_client(rdev, dev, addr, &cookie);
11935         if (err)
11936                 goto free_msg;
11937
11938         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
11939                               NL80211_ATTR_PAD))
11940                 goto nla_put_failure;
11941
11942         genlmsg_end(msg, hdr);
11943
11944         return genlmsg_reply(msg, info);
11945
11946  nla_put_failure:
11947         err = -ENOBUFS;
11948  free_msg:
11949         nlmsg_free(msg);
11950         return err;
11951 }
11952
11953 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info)
11954 {
11955         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11956         struct cfg80211_beacon_registration *reg, *nreg;
11957         int rv;
11958
11959         if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS))
11960                 return -EOPNOTSUPP;
11961
11962         nreg = kzalloc(sizeof(*nreg), GFP_KERNEL);
11963         if (!nreg)
11964                 return -ENOMEM;
11965
11966         /* First, check if already registered. */
11967         spin_lock_bh(&rdev->beacon_registrations_lock);
11968         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
11969                 if (reg->nlportid == info->snd_portid) {
11970                         rv = -EALREADY;
11971                         goto out_err;
11972                 }
11973         }
11974         /* Add it to the list */
11975         nreg->nlportid = info->snd_portid;
11976         list_add(&nreg->list, &rdev->beacon_registrations);
11977
11978         spin_unlock_bh(&rdev->beacon_registrations_lock);
11979
11980         return 0;
11981 out_err:
11982         spin_unlock_bh(&rdev->beacon_registrations_lock);
11983         kfree(nreg);
11984         return rv;
11985 }
11986
11987 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
11988 {
11989         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11990         struct wireless_dev *wdev = info->user_ptr[1];
11991         int err;
11992
11993         if (!rdev->ops->start_p2p_device)
11994                 return -EOPNOTSUPP;
11995
11996         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
11997                 return -EOPNOTSUPP;
11998
11999         if (wdev_running(wdev))
12000                 return 0;
12001
12002         if (rfkill_blocked(rdev->rfkill))
12003                 return -ERFKILL;
12004
12005         err = rdev_start_p2p_device(rdev, wdev);
12006         if (err)
12007                 return err;
12008
12009         wdev->is_running = true;
12010         rdev->opencount++;
12011
12012         return 0;
12013 }
12014
12015 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info)
12016 {
12017         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12018         struct wireless_dev *wdev = info->user_ptr[1];
12019
12020         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
12021                 return -EOPNOTSUPP;
12022
12023         if (!rdev->ops->stop_p2p_device)
12024                 return -EOPNOTSUPP;
12025
12026         cfg80211_stop_p2p_device(rdev, wdev);
12027
12028         return 0;
12029 }
12030
12031 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
12032 {
12033         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12034         struct wireless_dev *wdev = info->user_ptr[1];
12035         struct cfg80211_nan_conf conf = {};
12036         int err;
12037
12038         if (wdev->iftype != NL80211_IFTYPE_NAN)
12039                 return -EOPNOTSUPP;
12040
12041         if (wdev_running(wdev))
12042                 return -EEXIST;
12043
12044         if (rfkill_blocked(rdev->rfkill))
12045                 return -ERFKILL;
12046
12047         if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF])
12048                 return -EINVAL;
12049
12050         conf.master_pref =
12051                 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
12052
12053         if (info->attrs[NL80211_ATTR_BANDS]) {
12054                 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
12055
12056                 if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
12057                         return -EOPNOTSUPP;
12058
12059                 if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
12060                         return -EINVAL;
12061
12062                 conf.bands = bands;
12063         }
12064
12065         err = rdev_start_nan(rdev, wdev, &conf);
12066         if (err)
12067                 return err;
12068
12069         wdev->is_running = true;
12070         rdev->opencount++;
12071
12072         return 0;
12073 }
12074
12075 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info)
12076 {
12077         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12078         struct wireless_dev *wdev = info->user_ptr[1];
12079
12080         if (wdev->iftype != NL80211_IFTYPE_NAN)
12081                 return -EOPNOTSUPP;
12082
12083         cfg80211_stop_nan(rdev, wdev);
12084
12085         return 0;
12086 }
12087
12088 static int validate_nan_filter(struct nlattr *filter_attr)
12089 {
12090         struct nlattr *attr;
12091         int len = 0, n_entries = 0, rem;
12092
12093         nla_for_each_nested(attr, filter_attr, rem) {
12094                 len += nla_len(attr);
12095                 n_entries++;
12096         }
12097
12098         if (len >= U8_MAX)
12099                 return -EINVAL;
12100
12101         return n_entries;
12102 }
12103
12104 static int handle_nan_filter(struct nlattr *attr_filter,
12105                              struct cfg80211_nan_func *func,
12106                              bool tx)
12107 {
12108         struct nlattr *attr;
12109         int n_entries, rem, i;
12110         struct cfg80211_nan_func_filter *filter;
12111
12112         n_entries = validate_nan_filter(attr_filter);
12113         if (n_entries < 0)
12114                 return n_entries;
12115
12116         BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters));
12117
12118         filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL);
12119         if (!filter)
12120                 return -ENOMEM;
12121
12122         i = 0;
12123         nla_for_each_nested(attr, attr_filter, rem) {
12124                 filter[i].filter = nla_memdup(attr, GFP_KERNEL);
12125                 filter[i].len = nla_len(attr);
12126                 i++;
12127         }
12128         if (tx) {
12129                 func->num_tx_filters = n_entries;
12130                 func->tx_filters = filter;
12131         } else {
12132                 func->num_rx_filters = n_entries;
12133                 func->rx_filters = filter;
12134         }
12135
12136         return 0;
12137 }
12138
12139 static int nl80211_nan_add_func(struct sk_buff *skb,
12140                                 struct genl_info *info)
12141 {
12142         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12143         struct wireless_dev *wdev = info->user_ptr[1];
12144         struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr;
12145         struct cfg80211_nan_func *func;
12146         struct sk_buff *msg = NULL;
12147         void *hdr = NULL;
12148         int err = 0;
12149
12150         if (wdev->iftype != NL80211_IFTYPE_NAN)
12151                 return -EOPNOTSUPP;
12152
12153         if (!wdev_running(wdev))
12154                 return -ENOTCONN;
12155
12156         if (!info->attrs[NL80211_ATTR_NAN_FUNC])
12157                 return -EINVAL;
12158
12159         err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX,
12160                                           info->attrs[NL80211_ATTR_NAN_FUNC],
12161                                           nl80211_nan_func_policy,
12162                                           info->extack);
12163         if (err)
12164                 return err;
12165
12166         func = kzalloc(sizeof(*func), GFP_KERNEL);
12167         if (!func)
12168                 return -ENOMEM;
12169
12170         func->cookie = cfg80211_assign_cookie(rdev);
12171
12172         if (!tb[NL80211_NAN_FUNC_TYPE] ||
12173             nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]) > NL80211_NAN_FUNC_MAX_TYPE) {
12174                 err = -EINVAL;
12175                 goto out;
12176         }
12177
12178
12179         func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]);
12180
12181         if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) {
12182                 err = -EINVAL;
12183                 goto out;
12184         }
12185
12186         memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]),
12187                sizeof(func->service_id));
12188
12189         func->close_range =
12190                 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]);
12191
12192         if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) {
12193                 func->serv_spec_info_len =
12194                         nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]);
12195                 func->serv_spec_info =
12196                         kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]),
12197                                 func->serv_spec_info_len,
12198                                 GFP_KERNEL);
12199                 if (!func->serv_spec_info) {
12200                         err = -ENOMEM;
12201                         goto out;
12202                 }
12203         }
12204
12205         if (tb[NL80211_NAN_FUNC_TTL])
12206                 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]);
12207
12208         switch (func->type) {
12209         case NL80211_NAN_FUNC_PUBLISH:
12210                 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) {
12211                         err = -EINVAL;
12212                         goto out;
12213                 }
12214
12215                 func->publish_type =
12216                         nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]);
12217                 func->publish_bcast =
12218                         nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]);
12219
12220                 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) &&
12221                         func->publish_bcast) {
12222                         err = -EINVAL;
12223                         goto out;
12224                 }
12225                 break;
12226         case NL80211_NAN_FUNC_SUBSCRIBE:
12227                 func->subscribe_active =
12228                         nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]);
12229                 break;
12230         case NL80211_NAN_FUNC_FOLLOW_UP:
12231                 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] ||
12232                     !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] ||
12233                     !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) {
12234                         err = -EINVAL;
12235                         goto out;
12236                 }
12237
12238                 func->followup_id =
12239                         nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]);
12240                 func->followup_reqid =
12241                         nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]);
12242                 memcpy(func->followup_dest.addr,
12243                        nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]),
12244                        sizeof(func->followup_dest.addr));
12245                 if (func->ttl) {
12246                         err = -EINVAL;
12247                         goto out;
12248                 }
12249                 break;
12250         default:
12251                 err = -EINVAL;
12252                 goto out;
12253         }
12254
12255         if (tb[NL80211_NAN_FUNC_SRF]) {
12256                 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR];
12257
12258                 err = nla_parse_nested_deprecated(srf_tb,
12259                                                   NL80211_NAN_SRF_ATTR_MAX,
12260                                                   tb[NL80211_NAN_FUNC_SRF],
12261                                                   nl80211_nan_srf_policy,
12262                                                   info->extack);
12263                 if (err)
12264                         goto out;
12265
12266                 func->srf_include =
12267                         nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]);
12268
12269                 if (srf_tb[NL80211_NAN_SRF_BF]) {
12270                         if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] ||
12271                             !srf_tb[NL80211_NAN_SRF_BF_IDX]) {
12272                                 err = -EINVAL;
12273                                 goto out;
12274                         }
12275
12276                         func->srf_bf_len =
12277                                 nla_len(srf_tb[NL80211_NAN_SRF_BF]);
12278                         func->srf_bf =
12279                                 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]),
12280                                         func->srf_bf_len, GFP_KERNEL);
12281                         if (!func->srf_bf) {
12282                                 err = -ENOMEM;
12283                                 goto out;
12284                         }
12285
12286                         func->srf_bf_idx =
12287                                 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]);
12288                 } else {
12289                         struct nlattr *attr, *mac_attr =
12290                                 srf_tb[NL80211_NAN_SRF_MAC_ADDRS];
12291                         int n_entries, rem, i = 0;
12292
12293                         if (!mac_attr) {
12294                                 err = -EINVAL;
12295                                 goto out;
12296                         }
12297
12298                         n_entries = validate_acl_mac_addrs(mac_attr);
12299                         if (n_entries <= 0) {
12300                                 err = -EINVAL;
12301                                 goto out;
12302                         }
12303
12304                         func->srf_num_macs = n_entries;
12305                         func->srf_macs =
12306                                 kcalloc(n_entries, sizeof(*func->srf_macs),
12307                                         GFP_KERNEL);
12308                         if (!func->srf_macs) {
12309                                 err = -ENOMEM;
12310                                 goto out;
12311                         }
12312
12313                         nla_for_each_nested(attr, mac_attr, rem)
12314                                 memcpy(func->srf_macs[i++].addr, nla_data(attr),
12315                                        sizeof(*func->srf_macs));
12316                 }
12317         }
12318
12319         if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) {
12320                 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER],
12321                                         func, true);
12322                 if (err)
12323                         goto out;
12324         }
12325
12326         if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) {
12327                 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER],
12328                                         func, false);
12329                 if (err)
12330                         goto out;
12331         }
12332
12333         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
12334         if (!msg) {
12335                 err = -ENOMEM;
12336                 goto out;
12337         }
12338
12339         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
12340                              NL80211_CMD_ADD_NAN_FUNCTION);
12341         /* This can't really happen - we just allocated 4KB */
12342         if (WARN_ON(!hdr)) {
12343                 err = -ENOMEM;
12344                 goto out;
12345         }
12346
12347         err = rdev_add_nan_func(rdev, wdev, func);
12348 out:
12349         if (err < 0) {
12350                 cfg80211_free_nan_func(func);
12351                 nlmsg_free(msg);
12352                 return err;
12353         }
12354
12355         /* propagate the instance id and cookie to userspace  */
12356         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie,
12357                               NL80211_ATTR_PAD))
12358                 goto nla_put_failure;
12359
12360         func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC);
12361         if (!func_attr)
12362                 goto nla_put_failure;
12363
12364         if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID,
12365                        func->instance_id))
12366                 goto nla_put_failure;
12367
12368         nla_nest_end(msg, func_attr);
12369
12370         genlmsg_end(msg, hdr);
12371         return genlmsg_reply(msg, info);
12372
12373 nla_put_failure:
12374         nlmsg_free(msg);
12375         return -ENOBUFS;
12376 }
12377
12378 static int nl80211_nan_del_func(struct sk_buff *skb,
12379                                struct genl_info *info)
12380 {
12381         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12382         struct wireless_dev *wdev = info->user_ptr[1];
12383         u64 cookie;
12384
12385         if (wdev->iftype != NL80211_IFTYPE_NAN)
12386                 return -EOPNOTSUPP;
12387
12388         if (!wdev_running(wdev))
12389                 return -ENOTCONN;
12390
12391         if (!info->attrs[NL80211_ATTR_COOKIE])
12392                 return -EINVAL;
12393
12394         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
12395
12396         rdev_del_nan_func(rdev, wdev, cookie);
12397
12398         return 0;
12399 }
12400
12401 static int nl80211_nan_change_config(struct sk_buff *skb,
12402                                      struct genl_info *info)
12403 {
12404         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12405         struct wireless_dev *wdev = info->user_ptr[1];
12406         struct cfg80211_nan_conf conf = {};
12407         u32 changed = 0;
12408
12409         if (wdev->iftype != NL80211_IFTYPE_NAN)
12410                 return -EOPNOTSUPP;
12411
12412         if (!wdev_running(wdev))
12413                 return -ENOTCONN;
12414
12415         if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) {
12416                 conf.master_pref =
12417                         nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
12418                 if (conf.master_pref <= 1 || conf.master_pref == 255)
12419                         return -EINVAL;
12420
12421                 changed |= CFG80211_NAN_CONF_CHANGED_PREF;
12422         }
12423
12424         if (info->attrs[NL80211_ATTR_BANDS]) {
12425                 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
12426
12427                 if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
12428                         return -EOPNOTSUPP;
12429
12430                 if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
12431                         return -EINVAL;
12432
12433                 conf.bands = bands;
12434                 changed |= CFG80211_NAN_CONF_CHANGED_BANDS;
12435         }
12436
12437         if (!changed)
12438                 return -EINVAL;
12439
12440         return rdev_nan_change_conf(rdev, wdev, &conf, changed);
12441 }
12442
12443 void cfg80211_nan_match(struct wireless_dev *wdev,
12444                         struct cfg80211_nan_match_params *match, gfp_t gfp)
12445 {
12446         struct wiphy *wiphy = wdev->wiphy;
12447         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12448         struct nlattr *match_attr, *local_func_attr, *peer_func_attr;
12449         struct sk_buff *msg;
12450         void *hdr;
12451
12452         if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr))
12453                 return;
12454
12455         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12456         if (!msg)
12457                 return;
12458
12459         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH);
12460         if (!hdr) {
12461                 nlmsg_free(msg);
12462                 return;
12463         }
12464
12465         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12466             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
12467                                          wdev->netdev->ifindex)) ||
12468             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
12469                               NL80211_ATTR_PAD))
12470                 goto nla_put_failure;
12471
12472         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie,
12473                               NL80211_ATTR_PAD) ||
12474             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr))
12475                 goto nla_put_failure;
12476
12477         match_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_MATCH);
12478         if (!match_attr)
12479                 goto nla_put_failure;
12480
12481         local_func_attr = nla_nest_start_noflag(msg,
12482                                                 NL80211_NAN_MATCH_FUNC_LOCAL);
12483         if (!local_func_attr)
12484                 goto nla_put_failure;
12485
12486         if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id))
12487                 goto nla_put_failure;
12488
12489         nla_nest_end(msg, local_func_attr);
12490
12491         peer_func_attr = nla_nest_start_noflag(msg,
12492                                                NL80211_NAN_MATCH_FUNC_PEER);
12493         if (!peer_func_attr)
12494                 goto nla_put_failure;
12495
12496         if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) ||
12497             nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id))
12498                 goto nla_put_failure;
12499
12500         if (match->info && match->info_len &&
12501             nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len,
12502                     match->info))
12503                 goto nla_put_failure;
12504
12505         nla_nest_end(msg, peer_func_attr);
12506         nla_nest_end(msg, match_attr);
12507         genlmsg_end(msg, hdr);
12508
12509         if (!wdev->owner_nlportid)
12510                 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
12511                                         msg, 0, NL80211_MCGRP_NAN, gfp);
12512         else
12513                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
12514                                 wdev->owner_nlportid);
12515
12516         return;
12517
12518 nla_put_failure:
12519         nlmsg_free(msg);
12520 }
12521 EXPORT_SYMBOL(cfg80211_nan_match);
12522
12523 void cfg80211_nan_func_terminated(struct wireless_dev *wdev,
12524                                   u8 inst_id,
12525                                   enum nl80211_nan_func_term_reason reason,
12526                                   u64 cookie, gfp_t gfp)
12527 {
12528         struct wiphy *wiphy = wdev->wiphy;
12529         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12530         struct sk_buff *msg;
12531         struct nlattr *func_attr;
12532         void *hdr;
12533
12534         if (WARN_ON(!inst_id))
12535                 return;
12536
12537         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
12538         if (!msg)
12539                 return;
12540
12541         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION);
12542         if (!hdr) {
12543                 nlmsg_free(msg);
12544                 return;
12545         }
12546
12547         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12548             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
12549                                          wdev->netdev->ifindex)) ||
12550             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
12551                               NL80211_ATTR_PAD))
12552                 goto nla_put_failure;
12553
12554         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
12555                               NL80211_ATTR_PAD))
12556                 goto nla_put_failure;
12557
12558         func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC);
12559         if (!func_attr)
12560                 goto nla_put_failure;
12561
12562         if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) ||
12563             nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason))
12564                 goto nla_put_failure;
12565
12566         nla_nest_end(msg, func_attr);
12567         genlmsg_end(msg, hdr);
12568
12569         if (!wdev->owner_nlportid)
12570                 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
12571                                         msg, 0, NL80211_MCGRP_NAN, gfp);
12572         else
12573                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
12574                                 wdev->owner_nlportid);
12575
12576         return;
12577
12578 nla_put_failure:
12579         nlmsg_free(msg);
12580 }
12581 EXPORT_SYMBOL(cfg80211_nan_func_terminated);
12582
12583 static int nl80211_get_protocol_features(struct sk_buff *skb,
12584                                          struct genl_info *info)
12585 {
12586         void *hdr;
12587         struct sk_buff *msg;
12588
12589         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
12590         if (!msg)
12591                 return -ENOMEM;
12592
12593         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
12594                              NL80211_CMD_GET_PROTOCOL_FEATURES);
12595         if (!hdr)
12596                 goto nla_put_failure;
12597
12598         if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES,
12599                         NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP))
12600                 goto nla_put_failure;
12601
12602         genlmsg_end(msg, hdr);
12603         return genlmsg_reply(msg, info);
12604
12605  nla_put_failure:
12606         kfree_skb(msg);
12607         return -ENOBUFS;
12608 }
12609
12610 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info)
12611 {
12612         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12613         struct cfg80211_update_ft_ies_params ft_params;
12614         struct net_device *dev = info->user_ptr[1];
12615
12616         if (!rdev->ops->update_ft_ies)
12617                 return -EOPNOTSUPP;
12618
12619         if (!info->attrs[NL80211_ATTR_MDID] ||
12620             !info->attrs[NL80211_ATTR_IE])
12621                 return -EINVAL;
12622
12623         memset(&ft_params, 0, sizeof(ft_params));
12624         ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]);
12625         ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
12626         ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
12627
12628         return rdev_update_ft_ies(rdev, dev, &ft_params);
12629 }
12630
12631 static int nl80211_crit_protocol_start(struct sk_buff *skb,
12632                                        struct genl_info *info)
12633 {
12634         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12635         struct wireless_dev *wdev = info->user_ptr[1];
12636         enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC;
12637         u16 duration;
12638         int ret;
12639
12640         if (!rdev->ops->crit_proto_start)
12641                 return -EOPNOTSUPP;
12642
12643         if (WARN_ON(!rdev->ops->crit_proto_stop))
12644                 return -EINVAL;
12645
12646         if (rdev->crit_proto_nlportid)
12647                 return -EBUSY;
12648
12649         /* determine protocol if provided */
12650         if (info->attrs[NL80211_ATTR_CRIT_PROT_ID])
12651                 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]);
12652
12653         if (proto >= NUM_NL80211_CRIT_PROTO)
12654                 return -EINVAL;
12655
12656         /* timeout must be provided */
12657         if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION])
12658                 return -EINVAL;
12659
12660         duration =
12661                 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
12662
12663         if (duration > NL80211_CRIT_PROTO_MAX_DURATION)
12664                 return -ERANGE;
12665
12666         ret = rdev_crit_proto_start(rdev, wdev, proto, duration);
12667         if (!ret)
12668                 rdev->crit_proto_nlportid = info->snd_portid;
12669
12670         return ret;
12671 }
12672
12673 static int nl80211_crit_protocol_stop(struct sk_buff *skb,
12674                                       struct genl_info *info)
12675 {
12676         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12677         struct wireless_dev *wdev = info->user_ptr[1];
12678
12679         if (!rdev->ops->crit_proto_stop)
12680                 return -EOPNOTSUPP;
12681
12682         if (rdev->crit_proto_nlportid) {
12683                 rdev->crit_proto_nlportid = 0;
12684                 rdev_crit_proto_stop(rdev, wdev);
12685         }
12686         return 0;
12687 }
12688
12689 static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd,
12690                                        struct nlattr *attr,
12691                                        struct netlink_ext_ack *extack)
12692 {
12693         if (vcmd->policy == VENDOR_CMD_RAW_DATA) {
12694                 if (attr->nla_type & NLA_F_NESTED) {
12695                         NL_SET_ERR_MSG_ATTR(extack, attr,
12696                                             "unexpected nested data");
12697                         return -EINVAL;
12698                 }
12699
12700                 return 0;
12701         }
12702
12703         if (!(attr->nla_type & NLA_F_NESTED)) {
12704                 NL_SET_ERR_MSG_ATTR(extack, attr, "expected nested data");
12705                 return -EINVAL;
12706         }
12707
12708         return nl80211_validate_nested(attr, vcmd->maxattr, vcmd->policy,
12709                                        extack);
12710 }
12711
12712 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
12713 {
12714         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12715         struct wireless_dev *wdev =
12716                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
12717         int i, err;
12718         u32 vid, subcmd;
12719
12720         if (!rdev->wiphy.vendor_commands)
12721                 return -EOPNOTSUPP;
12722
12723         if (IS_ERR(wdev)) {
12724                 err = PTR_ERR(wdev);
12725                 if (err != -EINVAL)
12726                         return err;
12727                 wdev = NULL;
12728         } else if (wdev->wiphy != &rdev->wiphy) {
12729                 return -EINVAL;
12730         }
12731
12732         if (!info->attrs[NL80211_ATTR_VENDOR_ID] ||
12733             !info->attrs[NL80211_ATTR_VENDOR_SUBCMD])
12734                 return -EINVAL;
12735
12736         vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]);
12737         subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]);
12738         for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
12739                 const struct wiphy_vendor_command *vcmd;
12740                 void *data = NULL;
12741                 int len = 0;
12742
12743                 vcmd = &rdev->wiphy.vendor_commands[i];
12744
12745                 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
12746                         continue;
12747
12748                 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
12749                                    WIPHY_VENDOR_CMD_NEED_NETDEV)) {
12750                         if (!wdev)
12751                                 return -EINVAL;
12752                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
12753                             !wdev->netdev)
12754                                 return -EINVAL;
12755
12756                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
12757                                 if (!wdev_running(wdev))
12758                                         return -ENETDOWN;
12759                         }
12760
12761                         if (!vcmd->doit)
12762                                 return -EOPNOTSUPP;
12763                 } else {
12764                         wdev = NULL;
12765                 }
12766
12767                 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
12768                         data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
12769                         len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
12770
12771                         err = nl80211_vendor_check_policy(vcmd,
12772                                         info->attrs[NL80211_ATTR_VENDOR_DATA],
12773                                         info->extack);
12774                         if (err)
12775                                 return err;
12776                 }
12777
12778                 rdev->cur_cmd_info = info;
12779                 err = vcmd->doit(&rdev->wiphy, wdev, data, len);
12780                 rdev->cur_cmd_info = NULL;
12781                 return err;
12782         }
12783
12784         return -EOPNOTSUPP;
12785 }
12786
12787 static int nl80211_prepare_vendor_dump(struct sk_buff *skb,
12788                                        struct netlink_callback *cb,
12789                                        struct cfg80211_registered_device **rdev,
12790                                        struct wireless_dev **wdev)
12791 {
12792         struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
12793         u32 vid, subcmd;
12794         unsigned int i;
12795         int vcmd_idx = -1;
12796         int err;
12797         void *data = NULL;
12798         unsigned int data_len = 0;
12799
12800         if (cb->args[0]) {
12801                 /* subtract the 1 again here */
12802                 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
12803                 struct wireless_dev *tmp;
12804
12805                 if (!wiphy)
12806                         return -ENODEV;
12807                 *rdev = wiphy_to_rdev(wiphy);
12808                 *wdev = NULL;
12809
12810                 if (cb->args[1]) {
12811                         list_for_each_entry(tmp, &wiphy->wdev_list, list) {
12812                                 if (tmp->identifier == cb->args[1] - 1) {
12813                                         *wdev = tmp;
12814                                         break;
12815                                 }
12816                         }
12817                 }
12818
12819                 /* keep rtnl locked in successful case */
12820                 return 0;
12821         }
12822
12823         err = nlmsg_parse_deprecated(cb->nlh,
12824                                      GENL_HDRLEN + nl80211_fam.hdrsize,
12825                                      attrbuf, nl80211_fam.maxattr,
12826                                      nl80211_policy, NULL);
12827         if (err)
12828                 return err;
12829
12830         if (!attrbuf[NL80211_ATTR_VENDOR_ID] ||
12831             !attrbuf[NL80211_ATTR_VENDOR_SUBCMD])
12832                 return -EINVAL;
12833
12834         *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf);
12835         if (IS_ERR(*wdev))
12836                 *wdev = NULL;
12837
12838         *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
12839         if (IS_ERR(*rdev))
12840                 return PTR_ERR(*rdev);
12841
12842         vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]);
12843         subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
12844
12845         for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) {
12846                 const struct wiphy_vendor_command *vcmd;
12847
12848                 vcmd = &(*rdev)->wiphy.vendor_commands[i];
12849
12850                 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
12851                         continue;
12852
12853                 if (!vcmd->dumpit)
12854                         return -EOPNOTSUPP;
12855
12856                 vcmd_idx = i;
12857                 break;
12858         }
12859
12860         if (vcmd_idx < 0)
12861                 return -EOPNOTSUPP;
12862
12863         if (attrbuf[NL80211_ATTR_VENDOR_DATA]) {
12864                 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]);
12865                 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]);
12866
12867                 err = nl80211_vendor_check_policy(
12868                                 &(*rdev)->wiphy.vendor_commands[vcmd_idx],
12869                                 attrbuf[NL80211_ATTR_VENDOR_DATA],
12870                                 cb->extack);
12871                 if (err)
12872                         return err;
12873         }
12874
12875         /* 0 is the first index - add 1 to parse only once */
12876         cb->args[0] = (*rdev)->wiphy_idx + 1;
12877         /* add 1 to know if it was NULL */
12878         cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0;
12879         cb->args[2] = vcmd_idx;
12880         cb->args[3] = (unsigned long)data;
12881         cb->args[4] = data_len;
12882
12883         /* keep rtnl locked in successful case */
12884         return 0;
12885 }
12886
12887 static int nl80211_vendor_cmd_dump(struct sk_buff *skb,
12888                                    struct netlink_callback *cb)
12889 {
12890         struct cfg80211_registered_device *rdev;
12891         struct wireless_dev *wdev;
12892         unsigned int vcmd_idx;
12893         const struct wiphy_vendor_command *vcmd;
12894         void *data;
12895         int data_len;
12896         int err;
12897         struct nlattr *vendor_data;
12898
12899         rtnl_lock();
12900         err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev);
12901         if (err)
12902                 goto out;
12903
12904         vcmd_idx = cb->args[2];
12905         data = (void *)cb->args[3];
12906         data_len = cb->args[4];
12907         vcmd = &rdev->wiphy.vendor_commands[vcmd_idx];
12908
12909         if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
12910                            WIPHY_VENDOR_CMD_NEED_NETDEV)) {
12911                 if (!wdev) {
12912                         err = -EINVAL;
12913                         goto out;
12914                 }
12915                 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
12916                     !wdev->netdev) {
12917                         err = -EINVAL;
12918                         goto out;
12919                 }
12920
12921                 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
12922                         if (!wdev_running(wdev)) {
12923                                 err = -ENETDOWN;
12924                                 goto out;
12925                         }
12926                 }
12927         }
12928
12929         while (1) {
12930                 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
12931                                            cb->nlh->nlmsg_seq, NLM_F_MULTI,
12932                                            NL80211_CMD_VENDOR);
12933                 if (!hdr)
12934                         break;
12935
12936                 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12937                     (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
12938                                                wdev_id(wdev),
12939                                                NL80211_ATTR_PAD))) {
12940                         genlmsg_cancel(skb, hdr);
12941                         break;
12942                 }
12943
12944                 vendor_data = nla_nest_start_noflag(skb,
12945                                                     NL80211_ATTR_VENDOR_DATA);
12946                 if (!vendor_data) {
12947                         genlmsg_cancel(skb, hdr);
12948                         break;
12949                 }
12950
12951                 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len,
12952                                    (unsigned long *)&cb->args[5]);
12953                 nla_nest_end(skb, vendor_data);
12954
12955                 if (err == -ENOBUFS || err == -ENOENT) {
12956                         genlmsg_cancel(skb, hdr);
12957                         break;
12958                 } else if (err) {
12959                         genlmsg_cancel(skb, hdr);
12960                         goto out;
12961                 }
12962
12963                 genlmsg_end(skb, hdr);
12964         }
12965
12966         err = skb->len;
12967  out:
12968         rtnl_unlock();
12969         return err;
12970 }
12971
12972 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
12973                                            enum nl80211_commands cmd,
12974                                            enum nl80211_attrs attr,
12975                                            int approxlen)
12976 {
12977         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12978
12979         if (WARN_ON(!rdev->cur_cmd_info))
12980                 return NULL;
12981
12982         return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen,
12983                                            rdev->cur_cmd_info->snd_portid,
12984                                            rdev->cur_cmd_info->snd_seq,
12985                                            cmd, attr, NULL, GFP_KERNEL);
12986 }
12987 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb);
12988
12989 int cfg80211_vendor_cmd_reply(struct sk_buff *skb)
12990 {
12991         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
12992         void *hdr = ((void **)skb->cb)[1];
12993         struct nlattr *data = ((void **)skb->cb)[2];
12994
12995         /* clear CB data for netlink core to own from now on */
12996         memset(skb->cb, 0, sizeof(skb->cb));
12997
12998         if (WARN_ON(!rdev->cur_cmd_info)) {
12999                 kfree_skb(skb);
13000                 return -EINVAL;
13001         }
13002
13003         nla_nest_end(skb, data);
13004         genlmsg_end(skb, hdr);
13005         return genlmsg_reply(skb, rdev->cur_cmd_info);
13006 }
13007 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply);
13008
13009 unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy)
13010 {
13011         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
13012
13013         if (WARN_ON(!rdev->cur_cmd_info))
13014                 return 0;
13015
13016         return rdev->cur_cmd_info->snd_portid;
13017 }
13018 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_get_sender);
13019
13020 static int nl80211_set_qos_map(struct sk_buff *skb,
13021                                struct genl_info *info)
13022 {
13023         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13024         struct cfg80211_qos_map *qos_map = NULL;
13025         struct net_device *dev = info->user_ptr[1];
13026         u8 *pos, len, num_des, des_len, des;
13027         int ret;
13028
13029         if (!rdev->ops->set_qos_map)
13030                 return -EOPNOTSUPP;
13031
13032         if (info->attrs[NL80211_ATTR_QOS_MAP]) {
13033                 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]);
13034                 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]);
13035
13036                 if (len % 2 || len < IEEE80211_QOS_MAP_LEN_MIN ||
13037                     len > IEEE80211_QOS_MAP_LEN_MAX)
13038                         return -EINVAL;
13039
13040                 qos_map = kzalloc(sizeof(struct cfg80211_qos_map), GFP_KERNEL);
13041                 if (!qos_map)
13042                         return -ENOMEM;
13043
13044                 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1;
13045                 if (num_des) {
13046                         des_len = num_des *
13047                                 sizeof(struct cfg80211_dscp_exception);
13048                         memcpy(qos_map->dscp_exception, pos, des_len);
13049                         qos_map->num_des = num_des;
13050                         for (des = 0; des < num_des; des++) {
13051                                 if (qos_map->dscp_exception[des].up > 7) {
13052                                         kfree(qos_map);
13053                                         return -EINVAL;
13054                                 }
13055                         }
13056                         pos += des_len;
13057                 }
13058                 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN);
13059         }
13060
13061         wdev_lock(dev->ieee80211_ptr);
13062         ret = nl80211_key_allowed(dev->ieee80211_ptr);
13063         if (!ret)
13064                 ret = rdev_set_qos_map(rdev, dev, qos_map);
13065         wdev_unlock(dev->ieee80211_ptr);
13066
13067         kfree(qos_map);
13068         return ret;
13069 }
13070
13071 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info)
13072 {
13073         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13074         struct net_device *dev = info->user_ptr[1];
13075         struct wireless_dev *wdev = dev->ieee80211_ptr;
13076         const u8 *peer;
13077         u8 tsid, up;
13078         u16 admitted_time = 0;
13079         int err;
13080
13081         if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION))
13082                 return -EOPNOTSUPP;
13083
13084         if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] ||
13085             !info->attrs[NL80211_ATTR_USER_PRIO])
13086                 return -EINVAL;
13087
13088         tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
13089         up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]);
13090
13091         /* WMM uses TIDs 0-7 even for TSPEC */
13092         if (tsid >= IEEE80211_FIRST_TSPEC_TSID) {
13093                 /* TODO: handle 802.11 TSPEC/admission control
13094                  * need more attributes for that (e.g. BA session requirement);
13095                  * change the WMM adminssion test above to allow both then
13096                  */
13097                 return -EINVAL;
13098         }
13099
13100         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
13101
13102         if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) {
13103                 admitted_time =
13104                         nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]);
13105                 if (!admitted_time)
13106                         return -EINVAL;
13107         }
13108
13109         wdev_lock(wdev);
13110         switch (wdev->iftype) {
13111         case NL80211_IFTYPE_STATION:
13112         case NL80211_IFTYPE_P2P_CLIENT:
13113                 if (wdev->current_bss)
13114                         break;
13115                 err = -ENOTCONN;
13116                 goto out;
13117         default:
13118                 err = -EOPNOTSUPP;
13119                 goto out;
13120         }
13121
13122         err = rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time);
13123
13124  out:
13125         wdev_unlock(wdev);
13126         return err;
13127 }
13128
13129 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info)
13130 {
13131         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13132         struct net_device *dev = info->user_ptr[1];
13133         struct wireless_dev *wdev = dev->ieee80211_ptr;
13134         const u8 *peer;
13135         u8 tsid;
13136         int err;
13137
13138         if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC])
13139                 return -EINVAL;
13140
13141         tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
13142         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
13143
13144         wdev_lock(wdev);
13145         err = rdev_del_tx_ts(rdev, dev, tsid, peer);
13146         wdev_unlock(wdev);
13147
13148         return err;
13149 }
13150
13151 static int nl80211_tdls_channel_switch(struct sk_buff *skb,
13152                                        struct genl_info *info)
13153 {
13154         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13155         struct net_device *dev = info->user_ptr[1];
13156         struct wireless_dev *wdev = dev->ieee80211_ptr;
13157         struct cfg80211_chan_def chandef = {};
13158         const u8 *addr;
13159         u8 oper_class;
13160         int err;
13161
13162         if (!rdev->ops->tdls_channel_switch ||
13163             !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
13164                 return -EOPNOTSUPP;
13165
13166         switch (dev->ieee80211_ptr->iftype) {
13167         case NL80211_IFTYPE_STATION:
13168         case NL80211_IFTYPE_P2P_CLIENT:
13169                 break;
13170         default:
13171                 return -EOPNOTSUPP;
13172         }
13173
13174         if (!info->attrs[NL80211_ATTR_MAC] ||
13175             !info->attrs[NL80211_ATTR_OPER_CLASS])
13176                 return -EINVAL;
13177
13178         err = nl80211_parse_chandef(rdev, info, &chandef);
13179         if (err)
13180                 return err;
13181
13182         /*
13183          * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012
13184          * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the
13185          * specification is not defined for them.
13186          */
13187         if (chandef.chan->band == NL80211_BAND_2GHZ &&
13188             chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
13189             chandef.width != NL80211_CHAN_WIDTH_20)
13190                 return -EINVAL;
13191
13192         /* we will be active on the TDLS link */
13193         if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
13194                                            wdev->iftype))
13195                 return -EINVAL;
13196
13197         /* don't allow switching to DFS channels */
13198         if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype))
13199                 return -EINVAL;
13200
13201         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
13202         oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]);
13203
13204         wdev_lock(wdev);
13205         err = rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef);
13206         wdev_unlock(wdev);
13207
13208         return err;
13209 }
13210
13211 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb,
13212                                               struct genl_info *info)
13213 {
13214         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13215         struct net_device *dev = info->user_ptr[1];
13216         struct wireless_dev *wdev = dev->ieee80211_ptr;
13217         const u8 *addr;
13218
13219         if (!rdev->ops->tdls_channel_switch ||
13220             !rdev->ops->tdls_cancel_channel_switch ||
13221             !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
13222                 return -EOPNOTSUPP;
13223
13224         switch (dev->ieee80211_ptr->iftype) {
13225         case NL80211_IFTYPE_STATION:
13226         case NL80211_IFTYPE_P2P_CLIENT:
13227                 break;
13228         default:
13229                 return -EOPNOTSUPP;
13230         }
13231
13232         if (!info->attrs[NL80211_ATTR_MAC])
13233                 return -EINVAL;
13234
13235         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
13236
13237         wdev_lock(wdev);
13238         rdev_tdls_cancel_channel_switch(rdev, dev, addr);
13239         wdev_unlock(wdev);
13240
13241         return 0;
13242 }
13243
13244 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb,
13245                                             struct genl_info *info)
13246 {
13247         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13248         struct net_device *dev = info->user_ptr[1];
13249         struct wireless_dev *wdev = dev->ieee80211_ptr;
13250         const struct nlattr *nla;
13251         bool enabled;
13252
13253         if (!rdev->ops->set_multicast_to_unicast)
13254                 return -EOPNOTSUPP;
13255
13256         if (wdev->iftype != NL80211_IFTYPE_AP &&
13257             wdev->iftype != NL80211_IFTYPE_P2P_GO)
13258                 return -EOPNOTSUPP;
13259
13260         nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED];
13261         enabled = nla_get_flag(nla);
13262
13263         return rdev_set_multicast_to_unicast(rdev, dev, enabled);
13264 }
13265
13266 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info)
13267 {
13268         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13269         struct net_device *dev = info->user_ptr[1];
13270         struct wireless_dev *wdev = dev->ieee80211_ptr;
13271         struct cfg80211_pmk_conf pmk_conf = {};
13272         int ret;
13273
13274         if (wdev->iftype != NL80211_IFTYPE_STATION &&
13275             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
13276                 return -EOPNOTSUPP;
13277
13278         if (!wiphy_ext_feature_isset(&rdev->wiphy,
13279                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
13280                 return -EOPNOTSUPP;
13281
13282         if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK])
13283                 return -EINVAL;
13284
13285         wdev_lock(wdev);
13286         if (!wdev->current_bss) {
13287                 ret = -ENOTCONN;
13288                 goto out;
13289         }
13290
13291         pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
13292         if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) {
13293                 ret = -EINVAL;
13294                 goto out;
13295         }
13296
13297         pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
13298         pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
13299         if (pmk_conf.pmk_len != WLAN_PMK_LEN &&
13300             pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) {
13301                 ret = -EINVAL;
13302                 goto out;
13303         }
13304
13305         if (info->attrs[NL80211_ATTR_PMKR0_NAME]) {
13306                 int r0_name_len = nla_len(info->attrs[NL80211_ATTR_PMKR0_NAME]);
13307
13308                 if (r0_name_len != WLAN_PMK_NAME_LEN) {
13309                         ret = -EINVAL;
13310                         goto out;
13311                 }
13312
13313                 pmk_conf.pmk_r0_name =
13314                         nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]);
13315         }
13316
13317         ret = rdev_set_pmk(rdev, dev, &pmk_conf);
13318 out:
13319         wdev_unlock(wdev);
13320         return ret;
13321 }
13322
13323 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info)
13324 {
13325         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13326         struct net_device *dev = info->user_ptr[1];
13327         struct wireless_dev *wdev = dev->ieee80211_ptr;
13328         const u8 *aa;
13329         int ret;
13330
13331         if (wdev->iftype != NL80211_IFTYPE_STATION &&
13332             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
13333                 return -EOPNOTSUPP;
13334
13335         if (!wiphy_ext_feature_isset(&rdev->wiphy,
13336                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
13337                 return -EOPNOTSUPP;
13338
13339         if (!info->attrs[NL80211_ATTR_MAC])
13340                 return -EINVAL;
13341
13342         wdev_lock(wdev);
13343         aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
13344         ret = rdev_del_pmk(rdev, dev, aa);
13345         wdev_unlock(wdev);
13346
13347         return ret;
13348 }
13349
13350 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info)
13351 {
13352         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13353         struct net_device *dev = info->user_ptr[1];
13354         struct cfg80211_external_auth_params params;
13355
13356         if (!rdev->ops->external_auth)
13357                 return -EOPNOTSUPP;
13358
13359         if (!info->attrs[NL80211_ATTR_SSID] &&
13360             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
13361             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
13362                 return -EINVAL;
13363
13364         if (!info->attrs[NL80211_ATTR_BSSID])
13365                 return -EINVAL;
13366
13367         if (!info->attrs[NL80211_ATTR_STATUS_CODE])
13368                 return -EINVAL;
13369
13370         memset(&params, 0, sizeof(params));
13371
13372         if (info->attrs[NL80211_ATTR_SSID]) {
13373                 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
13374                 if (params.ssid.ssid_len == 0 ||
13375                     params.ssid.ssid_len > IEEE80211_MAX_SSID_LEN)
13376                         return -EINVAL;
13377                 memcpy(params.ssid.ssid,
13378                        nla_data(info->attrs[NL80211_ATTR_SSID]),
13379                        params.ssid.ssid_len);
13380         }
13381
13382         memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]),
13383                ETH_ALEN);
13384
13385         params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
13386
13387         if (info->attrs[NL80211_ATTR_PMKID])
13388                 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
13389
13390         return rdev_external_auth(rdev, dev, &params);
13391 }
13392
13393 static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info)
13394 {
13395         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13396         struct net_device *dev = info->user_ptr[1];
13397         struct wireless_dev *wdev = dev->ieee80211_ptr;
13398         const u8 *buf;
13399         size_t len;
13400         u8 *dest;
13401         u16 proto;
13402         bool noencrypt;
13403         int err;
13404
13405         if (!wiphy_ext_feature_isset(&rdev->wiphy,
13406                                      NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211))
13407                 return -EOPNOTSUPP;
13408
13409         if (!rdev->ops->tx_control_port)
13410                 return -EOPNOTSUPP;
13411
13412         if (!info->attrs[NL80211_ATTR_FRAME] ||
13413             !info->attrs[NL80211_ATTR_MAC] ||
13414             !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
13415                 GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing");
13416                 return -EINVAL;
13417         }
13418
13419         wdev_lock(wdev);
13420
13421         switch (wdev->iftype) {
13422         case NL80211_IFTYPE_AP:
13423         case NL80211_IFTYPE_P2P_GO:
13424         case NL80211_IFTYPE_MESH_POINT:
13425                 break;
13426         case NL80211_IFTYPE_ADHOC:
13427         case NL80211_IFTYPE_STATION:
13428         case NL80211_IFTYPE_P2P_CLIENT:
13429                 if (wdev->current_bss)
13430                         break;
13431                 err = -ENOTCONN;
13432                 goto out;
13433         default:
13434                 err = -EOPNOTSUPP;
13435                 goto out;
13436         }
13437
13438         wdev_unlock(wdev);
13439
13440         buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
13441         len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
13442         dest = nla_data(info->attrs[NL80211_ATTR_MAC]);
13443         proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
13444         noencrypt =
13445                 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]);
13446
13447         return rdev_tx_control_port(rdev, dev, buf, len,
13448                                     dest, cpu_to_be16(proto), noencrypt);
13449
13450  out:
13451         wdev_unlock(wdev);
13452         return err;
13453 }
13454
13455 static int nl80211_get_ftm_responder_stats(struct sk_buff *skb,
13456                                            struct genl_info *info)
13457 {
13458         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13459         struct net_device *dev = info->user_ptr[1];
13460         struct wireless_dev *wdev = dev->ieee80211_ptr;
13461         struct cfg80211_ftm_responder_stats ftm_stats = {};
13462         struct sk_buff *msg;
13463         void *hdr;
13464         struct nlattr *ftm_stats_attr;
13465         int err;
13466
13467         if (wdev->iftype != NL80211_IFTYPE_AP || !wdev->beacon_interval)
13468                 return -EOPNOTSUPP;
13469
13470         err = rdev_get_ftm_responder_stats(rdev, dev, &ftm_stats);
13471         if (err)
13472                 return err;
13473
13474         if (!ftm_stats.filled)
13475                 return -ENODATA;
13476
13477         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13478         if (!msg)
13479                 return -ENOMEM;
13480
13481         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
13482                              NL80211_CMD_GET_FTM_RESPONDER_STATS);
13483         if (!hdr)
13484                 return -ENOBUFS;
13485
13486         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
13487                 goto nla_put_failure;
13488
13489         ftm_stats_attr = nla_nest_start_noflag(msg,
13490                                                NL80211_ATTR_FTM_RESPONDER_STATS);
13491         if (!ftm_stats_attr)
13492                 goto nla_put_failure;
13493
13494 #define SET_FTM(field, name, type)                                       \
13495         do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \
13496             nla_put_ ## type(msg, NL80211_FTM_STATS_ ## name,            \
13497                              ftm_stats.field))                           \
13498                 goto nla_put_failure; } while (0)
13499 #define SET_FTM_U64(field, name)                                         \
13500         do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \
13501             nla_put_u64_64bit(msg, NL80211_FTM_STATS_ ## name,           \
13502                               ftm_stats.field, NL80211_FTM_STATS_PAD))   \
13503                 goto nla_put_failure; } while (0)
13504
13505         SET_FTM(success_num, SUCCESS_NUM, u32);
13506         SET_FTM(partial_num, PARTIAL_NUM, u32);
13507         SET_FTM(failed_num, FAILED_NUM, u32);
13508         SET_FTM(asap_num, ASAP_NUM, u32);
13509         SET_FTM(non_asap_num, NON_ASAP_NUM, u32);
13510         SET_FTM_U64(total_duration_ms, TOTAL_DURATION_MSEC);
13511         SET_FTM(unknown_triggers_num, UNKNOWN_TRIGGERS_NUM, u32);
13512         SET_FTM(reschedule_requests_num, RESCHEDULE_REQUESTS_NUM, u32);
13513         SET_FTM(out_of_window_triggers_num, OUT_OF_WINDOW_TRIGGERS_NUM, u32);
13514 #undef SET_FTM
13515
13516         nla_nest_end(msg, ftm_stats_attr);
13517
13518         genlmsg_end(msg, hdr);
13519         return genlmsg_reply(msg, info);
13520
13521 nla_put_failure:
13522         nlmsg_free(msg);
13523         return -ENOBUFS;
13524 }
13525
13526 static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info)
13527 {
13528         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13529         struct cfg80211_update_owe_info owe_info;
13530         struct net_device *dev = info->user_ptr[1];
13531
13532         if (!rdev->ops->update_owe_info)
13533                 return -EOPNOTSUPP;
13534
13535         if (!info->attrs[NL80211_ATTR_STATUS_CODE] ||
13536             !info->attrs[NL80211_ATTR_MAC])
13537                 return -EINVAL;
13538
13539         memset(&owe_info, 0, sizeof(owe_info));
13540         owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
13541         nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN);
13542
13543         if (info->attrs[NL80211_ATTR_IE]) {
13544                 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
13545                 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
13546         }
13547
13548         return rdev_update_owe_info(rdev, dev, &owe_info);
13549 }
13550
13551 static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info)
13552 {
13553         struct cfg80211_registered_device *rdev = info->user_ptr[0];
13554         struct net_device *dev = info->user_ptr[1];
13555         struct wireless_dev *wdev = dev->ieee80211_ptr;
13556         struct station_info sinfo = {};
13557         const u8 *buf;
13558         size_t len;
13559         u8 *dest;
13560         int err;
13561
13562         if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station)
13563                 return -EOPNOTSUPP;
13564
13565         if (!info->attrs[NL80211_ATTR_MAC] ||
13566             !info->attrs[NL80211_ATTR_FRAME]) {
13567                 GENL_SET_ERR_MSG(info, "Frame or MAC missing");
13568                 return -EINVAL;
13569         }
13570
13571         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
13572                 return -EOPNOTSUPP;
13573
13574         dest = nla_data(info->attrs[NL80211_ATTR_MAC]);
13575         buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
13576         len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
13577
13578         if (len < sizeof(struct ethhdr))
13579                 return -EINVAL;
13580
13581         if (!ether_addr_equal(buf, dest) || is_multicast_ether_addr(buf) ||
13582             !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr))
13583                 return -EINVAL;
13584
13585         err = rdev_get_station(rdev, dev, dest, &sinfo);
13586         if (err)
13587                 return err;
13588
13589         return rdev_probe_mesh_link(rdev, dev, dest, buf, len);
13590 }
13591
13592 #define NL80211_FLAG_NEED_WIPHY         0x01
13593 #define NL80211_FLAG_NEED_NETDEV        0x02
13594 #define NL80211_FLAG_NEED_RTNL          0x04
13595 #define NL80211_FLAG_CHECK_NETDEV_UP    0x08
13596 #define NL80211_FLAG_NEED_NETDEV_UP     (NL80211_FLAG_NEED_NETDEV |\
13597                                          NL80211_FLAG_CHECK_NETDEV_UP)
13598 #define NL80211_FLAG_NEED_WDEV          0x10
13599 /* If a netdev is associated, it must be UP, P2P must be started */
13600 #define NL80211_FLAG_NEED_WDEV_UP       (NL80211_FLAG_NEED_WDEV |\
13601                                          NL80211_FLAG_CHECK_NETDEV_UP)
13602 #define NL80211_FLAG_CLEAR_SKB          0x20
13603
13604 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
13605                             struct genl_info *info)
13606 {
13607         struct cfg80211_registered_device *rdev;
13608         struct wireless_dev *wdev;
13609         struct net_device *dev;
13610         bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL;
13611
13612         if (rtnl)
13613                 rtnl_lock();
13614
13615         if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) {
13616                 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
13617                 if (IS_ERR(rdev)) {
13618                         if (rtnl)
13619                                 rtnl_unlock();
13620                         return PTR_ERR(rdev);
13621                 }
13622                 info->user_ptr[0] = rdev;
13623         } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV ||
13624                    ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
13625                 ASSERT_RTNL();
13626
13627                 wdev = __cfg80211_wdev_from_attrs(genl_info_net(info),
13628                                                   info->attrs);
13629                 if (IS_ERR(wdev)) {
13630                         if (rtnl)
13631                                 rtnl_unlock();
13632                         return PTR_ERR(wdev);
13633                 }
13634
13635                 dev = wdev->netdev;
13636                 rdev = wiphy_to_rdev(wdev->wiphy);
13637
13638                 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) {
13639                         if (!dev) {
13640                                 if (rtnl)
13641                                         rtnl_unlock();
13642                                 return -EINVAL;
13643                         }
13644
13645                         info->user_ptr[1] = dev;
13646                 } else {
13647                         info->user_ptr[1] = wdev;
13648                 }
13649
13650                 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
13651                     !wdev_running(wdev)) {
13652                         if (rtnl)
13653                                 rtnl_unlock();
13654                         return -ENETDOWN;
13655                 }
13656
13657                 if (dev)
13658                         dev_hold(dev);
13659
13660                 info->user_ptr[0] = rdev;
13661         }
13662
13663         return 0;
13664 }
13665
13666 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
13667                               struct genl_info *info)
13668 {
13669         if (info->user_ptr[1]) {
13670                 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
13671                         struct wireless_dev *wdev = info->user_ptr[1];
13672
13673                         if (wdev->netdev)
13674                                 dev_put(wdev->netdev);
13675                 } else {
13676                         dev_put(info->user_ptr[1]);
13677                 }
13678         }
13679
13680         if (ops->internal_flags & NL80211_FLAG_NEED_RTNL)
13681                 rtnl_unlock();
13682
13683         /* If needed, clear the netlink message payload from the SKB
13684          * as it might contain key data that shouldn't stick around on
13685          * the heap after the SKB is freed. The netlink message header
13686          * is still needed for further processing, so leave it intact.
13687          */
13688         if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) {
13689                 struct nlmsghdr *nlh = nlmsg_hdr(skb);
13690
13691                 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh));
13692         }
13693 }
13694
13695 static const struct genl_ops nl80211_ops[] = {
13696         {
13697                 .cmd = NL80211_CMD_GET_WIPHY,
13698                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13699                 .doit = nl80211_get_wiphy,
13700                 .dumpit = nl80211_dump_wiphy,
13701                 .done = nl80211_dump_wiphy_done,
13702                 /* can be retrieved by unprivileged users */
13703                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13704                                   NL80211_FLAG_NEED_RTNL,
13705         },
13706         {
13707                 .cmd = NL80211_CMD_SET_WIPHY,
13708                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13709                 .doit = nl80211_set_wiphy,
13710                 .flags = GENL_UNS_ADMIN_PERM,
13711                 .internal_flags = NL80211_FLAG_NEED_RTNL,
13712         },
13713         {
13714                 .cmd = NL80211_CMD_GET_INTERFACE,
13715                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13716                 .doit = nl80211_get_interface,
13717                 .dumpit = nl80211_dump_interface,
13718                 /* can be retrieved by unprivileged users */
13719                 .internal_flags = NL80211_FLAG_NEED_WDEV |
13720                                   NL80211_FLAG_NEED_RTNL,
13721         },
13722         {
13723                 .cmd = NL80211_CMD_SET_INTERFACE,
13724                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13725                 .doit = nl80211_set_interface,
13726                 .flags = GENL_UNS_ADMIN_PERM,
13727                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13728                                   NL80211_FLAG_NEED_RTNL,
13729         },
13730         {
13731                 .cmd = NL80211_CMD_NEW_INTERFACE,
13732                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13733                 .doit = nl80211_new_interface,
13734                 .flags = GENL_UNS_ADMIN_PERM,
13735                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13736                                   NL80211_FLAG_NEED_RTNL,
13737         },
13738         {
13739                 .cmd = NL80211_CMD_DEL_INTERFACE,
13740                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13741                 .doit = nl80211_del_interface,
13742                 .flags = GENL_UNS_ADMIN_PERM,
13743                 .internal_flags = NL80211_FLAG_NEED_WDEV |
13744                                   NL80211_FLAG_NEED_RTNL,
13745         },
13746         {
13747                 .cmd = NL80211_CMD_GET_KEY,
13748                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13749                 .doit = nl80211_get_key,
13750                 .flags = GENL_UNS_ADMIN_PERM,
13751                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13752                                   NL80211_FLAG_NEED_RTNL,
13753         },
13754         {
13755                 .cmd = NL80211_CMD_SET_KEY,
13756                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13757                 .doit = nl80211_set_key,
13758                 .flags = GENL_UNS_ADMIN_PERM,
13759                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13760                                   NL80211_FLAG_NEED_RTNL |
13761                                   NL80211_FLAG_CLEAR_SKB,
13762         },
13763         {
13764                 .cmd = NL80211_CMD_NEW_KEY,
13765                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13766                 .doit = nl80211_new_key,
13767                 .flags = GENL_UNS_ADMIN_PERM,
13768                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13769                                   NL80211_FLAG_NEED_RTNL |
13770                                   NL80211_FLAG_CLEAR_SKB,
13771         },
13772         {
13773                 .cmd = NL80211_CMD_DEL_KEY,
13774                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13775                 .doit = nl80211_del_key,
13776                 .flags = GENL_UNS_ADMIN_PERM,
13777                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13778                                   NL80211_FLAG_NEED_RTNL,
13779         },
13780         {
13781                 .cmd = NL80211_CMD_SET_BEACON,
13782                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13783                 .flags = GENL_UNS_ADMIN_PERM,
13784                 .doit = nl80211_set_beacon,
13785                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13786                                   NL80211_FLAG_NEED_RTNL,
13787         },
13788         {
13789                 .cmd = NL80211_CMD_START_AP,
13790                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13791                 .flags = GENL_UNS_ADMIN_PERM,
13792                 .doit = nl80211_start_ap,
13793                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13794                                   NL80211_FLAG_NEED_RTNL,
13795         },
13796         {
13797                 .cmd = NL80211_CMD_STOP_AP,
13798                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13799                 .flags = GENL_UNS_ADMIN_PERM,
13800                 .doit = nl80211_stop_ap,
13801                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13802                                   NL80211_FLAG_NEED_RTNL,
13803         },
13804         {
13805                 .cmd = NL80211_CMD_GET_STATION,
13806                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13807                 .doit = nl80211_get_station,
13808                 .dumpit = nl80211_dump_station,
13809                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13810                                   NL80211_FLAG_NEED_RTNL,
13811         },
13812         {
13813                 .cmd = NL80211_CMD_SET_STATION,
13814                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13815                 .doit = nl80211_set_station,
13816                 .flags = GENL_UNS_ADMIN_PERM,
13817                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13818                                   NL80211_FLAG_NEED_RTNL,
13819         },
13820         {
13821                 .cmd = NL80211_CMD_NEW_STATION,
13822                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13823                 .doit = nl80211_new_station,
13824                 .flags = GENL_UNS_ADMIN_PERM,
13825                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13826                                   NL80211_FLAG_NEED_RTNL,
13827         },
13828         {
13829                 .cmd = NL80211_CMD_DEL_STATION,
13830                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13831                 .doit = nl80211_del_station,
13832                 .flags = GENL_UNS_ADMIN_PERM,
13833                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13834                                   NL80211_FLAG_NEED_RTNL,
13835         },
13836         {
13837                 .cmd = NL80211_CMD_GET_MPATH,
13838                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13839                 .doit = nl80211_get_mpath,
13840                 .dumpit = nl80211_dump_mpath,
13841                 .flags = GENL_UNS_ADMIN_PERM,
13842                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13843                                   NL80211_FLAG_NEED_RTNL,
13844         },
13845         {
13846                 .cmd = NL80211_CMD_GET_MPP,
13847                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13848                 .doit = nl80211_get_mpp,
13849                 .dumpit = nl80211_dump_mpp,
13850                 .flags = GENL_UNS_ADMIN_PERM,
13851                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13852                                   NL80211_FLAG_NEED_RTNL,
13853         },
13854         {
13855                 .cmd = NL80211_CMD_SET_MPATH,
13856                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13857                 .doit = nl80211_set_mpath,
13858                 .flags = GENL_UNS_ADMIN_PERM,
13859                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13860                                   NL80211_FLAG_NEED_RTNL,
13861         },
13862         {
13863                 .cmd = NL80211_CMD_NEW_MPATH,
13864                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13865                 .doit = nl80211_new_mpath,
13866                 .flags = GENL_UNS_ADMIN_PERM,
13867                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13868                                   NL80211_FLAG_NEED_RTNL,
13869         },
13870         {
13871                 .cmd = NL80211_CMD_DEL_MPATH,
13872                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13873                 .doit = nl80211_del_mpath,
13874                 .flags = GENL_UNS_ADMIN_PERM,
13875                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13876                                   NL80211_FLAG_NEED_RTNL,
13877         },
13878         {
13879                 .cmd = NL80211_CMD_SET_BSS,
13880                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13881                 .doit = nl80211_set_bss,
13882                 .flags = GENL_UNS_ADMIN_PERM,
13883                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13884                                   NL80211_FLAG_NEED_RTNL,
13885         },
13886         {
13887                 .cmd = NL80211_CMD_GET_REG,
13888                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13889                 .doit = nl80211_get_reg_do,
13890                 .dumpit = nl80211_get_reg_dump,
13891                 .internal_flags = NL80211_FLAG_NEED_RTNL,
13892                 /* can be retrieved by unprivileged users */
13893         },
13894 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
13895         {
13896                 .cmd = NL80211_CMD_SET_REG,
13897                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13898                 .doit = nl80211_set_reg,
13899                 .flags = GENL_ADMIN_PERM,
13900                 .internal_flags = NL80211_FLAG_NEED_RTNL,
13901         },
13902 #endif
13903         {
13904                 .cmd = NL80211_CMD_REQ_SET_REG,
13905                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13906                 .doit = nl80211_req_set_reg,
13907                 .flags = GENL_ADMIN_PERM,
13908         },
13909         {
13910                 .cmd = NL80211_CMD_RELOAD_REGDB,
13911                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13912                 .doit = nl80211_reload_regdb,
13913                 .flags = GENL_ADMIN_PERM,
13914         },
13915         {
13916                 .cmd = NL80211_CMD_GET_MESH_CONFIG,
13917                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13918                 .doit = nl80211_get_mesh_config,
13919                 /* can be retrieved by unprivileged users */
13920                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13921                                   NL80211_FLAG_NEED_RTNL,
13922         },
13923         {
13924                 .cmd = NL80211_CMD_SET_MESH_CONFIG,
13925                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13926                 .doit = nl80211_update_mesh_config,
13927                 .flags = GENL_UNS_ADMIN_PERM,
13928                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13929                                   NL80211_FLAG_NEED_RTNL,
13930         },
13931         {
13932                 .cmd = NL80211_CMD_TRIGGER_SCAN,
13933                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13934                 .doit = nl80211_trigger_scan,
13935                 .flags = GENL_UNS_ADMIN_PERM,
13936                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13937                                   NL80211_FLAG_NEED_RTNL,
13938         },
13939         {
13940                 .cmd = NL80211_CMD_ABORT_SCAN,
13941                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13942                 .doit = nl80211_abort_scan,
13943                 .flags = GENL_UNS_ADMIN_PERM,
13944                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13945                                   NL80211_FLAG_NEED_RTNL,
13946         },
13947         {
13948                 .cmd = NL80211_CMD_GET_SCAN,
13949                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13950                 .dumpit = nl80211_dump_scan,
13951         },
13952         {
13953                 .cmd = NL80211_CMD_START_SCHED_SCAN,
13954                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13955                 .doit = nl80211_start_sched_scan,
13956                 .flags = GENL_UNS_ADMIN_PERM,
13957                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13958                                   NL80211_FLAG_NEED_RTNL,
13959         },
13960         {
13961                 .cmd = NL80211_CMD_STOP_SCHED_SCAN,
13962                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13963                 .doit = nl80211_stop_sched_scan,
13964                 .flags = GENL_UNS_ADMIN_PERM,
13965                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13966                                   NL80211_FLAG_NEED_RTNL,
13967         },
13968         {
13969                 .cmd = NL80211_CMD_AUTHENTICATE,
13970                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13971                 .doit = nl80211_authenticate,
13972                 .flags = GENL_UNS_ADMIN_PERM,
13973                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13974                                   NL80211_FLAG_NEED_RTNL |
13975                                   NL80211_FLAG_CLEAR_SKB,
13976         },
13977         {
13978                 .cmd = NL80211_CMD_ASSOCIATE,
13979                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13980                 .doit = nl80211_associate,
13981                 .flags = GENL_UNS_ADMIN_PERM,
13982                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13983                                   NL80211_FLAG_NEED_RTNL |
13984                                   NL80211_FLAG_CLEAR_SKB,
13985         },
13986         {
13987                 .cmd = NL80211_CMD_DEAUTHENTICATE,
13988                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13989                 .doit = nl80211_deauthenticate,
13990                 .flags = GENL_UNS_ADMIN_PERM,
13991                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13992                                   NL80211_FLAG_NEED_RTNL,
13993         },
13994         {
13995                 .cmd = NL80211_CMD_DISASSOCIATE,
13996                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13997                 .doit = nl80211_disassociate,
13998                 .flags = GENL_UNS_ADMIN_PERM,
13999                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14000                                   NL80211_FLAG_NEED_RTNL,
14001         },
14002         {
14003                 .cmd = NL80211_CMD_JOIN_IBSS,
14004                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14005                 .doit = nl80211_join_ibss,
14006                 .flags = GENL_UNS_ADMIN_PERM,
14007                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14008                                   NL80211_FLAG_NEED_RTNL,
14009         },
14010         {
14011                 .cmd = NL80211_CMD_LEAVE_IBSS,
14012                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14013                 .doit = nl80211_leave_ibss,
14014                 .flags = GENL_UNS_ADMIN_PERM,
14015                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14016                                   NL80211_FLAG_NEED_RTNL,
14017         },
14018 #ifdef CONFIG_NL80211_TESTMODE
14019         {
14020                 .cmd = NL80211_CMD_TESTMODE,
14021                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14022                 .doit = nl80211_testmode_do,
14023                 .dumpit = nl80211_testmode_dump,
14024                 .flags = GENL_UNS_ADMIN_PERM,
14025                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
14026                                   NL80211_FLAG_NEED_RTNL,
14027         },
14028 #endif
14029         {
14030                 .cmd = NL80211_CMD_CONNECT,
14031                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14032                 .doit = nl80211_connect,
14033                 .flags = GENL_UNS_ADMIN_PERM,
14034                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14035                                   NL80211_FLAG_NEED_RTNL |
14036                                   NL80211_FLAG_CLEAR_SKB,
14037         },
14038         {
14039                 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS,
14040                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14041                 .doit = nl80211_update_connect_params,
14042                 .flags = GENL_ADMIN_PERM,
14043                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14044                                   NL80211_FLAG_NEED_RTNL |
14045                                   NL80211_FLAG_CLEAR_SKB,
14046         },
14047         {
14048                 .cmd = NL80211_CMD_DISCONNECT,
14049                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14050                 .doit = nl80211_disconnect,
14051                 .flags = GENL_UNS_ADMIN_PERM,
14052                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14053                                   NL80211_FLAG_NEED_RTNL,
14054         },
14055         {
14056                 .cmd = NL80211_CMD_SET_WIPHY_NETNS,
14057                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14058                 .doit = nl80211_wiphy_netns,
14059                 .flags = GENL_UNS_ADMIN_PERM,
14060                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
14061                                   NL80211_FLAG_NEED_RTNL,
14062         },
14063         {
14064                 .cmd = NL80211_CMD_GET_SURVEY,
14065                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14066                 .dumpit = nl80211_dump_survey,
14067         },
14068         {
14069                 .cmd = NL80211_CMD_SET_PMKSA,
14070                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14071                 .doit = nl80211_setdel_pmksa,
14072                 .flags = GENL_UNS_ADMIN_PERM,
14073                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14074                                   NL80211_FLAG_NEED_RTNL |
14075                                   NL80211_FLAG_CLEAR_SKB,
14076         },
14077         {
14078                 .cmd = NL80211_CMD_DEL_PMKSA,
14079                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14080                 .doit = nl80211_setdel_pmksa,
14081                 .flags = GENL_UNS_ADMIN_PERM,
14082                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14083                                   NL80211_FLAG_NEED_RTNL,
14084         },
14085         {
14086                 .cmd = NL80211_CMD_FLUSH_PMKSA,
14087                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14088                 .doit = nl80211_flush_pmksa,
14089                 .flags = GENL_UNS_ADMIN_PERM,
14090                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14091                                   NL80211_FLAG_NEED_RTNL,
14092         },
14093         {
14094                 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
14095                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14096                 .doit = nl80211_remain_on_channel,
14097                 .flags = GENL_UNS_ADMIN_PERM,
14098                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
14099                                   NL80211_FLAG_NEED_RTNL,
14100         },
14101         {
14102                 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
14103                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14104                 .doit = nl80211_cancel_remain_on_channel,
14105                 .flags = GENL_UNS_ADMIN_PERM,
14106                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
14107                                   NL80211_FLAG_NEED_RTNL,
14108         },
14109         {
14110                 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
14111                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14112                 .doit = nl80211_set_tx_bitrate_mask,
14113                 .flags = GENL_UNS_ADMIN_PERM,
14114                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
14115                                   NL80211_FLAG_NEED_RTNL,
14116         },
14117         {
14118                 .cmd = NL80211_CMD_REGISTER_FRAME,
14119                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14120                 .doit = nl80211_register_mgmt,
14121                 .flags = GENL_UNS_ADMIN_PERM,
14122                 .internal_flags = NL80211_FLAG_NEED_WDEV |
14123                                   NL80211_FLAG_NEED_RTNL,
14124         },
14125         {
14126                 .cmd = NL80211_CMD_FRAME,
14127                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14128                 .doit = nl80211_tx_mgmt,
14129                 .flags = GENL_UNS_ADMIN_PERM,
14130                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
14131                                   NL80211_FLAG_NEED_RTNL,
14132         },
14133         {
14134                 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
14135                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14136                 .doit = nl80211_tx_mgmt_cancel_wait,
14137                 .flags = GENL_UNS_ADMIN_PERM,
14138                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
14139                                   NL80211_FLAG_NEED_RTNL,
14140         },
14141         {
14142                 .cmd = NL80211_CMD_SET_POWER_SAVE,
14143                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14144                 .doit = nl80211_set_power_save,
14145                 .flags = GENL_UNS_ADMIN_PERM,
14146                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
14147                                   NL80211_FLAG_NEED_RTNL,
14148         },
14149         {
14150                 .cmd = NL80211_CMD_GET_POWER_SAVE,
14151                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14152                 .doit = nl80211_get_power_save,
14153                 /* can be retrieved by unprivileged users */
14154                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
14155                                   NL80211_FLAG_NEED_RTNL,
14156         },
14157         {
14158                 .cmd = NL80211_CMD_SET_CQM,
14159                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14160                 .doit = nl80211_set_cqm,
14161                 .flags = GENL_UNS_ADMIN_PERM,
14162                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
14163                                   NL80211_FLAG_NEED_RTNL,
14164         },
14165         {
14166                 .cmd = NL80211_CMD_SET_CHANNEL,
14167                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14168                 .doit = nl80211_set_channel,
14169                 .flags = GENL_UNS_ADMIN_PERM,
14170                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
14171                                   NL80211_FLAG_NEED_RTNL,
14172         },
14173         {
14174                 .cmd = NL80211_CMD_SET_WDS_PEER,
14175                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14176                 .doit = nl80211_set_wds_peer,
14177                 .flags = GENL_UNS_ADMIN_PERM,
14178                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
14179                                   NL80211_FLAG_NEED_RTNL,
14180         },
14181         {
14182                 .cmd = NL80211_CMD_JOIN_MESH,
14183                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14184                 .doit = nl80211_join_mesh,
14185                 .flags = GENL_UNS_ADMIN_PERM,
14186                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14187                                   NL80211_FLAG_NEED_RTNL,
14188         },
14189         {
14190                 .cmd = NL80211_CMD_LEAVE_MESH,
14191                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14192                 .doit = nl80211_leave_mesh,
14193                 .flags = GENL_UNS_ADMIN_PERM,
14194                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14195                                   NL80211_FLAG_NEED_RTNL,
14196         },
14197         {
14198                 .cmd = NL80211_CMD_JOIN_OCB,
14199                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14200                 .doit = nl80211_join_ocb,
14201                 .flags = GENL_UNS_ADMIN_PERM,
14202                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14203                                   NL80211_FLAG_NEED_RTNL,
14204         },
14205         {
14206                 .cmd = NL80211_CMD_LEAVE_OCB,
14207                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14208                 .doit = nl80211_leave_ocb,
14209                 .flags = GENL_UNS_ADMIN_PERM,
14210                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14211                                   NL80211_FLAG_NEED_RTNL,
14212         },
14213 #ifdef CONFIG_PM
14214         {
14215                 .cmd = NL80211_CMD_GET_WOWLAN,
14216                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14217                 .doit = nl80211_get_wowlan,
14218                 /* can be retrieved by unprivileged users */
14219                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
14220                                   NL80211_FLAG_NEED_RTNL,
14221         },
14222         {
14223                 .cmd = NL80211_CMD_SET_WOWLAN,
14224                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14225                 .doit = nl80211_set_wowlan,
14226                 .flags = GENL_UNS_ADMIN_PERM,
14227                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
14228                                   NL80211_FLAG_NEED_RTNL,
14229         },
14230 #endif
14231         {
14232                 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
14233                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14234                 .doit = nl80211_set_rekey_data,
14235                 .flags = GENL_UNS_ADMIN_PERM,
14236                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14237                                   NL80211_FLAG_NEED_RTNL |
14238                                   NL80211_FLAG_CLEAR_SKB,
14239         },
14240         {
14241                 .cmd = NL80211_CMD_TDLS_MGMT,
14242                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14243                 .doit = nl80211_tdls_mgmt,
14244                 .flags = GENL_UNS_ADMIN_PERM,
14245                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14246                                   NL80211_FLAG_NEED_RTNL,
14247         },
14248         {
14249                 .cmd = NL80211_CMD_TDLS_OPER,
14250                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14251                 .doit = nl80211_tdls_oper,
14252                 .flags = GENL_UNS_ADMIN_PERM,
14253                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14254                                   NL80211_FLAG_NEED_RTNL,
14255         },
14256         {
14257                 .cmd = NL80211_CMD_UNEXPECTED_FRAME,
14258                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14259                 .doit = nl80211_register_unexpected_frame,
14260                 .flags = GENL_UNS_ADMIN_PERM,
14261                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
14262                                   NL80211_FLAG_NEED_RTNL,
14263         },
14264         {
14265                 .cmd = NL80211_CMD_PROBE_CLIENT,
14266                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14267                 .doit = nl80211_probe_client,
14268                 .flags = GENL_UNS_ADMIN_PERM,
14269                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14270                                   NL80211_FLAG_NEED_RTNL,
14271         },
14272         {
14273                 .cmd = NL80211_CMD_REGISTER_BEACONS,
14274                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14275                 .doit = nl80211_register_beacons,
14276                 .flags = GENL_UNS_ADMIN_PERM,
14277                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
14278                                   NL80211_FLAG_NEED_RTNL,
14279         },
14280         {
14281                 .cmd = NL80211_CMD_SET_NOACK_MAP,
14282                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14283                 .doit = nl80211_set_noack_map,
14284                 .flags = GENL_UNS_ADMIN_PERM,
14285                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
14286                                   NL80211_FLAG_NEED_RTNL,
14287         },
14288         {
14289                 .cmd = NL80211_CMD_START_P2P_DEVICE,
14290                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14291                 .doit = nl80211_start_p2p_device,
14292                 .flags = GENL_UNS_ADMIN_PERM,
14293                 .internal_flags = NL80211_FLAG_NEED_WDEV |
14294                                   NL80211_FLAG_NEED_RTNL,
14295         },
14296         {
14297                 .cmd = NL80211_CMD_STOP_P2P_DEVICE,
14298                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14299                 .doit = nl80211_stop_p2p_device,
14300                 .flags = GENL_UNS_ADMIN_PERM,
14301                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
14302                                   NL80211_FLAG_NEED_RTNL,
14303         },
14304         {
14305                 .cmd = NL80211_CMD_START_NAN,
14306                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14307                 .doit = nl80211_start_nan,
14308                 .flags = GENL_ADMIN_PERM,
14309                 .internal_flags = NL80211_FLAG_NEED_WDEV |
14310                                   NL80211_FLAG_NEED_RTNL,
14311         },
14312         {
14313                 .cmd = NL80211_CMD_STOP_NAN,
14314                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14315                 .doit = nl80211_stop_nan,
14316                 .flags = GENL_ADMIN_PERM,
14317                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
14318                                   NL80211_FLAG_NEED_RTNL,
14319         },
14320         {
14321                 .cmd = NL80211_CMD_ADD_NAN_FUNCTION,
14322                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14323                 .doit = nl80211_nan_add_func,
14324                 .flags = GENL_ADMIN_PERM,
14325                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
14326                                   NL80211_FLAG_NEED_RTNL,
14327         },
14328         {
14329                 .cmd = NL80211_CMD_DEL_NAN_FUNCTION,
14330                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14331                 .doit = nl80211_nan_del_func,
14332                 .flags = GENL_ADMIN_PERM,
14333                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
14334                                   NL80211_FLAG_NEED_RTNL,
14335         },
14336         {
14337                 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG,
14338                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14339                 .doit = nl80211_nan_change_config,
14340                 .flags = GENL_ADMIN_PERM,
14341                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
14342                                   NL80211_FLAG_NEED_RTNL,
14343         },
14344         {
14345                 .cmd = NL80211_CMD_SET_MCAST_RATE,
14346                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14347                 .doit = nl80211_set_mcast_rate,
14348                 .flags = GENL_UNS_ADMIN_PERM,
14349                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
14350                                   NL80211_FLAG_NEED_RTNL,
14351         },
14352         {
14353                 .cmd = NL80211_CMD_SET_MAC_ACL,
14354                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14355                 .doit = nl80211_set_mac_acl,
14356                 .flags = GENL_UNS_ADMIN_PERM,
14357                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
14358                                   NL80211_FLAG_NEED_RTNL,
14359         },
14360         {
14361                 .cmd = NL80211_CMD_RADAR_DETECT,
14362                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14363                 .doit = nl80211_start_radar_detection,
14364                 .flags = GENL_UNS_ADMIN_PERM,
14365                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14366                                   NL80211_FLAG_NEED_RTNL,
14367         },
14368         {
14369                 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
14370                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14371                 .doit = nl80211_get_protocol_features,
14372         },
14373         {
14374                 .cmd = NL80211_CMD_UPDATE_FT_IES,
14375                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14376                 .doit = nl80211_update_ft_ies,
14377                 .flags = GENL_UNS_ADMIN_PERM,
14378                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14379                                   NL80211_FLAG_NEED_RTNL,
14380         },
14381         {
14382                 .cmd = NL80211_CMD_CRIT_PROTOCOL_START,
14383                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14384                 .doit = nl80211_crit_protocol_start,
14385                 .flags = GENL_UNS_ADMIN_PERM,
14386                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
14387                                   NL80211_FLAG_NEED_RTNL,
14388         },
14389         {
14390                 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
14391                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14392                 .doit = nl80211_crit_protocol_stop,
14393                 .flags = GENL_UNS_ADMIN_PERM,
14394                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
14395                                   NL80211_FLAG_NEED_RTNL,
14396         },
14397         {
14398                 .cmd = NL80211_CMD_GET_COALESCE,
14399                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14400                 .doit = nl80211_get_coalesce,
14401                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
14402                                   NL80211_FLAG_NEED_RTNL,
14403         },
14404         {
14405                 .cmd = NL80211_CMD_SET_COALESCE,
14406                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14407                 .doit = nl80211_set_coalesce,
14408                 .flags = GENL_UNS_ADMIN_PERM,
14409                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
14410                                   NL80211_FLAG_NEED_RTNL,
14411         },
14412         {
14413                 .cmd = NL80211_CMD_CHANNEL_SWITCH,
14414                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14415                 .doit = nl80211_channel_switch,
14416                 .flags = GENL_UNS_ADMIN_PERM,
14417                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14418                                   NL80211_FLAG_NEED_RTNL,
14419         },
14420         {
14421                 .cmd = NL80211_CMD_VENDOR,
14422                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14423                 .doit = nl80211_vendor_cmd,
14424                 .dumpit = nl80211_vendor_cmd_dump,
14425                 .flags = GENL_UNS_ADMIN_PERM,
14426                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
14427                                   NL80211_FLAG_NEED_RTNL |
14428                                   NL80211_FLAG_CLEAR_SKB,
14429         },
14430         {
14431                 .cmd = NL80211_CMD_SET_QOS_MAP,
14432                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14433                 .doit = nl80211_set_qos_map,
14434                 .flags = GENL_UNS_ADMIN_PERM,
14435                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14436                                   NL80211_FLAG_NEED_RTNL,
14437         },
14438         {
14439                 .cmd = NL80211_CMD_ADD_TX_TS,
14440                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14441                 .doit = nl80211_add_tx_ts,
14442                 .flags = GENL_UNS_ADMIN_PERM,
14443                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14444                                   NL80211_FLAG_NEED_RTNL,
14445         },
14446         {
14447                 .cmd = NL80211_CMD_DEL_TX_TS,
14448                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14449                 .doit = nl80211_del_tx_ts,
14450                 .flags = GENL_UNS_ADMIN_PERM,
14451                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14452                                   NL80211_FLAG_NEED_RTNL,
14453         },
14454         {
14455                 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH,
14456                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14457                 .doit = nl80211_tdls_channel_switch,
14458                 .flags = GENL_UNS_ADMIN_PERM,
14459                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14460                                   NL80211_FLAG_NEED_RTNL,
14461         },
14462         {
14463                 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
14464                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14465                 .doit = nl80211_tdls_cancel_channel_switch,
14466                 .flags = GENL_UNS_ADMIN_PERM,
14467                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14468                                   NL80211_FLAG_NEED_RTNL,
14469         },
14470         {
14471                 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST,
14472                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14473                 .doit = nl80211_set_multicast_to_unicast,
14474                 .flags = GENL_UNS_ADMIN_PERM,
14475                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
14476                                   NL80211_FLAG_NEED_RTNL,
14477         },
14478         {
14479                 .cmd = NL80211_CMD_SET_PMK,
14480                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14481                 .doit = nl80211_set_pmk,
14482                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14483                                   NL80211_FLAG_NEED_RTNL |
14484                                   NL80211_FLAG_CLEAR_SKB,
14485         },
14486         {
14487                 .cmd = NL80211_CMD_DEL_PMK,
14488                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14489                 .doit = nl80211_del_pmk,
14490                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14491                                   NL80211_FLAG_NEED_RTNL,
14492         },
14493         {
14494                 .cmd = NL80211_CMD_EXTERNAL_AUTH,
14495                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14496                 .doit = nl80211_external_auth,
14497                 .flags = GENL_ADMIN_PERM,
14498                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14499                                   NL80211_FLAG_NEED_RTNL,
14500         },
14501         {
14502                 .cmd = NL80211_CMD_CONTROL_PORT_FRAME,
14503                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14504                 .doit = nl80211_tx_control_port,
14505                 .flags = GENL_UNS_ADMIN_PERM,
14506                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14507                                   NL80211_FLAG_NEED_RTNL,
14508         },
14509         {
14510                 .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS,
14511                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14512                 .doit = nl80211_get_ftm_responder_stats,
14513                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
14514                                   NL80211_FLAG_NEED_RTNL,
14515         },
14516         {
14517                 .cmd = NL80211_CMD_PEER_MEASUREMENT_START,
14518                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14519                 .doit = nl80211_pmsr_start,
14520                 .flags = GENL_UNS_ADMIN_PERM,
14521                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
14522                                   NL80211_FLAG_NEED_RTNL,
14523         },
14524         {
14525                 .cmd = NL80211_CMD_NOTIFY_RADAR,
14526                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
14527                 .doit = nl80211_notify_radar_detection,
14528                 .flags = GENL_UNS_ADMIN_PERM,
14529                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14530                                   NL80211_FLAG_NEED_RTNL,
14531         },
14532         {
14533                 .cmd = NL80211_CMD_UPDATE_OWE_INFO,
14534                 .doit = nl80211_update_owe_info,
14535                 .flags = GENL_ADMIN_PERM,
14536                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14537                                   NL80211_FLAG_NEED_RTNL,
14538         },
14539         {
14540                 .cmd = NL80211_CMD_PROBE_MESH_LINK,
14541                 .doit = nl80211_probe_mesh_link,
14542                 .flags = GENL_UNS_ADMIN_PERM,
14543                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14544                                   NL80211_FLAG_NEED_RTNL,
14545         },
14546 };
14547
14548 static struct genl_family nl80211_fam __ro_after_init = {
14549         .name = NL80211_GENL_NAME,      /* have users key off the name instead */
14550         .hdrsize = 0,                   /* no private header */
14551         .version = 1,                   /* no particular meaning now */
14552         .maxattr = NL80211_ATTR_MAX,
14553         .policy = nl80211_policy,
14554         .netnsok = true,
14555         .pre_doit = nl80211_pre_doit,
14556         .post_doit = nl80211_post_doit,
14557         .module = THIS_MODULE,
14558         .ops = nl80211_ops,
14559         .n_ops = ARRAY_SIZE(nl80211_ops),
14560         .mcgrps = nl80211_mcgrps,
14561         .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps),
14562 };
14563
14564 /* notification functions */
14565
14566 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
14567                           enum nl80211_commands cmd)
14568 {
14569         struct sk_buff *msg;
14570         struct nl80211_dump_wiphy_state state = {};
14571
14572         WARN_ON(cmd != NL80211_CMD_NEW_WIPHY &&
14573                 cmd != NL80211_CMD_DEL_WIPHY);
14574
14575         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
14576         if (!msg)
14577                 return;
14578
14579         if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) {
14580                 nlmsg_free(msg);
14581                 return;
14582         }
14583
14584         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14585                                 NL80211_MCGRP_CONFIG, GFP_KERNEL);
14586 }
14587
14588 void nl80211_notify_iface(struct cfg80211_registered_device *rdev,
14589                                 struct wireless_dev *wdev,
14590                                 enum nl80211_commands cmd)
14591 {
14592         struct sk_buff *msg;
14593
14594         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
14595         if (!msg)
14596                 return;
14597
14598         if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, cmd) < 0) {
14599                 nlmsg_free(msg);
14600                 return;
14601         }
14602
14603         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14604                                 NL80211_MCGRP_CONFIG, GFP_KERNEL);
14605 }
14606
14607 static int nl80211_add_scan_req(struct sk_buff *msg,
14608                                 struct cfg80211_registered_device *rdev)
14609 {
14610         struct cfg80211_scan_request *req = rdev->scan_req;
14611         struct nlattr *nest;
14612         int i;
14613
14614         if (WARN_ON(!req))
14615                 return 0;
14616
14617         nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS);
14618         if (!nest)
14619                 goto nla_put_failure;
14620         for (i = 0; i < req->n_ssids; i++) {
14621                 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid))
14622                         goto nla_put_failure;
14623         }
14624         nla_nest_end(msg, nest);
14625
14626         nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES);
14627         if (!nest)
14628                 goto nla_put_failure;
14629         for (i = 0; i < req->n_channels; i++) {
14630                 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
14631                         goto nla_put_failure;
14632         }
14633         nla_nest_end(msg, nest);
14634
14635         if (req->ie &&
14636             nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie))
14637                 goto nla_put_failure;
14638
14639         if (req->flags &&
14640             nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags))
14641                 goto nla_put_failure;
14642
14643         if (req->info.scan_start_tsf &&
14644             (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF,
14645                                req->info.scan_start_tsf, NL80211_BSS_PAD) ||
14646              nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN,
14647                      req->info.tsf_bssid)))
14648                 goto nla_put_failure;
14649
14650         return 0;
14651  nla_put_failure:
14652         return -ENOBUFS;
14653 }
14654
14655 static int nl80211_prep_scan_msg(struct sk_buff *msg,
14656                                  struct cfg80211_registered_device *rdev,
14657                                  struct wireless_dev *wdev,
14658                                  u32 portid, u32 seq, int flags,
14659                                  u32 cmd)
14660 {
14661         void *hdr;
14662
14663         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
14664         if (!hdr)
14665                 return -1;
14666
14667         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14668             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
14669                                          wdev->netdev->ifindex)) ||
14670             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14671                               NL80211_ATTR_PAD))
14672                 goto nla_put_failure;
14673
14674         /* ignore errors and send incomplete event anyway */
14675         nl80211_add_scan_req(msg, rdev);
14676
14677         genlmsg_end(msg, hdr);
14678         return 0;
14679
14680  nla_put_failure:
14681         genlmsg_cancel(msg, hdr);
14682         return -EMSGSIZE;
14683 }
14684
14685 static int
14686 nl80211_prep_sched_scan_msg(struct sk_buff *msg,
14687                             struct cfg80211_sched_scan_request *req, u32 cmd)
14688 {
14689         void *hdr;
14690
14691         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
14692         if (!hdr)
14693                 return -1;
14694
14695         if (nla_put_u32(msg, NL80211_ATTR_WIPHY,
14696                         wiphy_to_rdev(req->wiphy)->wiphy_idx) ||
14697             nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) ||
14698             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid,
14699                               NL80211_ATTR_PAD))
14700                 goto nla_put_failure;
14701
14702         genlmsg_end(msg, hdr);
14703         return 0;
14704
14705  nla_put_failure:
14706         genlmsg_cancel(msg, hdr);
14707         return -EMSGSIZE;
14708 }
14709
14710 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
14711                              struct wireless_dev *wdev)
14712 {
14713         struct sk_buff *msg;
14714
14715         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
14716         if (!msg)
14717                 return;
14718
14719         if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
14720                                   NL80211_CMD_TRIGGER_SCAN) < 0) {
14721                 nlmsg_free(msg);
14722                 return;
14723         }
14724
14725         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14726                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
14727 }
14728
14729 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
14730                                        struct wireless_dev *wdev, bool aborted)
14731 {
14732         struct sk_buff *msg;
14733
14734         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
14735         if (!msg)
14736                 return NULL;
14737
14738         if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
14739                                   aborted ? NL80211_CMD_SCAN_ABORTED :
14740                                             NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
14741                 nlmsg_free(msg);
14742                 return NULL;
14743         }
14744
14745         return msg;
14746 }
14747
14748 /* send message created by nl80211_build_scan_msg() */
14749 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev,
14750                            struct sk_buff *msg)
14751 {
14752         if (!msg)
14753                 return;
14754
14755         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14756                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
14757 }
14758
14759 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd)
14760 {
14761         struct sk_buff *msg;
14762
14763         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
14764         if (!msg)
14765                 return;
14766
14767         if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) {
14768                 nlmsg_free(msg);
14769                 return;
14770         }
14771
14772         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0,
14773                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
14774 }
14775
14776 static bool nl80211_reg_change_event_fill(struct sk_buff *msg,
14777                                           struct regulatory_request *request)
14778 {
14779         /* Userspace can always count this one always being set */
14780         if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator))
14781                 goto nla_put_failure;
14782
14783         if (request->alpha2[0] == '0' && request->alpha2[1] == '0') {
14784                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
14785                                NL80211_REGDOM_TYPE_WORLD))
14786                         goto nla_put_failure;
14787         } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') {
14788                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
14789                                NL80211_REGDOM_TYPE_CUSTOM_WORLD))
14790                         goto nla_put_failure;
14791         } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
14792                    request->intersect) {
14793                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
14794                                NL80211_REGDOM_TYPE_INTERSECTION))
14795                         goto nla_put_failure;
14796         } else {
14797                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
14798                                NL80211_REGDOM_TYPE_COUNTRY) ||
14799                     nla_put_string(msg, NL80211_ATTR_REG_ALPHA2,
14800                                    request->alpha2))
14801                         goto nla_put_failure;
14802         }
14803
14804         if (request->wiphy_idx != WIPHY_IDX_INVALID) {
14805                 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx);
14806
14807                 if (wiphy &&
14808                     nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx))
14809                         goto nla_put_failure;
14810
14811                 if (wiphy &&
14812                     wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
14813                     nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
14814                         goto nla_put_failure;
14815         }
14816
14817         return true;
14818
14819 nla_put_failure:
14820         return false;
14821 }
14822
14823 /*
14824  * This can happen on global regulatory changes or device specific settings
14825  * based on custom regulatory domains.
14826  */
14827 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id,
14828                                      struct regulatory_request *request)
14829 {
14830         struct sk_buff *msg;
14831         void *hdr;
14832
14833         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
14834         if (!msg)
14835                 return;
14836
14837         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id);
14838         if (!hdr) {
14839                 nlmsg_free(msg);
14840                 return;
14841         }
14842
14843         if (nl80211_reg_change_event_fill(msg, request) == false)
14844                 goto nla_put_failure;
14845
14846         genlmsg_end(msg, hdr);
14847
14848         rcu_read_lock();
14849         genlmsg_multicast_allns(&nl80211_fam, msg, 0,
14850                                 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
14851         rcu_read_unlock();
14852
14853         return;
14854
14855 nla_put_failure:
14856         nlmsg_free(msg);
14857 }
14858
14859 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
14860                                     struct net_device *netdev,
14861                                     const u8 *buf, size_t len,
14862                                     enum nl80211_commands cmd, gfp_t gfp,
14863                                     int uapsd_queues, const u8 *req_ies,
14864                                     size_t req_ies_len)
14865 {
14866         struct sk_buff *msg;
14867         void *hdr;
14868
14869         msg = nlmsg_new(100 + len + req_ies_len, gfp);
14870         if (!msg)
14871                 return;
14872
14873         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
14874         if (!hdr) {
14875                 nlmsg_free(msg);
14876                 return;
14877         }
14878
14879         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14880             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
14881             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
14882             (req_ies &&
14883              nla_put(msg, NL80211_ATTR_REQ_IE, req_ies_len, req_ies)))
14884                 goto nla_put_failure;
14885
14886         if (uapsd_queues >= 0) {
14887                 struct nlattr *nla_wmm =
14888                         nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME);
14889                 if (!nla_wmm)
14890                         goto nla_put_failure;
14891
14892                 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES,
14893                                uapsd_queues))
14894                         goto nla_put_failure;
14895
14896                 nla_nest_end(msg, nla_wmm);
14897         }
14898
14899         genlmsg_end(msg, hdr);
14900
14901         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14902                                 NL80211_MCGRP_MLME, gfp);
14903         return;
14904
14905  nla_put_failure:
14906         nlmsg_free(msg);
14907 }
14908
14909 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
14910                           struct net_device *netdev, const u8 *buf,
14911                           size_t len, gfp_t gfp)
14912 {
14913         nl80211_send_mlme_event(rdev, netdev, buf, len,
14914                                 NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0);
14915 }
14916
14917 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
14918                            struct net_device *netdev, const u8 *buf,
14919                            size_t len, gfp_t gfp, int uapsd_queues,
14920                            const u8 *req_ies, size_t req_ies_len)
14921 {
14922         nl80211_send_mlme_event(rdev, netdev, buf, len,
14923                                 NL80211_CMD_ASSOCIATE, gfp, uapsd_queues,
14924                                 req_ies, req_ies_len);
14925 }
14926
14927 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
14928                          struct net_device *netdev, const u8 *buf,
14929                          size_t len, gfp_t gfp)
14930 {
14931         nl80211_send_mlme_event(rdev, netdev, buf, len,
14932                                 NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0);
14933 }
14934
14935 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
14936                            struct net_device *netdev, const u8 *buf,
14937                            size_t len, gfp_t gfp)
14938 {
14939         nl80211_send_mlme_event(rdev, netdev, buf, len,
14940                                 NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0);
14941 }
14942
14943 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
14944                                   size_t len)
14945 {
14946         struct wireless_dev *wdev = dev->ieee80211_ptr;
14947         struct wiphy *wiphy = wdev->wiphy;
14948         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14949         const struct ieee80211_mgmt *mgmt = (void *)buf;
14950         u32 cmd;
14951
14952         if (WARN_ON(len < 2))
14953                 return;
14954
14955         if (ieee80211_is_deauth(mgmt->frame_control))
14956                 cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE;
14957         else
14958                 cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
14959
14960         trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
14961         nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1,
14962                                 NULL, 0);
14963 }
14964 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
14965
14966 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
14967                                       struct net_device *netdev, int cmd,
14968                                       const u8 *addr, gfp_t gfp)
14969 {
14970         struct sk_buff *msg;
14971         void *hdr;
14972
14973         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14974         if (!msg)
14975                 return;
14976
14977         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
14978         if (!hdr) {
14979                 nlmsg_free(msg);
14980                 return;
14981         }
14982
14983         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14984             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
14985             nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
14986             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
14987                 goto nla_put_failure;
14988
14989         genlmsg_end(msg, hdr);
14990
14991         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14992                                 NL80211_MCGRP_MLME, gfp);
14993         return;
14994
14995  nla_put_failure:
14996         nlmsg_free(msg);
14997 }
14998
14999 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
15000                                struct net_device *netdev, const u8 *addr,
15001                                gfp_t gfp)
15002 {
15003         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
15004                                   addr, gfp);
15005 }
15006
15007 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
15008                                 struct net_device *netdev, const u8 *addr,
15009                                 gfp_t gfp)
15010 {
15011         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
15012                                   addr, gfp);
15013 }
15014
15015 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
15016                                  struct net_device *netdev,
15017                                  struct cfg80211_connect_resp_params *cr,
15018                                  gfp_t gfp)
15019 {
15020         struct sk_buff *msg;
15021         void *hdr;
15022
15023         msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len +
15024                         cr->fils.kek_len + cr->fils.pmk_len +
15025                         (cr->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp);
15026         if (!msg)
15027                 return;
15028
15029         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
15030         if (!hdr) {
15031                 nlmsg_free(msg);
15032                 return;
15033         }
15034
15035         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15036             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
15037             (cr->bssid &&
15038              nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) ||
15039             nla_put_u16(msg, NL80211_ATTR_STATUS_CODE,
15040                         cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE :
15041                         cr->status) ||
15042             (cr->status < 0 &&
15043              (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
15044               nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON,
15045                           cr->timeout_reason))) ||
15046             (cr->req_ie &&
15047              nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) ||
15048             (cr->resp_ie &&
15049              nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len,
15050                      cr->resp_ie)) ||
15051             (cr->fils.update_erp_next_seq_num &&
15052              nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
15053                          cr->fils.erp_next_seq_num)) ||
15054             (cr->status == WLAN_STATUS_SUCCESS &&
15055              ((cr->fils.kek &&
15056                nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len,
15057                        cr->fils.kek)) ||
15058               (cr->fils.pmk &&
15059                nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) ||
15060               (cr->fils.pmkid &&
15061                nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid)))))
15062                 goto nla_put_failure;
15063
15064         genlmsg_end(msg, hdr);
15065
15066         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15067                                 NL80211_MCGRP_MLME, gfp);
15068         return;
15069
15070  nla_put_failure:
15071         nlmsg_free(msg);
15072 }
15073
15074 void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
15075                          struct net_device *netdev,
15076                          struct cfg80211_roam_info *info, gfp_t gfp)
15077 {
15078         struct sk_buff *msg;
15079         void *hdr;
15080         const u8 *bssid = info->bss ? info->bss->bssid : info->bssid;
15081
15082         msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len +
15083                         info->fils.kek_len + info->fils.pmk_len +
15084                         (info->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp);
15085         if (!msg)
15086                 return;
15087
15088         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
15089         if (!hdr) {
15090                 nlmsg_free(msg);
15091                 return;
15092         }
15093
15094         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15095             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
15096             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) ||
15097             (info->req_ie &&
15098              nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len,
15099                      info->req_ie)) ||
15100             (info->resp_ie &&
15101              nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len,
15102                      info->resp_ie)) ||
15103             (info->fils.update_erp_next_seq_num &&
15104              nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
15105                          info->fils.erp_next_seq_num)) ||
15106             (info->fils.kek &&
15107              nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len,
15108                      info->fils.kek)) ||
15109             (info->fils.pmk &&
15110              nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) ||
15111             (info->fils.pmkid &&
15112              nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid)))
15113                 goto nla_put_failure;
15114
15115         genlmsg_end(msg, hdr);
15116
15117         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15118                                 NL80211_MCGRP_MLME, gfp);
15119         return;
15120
15121  nla_put_failure:
15122         nlmsg_free(msg);
15123 }
15124
15125 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
15126                                   struct net_device *netdev, const u8 *bssid)
15127 {
15128         struct sk_buff *msg;
15129         void *hdr;
15130
15131         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
15132         if (!msg)
15133                 return;
15134
15135         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED);
15136         if (!hdr) {
15137                 nlmsg_free(msg);
15138                 return;
15139         }
15140
15141         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15142             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
15143             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
15144                 goto nla_put_failure;
15145
15146         genlmsg_end(msg, hdr);
15147
15148         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15149                                 NL80211_MCGRP_MLME, GFP_KERNEL);
15150         return;
15151
15152  nla_put_failure:
15153         nlmsg_free(msg);
15154 }
15155
15156 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
15157                                struct net_device *netdev, u16 reason,
15158                                const u8 *ie, size_t ie_len, bool from_ap)
15159 {
15160         struct sk_buff *msg;
15161         void *hdr;
15162
15163         msg = nlmsg_new(100 + ie_len, GFP_KERNEL);
15164         if (!msg)
15165                 return;
15166
15167         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
15168         if (!hdr) {
15169                 nlmsg_free(msg);
15170                 return;
15171         }
15172
15173         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15174             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
15175             (reason &&
15176              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) ||
15177             (from_ap &&
15178              nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) ||
15179             (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie)))
15180                 goto nla_put_failure;
15181
15182         genlmsg_end(msg, hdr);
15183
15184         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15185                                 NL80211_MCGRP_MLME, GFP_KERNEL);
15186         return;
15187
15188  nla_put_failure:
15189         nlmsg_free(msg);
15190 }
15191
15192 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
15193                              struct net_device *netdev, const u8 *bssid,
15194                              gfp_t gfp)
15195 {
15196         struct sk_buff *msg;
15197         void *hdr;
15198
15199         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15200         if (!msg)
15201                 return;
15202
15203         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
15204         if (!hdr) {
15205                 nlmsg_free(msg);
15206                 return;
15207         }
15208
15209         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15210             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
15211             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
15212                 goto nla_put_failure;
15213
15214         genlmsg_end(msg, hdr);
15215
15216         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15217                                 NL80211_MCGRP_MLME, gfp);
15218         return;
15219
15220  nla_put_failure:
15221         nlmsg_free(msg);
15222 }
15223
15224 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
15225                                         const u8 *ie, u8 ie_len,
15226                                         int sig_dbm, gfp_t gfp)
15227 {
15228         struct wireless_dev *wdev = dev->ieee80211_ptr;
15229         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
15230         struct sk_buff *msg;
15231         void *hdr;
15232
15233         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
15234                 return;
15235
15236         trace_cfg80211_notify_new_peer_candidate(dev, addr);
15237
15238         msg = nlmsg_new(100 + ie_len, gfp);
15239         if (!msg)
15240                 return;
15241
15242         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
15243         if (!hdr) {
15244                 nlmsg_free(msg);
15245                 return;
15246         }
15247
15248         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15249             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
15250             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
15251             (ie_len && ie &&
15252              nla_put(msg, NL80211_ATTR_IE, ie_len, ie)) ||
15253             (sig_dbm &&
15254              nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)))
15255                 goto nla_put_failure;
15256
15257         genlmsg_end(msg, hdr);
15258
15259         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15260                                 NL80211_MCGRP_MLME, gfp);
15261         return;
15262
15263  nla_put_failure:
15264         nlmsg_free(msg);
15265 }
15266 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
15267
15268 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
15269                                  struct net_device *netdev, const u8 *addr,
15270                                  enum nl80211_key_type key_type, int key_id,
15271                                  const u8 *tsc, gfp_t gfp)
15272 {
15273         struct sk_buff *msg;
15274         void *hdr;
15275
15276         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15277         if (!msg)
15278                 return;
15279
15280         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
15281         if (!hdr) {
15282                 nlmsg_free(msg);
15283                 return;
15284         }
15285
15286         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15287             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
15288             (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) ||
15289             nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) ||
15290             (key_id != -1 &&
15291              nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) ||
15292             (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc)))
15293                 goto nla_put_failure;
15294
15295         genlmsg_end(msg, hdr);
15296
15297         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15298                                 NL80211_MCGRP_MLME, gfp);
15299         return;
15300
15301  nla_put_failure:
15302         nlmsg_free(msg);
15303 }
15304
15305 void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
15306                                     struct ieee80211_channel *channel_before,
15307                                     struct ieee80211_channel *channel_after)
15308 {
15309         struct sk_buff *msg;
15310         void *hdr;
15311         struct nlattr *nl_freq;
15312
15313         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
15314         if (!msg)
15315                 return;
15316
15317         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
15318         if (!hdr) {
15319                 nlmsg_free(msg);
15320                 return;
15321         }
15322
15323         /*
15324          * Since we are applying the beacon hint to a wiphy we know its
15325          * wiphy_idx is valid
15326          */
15327         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
15328                 goto nla_put_failure;
15329
15330         /* Before */
15331         nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_BEFORE);
15332         if (!nl_freq)
15333                 goto nla_put_failure;
15334
15335         if (nl80211_msg_put_channel(msg, wiphy, channel_before, false))
15336                 goto nla_put_failure;
15337         nla_nest_end(msg, nl_freq);
15338
15339         /* After */
15340         nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_AFTER);
15341         if (!nl_freq)
15342                 goto nla_put_failure;
15343
15344         if (nl80211_msg_put_channel(msg, wiphy, channel_after, false))
15345                 goto nla_put_failure;
15346         nla_nest_end(msg, nl_freq);
15347
15348         genlmsg_end(msg, hdr);
15349
15350         rcu_read_lock();
15351         genlmsg_multicast_allns(&nl80211_fam, msg, 0,
15352                                 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
15353         rcu_read_unlock();
15354
15355         return;
15356
15357 nla_put_failure:
15358         nlmsg_free(msg);
15359 }
15360
15361 static void nl80211_send_remain_on_chan_event(
15362         int cmd, struct cfg80211_registered_device *rdev,
15363         struct wireless_dev *wdev, u64 cookie,
15364         struct ieee80211_channel *chan,
15365         unsigned int duration, gfp_t gfp)
15366 {
15367         struct sk_buff *msg;
15368         void *hdr;
15369
15370         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15371         if (!msg)
15372                 return;
15373
15374         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
15375         if (!hdr) {
15376                 nlmsg_free(msg);
15377                 return;
15378         }
15379
15380         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15381             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
15382                                          wdev->netdev->ifindex)) ||
15383             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
15384                               NL80211_ATTR_PAD) ||
15385             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) ||
15386             nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
15387                         NL80211_CHAN_NO_HT) ||
15388             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
15389                               NL80211_ATTR_PAD))
15390                 goto nla_put_failure;
15391
15392         if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL &&
15393             nla_put_u32(msg, NL80211_ATTR_DURATION, duration))
15394                 goto nla_put_failure;
15395
15396         genlmsg_end(msg, hdr);
15397
15398         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15399                                 NL80211_MCGRP_MLME, gfp);
15400         return;
15401
15402  nla_put_failure:
15403         nlmsg_free(msg);
15404 }
15405
15406 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
15407                                struct ieee80211_channel *chan,
15408                                unsigned int duration, gfp_t gfp)
15409 {
15410         struct wiphy *wiphy = wdev->wiphy;
15411         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15412
15413         trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
15414         nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
15415                                           rdev, wdev, cookie, chan,
15416                                           duration, gfp);
15417 }
15418 EXPORT_SYMBOL(cfg80211_ready_on_channel);
15419
15420 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
15421                                         struct ieee80211_channel *chan,
15422                                         gfp_t gfp)
15423 {
15424         struct wiphy *wiphy = wdev->wiphy;
15425         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15426
15427         trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
15428         nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
15429                                           rdev, wdev, cookie, chan, 0, gfp);
15430 }
15431 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
15432
15433 void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie,
15434                                         struct ieee80211_channel *chan,
15435                                         gfp_t gfp)
15436 {
15437         struct wiphy *wiphy = wdev->wiphy;
15438         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15439
15440         trace_cfg80211_tx_mgmt_expired(wdev, cookie, chan);
15441         nl80211_send_remain_on_chan_event(NL80211_CMD_FRAME_WAIT_CANCEL,
15442                                           rdev, wdev, cookie, chan, 0, gfp);
15443 }
15444 EXPORT_SYMBOL(cfg80211_tx_mgmt_expired);
15445
15446 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
15447                       struct station_info *sinfo, gfp_t gfp)
15448 {
15449         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
15450         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15451         struct sk_buff *msg;
15452
15453         trace_cfg80211_new_sta(dev, mac_addr, sinfo);
15454
15455         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15456         if (!msg)
15457                 return;
15458
15459         if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0,
15460                                  rdev, dev, mac_addr, sinfo) < 0) {
15461                 nlmsg_free(msg);
15462                 return;
15463         }
15464
15465         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15466                                 NL80211_MCGRP_MLME, gfp);
15467 }
15468 EXPORT_SYMBOL(cfg80211_new_sta);
15469
15470 void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
15471                             struct station_info *sinfo, gfp_t gfp)
15472 {
15473         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
15474         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15475         struct sk_buff *msg;
15476         struct station_info empty_sinfo = {};
15477
15478         if (!sinfo)
15479                 sinfo = &empty_sinfo;
15480
15481         trace_cfg80211_del_sta(dev, mac_addr);
15482
15483         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15484         if (!msg) {
15485                 cfg80211_sinfo_release_content(sinfo);
15486                 return;
15487         }
15488
15489         if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0,
15490                                  rdev, dev, mac_addr, sinfo) < 0) {
15491                 nlmsg_free(msg);
15492                 return;
15493         }
15494
15495         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15496                                 NL80211_MCGRP_MLME, gfp);
15497 }
15498 EXPORT_SYMBOL(cfg80211_del_sta_sinfo);
15499
15500 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
15501                           enum nl80211_connect_failed_reason reason,
15502                           gfp_t gfp)
15503 {
15504         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
15505         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15506         struct sk_buff *msg;
15507         void *hdr;
15508
15509         msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
15510         if (!msg)
15511                 return;
15512
15513         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
15514         if (!hdr) {
15515                 nlmsg_free(msg);
15516                 return;
15517         }
15518
15519         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
15520             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
15521             nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
15522                 goto nla_put_failure;
15523
15524         genlmsg_end(msg, hdr);
15525
15526         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15527                                 NL80211_MCGRP_MLME, gfp);
15528         return;
15529
15530  nla_put_failure:
15531         nlmsg_free(msg);
15532 }
15533 EXPORT_SYMBOL(cfg80211_conn_failed);
15534
15535 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
15536                                        const u8 *addr, gfp_t gfp)
15537 {
15538         struct wireless_dev *wdev = dev->ieee80211_ptr;
15539         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
15540         struct sk_buff *msg;
15541         void *hdr;
15542         u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid);
15543
15544         if (!nlportid)
15545                 return false;
15546
15547         msg = nlmsg_new(100, gfp);
15548         if (!msg)
15549                 return true;
15550
15551         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
15552         if (!hdr) {
15553                 nlmsg_free(msg);
15554                 return true;
15555         }
15556
15557         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15558             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
15559             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
15560                 goto nla_put_failure;
15561
15562         genlmsg_end(msg, hdr);
15563         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
15564         return true;
15565
15566  nla_put_failure:
15567         nlmsg_free(msg);
15568         return true;
15569 }
15570
15571 bool cfg80211_rx_spurious_frame(struct net_device *dev,
15572                                 const u8 *addr, gfp_t gfp)
15573 {
15574         struct wireless_dev *wdev = dev->ieee80211_ptr;
15575         bool ret;
15576
15577         trace_cfg80211_rx_spurious_frame(dev, addr);
15578
15579         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
15580                     wdev->iftype != NL80211_IFTYPE_P2P_GO)) {
15581                 trace_cfg80211_return_bool(false);
15582                 return false;
15583         }
15584         ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME,
15585                                          addr, gfp);
15586         trace_cfg80211_return_bool(ret);
15587         return ret;
15588 }
15589 EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
15590
15591 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
15592                                         const u8 *addr, gfp_t gfp)
15593 {
15594         struct wireless_dev *wdev = dev->ieee80211_ptr;
15595         bool ret;
15596
15597         trace_cfg80211_rx_unexpected_4addr_frame(dev, addr);
15598
15599         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
15600                     wdev->iftype != NL80211_IFTYPE_P2P_GO &&
15601                     wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
15602                 trace_cfg80211_return_bool(false);
15603                 return false;
15604         }
15605         ret = __nl80211_unexpected_frame(dev,
15606                                          NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
15607                                          addr, gfp);
15608         trace_cfg80211_return_bool(ret);
15609         return ret;
15610 }
15611 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
15612
15613 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
15614                       struct wireless_dev *wdev, u32 nlportid,
15615                       int freq, int sig_dbm,
15616                       const u8 *buf, size_t len, u32 flags, gfp_t gfp)
15617 {
15618         struct net_device *netdev = wdev->netdev;
15619         struct sk_buff *msg;
15620         void *hdr;
15621
15622         msg = nlmsg_new(100 + len, gfp);
15623         if (!msg)
15624                 return -ENOMEM;
15625
15626         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
15627         if (!hdr) {
15628                 nlmsg_free(msg);
15629                 return -ENOMEM;
15630         }
15631
15632         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15633             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
15634                                         netdev->ifindex)) ||
15635             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
15636                               NL80211_ATTR_PAD) ||
15637             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
15638             (sig_dbm &&
15639              nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
15640             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
15641             (flags &&
15642              nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags)))
15643                 goto nla_put_failure;
15644
15645         genlmsg_end(msg, hdr);
15646
15647         return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
15648
15649  nla_put_failure:
15650         nlmsg_free(msg);
15651         return -ENOBUFS;
15652 }
15653
15654 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
15655                              const u8 *buf, size_t len, bool ack, gfp_t gfp)
15656 {
15657         struct wiphy *wiphy = wdev->wiphy;
15658         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15659         struct net_device *netdev = wdev->netdev;
15660         struct sk_buff *msg;
15661         void *hdr;
15662
15663         trace_cfg80211_mgmt_tx_status(wdev, cookie, ack);
15664
15665         msg = nlmsg_new(100 + len, gfp);
15666         if (!msg)
15667                 return;
15668
15669         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS);
15670         if (!hdr) {
15671                 nlmsg_free(msg);
15672                 return;
15673         }
15674
15675         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15676             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
15677                                    netdev->ifindex)) ||
15678             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
15679                               NL80211_ATTR_PAD) ||
15680             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
15681             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
15682                               NL80211_ATTR_PAD) ||
15683             (ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
15684                 goto nla_put_failure;
15685
15686         genlmsg_end(msg, hdr);
15687
15688         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15689                                 NL80211_MCGRP_MLME, gfp);
15690         return;
15691
15692  nla_put_failure:
15693         nlmsg_free(msg);
15694 }
15695 EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
15696
15697 static int __nl80211_rx_control_port(struct net_device *dev,
15698                                      struct sk_buff *skb,
15699                                      bool unencrypted, gfp_t gfp)
15700 {
15701         struct wireless_dev *wdev = dev->ieee80211_ptr;
15702         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
15703         struct ethhdr *ehdr = eth_hdr(skb);
15704         const u8 *addr = ehdr->h_source;
15705         u16 proto = be16_to_cpu(skb->protocol);
15706         struct sk_buff *msg;
15707         void *hdr;
15708         struct nlattr *frame;
15709
15710         u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid);
15711
15712         if (!nlportid)
15713                 return -ENOENT;
15714
15715         msg = nlmsg_new(100 + skb->len, gfp);
15716         if (!msg)
15717                 return -ENOMEM;
15718
15719         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONTROL_PORT_FRAME);
15720         if (!hdr) {
15721                 nlmsg_free(msg);
15722                 return -ENOBUFS;
15723         }
15724
15725         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15726             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
15727             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
15728                               NL80211_ATTR_PAD) ||
15729             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
15730             nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) ||
15731             (unencrypted && nla_put_flag(msg,
15732                                          NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT)))
15733                 goto nla_put_failure;
15734
15735         frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len);
15736         if (!frame)
15737                 goto nla_put_failure;
15738
15739         skb_copy_bits(skb, 0, nla_data(frame), skb->len);
15740         genlmsg_end(msg, hdr);
15741
15742         return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
15743
15744  nla_put_failure:
15745         nlmsg_free(msg);
15746         return -ENOBUFS;
15747 }
15748
15749 bool cfg80211_rx_control_port(struct net_device *dev,
15750                               struct sk_buff *skb, bool unencrypted)
15751 {
15752         int ret;
15753
15754         trace_cfg80211_rx_control_port(dev, skb, unencrypted);
15755         ret = __nl80211_rx_control_port(dev, skb, unencrypted, GFP_ATOMIC);
15756         trace_cfg80211_return_bool(ret == 0);
15757         return ret == 0;
15758 }
15759 EXPORT_SYMBOL(cfg80211_rx_control_port);
15760
15761 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev,
15762                                             const char *mac, gfp_t gfp)
15763 {
15764         struct wireless_dev *wdev = dev->ieee80211_ptr;
15765         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
15766         struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15767         void **cb;
15768
15769         if (!msg)
15770                 return NULL;
15771
15772         cb = (void **)msg->cb;
15773
15774         cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
15775         if (!cb[0]) {
15776                 nlmsg_free(msg);
15777                 return NULL;
15778         }
15779
15780         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15781             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
15782                 goto nla_put_failure;
15783
15784         if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
15785                 goto nla_put_failure;
15786
15787         cb[1] = nla_nest_start_noflag(msg, NL80211_ATTR_CQM);
15788         if (!cb[1])
15789                 goto nla_put_failure;
15790
15791         cb[2] = rdev;
15792
15793         return msg;
15794  nla_put_failure:
15795         nlmsg_free(msg);
15796         return NULL;
15797 }
15798
15799 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp)
15800 {
15801         void **cb = (void **)msg->cb;
15802         struct cfg80211_registered_device *rdev = cb[2];
15803
15804         nla_nest_end(msg, cb[1]);
15805         genlmsg_end(msg, cb[0]);
15806
15807         memset(msg->cb, 0, sizeof(msg->cb));
15808
15809         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15810                                 NL80211_MCGRP_MLME, gfp);
15811 }
15812
15813 void cfg80211_cqm_rssi_notify(struct net_device *dev,
15814                               enum nl80211_cqm_rssi_threshold_event rssi_event,
15815                               s32 rssi_level, gfp_t gfp)
15816 {
15817         struct sk_buff *msg;
15818         struct wireless_dev *wdev = dev->ieee80211_ptr;
15819         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
15820
15821         trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level);
15822
15823         if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
15824                     rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
15825                 return;
15826
15827         if (wdev->cqm_config) {
15828                 wdev->cqm_config->last_rssi_event_value = rssi_level;
15829
15830                 cfg80211_cqm_rssi_update(rdev, dev);
15831
15832                 if (rssi_level == 0)
15833                         rssi_level = wdev->cqm_config->last_rssi_event_value;
15834         }
15835
15836         msg = cfg80211_prepare_cqm(dev, NULL, gfp);
15837         if (!msg)
15838                 return;
15839
15840         if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
15841                         rssi_event))
15842                 goto nla_put_failure;
15843
15844         if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL,
15845                                       rssi_level))
15846                 goto nla_put_failure;
15847
15848         cfg80211_send_cqm(msg, gfp);
15849
15850         return;
15851
15852  nla_put_failure:
15853         nlmsg_free(msg);
15854 }
15855 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
15856
15857 void cfg80211_cqm_txe_notify(struct net_device *dev,
15858                              const u8 *peer, u32 num_packets,
15859                              u32 rate, u32 intvl, gfp_t gfp)
15860 {
15861         struct sk_buff *msg;
15862
15863         msg = cfg80211_prepare_cqm(dev, peer, gfp);
15864         if (!msg)
15865                 return;
15866
15867         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets))
15868                 goto nla_put_failure;
15869
15870         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate))
15871                 goto nla_put_failure;
15872
15873         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl))
15874                 goto nla_put_failure;
15875
15876         cfg80211_send_cqm(msg, gfp);
15877         return;
15878
15879  nla_put_failure:
15880         nlmsg_free(msg);
15881 }
15882 EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
15883
15884 void cfg80211_cqm_pktloss_notify(struct net_device *dev,
15885                                  const u8 *peer, u32 num_packets, gfp_t gfp)
15886 {
15887         struct sk_buff *msg;
15888
15889         trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
15890
15891         msg = cfg80211_prepare_cqm(dev, peer, gfp);
15892         if (!msg)
15893                 return;
15894
15895         if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets))
15896                 goto nla_put_failure;
15897
15898         cfg80211_send_cqm(msg, gfp);
15899         return;
15900
15901  nla_put_failure:
15902         nlmsg_free(msg);
15903 }
15904 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
15905
15906 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp)
15907 {
15908         struct sk_buff *msg;
15909
15910         msg = cfg80211_prepare_cqm(dev, NULL, gfp);
15911         if (!msg)
15912                 return;
15913
15914         if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT))
15915                 goto nla_put_failure;
15916
15917         cfg80211_send_cqm(msg, gfp);
15918         return;
15919
15920  nla_put_failure:
15921         nlmsg_free(msg);
15922 }
15923 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify);
15924
15925 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
15926                                      struct net_device *netdev, const u8 *bssid,
15927                                      const u8 *replay_ctr, gfp_t gfp)
15928 {
15929         struct sk_buff *msg;
15930         struct nlattr *rekey_attr;
15931         void *hdr;
15932
15933         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15934         if (!msg)
15935                 return;
15936
15937         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD);
15938         if (!hdr) {
15939                 nlmsg_free(msg);
15940                 return;
15941         }
15942
15943         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15944             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
15945             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
15946                 goto nla_put_failure;
15947
15948         rekey_attr = nla_nest_start_noflag(msg, NL80211_ATTR_REKEY_DATA);
15949         if (!rekey_attr)
15950                 goto nla_put_failure;
15951
15952         if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR,
15953                     NL80211_REPLAY_CTR_LEN, replay_ctr))
15954                 goto nla_put_failure;
15955
15956         nla_nest_end(msg, rekey_attr);
15957
15958         genlmsg_end(msg, hdr);
15959
15960         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15961                                 NL80211_MCGRP_MLME, gfp);
15962         return;
15963
15964  nla_put_failure:
15965         nlmsg_free(msg);
15966 }
15967
15968 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
15969                                const u8 *replay_ctr, gfp_t gfp)
15970 {
15971         struct wireless_dev *wdev = dev->ieee80211_ptr;
15972         struct wiphy *wiphy = wdev->wiphy;
15973         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15974
15975         trace_cfg80211_gtk_rekey_notify(dev, bssid);
15976         nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
15977 }
15978 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
15979
15980 static void
15981 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
15982                                struct net_device *netdev, int index,
15983                                const u8 *bssid, bool preauth, gfp_t gfp)
15984 {
15985         struct sk_buff *msg;
15986         struct nlattr *attr;
15987         void *hdr;
15988
15989         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15990         if (!msg)
15991                 return;
15992
15993         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE);
15994         if (!hdr) {
15995                 nlmsg_free(msg);
15996                 return;
15997         }
15998
15999         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16000             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
16001                 goto nla_put_failure;
16002
16003         attr = nla_nest_start_noflag(msg, NL80211_ATTR_PMKSA_CANDIDATE);
16004         if (!attr)
16005                 goto nla_put_failure;
16006
16007         if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) ||
16008             nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) ||
16009             (preauth &&
16010              nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH)))
16011                 goto nla_put_failure;
16012
16013         nla_nest_end(msg, attr);
16014
16015         genlmsg_end(msg, hdr);
16016
16017         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16018                                 NL80211_MCGRP_MLME, gfp);
16019         return;
16020
16021  nla_put_failure:
16022         nlmsg_free(msg);
16023 }
16024
16025 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
16026                                      const u8 *bssid, bool preauth, gfp_t gfp)
16027 {
16028         struct wireless_dev *wdev = dev->ieee80211_ptr;
16029         struct wiphy *wiphy = wdev->wiphy;
16030         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
16031
16032         trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
16033         nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
16034 }
16035 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
16036
16037 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
16038                                      struct net_device *netdev,
16039                                      struct cfg80211_chan_def *chandef,
16040                                      gfp_t gfp,
16041                                      enum nl80211_commands notif,
16042                                      u8 count)
16043 {
16044         struct sk_buff *msg;
16045         void *hdr;
16046
16047         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
16048         if (!msg)
16049                 return;
16050
16051         hdr = nl80211hdr_put(msg, 0, 0, 0, notif);
16052         if (!hdr) {
16053                 nlmsg_free(msg);
16054                 return;
16055         }
16056
16057         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
16058                 goto nla_put_failure;
16059
16060         if (nl80211_send_chandef(msg, chandef))
16061                 goto nla_put_failure;
16062
16063         if ((notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) &&
16064             (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)))
16065                         goto nla_put_failure;
16066
16067         genlmsg_end(msg, hdr);
16068
16069         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16070                                 NL80211_MCGRP_MLME, gfp);
16071         return;
16072
16073  nla_put_failure:
16074         nlmsg_free(msg);
16075 }
16076
16077 void cfg80211_ch_switch_notify(struct net_device *dev,
16078                                struct cfg80211_chan_def *chandef)
16079 {
16080         struct wireless_dev *wdev = dev->ieee80211_ptr;
16081         struct wiphy *wiphy = wdev->wiphy;
16082         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
16083
16084         ASSERT_WDEV_LOCK(wdev);
16085
16086         trace_cfg80211_ch_switch_notify(dev, chandef);
16087
16088         wdev->chandef = *chandef;
16089         wdev->preset_chandef = *chandef;
16090
16091         if (wdev->iftype == NL80211_IFTYPE_STATION &&
16092             !WARN_ON(!wdev->current_bss))
16093                 wdev->current_bss->pub.channel = chandef->chan;
16094
16095         nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
16096                                  NL80211_CMD_CH_SWITCH_NOTIFY, 0);
16097 }
16098 EXPORT_SYMBOL(cfg80211_ch_switch_notify);
16099
16100 void cfg80211_ch_switch_started_notify(struct net_device *dev,
16101                                        struct cfg80211_chan_def *chandef,
16102                                        u8 count)
16103 {
16104         struct wireless_dev *wdev = dev->ieee80211_ptr;
16105         struct wiphy *wiphy = wdev->wiphy;
16106         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
16107
16108         trace_cfg80211_ch_switch_started_notify(dev, chandef);
16109
16110         nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
16111                                  NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, count);
16112 }
16113 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
16114
16115 void
16116 nl80211_radar_notify(struct cfg80211_registered_device *rdev,
16117                      const struct cfg80211_chan_def *chandef,
16118                      enum nl80211_radar_event event,
16119                      struct net_device *netdev, gfp_t gfp)
16120 {
16121         struct sk_buff *msg;
16122         void *hdr;
16123
16124         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
16125         if (!msg)
16126                 return;
16127
16128         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT);
16129         if (!hdr) {
16130                 nlmsg_free(msg);
16131                 return;
16132         }
16133
16134         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
16135                 goto nla_put_failure;
16136
16137         /* NOP and radar events don't need a netdev parameter */
16138         if (netdev) {
16139                 struct wireless_dev *wdev = netdev->ieee80211_ptr;
16140
16141                 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
16142                     nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
16143                                       NL80211_ATTR_PAD))
16144                         goto nla_put_failure;
16145         }
16146
16147         if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
16148                 goto nla_put_failure;
16149
16150         if (nl80211_send_chandef(msg, chandef))
16151                 goto nla_put_failure;
16152
16153         genlmsg_end(msg, hdr);
16154
16155         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16156                                 NL80211_MCGRP_MLME, gfp);
16157         return;
16158
16159  nla_put_failure:
16160         nlmsg_free(msg);
16161 }
16162
16163 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac,
16164                                        struct sta_opmode_info *sta_opmode,
16165                                        gfp_t gfp)
16166 {
16167         struct sk_buff *msg;
16168         struct wireless_dev *wdev = dev->ieee80211_ptr;
16169         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
16170         void *hdr;
16171
16172         if (WARN_ON(!mac))
16173                 return;
16174
16175         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
16176         if (!msg)
16177                 return;
16178
16179         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED);
16180         if (!hdr) {
16181                 nlmsg_free(msg);
16182                 return;
16183         }
16184
16185         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
16186                 goto nla_put_failure;
16187
16188         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
16189                 goto nla_put_failure;
16190
16191         if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
16192                 goto nla_put_failure;
16193
16194         if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) &&
16195             nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode))
16196                 goto nla_put_failure;
16197
16198         if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) &&
16199             nla_put_u8(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw))
16200                 goto nla_put_failure;
16201
16202         if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) &&
16203             nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss))
16204                 goto nla_put_failure;
16205
16206         genlmsg_end(msg, hdr);
16207
16208         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16209                                 NL80211_MCGRP_MLME, gfp);
16210
16211         return;
16212
16213 nla_put_failure:
16214         nlmsg_free(msg);
16215 }
16216 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify);
16217
16218 void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
16219                            u64 cookie, bool acked, s32 ack_signal,
16220                            bool is_valid_ack_signal, gfp_t gfp)
16221 {
16222         struct wireless_dev *wdev = dev->ieee80211_ptr;
16223         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
16224         struct sk_buff *msg;
16225         void *hdr;
16226
16227         trace_cfg80211_probe_status(dev, addr, cookie, acked);
16228
16229         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
16230
16231         if (!msg)
16232                 return;
16233
16234         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT);
16235         if (!hdr) {
16236                 nlmsg_free(msg);
16237                 return;
16238         }
16239
16240         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16241             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
16242             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
16243             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
16244                               NL80211_ATTR_PAD) ||
16245             (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) ||
16246             (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL,
16247                                                 ack_signal)))
16248                 goto nla_put_failure;
16249
16250         genlmsg_end(msg, hdr);
16251
16252         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16253                                 NL80211_MCGRP_MLME, gfp);
16254         return;
16255
16256  nla_put_failure:
16257         nlmsg_free(msg);
16258 }
16259 EXPORT_SYMBOL(cfg80211_probe_status);
16260
16261 void cfg80211_report_obss_beacon(struct wiphy *wiphy,
16262                                  const u8 *frame, size_t len,
16263                                  int freq, int sig_dbm)
16264 {
16265         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
16266         struct sk_buff *msg;
16267         void *hdr;
16268         struct cfg80211_beacon_registration *reg;
16269
16270         trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm);
16271
16272         spin_lock_bh(&rdev->beacon_registrations_lock);
16273         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
16274                 msg = nlmsg_new(len + 100, GFP_ATOMIC);
16275                 if (!msg) {
16276                         spin_unlock_bh(&rdev->beacon_registrations_lock);
16277                         return;
16278                 }
16279
16280                 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
16281                 if (!hdr)
16282                         goto nla_put_failure;
16283
16284                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16285                     (freq &&
16286                      nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq)) ||
16287                     (sig_dbm &&
16288                      nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
16289                     nla_put(msg, NL80211_ATTR_FRAME, len, frame))
16290                         goto nla_put_failure;
16291
16292                 genlmsg_end(msg, hdr);
16293
16294                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid);
16295         }
16296         spin_unlock_bh(&rdev->beacon_registrations_lock);
16297         return;
16298
16299  nla_put_failure:
16300         spin_unlock_bh(&rdev->beacon_registrations_lock);
16301         nlmsg_free(msg);
16302 }
16303 EXPORT_SYMBOL(cfg80211_report_obss_beacon);
16304
16305 #ifdef CONFIG_PM
16306 static int cfg80211_net_detect_results(struct sk_buff *msg,
16307                                        struct cfg80211_wowlan_wakeup *wakeup)
16308 {
16309         struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect;
16310         struct nlattr *nl_results, *nl_match, *nl_freqs;
16311         int i, j;
16312
16313         nl_results = nla_nest_start_noflag(msg,
16314                                            NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS);
16315         if (!nl_results)
16316                 return -EMSGSIZE;
16317
16318         for (i = 0; i < nd->n_matches; i++) {
16319                 struct cfg80211_wowlan_nd_match *match = nd->matches[i];
16320
16321                 nl_match = nla_nest_start_noflag(msg, i);
16322                 if (!nl_match)
16323                         break;
16324
16325                 /* The SSID attribute is optional in nl80211, but for
16326                  * simplicity reasons it's always present in the
16327                  * cfg80211 structure.  If a driver can't pass the
16328                  * SSID, that needs to be changed.  A zero length SSID
16329                  * is still a valid SSID (wildcard), so it cannot be
16330                  * used for this purpose.
16331                  */
16332                 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len,
16333                             match->ssid.ssid)) {
16334                         nla_nest_cancel(msg, nl_match);
16335                         goto out;
16336                 }
16337
16338                 if (match->n_channels) {
16339                         nl_freqs = nla_nest_start_noflag(msg,
16340                                                          NL80211_ATTR_SCAN_FREQUENCIES);
16341                         if (!nl_freqs) {
16342                                 nla_nest_cancel(msg, nl_match);
16343                                 goto out;
16344                         }
16345
16346                         for (j = 0; j < match->n_channels; j++) {
16347                                 if (nla_put_u32(msg, j, match->channels[j])) {
16348                                         nla_nest_cancel(msg, nl_freqs);
16349                                         nla_nest_cancel(msg, nl_match);
16350                                         goto out;
16351                                 }
16352                         }
16353
16354                         nla_nest_end(msg, nl_freqs);
16355                 }
16356
16357                 nla_nest_end(msg, nl_match);
16358         }
16359
16360 out:
16361         nla_nest_end(msg, nl_results);
16362         return 0;
16363 }
16364
16365 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
16366                                    struct cfg80211_wowlan_wakeup *wakeup,
16367                                    gfp_t gfp)
16368 {
16369         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
16370         struct sk_buff *msg;
16371         void *hdr;
16372         int size = 200;
16373
16374         trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup);
16375
16376         if (wakeup)
16377                 size += wakeup->packet_present_len;
16378
16379         msg = nlmsg_new(size, gfp);
16380         if (!msg)
16381                 return;
16382
16383         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN);
16384         if (!hdr)
16385                 goto free_msg;
16386
16387         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16388             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
16389                               NL80211_ATTR_PAD))
16390                 goto free_msg;
16391
16392         if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
16393                                         wdev->netdev->ifindex))
16394                 goto free_msg;
16395
16396         if (wakeup) {
16397                 struct nlattr *reasons;
16398
16399                 reasons = nla_nest_start_noflag(msg,
16400                                                 NL80211_ATTR_WOWLAN_TRIGGERS);
16401                 if (!reasons)
16402                         goto free_msg;
16403
16404                 if (wakeup->disconnect &&
16405                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT))
16406                         goto free_msg;
16407                 if (wakeup->magic_pkt &&
16408                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT))
16409                         goto free_msg;
16410                 if (wakeup->gtk_rekey_failure &&
16411                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE))
16412                         goto free_msg;
16413                 if (wakeup->eap_identity_req &&
16414                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST))
16415                         goto free_msg;
16416                 if (wakeup->four_way_handshake &&
16417                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE))
16418                         goto free_msg;
16419                 if (wakeup->rfkill_release &&
16420                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))
16421                         goto free_msg;
16422
16423                 if (wakeup->pattern_idx >= 0 &&
16424                     nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
16425                                 wakeup->pattern_idx))
16426                         goto free_msg;
16427
16428                 if (wakeup->tcp_match &&
16429                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH))
16430                         goto free_msg;
16431
16432                 if (wakeup->tcp_connlost &&
16433                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST))
16434                         goto free_msg;
16435
16436                 if (wakeup->tcp_nomoretokens &&
16437                     nla_put_flag(msg,
16438                                  NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS))
16439                         goto free_msg;
16440
16441                 if (wakeup->packet) {
16442                         u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211;
16443                         u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN;
16444
16445                         if (!wakeup->packet_80211) {
16446                                 pkt_attr =
16447                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023;
16448                                 len_attr =
16449                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN;
16450                         }
16451
16452                         if (wakeup->packet_len &&
16453                             nla_put_u32(msg, len_attr, wakeup->packet_len))
16454                                 goto free_msg;
16455
16456                         if (nla_put(msg, pkt_attr, wakeup->packet_present_len,
16457                                     wakeup->packet))
16458                                 goto free_msg;
16459                 }
16460
16461                 if (wakeup->net_detect &&
16462                     cfg80211_net_detect_results(msg, wakeup))
16463                                 goto free_msg;
16464
16465                 nla_nest_end(msg, reasons);
16466         }
16467
16468         genlmsg_end(msg, hdr);
16469
16470         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16471                                 NL80211_MCGRP_MLME, gfp);
16472         return;
16473
16474  free_msg:
16475         nlmsg_free(msg);
16476 }
16477 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup);
16478 #endif
16479
16480 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
16481                                 enum nl80211_tdls_operation oper,
16482                                 u16 reason_code, gfp_t gfp)
16483 {
16484         struct wireless_dev *wdev = dev->ieee80211_ptr;
16485         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
16486         struct sk_buff *msg;
16487         void *hdr;
16488
16489         trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper,
16490                                          reason_code);
16491
16492         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
16493         if (!msg)
16494                 return;
16495
16496         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER);
16497         if (!hdr) {
16498                 nlmsg_free(msg);
16499                 return;
16500         }
16501
16502         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16503             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
16504             nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) ||
16505             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) ||
16506             (reason_code > 0 &&
16507              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code)))
16508                 goto nla_put_failure;
16509
16510         genlmsg_end(msg, hdr);
16511
16512         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16513                                 NL80211_MCGRP_MLME, gfp);
16514         return;
16515
16516  nla_put_failure:
16517         nlmsg_free(msg);
16518 }
16519 EXPORT_SYMBOL(cfg80211_tdls_oper_request);
16520
16521 static int nl80211_netlink_notify(struct notifier_block * nb,
16522                                   unsigned long state,
16523                                   void *_notify)
16524 {
16525         struct netlink_notify *notify = _notify;
16526         struct cfg80211_registered_device *rdev;
16527         struct wireless_dev *wdev;
16528         struct cfg80211_beacon_registration *reg, *tmp;
16529
16530         if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC)
16531                 return NOTIFY_DONE;
16532
16533         rcu_read_lock();
16534
16535         list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
16536                 struct cfg80211_sched_scan_request *sched_scan_req;
16537
16538                 list_for_each_entry_rcu(sched_scan_req,
16539                                         &rdev->sched_scan_req_list,
16540                                         list) {
16541                         if (sched_scan_req->owner_nlportid == notify->portid) {
16542                                 sched_scan_req->nl_owner_dead = true;
16543                                 schedule_work(&rdev->sched_scan_stop_wk);
16544                         }
16545                 }
16546
16547                 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) {
16548                         cfg80211_mlme_unregister_socket(wdev, notify->portid);
16549
16550                         if (wdev->owner_nlportid == notify->portid) {
16551                                 wdev->nl_owner_dead = true;
16552                                 schedule_work(&rdev->destroy_work);
16553                         } else if (wdev->conn_owner_nlportid == notify->portid) {
16554                                 schedule_work(&wdev->disconnect_wk);
16555                         }
16556
16557                         cfg80211_release_pmsr(wdev, notify->portid);
16558                 }
16559
16560                 spin_lock_bh(&rdev->beacon_registrations_lock);
16561                 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations,
16562                                          list) {
16563                         if (reg->nlportid == notify->portid) {
16564                                 list_del(&reg->list);
16565                                 kfree(reg);
16566                                 break;
16567                         }
16568                 }
16569                 spin_unlock_bh(&rdev->beacon_registrations_lock);
16570         }
16571
16572         rcu_read_unlock();
16573
16574         /*
16575          * It is possible that the user space process that is controlling the
16576          * indoor setting disappeared, so notify the regulatory core.
16577          */
16578         regulatory_netlink_notify(notify->portid);
16579         return NOTIFY_OK;
16580 }
16581
16582 static struct notifier_block nl80211_netlink_notifier = {
16583         .notifier_call = nl80211_netlink_notify,
16584 };
16585
16586 void cfg80211_ft_event(struct net_device *netdev,
16587                        struct cfg80211_ft_event_params *ft_event)
16588 {
16589         struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
16590         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
16591         struct sk_buff *msg;
16592         void *hdr;
16593
16594         trace_cfg80211_ft_event(wiphy, netdev, ft_event);
16595
16596         if (!ft_event->target_ap)
16597                 return;
16598
16599         msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len,
16600                         GFP_KERNEL);
16601         if (!msg)
16602                 return;
16603
16604         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT);
16605         if (!hdr)
16606                 goto out;
16607
16608         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16609             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
16610             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap))
16611                 goto out;
16612
16613         if (ft_event->ies &&
16614             nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies))
16615                 goto out;
16616         if (ft_event->ric_ies &&
16617             nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len,
16618                     ft_event->ric_ies))
16619                 goto out;
16620
16621         genlmsg_end(msg, hdr);
16622
16623         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16624                                 NL80211_MCGRP_MLME, GFP_KERNEL);
16625         return;
16626  out:
16627         nlmsg_free(msg);
16628 }
16629 EXPORT_SYMBOL(cfg80211_ft_event);
16630
16631 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp)
16632 {
16633         struct cfg80211_registered_device *rdev;
16634         struct sk_buff *msg;
16635         void *hdr;
16636         u32 nlportid;
16637
16638         rdev = wiphy_to_rdev(wdev->wiphy);
16639         if (!rdev->crit_proto_nlportid)
16640                 return;
16641
16642         nlportid = rdev->crit_proto_nlportid;
16643         rdev->crit_proto_nlportid = 0;
16644
16645         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
16646         if (!msg)
16647                 return;
16648
16649         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP);
16650         if (!hdr)
16651                 goto nla_put_failure;
16652
16653         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16654             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
16655                               NL80211_ATTR_PAD))
16656                 goto nla_put_failure;
16657
16658         genlmsg_end(msg, hdr);
16659
16660         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
16661         return;
16662
16663  nla_put_failure:
16664         nlmsg_free(msg);
16665 }
16666 EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
16667
16668 void nl80211_send_ap_stopped(struct wireless_dev *wdev)
16669 {
16670         struct wiphy *wiphy = wdev->wiphy;
16671         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
16672         struct sk_buff *msg;
16673         void *hdr;
16674
16675         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
16676         if (!msg)
16677                 return;
16678
16679         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP);
16680         if (!hdr)
16681                 goto out;
16682
16683         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16684             nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) ||
16685             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
16686                               NL80211_ATTR_PAD))
16687                 goto out;
16688
16689         genlmsg_end(msg, hdr);
16690
16691         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
16692                                 NL80211_MCGRP_MLME, GFP_KERNEL);
16693         return;
16694  out:
16695         nlmsg_free(msg);
16696 }
16697
16698 int cfg80211_external_auth_request(struct net_device *dev,
16699                                    struct cfg80211_external_auth_params *params,
16700                                    gfp_t gfp)
16701 {
16702         struct wireless_dev *wdev = dev->ieee80211_ptr;
16703         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
16704         struct sk_buff *msg;
16705         void *hdr;
16706
16707         if (!wdev->conn_owner_nlportid)
16708                 return -EINVAL;
16709
16710         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
16711         if (!msg)
16712                 return -ENOMEM;
16713
16714         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH);
16715         if (!hdr)
16716                 goto nla_put_failure;
16717
16718         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16719             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
16720             nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) ||
16721             nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION,
16722                         params->action) ||
16723             nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) ||
16724             nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len,
16725                     params->ssid.ssid))
16726                 goto nla_put_failure;
16727
16728         genlmsg_end(msg, hdr);
16729         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
16730                         wdev->conn_owner_nlportid);
16731         return 0;
16732
16733  nla_put_failure:
16734         nlmsg_free(msg);
16735         return -ENOBUFS;
16736 }
16737 EXPORT_SYMBOL(cfg80211_external_auth_request);
16738
16739 void cfg80211_update_owe_info_event(struct net_device *netdev,
16740                                     struct cfg80211_update_owe_info *owe_info,
16741                                     gfp_t gfp)
16742 {
16743         struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
16744         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
16745         struct sk_buff *msg;
16746         void *hdr;
16747
16748         trace_cfg80211_update_owe_info_event(wiphy, netdev, owe_info);
16749
16750         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
16751         if (!msg)
16752                 return;
16753
16754         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_OWE_INFO);
16755         if (!hdr)
16756                 goto nla_put_failure;
16757
16758         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
16759             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
16760             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer))
16761                 goto nla_put_failure;
16762
16763         if (!owe_info->ie_len ||
16764             nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie))
16765                 goto nla_put_failure;
16766
16767         genlmsg_end(msg, hdr);
16768
16769         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
16770                                 NL80211_MCGRP_MLME, gfp);
16771         return;
16772
16773 nla_put_failure:
16774         genlmsg_cancel(msg, hdr);
16775         nlmsg_free(msg);
16776 }
16777 EXPORT_SYMBOL(cfg80211_update_owe_info_event);
16778
16779 /* initialisation/exit functions */
16780
16781 int __init nl80211_init(void)
16782 {
16783         int err;
16784
16785         err = genl_register_family(&nl80211_fam);
16786         if (err)
16787                 return err;
16788
16789         err = netlink_register_notifier(&nl80211_netlink_notifier);
16790         if (err)
16791                 goto err_out;
16792
16793         return 0;
16794  err_out:
16795         genl_unregister_family(&nl80211_fam);
16796         return err;
16797 }
16798
16799 void nl80211_exit(void)
16800 {
16801         netlink_unregister_notifier(&nl80211_netlink_notifier);
16802         genl_unregister_family(&nl80211_fam);
16803 }