Merge tag 'trace-v4.14-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rosted...
[linux-2.6-microblaze.git] / net / wireless / nl80211.c
1 /*
2  * This is the new netlink-based wireless configuration interface.
3  *
4  * Copyright 2006-2010  Johannes Berg <johannes@sipsolutions.net>
5  * Copyright 2013-2014  Intel Mobile Communications GmbH
6  * Copyright 2015-2017  Intel Deutschland GmbH
7  */
8
9 #include <linux/if.h>
10 #include <linux/module.h>
11 #include <linux/err.h>
12 #include <linux/slab.h>
13 #include <linux/list.h>
14 #include <linux/if_ether.h>
15 #include <linux/ieee80211.h>
16 #include <linux/nl80211.h>
17 #include <linux/rtnetlink.h>
18 #include <linux/netlink.h>
19 #include <linux/etherdevice.h>
20 #include <net/net_namespace.h>
21 #include <net/genetlink.h>
22 #include <net/cfg80211.h>
23 #include <net/sock.h>
24 #include <net/inet_connection_sock.h>
25 #include "core.h"
26 #include "nl80211.h"
27 #include "reg.h"
28 #include "rdev-ops.h"
29
30 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
31                                    struct genl_info *info,
32                                    struct cfg80211_crypto_settings *settings,
33                                    int cipher_limit);
34
35 /* the netlink family */
36 static struct genl_family nl80211_fam;
37
38 /* multicast groups */
39 enum nl80211_multicast_groups {
40         NL80211_MCGRP_CONFIG,
41         NL80211_MCGRP_SCAN,
42         NL80211_MCGRP_REGULATORY,
43         NL80211_MCGRP_MLME,
44         NL80211_MCGRP_VENDOR,
45         NL80211_MCGRP_NAN,
46         NL80211_MCGRP_TESTMODE /* keep last - ifdef! */
47 };
48
49 static const struct genl_multicast_group nl80211_mcgrps[] = {
50         [NL80211_MCGRP_CONFIG] = { .name = NL80211_MULTICAST_GROUP_CONFIG },
51         [NL80211_MCGRP_SCAN] = { .name = NL80211_MULTICAST_GROUP_SCAN },
52         [NL80211_MCGRP_REGULATORY] = { .name = NL80211_MULTICAST_GROUP_REG },
53         [NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME },
54         [NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR },
55         [NL80211_MCGRP_NAN] = { .name = NL80211_MULTICAST_GROUP_NAN },
56 #ifdef CONFIG_NL80211_TESTMODE
57         [NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE }
58 #endif
59 };
60
61 /* returns ERR_PTR values */
62 static struct wireless_dev *
63 __cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs)
64 {
65         struct cfg80211_registered_device *rdev;
66         struct wireless_dev *result = NULL;
67         bool have_ifidx = attrs[NL80211_ATTR_IFINDEX];
68         bool have_wdev_id = attrs[NL80211_ATTR_WDEV];
69         u64 wdev_id;
70         int wiphy_idx = -1;
71         int ifidx = -1;
72
73         ASSERT_RTNL();
74
75         if (!have_ifidx && !have_wdev_id)
76                 return ERR_PTR(-EINVAL);
77
78         if (have_ifidx)
79                 ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
80         if (have_wdev_id) {
81                 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
82                 wiphy_idx = wdev_id >> 32;
83         }
84
85         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
86                 struct wireless_dev *wdev;
87
88                 if (wiphy_net(&rdev->wiphy) != netns)
89                         continue;
90
91                 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx)
92                         continue;
93
94                 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
95                         if (have_ifidx && wdev->netdev &&
96                             wdev->netdev->ifindex == ifidx) {
97                                 result = wdev;
98                                 break;
99                         }
100                         if (have_wdev_id && wdev->identifier == (u32)wdev_id) {
101                                 result = wdev;
102                                 break;
103                         }
104                 }
105
106                 if (result)
107                         break;
108         }
109
110         if (result)
111                 return result;
112         return ERR_PTR(-ENODEV);
113 }
114
115 static struct cfg80211_registered_device *
116 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs)
117 {
118         struct cfg80211_registered_device *rdev = NULL, *tmp;
119         struct net_device *netdev;
120
121         ASSERT_RTNL();
122
123         if (!attrs[NL80211_ATTR_WIPHY] &&
124             !attrs[NL80211_ATTR_IFINDEX] &&
125             !attrs[NL80211_ATTR_WDEV])
126                 return ERR_PTR(-EINVAL);
127
128         if (attrs[NL80211_ATTR_WIPHY])
129                 rdev = cfg80211_rdev_by_wiphy_idx(
130                                 nla_get_u32(attrs[NL80211_ATTR_WIPHY]));
131
132         if (attrs[NL80211_ATTR_WDEV]) {
133                 u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
134                 struct wireless_dev *wdev;
135                 bool found = false;
136
137                 tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32);
138                 if (tmp) {
139                         /* make sure wdev exists */
140                         list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) {
141                                 if (wdev->identifier != (u32)wdev_id)
142                                         continue;
143                                 found = true;
144                                 break;
145                         }
146
147                         if (!found)
148                                 tmp = NULL;
149
150                         if (rdev && tmp != rdev)
151                                 return ERR_PTR(-EINVAL);
152                         rdev = tmp;
153                 }
154         }
155
156         if (attrs[NL80211_ATTR_IFINDEX]) {
157                 int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
158
159                 netdev = __dev_get_by_index(netns, ifindex);
160                 if (netdev) {
161                         if (netdev->ieee80211_ptr)
162                                 tmp = wiphy_to_rdev(
163                                         netdev->ieee80211_ptr->wiphy);
164                         else
165                                 tmp = NULL;
166
167                         /* not wireless device -- return error */
168                         if (!tmp)
169                                 return ERR_PTR(-EINVAL);
170
171                         /* mismatch -- return error */
172                         if (rdev && tmp != rdev)
173                                 return ERR_PTR(-EINVAL);
174
175                         rdev = tmp;
176                 }
177         }
178
179         if (!rdev)
180                 return ERR_PTR(-ENODEV);
181
182         if (netns != wiphy_net(&rdev->wiphy))
183                 return ERR_PTR(-ENODEV);
184
185         return rdev;
186 }
187
188 /*
189  * This function returns a pointer to the driver
190  * that the genl_info item that is passed refers to.
191  *
192  * The result of this can be a PTR_ERR and hence must
193  * be checked with IS_ERR() for errors.
194  */
195 static struct cfg80211_registered_device *
196 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info)
197 {
198         return __cfg80211_rdev_from_attrs(netns, info->attrs);
199 }
200
201 /* policy for the attributes */
202 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
203         [NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
204         [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
205                                       .len = 20-1 },
206         [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED },
207
208         [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 },
209         [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 },
210         [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 },
211         [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 },
212         [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 },
213
214         [NL80211_ATTR_WIPHY_RETRY_SHORT] = { .type = NLA_U8 },
215         [NL80211_ATTR_WIPHY_RETRY_LONG] = { .type = NLA_U8 },
216         [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 },
217         [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 },
218         [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 },
219         [NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG },
220
221         [NL80211_ATTR_IFTYPE] = { .type = NLA_U32 },
222         [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
223         [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
224
225         [NL80211_ATTR_MAC] = { .len = ETH_ALEN },
226         [NL80211_ATTR_PREV_BSSID] = { .len = ETH_ALEN },
227
228         [NL80211_ATTR_KEY] = { .type = NLA_NESTED, },
229         [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
230                                     .len = WLAN_MAX_KEY_LEN },
231         [NL80211_ATTR_KEY_IDX] = { .type = NLA_U8 },
232         [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 },
233         [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG },
234         [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
235         [NL80211_ATTR_KEY_TYPE] = { .type = NLA_U32 },
236
237         [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 },
238         [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 },
239         [NL80211_ATTR_BEACON_HEAD] = { .type = NLA_BINARY,
240                                        .len = IEEE80211_MAX_DATA_LEN },
241         [NL80211_ATTR_BEACON_TAIL] = { .type = NLA_BINARY,
242                                        .len = IEEE80211_MAX_DATA_LEN },
243         [NL80211_ATTR_STA_AID] = { .type = NLA_U16 },
244         [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED },
245         [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 },
246         [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY,
247                                                .len = NL80211_MAX_SUPP_RATES },
248         [NL80211_ATTR_STA_PLINK_ACTION] = { .type = NLA_U8 },
249         [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 },
250         [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
251         [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
252                                    .len = IEEE80211_MAX_MESH_ID_LEN },
253         [NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 },
254
255         [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 },
256         [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
257
258         [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
259         [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
260         [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
261         [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY,
262                                            .len = NL80211_MAX_SUPP_RATES },
263         [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 },
264
265         [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED },
266         [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG },
267
268         [NL80211_ATTR_HT_CAPABILITY] = { .len = NL80211_HT_CAPABILITY_LEN },
269
270         [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
271         [NL80211_ATTR_IE] = { .type = NLA_BINARY,
272                               .len = IEEE80211_MAX_DATA_LEN },
273         [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
274         [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
275
276         [NL80211_ATTR_SSID] = { .type = NLA_BINARY,
277                                 .len = IEEE80211_MAX_SSID_LEN },
278         [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
279         [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
280         [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
281         [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
282         [NL80211_ATTR_USE_MFP] = { .type = NLA_U32 },
283         [NL80211_ATTR_STA_FLAGS2] = {
284                 .len = sizeof(struct nl80211_sta_flag_update),
285         },
286         [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
287         [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 },
288         [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG },
289         [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG },
290         [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 },
291         [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 },
292         [NL80211_ATTR_PID] = { .type = NLA_U32 },
293         [NL80211_ATTR_4ADDR] = { .type = NLA_U8 },
294         [NL80211_ATTR_PMKID] = { .len = WLAN_PMKID_LEN },
295         [NL80211_ATTR_DURATION] = { .type = NLA_U32 },
296         [NL80211_ATTR_COOKIE] = { .type = NLA_U64 },
297         [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED },
298         [NL80211_ATTR_FRAME] = { .type = NLA_BINARY,
299                                  .len = IEEE80211_MAX_DATA_LEN },
300         [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, },
301         [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 },
302         [NL80211_ATTR_CQM] = { .type = NLA_NESTED, },
303         [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG },
304         [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 },
305         [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
306         [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
307         [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
308         [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 },
309         [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 },
310         [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 },
311         [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG },
312         [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
313         [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED },
314         [NL80211_ATTR_STA_PLINK_STATE] = { .type = NLA_U8 },
315         [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 },
316         [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED },
317         [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED },
318         [NL80211_ATTR_HIDDEN_SSID] = { .type = NLA_U32 },
319         [NL80211_ATTR_IE_PROBE_RESP] = { .type = NLA_BINARY,
320                                          .len = IEEE80211_MAX_DATA_LEN },
321         [NL80211_ATTR_IE_ASSOC_RESP] = { .type = NLA_BINARY,
322                                          .len = IEEE80211_MAX_DATA_LEN },
323         [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG },
324         [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED },
325         [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG },
326         [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 },
327         [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 },
328         [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 },
329         [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG },
330         [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG },
331         [NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG },
332         [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
333         [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
334                                       .len = IEEE80211_MAX_DATA_LEN },
335         [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 },
336         [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG },
337         [NL80211_ATTR_HT_CAPABILITY_MASK] = {
338                 .len = NL80211_HT_CAPABILITY_LEN
339         },
340         [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 },
341         [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 },
342         [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 },
343         [NL80211_ATTR_WDEV] = { .type = NLA_U64 },
344         [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 },
345         [NL80211_ATTR_AUTH_DATA] = { .type = NLA_BINARY, },
346         [NL80211_ATTR_VHT_CAPABILITY] = { .len = NL80211_VHT_CAPABILITY_LEN },
347         [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
348         [NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 },
349         [NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 },
350         [NL80211_ATTR_LOCAL_MESH_POWER_MODE] = {. type = NLA_U32 },
351         [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 },
352         [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
353         [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
354         [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, },
355         [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, },
356         [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG },
357         [NL80211_ATTR_VHT_CAPABILITY_MASK] = {
358                 .len = NL80211_VHT_CAPABILITY_LEN,
359         },
360         [NL80211_ATTR_MDID] = { .type = NLA_U16 },
361         [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
362                                   .len = IEEE80211_MAX_DATA_LEN },
363         [NL80211_ATTR_PEER_AID] = { .type = NLA_U16 },
364         [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 },
365         [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG },
366         [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
367         [NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_BINARY },
368         [NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_BINARY },
369         [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY },
370         [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY },
371         [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG },
372         [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 },
373         [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 },
374         [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 },
375         [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
376         [NL80211_ATTR_QOS_MAP] = { .type = NLA_BINARY,
377                                    .len = IEEE80211_QOS_MAP_LEN_MAX },
378         [NL80211_ATTR_MAC_HINT] = { .len = ETH_ALEN },
379         [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 },
380         [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 },
381         [NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG },
382         [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY },
383         [NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG },
384         [NL80211_ATTR_TSID] = { .type = NLA_U8 },
385         [NL80211_ATTR_USER_PRIO] = { .type = NLA_U8 },
386         [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 },
387         [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 },
388         [NL80211_ATTR_MAC_MASK] = { .len = ETH_ALEN },
389         [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG },
390         [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 },
391         [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 },
392         [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG },
393         [NL80211_ATTR_PBSS] = { .type = NLA_FLAG },
394         [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED },
395         [NL80211_ATTR_STA_SUPPORT_P2P_PS] = { .type = NLA_U8 },
396         [NL80211_ATTR_MU_MIMO_GROUP_DATA] = {
397                 .len = VHT_MUMIMO_GROUPS_DATA_LEN
398         },
399         [NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = { .len = ETH_ALEN },
400         [NL80211_ATTR_NAN_MASTER_PREF] = { .type = NLA_U8 },
401         [NL80211_ATTR_BANDS] = { .type = NLA_U32 },
402         [NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED },
403         [NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY,
404                                     .len = FILS_MAX_KEK_LEN },
405         [NL80211_ATTR_FILS_NONCES] = { .len = 2 * FILS_NONCE_LEN },
406         [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, },
407         [NL80211_ATTR_BSSID] = { .len = ETH_ALEN },
408         [NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 },
409         [NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = {
410                 .len = sizeof(struct nl80211_bss_select_rssi_adjust)
411         },
412         [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 },
413         [NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY,
414                                              .len = FILS_ERP_MAX_USERNAME_LEN },
415         [NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY,
416                                           .len = FILS_ERP_MAX_REALM_LEN },
417         [NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 },
418         [NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY,
419                                         .len = FILS_ERP_MAX_RRK_LEN },
420         [NL80211_ATTR_FILS_CACHE_ID] = { .len = 2 },
421         [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN },
422         [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG },
423 };
424
425 /* policy for the key attributes */
426 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
427         [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
428         [NL80211_KEY_IDX] = { .type = NLA_U8 },
429         [NL80211_KEY_CIPHER] = { .type = NLA_U32 },
430         [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
431         [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG },
432         [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG },
433         [NL80211_KEY_TYPE] = { .type = NLA_U32 },
434         [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
435 };
436
437 /* policy for the key default flags */
438 static const struct nla_policy
439 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = {
440         [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG },
441         [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG },
442 };
443
444 #ifdef CONFIG_PM
445 /* policy for WoWLAN attributes */
446 static const struct nla_policy
447 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = {
448         [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG },
449         [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG },
450         [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG },
451         [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED },
452         [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG },
453         [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG },
454         [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG },
455         [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG },
456         [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED },
457         [NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED },
458 };
459
460 static const struct nla_policy
461 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = {
462         [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 },
463         [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 },
464         [NL80211_WOWLAN_TCP_DST_MAC] = { .len = ETH_ALEN },
465         [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 },
466         [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 },
467         [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = { .len = 1 },
468         [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = {
469                 .len = sizeof(struct nl80211_wowlan_tcp_data_seq)
470         },
471         [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = {
472                 .len = sizeof(struct nl80211_wowlan_tcp_data_token)
473         },
474         [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 },
475         [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = { .len = 1 },
476         [NL80211_WOWLAN_TCP_WAKE_MASK] = { .len = 1 },
477 };
478 #endif /* CONFIG_PM */
479
480 /* policy for coalesce rule attributes */
481 static const struct nla_policy
482 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = {
483         [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 },
484         [NL80211_ATTR_COALESCE_RULE_CONDITION] = { .type = NLA_U32 },
485         [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED },
486 };
487
488 /* policy for GTK rekey offload attributes */
489 static const struct nla_policy
490 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
491         [NL80211_REKEY_DATA_KEK] = { .len = NL80211_KEK_LEN },
492         [NL80211_REKEY_DATA_KCK] = { .len = NL80211_KCK_LEN },
493         [NL80211_REKEY_DATA_REPLAY_CTR] = { .len = NL80211_REPLAY_CTR_LEN },
494 };
495
496 static const struct nla_policy
497 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = {
498         [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY,
499                                                  .len = IEEE80211_MAX_SSID_LEN },
500         [NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = { .len = ETH_ALEN },
501         [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 },
502 };
503
504 static const struct nla_policy
505 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = {
506         [NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 },
507         [NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 },
508 };
509
510 static const struct nla_policy
511 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = {
512         [NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG },
513         [NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 },
514         [NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = {
515                 .len = sizeof(struct nl80211_bss_select_rssi_adjust)
516         },
517 };
518
519 /* policy for NAN function attributes */
520 static const struct nla_policy
521 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = {
522         [NL80211_NAN_FUNC_TYPE] = { .type = NLA_U8 },
523         [NL80211_NAN_FUNC_SERVICE_ID] = {
524                                     .len = NL80211_NAN_FUNC_SERVICE_ID_LEN },
525         [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 },
526         [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG },
527         [NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG },
528         [NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 },
529         [NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 },
530         [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = { .len = ETH_ALEN },
531         [NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG },
532         [NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 },
533         [NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY,
534                         .len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN },
535         [NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED },
536         [NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED },
537         [NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED },
538         [NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 },
539         [NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 },
540 };
541
542 /* policy for Service Response Filter attributes */
543 static const struct nla_policy
544 nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = {
545         [NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG },
546         [NL80211_NAN_SRF_BF] = { .type = NLA_BINARY,
547                                  .len =  NL80211_NAN_FUNC_SRF_MAX_LEN },
548         [NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 },
549         [NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED },
550 };
551
552 static int nl80211_prepare_wdev_dump(struct sk_buff *skb,
553                                      struct netlink_callback *cb,
554                                      struct cfg80211_registered_device **rdev,
555                                      struct wireless_dev **wdev)
556 {
557         int err;
558
559         if (!cb->args[0]) {
560                 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
561                                   genl_family_attrbuf(&nl80211_fam),
562                                   nl80211_fam.maxattr, nl80211_policy, NULL);
563                 if (err)
564                         return err;
565
566                 *wdev = __cfg80211_wdev_from_attrs(
567                                         sock_net(skb->sk),
568                                         genl_family_attrbuf(&nl80211_fam));
569                 if (IS_ERR(*wdev))
570                         return PTR_ERR(*wdev);
571                 *rdev = wiphy_to_rdev((*wdev)->wiphy);
572                 /* 0 is the first index - add 1 to parse only once */
573                 cb->args[0] = (*rdev)->wiphy_idx + 1;
574                 cb->args[1] = (*wdev)->identifier;
575         } else {
576                 /* subtract the 1 again here */
577                 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
578                 struct wireless_dev *tmp;
579
580                 if (!wiphy)
581                         return -ENODEV;
582                 *rdev = wiphy_to_rdev(wiphy);
583                 *wdev = NULL;
584
585                 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) {
586                         if (tmp->identifier == cb->args[1]) {
587                                 *wdev = tmp;
588                                 break;
589                         }
590                 }
591
592                 if (!*wdev)
593                         return -ENODEV;
594         }
595
596         return 0;
597 }
598
599 /* IE validation */
600 static bool is_valid_ie_attr(const struct nlattr *attr)
601 {
602         const u8 *pos;
603         int len;
604
605         if (!attr)
606                 return true;
607
608         pos = nla_data(attr);
609         len = nla_len(attr);
610
611         while (len) {
612                 u8 elemlen;
613
614                 if (len < 2)
615                         return false;
616                 len -= 2;
617
618                 elemlen = pos[1];
619                 if (elemlen > len)
620                         return false;
621
622                 len -= elemlen;
623                 pos += 2 + elemlen;
624         }
625
626         return true;
627 }
628
629 /* message building helper */
630 static inline void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
631                                    int flags, u8 cmd)
632 {
633         /* since there is no private header just add the generic one */
634         return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd);
635 }
636
637 static int nl80211_msg_put_channel(struct sk_buff *msg,
638                                    struct ieee80211_channel *chan,
639                                    bool large)
640 {
641         /* Some channels must be completely excluded from the
642          * list to protect old user-space tools from breaking
643          */
644         if (!large && chan->flags &
645             (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ))
646                 return 0;
647
648         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ,
649                         chan->center_freq))
650                 goto nla_put_failure;
651
652         if ((chan->flags & IEEE80211_CHAN_DISABLED) &&
653             nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED))
654                 goto nla_put_failure;
655         if (chan->flags & IEEE80211_CHAN_NO_IR) {
656                 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR))
657                         goto nla_put_failure;
658                 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS))
659                         goto nla_put_failure;
660         }
661         if (chan->flags & IEEE80211_CHAN_RADAR) {
662                 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
663                         goto nla_put_failure;
664                 if (large) {
665                         u32 time;
666
667                         time = elapsed_jiffies_msecs(chan->dfs_state_entered);
668
669                         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE,
670                                         chan->dfs_state))
671                                 goto nla_put_failure;
672                         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME,
673                                         time))
674                                 goto nla_put_failure;
675                         if (nla_put_u32(msg,
676                                         NL80211_FREQUENCY_ATTR_DFS_CAC_TIME,
677                                         chan->dfs_cac_ms))
678                                 goto nla_put_failure;
679                 }
680         }
681
682         if (large) {
683                 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
684                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
685                         goto nla_put_failure;
686                 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) &&
687                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS))
688                         goto nla_put_failure;
689                 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) &&
690                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ))
691                         goto nla_put_failure;
692                 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) &&
693                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ))
694                         goto nla_put_failure;
695                 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) &&
696                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY))
697                         goto nla_put_failure;
698                 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) &&
699                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT))
700                         goto nla_put_failure;
701                 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) &&
702                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ))
703                         goto nla_put_failure;
704                 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) &&
705                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ))
706                         goto nla_put_failure;
707         }
708
709         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
710                         DBM_TO_MBM(chan->max_power)))
711                 goto nla_put_failure;
712
713         return 0;
714
715  nla_put_failure:
716         return -ENOBUFS;
717 }
718
719 /* netlink command implementations */
720
721 struct key_parse {
722         struct key_params p;
723         int idx;
724         int type;
725         bool def, defmgmt;
726         bool def_uni, def_multi;
727 };
728
729 static int nl80211_parse_key_new(struct nlattr *key, struct key_parse *k)
730 {
731         struct nlattr *tb[NL80211_KEY_MAX + 1];
732         int err = nla_parse_nested(tb, NL80211_KEY_MAX, key,
733                                    nl80211_key_policy, NULL);
734         if (err)
735                 return err;
736
737         k->def = !!tb[NL80211_KEY_DEFAULT];
738         k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT];
739
740         if (k->def) {
741                 k->def_uni = true;
742                 k->def_multi = true;
743         }
744         if (k->defmgmt)
745                 k->def_multi = true;
746
747         if (tb[NL80211_KEY_IDX])
748                 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]);
749
750         if (tb[NL80211_KEY_DATA]) {
751                 k->p.key = nla_data(tb[NL80211_KEY_DATA]);
752                 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]);
753         }
754
755         if (tb[NL80211_KEY_SEQ]) {
756                 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]);
757                 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]);
758         }
759
760         if (tb[NL80211_KEY_CIPHER])
761                 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]);
762
763         if (tb[NL80211_KEY_TYPE]) {
764                 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]);
765                 if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
766                         return -EINVAL;
767         }
768
769         if (tb[NL80211_KEY_DEFAULT_TYPES]) {
770                 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
771
772                 err = nla_parse_nested(kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
773                                        tb[NL80211_KEY_DEFAULT_TYPES],
774                                        nl80211_key_default_policy, NULL);
775                 if (err)
776                         return err;
777
778                 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
779                 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
780         }
781
782         return 0;
783 }
784
785 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
786 {
787         if (info->attrs[NL80211_ATTR_KEY_DATA]) {
788                 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
789                 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
790         }
791
792         if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
793                 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
794                 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
795         }
796
797         if (info->attrs[NL80211_ATTR_KEY_IDX])
798                 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
799
800         if (info->attrs[NL80211_ATTR_KEY_CIPHER])
801                 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
802
803         k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
804         k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
805
806         if (k->def) {
807                 k->def_uni = true;
808                 k->def_multi = true;
809         }
810         if (k->defmgmt)
811                 k->def_multi = true;
812
813         if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
814                 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
815                 if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
816                         return -EINVAL;
817         }
818
819         if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
820                 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
821                 int err = nla_parse_nested(kdt,
822                                            NUM_NL80211_KEY_DEFAULT_TYPES - 1,
823                                            info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
824                                            nl80211_key_default_policy,
825                                            info->extack);
826                 if (err)
827                         return err;
828
829                 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
830                 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
831         }
832
833         return 0;
834 }
835
836 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
837 {
838         int err;
839
840         memset(k, 0, sizeof(*k));
841         k->idx = -1;
842         k->type = -1;
843
844         if (info->attrs[NL80211_ATTR_KEY])
845                 err = nl80211_parse_key_new(info->attrs[NL80211_ATTR_KEY], k);
846         else
847                 err = nl80211_parse_key_old(info, k);
848
849         if (err)
850                 return err;
851
852         if (k->def && k->defmgmt)
853                 return -EINVAL;
854
855         if (k->defmgmt) {
856                 if (k->def_uni || !k->def_multi)
857                         return -EINVAL;
858         }
859
860         if (k->idx != -1) {
861                 if (k->defmgmt) {
862                         if (k->idx < 4 || k->idx > 5)
863                                 return -EINVAL;
864                 } else if (k->def) {
865                         if (k->idx < 0 || k->idx > 3)
866                                 return -EINVAL;
867                 } else {
868                         if (k->idx < 0 || k->idx > 5)
869                                 return -EINVAL;
870                 }
871         }
872
873         return 0;
874 }
875
876 static struct cfg80211_cached_keys *
877 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
878                        struct nlattr *keys, bool *no_ht)
879 {
880         struct key_parse parse;
881         struct nlattr *key;
882         struct cfg80211_cached_keys *result;
883         int rem, err, def = 0;
884         bool have_key = false;
885
886         nla_for_each_nested(key, keys, rem) {
887                 have_key = true;
888                 break;
889         }
890
891         if (!have_key)
892                 return NULL;
893
894         result = kzalloc(sizeof(*result), GFP_KERNEL);
895         if (!result)
896                 return ERR_PTR(-ENOMEM);
897
898         result->def = -1;
899
900         nla_for_each_nested(key, keys, rem) {
901                 memset(&parse, 0, sizeof(parse));
902                 parse.idx = -1;
903
904                 err = nl80211_parse_key_new(key, &parse);
905                 if (err)
906                         goto error;
907                 err = -EINVAL;
908                 if (!parse.p.key)
909                         goto error;
910                 if (parse.idx < 0 || parse.idx > 3)
911                         goto error;
912                 if (parse.def) {
913                         if (def)
914                                 goto error;
915                         def = 1;
916                         result->def = parse.idx;
917                         if (!parse.def_uni || !parse.def_multi)
918                                 goto error;
919                 } else if (parse.defmgmt)
920                         goto error;
921                 err = cfg80211_validate_key_settings(rdev, &parse.p,
922                                                      parse.idx, false, NULL);
923                 if (err)
924                         goto error;
925                 if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 &&
926                     parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) {
927                         err = -EINVAL;
928                         goto error;
929                 }
930                 result->params[parse.idx].cipher = parse.p.cipher;
931                 result->params[parse.idx].key_len = parse.p.key_len;
932                 result->params[parse.idx].key = result->data[parse.idx];
933                 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len);
934
935                 /* must be WEP key if we got here */
936                 if (no_ht)
937                         *no_ht = true;
938         }
939
940         if (result->def < 0) {
941                 err = -EINVAL;
942                 goto error;
943         }
944
945         return result;
946  error:
947         kfree(result);
948         return ERR_PTR(err);
949 }
950
951 static int nl80211_key_allowed(struct wireless_dev *wdev)
952 {
953         ASSERT_WDEV_LOCK(wdev);
954
955         switch (wdev->iftype) {
956         case NL80211_IFTYPE_AP:
957         case NL80211_IFTYPE_AP_VLAN:
958         case NL80211_IFTYPE_P2P_GO:
959         case NL80211_IFTYPE_MESH_POINT:
960                 break;
961         case NL80211_IFTYPE_ADHOC:
962         case NL80211_IFTYPE_STATION:
963         case NL80211_IFTYPE_P2P_CLIENT:
964                 if (!wdev->current_bss)
965                         return -ENOLINK;
966                 break;
967         case NL80211_IFTYPE_UNSPECIFIED:
968         case NL80211_IFTYPE_OCB:
969         case NL80211_IFTYPE_MONITOR:
970         case NL80211_IFTYPE_NAN:
971         case NL80211_IFTYPE_P2P_DEVICE:
972         case NL80211_IFTYPE_WDS:
973         case NUM_NL80211_IFTYPES:
974                 return -EINVAL;
975         }
976
977         return 0;
978 }
979
980 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy,
981                                                         struct nlattr *tb)
982 {
983         struct ieee80211_channel *chan;
984
985         if (tb == NULL)
986                 return NULL;
987         chan = ieee80211_get_channel(wiphy, nla_get_u32(tb));
988         if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
989                 return NULL;
990         return chan;
991 }
992
993 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
994 {
995         struct nlattr *nl_modes = nla_nest_start(msg, attr);
996         int i;
997
998         if (!nl_modes)
999                 goto nla_put_failure;
1000
1001         i = 0;
1002         while (ifmodes) {
1003                 if ((ifmodes & 1) && nla_put_flag(msg, i))
1004                         goto nla_put_failure;
1005                 ifmodes >>= 1;
1006                 i++;
1007         }
1008
1009         nla_nest_end(msg, nl_modes);
1010         return 0;
1011
1012 nla_put_failure:
1013         return -ENOBUFS;
1014 }
1015
1016 static int nl80211_put_iface_combinations(struct wiphy *wiphy,
1017                                           struct sk_buff *msg,
1018                                           bool large)
1019 {
1020         struct nlattr *nl_combis;
1021         int i, j;
1022
1023         nl_combis = nla_nest_start(msg,
1024                                 NL80211_ATTR_INTERFACE_COMBINATIONS);
1025         if (!nl_combis)
1026                 goto nla_put_failure;
1027
1028         for (i = 0; i < wiphy->n_iface_combinations; i++) {
1029                 const struct ieee80211_iface_combination *c;
1030                 struct nlattr *nl_combi, *nl_limits;
1031
1032                 c = &wiphy->iface_combinations[i];
1033
1034                 nl_combi = nla_nest_start(msg, i + 1);
1035                 if (!nl_combi)
1036                         goto nla_put_failure;
1037
1038                 nl_limits = nla_nest_start(msg, NL80211_IFACE_COMB_LIMITS);
1039                 if (!nl_limits)
1040                         goto nla_put_failure;
1041
1042                 for (j = 0; j < c->n_limits; j++) {
1043                         struct nlattr *nl_limit;
1044
1045                         nl_limit = nla_nest_start(msg, j + 1);
1046                         if (!nl_limit)
1047                                 goto nla_put_failure;
1048                         if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX,
1049                                         c->limits[j].max))
1050                                 goto nla_put_failure;
1051                         if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
1052                                                 c->limits[j].types))
1053                                 goto nla_put_failure;
1054                         nla_nest_end(msg, nl_limit);
1055                 }
1056
1057                 nla_nest_end(msg, nl_limits);
1058
1059                 if (c->beacon_int_infra_match &&
1060                     nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
1061                         goto nla_put_failure;
1062                 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
1063                                 c->num_different_channels) ||
1064                     nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
1065                                 c->max_interfaces))
1066                         goto nla_put_failure;
1067                 if (large &&
1068                     (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
1069                                 c->radar_detect_widths) ||
1070                      nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
1071                                 c->radar_detect_regions)))
1072                         goto nla_put_failure;
1073                 if (c->beacon_int_min_gcd &&
1074                     nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD,
1075                                 c->beacon_int_min_gcd))
1076                         goto nla_put_failure;
1077
1078                 nla_nest_end(msg, nl_combi);
1079         }
1080
1081         nla_nest_end(msg, nl_combis);
1082
1083         return 0;
1084 nla_put_failure:
1085         return -ENOBUFS;
1086 }
1087
1088 #ifdef CONFIG_PM
1089 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev,
1090                                         struct sk_buff *msg)
1091 {
1092         const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp;
1093         struct nlattr *nl_tcp;
1094
1095         if (!tcp)
1096                 return 0;
1097
1098         nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
1099         if (!nl_tcp)
1100                 return -ENOBUFS;
1101
1102         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
1103                         tcp->data_payload_max))
1104                 return -ENOBUFS;
1105
1106         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
1107                         tcp->data_payload_max))
1108                 return -ENOBUFS;
1109
1110         if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ))
1111                 return -ENOBUFS;
1112
1113         if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
1114                                 sizeof(*tcp->tok), tcp->tok))
1115                 return -ENOBUFS;
1116
1117         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
1118                         tcp->data_interval_max))
1119                 return -ENOBUFS;
1120
1121         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
1122                         tcp->wake_payload_max))
1123                 return -ENOBUFS;
1124
1125         nla_nest_end(msg, nl_tcp);
1126         return 0;
1127 }
1128
1129 static int nl80211_send_wowlan(struct sk_buff *msg,
1130                                struct cfg80211_registered_device *rdev,
1131                                bool large)
1132 {
1133         struct nlattr *nl_wowlan;
1134
1135         if (!rdev->wiphy.wowlan)
1136                 return 0;
1137
1138         nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED);
1139         if (!nl_wowlan)
1140                 return -ENOBUFS;
1141
1142         if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) &&
1143              nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
1144             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) &&
1145              nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
1146             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) &&
1147              nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
1148             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) &&
1149              nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) ||
1150             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
1151              nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
1152             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) &&
1153              nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
1154             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) &&
1155              nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
1156             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) &&
1157              nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
1158                 return -ENOBUFS;
1159
1160         if (rdev->wiphy.wowlan->n_patterns) {
1161                 struct nl80211_pattern_support pat = {
1162                         .max_patterns = rdev->wiphy.wowlan->n_patterns,
1163                         .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len,
1164                         .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len,
1165                         .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset,
1166                 };
1167
1168                 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
1169                             sizeof(pat), &pat))
1170                         return -ENOBUFS;
1171         }
1172
1173         if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) &&
1174             nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT,
1175                         rdev->wiphy.wowlan->max_nd_match_sets))
1176                 return -ENOBUFS;
1177
1178         if (large && nl80211_send_wowlan_tcp_caps(rdev, msg))
1179                 return -ENOBUFS;
1180
1181         nla_nest_end(msg, nl_wowlan);
1182
1183         return 0;
1184 }
1185 #endif
1186
1187 static int nl80211_send_coalesce(struct sk_buff *msg,
1188                                  struct cfg80211_registered_device *rdev)
1189 {
1190         struct nl80211_coalesce_rule_support rule;
1191
1192         if (!rdev->wiphy.coalesce)
1193                 return 0;
1194
1195         rule.max_rules = rdev->wiphy.coalesce->n_rules;
1196         rule.max_delay = rdev->wiphy.coalesce->max_delay;
1197         rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns;
1198         rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len;
1199         rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len;
1200         rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset;
1201
1202         if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule))
1203                 return -ENOBUFS;
1204
1205         return 0;
1206 }
1207
1208 static int nl80211_send_band_rateinfo(struct sk_buff *msg,
1209                                       struct ieee80211_supported_band *sband)
1210 {
1211         struct nlattr *nl_rates, *nl_rate;
1212         struct ieee80211_rate *rate;
1213         int i;
1214
1215         /* add HT info */
1216         if (sband->ht_cap.ht_supported &&
1217             (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET,
1218                      sizeof(sband->ht_cap.mcs),
1219                      &sband->ht_cap.mcs) ||
1220              nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA,
1221                          sband->ht_cap.cap) ||
1222              nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
1223                         sband->ht_cap.ampdu_factor) ||
1224              nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
1225                         sband->ht_cap.ampdu_density)))
1226                 return -ENOBUFS;
1227
1228         /* add VHT info */
1229         if (sband->vht_cap.vht_supported &&
1230             (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET,
1231                      sizeof(sband->vht_cap.vht_mcs),
1232                      &sband->vht_cap.vht_mcs) ||
1233              nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA,
1234                          sband->vht_cap.cap)))
1235                 return -ENOBUFS;
1236
1237         /* add bitrates */
1238         nl_rates = nla_nest_start(msg, NL80211_BAND_ATTR_RATES);
1239         if (!nl_rates)
1240                 return -ENOBUFS;
1241
1242         for (i = 0; i < sband->n_bitrates; i++) {
1243                 nl_rate = nla_nest_start(msg, i);
1244                 if (!nl_rate)
1245                         return -ENOBUFS;
1246
1247                 rate = &sband->bitrates[i];
1248                 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE,
1249                                 rate->bitrate))
1250                         return -ENOBUFS;
1251                 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) &&
1252                     nla_put_flag(msg,
1253                                  NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE))
1254                         return -ENOBUFS;
1255
1256                 nla_nest_end(msg, nl_rate);
1257         }
1258
1259         nla_nest_end(msg, nl_rates);
1260
1261         return 0;
1262 }
1263
1264 static int
1265 nl80211_send_mgmt_stypes(struct sk_buff *msg,
1266                          const struct ieee80211_txrx_stypes *mgmt_stypes)
1267 {
1268         u16 stypes;
1269         struct nlattr *nl_ftypes, *nl_ifs;
1270         enum nl80211_iftype ift;
1271         int i;
1272
1273         if (!mgmt_stypes)
1274                 return 0;
1275
1276         nl_ifs = nla_nest_start(msg, NL80211_ATTR_TX_FRAME_TYPES);
1277         if (!nl_ifs)
1278                 return -ENOBUFS;
1279
1280         for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1281                 nl_ftypes = nla_nest_start(msg, ift);
1282                 if (!nl_ftypes)
1283                         return -ENOBUFS;
1284                 i = 0;
1285                 stypes = mgmt_stypes[ift].tx;
1286                 while (stypes) {
1287                         if ((stypes & 1) &&
1288                             nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1289                                         (i << 4) | IEEE80211_FTYPE_MGMT))
1290                                 return -ENOBUFS;
1291                         stypes >>= 1;
1292                         i++;
1293                 }
1294                 nla_nest_end(msg, nl_ftypes);
1295         }
1296
1297         nla_nest_end(msg, nl_ifs);
1298
1299         nl_ifs = nla_nest_start(msg, NL80211_ATTR_RX_FRAME_TYPES);
1300         if (!nl_ifs)
1301                 return -ENOBUFS;
1302
1303         for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1304                 nl_ftypes = nla_nest_start(msg, ift);
1305                 if (!nl_ftypes)
1306                         return -ENOBUFS;
1307                 i = 0;
1308                 stypes = mgmt_stypes[ift].rx;
1309                 while (stypes) {
1310                         if ((stypes & 1) &&
1311                             nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1312                                         (i << 4) | IEEE80211_FTYPE_MGMT))
1313                                 return -ENOBUFS;
1314                         stypes >>= 1;
1315                         i++;
1316                 }
1317                 nla_nest_end(msg, nl_ftypes);
1318         }
1319         nla_nest_end(msg, nl_ifs);
1320
1321         return 0;
1322 }
1323
1324 #define CMD(op, n)                                                      \
1325          do {                                                           \
1326                 if (rdev->ops->op) {                                    \
1327                         i++;                                            \
1328                         if (nla_put_u32(msg, i, NL80211_CMD_ ## n))     \
1329                                 goto nla_put_failure;                   \
1330                 }                                                       \
1331         } while (0)
1332
1333 static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev,
1334                                         struct sk_buff *msg)
1335 {
1336         int i = 0;
1337
1338         /*
1339          * do *NOT* add anything into this function, new things need to be
1340          * advertised only to new versions of userspace that can deal with
1341          * the split (and they can't possibly care about new features...
1342          */
1343         CMD(add_virtual_intf, NEW_INTERFACE);
1344         CMD(change_virtual_intf, SET_INTERFACE);
1345         CMD(add_key, NEW_KEY);
1346         CMD(start_ap, START_AP);
1347         CMD(add_station, NEW_STATION);
1348         CMD(add_mpath, NEW_MPATH);
1349         CMD(update_mesh_config, SET_MESH_CONFIG);
1350         CMD(change_bss, SET_BSS);
1351         CMD(auth, AUTHENTICATE);
1352         CMD(assoc, ASSOCIATE);
1353         CMD(deauth, DEAUTHENTICATE);
1354         CMD(disassoc, DISASSOCIATE);
1355         CMD(join_ibss, JOIN_IBSS);
1356         CMD(join_mesh, JOIN_MESH);
1357         CMD(set_pmksa, SET_PMKSA);
1358         CMD(del_pmksa, DEL_PMKSA);
1359         CMD(flush_pmksa, FLUSH_PMKSA);
1360         if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)
1361                 CMD(remain_on_channel, REMAIN_ON_CHANNEL);
1362         CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
1363         CMD(mgmt_tx, FRAME);
1364         CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL);
1365         if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) {
1366                 i++;
1367                 if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS))
1368                         goto nla_put_failure;
1369         }
1370         if (rdev->ops->set_monitor_channel || rdev->ops->start_ap ||
1371             rdev->ops->join_mesh) {
1372                 i++;
1373                 if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL))
1374                         goto nla_put_failure;
1375         }
1376         CMD(set_wds_peer, SET_WDS_PEER);
1377         if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) {
1378                 CMD(tdls_mgmt, TDLS_MGMT);
1379                 CMD(tdls_oper, TDLS_OPER);
1380         }
1381         if (rdev->wiphy.max_sched_scan_reqs)
1382                 CMD(sched_scan_start, START_SCHED_SCAN);
1383         CMD(probe_client, PROBE_CLIENT);
1384         CMD(set_noack_map, SET_NOACK_MAP);
1385         if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) {
1386                 i++;
1387                 if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS))
1388                         goto nla_put_failure;
1389         }
1390         CMD(start_p2p_device, START_P2P_DEVICE);
1391         CMD(set_mcast_rate, SET_MCAST_RATE);
1392 #ifdef CONFIG_NL80211_TESTMODE
1393         CMD(testmode_cmd, TESTMODE);
1394 #endif
1395
1396         if (rdev->ops->connect || rdev->ops->auth) {
1397                 i++;
1398                 if (nla_put_u32(msg, i, NL80211_CMD_CONNECT))
1399                         goto nla_put_failure;
1400         }
1401
1402         if (rdev->ops->disconnect || rdev->ops->deauth) {
1403                 i++;
1404                 if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT))
1405                         goto nla_put_failure;
1406         }
1407
1408         return i;
1409  nla_put_failure:
1410         return -ENOBUFS;
1411 }
1412
1413 struct nl80211_dump_wiphy_state {
1414         s64 filter_wiphy;
1415         long start;
1416         long split_start, band_start, chan_start, capa_start;
1417         bool split;
1418 };
1419
1420 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
1421                               enum nl80211_commands cmd,
1422                               struct sk_buff *msg, u32 portid, u32 seq,
1423                               int flags, struct nl80211_dump_wiphy_state *state)
1424 {
1425         void *hdr;
1426         struct nlattr *nl_bands, *nl_band;
1427         struct nlattr *nl_freqs, *nl_freq;
1428         struct nlattr *nl_cmds;
1429         enum nl80211_band band;
1430         struct ieee80211_channel *chan;
1431         int i;
1432         const struct ieee80211_txrx_stypes *mgmt_stypes =
1433                                 rdev->wiphy.mgmt_stypes;
1434         u32 features;
1435
1436         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
1437         if (!hdr)
1438                 return -ENOBUFS;
1439
1440         if (WARN_ON(!state))
1441                 return -EINVAL;
1442
1443         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
1444             nla_put_string(msg, NL80211_ATTR_WIPHY_NAME,
1445                            wiphy_name(&rdev->wiphy)) ||
1446             nla_put_u32(msg, NL80211_ATTR_GENERATION,
1447                         cfg80211_rdev_list_generation))
1448                 goto nla_put_failure;
1449
1450         if (cmd != NL80211_CMD_NEW_WIPHY)
1451                 goto finish;
1452
1453         switch (state->split_start) {
1454         case 0:
1455                 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
1456                                rdev->wiphy.retry_short) ||
1457                     nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
1458                                rdev->wiphy.retry_long) ||
1459                     nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
1460                                 rdev->wiphy.frag_threshold) ||
1461                     nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
1462                                 rdev->wiphy.rts_threshold) ||
1463                     nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS,
1464                                rdev->wiphy.coverage_class) ||
1465                     nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
1466                                rdev->wiphy.max_scan_ssids) ||
1467                     nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
1468                                rdev->wiphy.max_sched_scan_ssids) ||
1469                     nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
1470                                 rdev->wiphy.max_scan_ie_len) ||
1471                     nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
1472                                 rdev->wiphy.max_sched_scan_ie_len) ||
1473                     nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS,
1474                                rdev->wiphy.max_match_sets) ||
1475                     nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS,
1476                                 rdev->wiphy.max_sched_scan_plans) ||
1477                     nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL,
1478                                 rdev->wiphy.max_sched_scan_plan_interval) ||
1479                     nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
1480                                 rdev->wiphy.max_sched_scan_plan_iterations))
1481                         goto nla_put_failure;
1482
1483                 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) &&
1484                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN))
1485                         goto nla_put_failure;
1486                 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
1487                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH))
1488                         goto nla_put_failure;
1489                 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) &&
1490                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD))
1491                         goto nla_put_failure;
1492                 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) &&
1493                     nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT))
1494                         goto nla_put_failure;
1495                 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) &&
1496                     nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT))
1497                         goto nla_put_failure;
1498                 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) &&
1499                     nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP))
1500                         goto nla_put_failure;
1501                 state->split_start++;
1502                 if (state->split)
1503                         break;
1504         case 1:
1505                 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES,
1506                             sizeof(u32) * rdev->wiphy.n_cipher_suites,
1507                             rdev->wiphy.cipher_suites))
1508                         goto nla_put_failure;
1509
1510                 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS,
1511                                rdev->wiphy.max_num_pmkids))
1512                         goto nla_put_failure;
1513
1514                 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
1515                     nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE))
1516                         goto nla_put_failure;
1517
1518                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
1519                                 rdev->wiphy.available_antennas_tx) ||
1520                     nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
1521                                 rdev->wiphy.available_antennas_rx))
1522                         goto nla_put_failure;
1523
1524                 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) &&
1525                     nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD,
1526                                 rdev->wiphy.probe_resp_offload))
1527                         goto nla_put_failure;
1528
1529                 if ((rdev->wiphy.available_antennas_tx ||
1530                      rdev->wiphy.available_antennas_rx) &&
1531                     rdev->ops->get_antenna) {
1532                         u32 tx_ant = 0, rx_ant = 0;
1533                         int res;
1534
1535                         res = rdev_get_antenna(rdev, &tx_ant, &rx_ant);
1536                         if (!res) {
1537                                 if (nla_put_u32(msg,
1538                                                 NL80211_ATTR_WIPHY_ANTENNA_TX,
1539                                                 tx_ant) ||
1540                                     nla_put_u32(msg,
1541                                                 NL80211_ATTR_WIPHY_ANTENNA_RX,
1542                                                 rx_ant))
1543                                         goto nla_put_failure;
1544                         }
1545                 }
1546
1547                 state->split_start++;
1548                 if (state->split)
1549                         break;
1550         case 2:
1551                 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
1552                                         rdev->wiphy.interface_modes))
1553                                 goto nla_put_failure;
1554                 state->split_start++;
1555                 if (state->split)
1556                         break;
1557         case 3:
1558                 nl_bands = nla_nest_start(msg, NL80211_ATTR_WIPHY_BANDS);
1559                 if (!nl_bands)
1560                         goto nla_put_failure;
1561
1562                 for (band = state->band_start;
1563                      band < NUM_NL80211_BANDS; band++) {
1564                         struct ieee80211_supported_band *sband;
1565
1566                         sband = rdev->wiphy.bands[band];
1567
1568                         if (!sband)
1569                                 continue;
1570
1571                         nl_band = nla_nest_start(msg, band);
1572                         if (!nl_band)
1573                                 goto nla_put_failure;
1574
1575                         switch (state->chan_start) {
1576                         case 0:
1577                                 if (nl80211_send_band_rateinfo(msg, sband))
1578                                         goto nla_put_failure;
1579                                 state->chan_start++;
1580                                 if (state->split)
1581                                         break;
1582                         default:
1583                                 /* add frequencies */
1584                                 nl_freqs = nla_nest_start(
1585                                         msg, NL80211_BAND_ATTR_FREQS);
1586                                 if (!nl_freqs)
1587                                         goto nla_put_failure;
1588
1589                                 for (i = state->chan_start - 1;
1590                                      i < sband->n_channels;
1591                                      i++) {
1592                                         nl_freq = nla_nest_start(msg, i);
1593                                         if (!nl_freq)
1594                                                 goto nla_put_failure;
1595
1596                                         chan = &sband->channels[i];
1597
1598                                         if (nl80211_msg_put_channel(
1599                                                         msg, chan,
1600                                                         state->split))
1601                                                 goto nla_put_failure;
1602
1603                                         nla_nest_end(msg, nl_freq);
1604                                         if (state->split)
1605                                                 break;
1606                                 }
1607                                 if (i < sband->n_channels)
1608                                         state->chan_start = i + 2;
1609                                 else
1610                                         state->chan_start = 0;
1611                                 nla_nest_end(msg, nl_freqs);
1612                         }
1613
1614                         nla_nest_end(msg, nl_band);
1615
1616                         if (state->split) {
1617                                 /* start again here */
1618                                 if (state->chan_start)
1619                                         band--;
1620                                 break;
1621                         }
1622                 }
1623                 nla_nest_end(msg, nl_bands);
1624
1625                 if (band < NUM_NL80211_BANDS)
1626                         state->band_start = band + 1;
1627                 else
1628                         state->band_start = 0;
1629
1630                 /* if bands & channels are done, continue outside */
1631                 if (state->band_start == 0 && state->chan_start == 0)
1632                         state->split_start++;
1633                 if (state->split)
1634                         break;
1635         case 4:
1636                 nl_cmds = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_COMMANDS);
1637                 if (!nl_cmds)
1638                         goto nla_put_failure;
1639
1640                 i = nl80211_add_commands_unsplit(rdev, msg);
1641                 if (i < 0)
1642                         goto nla_put_failure;
1643                 if (state->split) {
1644                         CMD(crit_proto_start, CRIT_PROTOCOL_START);
1645                         CMD(crit_proto_stop, CRIT_PROTOCOL_STOP);
1646                         if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)
1647                                 CMD(channel_switch, CHANNEL_SWITCH);
1648                         CMD(set_qos_map, SET_QOS_MAP);
1649                         if (rdev->wiphy.features &
1650                                         NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)
1651                                 CMD(add_tx_ts, ADD_TX_TS);
1652                         CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST);
1653                         CMD(update_connect_params, UPDATE_CONNECT_PARAMS);
1654                 }
1655 #undef CMD
1656
1657                 nla_nest_end(msg, nl_cmds);
1658                 state->split_start++;
1659                 if (state->split)
1660                         break;
1661         case 5:
1662                 if (rdev->ops->remain_on_channel &&
1663                     (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) &&
1664                     nla_put_u32(msg,
1665                                 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
1666                                 rdev->wiphy.max_remain_on_channel_duration))
1667                         goto nla_put_failure;
1668
1669                 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) &&
1670                     nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK))
1671                         goto nla_put_failure;
1672
1673                 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes))
1674                         goto nla_put_failure;
1675                 state->split_start++;
1676                 if (state->split)
1677                         break;
1678         case 6:
1679 #ifdef CONFIG_PM
1680                 if (nl80211_send_wowlan(msg, rdev, state->split))
1681                         goto nla_put_failure;
1682                 state->split_start++;
1683                 if (state->split)
1684                         break;
1685 #else
1686                 state->split_start++;
1687 #endif
1688         case 7:
1689                 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
1690                                         rdev->wiphy.software_iftypes))
1691                         goto nla_put_failure;
1692
1693                 if (nl80211_put_iface_combinations(&rdev->wiphy, msg,
1694                                                    state->split))
1695                         goto nla_put_failure;
1696
1697                 state->split_start++;
1698                 if (state->split)
1699                         break;
1700         case 8:
1701                 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) &&
1702                     nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME,
1703                                 rdev->wiphy.ap_sme_capa))
1704                         goto nla_put_failure;
1705
1706                 features = rdev->wiphy.features;
1707                 /*
1708                  * We can only add the per-channel limit information if the
1709                  * dump is split, otherwise it makes it too big. Therefore
1710                  * only advertise it in that case.
1711                  */
1712                 if (state->split)
1713                         features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS;
1714                 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features))
1715                         goto nla_put_failure;
1716
1717                 if (rdev->wiphy.ht_capa_mod_mask &&
1718                     nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK,
1719                             sizeof(*rdev->wiphy.ht_capa_mod_mask),
1720                             rdev->wiphy.ht_capa_mod_mask))
1721                         goto nla_put_failure;
1722
1723                 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME &&
1724                     rdev->wiphy.max_acl_mac_addrs &&
1725                     nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX,
1726                                 rdev->wiphy.max_acl_mac_addrs))
1727                         goto nla_put_failure;
1728
1729                 /*
1730                  * Any information below this point is only available to
1731                  * applications that can deal with it being split. This
1732                  * helps ensure that newly added capabilities don't break
1733                  * older tools by overrunning their buffers.
1734                  *
1735                  * We still increment split_start so that in the split
1736                  * case we'll continue with more data in the next round,
1737                  * but break unconditionally so unsplit data stops here.
1738                  */
1739                 state->split_start++;
1740                 break;
1741         case 9:
1742                 if (rdev->wiphy.extended_capabilities &&
1743                     (nla_put(msg, NL80211_ATTR_EXT_CAPA,
1744                              rdev->wiphy.extended_capabilities_len,
1745                              rdev->wiphy.extended_capabilities) ||
1746                      nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
1747                              rdev->wiphy.extended_capabilities_len,
1748                              rdev->wiphy.extended_capabilities_mask)))
1749                         goto nla_put_failure;
1750
1751                 if (rdev->wiphy.vht_capa_mod_mask &&
1752                     nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK,
1753                             sizeof(*rdev->wiphy.vht_capa_mod_mask),
1754                             rdev->wiphy.vht_capa_mod_mask))
1755                         goto nla_put_failure;
1756
1757                 state->split_start++;
1758                 break;
1759         case 10:
1760                 if (nl80211_send_coalesce(msg, rdev))
1761                         goto nla_put_failure;
1762
1763                 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) &&
1764                     (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) ||
1765                      nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ)))
1766                         goto nla_put_failure;
1767
1768                 if (rdev->wiphy.max_ap_assoc_sta &&
1769                     nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA,
1770                                 rdev->wiphy.max_ap_assoc_sta))
1771                         goto nla_put_failure;
1772
1773                 state->split_start++;
1774                 break;
1775         case 11:
1776                 if (rdev->wiphy.n_vendor_commands) {
1777                         const struct nl80211_vendor_cmd_info *info;
1778                         struct nlattr *nested;
1779
1780                         nested = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA);
1781                         if (!nested)
1782                                 goto nla_put_failure;
1783
1784                         for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
1785                                 info = &rdev->wiphy.vendor_commands[i].info;
1786                                 if (nla_put(msg, i + 1, sizeof(*info), info))
1787                                         goto nla_put_failure;
1788                         }
1789                         nla_nest_end(msg, nested);
1790                 }
1791
1792                 if (rdev->wiphy.n_vendor_events) {
1793                         const struct nl80211_vendor_cmd_info *info;
1794                         struct nlattr *nested;
1795
1796                         nested = nla_nest_start(msg,
1797                                                 NL80211_ATTR_VENDOR_EVENTS);
1798                         if (!nested)
1799                                 goto nla_put_failure;
1800
1801                         for (i = 0; i < rdev->wiphy.n_vendor_events; i++) {
1802                                 info = &rdev->wiphy.vendor_events[i];
1803                                 if (nla_put(msg, i + 1, sizeof(*info), info))
1804                                         goto nla_put_failure;
1805                         }
1806                         nla_nest_end(msg, nested);
1807                 }
1808                 state->split_start++;
1809                 break;
1810         case 12:
1811                 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH &&
1812                     nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS,
1813                                rdev->wiphy.max_num_csa_counters))
1814                         goto nla_put_failure;
1815
1816                 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
1817                     nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
1818                         goto nla_put_failure;
1819
1820                 if (rdev->wiphy.max_sched_scan_reqs &&
1821                     nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS,
1822                                 rdev->wiphy.max_sched_scan_reqs))
1823                         goto nla_put_failure;
1824
1825                 if (nla_put(msg, NL80211_ATTR_EXT_FEATURES,
1826                             sizeof(rdev->wiphy.ext_features),
1827                             rdev->wiphy.ext_features))
1828                         goto nla_put_failure;
1829
1830                 if (rdev->wiphy.bss_select_support) {
1831                         struct nlattr *nested;
1832                         u32 bss_select_support = rdev->wiphy.bss_select_support;
1833
1834                         nested = nla_nest_start(msg, NL80211_ATTR_BSS_SELECT);
1835                         if (!nested)
1836                                 goto nla_put_failure;
1837
1838                         i = 0;
1839                         while (bss_select_support) {
1840                                 if ((bss_select_support & 1) &&
1841                                     nla_put_flag(msg, i))
1842                                         goto nla_put_failure;
1843                                 i++;
1844                                 bss_select_support >>= 1;
1845                         }
1846                         nla_nest_end(msg, nested);
1847                 }
1848
1849                 state->split_start++;
1850                 break;
1851         case 13:
1852                 if (rdev->wiphy.num_iftype_ext_capab &&
1853                     rdev->wiphy.iftype_ext_capab) {
1854                         struct nlattr *nested_ext_capab, *nested;
1855
1856                         nested = nla_nest_start(msg,
1857                                                 NL80211_ATTR_IFTYPE_EXT_CAPA);
1858                         if (!nested)
1859                                 goto nla_put_failure;
1860
1861                         for (i = state->capa_start;
1862                              i < rdev->wiphy.num_iftype_ext_capab; i++) {
1863                                 const struct wiphy_iftype_ext_capab *capab;
1864
1865                                 capab = &rdev->wiphy.iftype_ext_capab[i];
1866
1867                                 nested_ext_capab = nla_nest_start(msg, i);
1868                                 if (!nested_ext_capab ||
1869                                     nla_put_u32(msg, NL80211_ATTR_IFTYPE,
1870                                                 capab->iftype) ||
1871                                     nla_put(msg, NL80211_ATTR_EXT_CAPA,
1872                                             capab->extended_capabilities_len,
1873                                             capab->extended_capabilities) ||
1874                                     nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
1875                                             capab->extended_capabilities_len,
1876                                             capab->extended_capabilities_mask))
1877                                         goto nla_put_failure;
1878
1879                                 nla_nest_end(msg, nested_ext_capab);
1880                                 if (state->split)
1881                                         break;
1882                         }
1883                         nla_nest_end(msg, nested);
1884                         if (i < rdev->wiphy.num_iftype_ext_capab) {
1885                                 state->capa_start = i + 1;
1886                                 break;
1887                         }
1888                 }
1889
1890                 if (nla_put_u32(msg, NL80211_ATTR_BANDS,
1891                                 rdev->wiphy.nan_supported_bands))
1892                         goto nla_put_failure;
1893
1894                 /* done */
1895                 state->split_start = 0;
1896                 break;
1897         }
1898  finish:
1899         genlmsg_end(msg, hdr);
1900         return 0;
1901
1902  nla_put_failure:
1903         genlmsg_cancel(msg, hdr);
1904         return -EMSGSIZE;
1905 }
1906
1907 static int nl80211_dump_wiphy_parse(struct sk_buff *skb,
1908                                     struct netlink_callback *cb,
1909                                     struct nl80211_dump_wiphy_state *state)
1910 {
1911         struct nlattr **tb = genl_family_attrbuf(&nl80211_fam);
1912         int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, tb,
1913                               nl80211_fam.maxattr, nl80211_policy, NULL);
1914         /* ignore parse errors for backward compatibility */
1915         if (ret)
1916                 return 0;
1917
1918         state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP];
1919         if (tb[NL80211_ATTR_WIPHY])
1920                 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
1921         if (tb[NL80211_ATTR_WDEV])
1922                 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32;
1923         if (tb[NL80211_ATTR_IFINDEX]) {
1924                 struct net_device *netdev;
1925                 struct cfg80211_registered_device *rdev;
1926                 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
1927
1928                 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx);
1929                 if (!netdev)
1930                         return -ENODEV;
1931                 if (netdev->ieee80211_ptr) {
1932                         rdev = wiphy_to_rdev(
1933                                 netdev->ieee80211_ptr->wiphy);
1934                         state->filter_wiphy = rdev->wiphy_idx;
1935                 }
1936         }
1937
1938         return 0;
1939 }
1940
1941 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
1942 {
1943         int idx = 0, ret;
1944         struct nl80211_dump_wiphy_state *state = (void *)cb->args[0];
1945         struct cfg80211_registered_device *rdev;
1946
1947         rtnl_lock();
1948         if (!state) {
1949                 state = kzalloc(sizeof(*state), GFP_KERNEL);
1950                 if (!state) {
1951                         rtnl_unlock();
1952                         return -ENOMEM;
1953                 }
1954                 state->filter_wiphy = -1;
1955                 ret = nl80211_dump_wiphy_parse(skb, cb, state);
1956                 if (ret) {
1957                         kfree(state);
1958                         rtnl_unlock();
1959                         return ret;
1960                 }
1961                 cb->args[0] = (long)state;
1962         }
1963
1964         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
1965                 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
1966                         continue;
1967                 if (++idx <= state->start)
1968                         continue;
1969                 if (state->filter_wiphy != -1 &&
1970                     state->filter_wiphy != rdev->wiphy_idx)
1971                         continue;
1972                 /* attempt to fit multiple wiphy data chunks into the skb */
1973                 do {
1974                         ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY,
1975                                                  skb,
1976                                                  NETLINK_CB(cb->skb).portid,
1977                                                  cb->nlh->nlmsg_seq,
1978                                                  NLM_F_MULTI, state);
1979                         if (ret < 0) {
1980                                 /*
1981                                  * If sending the wiphy data didn't fit (ENOBUFS
1982                                  * or EMSGSIZE returned), this SKB is still
1983                                  * empty (so it's not too big because another
1984                                  * wiphy dataset is already in the skb) and
1985                                  * we've not tried to adjust the dump allocation
1986                                  * yet ... then adjust the alloc size to be
1987                                  * bigger, and return 1 but with the empty skb.
1988                                  * This results in an empty message being RX'ed
1989                                  * in userspace, but that is ignored.
1990                                  *
1991                                  * We can then retry with the larger buffer.
1992                                  */
1993                                 if ((ret == -ENOBUFS || ret == -EMSGSIZE) &&
1994                                     !skb->len && !state->split &&
1995                                     cb->min_dump_alloc < 4096) {
1996                                         cb->min_dump_alloc = 4096;
1997                                         state->split_start = 0;
1998                                         rtnl_unlock();
1999                                         return 1;
2000                                 }
2001                                 idx--;
2002                                 break;
2003                         }
2004                 } while (state->split_start > 0);
2005                 break;
2006         }
2007         rtnl_unlock();
2008
2009         state->start = idx;
2010
2011         return skb->len;
2012 }
2013
2014 static int nl80211_dump_wiphy_done(struct netlink_callback *cb)
2015 {
2016         kfree((void *)cb->args[0]);
2017         return 0;
2018 }
2019
2020 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
2021 {
2022         struct sk_buff *msg;
2023         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2024         struct nl80211_dump_wiphy_state state = {};
2025
2026         msg = nlmsg_new(4096, GFP_KERNEL);
2027         if (!msg)
2028                 return -ENOMEM;
2029
2030         if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg,
2031                                info->snd_portid, info->snd_seq, 0,
2032                                &state) < 0) {
2033                 nlmsg_free(msg);
2034                 return -ENOBUFS;
2035         }
2036
2037         return genlmsg_reply(msg, info);
2038 }
2039
2040 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
2041         [NL80211_TXQ_ATTR_QUEUE]                = { .type = NLA_U8 },
2042         [NL80211_TXQ_ATTR_TXOP]                 = { .type = NLA_U16 },
2043         [NL80211_TXQ_ATTR_CWMIN]                = { .type = NLA_U16 },
2044         [NL80211_TXQ_ATTR_CWMAX]                = { .type = NLA_U16 },
2045         [NL80211_TXQ_ATTR_AIFS]                 = { .type = NLA_U8 },
2046 };
2047
2048 static int parse_txq_params(struct nlattr *tb[],
2049                             struct ieee80211_txq_params *txq_params)
2050 {
2051         if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] ||
2052             !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
2053             !tb[NL80211_TXQ_ATTR_AIFS])
2054                 return -EINVAL;
2055
2056         txq_params->ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]);
2057         txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
2058         txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
2059         txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
2060         txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
2061
2062         if (txq_params->ac >= NL80211_NUM_ACS)
2063                 return -EINVAL;
2064
2065         return 0;
2066 }
2067
2068 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
2069 {
2070         /*
2071          * You can only set the channel explicitly for WDS interfaces,
2072          * all others have their channel managed via their respective
2073          * "establish a connection" command (connect, join, ...)
2074          *
2075          * For AP/GO and mesh mode, the channel can be set with the
2076          * channel userspace API, but is only stored and passed to the
2077          * low-level driver when the AP starts or the mesh is joined.
2078          * This is for backward compatibility, userspace can also give
2079          * the channel in the start-ap or join-mesh commands instead.
2080          *
2081          * Monitors are special as they are normally slaved to
2082          * whatever else is going on, so they have their own special
2083          * operation to set the monitor channel if possible.
2084          */
2085         return !wdev ||
2086                 wdev->iftype == NL80211_IFTYPE_AP ||
2087                 wdev->iftype == NL80211_IFTYPE_MESH_POINT ||
2088                 wdev->iftype == NL80211_IFTYPE_MONITOR ||
2089                 wdev->iftype == NL80211_IFTYPE_P2P_GO;
2090 }
2091
2092 static int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
2093                                  struct genl_info *info,
2094                                  struct cfg80211_chan_def *chandef)
2095 {
2096         u32 control_freq;
2097
2098         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
2099                 return -EINVAL;
2100
2101         control_freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
2102
2103         chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq);
2104         chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
2105         chandef->center_freq1 = control_freq;
2106         chandef->center_freq2 = 0;
2107
2108         /* Primary channel not allowed */
2109         if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED)
2110                 return -EINVAL;
2111
2112         if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
2113                 enum nl80211_channel_type chantype;
2114
2115                 chantype = nla_get_u32(
2116                                 info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
2117
2118                 switch (chantype) {
2119                 case NL80211_CHAN_NO_HT:
2120                 case NL80211_CHAN_HT20:
2121                 case NL80211_CHAN_HT40PLUS:
2122                 case NL80211_CHAN_HT40MINUS:
2123                         cfg80211_chandef_create(chandef, chandef->chan,
2124                                                 chantype);
2125                         break;
2126                 default:
2127                         return -EINVAL;
2128                 }
2129         } else if (info->attrs[NL80211_ATTR_CHANNEL_WIDTH]) {
2130                 chandef->width =
2131                         nla_get_u32(info->attrs[NL80211_ATTR_CHANNEL_WIDTH]);
2132                 if (info->attrs[NL80211_ATTR_CENTER_FREQ1])
2133                         chandef->center_freq1 =
2134                                 nla_get_u32(
2135                                         info->attrs[NL80211_ATTR_CENTER_FREQ1]);
2136                 if (info->attrs[NL80211_ATTR_CENTER_FREQ2])
2137                         chandef->center_freq2 =
2138                                 nla_get_u32(
2139                                         info->attrs[NL80211_ATTR_CENTER_FREQ2]);
2140         }
2141
2142         if (!cfg80211_chandef_valid(chandef))
2143                 return -EINVAL;
2144
2145         if (!cfg80211_chandef_usable(&rdev->wiphy, chandef,
2146                                      IEEE80211_CHAN_DISABLED))
2147                 return -EINVAL;
2148
2149         if ((chandef->width == NL80211_CHAN_WIDTH_5 ||
2150              chandef->width == NL80211_CHAN_WIDTH_10) &&
2151             !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ))
2152                 return -EINVAL;
2153
2154         return 0;
2155 }
2156
2157 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
2158                                  struct net_device *dev,
2159                                  struct genl_info *info)
2160 {
2161         struct cfg80211_chan_def chandef;
2162         int result;
2163         enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR;
2164         struct wireless_dev *wdev = NULL;
2165
2166         if (dev)
2167                 wdev = dev->ieee80211_ptr;
2168         if (!nl80211_can_set_dev_channel(wdev))
2169                 return -EOPNOTSUPP;
2170         if (wdev)
2171                 iftype = wdev->iftype;
2172
2173         result = nl80211_parse_chandef(rdev, info, &chandef);
2174         if (result)
2175                 return result;
2176
2177         switch (iftype) {
2178         case NL80211_IFTYPE_AP:
2179         case NL80211_IFTYPE_P2P_GO:
2180                 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
2181                                                    iftype)) {
2182                         result = -EINVAL;
2183                         break;
2184                 }
2185                 if (wdev->beacon_interval) {
2186                         if (!dev || !rdev->ops->set_ap_chanwidth ||
2187                             !(rdev->wiphy.features &
2188                               NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) {
2189                                 result = -EBUSY;
2190                                 break;
2191                         }
2192
2193                         /* Only allow dynamic channel width changes */
2194                         if (chandef.chan != wdev->preset_chandef.chan) {
2195                                 result = -EBUSY;
2196                                 break;
2197                         }
2198                         result = rdev_set_ap_chanwidth(rdev, dev, &chandef);
2199                         if (result)
2200                                 break;
2201                 }
2202                 wdev->preset_chandef = chandef;
2203                 result = 0;
2204                 break;
2205         case NL80211_IFTYPE_MESH_POINT:
2206                 result = cfg80211_set_mesh_channel(rdev, wdev, &chandef);
2207                 break;
2208         case NL80211_IFTYPE_MONITOR:
2209                 result = cfg80211_set_monitor_channel(rdev, &chandef);
2210                 break;
2211         default:
2212                 result = -EINVAL;
2213         }
2214
2215         return result;
2216 }
2217
2218 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
2219 {
2220         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2221         struct net_device *netdev = info->user_ptr[1];
2222
2223         return __nl80211_set_channel(rdev, netdev, info);
2224 }
2225
2226 static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info)
2227 {
2228         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2229         struct net_device *dev = info->user_ptr[1];
2230         struct wireless_dev *wdev = dev->ieee80211_ptr;
2231         const u8 *bssid;
2232
2233         if (!info->attrs[NL80211_ATTR_MAC])
2234                 return -EINVAL;
2235
2236         if (netif_running(dev))
2237                 return -EBUSY;
2238
2239         if (!rdev->ops->set_wds_peer)
2240                 return -EOPNOTSUPP;
2241
2242         if (wdev->iftype != NL80211_IFTYPE_WDS)
2243                 return -EOPNOTSUPP;
2244
2245         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
2246         return rdev_set_wds_peer(rdev, dev, bssid);
2247 }
2248
2249 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
2250 {
2251         struct cfg80211_registered_device *rdev;
2252         struct net_device *netdev = NULL;
2253         struct wireless_dev *wdev;
2254         int result = 0, rem_txq_params = 0;
2255         struct nlattr *nl_txq_params;
2256         u32 changed;
2257         u8 retry_short = 0, retry_long = 0;
2258         u32 frag_threshold = 0, rts_threshold = 0;
2259         u8 coverage_class = 0;
2260
2261         ASSERT_RTNL();
2262
2263         /*
2264          * Try to find the wiphy and netdev. Normally this
2265          * function shouldn't need the netdev, but this is
2266          * done for backward compatibility -- previously
2267          * setting the channel was done per wiphy, but now
2268          * it is per netdev. Previous userland like hostapd
2269          * also passed a netdev to set_wiphy, so that it is
2270          * possible to let that go to the right netdev!
2271          */
2272
2273         if (info->attrs[NL80211_ATTR_IFINDEX]) {
2274                 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
2275
2276                 netdev = __dev_get_by_index(genl_info_net(info), ifindex);
2277                 if (netdev && netdev->ieee80211_ptr)
2278                         rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy);
2279                 else
2280                         netdev = NULL;
2281         }
2282
2283         if (!netdev) {
2284                 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info),
2285                                                   info->attrs);
2286                 if (IS_ERR(rdev))
2287                         return PTR_ERR(rdev);
2288                 wdev = NULL;
2289                 netdev = NULL;
2290                 result = 0;
2291         } else
2292                 wdev = netdev->ieee80211_ptr;
2293
2294         /*
2295          * end workaround code, by now the rdev is available
2296          * and locked, and wdev may or may not be NULL.
2297          */
2298
2299         if (info->attrs[NL80211_ATTR_WIPHY_NAME])
2300                 result = cfg80211_dev_rename(
2301                         rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
2302
2303         if (result)
2304                 return result;
2305
2306         if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
2307                 struct ieee80211_txq_params txq_params;
2308                 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
2309
2310                 if (!rdev->ops->set_txq_params)
2311                         return -EOPNOTSUPP;
2312
2313                 if (!netdev)
2314                         return -EINVAL;
2315
2316                 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
2317                     netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
2318                         return -EINVAL;
2319
2320                 if (!netif_running(netdev))
2321                         return -ENETDOWN;
2322
2323                 nla_for_each_nested(nl_txq_params,
2324                                     info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
2325                                     rem_txq_params) {
2326                         result = nla_parse_nested(tb, NL80211_TXQ_ATTR_MAX,
2327                                                   nl_txq_params,
2328                                                   txq_params_policy,
2329                                                   info->extack);
2330                         if (result)
2331                                 return result;
2332                         result = parse_txq_params(tb, &txq_params);
2333                         if (result)
2334                                 return result;
2335
2336                         result = rdev_set_txq_params(rdev, netdev,
2337                                                      &txq_params);
2338                         if (result)
2339                                 return result;
2340                 }
2341         }
2342
2343         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
2344                 result = __nl80211_set_channel(
2345                         rdev,
2346                         nl80211_can_set_dev_channel(wdev) ? netdev : NULL,
2347                         info);
2348                 if (result)
2349                         return result;
2350         }
2351
2352         if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
2353                 struct wireless_dev *txp_wdev = wdev;
2354                 enum nl80211_tx_power_setting type;
2355                 int idx, mbm = 0;
2356
2357                 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER))
2358                         txp_wdev = NULL;
2359
2360                 if (!rdev->ops->set_tx_power)
2361                         return -EOPNOTSUPP;
2362
2363                 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
2364                 type = nla_get_u32(info->attrs[idx]);
2365
2366                 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
2367                     (type != NL80211_TX_POWER_AUTOMATIC))
2368                         return -EINVAL;
2369
2370                 if (type != NL80211_TX_POWER_AUTOMATIC) {
2371                         idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
2372                         mbm = nla_get_u32(info->attrs[idx]);
2373                 }
2374
2375                 result = rdev_set_tx_power(rdev, txp_wdev, type, mbm);
2376                 if (result)
2377                         return result;
2378         }
2379
2380         if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
2381             info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
2382                 u32 tx_ant, rx_ant;
2383
2384                 if ((!rdev->wiphy.available_antennas_tx &&
2385                      !rdev->wiphy.available_antennas_rx) ||
2386                     !rdev->ops->set_antenna)
2387                         return -EOPNOTSUPP;
2388
2389                 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
2390                 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
2391
2392                 /* reject antenna configurations which don't match the
2393                  * available antenna masks, except for the "all" mask */
2394                 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
2395                     (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx)))
2396                         return -EINVAL;
2397
2398                 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
2399                 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
2400
2401                 result = rdev_set_antenna(rdev, tx_ant, rx_ant);
2402                 if (result)
2403                         return result;
2404         }
2405
2406         changed = 0;
2407
2408         if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
2409                 retry_short = nla_get_u8(
2410                         info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
2411                 if (retry_short == 0)
2412                         return -EINVAL;
2413
2414                 changed |= WIPHY_PARAM_RETRY_SHORT;
2415         }
2416
2417         if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
2418                 retry_long = nla_get_u8(
2419                         info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
2420                 if (retry_long == 0)
2421                         return -EINVAL;
2422
2423                 changed |= WIPHY_PARAM_RETRY_LONG;
2424         }
2425
2426         if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
2427                 frag_threshold = nla_get_u32(
2428                         info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
2429                 if (frag_threshold < 256)
2430                         return -EINVAL;
2431
2432                 if (frag_threshold != (u32) -1) {
2433                         /*
2434                          * Fragments (apart from the last one) are required to
2435                          * have even length. Make the fragmentation code
2436                          * simpler by stripping LSB should someone try to use
2437                          * odd threshold value.
2438                          */
2439                         frag_threshold &= ~0x1;
2440                 }
2441                 changed |= WIPHY_PARAM_FRAG_THRESHOLD;
2442         }
2443
2444         if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
2445                 rts_threshold = nla_get_u32(
2446                         info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
2447                 changed |= WIPHY_PARAM_RTS_THRESHOLD;
2448         }
2449
2450         if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
2451                 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK])
2452                         return -EINVAL;
2453
2454                 coverage_class = nla_get_u8(
2455                         info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
2456                 changed |= WIPHY_PARAM_COVERAGE_CLASS;
2457         }
2458
2459         if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) {
2460                 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION))
2461                         return -EOPNOTSUPP;
2462
2463                 changed |= WIPHY_PARAM_DYN_ACK;
2464         }
2465
2466         if (changed) {
2467                 u8 old_retry_short, old_retry_long;
2468                 u32 old_frag_threshold, old_rts_threshold;
2469                 u8 old_coverage_class;
2470
2471                 if (!rdev->ops->set_wiphy_params)
2472                         return -EOPNOTSUPP;
2473
2474                 old_retry_short = rdev->wiphy.retry_short;
2475                 old_retry_long = rdev->wiphy.retry_long;
2476                 old_frag_threshold = rdev->wiphy.frag_threshold;
2477                 old_rts_threshold = rdev->wiphy.rts_threshold;
2478                 old_coverage_class = rdev->wiphy.coverage_class;
2479
2480                 if (changed & WIPHY_PARAM_RETRY_SHORT)
2481                         rdev->wiphy.retry_short = retry_short;
2482                 if (changed & WIPHY_PARAM_RETRY_LONG)
2483                         rdev->wiphy.retry_long = retry_long;
2484                 if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
2485                         rdev->wiphy.frag_threshold = frag_threshold;
2486                 if (changed & WIPHY_PARAM_RTS_THRESHOLD)
2487                         rdev->wiphy.rts_threshold = rts_threshold;
2488                 if (changed & WIPHY_PARAM_COVERAGE_CLASS)
2489                         rdev->wiphy.coverage_class = coverage_class;
2490
2491                 result = rdev_set_wiphy_params(rdev, changed);
2492                 if (result) {
2493                         rdev->wiphy.retry_short = old_retry_short;
2494                         rdev->wiphy.retry_long = old_retry_long;
2495                         rdev->wiphy.frag_threshold = old_frag_threshold;
2496                         rdev->wiphy.rts_threshold = old_rts_threshold;
2497                         rdev->wiphy.coverage_class = old_coverage_class;
2498                         return result;
2499                 }
2500         }
2501         return 0;
2502 }
2503
2504 static inline u64 wdev_id(struct wireless_dev *wdev)
2505 {
2506         return (u64)wdev->identifier |
2507                ((u64)wiphy_to_rdev(wdev->wiphy)->wiphy_idx << 32);
2508 }
2509
2510 static int nl80211_send_chandef(struct sk_buff *msg,
2511                                 const struct cfg80211_chan_def *chandef)
2512 {
2513         if (WARN_ON(!cfg80211_chandef_valid(chandef)))
2514                 return -EINVAL;
2515
2516         if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ,
2517                         chandef->chan->center_freq))
2518                 return -ENOBUFS;
2519         switch (chandef->width) {
2520         case NL80211_CHAN_WIDTH_20_NOHT:
2521         case NL80211_CHAN_WIDTH_20:
2522         case NL80211_CHAN_WIDTH_40:
2523                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
2524                                 cfg80211_get_chandef_type(chandef)))
2525                         return -ENOBUFS;
2526                 break;
2527         default:
2528                 break;
2529         }
2530         if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width))
2531                 return -ENOBUFS;
2532         if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1))
2533                 return -ENOBUFS;
2534         if (chandef->center_freq2 &&
2535             nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2))
2536                 return -ENOBUFS;
2537         return 0;
2538 }
2539
2540 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags,
2541                               struct cfg80211_registered_device *rdev,
2542                               struct wireless_dev *wdev, bool removal)
2543 {
2544         struct net_device *dev = wdev->netdev;
2545         u8 cmd = NL80211_CMD_NEW_INTERFACE;
2546         void *hdr;
2547
2548         if (removal)
2549                 cmd = NL80211_CMD_DEL_INTERFACE;
2550
2551         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
2552         if (!hdr)
2553                 return -1;
2554
2555         if (dev &&
2556             (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
2557              nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name)))
2558                 goto nla_put_failure;
2559
2560         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
2561             nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) ||
2562             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
2563                               NL80211_ATTR_PAD) ||
2564             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) ||
2565             nla_put_u32(msg, NL80211_ATTR_GENERATION,
2566                         rdev->devlist_generation ^
2567                         (cfg80211_rdev_list_generation << 2)))
2568                 goto nla_put_failure;
2569
2570         if (rdev->ops->get_channel) {
2571                 int ret;
2572                 struct cfg80211_chan_def chandef;
2573
2574                 ret = rdev_get_channel(rdev, wdev, &chandef);
2575                 if (ret == 0) {
2576                         if (nl80211_send_chandef(msg, &chandef))
2577                                 goto nla_put_failure;
2578                 }
2579         }
2580
2581         if (rdev->ops->get_tx_power) {
2582                 int dbm, ret;
2583
2584                 ret = rdev_get_tx_power(rdev, wdev, &dbm);
2585                 if (ret == 0 &&
2586                     nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
2587                                 DBM_TO_MBM(dbm)))
2588                         goto nla_put_failure;
2589         }
2590
2591         if (wdev->ssid_len) {
2592                 if (nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid))
2593                         goto nla_put_failure;
2594         }
2595
2596         genlmsg_end(msg, hdr);
2597         return 0;
2598
2599  nla_put_failure:
2600         genlmsg_cancel(msg, hdr);
2601         return -EMSGSIZE;
2602 }
2603
2604 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
2605 {
2606         int wp_idx = 0;
2607         int if_idx = 0;
2608         int wp_start = cb->args[0];
2609         int if_start = cb->args[1];
2610         int filter_wiphy = -1;
2611         struct cfg80211_registered_device *rdev;
2612         struct wireless_dev *wdev;
2613         int ret;
2614
2615         rtnl_lock();
2616         if (!cb->args[2]) {
2617                 struct nl80211_dump_wiphy_state state = {
2618                         .filter_wiphy = -1,
2619                 };
2620
2621                 ret = nl80211_dump_wiphy_parse(skb, cb, &state);
2622                 if (ret)
2623                         goto out_unlock;
2624
2625                 filter_wiphy = state.filter_wiphy;
2626
2627                 /*
2628                  * if filtering, set cb->args[2] to +1 since 0 is the default
2629                  * value needed to determine that parsing is necessary.
2630                  */
2631                 if (filter_wiphy >= 0)
2632                         cb->args[2] = filter_wiphy + 1;
2633                 else
2634                         cb->args[2] = -1;
2635         } else if (cb->args[2] > 0) {
2636                 filter_wiphy = cb->args[2] - 1;
2637         }
2638
2639         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
2640                 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
2641                         continue;
2642                 if (wp_idx < wp_start) {
2643                         wp_idx++;
2644                         continue;
2645                 }
2646
2647                 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx)
2648                         continue;
2649
2650                 if_idx = 0;
2651
2652                 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
2653                         if (if_idx < if_start) {
2654                                 if_idx++;
2655                                 continue;
2656                         }
2657                         if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid,
2658                                                cb->nlh->nlmsg_seq, NLM_F_MULTI,
2659                                                rdev, wdev, false) < 0) {
2660                                 goto out;
2661                         }
2662                         if_idx++;
2663                 }
2664
2665                 wp_idx++;
2666         }
2667  out:
2668         cb->args[0] = wp_idx;
2669         cb->args[1] = if_idx;
2670
2671         ret = skb->len;
2672  out_unlock:
2673         rtnl_unlock();
2674
2675         return ret;
2676 }
2677
2678 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
2679 {
2680         struct sk_buff *msg;
2681         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2682         struct wireless_dev *wdev = info->user_ptr[1];
2683
2684         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2685         if (!msg)
2686                 return -ENOMEM;
2687
2688         if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
2689                                rdev, wdev, false) < 0) {
2690                 nlmsg_free(msg);
2691                 return -ENOBUFS;
2692         }
2693
2694         return genlmsg_reply(msg, info);
2695 }
2696
2697 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = {
2698         [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG },
2699         [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG },
2700         [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG },
2701         [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
2702         [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
2703         [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG },
2704 };
2705
2706 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
2707 {
2708         struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1];
2709         int flag;
2710
2711         *mntrflags = 0;
2712
2713         if (!nla)
2714                 return -EINVAL;
2715
2716         if (nla_parse_nested(flags, NL80211_MNTR_FLAG_MAX, nla,
2717                              mntr_flags_policy, NULL))
2718                 return -EINVAL;
2719
2720         for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
2721                 if (flags[flag])
2722                         *mntrflags |= (1<<flag);
2723
2724         *mntrflags |= MONITOR_FLAG_CHANGED;
2725
2726         return 0;
2727 }
2728
2729 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev,
2730                                      enum nl80211_iftype type,
2731                                      struct genl_info *info,
2732                                      struct vif_params *params)
2733 {
2734         bool change = false;
2735         int err;
2736
2737         if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
2738                 if (type != NL80211_IFTYPE_MONITOR)
2739                         return -EINVAL;
2740
2741                 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
2742                                           &params->flags);
2743                 if (err)
2744                         return err;
2745
2746                 change = true;
2747         }
2748
2749         if (params->flags & MONITOR_FLAG_ACTIVE &&
2750             !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
2751                 return -EOPNOTSUPP;
2752
2753         if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) {
2754                 const u8 *mumimo_groups;
2755                 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
2756
2757                 if (type != NL80211_IFTYPE_MONITOR)
2758                         return -EINVAL;
2759
2760                 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
2761                         return -EOPNOTSUPP;
2762
2763                 mumimo_groups =
2764                         nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]);
2765
2766                 /* bits 0 and 63 are reserved and must be zero */
2767                 if ((mumimo_groups[0] & BIT(0)) ||
2768                     (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7)))
2769                         return -EINVAL;
2770
2771                 params->vht_mumimo_groups = mumimo_groups;
2772                 change = true;
2773         }
2774
2775         if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) {
2776                 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
2777
2778                 if (type != NL80211_IFTYPE_MONITOR)
2779                         return -EINVAL;
2780
2781                 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
2782                         return -EOPNOTSUPP;
2783
2784                 params->vht_mumimo_follow_addr =
2785                         nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]);
2786                 change = true;
2787         }
2788
2789         return change ? 1 : 0;
2790 }
2791
2792 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev,
2793                                struct net_device *netdev, u8 use_4addr,
2794                                enum nl80211_iftype iftype)
2795 {
2796         if (!use_4addr) {
2797                 if (netdev && (netdev->priv_flags & IFF_BRIDGE_PORT))
2798                         return -EBUSY;
2799                 return 0;
2800         }
2801
2802         switch (iftype) {
2803         case NL80211_IFTYPE_AP_VLAN:
2804                 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP)
2805                         return 0;
2806                 break;
2807         case NL80211_IFTYPE_STATION:
2808                 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION)
2809                         return 0;
2810                 break;
2811         default:
2812                 break;
2813         }
2814
2815         return -EOPNOTSUPP;
2816 }
2817
2818 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
2819 {
2820         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2821         struct vif_params params;
2822         int err;
2823         enum nl80211_iftype otype, ntype;
2824         struct net_device *dev = info->user_ptr[1];
2825         bool change = false;
2826
2827         memset(&params, 0, sizeof(params));
2828
2829         otype = ntype = dev->ieee80211_ptr->iftype;
2830
2831         if (info->attrs[NL80211_ATTR_IFTYPE]) {
2832                 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
2833                 if (otype != ntype)
2834                         change = true;
2835                 if (ntype > NL80211_IFTYPE_MAX)
2836                         return -EINVAL;
2837         }
2838
2839         if (info->attrs[NL80211_ATTR_MESH_ID]) {
2840                 struct wireless_dev *wdev = dev->ieee80211_ptr;
2841
2842                 if (ntype != NL80211_IFTYPE_MESH_POINT)
2843                         return -EINVAL;
2844                 if (netif_running(dev))
2845                         return -EBUSY;
2846
2847                 wdev_lock(wdev);
2848                 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
2849                              IEEE80211_MAX_MESH_ID_LEN);
2850                 wdev->mesh_id_up_len =
2851                         nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
2852                 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
2853                        wdev->mesh_id_up_len);
2854                 wdev_unlock(wdev);
2855         }
2856
2857         if (info->attrs[NL80211_ATTR_4ADDR]) {
2858                 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
2859                 change = true;
2860                 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype);
2861                 if (err)
2862                         return err;
2863         } else {
2864                 params.use_4addr = -1;
2865         }
2866
2867         err = nl80211_parse_mon_options(rdev, ntype, info, &params);
2868         if (err < 0)
2869                 return err;
2870         if (err > 0)
2871                 change = true;
2872
2873         if (change)
2874                 err = cfg80211_change_iface(rdev, dev, ntype, &params);
2875         else
2876                 err = 0;
2877
2878         if (!err && params.use_4addr != -1)
2879                 dev->ieee80211_ptr->use_4addr = params.use_4addr;
2880
2881         return err;
2882 }
2883
2884 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
2885 {
2886         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2887         struct vif_params params;
2888         struct wireless_dev *wdev;
2889         struct sk_buff *msg;
2890         int err;
2891         enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
2892
2893         /* to avoid failing a new interface creation due to pending removal */
2894         cfg80211_destroy_ifaces(rdev);
2895
2896         memset(&params, 0, sizeof(params));
2897
2898         if (!info->attrs[NL80211_ATTR_IFNAME])
2899                 return -EINVAL;
2900
2901         if (info->attrs[NL80211_ATTR_IFTYPE]) {
2902                 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
2903                 if (type > NL80211_IFTYPE_MAX)
2904                         return -EINVAL;
2905         }
2906
2907         if (!rdev->ops->add_virtual_intf ||
2908             !(rdev->wiphy.interface_modes & (1 << type)))
2909                 return -EOPNOTSUPP;
2910
2911         if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN ||
2912              rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) &&
2913             info->attrs[NL80211_ATTR_MAC]) {
2914                 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC],
2915                            ETH_ALEN);
2916                 if (!is_valid_ether_addr(params.macaddr))
2917                         return -EADDRNOTAVAIL;
2918         }
2919
2920         if (info->attrs[NL80211_ATTR_4ADDR]) {
2921                 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
2922                 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type);
2923                 if (err)
2924                         return err;
2925         }
2926
2927         err = nl80211_parse_mon_options(rdev, type, info, &params);
2928         if (err < 0)
2929                 return err;
2930
2931         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2932         if (!msg)
2933                 return -ENOMEM;
2934
2935         wdev = rdev_add_virtual_intf(rdev,
2936                                 nla_data(info->attrs[NL80211_ATTR_IFNAME]),
2937                                 NET_NAME_USER, type, &params);
2938         if (WARN_ON(!wdev)) {
2939                 nlmsg_free(msg);
2940                 return -EPROTO;
2941         } else if (IS_ERR(wdev)) {
2942                 nlmsg_free(msg);
2943                 return PTR_ERR(wdev);
2944         }
2945
2946         if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
2947                 wdev->owner_nlportid = info->snd_portid;
2948
2949         switch (type) {
2950         case NL80211_IFTYPE_MESH_POINT:
2951                 if (!info->attrs[NL80211_ATTR_MESH_ID])
2952                         break;
2953                 wdev_lock(wdev);
2954                 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
2955                              IEEE80211_MAX_MESH_ID_LEN);
2956                 wdev->mesh_id_up_len =
2957                         nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
2958                 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
2959                        wdev->mesh_id_up_len);
2960                 wdev_unlock(wdev);
2961                 break;
2962         case NL80211_IFTYPE_NAN:
2963         case NL80211_IFTYPE_P2P_DEVICE:
2964                 /*
2965                  * P2P Device and NAN do not have a netdev, so don't go
2966                  * through the netdev notifier and must be added here
2967                  */
2968                 mutex_init(&wdev->mtx);
2969                 INIT_LIST_HEAD(&wdev->event_list);
2970                 spin_lock_init(&wdev->event_lock);
2971                 INIT_LIST_HEAD(&wdev->mgmt_registrations);
2972                 spin_lock_init(&wdev->mgmt_registrations_lock);
2973
2974                 wdev->identifier = ++rdev->wdev_id;
2975                 list_add_rcu(&wdev->list, &rdev->wiphy.wdev_list);
2976                 rdev->devlist_generation++;
2977                 break;
2978         default:
2979                 break;
2980         }
2981
2982         if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
2983                                rdev, wdev, false) < 0) {
2984                 nlmsg_free(msg);
2985                 return -ENOBUFS;
2986         }
2987
2988         /*
2989          * For wdevs which have no associated netdev object (e.g. of type
2990          * NL80211_IFTYPE_P2P_DEVICE), emit the NEW_INTERFACE event here.
2991          * For all other types, the event will be generated from the
2992          * netdev notifier
2993          */
2994         if (!wdev->netdev)
2995                 nl80211_notify_iface(rdev, wdev, NL80211_CMD_NEW_INTERFACE);
2996
2997         return genlmsg_reply(msg, info);
2998 }
2999
3000 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
3001 {
3002         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3003         struct wireless_dev *wdev = info->user_ptr[1];
3004
3005         if (!rdev->ops->del_virtual_intf)
3006                 return -EOPNOTSUPP;
3007
3008         /*
3009          * If we remove a wireless device without a netdev then clear
3010          * user_ptr[1] so that nl80211_post_doit won't dereference it
3011          * to check if it needs to do dev_put(). Otherwise it crashes
3012          * since the wdev has been freed, unlike with a netdev where
3013          * we need the dev_put() for the netdev to really be freed.
3014          */
3015         if (!wdev->netdev)
3016                 info->user_ptr[1] = NULL;
3017
3018         return rdev_del_virtual_intf(rdev, wdev);
3019 }
3020
3021 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info)
3022 {
3023         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3024         struct net_device *dev = info->user_ptr[1];
3025         u16 noack_map;
3026
3027         if (!info->attrs[NL80211_ATTR_NOACK_MAP])
3028                 return -EINVAL;
3029
3030         if (!rdev->ops->set_noack_map)
3031                 return -EOPNOTSUPP;
3032
3033         noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]);
3034
3035         return rdev_set_noack_map(rdev, dev, noack_map);
3036 }
3037
3038 struct get_key_cookie {
3039         struct sk_buff *msg;
3040         int error;
3041         int idx;
3042 };
3043
3044 static void get_key_callback(void *c, struct key_params *params)
3045 {
3046         struct nlattr *key;
3047         struct get_key_cookie *cookie = c;
3048
3049         if ((params->key &&
3050              nla_put(cookie->msg, NL80211_ATTR_KEY_DATA,
3051                      params->key_len, params->key)) ||
3052             (params->seq &&
3053              nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ,
3054                      params->seq_len, params->seq)) ||
3055             (params->cipher &&
3056              nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER,
3057                          params->cipher)))
3058                 goto nla_put_failure;
3059
3060         key = nla_nest_start(cookie->msg, NL80211_ATTR_KEY);
3061         if (!key)
3062                 goto nla_put_failure;
3063
3064         if ((params->key &&
3065              nla_put(cookie->msg, NL80211_KEY_DATA,
3066                      params->key_len, params->key)) ||
3067             (params->seq &&
3068              nla_put(cookie->msg, NL80211_KEY_SEQ,
3069                      params->seq_len, params->seq)) ||
3070             (params->cipher &&
3071              nla_put_u32(cookie->msg, NL80211_KEY_CIPHER,
3072                          params->cipher)))
3073                 goto nla_put_failure;
3074
3075         if (nla_put_u8(cookie->msg, NL80211_ATTR_KEY_IDX, cookie->idx))
3076                 goto nla_put_failure;
3077
3078         nla_nest_end(cookie->msg, key);
3079
3080         return;
3081  nla_put_failure:
3082         cookie->error = 1;
3083 }
3084
3085 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
3086 {
3087         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3088         int err;
3089         struct net_device *dev = info->user_ptr[1];
3090         u8 key_idx = 0;
3091         const u8 *mac_addr = NULL;
3092         bool pairwise;
3093         struct get_key_cookie cookie = {
3094                 .error = 0,
3095         };
3096         void *hdr;
3097         struct sk_buff *msg;
3098
3099         if (info->attrs[NL80211_ATTR_KEY_IDX])
3100                 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
3101
3102         if (key_idx > 5)
3103                 return -EINVAL;
3104
3105         if (info->attrs[NL80211_ATTR_MAC])
3106                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3107
3108         pairwise = !!mac_addr;
3109         if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
3110                 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
3111
3112                 if (kt >= NUM_NL80211_KEYTYPES)
3113                         return -EINVAL;
3114                 if (kt != NL80211_KEYTYPE_GROUP &&
3115                     kt != NL80211_KEYTYPE_PAIRWISE)
3116                         return -EINVAL;
3117                 pairwise = kt == NL80211_KEYTYPE_PAIRWISE;
3118         }
3119
3120         if (!rdev->ops->get_key)
3121                 return -EOPNOTSUPP;
3122
3123         if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
3124                 return -ENOENT;
3125
3126         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3127         if (!msg)
3128                 return -ENOMEM;
3129
3130         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
3131                              NL80211_CMD_NEW_KEY);
3132         if (!hdr)
3133                 goto nla_put_failure;
3134
3135         cookie.msg = msg;
3136         cookie.idx = key_idx;
3137
3138         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
3139             nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx))
3140                 goto nla_put_failure;
3141         if (mac_addr &&
3142             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
3143                 goto nla_put_failure;
3144
3145         err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie,
3146                            get_key_callback);
3147
3148         if (err)
3149                 goto free_msg;
3150
3151         if (cookie.error)
3152                 goto nla_put_failure;
3153
3154         genlmsg_end(msg, hdr);
3155         return genlmsg_reply(msg, info);
3156
3157  nla_put_failure:
3158         err = -ENOBUFS;
3159  free_msg:
3160         nlmsg_free(msg);
3161         return err;
3162 }
3163
3164 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
3165 {
3166         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3167         struct key_parse key;
3168         int err;
3169         struct net_device *dev = info->user_ptr[1];
3170
3171         err = nl80211_parse_key(info, &key);
3172         if (err)
3173                 return err;
3174
3175         if (key.idx < 0)
3176                 return -EINVAL;
3177
3178         /* only support setting default key */
3179         if (!key.def && !key.defmgmt)
3180                 return -EINVAL;
3181
3182         wdev_lock(dev->ieee80211_ptr);
3183
3184         if (key.def) {
3185                 if (!rdev->ops->set_default_key) {
3186                         err = -EOPNOTSUPP;
3187                         goto out;
3188                 }
3189
3190                 err = nl80211_key_allowed(dev->ieee80211_ptr);
3191                 if (err)
3192                         goto out;
3193
3194                 err = rdev_set_default_key(rdev, dev, key.idx,
3195                                                  key.def_uni, key.def_multi);
3196
3197                 if (err)
3198                         goto out;
3199
3200 #ifdef CONFIG_CFG80211_WEXT
3201                 dev->ieee80211_ptr->wext.default_key = key.idx;
3202 #endif
3203         } else {
3204                 if (key.def_uni || !key.def_multi) {
3205                         err = -EINVAL;
3206                         goto out;
3207                 }
3208
3209                 if (!rdev->ops->set_default_mgmt_key) {
3210                         err = -EOPNOTSUPP;
3211                         goto out;
3212                 }
3213
3214                 err = nl80211_key_allowed(dev->ieee80211_ptr);
3215                 if (err)
3216                         goto out;
3217
3218                 err = rdev_set_default_mgmt_key(rdev, dev, key.idx);
3219                 if (err)
3220                         goto out;
3221
3222 #ifdef CONFIG_CFG80211_WEXT
3223                 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx;
3224 #endif
3225         }
3226
3227  out:
3228         wdev_unlock(dev->ieee80211_ptr);
3229
3230         return err;
3231 }
3232
3233 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
3234 {
3235         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3236         int err;
3237         struct net_device *dev = info->user_ptr[1];
3238         struct key_parse key;
3239         const u8 *mac_addr = NULL;
3240
3241         err = nl80211_parse_key(info, &key);
3242         if (err)
3243                 return err;
3244
3245         if (!key.p.key)
3246                 return -EINVAL;
3247
3248         if (info->attrs[NL80211_ATTR_MAC])
3249                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3250
3251         if (key.type == -1) {
3252                 if (mac_addr)
3253                         key.type = NL80211_KEYTYPE_PAIRWISE;
3254                 else
3255                         key.type = NL80211_KEYTYPE_GROUP;
3256         }
3257
3258         /* for now */
3259         if (key.type != NL80211_KEYTYPE_PAIRWISE &&
3260             key.type != NL80211_KEYTYPE_GROUP)
3261                 return -EINVAL;
3262
3263         if (!rdev->ops->add_key)
3264                 return -EOPNOTSUPP;
3265
3266         if (cfg80211_validate_key_settings(rdev, &key.p, key.idx,
3267                                            key.type == NL80211_KEYTYPE_PAIRWISE,
3268                                            mac_addr))
3269                 return -EINVAL;
3270
3271         wdev_lock(dev->ieee80211_ptr);
3272         err = nl80211_key_allowed(dev->ieee80211_ptr);
3273         if (!err)
3274                 err = rdev_add_key(rdev, dev, key.idx,
3275                                    key.type == NL80211_KEYTYPE_PAIRWISE,
3276                                     mac_addr, &key.p);
3277         wdev_unlock(dev->ieee80211_ptr);
3278
3279         return err;
3280 }
3281
3282 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
3283 {
3284         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3285         int err;
3286         struct net_device *dev = info->user_ptr[1];
3287         u8 *mac_addr = NULL;
3288         struct key_parse key;
3289
3290         err = nl80211_parse_key(info, &key);
3291         if (err)
3292                 return err;
3293
3294         if (info->attrs[NL80211_ATTR_MAC])
3295                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3296
3297         if (key.type == -1) {
3298                 if (mac_addr)
3299                         key.type = NL80211_KEYTYPE_PAIRWISE;
3300                 else
3301                         key.type = NL80211_KEYTYPE_GROUP;
3302         }
3303
3304         /* for now */
3305         if (key.type != NL80211_KEYTYPE_PAIRWISE &&
3306             key.type != NL80211_KEYTYPE_GROUP)
3307                 return -EINVAL;
3308
3309         if (!rdev->ops->del_key)
3310                 return -EOPNOTSUPP;
3311
3312         wdev_lock(dev->ieee80211_ptr);
3313         err = nl80211_key_allowed(dev->ieee80211_ptr);
3314
3315         if (key.type == NL80211_KEYTYPE_GROUP && mac_addr &&
3316             !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
3317                 err = -ENOENT;
3318
3319         if (!err)
3320                 err = rdev_del_key(rdev, dev, key.idx,
3321                                    key.type == NL80211_KEYTYPE_PAIRWISE,
3322                                    mac_addr);
3323
3324 #ifdef CONFIG_CFG80211_WEXT
3325         if (!err) {
3326                 if (key.idx == dev->ieee80211_ptr->wext.default_key)
3327                         dev->ieee80211_ptr->wext.default_key = -1;
3328                 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key)
3329                         dev->ieee80211_ptr->wext.default_mgmt_key = -1;
3330         }
3331 #endif
3332         wdev_unlock(dev->ieee80211_ptr);
3333
3334         return err;
3335 }
3336
3337 /* This function returns an error or the number of nested attributes */
3338 static int validate_acl_mac_addrs(struct nlattr *nl_attr)
3339 {
3340         struct nlattr *attr;
3341         int n_entries = 0, tmp;
3342
3343         nla_for_each_nested(attr, nl_attr, tmp) {
3344                 if (nla_len(attr) != ETH_ALEN)
3345                         return -EINVAL;
3346
3347                 n_entries++;
3348         }
3349
3350         return n_entries;
3351 }
3352
3353 /*
3354  * This function parses ACL information and allocates memory for ACL data.
3355  * On successful return, the calling function is responsible to free the
3356  * ACL buffer returned by this function.
3357  */
3358 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy,
3359                                                 struct genl_info *info)
3360 {
3361         enum nl80211_acl_policy acl_policy;
3362         struct nlattr *attr;
3363         struct cfg80211_acl_data *acl;
3364         int i = 0, n_entries, tmp;
3365
3366         if (!wiphy->max_acl_mac_addrs)
3367                 return ERR_PTR(-EOPNOTSUPP);
3368
3369         if (!info->attrs[NL80211_ATTR_ACL_POLICY])
3370                 return ERR_PTR(-EINVAL);
3371
3372         acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]);
3373         if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED &&
3374             acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED)
3375                 return ERR_PTR(-EINVAL);
3376
3377         if (!info->attrs[NL80211_ATTR_MAC_ADDRS])
3378                 return ERR_PTR(-EINVAL);
3379
3380         n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]);
3381         if (n_entries < 0)
3382                 return ERR_PTR(n_entries);
3383
3384         if (n_entries > wiphy->max_acl_mac_addrs)
3385                 return ERR_PTR(-ENOTSUPP);
3386
3387         acl = kzalloc(sizeof(*acl) + (sizeof(struct mac_address) * n_entries),
3388                       GFP_KERNEL);
3389         if (!acl)
3390                 return ERR_PTR(-ENOMEM);
3391
3392         nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) {
3393                 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN);
3394                 i++;
3395         }
3396
3397         acl->n_acl_entries = n_entries;
3398         acl->acl_policy = acl_policy;
3399
3400         return acl;
3401 }
3402
3403 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info)
3404 {
3405         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3406         struct net_device *dev = info->user_ptr[1];
3407         struct cfg80211_acl_data *acl;
3408         int err;
3409
3410         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3411             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3412                 return -EOPNOTSUPP;
3413
3414         if (!dev->ieee80211_ptr->beacon_interval)
3415                 return -EINVAL;
3416
3417         acl = parse_acl_data(&rdev->wiphy, info);
3418         if (IS_ERR(acl))
3419                 return PTR_ERR(acl);
3420
3421         err = rdev_set_mac_acl(rdev, dev, acl);
3422
3423         kfree(acl);
3424
3425         return err;
3426 }
3427
3428 static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
3429                            u8 *rates, u8 rates_len)
3430 {
3431         u8 i;
3432         u32 mask = 0;
3433
3434         for (i = 0; i < rates_len; i++) {
3435                 int rate = (rates[i] & 0x7f) * 5;
3436                 int ridx;
3437
3438                 for (ridx = 0; ridx < sband->n_bitrates; ridx++) {
3439                         struct ieee80211_rate *srate =
3440                                 &sband->bitrates[ridx];
3441                         if (rate == srate->bitrate) {
3442                                 mask |= 1 << ridx;
3443                                 break;
3444                         }
3445                 }
3446                 if (ridx == sband->n_bitrates)
3447                         return 0; /* rate not found */
3448         }
3449
3450         return mask;
3451 }
3452
3453 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband,
3454                                u8 *rates, u8 rates_len,
3455                                u8 mcs[IEEE80211_HT_MCS_MASK_LEN])
3456 {
3457         u8 i;
3458
3459         memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN);
3460
3461         for (i = 0; i < rates_len; i++) {
3462                 int ridx, rbit;
3463
3464                 ridx = rates[i] / 8;
3465                 rbit = BIT(rates[i] % 8);
3466
3467                 /* check validity */
3468                 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN))
3469                         return false;
3470
3471                 /* check availability */
3472                 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit)
3473                         mcs[ridx] |= rbit;
3474                 else
3475                         return false;
3476         }
3477
3478         return true;
3479 }
3480
3481 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map)
3482 {
3483         u16 mcs_mask = 0;
3484
3485         switch (vht_mcs_map) {
3486         case IEEE80211_VHT_MCS_NOT_SUPPORTED:
3487                 break;
3488         case IEEE80211_VHT_MCS_SUPPORT_0_7:
3489                 mcs_mask = 0x00FF;
3490                 break;
3491         case IEEE80211_VHT_MCS_SUPPORT_0_8:
3492                 mcs_mask = 0x01FF;
3493                 break;
3494         case IEEE80211_VHT_MCS_SUPPORT_0_9:
3495                 mcs_mask = 0x03FF;
3496                 break;
3497         default:
3498                 break;
3499         }
3500
3501         return mcs_mask;
3502 }
3503
3504 static void vht_build_mcs_mask(u16 vht_mcs_map,
3505                                u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
3506 {
3507         u8 nss;
3508
3509         for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
3510                 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03);
3511                 vht_mcs_map >>= 2;
3512         }
3513 }
3514
3515 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband,
3516                              struct nl80211_txrate_vht *txrate,
3517                              u16 mcs[NL80211_VHT_NSS_MAX])
3518 {
3519         u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
3520         u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {};
3521         u8 i;
3522
3523         if (!sband->vht_cap.vht_supported)
3524                 return false;
3525
3526         memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX);
3527
3528         /* Build vht_mcs_mask from VHT capabilities */
3529         vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask);
3530
3531         for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
3532                 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
3533                         mcs[i] = txrate->mcs[i];
3534                 else
3535                         return false;
3536         }
3537
3538         return true;
3539 }
3540
3541 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
3542         [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY,
3543                                     .len = NL80211_MAX_SUPP_RATES },
3544         [NL80211_TXRATE_HT] = { .type = NLA_BINARY,
3545                                 .len = NL80211_MAX_SUPP_HT_RATES },
3546         [NL80211_TXRATE_VHT] = { .len = sizeof(struct nl80211_txrate_vht)},
3547         [NL80211_TXRATE_GI] = { .type = NLA_U8 },
3548 };
3549
3550 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
3551                                          struct cfg80211_bitrate_mask *mask)
3552 {
3553         struct nlattr *tb[NL80211_TXRATE_MAX + 1];
3554         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3555         int rem, i;
3556         struct nlattr *tx_rates;
3557         struct ieee80211_supported_band *sband;
3558         u16 vht_tx_mcs_map;
3559
3560         memset(mask, 0, sizeof(*mask));
3561         /* Default to all rates enabled */
3562         for (i = 0; i < NUM_NL80211_BANDS; i++) {
3563                 sband = rdev->wiphy.bands[i];
3564
3565                 if (!sband)
3566                         continue;
3567
3568                 mask->control[i].legacy = (1 << sband->n_bitrates) - 1;
3569                 memcpy(mask->control[i].ht_mcs,
3570                        sband->ht_cap.mcs.rx_mask,
3571                        sizeof(mask->control[i].ht_mcs));
3572
3573                 if (!sband->vht_cap.vht_supported)
3574                         continue;
3575
3576                 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
3577                 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs);
3578         }
3579
3580         /* if no rates are given set it back to the defaults */
3581         if (!info->attrs[NL80211_ATTR_TX_RATES])
3582                 goto out;
3583
3584         /* The nested attribute uses enum nl80211_band as the index. This maps
3585          * directly to the enum nl80211_band values used in cfg80211.
3586          */
3587         BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
3588         nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem) {
3589                 enum nl80211_band band = nla_type(tx_rates);
3590                 int err;
3591
3592                 if (band < 0 || band >= NUM_NL80211_BANDS)
3593                         return -EINVAL;
3594                 sband = rdev->wiphy.bands[band];
3595                 if (sband == NULL)
3596                         return -EINVAL;
3597                 err = nla_parse_nested(tb, NL80211_TXRATE_MAX, tx_rates,
3598                                        nl80211_txattr_policy, info->extack);
3599                 if (err)
3600                         return err;
3601                 if (tb[NL80211_TXRATE_LEGACY]) {
3602                         mask->control[band].legacy = rateset_to_mask(
3603                                 sband,
3604                                 nla_data(tb[NL80211_TXRATE_LEGACY]),
3605                                 nla_len(tb[NL80211_TXRATE_LEGACY]));
3606                         if ((mask->control[band].legacy == 0) &&
3607                             nla_len(tb[NL80211_TXRATE_LEGACY]))
3608                                 return -EINVAL;
3609                 }
3610                 if (tb[NL80211_TXRATE_HT]) {
3611                         if (!ht_rateset_to_mask(
3612                                         sband,
3613                                         nla_data(tb[NL80211_TXRATE_HT]),
3614                                         nla_len(tb[NL80211_TXRATE_HT]),
3615                                         mask->control[band].ht_mcs))
3616                                 return -EINVAL;
3617                 }
3618                 if (tb[NL80211_TXRATE_VHT]) {
3619                         if (!vht_set_mcs_mask(
3620                                         sband,
3621                                         nla_data(tb[NL80211_TXRATE_VHT]),
3622                                         mask->control[band].vht_mcs))
3623                                 return -EINVAL;
3624                 }
3625                 if (tb[NL80211_TXRATE_GI]) {
3626                         mask->control[band].gi =
3627                                 nla_get_u8(tb[NL80211_TXRATE_GI]);
3628                         if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI)
3629                                 return -EINVAL;
3630                 }
3631
3632                 if (mask->control[band].legacy == 0) {
3633                         /* don't allow empty legacy rates if HT or VHT
3634                          * are not even supported.
3635                          */
3636                         if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported ||
3637                               rdev->wiphy.bands[band]->vht_cap.vht_supported))
3638                                 return -EINVAL;
3639
3640                         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
3641                                 if (mask->control[band].ht_mcs[i])
3642                                         goto out;
3643
3644                         for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
3645                                 if (mask->control[band].vht_mcs[i])
3646                                         goto out;
3647
3648                         /* legacy and mcs rates may not be both empty */
3649                         return -EINVAL;
3650                 }
3651         }
3652
3653 out:
3654         return 0;
3655 }
3656
3657 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev,
3658                                    enum nl80211_band band,
3659                                    struct cfg80211_bitrate_mask *beacon_rate)
3660 {
3661         u32 count_ht, count_vht, i;
3662         u32 rate = beacon_rate->control[band].legacy;
3663
3664         /* Allow only one rate */
3665         if (hweight32(rate) > 1)
3666                 return -EINVAL;
3667
3668         count_ht = 0;
3669         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
3670                 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) {
3671                         return -EINVAL;
3672                 } else if (beacon_rate->control[band].ht_mcs[i]) {
3673                         count_ht++;
3674                         if (count_ht > 1)
3675                                 return -EINVAL;
3676                 }
3677                 if (count_ht && rate)
3678                         return -EINVAL;
3679         }
3680
3681         count_vht = 0;
3682         for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
3683                 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) {
3684                         return -EINVAL;
3685                 } else if (beacon_rate->control[band].vht_mcs[i]) {
3686                         count_vht++;
3687                         if (count_vht > 1)
3688                                 return -EINVAL;
3689                 }
3690                 if (count_vht && rate)
3691                         return -EINVAL;
3692         }
3693
3694         if ((count_ht && count_vht) || (!rate && !count_ht && !count_vht))
3695                 return -EINVAL;
3696
3697         if (rate &&
3698             !wiphy_ext_feature_isset(&rdev->wiphy,
3699                                      NL80211_EXT_FEATURE_BEACON_RATE_LEGACY))
3700                 return -EINVAL;
3701         if (count_ht &&
3702             !wiphy_ext_feature_isset(&rdev->wiphy,
3703                                      NL80211_EXT_FEATURE_BEACON_RATE_HT))
3704                 return -EINVAL;
3705         if (count_vht &&
3706             !wiphy_ext_feature_isset(&rdev->wiphy,
3707                                      NL80211_EXT_FEATURE_BEACON_RATE_VHT))
3708                 return -EINVAL;
3709
3710         return 0;
3711 }
3712
3713 static int nl80211_parse_beacon(struct nlattr *attrs[],
3714                                 struct cfg80211_beacon_data *bcn)
3715 {
3716         bool haveinfo = false;
3717
3718         if (!is_valid_ie_attr(attrs[NL80211_ATTR_BEACON_TAIL]) ||
3719             !is_valid_ie_attr(attrs[NL80211_ATTR_IE]) ||
3720             !is_valid_ie_attr(attrs[NL80211_ATTR_IE_PROBE_RESP]) ||
3721             !is_valid_ie_attr(attrs[NL80211_ATTR_IE_ASSOC_RESP]))
3722                 return -EINVAL;
3723
3724         memset(bcn, 0, sizeof(*bcn));
3725
3726         if (attrs[NL80211_ATTR_BEACON_HEAD]) {
3727                 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]);
3728                 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]);
3729                 if (!bcn->head_len)
3730                         return -EINVAL;
3731                 haveinfo = true;
3732         }
3733
3734         if (attrs[NL80211_ATTR_BEACON_TAIL]) {
3735                 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]);
3736                 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]);
3737                 haveinfo = true;
3738         }
3739
3740         if (!haveinfo)
3741                 return -EINVAL;
3742
3743         if (attrs[NL80211_ATTR_IE]) {
3744                 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]);
3745                 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]);
3746         }
3747
3748         if (attrs[NL80211_ATTR_IE_PROBE_RESP]) {
3749                 bcn->proberesp_ies =
3750                         nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]);
3751                 bcn->proberesp_ies_len =
3752                         nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]);
3753         }
3754
3755         if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) {
3756                 bcn->assocresp_ies =
3757                         nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
3758                 bcn->assocresp_ies_len =
3759                         nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
3760         }
3761
3762         if (attrs[NL80211_ATTR_PROBE_RESP]) {
3763                 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]);
3764                 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]);
3765         }
3766
3767         return 0;
3768 }
3769
3770 static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params,
3771                                             const u8 *rates)
3772 {
3773         int i;
3774
3775         if (!rates)
3776                 return;
3777
3778         for (i = 0; i < rates[1]; i++) {
3779                 if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
3780                         params->ht_required = true;
3781                 if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY)
3782                         params->vht_required = true;
3783         }
3784 }
3785
3786 /*
3787  * Since the nl80211 API didn't include, from the beginning, attributes about
3788  * HT/VHT requirements/capabilities, we parse them out of the IEs for the
3789  * benefit of drivers that rebuild IEs in the firmware.
3790  */
3791 static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params)
3792 {
3793         const struct cfg80211_beacon_data *bcn = &params->beacon;
3794         size_t ies_len = bcn->tail_len;
3795         const u8 *ies = bcn->tail;
3796         const u8 *rates;
3797         const u8 *cap;
3798
3799         rates = cfg80211_find_ie(WLAN_EID_SUPP_RATES, ies, ies_len);
3800         nl80211_check_ap_rate_selectors(params, rates);
3801
3802         rates = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, ies, ies_len);
3803         nl80211_check_ap_rate_selectors(params, rates);
3804
3805         cap = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, ies, ies_len);
3806         if (cap && cap[1] >= sizeof(*params->ht_cap))
3807                 params->ht_cap = (void *)(cap + 2);
3808         cap = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, ies, ies_len);
3809         if (cap && cap[1] >= sizeof(*params->vht_cap))
3810                 params->vht_cap = (void *)(cap + 2);
3811 }
3812
3813 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
3814                                    struct cfg80211_ap_settings *params)
3815 {
3816         struct wireless_dev *wdev;
3817         bool ret = false;
3818
3819         list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
3820                 if (wdev->iftype != NL80211_IFTYPE_AP &&
3821                     wdev->iftype != NL80211_IFTYPE_P2P_GO)
3822                         continue;
3823
3824                 if (!wdev->preset_chandef.chan)
3825                         continue;
3826
3827                 params->chandef = wdev->preset_chandef;
3828                 ret = true;
3829                 break;
3830         }
3831
3832         return ret;
3833 }
3834
3835 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
3836                                     enum nl80211_auth_type auth_type,
3837                                     enum nl80211_commands cmd)
3838 {
3839         if (auth_type > NL80211_AUTHTYPE_MAX)
3840                 return false;
3841
3842         switch (cmd) {
3843         case NL80211_CMD_AUTHENTICATE:
3844                 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
3845                     auth_type == NL80211_AUTHTYPE_SAE)
3846                         return false;
3847                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
3848                                              NL80211_EXT_FEATURE_FILS_STA) &&
3849                     (auth_type == NL80211_AUTHTYPE_FILS_SK ||
3850                      auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
3851                      auth_type == NL80211_AUTHTYPE_FILS_PK))
3852                         return false;
3853                 return true;
3854         case NL80211_CMD_CONNECT:
3855                 /* SAE not supported yet */
3856                 if (auth_type == NL80211_AUTHTYPE_SAE)
3857                         return false;
3858                 /* FILS with SK PFS or PK not supported yet */
3859                 if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
3860                     auth_type == NL80211_AUTHTYPE_FILS_PK)
3861                         return false;
3862                 if (!wiphy_ext_feature_isset(
3863                             &rdev->wiphy,
3864                             NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
3865                     auth_type == NL80211_AUTHTYPE_FILS_SK)
3866                         return false;
3867                 return true;
3868         case NL80211_CMD_START_AP:
3869                 /* SAE not supported yet */
3870                 if (auth_type == NL80211_AUTHTYPE_SAE)
3871                         return false;
3872                 /* FILS not supported yet */
3873                 if (auth_type == NL80211_AUTHTYPE_FILS_SK ||
3874                     auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
3875                     auth_type == NL80211_AUTHTYPE_FILS_PK)
3876                         return false;
3877                 return true;
3878         default:
3879                 return false;
3880         }
3881 }
3882
3883 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
3884 {
3885         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3886         struct net_device *dev = info->user_ptr[1];
3887         struct wireless_dev *wdev = dev->ieee80211_ptr;
3888         struct cfg80211_ap_settings params;
3889         int err;
3890
3891         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3892             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3893                 return -EOPNOTSUPP;
3894
3895         if (!rdev->ops->start_ap)
3896                 return -EOPNOTSUPP;
3897
3898         if (wdev->beacon_interval)
3899                 return -EALREADY;
3900
3901         memset(&params, 0, sizeof(params));
3902
3903         /* these are required for START_AP */
3904         if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
3905             !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
3906             !info->attrs[NL80211_ATTR_BEACON_HEAD])
3907                 return -EINVAL;
3908
3909         err = nl80211_parse_beacon(info->attrs, &params.beacon);
3910         if (err)
3911                 return err;
3912
3913         params.beacon_interval =
3914                 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
3915         params.dtim_period =
3916                 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
3917
3918         err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype,
3919                                            params.beacon_interval);
3920         if (err)
3921                 return err;
3922
3923         /*
3924          * In theory, some of these attributes should be required here
3925          * but since they were not used when the command was originally
3926          * added, keep them optional for old user space programs to let
3927          * them continue to work with drivers that do not need the
3928          * additional information -- drivers must check!
3929          */
3930         if (info->attrs[NL80211_ATTR_SSID]) {
3931                 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
3932                 params.ssid_len =
3933                         nla_len(info->attrs[NL80211_ATTR_SSID]);
3934                 if (params.ssid_len == 0 ||
3935                     params.ssid_len > IEEE80211_MAX_SSID_LEN)
3936                         return -EINVAL;
3937         }
3938
3939         if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) {
3940                 params.hidden_ssid = nla_get_u32(
3941                         info->attrs[NL80211_ATTR_HIDDEN_SSID]);
3942                 if (params.hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE &&
3943                     params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_LEN &&
3944                     params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_CONTENTS)
3945                         return -EINVAL;
3946         }
3947
3948         params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
3949
3950         if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
3951                 params.auth_type = nla_get_u32(
3952                         info->attrs[NL80211_ATTR_AUTH_TYPE]);
3953                 if (!nl80211_valid_auth_type(rdev, params.auth_type,
3954                                              NL80211_CMD_START_AP))
3955                         return -EINVAL;
3956         } else
3957                 params.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
3958
3959         err = nl80211_crypto_settings(rdev, info, &params.crypto,
3960                                       NL80211_MAX_NR_CIPHER_SUITES);
3961         if (err)
3962                 return err;
3963
3964         if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) {
3965                 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER))
3966                         return -EOPNOTSUPP;
3967                 params.inactivity_timeout = nla_get_u16(
3968                         info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]);
3969         }
3970
3971         if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
3972                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3973                         return -EINVAL;
3974                 params.p2p_ctwindow =
3975                         nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
3976                 if (params.p2p_ctwindow > 127)
3977                         return -EINVAL;
3978                 if (params.p2p_ctwindow != 0 &&
3979                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
3980                         return -EINVAL;
3981         }
3982
3983         if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
3984                 u8 tmp;
3985
3986                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3987                         return -EINVAL;
3988                 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
3989                 if (tmp > 1)
3990                         return -EINVAL;
3991                 params.p2p_opp_ps = tmp;
3992                 if (params.p2p_opp_ps != 0 &&
3993                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
3994                         return -EINVAL;
3995         }
3996
3997         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
3998                 err = nl80211_parse_chandef(rdev, info, &params.chandef);
3999                 if (err)
4000                         return err;
4001         } else if (wdev->preset_chandef.chan) {
4002                 params.chandef = wdev->preset_chandef;
4003         } else if (!nl80211_get_ap_channel(rdev, &params))
4004                 return -EINVAL;
4005
4006         if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef,
4007                                            wdev->iftype))
4008                 return -EINVAL;
4009
4010         if (info->attrs[NL80211_ATTR_TX_RATES]) {
4011                 err = nl80211_parse_tx_bitrate_mask(info, &params.beacon_rate);
4012                 if (err)
4013                         return err;
4014
4015                 err = validate_beacon_tx_rate(rdev, params.chandef.chan->band,
4016                                               &params.beacon_rate);
4017                 if (err)
4018                         return err;
4019         }
4020
4021         if (info->attrs[NL80211_ATTR_SMPS_MODE]) {
4022                 params.smps_mode =
4023                         nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]);
4024                 switch (params.smps_mode) {
4025                 case NL80211_SMPS_OFF:
4026                         break;
4027                 case NL80211_SMPS_STATIC:
4028                         if (!(rdev->wiphy.features &
4029                               NL80211_FEATURE_STATIC_SMPS))
4030                                 return -EINVAL;
4031                         break;
4032                 case NL80211_SMPS_DYNAMIC:
4033                         if (!(rdev->wiphy.features &
4034                               NL80211_FEATURE_DYNAMIC_SMPS))
4035                                 return -EINVAL;
4036                         break;
4037                 default:
4038                         return -EINVAL;
4039                 }
4040         } else {
4041                 params.smps_mode = NL80211_SMPS_OFF;
4042         }
4043
4044         params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
4045         if (params.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ])
4046                 return -EOPNOTSUPP;
4047
4048         if (info->attrs[NL80211_ATTR_ACL_POLICY]) {
4049                 params.acl = parse_acl_data(&rdev->wiphy, info);
4050                 if (IS_ERR(params.acl))
4051                         return PTR_ERR(params.acl);
4052         }
4053
4054         nl80211_calculate_ap_params(&params);
4055
4056         wdev_lock(wdev);
4057         err = rdev_start_ap(rdev, dev, &params);
4058         if (!err) {
4059                 wdev->preset_chandef = params.chandef;
4060                 wdev->beacon_interval = params.beacon_interval;
4061                 wdev->chandef = params.chandef;
4062                 wdev->ssid_len = params.ssid_len;
4063                 memcpy(wdev->ssid, params.ssid, wdev->ssid_len);
4064         }
4065         wdev_unlock(wdev);
4066
4067         kfree(params.acl);
4068
4069         return err;
4070 }
4071
4072 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
4073 {
4074         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4075         struct net_device *dev = info->user_ptr[1];
4076         struct wireless_dev *wdev = dev->ieee80211_ptr;
4077         struct cfg80211_beacon_data params;
4078         int err;
4079
4080         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
4081             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4082                 return -EOPNOTSUPP;
4083
4084         if (!rdev->ops->change_beacon)
4085                 return -EOPNOTSUPP;
4086
4087         if (!wdev->beacon_interval)
4088                 return -EINVAL;
4089
4090         err = nl80211_parse_beacon(info->attrs, &params);
4091         if (err)
4092                 return err;
4093
4094         wdev_lock(wdev);
4095         err = rdev_change_beacon(rdev, dev, &params);
4096         wdev_unlock(wdev);
4097
4098         return err;
4099 }
4100
4101 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info)
4102 {
4103         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4104         struct net_device *dev = info->user_ptr[1];
4105
4106         return cfg80211_stop_ap(rdev, dev, false);
4107 }
4108
4109 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
4110         [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG },
4111         [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
4112         [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
4113         [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
4114         [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG },
4115         [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG },
4116 };
4117
4118 static int parse_station_flags(struct genl_info *info,
4119                                enum nl80211_iftype iftype,
4120                                struct station_parameters *params)
4121 {
4122         struct nlattr *flags[NL80211_STA_FLAG_MAX + 1];
4123         struct nlattr *nla;
4124         int flag;
4125
4126         /*
4127          * Try parsing the new attribute first so userspace
4128          * can specify both for older kernels.
4129          */
4130         nla = info->attrs[NL80211_ATTR_STA_FLAGS2];
4131         if (nla) {
4132                 struct nl80211_sta_flag_update *sta_flags;
4133
4134                 sta_flags = nla_data(nla);
4135                 params->sta_flags_mask = sta_flags->mask;
4136                 params->sta_flags_set = sta_flags->set;
4137                 params->sta_flags_set &= params->sta_flags_mask;
4138                 if ((params->sta_flags_mask |
4139                      params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID))
4140                         return -EINVAL;
4141                 return 0;
4142         }
4143
4144         /* if present, parse the old attribute */
4145
4146         nla = info->attrs[NL80211_ATTR_STA_FLAGS];
4147         if (!nla)
4148                 return 0;
4149
4150         if (nla_parse_nested(flags, NL80211_STA_FLAG_MAX, nla,
4151                              sta_flags_policy, info->extack))
4152                 return -EINVAL;
4153
4154         /*
4155          * Only allow certain flags for interface types so that
4156          * other attributes are silently ignored. Remember that
4157          * this is backward compatibility code with old userspace
4158          * and shouldn't be hit in other cases anyway.
4159          */
4160         switch (iftype) {
4161         case NL80211_IFTYPE_AP:
4162         case NL80211_IFTYPE_AP_VLAN:
4163         case NL80211_IFTYPE_P2P_GO:
4164                 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
4165                                          BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
4166                                          BIT(NL80211_STA_FLAG_WME) |
4167                                          BIT(NL80211_STA_FLAG_MFP);
4168                 break;
4169         case NL80211_IFTYPE_P2P_CLIENT:
4170         case NL80211_IFTYPE_STATION:
4171                 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
4172                                          BIT(NL80211_STA_FLAG_TDLS_PEER);
4173                 break;
4174         case NL80211_IFTYPE_MESH_POINT:
4175                 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4176                                          BIT(NL80211_STA_FLAG_MFP) |
4177                                          BIT(NL80211_STA_FLAG_AUTHORIZED);
4178         default:
4179                 return -EINVAL;
4180         }
4181
4182         for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) {
4183                 if (flags[flag]) {
4184                         params->sta_flags_set |= (1<<flag);
4185
4186                         /* no longer support new API additions in old API */
4187                         if (flag > NL80211_STA_FLAG_MAX_OLD_API)
4188                                 return -EINVAL;
4189                 }
4190         }
4191
4192         return 0;
4193 }
4194
4195 static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info,
4196                                  int attr)
4197 {
4198         struct nlattr *rate;
4199         u32 bitrate;
4200         u16 bitrate_compat;
4201         enum nl80211_rate_info rate_flg;
4202
4203         rate = nla_nest_start(msg, attr);
4204         if (!rate)
4205                 return false;
4206
4207         /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
4208         bitrate = cfg80211_calculate_bitrate(info);
4209         /* report 16-bit bitrate only if we can */
4210         bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0;
4211         if (bitrate > 0 &&
4212             nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate))
4213                 return false;
4214         if (bitrate_compat > 0 &&
4215             nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat))
4216                 return false;
4217
4218         switch (info->bw) {
4219         case RATE_INFO_BW_5:
4220                 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH;
4221                 break;
4222         case RATE_INFO_BW_10:
4223                 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH;
4224                 break;
4225         default:
4226                 WARN_ON(1);
4227                 /* fall through */
4228         case RATE_INFO_BW_20:
4229                 rate_flg = 0;
4230                 break;
4231         case RATE_INFO_BW_40:
4232                 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH;
4233                 break;
4234         case RATE_INFO_BW_80:
4235                 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH;
4236                 break;
4237         case RATE_INFO_BW_160:
4238                 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH;
4239                 break;
4240         }
4241
4242         if (rate_flg && nla_put_flag(msg, rate_flg))
4243                 return false;
4244
4245         if (info->flags & RATE_INFO_FLAGS_MCS) {
4246                 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs))
4247                         return false;
4248                 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
4249                     nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
4250                         return false;
4251         } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) {
4252                 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs))
4253                         return false;
4254                 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss))
4255                         return false;
4256                 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
4257                     nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
4258                         return false;
4259         }
4260
4261         nla_nest_end(msg, rate);
4262         return true;
4263 }
4264
4265 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal,
4266                                int id)
4267 {
4268         void *attr;
4269         int i = 0;
4270
4271         if (!mask)
4272                 return true;
4273
4274         attr = nla_nest_start(msg, id);
4275         if (!attr)
4276                 return false;
4277
4278         for (i = 0; i < IEEE80211_MAX_CHAINS; i++) {
4279                 if (!(mask & BIT(i)))
4280                         continue;
4281
4282                 if (nla_put_u8(msg, i, signal[i]))
4283                         return false;
4284         }
4285
4286         nla_nest_end(msg, attr);
4287
4288         return true;
4289 }
4290
4291 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
4292                                 u32 seq, int flags,
4293                                 struct cfg80211_registered_device *rdev,
4294                                 struct net_device *dev,
4295                                 const u8 *mac_addr, struct station_info *sinfo)
4296 {
4297         void *hdr;
4298         struct nlattr *sinfoattr, *bss_param;
4299
4300         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
4301         if (!hdr)
4302                 return -1;
4303
4304         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
4305             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
4306             nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation))
4307                 goto nla_put_failure;
4308
4309         sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO);
4310         if (!sinfoattr)
4311                 goto nla_put_failure;
4312
4313 #define PUT_SINFO(attr, memb, type) do {                                \
4314         BUILD_BUG_ON(sizeof(type) == sizeof(u64));                      \
4315         if (sinfo->filled & (1ULL << NL80211_STA_INFO_ ## attr) &&      \
4316             nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr,            \
4317                              sinfo->memb))                              \
4318                 goto nla_put_failure;                                   \
4319         } while (0)
4320 #define PUT_SINFO_U64(attr, memb) do {                                  \
4321         if (sinfo->filled & (1ULL << NL80211_STA_INFO_ ## attr) &&      \
4322             nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr,           \
4323                               sinfo->memb, NL80211_STA_INFO_PAD))       \
4324                 goto nla_put_failure;                                   \
4325         } while (0)
4326
4327         PUT_SINFO(CONNECTED_TIME, connected_time, u32);
4328         PUT_SINFO(INACTIVE_TIME, inactive_time, u32);
4329
4330         if (sinfo->filled & (BIT(NL80211_STA_INFO_RX_BYTES) |
4331                              BIT(NL80211_STA_INFO_RX_BYTES64)) &&
4332             nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES,
4333                         (u32)sinfo->rx_bytes))
4334                 goto nla_put_failure;
4335
4336         if (sinfo->filled & (BIT(NL80211_STA_INFO_TX_BYTES) |
4337                              BIT(NL80211_STA_INFO_TX_BYTES64)) &&
4338             nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES,
4339                         (u32)sinfo->tx_bytes))
4340                 goto nla_put_failure;
4341
4342         PUT_SINFO_U64(RX_BYTES64, rx_bytes);
4343         PUT_SINFO_U64(TX_BYTES64, tx_bytes);
4344         PUT_SINFO(LLID, llid, u16);
4345         PUT_SINFO(PLID, plid, u16);
4346         PUT_SINFO(PLINK_STATE, plink_state, u8);
4347         PUT_SINFO_U64(RX_DURATION, rx_duration);
4348
4349         switch (rdev->wiphy.signal_type) {
4350         case CFG80211_SIGNAL_TYPE_MBM:
4351                 PUT_SINFO(SIGNAL, signal, u8);
4352                 PUT_SINFO(SIGNAL_AVG, signal_avg, u8);
4353                 break;
4354         default:
4355                 break;
4356         }
4357         if (sinfo->filled & BIT(NL80211_STA_INFO_CHAIN_SIGNAL)) {
4358                 if (!nl80211_put_signal(msg, sinfo->chains,
4359                                         sinfo->chain_signal,
4360                                         NL80211_STA_INFO_CHAIN_SIGNAL))
4361                         goto nla_put_failure;
4362         }
4363         if (sinfo->filled & BIT(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) {
4364                 if (!nl80211_put_signal(msg, sinfo->chains,
4365                                         sinfo->chain_signal_avg,
4366                                         NL80211_STA_INFO_CHAIN_SIGNAL_AVG))
4367                         goto nla_put_failure;
4368         }
4369         if (sinfo->filled & BIT(NL80211_STA_INFO_TX_BITRATE)) {
4370                 if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
4371                                           NL80211_STA_INFO_TX_BITRATE))
4372                         goto nla_put_failure;
4373         }
4374         if (sinfo->filled & BIT(NL80211_STA_INFO_RX_BITRATE)) {
4375                 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate,
4376                                           NL80211_STA_INFO_RX_BITRATE))
4377                         goto nla_put_failure;
4378         }
4379
4380         PUT_SINFO(RX_PACKETS, rx_packets, u32);
4381         PUT_SINFO(TX_PACKETS, tx_packets, u32);
4382         PUT_SINFO(TX_RETRIES, tx_retries, u32);
4383         PUT_SINFO(TX_FAILED, tx_failed, u32);
4384         PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32);
4385         PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32);
4386         PUT_SINFO(LOCAL_PM, local_pm, u32);
4387         PUT_SINFO(PEER_PM, peer_pm, u32);
4388         PUT_SINFO(NONPEER_PM, nonpeer_pm, u32);
4389
4390         if (sinfo->filled & BIT(NL80211_STA_INFO_BSS_PARAM)) {
4391                 bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM);
4392                 if (!bss_param)
4393                         goto nla_put_failure;
4394
4395                 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) &&
4396                      nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) ||
4397                     ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) &&
4398                      nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) ||
4399                     ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) &&
4400                      nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) ||
4401                     nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD,
4402                                sinfo->bss_param.dtim_period) ||
4403                     nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL,
4404                                 sinfo->bss_param.beacon_interval))
4405                         goto nla_put_failure;
4406
4407                 nla_nest_end(msg, bss_param);
4408         }
4409         if ((sinfo->filled & BIT(NL80211_STA_INFO_STA_FLAGS)) &&
4410             nla_put(msg, NL80211_STA_INFO_STA_FLAGS,
4411                     sizeof(struct nl80211_sta_flag_update),
4412                     &sinfo->sta_flags))
4413                 goto nla_put_failure;
4414
4415         PUT_SINFO_U64(T_OFFSET, t_offset);
4416         PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc);
4417         PUT_SINFO_U64(BEACON_RX, rx_beacon);
4418         PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
4419
4420 #undef PUT_SINFO
4421 #undef PUT_SINFO_U64
4422
4423         if (sinfo->filled & BIT(NL80211_STA_INFO_TID_STATS)) {
4424                 struct nlattr *tidsattr;
4425                 int tid;
4426
4427                 tidsattr = nla_nest_start(msg, NL80211_STA_INFO_TID_STATS);
4428                 if (!tidsattr)
4429                         goto nla_put_failure;
4430
4431                 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) {
4432                         struct cfg80211_tid_stats *tidstats;
4433                         struct nlattr *tidattr;
4434
4435                         tidstats = &sinfo->pertid[tid];
4436
4437                         if (!tidstats->filled)
4438                                 continue;
4439
4440                         tidattr = nla_nest_start(msg, tid + 1);
4441                         if (!tidattr)
4442                                 goto nla_put_failure;
4443
4444 #define PUT_TIDVAL_U64(attr, memb) do {                                 \
4445         if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) &&       \
4446             nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr,          \
4447                               tidstats->memb, NL80211_TID_STATS_PAD))   \
4448                 goto nla_put_failure;                                   \
4449         } while (0)
4450
4451                         PUT_TIDVAL_U64(RX_MSDU, rx_msdu);
4452                         PUT_TIDVAL_U64(TX_MSDU, tx_msdu);
4453                         PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries);
4454                         PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed);
4455
4456 #undef PUT_TIDVAL_U64
4457                         nla_nest_end(msg, tidattr);
4458                 }
4459
4460                 nla_nest_end(msg, tidsattr);
4461         }
4462
4463         nla_nest_end(msg, sinfoattr);
4464
4465         if (sinfo->assoc_req_ies_len &&
4466             nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len,
4467                     sinfo->assoc_req_ies))
4468                 goto nla_put_failure;
4469
4470         genlmsg_end(msg, hdr);
4471         return 0;
4472
4473  nla_put_failure:
4474         genlmsg_cancel(msg, hdr);
4475         return -EMSGSIZE;
4476 }
4477
4478 static int nl80211_dump_station(struct sk_buff *skb,
4479                                 struct netlink_callback *cb)
4480 {
4481         struct station_info sinfo;
4482         struct cfg80211_registered_device *rdev;
4483         struct wireless_dev *wdev;
4484         u8 mac_addr[ETH_ALEN];
4485         int sta_idx = cb->args[2];
4486         int err;
4487
4488         rtnl_lock();
4489         err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
4490         if (err)
4491                 goto out_err;
4492
4493         if (!wdev->netdev) {
4494                 err = -EINVAL;
4495                 goto out_err;
4496         }
4497
4498         if (!rdev->ops->dump_station) {
4499                 err = -EOPNOTSUPP;
4500                 goto out_err;
4501         }
4502
4503         while (1) {
4504                 memset(&sinfo, 0, sizeof(sinfo));
4505                 err = rdev_dump_station(rdev, wdev->netdev, sta_idx,
4506                                         mac_addr, &sinfo);
4507                 if (err == -ENOENT)
4508                         break;
4509                 if (err)
4510                         goto out_err;
4511
4512                 if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION,
4513                                 NETLINK_CB(cb->skb).portid,
4514                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
4515                                 rdev, wdev->netdev, mac_addr,
4516                                 &sinfo) < 0)
4517                         goto out;
4518
4519                 sta_idx++;
4520         }
4521
4522  out:
4523         cb->args[2] = sta_idx;
4524         err = skb->len;
4525  out_err:
4526         rtnl_unlock();
4527
4528         return err;
4529 }
4530
4531 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
4532 {
4533         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4534         struct net_device *dev = info->user_ptr[1];
4535         struct station_info sinfo;
4536         struct sk_buff *msg;
4537         u8 *mac_addr = NULL;
4538         int err;
4539
4540         memset(&sinfo, 0, sizeof(sinfo));
4541
4542         if (!info->attrs[NL80211_ATTR_MAC])
4543                 return -EINVAL;
4544
4545         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4546
4547         if (!rdev->ops->get_station)
4548                 return -EOPNOTSUPP;
4549
4550         err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
4551         if (err)
4552                 return err;
4553
4554         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
4555         if (!msg)
4556                 return -ENOMEM;
4557
4558         if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION,
4559                                  info->snd_portid, info->snd_seq, 0,
4560                                  rdev, dev, mac_addr, &sinfo) < 0) {
4561                 nlmsg_free(msg);
4562                 return -ENOBUFS;
4563         }
4564
4565         return genlmsg_reply(msg, info);
4566 }
4567
4568 int cfg80211_check_station_change(struct wiphy *wiphy,
4569                                   struct station_parameters *params,
4570                                   enum cfg80211_station_type statype)
4571 {
4572         if (params->listen_interval != -1 &&
4573             statype != CFG80211_STA_AP_CLIENT_UNASSOC)
4574                 return -EINVAL;
4575
4576         if (params->support_p2p_ps != -1 &&
4577             statype != CFG80211_STA_AP_CLIENT_UNASSOC)
4578                 return -EINVAL;
4579
4580         if (params->aid &&
4581             !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) &&
4582             statype != CFG80211_STA_AP_CLIENT_UNASSOC)
4583                 return -EINVAL;
4584
4585         /* When you run into this, adjust the code below for the new flag */
4586         BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
4587
4588         switch (statype) {
4589         case CFG80211_STA_MESH_PEER_KERNEL:
4590         case CFG80211_STA_MESH_PEER_USER:
4591                 /*
4592                  * No ignoring the TDLS flag here -- the userspace mesh
4593                  * code doesn't have the bug of including TDLS in the
4594                  * mask everywhere.
4595                  */
4596                 if (params->sta_flags_mask &
4597                                 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4598                                   BIT(NL80211_STA_FLAG_MFP) |
4599                                   BIT(NL80211_STA_FLAG_AUTHORIZED)))
4600                         return -EINVAL;
4601                 break;
4602         case CFG80211_STA_TDLS_PEER_SETUP:
4603         case CFG80211_STA_TDLS_PEER_ACTIVE:
4604                 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
4605                         return -EINVAL;
4606                 /* ignore since it can't change */
4607                 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
4608                 break;
4609         default:
4610                 /* disallow mesh-specific things */
4611                 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION)
4612                         return -EINVAL;
4613                 if (params->local_pm)
4614                         return -EINVAL;
4615                 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
4616                         return -EINVAL;
4617         }
4618
4619         if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
4620             statype != CFG80211_STA_TDLS_PEER_ACTIVE) {
4621                 /* TDLS can't be set, ... */
4622                 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
4623                         return -EINVAL;
4624                 /*
4625                  * ... but don't bother the driver with it. This works around
4626                  * a hostapd/wpa_supplicant issue -- it always includes the
4627                  * TLDS_PEER flag in the mask even for AP mode.
4628                  */
4629                 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
4630         }
4631
4632         if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
4633             statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
4634                 /* reject other things that can't change */
4635                 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD)
4636                         return -EINVAL;
4637                 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY)
4638                         return -EINVAL;
4639                 if (params->supported_rates)
4640                         return -EINVAL;
4641                 if (params->ext_capab || params->ht_capa || params->vht_capa)
4642                         return -EINVAL;
4643         }
4644
4645         if (statype != CFG80211_STA_AP_CLIENT &&
4646             statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
4647                 if (params->vlan)
4648                         return -EINVAL;
4649         }
4650
4651         switch (statype) {
4652         case CFG80211_STA_AP_MLME_CLIENT:
4653                 /* Use this only for authorizing/unauthorizing a station */
4654                 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)))
4655                         return -EOPNOTSUPP;
4656                 break;
4657         case CFG80211_STA_AP_CLIENT:
4658         case CFG80211_STA_AP_CLIENT_UNASSOC:
4659                 /* accept only the listed bits */
4660                 if (params->sta_flags_mask &
4661                                 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
4662                                   BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4663                                   BIT(NL80211_STA_FLAG_ASSOCIATED) |
4664                                   BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
4665                                   BIT(NL80211_STA_FLAG_WME) |
4666                                   BIT(NL80211_STA_FLAG_MFP)))
4667                         return -EINVAL;
4668
4669                 /* but authenticated/associated only if driver handles it */
4670                 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
4671                     params->sta_flags_mask &
4672                                 (BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4673                                  BIT(NL80211_STA_FLAG_ASSOCIATED)))
4674                         return -EINVAL;
4675                 break;
4676         case CFG80211_STA_IBSS:
4677         case CFG80211_STA_AP_STA:
4678                 /* reject any changes other than AUTHORIZED */
4679                 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
4680                         return -EINVAL;
4681                 break;
4682         case CFG80211_STA_TDLS_PEER_SETUP:
4683                 /* reject any changes other than AUTHORIZED or WME */
4684                 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
4685                                                BIT(NL80211_STA_FLAG_WME)))
4686                         return -EINVAL;
4687                 /* force (at least) rates when authorizing */
4688                 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) &&
4689                     !params->supported_rates)
4690                         return -EINVAL;
4691                 break;
4692         case CFG80211_STA_TDLS_PEER_ACTIVE:
4693                 /* reject any changes */
4694                 return -EINVAL;
4695         case CFG80211_STA_MESH_PEER_KERNEL:
4696                 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
4697                         return -EINVAL;
4698                 break;
4699         case CFG80211_STA_MESH_PEER_USER:
4700                 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION &&
4701                     params->plink_action != NL80211_PLINK_ACTION_BLOCK)
4702                         return -EINVAL;
4703                 break;
4704         }
4705
4706         /*
4707          * Older kernel versions ignored this attribute entirely, so don't
4708          * reject attempts to update it but mark it as unused instead so the
4709          * driver won't look at the data.
4710          */
4711         if (statype != CFG80211_STA_AP_CLIENT_UNASSOC &&
4712             statype != CFG80211_STA_TDLS_PEER_SETUP)
4713                 params->opmode_notif_used = false;
4714
4715         return 0;
4716 }
4717 EXPORT_SYMBOL(cfg80211_check_station_change);
4718
4719 /*
4720  * Get vlan interface making sure it is running and on the right wiphy.
4721  */
4722 static struct net_device *get_vlan(struct genl_info *info,
4723                                    struct cfg80211_registered_device *rdev)
4724 {
4725         struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN];
4726         struct net_device *v;
4727         int ret;
4728
4729         if (!vlanattr)
4730                 return NULL;
4731
4732         v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr));
4733         if (!v)
4734                 return ERR_PTR(-ENODEV);
4735
4736         if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) {
4737                 ret = -EINVAL;
4738                 goto error;
4739         }
4740
4741         if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
4742             v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
4743             v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
4744                 ret = -EINVAL;
4745                 goto error;
4746         }
4747
4748         if (!netif_running(v)) {
4749                 ret = -ENETDOWN;
4750                 goto error;
4751         }
4752
4753         return v;
4754  error:
4755         dev_put(v);
4756         return ERR_PTR(ret);
4757 }
4758
4759 static const struct nla_policy
4760 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = {
4761         [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 },
4762         [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 },
4763 };
4764
4765 static int nl80211_parse_sta_wme(struct genl_info *info,
4766                                  struct station_parameters *params)
4767 {
4768         struct nlattr *tb[NL80211_STA_WME_MAX + 1];
4769         struct nlattr *nla;
4770         int err;
4771
4772         /* parse WME attributes if present */
4773         if (!info->attrs[NL80211_ATTR_STA_WME])
4774                 return 0;
4775
4776         nla = info->attrs[NL80211_ATTR_STA_WME];
4777         err = nla_parse_nested(tb, NL80211_STA_WME_MAX, nla,
4778                                nl80211_sta_wme_policy, info->extack);
4779         if (err)
4780                 return err;
4781
4782         if (tb[NL80211_STA_WME_UAPSD_QUEUES])
4783                 params->uapsd_queues = nla_get_u8(
4784                         tb[NL80211_STA_WME_UAPSD_QUEUES]);
4785         if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK)
4786                 return -EINVAL;
4787
4788         if (tb[NL80211_STA_WME_MAX_SP])
4789                 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]);
4790
4791         if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK)
4792                 return -EINVAL;
4793
4794         params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD;
4795
4796         return 0;
4797 }
4798
4799 static int nl80211_parse_sta_channel_info(struct genl_info *info,
4800                                       struct station_parameters *params)
4801 {
4802         if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
4803                 params->supported_channels =
4804                      nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
4805                 params->supported_channels_len =
4806                      nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
4807                 /*
4808                  * Need to include at least one (first channel, number of
4809                  * channels) tuple for each subband, and must have proper
4810                  * tuples for the rest of the data as well.
4811                  */
4812                 if (params->supported_channels_len < 2)
4813                         return -EINVAL;
4814                 if (params->supported_channels_len % 2)
4815                         return -EINVAL;
4816         }
4817
4818         if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
4819                 params->supported_oper_classes =
4820                  nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
4821                 params->supported_oper_classes_len =
4822                   nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
4823                 /*
4824                  * The value of the Length field of the Supported Operating
4825                  * Classes element is between 2 and 253.
4826                  */
4827                 if (params->supported_oper_classes_len < 2 ||
4828                     params->supported_oper_classes_len > 253)
4829                         return -EINVAL;
4830         }
4831         return 0;
4832 }
4833
4834 static int nl80211_set_station_tdls(struct genl_info *info,
4835                                     struct station_parameters *params)
4836 {
4837         int err;
4838         /* Dummy STA entry gets updated once the peer capabilities are known */
4839         if (info->attrs[NL80211_ATTR_PEER_AID])
4840                 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
4841         if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
4842                 params->ht_capa =
4843                         nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
4844         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
4845                 params->vht_capa =
4846                         nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
4847
4848         err = nl80211_parse_sta_channel_info(info, params);
4849         if (err)
4850                 return err;
4851
4852         return nl80211_parse_sta_wme(info, params);
4853 }
4854
4855 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
4856 {
4857         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4858         struct net_device *dev = info->user_ptr[1];
4859         struct station_parameters params;
4860         u8 *mac_addr;
4861         int err;
4862
4863         memset(&params, 0, sizeof(params));
4864
4865         if (!rdev->ops->change_station)
4866                 return -EOPNOTSUPP;
4867
4868         /*
4869          * AID and listen_interval properties can be set only for unassociated
4870          * station. Include these parameters here and will check them in
4871          * cfg80211_check_station_change().
4872          */
4873         if (info->attrs[NL80211_ATTR_STA_AID])
4874                 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
4875
4876         if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
4877                 params.listen_interval =
4878                      nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
4879         else
4880                 params.listen_interval = -1;
4881
4882         if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
4883                 u8 tmp;
4884
4885                 tmp = nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
4886                 if (tmp >= NUM_NL80211_P2P_PS_STATUS)
4887                         return -EINVAL;
4888
4889                 params.support_p2p_ps = tmp;
4890         } else {
4891                 params.support_p2p_ps = -1;
4892         }
4893
4894         if (!info->attrs[NL80211_ATTR_MAC])
4895                 return -EINVAL;
4896
4897         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4898
4899         if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
4900                 params.supported_rates =
4901                         nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
4902                 params.supported_rates_len =
4903                         nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
4904         }
4905
4906         if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
4907                 params.capability =
4908                         nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
4909                 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
4910         }
4911
4912         if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
4913                 params.ext_capab =
4914                         nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
4915                 params.ext_capab_len =
4916                         nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
4917         }
4918
4919         if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
4920                 return -EINVAL;
4921
4922         if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) {
4923                 params.plink_action =
4924                         nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
4925                 if (params.plink_action >= NUM_NL80211_PLINK_ACTIONS)
4926                         return -EINVAL;
4927         }
4928
4929         if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) {
4930                 params.plink_state =
4931                         nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]);
4932                 if (params.plink_state >= NUM_NL80211_PLINK_STATES)
4933                         return -EINVAL;
4934                 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) {
4935                         params.peer_aid = nla_get_u16(
4936                                 info->attrs[NL80211_ATTR_MESH_PEER_AID]);
4937                         if (params.peer_aid > IEEE80211_MAX_AID)
4938                                 return -EINVAL;
4939                 }
4940                 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE;
4941         }
4942
4943         if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) {
4944                 enum nl80211_mesh_power_mode pm = nla_get_u32(
4945                         info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]);
4946
4947                 if (pm <= NL80211_MESH_POWER_UNKNOWN ||
4948                     pm > NL80211_MESH_POWER_MAX)
4949                         return -EINVAL;
4950
4951                 params.local_pm = pm;
4952         }
4953
4954         if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
4955                 params.opmode_notif_used = true;
4956                 params.opmode_notif =
4957                         nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
4958         }
4959
4960         /* Include parameters for TDLS peer (will check later) */
4961         err = nl80211_set_station_tdls(info, &params);
4962         if (err)
4963                 return err;
4964
4965         params.vlan = get_vlan(info, rdev);
4966         if (IS_ERR(params.vlan))
4967                 return PTR_ERR(params.vlan);
4968
4969         switch (dev->ieee80211_ptr->iftype) {
4970         case NL80211_IFTYPE_AP:
4971         case NL80211_IFTYPE_AP_VLAN:
4972         case NL80211_IFTYPE_P2P_GO:
4973         case NL80211_IFTYPE_P2P_CLIENT:
4974         case NL80211_IFTYPE_STATION:
4975         case NL80211_IFTYPE_ADHOC:
4976         case NL80211_IFTYPE_MESH_POINT:
4977                 break;
4978         default:
4979                 err = -EOPNOTSUPP;
4980                 goto out_put_vlan;
4981         }
4982
4983         /* driver will call cfg80211_check_station_change() */
4984         err = rdev_change_station(rdev, dev, mac_addr, &params);
4985
4986  out_put_vlan:
4987         if (params.vlan)
4988                 dev_put(params.vlan);
4989
4990         return err;
4991 }
4992
4993 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
4994 {
4995         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4996         int err;
4997         struct net_device *dev = info->user_ptr[1];
4998         struct station_parameters params;
4999         u8 *mac_addr = NULL;
5000         u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
5001                          BIT(NL80211_STA_FLAG_ASSOCIATED);
5002
5003         memset(&params, 0, sizeof(params));
5004
5005         if (!rdev->ops->add_station)
5006                 return -EOPNOTSUPP;
5007
5008         if (!info->attrs[NL80211_ATTR_MAC])
5009                 return -EINVAL;
5010
5011         if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
5012                 return -EINVAL;
5013
5014         if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
5015                 return -EINVAL;
5016
5017         if (!info->attrs[NL80211_ATTR_STA_AID] &&
5018             !info->attrs[NL80211_ATTR_PEER_AID])
5019                 return -EINVAL;
5020
5021         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
5022         params.supported_rates =
5023                 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
5024         params.supported_rates_len =
5025                 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
5026         params.listen_interval =
5027                 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
5028
5029         if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
5030                 u8 tmp;
5031
5032                 tmp = nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
5033                 if (tmp >= NUM_NL80211_P2P_PS_STATUS)
5034                         return -EINVAL;
5035
5036                 params.support_p2p_ps = tmp;
5037         } else {
5038                 /*
5039                  * if not specified, assume it's supported for P2P GO interface,
5040                  * and is NOT supported for AP interface
5041                  */
5042                 params.support_p2p_ps =
5043                         dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO;
5044         }
5045
5046         if (info->attrs[NL80211_ATTR_PEER_AID])
5047                 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
5048         else
5049                 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
5050         if (!params.aid || params.aid > IEEE80211_MAX_AID)
5051                 return -EINVAL;
5052
5053         if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
5054                 params.capability =
5055                         nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
5056                 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
5057         }
5058
5059         if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
5060                 params.ext_capab =
5061                         nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
5062                 params.ext_capab_len =
5063                         nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
5064         }
5065
5066         if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
5067                 params.ht_capa =
5068                         nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
5069
5070         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
5071                 params.vht_capa =
5072                         nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
5073
5074         if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
5075                 params.opmode_notif_used = true;
5076                 params.opmode_notif =
5077                         nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
5078         }
5079
5080         if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) {
5081                 params.plink_action =
5082                         nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
5083                 if (params.plink_action >= NUM_NL80211_PLINK_ACTIONS)
5084                         return -EINVAL;
5085         }
5086
5087         err = nl80211_parse_sta_channel_info(info, &params);
5088         if (err)
5089                 return err;
5090
5091         err = nl80211_parse_sta_wme(info, &params);
5092         if (err)
5093                 return err;
5094
5095         if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
5096                 return -EINVAL;
5097
5098         /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT
5099          * as userspace might just pass through the capabilities from the IEs
5100          * directly, rather than enforcing this restriction and returning an
5101          * error in this case.
5102          */
5103         if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) {
5104                 params.ht_capa = NULL;
5105                 params.vht_capa = NULL;
5106         }
5107
5108         /* When you run into this, adjust the code below for the new flag */
5109         BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
5110
5111         switch (dev->ieee80211_ptr->iftype) {
5112         case NL80211_IFTYPE_AP:
5113         case NL80211_IFTYPE_AP_VLAN:
5114         case NL80211_IFTYPE_P2P_GO:
5115                 /* ignore WME attributes if iface/sta is not capable */
5116                 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) ||
5117                     !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME)))
5118                         params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
5119
5120                 /* TDLS peers cannot be added */
5121                 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
5122                     info->attrs[NL80211_ATTR_PEER_AID])
5123                         return -EINVAL;
5124                 /* but don't bother the driver with it */
5125                 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
5126
5127                 /* allow authenticated/associated only if driver handles it */
5128                 if (!(rdev->wiphy.features &
5129                                 NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
5130                     params.sta_flags_mask & auth_assoc)
5131                         return -EINVAL;
5132
5133                 /* Older userspace, or userspace wanting to be compatible with
5134                  * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth
5135                  * and assoc flags in the mask, but assumes the station will be
5136                  * added as associated anyway since this was the required driver
5137                  * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was
5138                  * introduced.
5139                  * In order to not bother drivers with this quirk in the API
5140                  * set the flags in both the mask and set for new stations in
5141                  * this case.
5142                  */
5143                 if (!(params.sta_flags_mask & auth_assoc)) {
5144                         params.sta_flags_mask |= auth_assoc;
5145                         params.sta_flags_set |= auth_assoc;
5146                 }
5147
5148                 /* must be last in here for error handling */
5149                 params.vlan = get_vlan(info, rdev);
5150                 if (IS_ERR(params.vlan))
5151                         return PTR_ERR(params.vlan);
5152                 break;
5153         case NL80211_IFTYPE_MESH_POINT:
5154                 /* ignore uAPSD data */
5155                 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
5156
5157                 /* associated is disallowed */
5158                 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED))
5159                         return -EINVAL;
5160                 /* TDLS peers cannot be added */
5161                 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
5162                     info->attrs[NL80211_ATTR_PEER_AID])
5163                         return -EINVAL;
5164                 break;
5165         case NL80211_IFTYPE_STATION:
5166         case NL80211_IFTYPE_P2P_CLIENT:
5167                 /* ignore uAPSD data */
5168                 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
5169
5170                 /* these are disallowed */
5171                 if (params.sta_flags_mask &
5172                                 (BIT(NL80211_STA_FLAG_ASSOCIATED) |
5173                                  BIT(NL80211_STA_FLAG_AUTHENTICATED)))
5174                         return -EINVAL;
5175                 /* Only TDLS peers can be added */
5176                 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
5177                         return -EINVAL;
5178                 /* Can only add if TDLS ... */
5179                 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS))
5180                         return -EOPNOTSUPP;
5181                 /* ... with external setup is supported */
5182                 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP))
5183                         return -EOPNOTSUPP;
5184                 /*
5185                  * Older wpa_supplicant versions always mark the TDLS peer
5186                  * as authorized, but it shouldn't yet be.
5187                  */
5188                 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED);
5189                 break;
5190         default:
5191                 return -EOPNOTSUPP;
5192         }
5193
5194         /* be aware of params.vlan when changing code here */
5195
5196         err = rdev_add_station(rdev, dev, mac_addr, &params);
5197
5198         if (params.vlan)
5199                 dev_put(params.vlan);
5200         return err;
5201 }
5202
5203 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
5204 {
5205         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5206         struct net_device *dev = info->user_ptr[1];
5207         struct station_del_parameters params;
5208
5209         memset(&params, 0, sizeof(params));
5210
5211         if (info->attrs[NL80211_ATTR_MAC])
5212                 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]);
5213
5214         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
5215             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
5216             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
5217             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5218                 return -EINVAL;
5219
5220         if (!rdev->ops->del_station)
5221                 return -EOPNOTSUPP;
5222
5223         if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) {
5224                 params.subtype =
5225                         nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]);
5226                 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 &&
5227                     params.subtype != IEEE80211_STYPE_DEAUTH >> 4)
5228                         return -EINVAL;
5229         } else {
5230                 /* Default to Deauthentication frame */
5231                 params.subtype = IEEE80211_STYPE_DEAUTH >> 4;
5232         }
5233
5234         if (info->attrs[NL80211_ATTR_REASON_CODE]) {
5235                 params.reason_code =
5236                         nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
5237                 if (params.reason_code == 0)
5238                         return -EINVAL; /* 0 is reserved */
5239         } else {
5240                 /* Default to reason code 2 */
5241                 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID;
5242         }
5243
5244         return rdev_del_station(rdev, dev, &params);
5245 }
5246
5247 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq,
5248                                 int flags, struct net_device *dev,
5249                                 u8 *dst, u8 *next_hop,
5250                                 struct mpath_info *pinfo)
5251 {
5252         void *hdr;
5253         struct nlattr *pinfoattr;
5254
5255         hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH);
5256         if (!hdr)
5257                 return -1;
5258
5259         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
5260             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) ||
5261             nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) ||
5262             nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation))
5263                 goto nla_put_failure;
5264
5265         pinfoattr = nla_nest_start(msg, NL80211_ATTR_MPATH_INFO);
5266         if (!pinfoattr)
5267                 goto nla_put_failure;
5268         if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) &&
5269             nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN,
5270                         pinfo->frame_qlen))
5271                 goto nla_put_failure;
5272         if (((pinfo->filled & MPATH_INFO_SN) &&
5273              nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) ||
5274             ((pinfo->filled & MPATH_INFO_METRIC) &&
5275              nla_put_u32(msg, NL80211_MPATH_INFO_METRIC,
5276                          pinfo->metric)) ||
5277             ((pinfo->filled & MPATH_INFO_EXPTIME) &&
5278              nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME,
5279                          pinfo->exptime)) ||
5280             ((pinfo->filled & MPATH_INFO_FLAGS) &&
5281              nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS,
5282                         pinfo->flags)) ||
5283             ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) &&
5284              nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
5285                          pinfo->discovery_timeout)) ||
5286             ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) &&
5287              nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES,
5288                         pinfo->discovery_retries)))
5289                 goto nla_put_failure;
5290
5291         nla_nest_end(msg, pinfoattr);
5292
5293         genlmsg_end(msg, hdr);
5294         return 0;
5295
5296  nla_put_failure:
5297         genlmsg_cancel(msg, hdr);
5298         return -EMSGSIZE;
5299 }
5300
5301 static int nl80211_dump_mpath(struct sk_buff *skb,
5302                               struct netlink_callback *cb)
5303 {
5304         struct mpath_info pinfo;
5305         struct cfg80211_registered_device *rdev;
5306         struct wireless_dev *wdev;
5307         u8 dst[ETH_ALEN];
5308         u8 next_hop[ETH_ALEN];
5309         int path_idx = cb->args[2];
5310         int err;
5311
5312         rtnl_lock();
5313         err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
5314         if (err)
5315                 goto out_err;
5316
5317         if (!rdev->ops->dump_mpath) {
5318                 err = -EOPNOTSUPP;
5319                 goto out_err;
5320         }
5321
5322         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
5323                 err = -EOPNOTSUPP;
5324                 goto out_err;
5325         }
5326
5327         while (1) {
5328                 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst,
5329                                       next_hop, &pinfo);
5330                 if (err == -ENOENT)
5331                         break;
5332                 if (err)
5333                         goto out_err;
5334
5335                 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
5336                                        cb->nlh->nlmsg_seq, NLM_F_MULTI,
5337                                        wdev->netdev, dst, next_hop,
5338                                        &pinfo) < 0)
5339                         goto out;
5340
5341                 path_idx++;
5342         }
5343
5344  out:
5345         cb->args[2] = path_idx;
5346         err = skb->len;
5347  out_err:
5348         rtnl_unlock();
5349         return err;
5350 }
5351
5352 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
5353 {
5354         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5355         int err;
5356         struct net_device *dev = info->user_ptr[1];
5357         struct mpath_info pinfo;
5358         struct sk_buff *msg;
5359         u8 *dst = NULL;
5360         u8 next_hop[ETH_ALEN];
5361
5362         memset(&pinfo, 0, sizeof(pinfo));
5363
5364         if (!info->attrs[NL80211_ATTR_MAC])
5365                 return -EINVAL;
5366
5367         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
5368
5369         if (!rdev->ops->get_mpath)
5370                 return -EOPNOTSUPP;
5371
5372         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
5373                 return -EOPNOTSUPP;
5374
5375         err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo);
5376         if (err)
5377                 return err;
5378
5379         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
5380         if (!msg)
5381                 return -ENOMEM;
5382
5383         if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
5384                                  dev, dst, next_hop, &pinfo) < 0) {
5385                 nlmsg_free(msg);
5386                 return -ENOBUFS;
5387         }
5388
5389         return genlmsg_reply(msg, info);
5390 }
5391
5392 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
5393 {
5394         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5395         struct net_device *dev = info->user_ptr[1];
5396         u8 *dst = NULL;
5397         u8 *next_hop = NULL;
5398
5399         if (!info->attrs[NL80211_ATTR_MAC])
5400                 return -EINVAL;
5401
5402         if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
5403                 return -EINVAL;
5404
5405         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
5406         next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
5407
5408         if (!rdev->ops->change_mpath)
5409                 return -EOPNOTSUPP;
5410
5411         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
5412                 return -EOPNOTSUPP;
5413
5414         return rdev_change_mpath(rdev, dev, dst, next_hop);
5415 }
5416
5417 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
5418 {
5419         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5420         struct net_device *dev = info->user_ptr[1];
5421         u8 *dst = NULL;
5422         u8 *next_hop = NULL;
5423
5424         if (!info->attrs[NL80211_ATTR_MAC])
5425                 return -EINVAL;
5426
5427         if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
5428                 return -EINVAL;
5429
5430         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
5431         next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
5432
5433         if (!rdev->ops->add_mpath)
5434                 return -EOPNOTSUPP;
5435
5436         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
5437                 return -EOPNOTSUPP;
5438
5439         return rdev_add_mpath(rdev, dev, dst, next_hop);
5440 }
5441
5442 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
5443 {
5444         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5445         struct net_device *dev = info->user_ptr[1];
5446         u8 *dst = NULL;
5447
5448         if (info->attrs[NL80211_ATTR_MAC])
5449                 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
5450
5451         if (!rdev->ops->del_mpath)
5452                 return -EOPNOTSUPP;
5453
5454         return rdev_del_mpath(rdev, dev, dst);
5455 }
5456
5457 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info)
5458 {
5459         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5460         int err;
5461         struct net_device *dev = info->user_ptr[1];
5462         struct mpath_info pinfo;
5463         struct sk_buff *msg;
5464         u8 *dst = NULL;
5465         u8 mpp[ETH_ALEN];
5466
5467         memset(&pinfo, 0, sizeof(pinfo));
5468
5469         if (!info->attrs[NL80211_ATTR_MAC])
5470                 return -EINVAL;
5471
5472         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
5473
5474         if (!rdev->ops->get_mpp)
5475                 return -EOPNOTSUPP;
5476
5477         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
5478                 return -EOPNOTSUPP;
5479
5480         err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo);
5481         if (err)
5482                 return err;
5483
5484         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
5485         if (!msg)
5486                 return -ENOMEM;
5487
5488         if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
5489                                dev, dst, mpp, &pinfo) < 0) {
5490                 nlmsg_free(msg);
5491                 return -ENOBUFS;
5492         }
5493
5494         return genlmsg_reply(msg, info);
5495 }
5496
5497 static int nl80211_dump_mpp(struct sk_buff *skb,
5498                             struct netlink_callback *cb)
5499 {
5500         struct mpath_info pinfo;
5501         struct cfg80211_registered_device *rdev;
5502         struct wireless_dev *wdev;
5503         u8 dst[ETH_ALEN];
5504         u8 mpp[ETH_ALEN];
5505         int path_idx = cb->args[2];
5506         int err;
5507
5508         rtnl_lock();
5509         err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
5510         if (err)
5511                 goto out_err;
5512
5513         if (!rdev->ops->dump_mpp) {
5514                 err = -EOPNOTSUPP;
5515                 goto out_err;
5516         }
5517
5518         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
5519                 err = -EOPNOTSUPP;
5520                 goto out_err;
5521         }
5522
5523         while (1) {
5524                 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst,
5525                                     mpp, &pinfo);
5526                 if (err == -ENOENT)
5527                         break;
5528                 if (err)
5529                         goto out_err;
5530
5531                 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
5532                                        cb->nlh->nlmsg_seq, NLM_F_MULTI,
5533                                        wdev->netdev, dst, mpp,
5534                                        &pinfo) < 0)
5535                         goto out;
5536
5537                 path_idx++;
5538         }
5539
5540  out:
5541         cb->args[2] = path_idx;
5542         err = skb->len;
5543  out_err:
5544         rtnl_unlock();
5545         return err;
5546 }
5547
5548 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
5549 {
5550         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5551         struct net_device *dev = info->user_ptr[1];
5552         struct wireless_dev *wdev = dev->ieee80211_ptr;
5553         struct bss_parameters params;
5554         int err;
5555
5556         memset(&params, 0, sizeof(params));
5557         /* default to not changing parameters */
5558         params.use_cts_prot = -1;
5559         params.use_short_preamble = -1;
5560         params.use_short_slot_time = -1;
5561         params.ap_isolate = -1;
5562         params.ht_opmode = -1;
5563         params.p2p_ctwindow = -1;
5564         params.p2p_opp_ps = -1;
5565
5566         if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
5567                 params.use_cts_prot =
5568                     nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
5569         if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE])
5570                 params.use_short_preamble =
5571                     nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
5572         if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME])
5573                 params.use_short_slot_time =
5574                     nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
5575         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
5576                 params.basic_rates =
5577                         nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
5578                 params.basic_rates_len =
5579                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
5580         }
5581         if (info->attrs[NL80211_ATTR_AP_ISOLATE])
5582                 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]);
5583         if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE])
5584                 params.ht_opmode =
5585                         nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]);
5586
5587         if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
5588                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5589                         return -EINVAL;
5590                 params.p2p_ctwindow =
5591                         nla_get_s8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
5592                 if (params.p2p_ctwindow < 0)
5593                         return -EINVAL;
5594                 if (params.p2p_ctwindow != 0 &&
5595                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
5596                         return -EINVAL;
5597         }
5598
5599         if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
5600                 u8 tmp;
5601
5602                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5603                         return -EINVAL;
5604                 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
5605                 if (tmp > 1)
5606                         return -EINVAL;
5607                 params.p2p_opp_ps = tmp;
5608                 if (params.p2p_opp_ps &&
5609                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
5610                         return -EINVAL;
5611         }
5612
5613         if (!rdev->ops->change_bss)
5614                 return -EOPNOTSUPP;
5615
5616         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
5617             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5618                 return -EOPNOTSUPP;
5619
5620         wdev_lock(wdev);
5621         err = rdev_change_bss(rdev, dev, &params);
5622         wdev_unlock(wdev);
5623
5624         return err;
5625 }
5626
5627 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
5628 {
5629         char *data = NULL;
5630         bool is_indoor;
5631         enum nl80211_user_reg_hint_type user_reg_hint_type;
5632         u32 owner_nlportid;
5633
5634         /*
5635          * You should only get this when cfg80211 hasn't yet initialized
5636          * completely when built-in to the kernel right between the time
5637          * window between nl80211_init() and regulatory_init(), if that is
5638          * even possible.
5639          */
5640         if (unlikely(!rcu_access_pointer(cfg80211_regdomain)))
5641                 return -EINPROGRESS;
5642
5643         if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE])
5644                 user_reg_hint_type =
5645                   nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]);
5646         else
5647                 user_reg_hint_type = NL80211_USER_REG_HINT_USER;
5648
5649         switch (user_reg_hint_type) {
5650         case NL80211_USER_REG_HINT_USER:
5651         case NL80211_USER_REG_HINT_CELL_BASE:
5652                 if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
5653                         return -EINVAL;
5654
5655                 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
5656                 return regulatory_hint_user(data, user_reg_hint_type);
5657         case NL80211_USER_REG_HINT_INDOOR:
5658                 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
5659                         owner_nlportid = info->snd_portid;
5660                         is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR];
5661                 } else {
5662                         owner_nlportid = 0;
5663                         is_indoor = true;
5664                 }
5665
5666                 return regulatory_hint_indoor(is_indoor, owner_nlportid);
5667         default:
5668                 return -EINVAL;
5669         }
5670 }
5671
5672 static int nl80211_get_mesh_config(struct sk_buff *skb,
5673                                    struct genl_info *info)
5674 {
5675         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5676         struct net_device *dev = info->user_ptr[1];
5677         struct wireless_dev *wdev = dev->ieee80211_ptr;
5678         struct mesh_config cur_params;
5679         int err = 0;
5680         void *hdr;
5681         struct nlattr *pinfoattr;
5682         struct sk_buff *msg;
5683
5684         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
5685                 return -EOPNOTSUPP;
5686
5687         if (!rdev->ops->get_mesh_config)
5688                 return -EOPNOTSUPP;
5689
5690         wdev_lock(wdev);
5691         /* If not connected, get default parameters */
5692         if (!wdev->mesh_id_len)
5693                 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params));
5694         else
5695                 err = rdev_get_mesh_config(rdev, dev, &cur_params);
5696         wdev_unlock(wdev);
5697
5698         if (err)
5699                 return err;
5700
5701         /* Draw up a netlink message to send back */
5702         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
5703         if (!msg)
5704                 return -ENOMEM;
5705         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
5706                              NL80211_CMD_GET_MESH_CONFIG);
5707         if (!hdr)
5708                 goto out;
5709         pinfoattr = nla_nest_start(msg, NL80211_ATTR_MESH_CONFIG);
5710         if (!pinfoattr)
5711                 goto nla_put_failure;
5712         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
5713             nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT,
5714                         cur_params.dot11MeshRetryTimeout) ||
5715             nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT,
5716                         cur_params.dot11MeshConfirmTimeout) ||
5717             nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT,
5718                         cur_params.dot11MeshHoldingTimeout) ||
5719             nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
5720                         cur_params.dot11MeshMaxPeerLinks) ||
5721             nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES,
5722                        cur_params.dot11MeshMaxRetries) ||
5723             nla_put_u8(msg, NL80211_MESHCONF_TTL,
5724                        cur_params.dot11MeshTTL) ||
5725             nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL,
5726                        cur_params.element_ttl) ||
5727             nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
5728                        cur_params.auto_open_plinks) ||
5729             nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
5730                         cur_params.dot11MeshNbrOffsetMaxNeighbor) ||
5731             nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
5732                        cur_params.dot11MeshHWMPmaxPREQretries) ||
5733             nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME,
5734                         cur_params.path_refresh_time) ||
5735             nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
5736                         cur_params.min_discovery_timeout) ||
5737             nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
5738                         cur_params.dot11MeshHWMPactivePathTimeout) ||
5739             nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
5740                         cur_params.dot11MeshHWMPpreqMinInterval) ||
5741             nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
5742                         cur_params.dot11MeshHWMPperrMinInterval) ||
5743             nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
5744                         cur_params.dot11MeshHWMPnetDiameterTraversalTime) ||
5745             nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE,
5746                        cur_params.dot11MeshHWMPRootMode) ||
5747             nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
5748                         cur_params.dot11MeshHWMPRannInterval) ||
5749             nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
5750                        cur_params.dot11MeshGateAnnouncementProtocol) ||
5751             nla_put_u8(msg, NL80211_MESHCONF_FORWARDING,
5752                        cur_params.dot11MeshForwarding) ||
5753             nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD,
5754                         cur_params.rssi_threshold) ||
5755             nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE,
5756                         cur_params.ht_opmode) ||
5757             nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
5758                         cur_params.dot11MeshHWMPactivePathToRootTimeout) ||
5759             nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
5760                         cur_params.dot11MeshHWMProotInterval) ||
5761             nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
5762                         cur_params.dot11MeshHWMPconfirmationInterval) ||
5763             nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE,
5764                         cur_params.power_mode) ||
5765             nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW,
5766                         cur_params.dot11MeshAwakeWindowDuration) ||
5767             nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT,
5768                         cur_params.plink_timeout))
5769                 goto nla_put_failure;
5770         nla_nest_end(msg, pinfoattr);
5771         genlmsg_end(msg, hdr);
5772         return genlmsg_reply(msg, info);
5773
5774  nla_put_failure:
5775         genlmsg_cancel(msg, hdr);
5776  out:
5777         nlmsg_free(msg);
5778         return -ENOBUFS;
5779 }
5780
5781 static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = {
5782         [NL80211_MESHCONF_RETRY_TIMEOUT] = { .type = NLA_U16 },
5783         [NL80211_MESHCONF_CONFIRM_TIMEOUT] = { .type = NLA_U16 },
5784         [NL80211_MESHCONF_HOLDING_TIMEOUT] = { .type = NLA_U16 },
5785         [NL80211_MESHCONF_MAX_PEER_LINKS] = { .type = NLA_U16 },
5786         [NL80211_MESHCONF_MAX_RETRIES] = { .type = NLA_U8 },
5787         [NL80211_MESHCONF_TTL] = { .type = NLA_U8 },
5788         [NL80211_MESHCONF_ELEMENT_TTL] = { .type = NLA_U8 },
5789         [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = { .type = NLA_U8 },
5790         [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = { .type = NLA_U32 },
5791         [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 },
5792         [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 },
5793         [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = { .type = NLA_U16 },
5794         [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
5795         [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = { .type = NLA_U16 },
5796         [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = { .type = NLA_U16 },
5797         [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = { .type = NLA_U16 },
5798         [NL80211_MESHCONF_HWMP_ROOTMODE] = { .type = NLA_U8 },
5799         [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = { .type = NLA_U16 },
5800         [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = { .type = NLA_U8 },
5801         [NL80211_MESHCONF_FORWARDING] = { .type = NLA_U8 },
5802         [NL80211_MESHCONF_RSSI_THRESHOLD] = { .type = NLA_U32 },
5803         [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 },
5804         [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 },
5805         [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = { .type = NLA_U16 },
5806         [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = { .type = NLA_U16 },
5807         [NL80211_MESHCONF_POWER_MODE] = { .type = NLA_U32 },
5808         [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 },
5809         [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 },
5810 };
5811
5812 static const struct nla_policy
5813         nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
5814         [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 },
5815         [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
5816         [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
5817         [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
5818         [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 },
5819         [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG },
5820         [NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY,
5821                                     .len = IEEE80211_MAX_DATA_LEN },
5822         [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG },
5823 };
5824
5825 static int nl80211_check_bool(const struct nlattr *nla, u8 min, u8 max, bool *out)
5826 {
5827         u8 val = nla_get_u8(nla);
5828         if (val < min || val > max)
5829                 return -EINVAL;
5830         *out = val;
5831         return 0;
5832 }
5833
5834 static int nl80211_check_u8(const struct nlattr *nla, u8 min, u8 max, u8 *out)
5835 {
5836         u8 val = nla_get_u8(nla);
5837         if (val < min || val > max)
5838                 return -EINVAL;
5839         *out = val;
5840         return 0;
5841 }
5842
5843 static int nl80211_check_u16(const struct nlattr *nla, u16 min, u16 max, u16 *out)
5844 {
5845         u16 val = nla_get_u16(nla);
5846         if (val < min || val > max)
5847                 return -EINVAL;
5848         *out = val;
5849         return 0;
5850 }
5851
5852 static int nl80211_check_u32(const struct nlattr *nla, u32 min, u32 max, u32 *out)
5853 {
5854         u32 val = nla_get_u32(nla);
5855         if (val < min || val > max)
5856                 return -EINVAL;
5857         *out = val;
5858         return 0;
5859 }
5860
5861 static int nl80211_check_s32(const struct nlattr *nla, s32 min, s32 max, s32 *out)
5862 {
5863         s32 val = nla_get_s32(nla);
5864         if (val < min || val > max)
5865                 return -EINVAL;
5866         *out = val;
5867         return 0;
5868 }
5869
5870 static int nl80211_check_power_mode(const struct nlattr *nla,
5871                                     enum nl80211_mesh_power_mode min,
5872                                     enum nl80211_mesh_power_mode max,
5873                                     enum nl80211_mesh_power_mode *out)
5874 {
5875         u32 val = nla_get_u32(nla);
5876         if (val < min || val > max)
5877                 return -EINVAL;
5878         *out = val;
5879         return 0;
5880 }
5881
5882 static int nl80211_parse_mesh_config(struct genl_info *info,
5883                                      struct mesh_config *cfg,
5884                                      u32 *mask_out)
5885 {
5886         struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1];
5887         u32 mask = 0;
5888         u16 ht_opmode;
5889
5890 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, min, max, mask, attr, fn) \
5891 do {                                                                        \
5892         if (tb[attr]) {                                                     \
5893                 if (fn(tb[attr], min, max, &cfg->param))                    \
5894                         return -EINVAL;                                     \
5895                 mask |= (1 << (attr - 1));                                  \
5896         }                                                                   \
5897 } while (0)
5898
5899         if (!info->attrs[NL80211_ATTR_MESH_CONFIG])
5900                 return -EINVAL;
5901         if (nla_parse_nested(tb, NL80211_MESHCONF_ATTR_MAX,
5902                              info->attrs[NL80211_ATTR_MESH_CONFIG],
5903                              nl80211_meshconf_params_policy, info->extack))
5904                 return -EINVAL;
5905
5906         /* This makes sure that there aren't more than 32 mesh config
5907          * parameters (otherwise our bitfield scheme would not work.) */
5908         BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
5909
5910         /* Fill in the params struct */
5911         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, 1, 255,
5912                                   mask, NL80211_MESHCONF_RETRY_TIMEOUT,
5913                                   nl80211_check_u16);
5914         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, 1, 255,
5915                                   mask, NL80211_MESHCONF_CONFIRM_TIMEOUT,
5916                                   nl80211_check_u16);
5917         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, 1, 255,
5918                                   mask, NL80211_MESHCONF_HOLDING_TIMEOUT,
5919                                   nl80211_check_u16);
5920         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, 0, 255,
5921                                   mask, NL80211_MESHCONF_MAX_PEER_LINKS,
5922                                   nl80211_check_u16);
5923         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, 0, 16,
5924                                   mask, NL80211_MESHCONF_MAX_RETRIES,
5925                                   nl80211_check_u8);
5926         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, 1, 255,
5927                                   mask, NL80211_MESHCONF_TTL, nl80211_check_u8);
5928         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, 1, 255,
5929                                   mask, NL80211_MESHCONF_ELEMENT_TTL,
5930                                   nl80211_check_u8);
5931         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, 0, 1,
5932                                   mask, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
5933                                   nl80211_check_bool);
5934         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor,
5935                                   1, 255, mask,
5936                                   NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
5937                                   nl80211_check_u32);
5938         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, 0, 255,
5939                                   mask, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
5940                                   nl80211_check_u8);
5941         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, 1, 65535,
5942                                   mask, NL80211_MESHCONF_PATH_REFRESH_TIME,
5943                                   nl80211_check_u32);
5944         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, 1, 65535,
5945                                   mask, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
5946                                   nl80211_check_u16);
5947         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout,
5948                                   1, 65535, mask,
5949                                   NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
5950                                   nl80211_check_u32);
5951         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval,
5952                                   1, 65535, mask,
5953                                   NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
5954                                   nl80211_check_u16);
5955         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval,
5956                                   1, 65535, mask,
5957                                   NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
5958                                   nl80211_check_u16);
5959         FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
5960                                   dot11MeshHWMPnetDiameterTraversalTime,
5961                                   1, 65535, mask,
5962                                   NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
5963                                   nl80211_check_u16);
5964         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, 0, 4,
5965                                   mask, NL80211_MESHCONF_HWMP_ROOTMODE,
5966                                   nl80211_check_u8);
5967         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, 1, 65535,
5968                                   mask, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
5969                                   nl80211_check_u16);
5970         FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
5971                                   dot11MeshGateAnnouncementProtocol, 0, 1,
5972                                   mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
5973                                   nl80211_check_bool);
5974         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, 0, 1,
5975                                   mask, NL80211_MESHCONF_FORWARDING,
5976                                   nl80211_check_bool);
5977         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, -255, 0,
5978                                   mask, NL80211_MESHCONF_RSSI_THRESHOLD,
5979                                   nl80211_check_s32);
5980         /*
5981          * Check HT operation mode based on
5982          * IEEE 802.11 2012 8.4.2.59 HT Operation element.
5983          */
5984         if (tb[NL80211_MESHCONF_HT_OPMODE]) {
5985                 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]);
5986
5987                 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION |
5988                                   IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT |
5989                                   IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
5990                         return -EINVAL;
5991
5992                 if ((ht_opmode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT) &&
5993                     (ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
5994                         return -EINVAL;
5995
5996                 switch (ht_opmode & IEEE80211_HT_OP_MODE_PROTECTION) {
5997                 case IEEE80211_HT_OP_MODE_PROTECTION_NONE:
5998                 case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ:
5999                         if (ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)
6000                                 return -EINVAL;
6001                         break;
6002                 case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER:
6003                 case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED:
6004                         if (!(ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
6005                                 return -EINVAL;
6006                         break;
6007                 }
6008                 cfg->ht_opmode = ht_opmode;
6009                 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1));
6010         }
6011         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathToRootTimeout,
6012                                   1, 65535, mask,
6013                                   NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
6014                                   nl80211_check_u32);
6015         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, 1, 65535,
6016                                   mask, NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
6017                                   nl80211_check_u16);
6018         FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
6019                                   dot11MeshHWMPconfirmationInterval,
6020                                   1, 65535, mask,
6021                                   NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
6022                                   nl80211_check_u16);
6023         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode,
6024                                   NL80211_MESH_POWER_ACTIVE,
6025                                   NL80211_MESH_POWER_MAX,
6026                                   mask, NL80211_MESHCONF_POWER_MODE,
6027                                   nl80211_check_power_mode);
6028         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration,
6029                                   0, 65535, mask,
6030                                   NL80211_MESHCONF_AWAKE_WINDOW, nl80211_check_u16);
6031         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, 0, 0xffffffff,
6032                                   mask, NL80211_MESHCONF_PLINK_TIMEOUT,
6033                                   nl80211_check_u32);
6034         if (mask_out)
6035                 *mask_out = mask;
6036
6037         return 0;
6038
6039 #undef FILL_IN_MESH_PARAM_IF_SET
6040 }
6041
6042 static int nl80211_parse_mesh_setup(struct genl_info *info,
6043                                      struct mesh_setup *setup)
6044 {
6045         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6046         struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1];
6047
6048         if (!info->attrs[NL80211_ATTR_MESH_SETUP])
6049                 return -EINVAL;
6050         if (nla_parse_nested(tb, NL80211_MESH_SETUP_ATTR_MAX,
6051                              info->attrs[NL80211_ATTR_MESH_SETUP],
6052                              nl80211_mesh_setup_params_policy, info->extack))
6053                 return -EINVAL;
6054
6055         if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])
6056                 setup->sync_method =
6057                 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ?
6058                  IEEE80211_SYNC_METHOD_VENDOR :
6059                  IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET;
6060
6061         if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])
6062                 setup->path_sel_proto =
6063                 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ?
6064                  IEEE80211_PATH_PROTOCOL_VENDOR :
6065                  IEEE80211_PATH_PROTOCOL_HWMP;
6066
6067         if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])
6068                 setup->path_metric =
6069                 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ?
6070                  IEEE80211_PATH_METRIC_VENDOR :
6071                  IEEE80211_PATH_METRIC_AIRTIME;
6072
6073         if (tb[NL80211_MESH_SETUP_IE]) {
6074                 struct nlattr *ieattr =
6075                         tb[NL80211_MESH_SETUP_IE];
6076                 if (!is_valid_ie_attr(ieattr))
6077                         return -EINVAL;
6078                 setup->ie = nla_data(ieattr);
6079                 setup->ie_len = nla_len(ieattr);
6080         }
6081         if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] &&
6082             !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM))
6083                 return -EINVAL;
6084         setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]);
6085         setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]);
6086         setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]);
6087         if (setup->is_secure)
6088                 setup->user_mpm = true;
6089
6090         if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) {
6091                 if (!setup->user_mpm)
6092                         return -EINVAL;
6093                 setup->auth_id =
6094                         nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]);
6095         }
6096
6097         return 0;
6098 }
6099
6100 static int nl80211_update_mesh_config(struct sk_buff *skb,
6101                                       struct genl_info *info)
6102 {
6103         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6104         struct net_device *dev = info->user_ptr[1];
6105         struct wireless_dev *wdev = dev->ieee80211_ptr;
6106         struct mesh_config cfg;
6107         u32 mask;
6108         int err;
6109
6110         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
6111                 return -EOPNOTSUPP;
6112
6113         if (!rdev->ops->update_mesh_config)
6114                 return -EOPNOTSUPP;
6115
6116         err = nl80211_parse_mesh_config(info, &cfg, &mask);
6117         if (err)
6118                 return err;
6119
6120         wdev_lock(wdev);
6121         if (!wdev->mesh_id_len)
6122                 err = -ENOLINK;
6123
6124         if (!err)
6125                 err = rdev_update_mesh_config(rdev, dev, mask, &cfg);
6126
6127         wdev_unlock(wdev);
6128
6129         return err;
6130 }
6131
6132 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom,
6133                               struct sk_buff *msg)
6134 {
6135         struct nlattr *nl_reg_rules;
6136         unsigned int i;
6137
6138         if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) ||
6139             (regdom->dfs_region &&
6140              nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region)))
6141                 goto nla_put_failure;
6142
6143         nl_reg_rules = nla_nest_start(msg, NL80211_ATTR_REG_RULES);
6144         if (!nl_reg_rules)
6145                 goto nla_put_failure;
6146
6147         for (i = 0; i < regdom->n_reg_rules; i++) {
6148                 struct nlattr *nl_reg_rule;
6149                 const struct ieee80211_reg_rule *reg_rule;
6150                 const struct ieee80211_freq_range *freq_range;
6151                 const struct ieee80211_power_rule *power_rule;
6152                 unsigned int max_bandwidth_khz;
6153
6154                 reg_rule = &regdom->reg_rules[i];
6155                 freq_range = &reg_rule->freq_range;
6156                 power_rule = &reg_rule->power_rule;
6157
6158                 nl_reg_rule = nla_nest_start(msg, i);
6159                 if (!nl_reg_rule)
6160                         goto nla_put_failure;
6161
6162                 max_bandwidth_khz = freq_range->max_bandwidth_khz;
6163                 if (!max_bandwidth_khz)
6164                         max_bandwidth_khz = reg_get_max_bandwidth(regdom,
6165                                                                   reg_rule);
6166
6167                 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS,
6168                                 reg_rule->flags) ||
6169                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START,
6170                                 freq_range->start_freq_khz) ||
6171                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END,
6172                                 freq_range->end_freq_khz) ||
6173                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW,
6174                                 max_bandwidth_khz) ||
6175                     nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
6176                                 power_rule->max_antenna_gain) ||
6177                     nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP,
6178                                 power_rule->max_eirp) ||
6179                     nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME,
6180                                 reg_rule->dfs_cac_ms))
6181                         goto nla_put_failure;
6182
6183                 nla_nest_end(msg, nl_reg_rule);
6184         }
6185
6186         nla_nest_end(msg, nl_reg_rules);
6187         return 0;
6188
6189 nla_put_failure:
6190         return -EMSGSIZE;
6191 }
6192
6193 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info)
6194 {
6195         const struct ieee80211_regdomain *regdom = NULL;
6196         struct cfg80211_registered_device *rdev;
6197         struct wiphy *wiphy = NULL;
6198         struct sk_buff *msg;
6199         void *hdr;
6200
6201         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
6202         if (!msg)
6203                 return -ENOBUFS;
6204
6205         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
6206                              NL80211_CMD_GET_REG);
6207         if (!hdr)
6208                 goto put_failure;
6209
6210         if (info->attrs[NL80211_ATTR_WIPHY]) {
6211                 bool self_managed;
6212
6213                 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
6214                 if (IS_ERR(rdev)) {
6215                         nlmsg_free(msg);
6216                         return PTR_ERR(rdev);
6217                 }
6218
6219                 wiphy = &rdev->wiphy;
6220                 self_managed = wiphy->regulatory_flags &
6221                                REGULATORY_WIPHY_SELF_MANAGED;
6222                 regdom = get_wiphy_regdom(wiphy);
6223
6224                 /* a self-managed-reg device must have a private regdom */
6225                 if (WARN_ON(!regdom && self_managed)) {
6226                         nlmsg_free(msg);
6227                         return -EINVAL;
6228                 }
6229
6230                 if (regdom &&
6231                     nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
6232                         goto nla_put_failure;
6233         }
6234
6235         if (!wiphy && reg_last_request_cell_base() &&
6236             nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
6237                         NL80211_USER_REG_HINT_CELL_BASE))
6238                 goto nla_put_failure;
6239
6240         rcu_read_lock();
6241
6242         if (!regdom)
6243                 regdom = rcu_dereference(cfg80211_regdomain);
6244
6245         if (nl80211_put_regdom(regdom, msg))
6246                 goto nla_put_failure_rcu;
6247
6248         rcu_read_unlock();
6249
6250         genlmsg_end(msg, hdr);
6251         return genlmsg_reply(msg, info);
6252
6253 nla_put_failure_rcu:
6254         rcu_read_unlock();
6255 nla_put_failure:
6256         genlmsg_cancel(msg, hdr);
6257 put_failure:
6258         nlmsg_free(msg);
6259         return -EMSGSIZE;
6260 }
6261
6262 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb,
6263                                u32 seq, int flags, struct wiphy *wiphy,
6264                                const struct ieee80211_regdomain *regdom)
6265 {
6266         void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
6267                                    NL80211_CMD_GET_REG);
6268
6269         if (!hdr)
6270                 return -1;
6271
6272         genl_dump_check_consistent(cb, hdr, &nl80211_fam);
6273
6274         if (nl80211_put_regdom(regdom, msg))
6275                 goto nla_put_failure;
6276
6277         if (!wiphy && reg_last_request_cell_base() &&
6278             nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
6279                         NL80211_USER_REG_HINT_CELL_BASE))
6280                 goto nla_put_failure;
6281
6282         if (wiphy &&
6283             nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
6284                 goto nla_put_failure;
6285
6286         if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
6287             nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
6288                 goto nla_put_failure;
6289
6290         genlmsg_end(msg, hdr);
6291         return 0;
6292
6293 nla_put_failure:
6294         genlmsg_cancel(msg, hdr);
6295         return -EMSGSIZE;
6296 }
6297
6298 static int nl80211_get_reg_dump(struct sk_buff *skb,
6299                                 struct netlink_callback *cb)
6300 {
6301         const struct ieee80211_regdomain *regdom = NULL;
6302         struct cfg80211_registered_device *rdev;
6303         int err, reg_idx, start = cb->args[2];
6304
6305         rtnl_lock();
6306
6307         if (cfg80211_regdomain && start == 0) {
6308                 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
6309                                           NLM_F_MULTI, NULL,
6310                                           rtnl_dereference(cfg80211_regdomain));
6311                 if (err < 0)
6312                         goto out_err;
6313         }
6314
6315         /* the global regdom is idx 0 */
6316         reg_idx = 1;
6317         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
6318                 regdom = get_wiphy_regdom(&rdev->wiphy);
6319                 if (!regdom)
6320                         continue;
6321
6322                 if (++reg_idx <= start)
6323                         continue;
6324
6325                 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
6326                                           NLM_F_MULTI, &rdev->wiphy, regdom);
6327                 if (err < 0) {
6328                         reg_idx--;
6329                         break;
6330                 }
6331         }
6332
6333         cb->args[2] = reg_idx;
6334         err = skb->len;
6335 out_err:
6336         rtnl_unlock();
6337         return err;
6338 }
6339
6340 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
6341 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
6342         [NL80211_ATTR_REG_RULE_FLAGS]           = { .type = NLA_U32 },
6343         [NL80211_ATTR_FREQ_RANGE_START]         = { .type = NLA_U32 },
6344         [NL80211_ATTR_FREQ_RANGE_END]           = { .type = NLA_U32 },
6345         [NL80211_ATTR_FREQ_RANGE_MAX_BW]        = { .type = NLA_U32 },
6346         [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]  = { .type = NLA_U32 },
6347         [NL80211_ATTR_POWER_RULE_MAX_EIRP]      = { .type = NLA_U32 },
6348         [NL80211_ATTR_DFS_CAC_TIME]             = { .type = NLA_U32 },
6349 };
6350
6351 static int parse_reg_rule(struct nlattr *tb[],
6352         struct ieee80211_reg_rule *reg_rule)
6353 {
6354         struct ieee80211_freq_range *freq_range = &reg_rule->freq_range;
6355         struct ieee80211_power_rule *power_rule = &reg_rule->power_rule;
6356
6357         if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
6358                 return -EINVAL;
6359         if (!tb[NL80211_ATTR_FREQ_RANGE_START])
6360                 return -EINVAL;
6361         if (!tb[NL80211_ATTR_FREQ_RANGE_END])
6362                 return -EINVAL;
6363         if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
6364                 return -EINVAL;
6365         if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
6366                 return -EINVAL;
6367
6368         reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
6369
6370         freq_range->start_freq_khz =
6371                 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
6372         freq_range->end_freq_khz =
6373                 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
6374         freq_range->max_bandwidth_khz =
6375                 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
6376
6377         power_rule->max_eirp =
6378                 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
6379
6380         if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
6381                 power_rule->max_antenna_gain =
6382                         nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
6383
6384         if (tb[NL80211_ATTR_DFS_CAC_TIME])
6385                 reg_rule->dfs_cac_ms =
6386                         nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]);
6387
6388         return 0;
6389 }
6390
6391 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
6392 {
6393         struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
6394         struct nlattr *nl_reg_rule;
6395         char *alpha2;
6396         int rem_reg_rules, r;
6397         u32 num_rules = 0, rule_idx = 0, size_of_regd;
6398         enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET;
6399         struct ieee80211_regdomain *rd;
6400
6401         if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
6402                 return -EINVAL;
6403
6404         if (!info->attrs[NL80211_ATTR_REG_RULES])
6405                 return -EINVAL;
6406
6407         alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
6408
6409         if (info->attrs[NL80211_ATTR_DFS_REGION])
6410                 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]);
6411
6412         nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
6413                             rem_reg_rules) {
6414                 num_rules++;
6415                 if (num_rules > NL80211_MAX_SUPP_REG_RULES)
6416                         return -EINVAL;
6417         }
6418
6419         if (!reg_is_valid_request(alpha2))
6420                 return -EINVAL;
6421
6422         size_of_regd = sizeof(struct ieee80211_regdomain) +
6423                        num_rules * sizeof(struct ieee80211_reg_rule);
6424
6425         rd = kzalloc(size_of_regd, GFP_KERNEL);
6426         if (!rd)
6427                 return -ENOMEM;
6428
6429         rd->n_reg_rules = num_rules;
6430         rd->alpha2[0] = alpha2[0];
6431         rd->alpha2[1] = alpha2[1];
6432
6433         /*
6434          * Disable DFS master mode if the DFS region was
6435          * not supported or known on this kernel.
6436          */
6437         if (reg_supported_dfs_region(dfs_region))
6438                 rd->dfs_region = dfs_region;
6439
6440         nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
6441                             rem_reg_rules) {
6442                 r = nla_parse_nested(tb, NL80211_REG_RULE_ATTR_MAX,
6443                                      nl_reg_rule, reg_rule_policy,
6444                                      info->extack);
6445                 if (r)
6446                         goto bad_reg;
6447                 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
6448                 if (r)
6449                         goto bad_reg;
6450
6451                 rule_idx++;
6452
6453                 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) {
6454                         r = -EINVAL;
6455                         goto bad_reg;
6456                 }
6457         }
6458
6459         /* set_regdom takes ownership of rd */
6460         return set_regdom(rd, REGD_SOURCE_CRDA);
6461  bad_reg:
6462         kfree(rd);
6463         return r;
6464 }
6465 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */
6466
6467 static int validate_scan_freqs(struct nlattr *freqs)
6468 {
6469         struct nlattr *attr1, *attr2;
6470         int n_channels = 0, tmp1, tmp2;
6471
6472         nla_for_each_nested(attr1, freqs, tmp1)
6473                 if (nla_len(attr1) != sizeof(u32))
6474                         return 0;
6475
6476         nla_for_each_nested(attr1, freqs, tmp1) {
6477                 n_channels++;
6478                 /*
6479                  * Some hardware has a limited channel list for
6480                  * scanning, and it is pretty much nonsensical
6481                  * to scan for a channel twice, so disallow that
6482                  * and don't require drivers to check that the
6483                  * channel list they get isn't longer than what
6484                  * they can scan, as long as they can scan all
6485                  * the channels they registered at once.
6486                  */
6487                 nla_for_each_nested(attr2, freqs, tmp2)
6488                         if (attr1 != attr2 &&
6489                             nla_get_u32(attr1) == nla_get_u32(attr2))
6490                                 return 0;
6491         }
6492
6493         return n_channels;
6494 }
6495
6496 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b)
6497 {
6498         return b < NUM_NL80211_BANDS && wiphy->bands[b];
6499 }
6500
6501 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy,
6502                             struct cfg80211_bss_selection *bss_select)
6503 {
6504         struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1];
6505         struct nlattr *nest;
6506         int err;
6507         bool found = false;
6508         int i;
6509
6510         /* only process one nested attribute */
6511         nest = nla_data(nla);
6512         if (!nla_ok(nest, nla_len(nest)))
6513                 return -EINVAL;
6514
6515         err = nla_parse_nested(attr, NL80211_BSS_SELECT_ATTR_MAX, nest,
6516                                nl80211_bss_select_policy, NULL);
6517         if (err)
6518                 return err;
6519
6520         /* only one attribute may be given */
6521         for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) {
6522                 if (attr[i]) {
6523                         if (found)
6524                                 return -EINVAL;
6525                         found = true;
6526                 }
6527         }
6528
6529         bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID;
6530
6531         if (attr[NL80211_BSS_SELECT_ATTR_RSSI])
6532                 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI;
6533
6534         if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) {
6535                 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF;
6536                 bss_select->param.band_pref =
6537                         nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]);
6538                 if (!is_band_valid(wiphy, bss_select->param.band_pref))
6539                         return -EINVAL;
6540         }
6541
6542         if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) {
6543                 struct nl80211_bss_select_rssi_adjust *adj_param;
6544
6545                 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]);
6546                 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST;
6547                 bss_select->param.adjust.band = adj_param->band;
6548                 bss_select->param.adjust.delta = adj_param->delta;
6549                 if (!is_band_valid(wiphy, bss_select->param.adjust.band))
6550                         return -EINVAL;
6551         }
6552
6553         /* user-space did not provide behaviour attribute */
6554         if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID)
6555                 return -EINVAL;
6556
6557         if (!(wiphy->bss_select_support & BIT(bss_select->behaviour)))
6558                 return -EINVAL;
6559
6560         return 0;
6561 }
6562
6563 static int nl80211_parse_random_mac(struct nlattr **attrs,
6564                                     u8 *mac_addr, u8 *mac_addr_mask)
6565 {
6566         int i;
6567
6568         if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) {
6569                 eth_zero_addr(mac_addr);
6570                 eth_zero_addr(mac_addr_mask);
6571                 mac_addr[0] = 0x2;
6572                 mac_addr_mask[0] = 0x3;
6573
6574                 return 0;
6575         }
6576
6577         /* need both or none */
6578         if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK])
6579                 return -EINVAL;
6580
6581         memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN);
6582         memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN);
6583
6584         /* don't allow or configure an mcast address */
6585         if (!is_multicast_ether_addr(mac_addr_mask) ||
6586             is_multicast_ether_addr(mac_addr))
6587                 return -EINVAL;
6588
6589         /*
6590          * allow users to pass a MAC address that has bits set outside
6591          * of the mask, but don't bother drivers with having to deal
6592          * with such bits
6593          */
6594         for (i = 0; i < ETH_ALEN; i++)
6595                 mac_addr[i] &= mac_addr_mask[i];
6596
6597         return 0;
6598 }
6599
6600 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev)
6601 {
6602         ASSERT_WDEV_LOCK(wdev);
6603
6604         if (!cfg80211_beaconing_iface_active(wdev))
6605                 return true;
6606
6607         if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR))
6608                 return true;
6609
6610         return regulatory_pre_cac_allowed(wdev->wiphy);
6611 }
6612
6613 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
6614 {
6615         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6616         struct wireless_dev *wdev = info->user_ptr[1];
6617         struct cfg80211_scan_request *request;
6618         struct nlattr *attr;
6619         struct wiphy *wiphy;
6620         int err, tmp, n_ssids = 0, n_channels, i;
6621         size_t ie_len;
6622
6623         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6624                 return -EINVAL;
6625
6626         wiphy = &rdev->wiphy;
6627
6628         if (wdev->iftype == NL80211_IFTYPE_NAN)
6629                 return -EOPNOTSUPP;
6630
6631         if (!rdev->ops->scan)
6632                 return -EOPNOTSUPP;
6633
6634         if (rdev->scan_req || rdev->scan_msg) {
6635                 err = -EBUSY;
6636                 goto unlock;
6637         }
6638
6639         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
6640                 n_channels = validate_scan_freqs(
6641                                 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
6642                 if (!n_channels) {
6643                         err = -EINVAL;
6644                         goto unlock;
6645                 }
6646         } else {
6647                 n_channels = ieee80211_get_num_supported_channels(wiphy);
6648         }
6649
6650         if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
6651                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
6652                         n_ssids++;
6653
6654         if (n_ssids > wiphy->max_scan_ssids) {
6655                 err = -EINVAL;
6656                 goto unlock;
6657         }
6658
6659         if (info->attrs[NL80211_ATTR_IE])
6660                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6661         else
6662                 ie_len = 0;
6663
6664         if (ie_len > wiphy->max_scan_ie_len) {
6665                 err = -EINVAL;
6666                 goto unlock;
6667         }
6668
6669         request = kzalloc(sizeof(*request)
6670                         + sizeof(*request->ssids) * n_ssids
6671                         + sizeof(*request->channels) * n_channels
6672                         + ie_len, GFP_KERNEL);
6673         if (!request) {
6674                 err = -ENOMEM;
6675                 goto unlock;
6676         }
6677
6678         if (n_ssids)
6679                 request->ssids = (void *)&request->channels[n_channels];
6680         request->n_ssids = n_ssids;
6681         if (ie_len) {
6682                 if (n_ssids)
6683                         request->ie = (void *)(request->ssids + n_ssids);
6684                 else
6685                         request->ie = (void *)(request->channels + n_channels);
6686         }
6687
6688         i = 0;
6689         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
6690                 /* user specified, bail out if channel not found */
6691                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) {
6692                         struct ieee80211_channel *chan;
6693
6694                         chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
6695
6696                         if (!chan) {
6697                                 err = -EINVAL;
6698                                 goto out_free;
6699                         }
6700
6701                         /* ignore disabled channels */
6702                         if (chan->flags & IEEE80211_CHAN_DISABLED)
6703                                 continue;
6704
6705                         request->channels[i] = chan;
6706                         i++;
6707                 }
6708         } else {
6709                 enum nl80211_band band;
6710
6711                 /* all channels */
6712                 for (band = 0; band < NUM_NL80211_BANDS; band++) {
6713                         int j;
6714
6715                         if (!wiphy->bands[band])
6716                                 continue;
6717                         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
6718                                 struct ieee80211_channel *chan;
6719
6720                                 chan = &wiphy->bands[band]->channels[j];
6721
6722                                 if (chan->flags & IEEE80211_CHAN_DISABLED)
6723                                         continue;
6724
6725                                 request->channels[i] = chan;
6726                                 i++;
6727                         }
6728                 }
6729         }
6730
6731         if (!i) {
6732                 err = -EINVAL;
6733                 goto out_free;
6734         }
6735
6736         request->n_channels = i;
6737
6738         wdev_lock(wdev);
6739         if (!cfg80211_off_channel_oper_allowed(wdev)) {
6740                 struct ieee80211_channel *chan;
6741
6742                 if (request->n_channels != 1) {
6743                         wdev_unlock(wdev);
6744                         err = -EBUSY;
6745                         goto out_free;
6746                 }
6747
6748                 chan = request->channels[0];
6749                 if (chan->center_freq != wdev->chandef.chan->center_freq) {
6750                         wdev_unlock(wdev);
6751                         err = -EBUSY;
6752                         goto out_free;
6753                 }
6754         }
6755         wdev_unlock(wdev);
6756
6757         i = 0;
6758         if (n_ssids) {
6759                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
6760                         if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
6761                                 err = -EINVAL;
6762                                 goto out_free;
6763                         }
6764                         request->ssids[i].ssid_len = nla_len(attr);
6765                         memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
6766                         i++;
6767                 }
6768         }
6769
6770         if (info->attrs[NL80211_ATTR_IE]) {
6771                 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6772                 memcpy((void *)request->ie,
6773                        nla_data(info->attrs[NL80211_ATTR_IE]),
6774                        request->ie_len);
6775         }
6776
6777         for (i = 0; i < NUM_NL80211_BANDS; i++)
6778                 if (wiphy->bands[i])
6779                         request->rates[i] =
6780                                 (1 << wiphy->bands[i]->n_bitrates) - 1;
6781
6782         if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) {
6783                 nla_for_each_nested(attr,
6784                                     info->attrs[NL80211_ATTR_SCAN_SUPP_RATES],
6785                                     tmp) {
6786                         enum nl80211_band band = nla_type(attr);
6787
6788                         if (band < 0 || band >= NUM_NL80211_BANDS) {
6789                                 err = -EINVAL;
6790                                 goto out_free;
6791                         }
6792
6793                         if (!wiphy->bands[band])
6794                                 continue;
6795
6796                         err = ieee80211_get_ratemask(wiphy->bands[band],
6797                                                      nla_data(attr),
6798                                                      nla_len(attr),
6799                                                      &request->rates[band]);
6800                         if (err)
6801                                 goto out_free;
6802                 }
6803         }
6804
6805         if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) {
6806                 if (!wiphy_ext_feature_isset(wiphy,
6807                                         NL80211_EXT_FEATURE_SET_SCAN_DWELL)) {
6808                         err = -EOPNOTSUPP;
6809                         goto out_free;
6810                 }
6811
6812                 request->duration =
6813                         nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]);
6814                 request->duration_mandatory =
6815                         nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]);
6816         }
6817
6818         if (info->attrs[NL80211_ATTR_SCAN_FLAGS]) {
6819                 request->flags = nla_get_u32(
6820                         info->attrs[NL80211_ATTR_SCAN_FLAGS]);
6821                 if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
6822                     !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) {
6823                         err = -EOPNOTSUPP;
6824                         goto out_free;
6825                 }
6826
6827                 if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
6828                         if (!(wiphy->features &
6829                                         NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR)) {
6830                                 err = -EOPNOTSUPP;
6831                                 goto out_free;
6832                         }
6833
6834                         if (wdev->current_bss) {
6835                                 err = -EOPNOTSUPP;
6836                                 goto out_free;
6837                         }
6838
6839                         err = nl80211_parse_random_mac(info->attrs,
6840                                                        request->mac_addr,
6841                                                        request->mac_addr_mask);
6842                         if (err)
6843                                 goto out_free;
6844                 }
6845         }
6846
6847         request->no_cck =
6848                 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
6849
6850         /* Initial implementation used NL80211_ATTR_MAC to set the specific
6851          * BSSID to scan for. This was problematic because that same attribute
6852          * was already used for another purpose (local random MAC address). The
6853          * NL80211_ATTR_BSSID attribute was added to fix this. For backwards
6854          * compatibility with older userspace components, also use the
6855          * NL80211_ATTR_MAC value here if it can be determined to be used for
6856          * the specific BSSID use case instead of the random MAC address
6857          * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use).
6858          */
6859         if (info->attrs[NL80211_ATTR_BSSID])
6860                 memcpy(request->bssid,
6861                        nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN);
6862         else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) &&
6863                  info->attrs[NL80211_ATTR_MAC])
6864                 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]),
6865                        ETH_ALEN);
6866         else
6867                 eth_broadcast_addr(request->bssid);
6868
6869         request->wdev = wdev;
6870         request->wiphy = &rdev->wiphy;
6871         request->scan_start = jiffies;
6872
6873         rdev->scan_req = request;
6874         err = rdev_scan(rdev, request);
6875
6876         if (!err) {
6877                 nl80211_send_scan_start(rdev, wdev);
6878                 if (wdev->netdev)
6879                         dev_hold(wdev->netdev);
6880         } else {
6881  out_free:
6882                 rdev->scan_req = NULL;
6883                 kfree(request);
6884         }
6885
6886  unlock:
6887         return err;
6888 }
6889
6890 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info)
6891 {
6892         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6893         struct wireless_dev *wdev = info->user_ptr[1];
6894
6895         if (!rdev->ops->abort_scan)
6896                 return -EOPNOTSUPP;
6897
6898         if (rdev->scan_msg)
6899                 return 0;
6900
6901         if (!rdev->scan_req)
6902                 return -ENOENT;
6903
6904         rdev_abort_scan(rdev, wdev);
6905         return 0;
6906 }
6907
6908 static int
6909 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans,
6910                                struct cfg80211_sched_scan_request *request,
6911                                struct nlattr **attrs)
6912 {
6913         int tmp, err, i = 0;
6914         struct nlattr *attr;
6915
6916         if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
6917                 u32 interval;
6918
6919                 /*
6920                  * If scan plans are not specified,
6921                  * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this
6922                  * case one scan plan will be set with the specified scan
6923                  * interval and infinite number of iterations.
6924                  */
6925                 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]);
6926                 if (!interval)
6927                         return -EINVAL;
6928
6929                 request->scan_plans[0].interval =
6930                         DIV_ROUND_UP(interval, MSEC_PER_SEC);
6931                 if (!request->scan_plans[0].interval)
6932                         return -EINVAL;
6933
6934                 if (request->scan_plans[0].interval >
6935                     wiphy->max_sched_scan_plan_interval)
6936                         request->scan_plans[0].interval =
6937                                 wiphy->max_sched_scan_plan_interval;
6938
6939                 return 0;
6940         }
6941
6942         nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) {
6943                 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1];
6944
6945                 if (WARN_ON(i >= n_plans))
6946                         return -EINVAL;
6947
6948                 err = nla_parse_nested(plan, NL80211_SCHED_SCAN_PLAN_MAX,
6949                                        attr, nl80211_plan_policy, NULL);
6950                 if (err)
6951                         return err;
6952
6953                 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL])
6954                         return -EINVAL;
6955
6956                 request->scan_plans[i].interval =
6957                         nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]);
6958                 if (!request->scan_plans[i].interval ||
6959                     request->scan_plans[i].interval >
6960                     wiphy->max_sched_scan_plan_interval)
6961                         return -EINVAL;
6962
6963                 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) {
6964                         request->scan_plans[i].iterations =
6965                                 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]);
6966                         if (!request->scan_plans[i].iterations ||
6967                             (request->scan_plans[i].iterations >
6968                              wiphy->max_sched_scan_plan_iterations))
6969                                 return -EINVAL;
6970                 } else if (i < n_plans - 1) {
6971                         /*
6972                          * All scan plans but the last one must specify
6973                          * a finite number of iterations
6974                          */
6975                         return -EINVAL;
6976                 }
6977
6978                 i++;
6979         }
6980
6981         /*
6982          * The last scan plan must not specify the number of
6983          * iterations, it is supposed to run infinitely
6984          */
6985         if (request->scan_plans[n_plans - 1].iterations)
6986                 return  -EINVAL;
6987
6988         return 0;
6989 }
6990
6991 static struct cfg80211_sched_scan_request *
6992 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
6993                          struct nlattr **attrs, int max_match_sets)
6994 {
6995         struct cfg80211_sched_scan_request *request;
6996         struct nlattr *attr;
6997         int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0;
6998         enum nl80211_band band;
6999         size_t ie_len;
7000         struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1];
7001         s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF;
7002
7003         if (!is_valid_ie_attr(attrs[NL80211_ATTR_IE]))
7004                 return ERR_PTR(-EINVAL);
7005
7006         if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
7007                 n_channels = validate_scan_freqs(
7008                                 attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
7009                 if (!n_channels)
7010                         return ERR_PTR(-EINVAL);
7011         } else {
7012                 n_channels = ieee80211_get_num_supported_channels(wiphy);
7013         }
7014
7015         if (attrs[NL80211_ATTR_SCAN_SSIDS])
7016                 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
7017                                     tmp)
7018                         n_ssids++;
7019
7020         if (n_ssids > wiphy->max_sched_scan_ssids)
7021                 return ERR_PTR(-EINVAL);
7022
7023         /*
7024          * First, count the number of 'real' matchsets. Due to an issue with
7025          * the old implementation, matchsets containing only the RSSI attribute
7026          * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default'
7027          * RSSI for all matchsets, rather than their own matchset for reporting
7028          * all APs with a strong RSSI. This is needed to be compatible with
7029          * older userspace that treated a matchset with only the RSSI as the
7030          * global RSSI for all other matchsets - if there are other matchsets.
7031          */
7032         if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
7033                 nla_for_each_nested(attr,
7034                                     attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
7035                                     tmp) {
7036                         struct nlattr *rssi;
7037
7038                         err = nla_parse_nested(tb,
7039                                                NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
7040                                                attr, nl80211_match_policy,
7041                                                NULL);
7042                         if (err)
7043                                 return ERR_PTR(err);
7044
7045                         /* SSID and BSSID are mutually exclusive */
7046                         if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] &&
7047                             tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID])
7048                                 return ERR_PTR(-EINVAL);
7049
7050                         /* add other standalone attributes here */
7051                         if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] ||
7052                             tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) {
7053                                 n_match_sets++;
7054                                 continue;
7055                         }
7056                         rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
7057                         if (rssi)
7058                                 default_match_rssi = nla_get_s32(rssi);
7059                 }
7060         }
7061
7062         /* However, if there's no other matchset, add the RSSI one */
7063         if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
7064                 n_match_sets = 1;
7065
7066         if (n_match_sets > max_match_sets)
7067                 return ERR_PTR(-EINVAL);
7068
7069         if (attrs[NL80211_ATTR_IE])
7070                 ie_len = nla_len(attrs[NL80211_ATTR_IE]);
7071         else
7072                 ie_len = 0;
7073
7074         if (ie_len > wiphy->max_sched_scan_ie_len)
7075                 return ERR_PTR(-EINVAL);
7076
7077         if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
7078                 /*
7079                  * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since
7080                  * each scan plan already specifies its own interval
7081                  */
7082                 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
7083                         return ERR_PTR(-EINVAL);
7084
7085                 nla_for_each_nested(attr,
7086                                     attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp)
7087                         n_plans++;
7088         } else {
7089                 /*
7090                  * The scan interval attribute is kept for backward
7091                  * compatibility. If no scan plans are specified and sched scan
7092                  * interval is specified, one scan plan will be set with this
7093                  * scan interval and infinite number of iterations.
7094                  */
7095                 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
7096                         return ERR_PTR(-EINVAL);
7097
7098                 n_plans = 1;
7099         }
7100
7101         if (!n_plans || n_plans > wiphy->max_sched_scan_plans)
7102                 return ERR_PTR(-EINVAL);
7103
7104         if (!wiphy_ext_feature_isset(
7105                     wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) &&
7106             (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] ||
7107              attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]))
7108                 return ERR_PTR(-EINVAL);
7109
7110         request = kzalloc(sizeof(*request)
7111                         + sizeof(*request->ssids) * n_ssids
7112                         + sizeof(*request->match_sets) * n_match_sets
7113                         + sizeof(*request->scan_plans) * n_plans
7114                         + sizeof(*request->channels) * n_channels
7115                         + ie_len, GFP_KERNEL);
7116         if (!request)
7117                 return ERR_PTR(-ENOMEM);
7118
7119         if (n_ssids)
7120                 request->ssids = (void *)&request->channels[n_channels];
7121         request->n_ssids = n_ssids;
7122         if (ie_len) {
7123                 if (n_ssids)
7124                         request->ie = (void *)(request->ssids + n_ssids);
7125                 else
7126                         request->ie = (void *)(request->channels + n_channels);
7127         }
7128
7129         if (n_match_sets) {
7130                 if (request->ie)
7131                         request->match_sets = (void *)(request->ie + ie_len);
7132                 else if (n_ssids)
7133                         request->match_sets =
7134                                 (void *)(request->ssids + n_ssids);
7135                 else
7136                         request->match_sets =
7137                                 (void *)(request->channels + n_channels);
7138         }
7139         request->n_match_sets = n_match_sets;
7140
7141         if (n_match_sets)
7142                 request->scan_plans = (void *)(request->match_sets +
7143                                                n_match_sets);
7144         else if (request->ie)
7145                 request->scan_plans = (void *)(request->ie + ie_len);
7146         else if (n_ssids)
7147                 request->scan_plans = (void *)(request->ssids + n_ssids);
7148         else
7149                 request->scan_plans = (void *)(request->channels + n_channels);
7150
7151         request->n_scan_plans = n_plans;
7152
7153         i = 0;
7154         if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
7155                 /* user specified, bail out if channel not found */
7156                 nla_for_each_nested(attr,
7157                                     attrs[NL80211_ATTR_SCAN_FREQUENCIES],
7158                                     tmp) {
7159                         struct ieee80211_channel *chan;
7160
7161                         chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
7162
7163                         if (!chan) {
7164                                 err = -EINVAL;
7165                                 goto out_free;
7166                         }
7167
7168                         /* ignore disabled channels */
7169                         if (chan->flags & IEEE80211_CHAN_DISABLED)
7170                                 continue;
7171
7172                         request->channels[i] = chan;
7173                         i++;
7174                 }
7175         } else {
7176                 /* all channels */
7177                 for (band = 0; band < NUM_NL80211_BANDS; band++) {
7178                         int j;
7179
7180                         if (!wiphy->bands[band])
7181                                 continue;
7182                         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
7183                                 struct ieee80211_channel *chan;
7184
7185                                 chan = &wiphy->bands[band]->channels[j];
7186
7187                                 if (chan->flags & IEEE80211_CHAN_DISABLED)
7188                                         continue;
7189
7190                                 request->channels[i] = chan;
7191                                 i++;
7192                         }
7193                 }
7194         }
7195
7196         if (!i) {
7197                 err = -EINVAL;
7198                 goto out_free;
7199         }
7200
7201         request->n_channels = i;
7202
7203         i = 0;
7204         if (n_ssids) {
7205                 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
7206                                     tmp) {
7207                         if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
7208                                 err = -EINVAL;
7209                                 goto out_free;
7210                         }
7211                         request->ssids[i].ssid_len = nla_len(attr);
7212                         memcpy(request->ssids[i].ssid, nla_data(attr),
7213                                nla_len(attr));
7214                         i++;
7215                 }
7216         }
7217
7218         i = 0;
7219         if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
7220                 nla_for_each_nested(attr,
7221                                     attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
7222                                     tmp) {
7223                         struct nlattr *ssid, *bssid, *rssi;
7224
7225                         err = nla_parse_nested(tb,
7226                                                NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
7227                                                attr, nl80211_match_policy,
7228                                                NULL);
7229                         if (err)
7230                                 goto out_free;
7231                         ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
7232                         bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID];
7233                         if (ssid || bssid) {
7234                                 if (WARN_ON(i >= n_match_sets)) {
7235                                         /* this indicates a programming error,
7236                                          * the loop above should have verified
7237                                          * things properly
7238                                          */
7239                                         err = -EINVAL;
7240                                         goto out_free;
7241                                 }
7242
7243                                 if (ssid) {
7244                                         if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) {
7245                                                 err = -EINVAL;
7246                                                 goto out_free;
7247                                         }
7248                                         memcpy(request->match_sets[i].ssid.ssid,
7249                                                nla_data(ssid), nla_len(ssid));
7250                                         request->match_sets[i].ssid.ssid_len =
7251                                                 nla_len(ssid);
7252                                 }
7253                                 if (bssid) {
7254                                         if (nla_len(bssid) != ETH_ALEN) {
7255                                                 err = -EINVAL;
7256                                                 goto out_free;
7257                                         }
7258                                         memcpy(request->match_sets[i].bssid,
7259                                                nla_data(bssid), ETH_ALEN);
7260                                 }
7261
7262                                 /* special attribute - old implementation w/a */
7263                                 request->match_sets[i].rssi_thold =
7264                                         default_match_rssi;
7265                                 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
7266                                 if (rssi)
7267                                         request->match_sets[i].rssi_thold =
7268                                                 nla_get_s32(rssi);
7269                         }
7270                         i++;
7271                 }
7272
7273                 /* there was no other matchset, so the RSSI one is alone */
7274                 if (i == 0 && n_match_sets)
7275                         request->match_sets[0].rssi_thold = default_match_rssi;
7276
7277                 request->min_rssi_thold = INT_MAX;
7278                 for (i = 0; i < n_match_sets; i++)
7279                         request->min_rssi_thold =
7280                                 min(request->match_sets[i].rssi_thold,
7281                                     request->min_rssi_thold);
7282         } else {
7283                 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF;
7284         }
7285
7286         if (ie_len) {
7287                 request->ie_len = ie_len;
7288                 memcpy((void *)request->ie,
7289                        nla_data(attrs[NL80211_ATTR_IE]),
7290                        request->ie_len);
7291         }
7292
7293         if (attrs[NL80211_ATTR_SCAN_FLAGS]) {
7294                 request->flags = nla_get_u32(
7295                         attrs[NL80211_ATTR_SCAN_FLAGS]);
7296                 if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
7297                     !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) {
7298                         err = -EOPNOTSUPP;
7299                         goto out_free;
7300                 }
7301
7302                 if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
7303                         u32 flg = NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR;
7304
7305                         if (!wdev) /* must be net-detect */
7306                                 flg = NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
7307
7308                         if (!(wiphy->features & flg)) {
7309                                 err = -EOPNOTSUPP;
7310                                 goto out_free;
7311                         }
7312
7313                         if (wdev && wdev->current_bss) {
7314                                 err = -EOPNOTSUPP;
7315                                 goto out_free;
7316                         }
7317
7318                         err = nl80211_parse_random_mac(attrs, request->mac_addr,
7319                                                        request->mac_addr_mask);
7320                         if (err)
7321                                 goto out_free;
7322                 }
7323         }
7324
7325         if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY])
7326                 request->delay =
7327                         nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]);
7328
7329         if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) {
7330                 request->relative_rssi = nla_get_s8(
7331                         attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]);
7332                 request->relative_rssi_set = true;
7333         }
7334
7335         if (request->relative_rssi_set &&
7336             attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) {
7337                 struct nl80211_bss_select_rssi_adjust *rssi_adjust;
7338
7339                 rssi_adjust = nla_data(
7340                         attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]);
7341                 request->rssi_adjust.band = rssi_adjust->band;
7342                 request->rssi_adjust.delta = rssi_adjust->delta;
7343                 if (!is_band_valid(wiphy, request->rssi_adjust.band)) {
7344                         err = -EINVAL;
7345                         goto out_free;
7346                 }
7347         }
7348
7349         err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs);
7350         if (err)
7351                 goto out_free;
7352
7353         request->scan_start = jiffies;
7354
7355         return request;
7356
7357 out_free:
7358         kfree(request);
7359         return ERR_PTR(err);
7360 }
7361
7362 static int nl80211_start_sched_scan(struct sk_buff *skb,
7363                                     struct genl_info *info)
7364 {
7365         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7366         struct net_device *dev = info->user_ptr[1];
7367         struct wireless_dev *wdev = dev->ieee80211_ptr;
7368         struct cfg80211_sched_scan_request *sched_scan_req;
7369         bool want_multi;
7370         int err;
7371
7372         if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start)
7373                 return -EOPNOTSUPP;
7374
7375         want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI];
7376         err = cfg80211_sched_scan_req_possible(rdev, want_multi);
7377         if (err)
7378                 return err;
7379
7380         sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev,
7381                                                   info->attrs,
7382                                                   rdev->wiphy.max_match_sets);
7383
7384         err = PTR_ERR_OR_ZERO(sched_scan_req);
7385         if (err)
7386                 goto out_err;
7387
7388         /* leave request id zero for legacy request
7389          * or if driver does not support multi-scheduled scan
7390          */
7391         if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) {
7392                 while (!sched_scan_req->reqid)
7393                         sched_scan_req->reqid = rdev->wiphy.cookie_counter++;
7394         }
7395
7396         err = rdev_sched_scan_start(rdev, dev, sched_scan_req);
7397         if (err)
7398                 goto out_free;
7399
7400         sched_scan_req->dev = dev;
7401         sched_scan_req->wiphy = &rdev->wiphy;
7402
7403         if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
7404                 sched_scan_req->owner_nlportid = info->snd_portid;
7405
7406         cfg80211_add_sched_scan_req(rdev, sched_scan_req);
7407
7408         nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN);
7409         return 0;
7410
7411 out_free:
7412         kfree(sched_scan_req);
7413 out_err:
7414         return err;
7415 }
7416
7417 static int nl80211_stop_sched_scan(struct sk_buff *skb,
7418                                    struct genl_info *info)
7419 {
7420         struct cfg80211_sched_scan_request *req;
7421         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7422         u64 cookie;
7423
7424         if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop)
7425                 return -EOPNOTSUPP;
7426
7427         if (info->attrs[NL80211_ATTR_COOKIE]) {
7428                 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
7429                 return __cfg80211_stop_sched_scan(rdev, cookie, false);
7430         }
7431
7432         req = list_first_or_null_rcu(&rdev->sched_scan_req_list,
7433                                      struct cfg80211_sched_scan_request,
7434                                      list);
7435         if (!req || req->reqid ||
7436             (req->owner_nlportid &&
7437              req->owner_nlportid != info->snd_portid))
7438                 return -ENOENT;
7439
7440         return cfg80211_stop_sched_scan_req(rdev, req, false);
7441 }
7442
7443 static int nl80211_start_radar_detection(struct sk_buff *skb,
7444                                          struct genl_info *info)
7445 {
7446         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7447         struct net_device *dev = info->user_ptr[1];
7448         struct wireless_dev *wdev = dev->ieee80211_ptr;
7449         struct cfg80211_chan_def chandef;
7450         enum nl80211_dfs_regions dfs_region;
7451         unsigned int cac_time_ms;
7452         int err;
7453
7454         dfs_region = reg_get_dfs_region(wdev->wiphy);
7455         if (dfs_region == NL80211_DFS_UNSET)
7456                 return -EINVAL;
7457
7458         err = nl80211_parse_chandef(rdev, info, &chandef);
7459         if (err)
7460                 return err;
7461
7462         if (netif_carrier_ok(dev))
7463                 return -EBUSY;
7464
7465         if (wdev->cac_started)
7466                 return -EBUSY;
7467
7468         err = cfg80211_chandef_dfs_required(wdev->wiphy, &chandef,
7469                                             wdev->iftype);
7470         if (err < 0)
7471                 return err;
7472
7473         if (err == 0)
7474                 return -EINVAL;
7475
7476         if (!cfg80211_chandef_dfs_usable(wdev->wiphy, &chandef))
7477                 return -EINVAL;
7478
7479         if (!rdev->ops->start_radar_detection)
7480                 return -EOPNOTSUPP;
7481
7482         cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef);
7483         if (WARN_ON(!cac_time_ms))
7484                 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
7485
7486         err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms);
7487         if (!err) {
7488                 wdev->chandef = chandef;
7489                 wdev->cac_started = true;
7490                 wdev->cac_start_time = jiffies;
7491                 wdev->cac_time_ms = cac_time_ms;
7492         }
7493         return err;
7494 }
7495
7496 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
7497 {
7498         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7499         struct net_device *dev = info->user_ptr[1];
7500         struct wireless_dev *wdev = dev->ieee80211_ptr;
7501         struct cfg80211_csa_settings params;
7502         /* csa_attrs is defined static to avoid waste of stack size - this
7503          * function is called under RTNL lock, so this should not be a problem.
7504          */
7505         static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1];
7506         int err;
7507         bool need_new_beacon = false;
7508         bool need_handle_dfs_flag = true;
7509         int len, i;
7510         u32 cs_count;
7511
7512         if (!rdev->ops->channel_switch ||
7513             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
7514                 return -EOPNOTSUPP;
7515
7516         switch (dev->ieee80211_ptr->iftype) {
7517         case NL80211_IFTYPE_AP:
7518         case NL80211_IFTYPE_P2P_GO:
7519                 need_new_beacon = true;
7520                 /* For all modes except AP the handle_dfs flag needs to be
7521                  * supplied to tell the kernel that userspace will handle radar
7522                  * events when they happen. Otherwise a switch to a channel
7523                  * requiring DFS will be rejected.
7524                  */
7525                 need_handle_dfs_flag = false;
7526
7527                 /* useless if AP is not running */
7528                 if (!wdev->beacon_interval)
7529                         return -ENOTCONN;
7530                 break;
7531         case NL80211_IFTYPE_ADHOC:
7532                 if (!wdev->ssid_len)
7533                         return -ENOTCONN;
7534                 break;
7535         case NL80211_IFTYPE_MESH_POINT:
7536                 if (!wdev->mesh_id_len)
7537                         return -ENOTCONN;
7538                 break;
7539         default:
7540                 return -EOPNOTSUPP;
7541         }
7542
7543         memset(&params, 0, sizeof(params));
7544
7545         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
7546             !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT])
7547                 return -EINVAL;
7548
7549         /* only important for AP, IBSS and mesh create IEs internally */
7550         if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES])
7551                 return -EINVAL;
7552
7553         /* Even though the attribute is u32, the specification says
7554          * u8, so let's make sure we don't overflow.
7555          */
7556         cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]);
7557         if (cs_count > 255)
7558                 return -EINVAL;
7559
7560         params.count = cs_count;
7561
7562         if (!need_new_beacon)
7563                 goto skip_beacons;
7564
7565         err = nl80211_parse_beacon(info->attrs, &params.beacon_after);
7566         if (err)
7567                 return err;
7568
7569         err = nla_parse_nested(csa_attrs, NL80211_ATTR_MAX,
7570                                info->attrs[NL80211_ATTR_CSA_IES],
7571                                nl80211_policy, info->extack);
7572         if (err)
7573                 return err;
7574
7575         err = nl80211_parse_beacon(csa_attrs, &params.beacon_csa);
7576         if (err)
7577                 return err;
7578
7579         if (!csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON])
7580                 return -EINVAL;
7581
7582         len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]);
7583         if (!len || (len % sizeof(u16)))
7584                 return -EINVAL;
7585
7586         params.n_counter_offsets_beacon = len / sizeof(u16);
7587         if (rdev->wiphy.max_num_csa_counters &&
7588             (params.n_counter_offsets_beacon >
7589              rdev->wiphy.max_num_csa_counters))
7590                 return -EINVAL;
7591
7592         params.counter_offsets_beacon =
7593                 nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]);
7594
7595         /* sanity checks - counters should fit and be the same */
7596         for (i = 0; i < params.n_counter_offsets_beacon; i++) {
7597                 u16 offset = params.counter_offsets_beacon[i];
7598
7599                 if (offset >= params.beacon_csa.tail_len)
7600                         return -EINVAL;
7601
7602                 if (params.beacon_csa.tail[offset] != params.count)
7603                         return -EINVAL;
7604         }
7605
7606         if (csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]) {
7607                 len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]);
7608                 if (!len || (len % sizeof(u16)))
7609                         return -EINVAL;
7610
7611                 params.n_counter_offsets_presp = len / sizeof(u16);
7612                 if (rdev->wiphy.max_num_csa_counters &&
7613                     (params.n_counter_offsets_presp >
7614                      rdev->wiphy.max_num_csa_counters))
7615                         return -EINVAL;
7616
7617                 params.counter_offsets_presp =
7618                         nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]);
7619
7620                 /* sanity checks - counters should fit and be the same */
7621                 for (i = 0; i < params.n_counter_offsets_presp; i++) {
7622                         u16 offset = params.counter_offsets_presp[i];
7623
7624                         if (offset >= params.beacon_csa.probe_resp_len)
7625                                 return -EINVAL;
7626
7627                         if (params.beacon_csa.probe_resp[offset] !=
7628                             params.count)
7629                                 return -EINVAL;
7630                 }
7631         }
7632
7633 skip_beacons:
7634         err = nl80211_parse_chandef(rdev, info, &params.chandef);
7635         if (err)
7636                 return err;
7637
7638         if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef,
7639                                            wdev->iftype))
7640                 return -EINVAL;
7641
7642         err = cfg80211_chandef_dfs_required(wdev->wiphy,
7643                                             &params.chandef,
7644                                             wdev->iftype);
7645         if (err < 0)
7646                 return err;
7647
7648         if (err > 0) {
7649                 params.radar_required = true;
7650                 if (need_handle_dfs_flag &&
7651                     !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) {
7652                         return -EINVAL;
7653                 }
7654         }
7655
7656         if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
7657                 params.block_tx = true;
7658
7659         wdev_lock(wdev);
7660         err = rdev_channel_switch(rdev, dev, &params);
7661         wdev_unlock(wdev);
7662
7663         return err;
7664 }
7665
7666 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
7667                             u32 seq, int flags,
7668                             struct cfg80211_registered_device *rdev,
7669                             struct wireless_dev *wdev,
7670                             struct cfg80211_internal_bss *intbss)
7671 {
7672         struct cfg80211_bss *res = &intbss->pub;
7673         const struct cfg80211_bss_ies *ies;
7674         void *hdr;
7675         struct nlattr *bss;
7676
7677         ASSERT_WDEV_LOCK(wdev);
7678
7679         hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
7680                              NL80211_CMD_NEW_SCAN_RESULTS);
7681         if (!hdr)
7682                 return -1;
7683
7684         genl_dump_check_consistent(cb, hdr, &nl80211_fam);
7685
7686         if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation))
7687                 goto nla_put_failure;
7688         if (wdev->netdev &&
7689             nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex))
7690                 goto nla_put_failure;
7691         if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
7692                               NL80211_ATTR_PAD))
7693                 goto nla_put_failure;
7694
7695         bss = nla_nest_start(msg, NL80211_ATTR_BSS);
7696         if (!bss)
7697                 goto nla_put_failure;
7698         if ((!is_zero_ether_addr(res->bssid) &&
7699              nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid)))
7700                 goto nla_put_failure;
7701
7702         rcu_read_lock();
7703         /* indicate whether we have probe response data or not */
7704         if (rcu_access_pointer(res->proberesp_ies) &&
7705             nla_put_flag(msg, NL80211_BSS_PRESP_DATA))
7706                 goto fail_unlock_rcu;
7707
7708         /* this pointer prefers to be pointed to probe response data
7709          * but is always valid
7710          */
7711         ies = rcu_dereference(res->ies);
7712         if (ies) {
7713                 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf,
7714                                       NL80211_BSS_PAD))
7715                         goto fail_unlock_rcu;
7716                 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS,
7717                                         ies->len, ies->data))
7718                         goto fail_unlock_rcu;
7719         }
7720
7721         /* and this pointer is always (unless driver didn't know) beacon data */
7722         ies = rcu_dereference(res->beacon_ies);
7723         if (ies && ies->from_beacon) {
7724                 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf,
7725                                       NL80211_BSS_PAD))
7726                         goto fail_unlock_rcu;
7727                 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES,
7728                                         ies->len, ies->data))
7729                         goto fail_unlock_rcu;
7730         }
7731         rcu_read_unlock();
7732
7733         if (res->beacon_interval &&
7734             nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval))
7735                 goto nla_put_failure;
7736         if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) ||
7737             nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) ||
7738             nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) ||
7739             nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO,
7740                         jiffies_to_msecs(jiffies - intbss->ts)))
7741                 goto nla_put_failure;
7742
7743         if (intbss->parent_tsf &&
7744             (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF,
7745                                intbss->parent_tsf, NL80211_BSS_PAD) ||
7746              nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN,
7747                      intbss->parent_bssid)))
7748                 goto nla_put_failure;
7749
7750         if (intbss->ts_boottime &&
7751             nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME,
7752                               intbss->ts_boottime, NL80211_BSS_PAD))
7753                 goto nla_put_failure;
7754
7755         switch (rdev->wiphy.signal_type) {
7756         case CFG80211_SIGNAL_TYPE_MBM:
7757                 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal))
7758                         goto nla_put_failure;
7759                 break;
7760         case CFG80211_SIGNAL_TYPE_UNSPEC:
7761                 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal))
7762                         goto nla_put_failure;
7763                 break;
7764         default:
7765                 break;
7766         }
7767
7768         switch (wdev->iftype) {
7769         case NL80211_IFTYPE_P2P_CLIENT:
7770         case NL80211_IFTYPE_STATION:
7771                 if (intbss == wdev->current_bss &&
7772                     nla_put_u32(msg, NL80211_BSS_STATUS,
7773                                 NL80211_BSS_STATUS_ASSOCIATED))
7774                         goto nla_put_failure;
7775                 break;
7776         case NL80211_IFTYPE_ADHOC:
7777                 if (intbss == wdev->current_bss &&
7778                     nla_put_u32(msg, NL80211_BSS_STATUS,
7779                                 NL80211_BSS_STATUS_IBSS_JOINED))
7780                         goto nla_put_failure;
7781                 break;
7782         default:
7783                 break;
7784         }
7785
7786         nla_nest_end(msg, bss);
7787
7788         genlmsg_end(msg, hdr);
7789         return 0;
7790
7791  fail_unlock_rcu:
7792         rcu_read_unlock();
7793  nla_put_failure:
7794         genlmsg_cancel(msg, hdr);
7795         return -EMSGSIZE;
7796 }
7797
7798 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb)
7799 {
7800         struct cfg80211_registered_device *rdev;
7801         struct cfg80211_internal_bss *scan;
7802         struct wireless_dev *wdev;
7803         int start = cb->args[2], idx = 0;
7804         int err;
7805
7806         rtnl_lock();
7807         err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
7808         if (err) {
7809                 rtnl_unlock();
7810                 return err;
7811         }
7812
7813         wdev_lock(wdev);
7814         spin_lock_bh(&rdev->bss_lock);
7815         cfg80211_bss_expire(rdev);
7816
7817         cb->seq = rdev->bss_generation;
7818
7819         list_for_each_entry(scan, &rdev->bss_list, list) {
7820                 if (++idx <= start)
7821                         continue;
7822                 if (nl80211_send_bss(skb, cb,
7823                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
7824                                 rdev, wdev, scan) < 0) {
7825                         idx--;
7826                         break;
7827                 }
7828         }
7829
7830         spin_unlock_bh(&rdev->bss_lock);
7831         wdev_unlock(wdev);
7832
7833         cb->args[2] = idx;
7834         rtnl_unlock();
7835
7836         return skb->len;
7837 }
7838
7839 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq,
7840                                int flags, struct net_device *dev,
7841                                bool allow_radio_stats,
7842                                struct survey_info *survey)
7843 {
7844         void *hdr;
7845         struct nlattr *infoattr;
7846
7847         /* skip radio stats if userspace didn't request them */
7848         if (!survey->channel && !allow_radio_stats)
7849                 return 0;
7850
7851         hdr = nl80211hdr_put(msg, portid, seq, flags,
7852                              NL80211_CMD_NEW_SURVEY_RESULTS);
7853         if (!hdr)
7854                 return -ENOMEM;
7855
7856         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
7857                 goto nla_put_failure;
7858
7859         infoattr = nla_nest_start(msg, NL80211_ATTR_SURVEY_INFO);
7860         if (!infoattr)
7861                 goto nla_put_failure;
7862
7863         if (survey->channel &&
7864             nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY,
7865                         survey->channel->center_freq))
7866                 goto nla_put_failure;
7867
7868         if ((survey->filled & SURVEY_INFO_NOISE_DBM) &&
7869             nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise))
7870                 goto nla_put_failure;
7871         if ((survey->filled & SURVEY_INFO_IN_USE) &&
7872             nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE))
7873                 goto nla_put_failure;
7874         if ((survey->filled & SURVEY_INFO_TIME) &&
7875             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME,
7876                         survey->time, NL80211_SURVEY_INFO_PAD))
7877                 goto nla_put_failure;
7878         if ((survey->filled & SURVEY_INFO_TIME_BUSY) &&
7879             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY,
7880                               survey->time_busy, NL80211_SURVEY_INFO_PAD))
7881                 goto nla_put_failure;
7882         if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) &&
7883             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY,
7884                               survey->time_ext_busy, NL80211_SURVEY_INFO_PAD))
7885                 goto nla_put_failure;
7886         if ((survey->filled & SURVEY_INFO_TIME_RX) &&
7887             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX,
7888                               survey->time_rx, NL80211_SURVEY_INFO_PAD))
7889                 goto nla_put_failure;
7890         if ((survey->filled & SURVEY_INFO_TIME_TX) &&
7891             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX,
7892                               survey->time_tx, NL80211_SURVEY_INFO_PAD))
7893                 goto nla_put_failure;
7894         if ((survey->filled & SURVEY_INFO_TIME_SCAN) &&
7895             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN,
7896                               survey->time_scan, NL80211_SURVEY_INFO_PAD))
7897                 goto nla_put_failure;
7898
7899         nla_nest_end(msg, infoattr);
7900
7901         genlmsg_end(msg, hdr);
7902         return 0;
7903
7904  nla_put_failure:
7905         genlmsg_cancel(msg, hdr);
7906         return -EMSGSIZE;
7907 }
7908
7909 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
7910 {
7911         struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
7912         struct survey_info survey;
7913         struct cfg80211_registered_device *rdev;
7914         struct wireless_dev *wdev;
7915         int survey_idx = cb->args[2];
7916         int res;
7917         bool radio_stats;
7918
7919         rtnl_lock();
7920         res = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
7921         if (res)
7922                 goto out_err;
7923
7924         /* prepare_wdev_dump parsed the attributes */
7925         radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
7926
7927         if (!wdev->netdev) {
7928                 res = -EINVAL;
7929                 goto out_err;
7930         }
7931
7932         if (!rdev->ops->dump_survey) {
7933                 res = -EOPNOTSUPP;
7934                 goto out_err;
7935         }
7936
7937         while (1) {
7938                 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey);
7939                 if (res == -ENOENT)
7940                         break;
7941                 if (res)
7942                         goto out_err;
7943
7944                 /* don't send disabled channels, but do send non-channel data */
7945                 if (survey.channel &&
7946                     survey.channel->flags & IEEE80211_CHAN_DISABLED) {
7947                         survey_idx++;
7948                         continue;
7949                 }
7950
7951                 if (nl80211_send_survey(skb,
7952                                 NETLINK_CB(cb->skb).portid,
7953                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
7954                                 wdev->netdev, radio_stats, &survey) < 0)
7955                         goto out;
7956                 survey_idx++;
7957         }
7958
7959  out:
7960         cb->args[2] = survey_idx;
7961         res = skb->len;
7962  out_err:
7963         rtnl_unlock();
7964         return res;
7965 }
7966
7967 static bool nl80211_valid_wpa_versions(u32 wpa_versions)
7968 {
7969         return !(wpa_versions & ~(NL80211_WPA_VERSION_1 |
7970                                   NL80211_WPA_VERSION_2));
7971 }
7972
7973 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
7974 {
7975         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7976         struct net_device *dev = info->user_ptr[1];
7977         struct ieee80211_channel *chan;
7978         const u8 *bssid, *ssid, *ie = NULL, *auth_data = NULL;
7979         int err, ssid_len, ie_len = 0, auth_data_len = 0;
7980         enum nl80211_auth_type auth_type;
7981         struct key_parse key;
7982         bool local_state_change;
7983
7984         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
7985                 return -EINVAL;
7986
7987         if (!info->attrs[NL80211_ATTR_MAC])
7988                 return -EINVAL;
7989
7990         if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
7991                 return -EINVAL;
7992
7993         if (!info->attrs[NL80211_ATTR_SSID])
7994                 return -EINVAL;
7995
7996         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
7997                 return -EINVAL;
7998
7999         err = nl80211_parse_key(info, &key);
8000         if (err)
8001                 return err;
8002
8003         if (key.idx >= 0) {
8004                 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP)
8005                         return -EINVAL;
8006                 if (!key.p.key || !key.p.key_len)
8007                         return -EINVAL;
8008                 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 ||
8009                      key.p.key_len != WLAN_KEY_LEN_WEP40) &&
8010                     (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 ||
8011                      key.p.key_len != WLAN_KEY_LEN_WEP104))
8012                         return -EINVAL;
8013                 if (key.idx > 3)
8014                         return -EINVAL;
8015         } else {
8016                 key.p.key_len = 0;
8017                 key.p.key = NULL;
8018         }
8019
8020         if (key.idx >= 0) {
8021                 int i;
8022                 bool ok = false;
8023
8024                 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) {
8025                         if (key.p.cipher == rdev->wiphy.cipher_suites[i]) {
8026                                 ok = true;
8027                                 break;
8028                         }
8029                 }
8030                 if (!ok)
8031                         return -EINVAL;
8032         }
8033
8034         if (!rdev->ops->auth)
8035                 return -EOPNOTSUPP;
8036
8037         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8038             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8039                 return -EOPNOTSUPP;
8040
8041         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8042         chan = nl80211_get_valid_chan(&rdev->wiphy,
8043                                       info->attrs[NL80211_ATTR_WIPHY_FREQ]);
8044         if (!chan)
8045                 return -EINVAL;
8046
8047         ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8048         ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8049
8050         if (info->attrs[NL80211_ATTR_IE]) {
8051                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8052                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8053         }
8054
8055         auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
8056         if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE))
8057                 return -EINVAL;
8058
8059         if ((auth_type == NL80211_AUTHTYPE_SAE ||
8060              auth_type == NL80211_AUTHTYPE_FILS_SK ||
8061              auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
8062              auth_type == NL80211_AUTHTYPE_FILS_PK) &&
8063             !info->attrs[NL80211_ATTR_AUTH_DATA])
8064                 return -EINVAL;
8065
8066         if (info->attrs[NL80211_ATTR_AUTH_DATA]) {
8067                 if (auth_type != NL80211_AUTHTYPE_SAE &&
8068                     auth_type != NL80211_AUTHTYPE_FILS_SK &&
8069                     auth_type != NL80211_AUTHTYPE_FILS_SK_PFS &&
8070                     auth_type != NL80211_AUTHTYPE_FILS_PK)
8071                         return -EINVAL;
8072                 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
8073                 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
8074                 /* need to include at least Auth Transaction and Status Code */
8075                 if (auth_data_len < 4)
8076                         return -EINVAL;
8077         }
8078
8079         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
8080
8081         /*
8082          * Since we no longer track auth state, ignore
8083          * requests to only change local state.
8084          */
8085         if (local_state_change)
8086                 return 0;
8087
8088         wdev_lock(dev->ieee80211_ptr);
8089         err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
8090                                  ssid, ssid_len, ie, ie_len,
8091                                  key.p.key, key.p.key_len, key.idx,
8092                                  auth_data, auth_data_len);
8093         wdev_unlock(dev->ieee80211_ptr);
8094         return err;
8095 }
8096
8097 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
8098                                    struct genl_info *info,
8099                                    struct cfg80211_crypto_settings *settings,
8100                                    int cipher_limit)
8101 {
8102         memset(settings, 0, sizeof(*settings));
8103
8104         settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
8105
8106         if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
8107                 u16 proto;
8108
8109                 proto = nla_get_u16(
8110                         info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
8111                 settings->control_port_ethertype = cpu_to_be16(proto);
8112                 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
8113                     proto != ETH_P_PAE)
8114                         return -EINVAL;
8115                 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT])
8116                         settings->control_port_no_encrypt = true;
8117         } else
8118                 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE);
8119
8120         if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
8121                 void *data;
8122                 int len, i;
8123
8124                 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
8125                 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
8126                 settings->n_ciphers_pairwise = len / sizeof(u32);
8127
8128                 if (len % sizeof(u32))
8129                         return -EINVAL;
8130
8131                 if (settings->n_ciphers_pairwise > cipher_limit)
8132                         return -EINVAL;
8133
8134                 memcpy(settings->ciphers_pairwise, data, len);
8135
8136                 for (i = 0; i < settings->n_ciphers_pairwise; i++)
8137                         if (!cfg80211_supported_cipher_suite(
8138                                         &rdev->wiphy,
8139                                         settings->ciphers_pairwise[i]))
8140                                 return -EINVAL;
8141         }
8142
8143         if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
8144                 settings->cipher_group =
8145                         nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
8146                 if (!cfg80211_supported_cipher_suite(&rdev->wiphy,
8147                                                      settings->cipher_group))
8148                         return -EINVAL;
8149         }
8150
8151         if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) {
8152                 settings->wpa_versions =
8153                         nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
8154                 if (!nl80211_valid_wpa_versions(settings->wpa_versions))
8155                         return -EINVAL;
8156         }
8157
8158         if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
8159                 void *data;
8160                 int len;
8161
8162                 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
8163                 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
8164                 settings->n_akm_suites = len / sizeof(u32);
8165
8166                 if (len % sizeof(u32))
8167                         return -EINVAL;
8168
8169                 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
8170                         return -EINVAL;
8171
8172                 memcpy(settings->akm_suites, data, len);
8173         }
8174
8175         if (info->attrs[NL80211_ATTR_PMK]) {
8176                 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN)
8177                         return -EINVAL;
8178                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
8179                                              NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK))
8180                         return -EINVAL;
8181                 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]);
8182         }
8183
8184         return 0;
8185 }
8186
8187 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
8188 {
8189         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8190         struct net_device *dev = info->user_ptr[1];
8191         struct ieee80211_channel *chan;
8192         struct cfg80211_assoc_request req = {};
8193         const u8 *bssid, *ssid;
8194         int err, ssid_len = 0;
8195
8196         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8197                 return -EINVAL;
8198
8199         if (!info->attrs[NL80211_ATTR_MAC] ||
8200             !info->attrs[NL80211_ATTR_SSID] ||
8201             !info->attrs[NL80211_ATTR_WIPHY_FREQ])
8202                 return -EINVAL;
8203
8204         if (!rdev->ops->assoc)
8205                 return -EOPNOTSUPP;
8206
8207         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8208             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8209                 return -EOPNOTSUPP;
8210
8211         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8212
8213         chan = nl80211_get_valid_chan(&rdev->wiphy,
8214                                       info->attrs[NL80211_ATTR_WIPHY_FREQ]);
8215         if (!chan)
8216                 return -EINVAL;
8217
8218         ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8219         ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8220
8221         if (info->attrs[NL80211_ATTR_IE]) {
8222                 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8223                 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8224         }
8225
8226         if (info->attrs[NL80211_ATTR_USE_MFP]) {
8227                 enum nl80211_mfp mfp =
8228                         nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
8229                 if (mfp == NL80211_MFP_REQUIRED)
8230                         req.use_mfp = true;
8231                 else if (mfp != NL80211_MFP_NO)
8232                         return -EINVAL;
8233         }
8234
8235         if (info->attrs[NL80211_ATTR_PREV_BSSID])
8236                 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
8237
8238         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
8239                 req.flags |= ASSOC_REQ_DISABLE_HT;
8240
8241         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8242                 memcpy(&req.ht_capa_mask,
8243                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
8244                        sizeof(req.ht_capa_mask));
8245
8246         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
8247                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8248                         return -EINVAL;
8249                 memcpy(&req.ht_capa,
8250                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
8251                        sizeof(req.ht_capa));
8252         }
8253
8254         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
8255                 req.flags |= ASSOC_REQ_DISABLE_VHT;
8256
8257         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
8258                 memcpy(&req.vht_capa_mask,
8259                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
8260                        sizeof(req.vht_capa_mask));
8261
8262         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
8263                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
8264                         return -EINVAL;
8265                 memcpy(&req.vht_capa,
8266                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
8267                        sizeof(req.vht_capa));
8268         }
8269
8270         if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
8271                 if (!((rdev->wiphy.features &
8272                         NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
8273                        (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
8274                     !wiphy_ext_feature_isset(&rdev->wiphy,
8275                                              NL80211_EXT_FEATURE_RRM))
8276                         return -EINVAL;
8277                 req.flags |= ASSOC_REQ_USE_RRM;
8278         }
8279
8280         if (info->attrs[NL80211_ATTR_FILS_KEK]) {
8281                 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]);
8282                 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]);
8283                 if (!info->attrs[NL80211_ATTR_FILS_NONCES])
8284                         return -EINVAL;
8285                 req.fils_nonces =
8286                         nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]);
8287         }
8288
8289         err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
8290         if (!err) {
8291                 wdev_lock(dev->ieee80211_ptr);
8292
8293                 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid,
8294                                           ssid, ssid_len, &req);
8295
8296                 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
8297                         dev->ieee80211_ptr->conn_owner_nlportid =
8298                                 info->snd_portid;
8299                         memcpy(dev->ieee80211_ptr->disconnect_bssid,
8300                                bssid, ETH_ALEN);
8301                 }
8302
8303                 wdev_unlock(dev->ieee80211_ptr);
8304         }
8305
8306         return err;
8307 }
8308
8309 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
8310 {
8311         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8312         struct net_device *dev = info->user_ptr[1];
8313         const u8 *ie = NULL, *bssid;
8314         int ie_len = 0, err;
8315         u16 reason_code;
8316         bool local_state_change;
8317
8318         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8319                 return -EINVAL;
8320
8321         if (!info->attrs[NL80211_ATTR_MAC])
8322                 return -EINVAL;
8323
8324         if (!info->attrs[NL80211_ATTR_REASON_CODE])
8325                 return -EINVAL;
8326
8327         if (!rdev->ops->deauth)
8328                 return -EOPNOTSUPP;
8329
8330         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8331             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8332                 return -EOPNOTSUPP;
8333
8334         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8335
8336         reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
8337         if (reason_code == 0) {
8338                 /* Reason Code 0 is reserved */
8339                 return -EINVAL;
8340         }
8341
8342         if (info->attrs[NL80211_ATTR_IE]) {
8343                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8344                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8345         }
8346
8347         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
8348
8349         wdev_lock(dev->ieee80211_ptr);
8350         err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code,
8351                                    local_state_change);
8352         wdev_unlock(dev->ieee80211_ptr);
8353         return err;
8354 }
8355
8356 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
8357 {
8358         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8359         struct net_device *dev = info->user_ptr[1];
8360         const u8 *ie = NULL, *bssid;
8361         int ie_len = 0, err;
8362         u16 reason_code;
8363         bool local_state_change;
8364
8365         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8366                 return -EINVAL;
8367
8368         if (!info->attrs[NL80211_ATTR_MAC])
8369                 return -EINVAL;
8370
8371         if (!info->attrs[NL80211_ATTR_REASON_CODE])
8372                 return -EINVAL;
8373
8374         if (!rdev->ops->disassoc)
8375                 return -EOPNOTSUPP;
8376
8377         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8378             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8379                 return -EOPNOTSUPP;
8380
8381         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8382
8383         reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
8384         if (reason_code == 0) {
8385                 /* Reason Code 0 is reserved */
8386                 return -EINVAL;
8387         }
8388
8389         if (info->attrs[NL80211_ATTR_IE]) {
8390                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8391                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8392         }
8393
8394         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
8395
8396         wdev_lock(dev->ieee80211_ptr);
8397         err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code,
8398                                      local_state_change);
8399         wdev_unlock(dev->ieee80211_ptr);
8400         return err;
8401 }
8402
8403 static bool
8404 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev,
8405                          int mcast_rate[NUM_NL80211_BANDS],
8406                          int rateval)
8407 {
8408         struct wiphy *wiphy = &rdev->wiphy;
8409         bool found = false;
8410         int band, i;
8411
8412         for (band = 0; band < NUM_NL80211_BANDS; band++) {
8413                 struct ieee80211_supported_band *sband;
8414
8415                 sband = wiphy->bands[band];
8416                 if (!sband)
8417                         continue;
8418
8419                 for (i = 0; i < sband->n_bitrates; i++) {
8420                         if (sband->bitrates[i].bitrate == rateval) {
8421                                 mcast_rate[band] = i + 1;
8422                                 found = true;
8423                                 break;
8424                         }
8425                 }
8426         }
8427
8428         return found;
8429 }
8430
8431 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
8432 {
8433         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8434         struct net_device *dev = info->user_ptr[1];
8435         struct cfg80211_ibss_params ibss;
8436         struct wiphy *wiphy;
8437         struct cfg80211_cached_keys *connkeys = NULL;
8438         int err;
8439
8440         memset(&ibss, 0, sizeof(ibss));
8441
8442         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8443                 return -EINVAL;
8444
8445         if (!info->attrs[NL80211_ATTR_SSID] ||
8446             !nla_len(info->attrs[NL80211_ATTR_SSID]))
8447                 return -EINVAL;
8448
8449         ibss.beacon_interval = 100;
8450
8451         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL])
8452                 ibss.beacon_interval =
8453                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
8454
8455         err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC,
8456                                            ibss.beacon_interval);
8457         if (err)
8458                 return err;
8459
8460         if (!rdev->ops->join_ibss)
8461                 return -EOPNOTSUPP;
8462
8463         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
8464                 return -EOPNOTSUPP;
8465
8466         wiphy = &rdev->wiphy;
8467
8468         if (info->attrs[NL80211_ATTR_MAC]) {
8469                 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8470
8471                 if (!is_valid_ether_addr(ibss.bssid))
8472                         return -EINVAL;
8473         }
8474         ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8475         ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8476
8477         if (info->attrs[NL80211_ATTR_IE]) {
8478                 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8479                 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8480         }
8481
8482         err = nl80211_parse_chandef(rdev, info, &ibss.chandef);
8483         if (err)
8484                 return err;
8485
8486         if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef,
8487                                      NL80211_IFTYPE_ADHOC))
8488                 return -EINVAL;
8489
8490         switch (ibss.chandef.width) {
8491         case NL80211_CHAN_WIDTH_5:
8492         case NL80211_CHAN_WIDTH_10:
8493         case NL80211_CHAN_WIDTH_20_NOHT:
8494                 break;
8495         case NL80211_CHAN_WIDTH_20:
8496         case NL80211_CHAN_WIDTH_40:
8497                 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
8498                         return -EINVAL;
8499                 break;
8500         case NL80211_CHAN_WIDTH_80:
8501         case NL80211_CHAN_WIDTH_80P80:
8502         case NL80211_CHAN_WIDTH_160:
8503                 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
8504                         return -EINVAL;
8505                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
8506                                              NL80211_EXT_FEATURE_VHT_IBSS))
8507                         return -EINVAL;
8508                 break;
8509         default:
8510                 return -EINVAL;
8511         }
8512
8513         ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
8514         ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
8515
8516         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
8517                 u8 *rates =
8518                         nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
8519                 int n_rates =
8520                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
8521                 struct ieee80211_supported_band *sband =
8522                         wiphy->bands[ibss.chandef.chan->band];
8523
8524                 err = ieee80211_get_ratemask(sband, rates, n_rates,
8525                                              &ibss.basic_rates);
8526                 if (err)
8527                         return err;
8528         }
8529
8530         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8531                 memcpy(&ibss.ht_capa_mask,
8532                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
8533                        sizeof(ibss.ht_capa_mask));
8534
8535         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
8536                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8537                         return -EINVAL;
8538                 memcpy(&ibss.ht_capa,
8539                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
8540                        sizeof(ibss.ht_capa));
8541         }
8542
8543         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
8544             !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate,
8545                         nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
8546                 return -EINVAL;
8547
8548         if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
8549                 bool no_ht = false;
8550
8551                 connkeys = nl80211_parse_connkeys(rdev,
8552                                           info->attrs[NL80211_ATTR_KEYS],
8553                                           &no_ht);
8554                 if (IS_ERR(connkeys))
8555                         return PTR_ERR(connkeys);
8556
8557                 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) &&
8558                     no_ht) {
8559                         kzfree(connkeys);
8560                         return -EINVAL;
8561                 }
8562         }
8563
8564         ibss.control_port =
8565                 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]);
8566
8567         ibss.userspace_handles_dfs =
8568                 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
8569
8570         err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
8571         if (err)
8572                 kzfree(connkeys);
8573         return err;
8574 }
8575
8576 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
8577 {
8578         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8579         struct net_device *dev = info->user_ptr[1];
8580
8581         if (!rdev->ops->leave_ibss)
8582                 return -EOPNOTSUPP;
8583
8584         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
8585                 return -EOPNOTSUPP;
8586
8587         return cfg80211_leave_ibss(rdev, dev, false);
8588 }
8589
8590 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info)
8591 {
8592         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8593         struct net_device *dev = info->user_ptr[1];
8594         int mcast_rate[NUM_NL80211_BANDS];
8595         u32 nla_rate;
8596         int err;
8597
8598         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
8599             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
8600             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB)
8601                 return -EOPNOTSUPP;
8602
8603         if (!rdev->ops->set_mcast_rate)
8604                 return -EOPNOTSUPP;
8605
8606         memset(mcast_rate, 0, sizeof(mcast_rate));
8607
8608         if (!info->attrs[NL80211_ATTR_MCAST_RATE])
8609                 return -EINVAL;
8610
8611         nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
8612         if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate))
8613                 return -EINVAL;
8614
8615         err = rdev_set_mcast_rate(rdev, dev, mcast_rate);
8616
8617         return err;
8618 }
8619
8620 static struct sk_buff *
8621 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
8622                             struct wireless_dev *wdev, int approxlen,
8623                             u32 portid, u32 seq, enum nl80211_commands cmd,
8624                             enum nl80211_attrs attr,
8625                             const struct nl80211_vendor_cmd_info *info,
8626                             gfp_t gfp)
8627 {
8628         struct sk_buff *skb;
8629         void *hdr;
8630         struct nlattr *data;
8631
8632         skb = nlmsg_new(approxlen + 100, gfp);
8633         if (!skb)
8634                 return NULL;
8635
8636         hdr = nl80211hdr_put(skb, portid, seq, 0, cmd);
8637         if (!hdr) {
8638                 kfree_skb(skb);
8639                 return NULL;
8640         }
8641
8642         if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
8643                 goto nla_put_failure;
8644
8645         if (info) {
8646                 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID,
8647                                 info->vendor_id))
8648                         goto nla_put_failure;
8649                 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD,
8650                                 info->subcmd))
8651                         goto nla_put_failure;
8652         }
8653
8654         if (wdev) {
8655                 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
8656                                       wdev_id(wdev), NL80211_ATTR_PAD))
8657                         goto nla_put_failure;
8658                 if (wdev->netdev &&
8659                     nla_put_u32(skb, NL80211_ATTR_IFINDEX,
8660                                 wdev->netdev->ifindex))
8661                         goto nla_put_failure;
8662         }
8663
8664         data = nla_nest_start(skb, attr);
8665         if (!data)
8666                 goto nla_put_failure;
8667
8668         ((void **)skb->cb)[0] = rdev;
8669         ((void **)skb->cb)[1] = hdr;
8670         ((void **)skb->cb)[2] = data;
8671
8672         return skb;
8673
8674  nla_put_failure:
8675         kfree_skb(skb);
8676         return NULL;
8677 }
8678
8679 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
8680                                            struct wireless_dev *wdev,
8681                                            enum nl80211_commands cmd,
8682                                            enum nl80211_attrs attr,
8683                                            int vendor_event_idx,
8684                                            int approxlen, gfp_t gfp)
8685 {
8686         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
8687         const struct nl80211_vendor_cmd_info *info;
8688
8689         switch (cmd) {
8690         case NL80211_CMD_TESTMODE:
8691                 if (WARN_ON(vendor_event_idx != -1))
8692                         return NULL;
8693                 info = NULL;
8694                 break;
8695         case NL80211_CMD_VENDOR:
8696                 if (WARN_ON(vendor_event_idx < 0 ||
8697                             vendor_event_idx >= wiphy->n_vendor_events))
8698                         return NULL;
8699                 info = &wiphy->vendor_events[vendor_event_idx];
8700                 break;
8701         default:
8702                 WARN_ON(1);
8703                 return NULL;
8704         }
8705
8706         return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, 0, 0,
8707                                            cmd, attr, info, gfp);
8708 }
8709 EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
8710
8711 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
8712 {
8713         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
8714         void *hdr = ((void **)skb->cb)[1];
8715         struct nlattr *data = ((void **)skb->cb)[2];
8716         enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
8717
8718         /* clear CB data for netlink core to own from now on */
8719         memset(skb->cb, 0, sizeof(skb->cb));
8720
8721         nla_nest_end(skb, data);
8722         genlmsg_end(skb, hdr);
8723
8724         if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
8725                 mcgrp = NL80211_MCGRP_VENDOR;
8726
8727         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0,
8728                                 mcgrp, gfp);
8729 }
8730 EXPORT_SYMBOL(__cfg80211_send_event_skb);
8731
8732 #ifdef CONFIG_NL80211_TESTMODE
8733 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
8734 {
8735         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8736         struct wireless_dev *wdev =
8737                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
8738         int err;
8739
8740         if (!rdev->ops->testmode_cmd)
8741                 return -EOPNOTSUPP;
8742
8743         if (IS_ERR(wdev)) {
8744                 err = PTR_ERR(wdev);
8745                 if (err != -EINVAL)
8746                         return err;
8747                 wdev = NULL;
8748         } else if (wdev->wiphy != &rdev->wiphy) {
8749                 return -EINVAL;
8750         }
8751
8752         if (!info->attrs[NL80211_ATTR_TESTDATA])
8753                 return -EINVAL;
8754
8755         rdev->cur_cmd_info = info;
8756         err = rdev_testmode_cmd(rdev, wdev,
8757                                 nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
8758                                 nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
8759         rdev->cur_cmd_info = NULL;
8760
8761         return err;
8762 }
8763
8764 static int nl80211_testmode_dump(struct sk_buff *skb,
8765                                  struct netlink_callback *cb)
8766 {
8767         struct cfg80211_registered_device *rdev;
8768         int err;
8769         long phy_idx;
8770         void *data = NULL;
8771         int data_len = 0;
8772
8773         rtnl_lock();
8774
8775         if (cb->args[0]) {
8776                 /*
8777                  * 0 is a valid index, but not valid for args[0],
8778                  * so we need to offset by 1.
8779                  */
8780                 phy_idx = cb->args[0] - 1;
8781
8782                 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
8783                 if (!rdev) {
8784                         err = -ENOENT;
8785                         goto out_err;
8786                 }
8787         } else {
8788                 struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
8789
8790                 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
8791                                   attrbuf, nl80211_fam.maxattr,
8792                                   nl80211_policy, NULL);
8793                 if (err)
8794                         goto out_err;
8795
8796                 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
8797                 if (IS_ERR(rdev)) {
8798                         err = PTR_ERR(rdev);
8799                         goto out_err;
8800                 }
8801                 phy_idx = rdev->wiphy_idx;
8802
8803                 if (attrbuf[NL80211_ATTR_TESTDATA])
8804                         cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA];
8805         }
8806
8807         if (cb->args[1]) {
8808                 data = nla_data((void *)cb->args[1]);
8809                 data_len = nla_len((void *)cb->args[1]);
8810         }
8811
8812         if (!rdev->ops->testmode_dump) {
8813                 err = -EOPNOTSUPP;
8814                 goto out_err;
8815         }
8816
8817         while (1) {
8818                 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
8819                                            cb->nlh->nlmsg_seq, NLM_F_MULTI,
8820                                            NL80211_CMD_TESTMODE);
8821                 struct nlattr *tmdata;
8822
8823                 if (!hdr)
8824                         break;
8825
8826                 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) {
8827                         genlmsg_cancel(skb, hdr);
8828                         break;
8829                 }
8830
8831                 tmdata = nla_nest_start(skb, NL80211_ATTR_TESTDATA);
8832                 if (!tmdata) {
8833                         genlmsg_cancel(skb, hdr);
8834                         break;
8835                 }
8836                 err = rdev_testmode_dump(rdev, skb, cb, data, data_len);
8837                 nla_nest_end(skb, tmdata);
8838
8839                 if (err == -ENOBUFS || err == -ENOENT) {
8840                         genlmsg_cancel(skb, hdr);
8841                         break;
8842                 } else if (err) {
8843                         genlmsg_cancel(skb, hdr);
8844                         goto out_err;
8845                 }
8846
8847                 genlmsg_end(skb, hdr);
8848         }
8849
8850         err = skb->len;
8851         /* see above */
8852         cb->args[0] = phy_idx + 1;
8853  out_err:
8854         rtnl_unlock();
8855         return err;
8856 }
8857 #endif
8858
8859 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
8860 {
8861         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8862         struct net_device *dev = info->user_ptr[1];
8863         struct cfg80211_connect_params connect;
8864         struct wiphy *wiphy;
8865         struct cfg80211_cached_keys *connkeys = NULL;
8866         int err;
8867
8868         memset(&connect, 0, sizeof(connect));
8869
8870         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8871                 return -EINVAL;
8872
8873         if (!info->attrs[NL80211_ATTR_SSID] ||
8874             !nla_len(info->attrs[NL80211_ATTR_SSID]))
8875                 return -EINVAL;
8876
8877         if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
8878                 connect.auth_type =
8879                         nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
8880                 if (!nl80211_valid_auth_type(rdev, connect.auth_type,
8881                                              NL80211_CMD_CONNECT))
8882                         return -EINVAL;
8883         } else
8884                 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
8885
8886         connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
8887
8888         if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] &&
8889             !wiphy_ext_feature_isset(&rdev->wiphy,
8890                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
8891                 return -EINVAL;
8892         connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS];
8893
8894         err = nl80211_crypto_settings(rdev, info, &connect.crypto,
8895                                       NL80211_MAX_NR_CIPHER_SUITES);
8896         if (err)
8897                 return err;
8898
8899         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8900             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8901                 return -EOPNOTSUPP;
8902
8903         wiphy = &rdev->wiphy;
8904
8905         connect.bg_scan_period = -1;
8906         if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] &&
8907                 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) {
8908                 connect.bg_scan_period =
8909                         nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]);
8910         }
8911
8912         if (info->attrs[NL80211_ATTR_MAC])
8913                 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8914         else if (info->attrs[NL80211_ATTR_MAC_HINT])
8915                 connect.bssid_hint =
8916                         nla_data(info->attrs[NL80211_ATTR_MAC_HINT]);
8917         connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8918         connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8919
8920         if (info->attrs[NL80211_ATTR_IE]) {
8921                 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8922                 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8923         }
8924
8925         if (info->attrs[NL80211_ATTR_USE_MFP]) {
8926                 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
8927                 if (connect.mfp != NL80211_MFP_REQUIRED &&
8928                     connect.mfp != NL80211_MFP_NO)
8929                         return -EINVAL;
8930         } else {
8931                 connect.mfp = NL80211_MFP_NO;
8932         }
8933
8934         if (info->attrs[NL80211_ATTR_PREV_BSSID])
8935                 connect.prev_bssid =
8936                         nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
8937
8938         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
8939                 connect.channel = nl80211_get_valid_chan(
8940                         wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ]);
8941                 if (!connect.channel)
8942                         return -EINVAL;
8943         } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) {
8944                 connect.channel_hint = nl80211_get_valid_chan(
8945                         wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]);
8946                 if (!connect.channel_hint)
8947                         return -EINVAL;
8948         }
8949
8950         if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
8951                 connkeys = nl80211_parse_connkeys(rdev,
8952                                           info->attrs[NL80211_ATTR_KEYS], NULL);
8953                 if (IS_ERR(connkeys))
8954                         return PTR_ERR(connkeys);
8955         }
8956
8957         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
8958                 connect.flags |= ASSOC_REQ_DISABLE_HT;
8959
8960         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8961                 memcpy(&connect.ht_capa_mask,
8962                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
8963                        sizeof(connect.ht_capa_mask));
8964
8965         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
8966                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
8967                         kzfree(connkeys);
8968                         return -EINVAL;
8969                 }
8970                 memcpy(&connect.ht_capa,
8971                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
8972                        sizeof(connect.ht_capa));
8973         }
8974
8975         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
8976                 connect.flags |= ASSOC_REQ_DISABLE_VHT;
8977
8978         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
8979                 memcpy(&connect.vht_capa_mask,
8980                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
8981                        sizeof(connect.vht_capa_mask));
8982
8983         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
8984                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
8985                         kzfree(connkeys);
8986                         return -EINVAL;
8987                 }
8988                 memcpy(&connect.vht_capa,
8989                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
8990                        sizeof(connect.vht_capa));
8991         }
8992
8993         if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
8994                 if (!((rdev->wiphy.features &
8995                         NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
8996                        (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
8997                     !wiphy_ext_feature_isset(&rdev->wiphy,
8998                                              NL80211_EXT_FEATURE_RRM)) {
8999                         kzfree(connkeys);
9000                         return -EINVAL;
9001                 }
9002                 connect.flags |= ASSOC_REQ_USE_RRM;
9003         }
9004
9005         connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
9006         if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) {
9007                 kzfree(connkeys);
9008                 return -EOPNOTSUPP;
9009         }
9010
9011         if (info->attrs[NL80211_ATTR_BSS_SELECT]) {
9012                 /* bss selection makes no sense if bssid is set */
9013                 if (connect.bssid) {
9014                         kzfree(connkeys);
9015                         return -EINVAL;
9016                 }
9017
9018                 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT],
9019                                        wiphy, &connect.bss_select);
9020                 if (err) {
9021                         kzfree(connkeys);
9022                         return err;
9023                 }
9024         }
9025
9026         if (wiphy_ext_feature_isset(&rdev->wiphy,
9027                                     NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
9028             info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
9029             info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
9030             info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
9031             info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
9032                 connect.fils_erp_username =
9033                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
9034                 connect.fils_erp_username_len =
9035                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
9036                 connect.fils_erp_realm =
9037                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
9038                 connect.fils_erp_realm_len =
9039                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
9040                 connect.fils_erp_next_seq_num =
9041                         nla_get_u16(
9042                            info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
9043                 connect.fils_erp_rrk =
9044                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
9045                 connect.fils_erp_rrk_len =
9046                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
9047         } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
9048                    info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
9049                    info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
9050                    info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
9051                 kzfree(connkeys);
9052                 return -EINVAL;
9053         }
9054
9055         wdev_lock(dev->ieee80211_ptr);
9056
9057         err = cfg80211_connect(rdev, dev, &connect, connkeys,
9058                                connect.prev_bssid);
9059         if (err)
9060                 kzfree(connkeys);
9061
9062         if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
9063                 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
9064                 if (connect.bssid)
9065                         memcpy(dev->ieee80211_ptr->disconnect_bssid,
9066                                connect.bssid, ETH_ALEN);
9067                 else
9068                         memset(dev->ieee80211_ptr->disconnect_bssid,
9069                                0, ETH_ALEN);
9070         }
9071
9072         wdev_unlock(dev->ieee80211_ptr);
9073
9074         return err;
9075 }
9076
9077 static int nl80211_update_connect_params(struct sk_buff *skb,
9078                                          struct genl_info *info)
9079 {
9080         struct cfg80211_connect_params connect = {};
9081         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9082         struct net_device *dev = info->user_ptr[1];
9083         struct wireless_dev *wdev = dev->ieee80211_ptr;
9084         u32 changed = 0;
9085         int ret;
9086
9087         if (!rdev->ops->update_connect_params)
9088                 return -EOPNOTSUPP;
9089
9090         if (info->attrs[NL80211_ATTR_IE]) {
9091                 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
9092                         return -EINVAL;
9093                 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
9094                 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9095                 changed |= UPDATE_ASSOC_IES;
9096         }
9097
9098         wdev_lock(dev->ieee80211_ptr);
9099         if (!wdev->current_bss)
9100                 ret = -ENOLINK;
9101         else
9102                 ret = rdev_update_connect_params(rdev, dev, &connect, changed);
9103         wdev_unlock(dev->ieee80211_ptr);
9104
9105         return ret;
9106 }
9107
9108 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
9109 {
9110         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9111         struct net_device *dev = info->user_ptr[1];
9112         u16 reason;
9113         int ret;
9114
9115         if (!info->attrs[NL80211_ATTR_REASON_CODE])
9116                 reason = WLAN_REASON_DEAUTH_LEAVING;
9117         else
9118                 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
9119
9120         if (reason == 0)
9121                 return -EINVAL;
9122
9123         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9124             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9125                 return -EOPNOTSUPP;
9126
9127         wdev_lock(dev->ieee80211_ptr);
9128         ret = cfg80211_disconnect(rdev, dev, reason, true);
9129         wdev_unlock(dev->ieee80211_ptr);
9130         return ret;
9131 }
9132
9133 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
9134 {
9135         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9136         struct net *net;
9137         int err;
9138
9139         if (info->attrs[NL80211_ATTR_PID]) {
9140                 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
9141
9142                 net = get_net_ns_by_pid(pid);
9143         } else if (info->attrs[NL80211_ATTR_NETNS_FD]) {
9144                 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]);
9145
9146                 net = get_net_ns_by_fd(fd);
9147         } else {
9148                 return -EINVAL;
9149         }
9150
9151         if (IS_ERR(net))
9152                 return PTR_ERR(net);
9153
9154         err = 0;
9155
9156         /* check if anything to do */
9157         if (!net_eq(wiphy_net(&rdev->wiphy), net))
9158                 err = cfg80211_switch_netns(rdev, net);
9159
9160         put_net(net);
9161         return err;
9162 }
9163
9164 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
9165 {
9166         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9167         int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev,
9168                         struct cfg80211_pmksa *pmksa) = NULL;
9169         struct net_device *dev = info->user_ptr[1];
9170         struct cfg80211_pmksa pmksa;
9171
9172         memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
9173
9174         if (!info->attrs[NL80211_ATTR_PMKID])
9175                 return -EINVAL;
9176
9177         pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
9178
9179         if (info->attrs[NL80211_ATTR_MAC]) {
9180                 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
9181         } else if (info->attrs[NL80211_ATTR_SSID] &&
9182                    info->attrs[NL80211_ATTR_FILS_CACHE_ID] &&
9183                    (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA ||
9184                     info->attrs[NL80211_ATTR_PMK])) {
9185                 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
9186                 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
9187                 pmksa.cache_id =
9188                         nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]);
9189         } else {
9190                 return -EINVAL;
9191         }
9192         if (info->attrs[NL80211_ATTR_PMK]) {
9193                 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
9194                 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
9195         }
9196
9197         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9198             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9199                 return -EOPNOTSUPP;
9200
9201         switch (info->genlhdr->cmd) {
9202         case NL80211_CMD_SET_PMKSA:
9203                 rdev_ops = rdev->ops->set_pmksa;
9204                 break;
9205         case NL80211_CMD_DEL_PMKSA:
9206                 rdev_ops = rdev->ops->del_pmksa;
9207                 break;
9208         default:
9209                 WARN_ON(1);
9210                 break;
9211         }
9212
9213         if (!rdev_ops)
9214                 return -EOPNOTSUPP;
9215
9216         return rdev_ops(&rdev->wiphy, dev, &pmksa);
9217 }
9218
9219 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
9220 {
9221         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9222         struct net_device *dev = info->user_ptr[1];
9223
9224         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9225             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9226                 return -EOPNOTSUPP;
9227
9228         if (!rdev->ops->flush_pmksa)
9229                 return -EOPNOTSUPP;
9230
9231         return rdev_flush_pmksa(rdev, dev);
9232 }
9233
9234 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
9235 {
9236         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9237         struct net_device *dev = info->user_ptr[1];
9238         u8 action_code, dialog_token;
9239         u32 peer_capability = 0;
9240         u16 status_code;
9241         u8 *peer;
9242         bool initiator;
9243
9244         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
9245             !rdev->ops->tdls_mgmt)
9246                 return -EOPNOTSUPP;
9247
9248         if (!info->attrs[NL80211_ATTR_TDLS_ACTION] ||
9249             !info->attrs[NL80211_ATTR_STATUS_CODE] ||
9250             !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] ||
9251             !info->attrs[NL80211_ATTR_IE] ||
9252             !info->attrs[NL80211_ATTR_MAC])
9253                 return -EINVAL;
9254
9255         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
9256         action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
9257         status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
9258         dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
9259         initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]);
9260         if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
9261                 peer_capability =
9262                         nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
9263
9264         return rdev_tdls_mgmt(rdev, dev, peer, action_code,
9265                               dialog_token, status_code, peer_capability,
9266                               initiator,
9267                               nla_data(info->attrs[NL80211_ATTR_IE]),
9268                               nla_len(info->attrs[NL80211_ATTR_IE]));
9269 }
9270
9271 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info)
9272 {
9273         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9274         struct net_device *dev = info->user_ptr[1];
9275         enum nl80211_tdls_operation operation;
9276         u8 *peer;
9277
9278         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
9279             !rdev->ops->tdls_oper)
9280                 return -EOPNOTSUPP;
9281
9282         if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] ||
9283             !info->attrs[NL80211_ATTR_MAC])
9284                 return -EINVAL;
9285
9286         operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]);
9287         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
9288
9289         return rdev_tdls_oper(rdev, dev, peer, operation);
9290 }
9291
9292 static int nl80211_remain_on_channel(struct sk_buff *skb,
9293                                      struct genl_info *info)
9294 {
9295         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9296         struct wireless_dev *wdev = info->user_ptr[1];
9297         struct cfg80211_chan_def chandef;
9298         const struct cfg80211_chan_def *compat_chandef;
9299         struct sk_buff *msg;
9300         void *hdr;
9301         u64 cookie;
9302         u32 duration;
9303         int err;
9304
9305         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
9306             !info->attrs[NL80211_ATTR_DURATION])
9307                 return -EINVAL;
9308
9309         duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
9310
9311         if (!rdev->ops->remain_on_channel ||
9312             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL))
9313                 return -EOPNOTSUPP;
9314
9315         /*
9316          * We should be on that channel for at least a minimum amount of
9317          * time (10ms) but no longer than the driver supports.
9318          */
9319         if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
9320             duration > rdev->wiphy.max_remain_on_channel_duration)
9321                 return -EINVAL;
9322
9323         err = nl80211_parse_chandef(rdev, info, &chandef);
9324         if (err)
9325                 return err;
9326
9327         wdev_lock(wdev);
9328         if (!cfg80211_off_channel_oper_allowed(wdev) &&
9329             !cfg80211_chandef_identical(&wdev->chandef, &chandef)) {
9330                 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef,
9331                                                              &chandef);
9332                 if (compat_chandef != &chandef) {
9333                         wdev_unlock(wdev);
9334                         return -EBUSY;
9335                 }
9336         }
9337         wdev_unlock(wdev);
9338
9339         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9340         if (!msg)
9341                 return -ENOMEM;
9342
9343         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
9344                              NL80211_CMD_REMAIN_ON_CHANNEL);
9345         if (!hdr) {
9346                 err = -ENOBUFS;
9347                 goto free_msg;
9348         }
9349
9350         err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
9351                                      duration, &cookie);
9352
9353         if (err)
9354                 goto free_msg;
9355
9356         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
9357                               NL80211_ATTR_PAD))
9358                 goto nla_put_failure;
9359
9360         genlmsg_end(msg, hdr);
9361
9362         return genlmsg_reply(msg, info);
9363
9364  nla_put_failure:
9365         err = -ENOBUFS;
9366  free_msg:
9367         nlmsg_free(msg);
9368         return err;
9369 }
9370
9371 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
9372                                             struct genl_info *info)
9373 {
9374         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9375         struct wireless_dev *wdev = info->user_ptr[1];
9376         u64 cookie;
9377
9378         if (!info->attrs[NL80211_ATTR_COOKIE])
9379                 return -EINVAL;
9380
9381         if (!rdev->ops->cancel_remain_on_channel)
9382                 return -EOPNOTSUPP;
9383
9384         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
9385
9386         return rdev_cancel_remain_on_channel(rdev, wdev, cookie);
9387 }
9388
9389 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
9390                                        struct genl_info *info)
9391 {
9392         struct cfg80211_bitrate_mask mask;
9393         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9394         struct net_device *dev = info->user_ptr[1];
9395         int err;
9396
9397         if (!rdev->ops->set_bitrate_mask)
9398                 return -EOPNOTSUPP;
9399
9400         err = nl80211_parse_tx_bitrate_mask(info, &mask);
9401         if (err)
9402                 return err;
9403
9404         return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
9405 }
9406
9407 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
9408 {
9409         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9410         struct wireless_dev *wdev = info->user_ptr[1];
9411         u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
9412
9413         if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
9414                 return -EINVAL;
9415
9416         if (info->attrs[NL80211_ATTR_FRAME_TYPE])
9417                 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
9418
9419         switch (wdev->iftype) {
9420         case NL80211_IFTYPE_STATION:
9421         case NL80211_IFTYPE_ADHOC:
9422         case NL80211_IFTYPE_P2P_CLIENT:
9423         case NL80211_IFTYPE_AP:
9424         case NL80211_IFTYPE_AP_VLAN:
9425         case NL80211_IFTYPE_MESH_POINT:
9426         case NL80211_IFTYPE_P2P_GO:
9427         case NL80211_IFTYPE_P2P_DEVICE:
9428                 break;
9429         case NL80211_IFTYPE_NAN:
9430         default:
9431                 return -EOPNOTSUPP;
9432         }
9433
9434         /* not much point in registering if we can't reply */
9435         if (!rdev->ops->mgmt_tx)
9436                 return -EOPNOTSUPP;
9437
9438         return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type,
9439                         nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
9440                         nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]));
9441 }
9442
9443 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
9444 {
9445         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9446         struct wireless_dev *wdev = info->user_ptr[1];
9447         struct cfg80211_chan_def chandef;
9448         int err;
9449         void *hdr = NULL;
9450         u64 cookie;
9451         struct sk_buff *msg = NULL;
9452         struct cfg80211_mgmt_tx_params params = {
9453                 .dont_wait_for_ack =
9454                         info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK],
9455         };
9456
9457         if (!info->attrs[NL80211_ATTR_FRAME])
9458                 return -EINVAL;
9459
9460         if (!rdev->ops->mgmt_tx)
9461                 return -EOPNOTSUPP;
9462
9463         switch (wdev->iftype) {
9464         case NL80211_IFTYPE_P2P_DEVICE:
9465                 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
9466                         return -EINVAL;
9467         case NL80211_IFTYPE_STATION:
9468         case NL80211_IFTYPE_ADHOC:
9469         case NL80211_IFTYPE_P2P_CLIENT:
9470         case NL80211_IFTYPE_AP:
9471         case NL80211_IFTYPE_AP_VLAN:
9472         case NL80211_IFTYPE_MESH_POINT:
9473         case NL80211_IFTYPE_P2P_GO:
9474                 break;
9475         case NL80211_IFTYPE_NAN:
9476         default:
9477                 return -EOPNOTSUPP;
9478         }
9479
9480         if (info->attrs[NL80211_ATTR_DURATION]) {
9481                 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
9482                         return -EINVAL;
9483                 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
9484
9485                 /*
9486                  * We should wait on the channel for at least a minimum amount
9487                  * of time (10ms) but no longer than the driver supports.
9488                  */
9489                 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
9490                     params.wait > rdev->wiphy.max_remain_on_channel_duration)
9491                         return -EINVAL;
9492         }
9493
9494         params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
9495
9496         if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
9497                 return -EINVAL;
9498
9499         params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
9500
9501         /* get the channel if any has been specified, otherwise pass NULL to
9502          * the driver. The latter will use the current one
9503          */
9504         chandef.chan = NULL;
9505         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
9506                 err = nl80211_parse_chandef(rdev, info, &chandef);
9507                 if (err)
9508                         return err;
9509         }
9510
9511         if (!chandef.chan && params.offchan)
9512                 return -EINVAL;
9513
9514         wdev_lock(wdev);
9515         if (params.offchan && !cfg80211_off_channel_oper_allowed(wdev)) {
9516                 wdev_unlock(wdev);
9517                 return -EBUSY;
9518         }
9519         wdev_unlock(wdev);
9520
9521         params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
9522         params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
9523
9524         if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) {
9525                 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
9526                 int i;
9527
9528                 if (len % sizeof(u16))
9529                         return -EINVAL;
9530
9531                 params.n_csa_offsets = len / sizeof(u16);
9532                 params.csa_offsets =
9533                         nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
9534
9535                 /* check that all the offsets fit the frame */
9536                 for (i = 0; i < params.n_csa_offsets; i++) {
9537                         if (params.csa_offsets[i] >= params.len)
9538                                 return -EINVAL;
9539                 }
9540         }
9541
9542         if (!params.dont_wait_for_ack) {
9543                 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9544                 if (!msg)
9545                         return -ENOMEM;
9546
9547                 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
9548                                      NL80211_CMD_FRAME);
9549                 if (!hdr) {
9550                         err = -ENOBUFS;
9551                         goto free_msg;
9552                 }
9553         }
9554
9555         params.chan = chandef.chan;
9556         err = cfg80211_mlme_mgmt_tx(rdev, wdev, &params, &cookie);
9557         if (err)
9558                 goto free_msg;
9559
9560         if (msg) {
9561                 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
9562                                       NL80211_ATTR_PAD))
9563                         goto nla_put_failure;
9564
9565                 genlmsg_end(msg, hdr);
9566                 return genlmsg_reply(msg, info);
9567         }
9568
9569         return 0;
9570
9571  nla_put_failure:
9572         err = -ENOBUFS;
9573  free_msg:
9574         nlmsg_free(msg);
9575         return err;
9576 }
9577
9578 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
9579 {
9580         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9581         struct wireless_dev *wdev = info->user_ptr[1];
9582         u64 cookie;
9583
9584         if (!info->attrs[NL80211_ATTR_COOKIE])
9585                 return -EINVAL;
9586
9587         if (!rdev->ops->mgmt_tx_cancel_wait)
9588                 return -EOPNOTSUPP;
9589
9590         switch (wdev->iftype) {
9591         case NL80211_IFTYPE_STATION:
9592         case NL80211_IFTYPE_ADHOC:
9593         case NL80211_IFTYPE_P2P_CLIENT:
9594         case NL80211_IFTYPE_AP:
9595         case NL80211_IFTYPE_AP_VLAN:
9596         case NL80211_IFTYPE_P2P_GO:
9597         case NL80211_IFTYPE_P2P_DEVICE:
9598                 break;
9599         case NL80211_IFTYPE_NAN:
9600         default:
9601                 return -EOPNOTSUPP;
9602         }
9603
9604         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
9605
9606         return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie);
9607 }
9608
9609 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
9610 {
9611         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9612         struct wireless_dev *wdev;
9613         struct net_device *dev = info->user_ptr[1];
9614         u8 ps_state;
9615         bool state;
9616         int err;
9617
9618         if (!info->attrs[NL80211_ATTR_PS_STATE])
9619                 return -EINVAL;
9620
9621         ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
9622
9623         if (ps_state != NL80211_PS_DISABLED && ps_state != NL80211_PS_ENABLED)
9624                 return -EINVAL;
9625
9626         wdev = dev->ieee80211_ptr;
9627
9628         if (!rdev->ops->set_power_mgmt)
9629                 return -EOPNOTSUPP;
9630
9631         state = (ps_state == NL80211_PS_ENABLED) ? true : false;
9632
9633         if (state == wdev->ps)
9634                 return 0;
9635
9636         err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout);
9637         if (!err)
9638                 wdev->ps = state;
9639         return err;
9640 }
9641
9642 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
9643 {
9644         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9645         enum nl80211_ps_state ps_state;
9646         struct wireless_dev *wdev;
9647         struct net_device *dev = info->user_ptr[1];
9648         struct sk_buff *msg;
9649         void *hdr;
9650         int err;
9651
9652         wdev = dev->ieee80211_ptr;
9653
9654         if (!rdev->ops->set_power_mgmt)
9655                 return -EOPNOTSUPP;
9656
9657         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9658         if (!msg)
9659                 return -ENOMEM;
9660
9661         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
9662                              NL80211_CMD_GET_POWER_SAVE);
9663         if (!hdr) {
9664                 err = -ENOBUFS;
9665                 goto free_msg;
9666         }
9667
9668         if (wdev->ps)
9669                 ps_state = NL80211_PS_ENABLED;
9670         else
9671                 ps_state = NL80211_PS_DISABLED;
9672
9673         if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state))
9674                 goto nla_put_failure;
9675
9676         genlmsg_end(msg, hdr);
9677         return genlmsg_reply(msg, info);
9678
9679  nla_put_failure:
9680         err = -ENOBUFS;
9681  free_msg:
9682         nlmsg_free(msg);
9683         return err;
9684 }
9685
9686 static const struct nla_policy
9687 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
9688         [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY },
9689         [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 },
9690         [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
9691         [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
9692         [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
9693         [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
9694         [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 },
9695 };
9696
9697 static int nl80211_set_cqm_txe(struct genl_info *info,
9698                                u32 rate, u32 pkts, u32 intvl)
9699 {
9700         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9701         struct net_device *dev = info->user_ptr[1];
9702         struct wireless_dev *wdev = dev->ieee80211_ptr;
9703
9704         if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL)
9705                 return -EINVAL;
9706
9707         if (!rdev->ops->set_cqm_txe_config)
9708                 return -EOPNOTSUPP;
9709
9710         if (wdev->iftype != NL80211_IFTYPE_STATION &&
9711             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
9712                 return -EOPNOTSUPP;
9713
9714         return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl);
9715 }
9716
9717 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
9718                                     struct net_device *dev)
9719 {
9720         struct wireless_dev *wdev = dev->ieee80211_ptr;
9721         s32 last, low, high;
9722         u32 hyst;
9723         int i, n;
9724         int err;
9725
9726         /* RSSI reporting disabled? */
9727         if (!wdev->cqm_config)
9728                 return rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0);
9729
9730         /*
9731          * Obtain current RSSI value if possible, if not and no RSSI threshold
9732          * event has been received yet, we should receive an event after a
9733          * connection is established and enough beacons received to calculate
9734          * the average.
9735          */
9736         if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss &&
9737             rdev->ops->get_station) {
9738                 struct station_info sinfo;
9739                 u8 *mac_addr;
9740
9741                 mac_addr = wdev->current_bss->pub.bssid;
9742
9743                 err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
9744                 if (err)
9745                         return err;
9746
9747                 if (sinfo.filled & BIT(NL80211_STA_INFO_BEACON_SIGNAL_AVG))
9748                         wdev->cqm_config->last_rssi_event_value =
9749                                 (s8) sinfo.rx_beacon_signal_avg;
9750         }
9751
9752         last = wdev->cqm_config->last_rssi_event_value;
9753         hyst = wdev->cqm_config->rssi_hyst;
9754         n = wdev->cqm_config->n_rssi_thresholds;
9755
9756         for (i = 0; i < n; i++)
9757                 if (last < wdev->cqm_config->rssi_thresholds[i])
9758                         break;
9759
9760         low = i > 0 ?
9761                 (wdev->cqm_config->rssi_thresholds[i - 1] - hyst) : S32_MIN;
9762         high = i < n ?
9763                 (wdev->cqm_config->rssi_thresholds[i] + hyst - 1) : S32_MAX;
9764
9765         return rdev_set_cqm_rssi_range_config(rdev, dev, low, high);
9766 }
9767
9768 static int nl80211_set_cqm_rssi(struct genl_info *info,
9769                                 const s32 *thresholds, int n_thresholds,
9770                                 u32 hysteresis)
9771 {
9772         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9773         struct net_device *dev = info->user_ptr[1];
9774         struct wireless_dev *wdev = dev->ieee80211_ptr;
9775         int i, err;
9776         s32 prev = S32_MIN;
9777
9778         /* Check all values negative and sorted */
9779         for (i = 0; i < n_thresholds; i++) {
9780                 if (thresholds[i] > 0 || thresholds[i] <= prev)
9781                         return -EINVAL;
9782
9783                 prev = thresholds[i];
9784         }
9785
9786         if (wdev->iftype != NL80211_IFTYPE_STATION &&
9787             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
9788                 return -EOPNOTSUPP;
9789
9790         wdev_lock(wdev);
9791         cfg80211_cqm_config_free(wdev);
9792         wdev_unlock(wdev);
9793
9794         if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) {
9795                 if (n_thresholds == 0 || thresholds[0] == 0) /* Disabling */
9796                         return rdev_set_cqm_rssi_config(rdev, dev, 0, 0);
9797
9798                 return rdev_set_cqm_rssi_config(rdev, dev,
9799                                                 thresholds[0], hysteresis);
9800         }
9801
9802         if (!wiphy_ext_feature_isset(&rdev->wiphy,
9803                                      NL80211_EXT_FEATURE_CQM_RSSI_LIST))
9804                 return -EOPNOTSUPP;
9805
9806         if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */
9807                 n_thresholds = 0;
9808
9809         wdev_lock(wdev);
9810         if (n_thresholds) {
9811                 struct cfg80211_cqm_config *cqm_config;
9812
9813                 cqm_config = kzalloc(sizeof(struct cfg80211_cqm_config) +
9814                                      n_thresholds * sizeof(s32), GFP_KERNEL);
9815                 if (!cqm_config) {
9816                         err = -ENOMEM;
9817                         goto unlock;
9818                 }
9819
9820                 cqm_config->rssi_hyst = hysteresis;
9821                 cqm_config->n_rssi_thresholds = n_thresholds;
9822                 memcpy(cqm_config->rssi_thresholds, thresholds,
9823                        n_thresholds * sizeof(s32));
9824
9825                 wdev->cqm_config = cqm_config;
9826         }
9827
9828         err = cfg80211_cqm_rssi_update(rdev, dev);
9829
9830 unlock:
9831         wdev_unlock(wdev);
9832
9833         return err;
9834 }
9835
9836 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
9837 {
9838         struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1];
9839         struct nlattr *cqm;
9840         int err;
9841
9842         cqm = info->attrs[NL80211_ATTR_CQM];
9843         if (!cqm)
9844                 return -EINVAL;
9845
9846         err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm,
9847                                nl80211_attr_cqm_policy, info->extack);
9848         if (err)
9849                 return err;
9850
9851         if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
9852             attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
9853                 const s32 *thresholds =
9854                         nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
9855                 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
9856                 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
9857
9858                 if (len % 4)
9859                         return -EINVAL;
9860
9861                 return nl80211_set_cqm_rssi(info, thresholds, len / 4,
9862                                             hysteresis);
9863         }
9864
9865         if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
9866             attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
9867             attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
9868                 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
9869                 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
9870                 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
9871
9872                 return nl80211_set_cqm_txe(info, rate, pkts, intvl);
9873         }
9874
9875         return -EINVAL;
9876 }
9877
9878 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info)
9879 {
9880         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9881         struct net_device *dev = info->user_ptr[1];
9882         struct ocb_setup setup = {};
9883         int err;
9884
9885         err = nl80211_parse_chandef(rdev, info, &setup.chandef);
9886         if (err)
9887                 return err;
9888
9889         return cfg80211_join_ocb(rdev, dev, &setup);
9890 }
9891
9892 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info)
9893 {
9894         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9895         struct net_device *dev = info->user_ptr[1];
9896
9897         return cfg80211_leave_ocb(rdev, dev);
9898 }
9899
9900 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
9901 {
9902         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9903         struct net_device *dev = info->user_ptr[1];
9904         struct mesh_config cfg;
9905         struct mesh_setup setup;
9906         int err;
9907
9908         /* start with default */
9909         memcpy(&cfg, &default_mesh_config, sizeof(cfg));
9910         memcpy(&setup, &default_mesh_setup, sizeof(setup));
9911
9912         if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
9913                 /* and parse parameters if given */
9914                 err = nl80211_parse_mesh_config(info, &cfg, NULL);
9915                 if (err)
9916                         return err;
9917         }
9918
9919         if (!info->attrs[NL80211_ATTR_MESH_ID] ||
9920             !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
9921                 return -EINVAL;
9922
9923         setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
9924         setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
9925
9926         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
9927             !nl80211_parse_mcast_rate(rdev, setup.mcast_rate,
9928                             nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
9929                         return -EINVAL;
9930
9931         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
9932                 setup.beacon_interval =
9933                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
9934
9935                 err = cfg80211_validate_beacon_int(rdev,
9936                                                    NL80211_IFTYPE_MESH_POINT,
9937                                                    setup.beacon_interval);
9938                 if (err)
9939                         return err;
9940         }
9941
9942         if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
9943                 setup.dtim_period =
9944                         nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
9945                 if (setup.dtim_period < 1 || setup.dtim_period > 100)
9946                         return -EINVAL;
9947         }
9948
9949         if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
9950                 /* parse additional setup parameters if given */
9951                 err = nl80211_parse_mesh_setup(info, &setup);
9952                 if (err)
9953                         return err;
9954         }
9955
9956         if (setup.user_mpm)
9957                 cfg.auto_open_plinks = false;
9958
9959         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
9960                 err = nl80211_parse_chandef(rdev, info, &setup.chandef);
9961                 if (err)
9962                         return err;
9963         } else {
9964                 /* cfg80211_join_mesh() will sort it out */
9965                 setup.chandef.chan = NULL;
9966         }
9967
9968         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
9969                 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
9970                 int n_rates =
9971                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
9972                 struct ieee80211_supported_band *sband;
9973
9974                 if (!setup.chandef.chan)
9975                         return -EINVAL;
9976
9977                 sband = rdev->wiphy.bands[setup.chandef.chan->band];
9978
9979                 err = ieee80211_get_ratemask(sband, rates, n_rates,
9980                                              &setup.basic_rates);
9981                 if (err)
9982                         return err;
9983         }
9984
9985         if (info->attrs[NL80211_ATTR_TX_RATES]) {
9986                 err = nl80211_parse_tx_bitrate_mask(info, &setup.beacon_rate);
9987                 if (err)
9988                         return err;
9989
9990                 if (!setup.chandef.chan)
9991                         return -EINVAL;
9992
9993                 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band,
9994                                               &setup.beacon_rate);
9995                 if (err)
9996                         return err;
9997         }
9998
9999         setup.userspace_handles_dfs =
10000                 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
10001
10002         return cfg80211_join_mesh(rdev, dev, &setup, &cfg);
10003 }
10004
10005 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
10006 {
10007         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10008         struct net_device *dev = info->user_ptr[1];
10009
10010         return cfg80211_leave_mesh(rdev, dev);
10011 }
10012
10013 #ifdef CONFIG_PM
10014 static int nl80211_send_wowlan_patterns(struct sk_buff *msg,
10015                                         struct cfg80211_registered_device *rdev)
10016 {
10017         struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config;
10018         struct nlattr *nl_pats, *nl_pat;
10019         int i, pat_len;
10020
10021         if (!wowlan->n_patterns)
10022                 return 0;
10023
10024         nl_pats = nla_nest_start(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN);
10025         if (!nl_pats)
10026                 return -ENOBUFS;
10027
10028         for (i = 0; i < wowlan->n_patterns; i++) {
10029                 nl_pat = nla_nest_start(msg, i + 1);
10030                 if (!nl_pat)
10031                         return -ENOBUFS;
10032                 pat_len = wowlan->patterns[i].pattern_len;
10033                 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8),
10034                             wowlan->patterns[i].mask) ||
10035                     nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
10036                             wowlan->patterns[i].pattern) ||
10037                     nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
10038                                 wowlan->patterns[i].pkt_offset))
10039                         return -ENOBUFS;
10040                 nla_nest_end(msg, nl_pat);
10041         }
10042         nla_nest_end(msg, nl_pats);
10043
10044         return 0;
10045 }
10046
10047 static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
10048                                    struct cfg80211_wowlan_tcp *tcp)
10049 {
10050         struct nlattr *nl_tcp;
10051
10052         if (!tcp)
10053                 return 0;
10054
10055         nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
10056         if (!nl_tcp)
10057                 return -ENOBUFS;
10058
10059         if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) ||
10060             nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) ||
10061             nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) ||
10062             nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) ||
10063             nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) ||
10064             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
10065                     tcp->payload_len, tcp->payload) ||
10066             nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
10067                         tcp->data_interval) ||
10068             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
10069                     tcp->wake_len, tcp->wake_data) ||
10070             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK,
10071                     DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask))
10072                 return -ENOBUFS;
10073
10074         if (tcp->payload_seq.len &&
10075             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
10076                     sizeof(tcp->payload_seq), &tcp->payload_seq))
10077                 return -ENOBUFS;
10078
10079         if (tcp->payload_tok.len &&
10080             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
10081                     sizeof(tcp->payload_tok) + tcp->tokens_size,
10082                     &tcp->payload_tok))
10083                 return -ENOBUFS;
10084
10085         nla_nest_end(msg, nl_tcp);
10086
10087         return 0;
10088 }
10089
10090 static int nl80211_send_wowlan_nd(struct sk_buff *msg,
10091                                   struct cfg80211_sched_scan_request *req)
10092 {
10093         struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan;
10094         int i;
10095
10096         if (!req)
10097                 return 0;
10098
10099         nd = nla_nest_start(msg, NL80211_WOWLAN_TRIG_NET_DETECT);
10100         if (!nd)
10101                 return -ENOBUFS;
10102
10103         if (req->n_scan_plans == 1 &&
10104             nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL,
10105                         req->scan_plans[0].interval * 1000))
10106                 return -ENOBUFS;
10107
10108         if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay))
10109                 return -ENOBUFS;
10110
10111         if (req->relative_rssi_set) {
10112                 struct nl80211_bss_select_rssi_adjust rssi_adjust;
10113
10114                 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI,
10115                                req->relative_rssi))
10116                         return -ENOBUFS;
10117
10118                 rssi_adjust.band = req->rssi_adjust.band;
10119                 rssi_adjust.delta = req->rssi_adjust.delta;
10120                 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST,
10121                             sizeof(rssi_adjust), &rssi_adjust))
10122                         return -ENOBUFS;
10123         }
10124
10125         freqs = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
10126         if (!freqs)
10127                 return -ENOBUFS;
10128
10129         for (i = 0; i < req->n_channels; i++) {
10130                 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
10131                         return -ENOBUFS;
10132         }
10133
10134         nla_nest_end(msg, freqs);
10135
10136         if (req->n_match_sets) {
10137                 matches = nla_nest_start(msg, NL80211_ATTR_SCHED_SCAN_MATCH);
10138                 if (!matches)
10139                         return -ENOBUFS;
10140
10141                 for (i = 0; i < req->n_match_sets; i++) {
10142                         match = nla_nest_start(msg, i);
10143                         if (!match)
10144                                 return -ENOBUFS;
10145
10146                         if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
10147                                     req->match_sets[i].ssid.ssid_len,
10148                                     req->match_sets[i].ssid.ssid))
10149                                 return -ENOBUFS;
10150                         nla_nest_end(msg, match);
10151                 }
10152                 nla_nest_end(msg, matches);
10153         }
10154
10155         scan_plans = nla_nest_start(msg, NL80211_ATTR_SCHED_SCAN_PLANS);
10156         if (!scan_plans)
10157                 return -ENOBUFS;
10158
10159         for (i = 0; i < req->n_scan_plans; i++) {
10160                 scan_plan = nla_nest_start(msg, i + 1);
10161                 if (!scan_plan)
10162                         return -ENOBUFS;
10163
10164                 if (!scan_plan ||
10165                     nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL,
10166                                 req->scan_plans[i].interval) ||
10167                     (req->scan_plans[i].iterations &&
10168                      nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS,
10169                                  req->scan_plans[i].iterations)))
10170                         return -ENOBUFS;
10171                 nla_nest_end(msg, scan_plan);
10172         }
10173         nla_nest_end(msg, scan_plans);
10174
10175         nla_nest_end(msg, nd);
10176
10177         return 0;
10178 }
10179
10180 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
10181 {
10182         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10183         struct sk_buff *msg;
10184         void *hdr;
10185         u32 size = NLMSG_DEFAULT_SIZE;
10186
10187         if (!rdev->wiphy.wowlan)
10188                 return -EOPNOTSUPP;
10189
10190         if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) {
10191                 /* adjust size to have room for all the data */
10192                 size += rdev->wiphy.wowlan_config->tcp->tokens_size +
10193                         rdev->wiphy.wowlan_config->tcp->payload_len +
10194                         rdev->wiphy.wowlan_config->tcp->wake_len +
10195                         rdev->wiphy.wowlan_config->tcp->wake_len / 8;
10196         }
10197
10198         msg = nlmsg_new(size, GFP_KERNEL);
10199         if (!msg)
10200                 return -ENOMEM;
10201
10202         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10203                              NL80211_CMD_GET_WOWLAN);
10204         if (!hdr)
10205                 goto nla_put_failure;
10206
10207         if (rdev->wiphy.wowlan_config) {
10208                 struct nlattr *nl_wowlan;
10209
10210                 nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
10211                 if (!nl_wowlan)
10212                         goto nla_put_failure;
10213
10214                 if ((rdev->wiphy.wowlan_config->any &&
10215                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
10216                     (rdev->wiphy.wowlan_config->disconnect &&
10217                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
10218                     (rdev->wiphy.wowlan_config->magic_pkt &&
10219                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
10220                     (rdev->wiphy.wowlan_config->gtk_rekey_failure &&
10221                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
10222                     (rdev->wiphy.wowlan_config->eap_identity_req &&
10223                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
10224                     (rdev->wiphy.wowlan_config->four_way_handshake &&
10225                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
10226                     (rdev->wiphy.wowlan_config->rfkill_release &&
10227                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
10228                         goto nla_put_failure;
10229
10230                 if (nl80211_send_wowlan_patterns(msg, rdev))
10231                         goto nla_put_failure;
10232
10233                 if (nl80211_send_wowlan_tcp(msg,
10234                                             rdev->wiphy.wowlan_config->tcp))
10235                         goto nla_put_failure;
10236
10237                 if (nl80211_send_wowlan_nd(
10238                             msg,
10239                             rdev->wiphy.wowlan_config->nd_config))
10240                         goto nla_put_failure;
10241
10242                 nla_nest_end(msg, nl_wowlan);
10243         }
10244
10245         genlmsg_end(msg, hdr);
10246         return genlmsg_reply(msg, info);
10247
10248 nla_put_failure:
10249         nlmsg_free(msg);
10250         return -ENOBUFS;
10251 }
10252
10253 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev,
10254                                     struct nlattr *attr,
10255                                     struct cfg80211_wowlan *trig)
10256 {
10257         struct nlattr *tb[NUM_NL80211_WOWLAN_TCP];
10258         struct cfg80211_wowlan_tcp *cfg;
10259         struct nl80211_wowlan_tcp_data_token *tok = NULL;
10260         struct nl80211_wowlan_tcp_data_seq *seq = NULL;
10261         u32 size;
10262         u32 data_size, wake_size, tokens_size = 0, wake_mask_size;
10263         int err, port;
10264
10265         if (!rdev->wiphy.wowlan->tcp)
10266                 return -EINVAL;
10267
10268         err = nla_parse_nested(tb, MAX_NL80211_WOWLAN_TCP, attr,
10269                                nl80211_wowlan_tcp_policy, NULL);
10270         if (err)
10271                 return err;
10272
10273         if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] ||
10274             !tb[NL80211_WOWLAN_TCP_DST_IPV4] ||
10275             !tb[NL80211_WOWLAN_TCP_DST_MAC] ||
10276             !tb[NL80211_WOWLAN_TCP_DST_PORT] ||
10277             !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] ||
10278             !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] ||
10279             !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] ||
10280             !tb[NL80211_WOWLAN_TCP_WAKE_MASK])
10281                 return -EINVAL;
10282
10283         data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]);
10284         if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max)
10285                 return -EINVAL;
10286
10287         if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) >
10288                         rdev->wiphy.wowlan->tcp->data_interval_max ||
10289             nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0)
10290                 return -EINVAL;
10291
10292         wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]);
10293         if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max)
10294                 return -EINVAL;
10295
10296         wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]);
10297         if (wake_mask_size != DIV_ROUND_UP(wake_size, 8))
10298                 return -EINVAL;
10299
10300         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) {
10301                 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
10302
10303                 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
10304                 tokens_size = tokln - sizeof(*tok);
10305
10306                 if (!tok->len || tokens_size % tok->len)
10307                         return -EINVAL;
10308                 if (!rdev->wiphy.wowlan->tcp->tok)
10309                         return -EINVAL;
10310                 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len)
10311                         return -EINVAL;
10312                 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len)
10313                         return -EINVAL;
10314                 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize)
10315                         return -EINVAL;
10316                 if (tok->offset + tok->len > data_size)
10317                         return -EINVAL;
10318         }
10319
10320         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) {
10321                 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]);
10322                 if (!rdev->wiphy.wowlan->tcp->seq)
10323                         return -EINVAL;
10324                 if (seq->len == 0 || seq->len > 4)
10325                         return -EINVAL;
10326                 if (seq->len + seq->offset > data_size)
10327                         return -EINVAL;
10328         }
10329
10330         size = sizeof(*cfg);
10331         size += data_size;
10332         size += wake_size + wake_mask_size;
10333         size += tokens_size;
10334
10335         cfg = kzalloc(size, GFP_KERNEL);
10336         if (!cfg)
10337                 return -ENOMEM;
10338         cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]);
10339         cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]);
10340         memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]),
10341                ETH_ALEN);
10342         if (tb[NL80211_WOWLAN_TCP_SRC_PORT])
10343                 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]);
10344         else
10345                 port = 0;
10346 #ifdef CONFIG_INET
10347         /* allocate a socket and port for it and use it */
10348         err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM,
10349                             IPPROTO_TCP, &cfg->sock, 1);
10350         if (err) {
10351                 kfree(cfg);
10352                 return err;
10353         }
10354         if (inet_csk_get_port(cfg->sock->sk, port)) {
10355                 sock_release(cfg->sock);
10356                 kfree(cfg);
10357                 return -EADDRINUSE;
10358         }
10359         cfg->src_port = inet_sk(cfg->sock->sk)->inet_num;
10360 #else
10361         if (!port) {
10362                 kfree(cfg);
10363                 return -EINVAL;
10364         }
10365         cfg->src_port = port;
10366 #endif
10367
10368         cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]);
10369         cfg->payload_len = data_size;
10370         cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size;
10371         memcpy((void *)cfg->payload,
10372                nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]),
10373                data_size);
10374         if (seq)
10375                 cfg->payload_seq = *seq;
10376         cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]);
10377         cfg->wake_len = wake_size;
10378         cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size;
10379         memcpy((void *)cfg->wake_data,
10380                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]),
10381                wake_size);
10382         cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size +
10383                          data_size + wake_size;
10384         memcpy((void *)cfg->wake_mask,
10385                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]),
10386                wake_mask_size);
10387         if (tok) {
10388                 cfg->tokens_size = tokens_size;
10389                 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size);
10390         }
10391
10392         trig->tcp = cfg;
10393
10394         return 0;
10395 }
10396
10397 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev,
10398                                    const struct wiphy_wowlan_support *wowlan,
10399                                    struct nlattr *attr,
10400                                    struct cfg80211_wowlan *trig)
10401 {
10402         struct nlattr **tb;
10403         int err;
10404
10405         tb = kzalloc(NUM_NL80211_ATTR * sizeof(*tb), GFP_KERNEL);
10406         if (!tb)
10407                 return -ENOMEM;
10408
10409         if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) {
10410                 err = -EOPNOTSUPP;
10411                 goto out;
10412         }
10413
10414         err = nla_parse_nested(tb, NL80211_ATTR_MAX, attr, nl80211_policy,
10415                                NULL);
10416         if (err)
10417                 goto out;
10418
10419         trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb,
10420                                                    wowlan->max_nd_match_sets);
10421         err = PTR_ERR_OR_ZERO(trig->nd_config);
10422         if (err)
10423                 trig->nd_config = NULL;
10424
10425 out:
10426         kfree(tb);
10427         return err;
10428 }
10429
10430 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
10431 {
10432         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10433         struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG];
10434         struct cfg80211_wowlan new_triggers = {};
10435         struct cfg80211_wowlan *ntrig;
10436         const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan;
10437         int err, i;
10438         bool prev_enabled = rdev->wiphy.wowlan_config;
10439         bool regular = false;
10440
10441         if (!wowlan)
10442                 return -EOPNOTSUPP;
10443
10444         if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) {
10445                 cfg80211_rdev_free_wowlan(rdev);
10446                 rdev->wiphy.wowlan_config = NULL;
10447                 goto set_wakeup;
10448         }
10449
10450         err = nla_parse_nested(tb, MAX_NL80211_WOWLAN_TRIG,
10451                                info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS],
10452                                nl80211_wowlan_policy, info->extack);
10453         if (err)
10454                 return err;
10455
10456         if (tb[NL80211_WOWLAN_TRIG_ANY]) {
10457                 if (!(wowlan->flags & WIPHY_WOWLAN_ANY))
10458                         return -EINVAL;
10459                 new_triggers.any = true;
10460         }
10461
10462         if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) {
10463                 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT))
10464                         return -EINVAL;
10465                 new_triggers.disconnect = true;
10466                 regular = true;
10467         }
10468
10469         if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) {
10470                 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT))
10471                         return -EINVAL;
10472                 new_triggers.magic_pkt = true;
10473                 regular = true;
10474         }
10475
10476         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED])
10477                 return -EINVAL;
10478
10479         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) {
10480                 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE))
10481                         return -EINVAL;
10482                 new_triggers.gtk_rekey_failure = true;
10483                 regular = true;
10484         }
10485
10486         if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) {
10487                 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ))
10488                         return -EINVAL;
10489                 new_triggers.eap_identity_req = true;
10490                 regular = true;
10491         }
10492
10493         if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) {
10494                 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE))
10495                         return -EINVAL;
10496                 new_triggers.four_way_handshake = true;
10497                 regular = true;
10498         }
10499
10500         if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) {
10501                 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE))
10502                         return -EINVAL;
10503                 new_triggers.rfkill_release = true;
10504                 regular = true;
10505         }
10506
10507         if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) {
10508                 struct nlattr *pat;
10509                 int n_patterns = 0;
10510                 int rem, pat_len, mask_len, pkt_offset;
10511                 struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
10512
10513                 regular = true;
10514
10515                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
10516                                     rem)
10517                         n_patterns++;
10518                 if (n_patterns > wowlan->n_patterns)
10519                         return -EINVAL;
10520
10521                 new_triggers.patterns = kcalloc(n_patterns,
10522                                                 sizeof(new_triggers.patterns[0]),
10523                                                 GFP_KERNEL);
10524                 if (!new_triggers.patterns)
10525                         return -ENOMEM;
10526
10527                 new_triggers.n_patterns = n_patterns;
10528                 i = 0;
10529
10530                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
10531                                     rem) {
10532                         u8 *mask_pat;
10533
10534                         nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat,
10535                                          NULL, info->extack);
10536                         err = -EINVAL;
10537                         if (!pat_tb[NL80211_PKTPAT_MASK] ||
10538                             !pat_tb[NL80211_PKTPAT_PATTERN])
10539                                 goto error;
10540                         pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
10541                         mask_len = DIV_ROUND_UP(pat_len, 8);
10542                         if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
10543                                 goto error;
10544                         if (pat_len > wowlan->pattern_max_len ||
10545                             pat_len < wowlan->pattern_min_len)
10546                                 goto error;
10547
10548                         if (!pat_tb[NL80211_PKTPAT_OFFSET])
10549                                 pkt_offset = 0;
10550                         else
10551                                 pkt_offset = nla_get_u32(
10552                                         pat_tb[NL80211_PKTPAT_OFFSET]);
10553                         if (pkt_offset > wowlan->max_pkt_offset)
10554                                 goto error;
10555                         new_triggers.patterns[i].pkt_offset = pkt_offset;
10556
10557                         mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
10558                         if (!mask_pat) {
10559                                 err = -ENOMEM;
10560                                 goto error;
10561                         }
10562                         new_triggers.patterns[i].mask = mask_pat;
10563                         memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
10564                                mask_len);
10565                         mask_pat += mask_len;
10566                         new_triggers.patterns[i].pattern = mask_pat;
10567                         new_triggers.patterns[i].pattern_len = pat_len;
10568                         memcpy(mask_pat,
10569                                nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
10570                                pat_len);
10571                         i++;
10572                 }
10573         }
10574
10575         if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) {
10576                 regular = true;
10577                 err = nl80211_parse_wowlan_tcp(
10578                         rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION],
10579                         &new_triggers);
10580                 if (err)
10581                         goto error;
10582         }
10583
10584         if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) {
10585                 regular = true;
10586                 err = nl80211_parse_wowlan_nd(
10587                         rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT],
10588                         &new_triggers);
10589                 if (err)
10590                         goto error;
10591         }
10592
10593         /* The 'any' trigger means the device continues operating more or less
10594          * as in its normal operation mode and wakes up the host on most of the
10595          * normal interrupts (like packet RX, ...)
10596          * It therefore makes little sense to combine with the more constrained
10597          * wakeup trigger modes.
10598          */
10599         if (new_triggers.any && regular) {
10600                 err = -EINVAL;
10601                 goto error;
10602         }
10603
10604         ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL);
10605         if (!ntrig) {
10606                 err = -ENOMEM;
10607                 goto error;
10608         }
10609         cfg80211_rdev_free_wowlan(rdev);
10610         rdev->wiphy.wowlan_config = ntrig;
10611
10612  set_wakeup:
10613         if (rdev->ops->set_wakeup &&
10614             prev_enabled != !!rdev->wiphy.wowlan_config)
10615                 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config);
10616
10617         return 0;
10618  error:
10619         for (i = 0; i < new_triggers.n_patterns; i++)
10620                 kfree(new_triggers.patterns[i].mask);
10621         kfree(new_triggers.patterns);
10622         if (new_triggers.tcp && new_triggers.tcp->sock)
10623                 sock_release(new_triggers.tcp->sock);
10624         kfree(new_triggers.tcp);
10625         kfree(new_triggers.nd_config);
10626         return err;
10627 }
10628 #endif
10629
10630 static int nl80211_send_coalesce_rules(struct sk_buff *msg,
10631                                        struct cfg80211_registered_device *rdev)
10632 {
10633         struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules;
10634         int i, j, pat_len;
10635         struct cfg80211_coalesce_rules *rule;
10636
10637         if (!rdev->coalesce->n_rules)
10638                 return 0;
10639
10640         nl_rules = nla_nest_start(msg, NL80211_ATTR_COALESCE_RULE);
10641         if (!nl_rules)
10642                 return -ENOBUFS;
10643
10644         for (i = 0; i < rdev->coalesce->n_rules; i++) {
10645                 nl_rule = nla_nest_start(msg, i + 1);
10646                 if (!nl_rule)
10647                         return -ENOBUFS;
10648
10649                 rule = &rdev->coalesce->rules[i];
10650                 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY,
10651                                 rule->delay))
10652                         return -ENOBUFS;
10653
10654                 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION,
10655                                 rule->condition))
10656                         return -ENOBUFS;
10657
10658                 nl_pats = nla_nest_start(msg,
10659                                 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN);
10660                 if (!nl_pats)
10661                         return -ENOBUFS;
10662
10663                 for (j = 0; j < rule->n_patterns; j++) {
10664                         nl_pat = nla_nest_start(msg, j + 1);
10665                         if (!nl_pat)
10666                                 return -ENOBUFS;
10667                         pat_len = rule->patterns[j].pattern_len;
10668                         if (nla_put(msg, NL80211_PKTPAT_MASK,
10669                                     DIV_ROUND_UP(pat_len, 8),
10670                                     rule->patterns[j].mask) ||
10671                             nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
10672                                     rule->patterns[j].pattern) ||
10673                             nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
10674                                         rule->patterns[j].pkt_offset))
10675                                 return -ENOBUFS;
10676                         nla_nest_end(msg, nl_pat);
10677                 }
10678                 nla_nest_end(msg, nl_pats);
10679                 nla_nest_end(msg, nl_rule);
10680         }
10681         nla_nest_end(msg, nl_rules);
10682
10683         return 0;
10684 }
10685
10686 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info)
10687 {
10688         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10689         struct sk_buff *msg;
10690         void *hdr;
10691
10692         if (!rdev->wiphy.coalesce)
10693                 return -EOPNOTSUPP;
10694
10695         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10696         if (!msg)
10697                 return -ENOMEM;
10698
10699         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10700                              NL80211_CMD_GET_COALESCE);
10701         if (!hdr)
10702                 goto nla_put_failure;
10703
10704         if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev))
10705                 goto nla_put_failure;
10706
10707         genlmsg_end(msg, hdr);
10708         return genlmsg_reply(msg, info);
10709
10710 nla_put_failure:
10711         nlmsg_free(msg);
10712         return -ENOBUFS;
10713 }
10714
10715 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev)
10716 {
10717         struct cfg80211_coalesce *coalesce = rdev->coalesce;
10718         int i, j;
10719         struct cfg80211_coalesce_rules *rule;
10720
10721         if (!coalesce)
10722                 return;
10723
10724         for (i = 0; i < coalesce->n_rules; i++) {
10725                 rule = &coalesce->rules[i];
10726                 for (j = 0; j < rule->n_patterns; j++)
10727                         kfree(rule->patterns[j].mask);
10728                 kfree(rule->patterns);
10729         }
10730         kfree(coalesce->rules);
10731         kfree(coalesce);
10732         rdev->coalesce = NULL;
10733 }
10734
10735 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,
10736                                        struct nlattr *rule,
10737                                        struct cfg80211_coalesce_rules *new_rule)
10738 {
10739         int err, i;
10740         const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
10741         struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat;
10742         int rem, pat_len, mask_len, pkt_offset, n_patterns = 0;
10743         struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
10744
10745         err = nla_parse_nested(tb, NL80211_ATTR_COALESCE_RULE_MAX, rule,
10746                                nl80211_coalesce_policy, NULL);
10747         if (err)
10748                 return err;
10749
10750         if (tb[NL80211_ATTR_COALESCE_RULE_DELAY])
10751                 new_rule->delay =
10752                         nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]);
10753         if (new_rule->delay > coalesce->max_delay)
10754                 return -EINVAL;
10755
10756         if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION])
10757                 new_rule->condition =
10758                         nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]);
10759         if (new_rule->condition != NL80211_COALESCE_CONDITION_MATCH &&
10760             new_rule->condition != NL80211_COALESCE_CONDITION_NO_MATCH)
10761                 return -EINVAL;
10762
10763         if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN])
10764                 return -EINVAL;
10765
10766         nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
10767                             rem)
10768                 n_patterns++;
10769         if (n_patterns > coalesce->n_patterns)
10770                 return -EINVAL;
10771
10772         new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]),
10773                                      GFP_KERNEL);
10774         if (!new_rule->patterns)
10775                 return -ENOMEM;
10776
10777         new_rule->n_patterns = n_patterns;
10778         i = 0;
10779
10780         nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
10781                             rem) {
10782                 u8 *mask_pat;
10783
10784                 nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat, NULL, NULL);
10785                 if (!pat_tb[NL80211_PKTPAT_MASK] ||
10786                     !pat_tb[NL80211_PKTPAT_PATTERN])
10787                         return -EINVAL;
10788                 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
10789                 mask_len = DIV_ROUND_UP(pat_len, 8);
10790                 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
10791                         return -EINVAL;
10792                 if (pat_len > coalesce->pattern_max_len ||
10793                     pat_len < coalesce->pattern_min_len)
10794                         return -EINVAL;
10795
10796                 if (!pat_tb[NL80211_PKTPAT_OFFSET])
10797                         pkt_offset = 0;
10798                 else
10799                         pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]);
10800                 if (pkt_offset > coalesce->max_pkt_offset)
10801                         return -EINVAL;
10802                 new_rule->patterns[i].pkt_offset = pkt_offset;
10803
10804                 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
10805                 if (!mask_pat)
10806                         return -ENOMEM;
10807
10808                 new_rule->patterns[i].mask = mask_pat;
10809                 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
10810                        mask_len);
10811
10812                 mask_pat += mask_len;
10813                 new_rule->patterns[i].pattern = mask_pat;
10814                 new_rule->patterns[i].pattern_len = pat_len;
10815                 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
10816                        pat_len);
10817                 i++;
10818         }
10819
10820         return 0;
10821 }
10822
10823 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info)
10824 {
10825         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10826         const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
10827         struct cfg80211_coalesce new_coalesce = {};
10828         struct cfg80211_coalesce *n_coalesce;
10829         int err, rem_rule, n_rules = 0, i, j;
10830         struct nlattr *rule;
10831         struct cfg80211_coalesce_rules *tmp_rule;
10832
10833         if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce)
10834                 return -EOPNOTSUPP;
10835
10836         if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) {
10837                 cfg80211_rdev_free_coalesce(rdev);
10838                 rdev_set_coalesce(rdev, NULL);
10839                 return 0;
10840         }
10841
10842         nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
10843                             rem_rule)
10844                 n_rules++;
10845         if (n_rules > coalesce->n_rules)
10846                 return -EINVAL;
10847
10848         new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]),
10849                                      GFP_KERNEL);
10850         if (!new_coalesce.rules)
10851                 return -ENOMEM;
10852
10853         new_coalesce.n_rules = n_rules;
10854         i = 0;
10855
10856         nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
10857                             rem_rule) {
10858                 err = nl80211_parse_coalesce_rule(rdev, rule,
10859                                                   &new_coalesce.rules[i]);
10860                 if (err)
10861                         goto error;
10862
10863                 i++;
10864         }
10865
10866         err = rdev_set_coalesce(rdev, &new_coalesce);
10867         if (err)
10868                 goto error;
10869
10870         n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL);
10871         if (!n_coalesce) {
10872                 err = -ENOMEM;
10873                 goto error;
10874         }
10875         cfg80211_rdev_free_coalesce(rdev);
10876         rdev->coalesce = n_coalesce;
10877
10878         return 0;
10879 error:
10880         for (i = 0; i < new_coalesce.n_rules; i++) {
10881                 tmp_rule = &new_coalesce.rules[i];
10882                 for (j = 0; j < tmp_rule->n_patterns; j++)
10883                         kfree(tmp_rule->patterns[j].mask);
10884                 kfree(tmp_rule->patterns);
10885         }
10886         kfree(new_coalesce.rules);
10887
10888         return err;
10889 }
10890
10891 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
10892 {
10893         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10894         struct net_device *dev = info->user_ptr[1];
10895         struct wireless_dev *wdev = dev->ieee80211_ptr;
10896         struct nlattr *tb[NUM_NL80211_REKEY_DATA];
10897         struct cfg80211_gtk_rekey_data rekey_data;
10898         int err;
10899
10900         if (!info->attrs[NL80211_ATTR_REKEY_DATA])
10901                 return -EINVAL;
10902
10903         err = nla_parse_nested(tb, MAX_NL80211_REKEY_DATA,
10904                                info->attrs[NL80211_ATTR_REKEY_DATA],
10905                                nl80211_rekey_policy, info->extack);
10906         if (err)
10907                 return err;
10908
10909         if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] ||
10910             !tb[NL80211_REKEY_DATA_KCK])
10911                 return -EINVAL;
10912         if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN)
10913                 return -ERANGE;
10914         if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN)
10915                 return -ERANGE;
10916         if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN)
10917                 return -ERANGE;
10918
10919         rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]);
10920         rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]);
10921         rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]);
10922
10923         wdev_lock(wdev);
10924         if (!wdev->current_bss) {
10925                 err = -ENOTCONN;
10926                 goto out;
10927         }
10928
10929         if (!rdev->ops->set_rekey_data) {
10930                 err = -EOPNOTSUPP;
10931                 goto out;
10932         }
10933
10934         err = rdev_set_rekey_data(rdev, dev, &rekey_data);
10935  out:
10936         wdev_unlock(wdev);
10937         return err;
10938 }
10939
10940 static int nl80211_register_unexpected_frame(struct sk_buff *skb,
10941                                              struct genl_info *info)
10942 {
10943         struct net_device *dev = info->user_ptr[1];
10944         struct wireless_dev *wdev = dev->ieee80211_ptr;
10945
10946         if (wdev->iftype != NL80211_IFTYPE_AP &&
10947             wdev->iftype != NL80211_IFTYPE_P2P_GO)
10948                 return -EINVAL;
10949
10950         if (wdev->ap_unexpected_nlportid)
10951                 return -EBUSY;
10952
10953         wdev->ap_unexpected_nlportid = info->snd_portid;
10954         return 0;
10955 }
10956
10957 static int nl80211_probe_client(struct sk_buff *skb,
10958                                 struct genl_info *info)
10959 {
10960         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10961         struct net_device *dev = info->user_ptr[1];
10962         struct wireless_dev *wdev = dev->ieee80211_ptr;
10963         struct sk_buff *msg;
10964         void *hdr;
10965         const u8 *addr;
10966         u64 cookie;
10967         int err;
10968
10969         if (wdev->iftype != NL80211_IFTYPE_AP &&
10970             wdev->iftype != NL80211_IFTYPE_P2P_GO)
10971                 return -EOPNOTSUPP;
10972
10973         if (!info->attrs[NL80211_ATTR_MAC])
10974                 return -EINVAL;
10975
10976         if (!rdev->ops->probe_client)
10977                 return -EOPNOTSUPP;
10978
10979         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10980         if (!msg)
10981                 return -ENOMEM;
10982
10983         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10984                              NL80211_CMD_PROBE_CLIENT);
10985         if (!hdr) {
10986                 err = -ENOBUFS;
10987                 goto free_msg;
10988         }
10989
10990         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
10991
10992         err = rdev_probe_client(rdev, dev, addr, &cookie);
10993         if (err)
10994                 goto free_msg;
10995
10996         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
10997                               NL80211_ATTR_PAD))
10998                 goto nla_put_failure;
10999
11000         genlmsg_end(msg, hdr);
11001
11002         return genlmsg_reply(msg, info);
11003
11004  nla_put_failure:
11005         err = -ENOBUFS;
11006  free_msg:
11007         nlmsg_free(msg);
11008         return err;
11009 }
11010
11011 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info)
11012 {
11013         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11014         struct cfg80211_beacon_registration *reg, *nreg;
11015         int rv;
11016
11017         if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS))
11018                 return -EOPNOTSUPP;
11019
11020         nreg = kzalloc(sizeof(*nreg), GFP_KERNEL);
11021         if (!nreg)
11022                 return -ENOMEM;
11023
11024         /* First, check if already registered. */
11025         spin_lock_bh(&rdev->beacon_registrations_lock);
11026         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
11027                 if (reg->nlportid == info->snd_portid) {
11028                         rv = -EALREADY;
11029                         goto out_err;
11030                 }
11031         }
11032         /* Add it to the list */
11033         nreg->nlportid = info->snd_portid;
11034         list_add(&nreg->list, &rdev->beacon_registrations);
11035
11036         spin_unlock_bh(&rdev->beacon_registrations_lock);
11037
11038         return 0;
11039 out_err:
11040         spin_unlock_bh(&rdev->beacon_registrations_lock);
11041         kfree(nreg);
11042         return rv;
11043 }
11044
11045 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
11046 {
11047         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11048         struct wireless_dev *wdev = info->user_ptr[1];
11049         int err;
11050
11051         if (!rdev->ops->start_p2p_device)
11052                 return -EOPNOTSUPP;
11053
11054         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
11055                 return -EOPNOTSUPP;
11056
11057         if (wdev_running(wdev))
11058                 return 0;
11059
11060         if (rfkill_blocked(rdev->rfkill))
11061                 return -ERFKILL;
11062
11063         err = rdev_start_p2p_device(rdev, wdev);
11064         if (err)
11065                 return err;
11066
11067         wdev->is_running = true;
11068         rdev->opencount++;
11069
11070         return 0;
11071 }
11072
11073 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info)
11074 {
11075         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11076         struct wireless_dev *wdev = info->user_ptr[1];
11077
11078         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
11079                 return -EOPNOTSUPP;
11080
11081         if (!rdev->ops->stop_p2p_device)
11082                 return -EOPNOTSUPP;
11083
11084         cfg80211_stop_p2p_device(rdev, wdev);
11085
11086         return 0;
11087 }
11088
11089 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
11090 {
11091         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11092         struct wireless_dev *wdev = info->user_ptr[1];
11093         struct cfg80211_nan_conf conf = {};
11094         int err;
11095
11096         if (wdev->iftype != NL80211_IFTYPE_NAN)
11097                 return -EOPNOTSUPP;
11098
11099         if (wdev_running(wdev))
11100                 return -EEXIST;
11101
11102         if (rfkill_blocked(rdev->rfkill))
11103                 return -ERFKILL;
11104
11105         if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF])
11106                 return -EINVAL;
11107
11108         conf.master_pref =
11109                 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
11110         if (!conf.master_pref)
11111                 return -EINVAL;
11112
11113         if (info->attrs[NL80211_ATTR_BANDS]) {
11114                 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
11115
11116                 if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
11117                         return -EOPNOTSUPP;
11118
11119                 if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
11120                         return -EINVAL;
11121
11122                 conf.bands = bands;
11123         }
11124
11125         err = rdev_start_nan(rdev, wdev, &conf);
11126         if (err)
11127                 return err;
11128
11129         wdev->is_running = true;
11130         rdev->opencount++;
11131
11132         return 0;
11133 }
11134
11135 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info)
11136 {
11137         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11138         struct wireless_dev *wdev = info->user_ptr[1];
11139
11140         if (wdev->iftype != NL80211_IFTYPE_NAN)
11141                 return -EOPNOTSUPP;
11142
11143         cfg80211_stop_nan(rdev, wdev);
11144
11145         return 0;
11146 }
11147
11148 static int validate_nan_filter(struct nlattr *filter_attr)
11149 {
11150         struct nlattr *attr;
11151         int len = 0, n_entries = 0, rem;
11152
11153         nla_for_each_nested(attr, filter_attr, rem) {
11154                 len += nla_len(attr);
11155                 n_entries++;
11156         }
11157
11158         if (len >= U8_MAX)
11159                 return -EINVAL;
11160
11161         return n_entries;
11162 }
11163
11164 static int handle_nan_filter(struct nlattr *attr_filter,
11165                              struct cfg80211_nan_func *func,
11166                              bool tx)
11167 {
11168         struct nlattr *attr;
11169         int n_entries, rem, i;
11170         struct cfg80211_nan_func_filter *filter;
11171
11172         n_entries = validate_nan_filter(attr_filter);
11173         if (n_entries < 0)
11174                 return n_entries;
11175
11176         BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters));
11177
11178         filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL);
11179         if (!filter)
11180                 return -ENOMEM;
11181
11182         i = 0;
11183         nla_for_each_nested(attr, attr_filter, rem) {
11184                 filter[i].filter = nla_memdup(attr, GFP_KERNEL);
11185                 filter[i].len = nla_len(attr);
11186                 i++;
11187         }
11188         if (tx) {
11189                 func->num_tx_filters = n_entries;
11190                 func->tx_filters = filter;
11191         } else {
11192                 func->num_rx_filters = n_entries;
11193                 func->rx_filters = filter;
11194         }
11195
11196         return 0;
11197 }
11198
11199 static int nl80211_nan_add_func(struct sk_buff *skb,
11200                                 struct genl_info *info)
11201 {
11202         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11203         struct wireless_dev *wdev = info->user_ptr[1];
11204         struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr;
11205         struct cfg80211_nan_func *func;
11206         struct sk_buff *msg = NULL;
11207         void *hdr = NULL;
11208         int err = 0;
11209
11210         if (wdev->iftype != NL80211_IFTYPE_NAN)
11211                 return -EOPNOTSUPP;
11212
11213         if (!wdev_running(wdev))
11214                 return -ENOTCONN;
11215
11216         if (!info->attrs[NL80211_ATTR_NAN_FUNC])
11217                 return -EINVAL;
11218
11219         err = nla_parse_nested(tb, NL80211_NAN_FUNC_ATTR_MAX,
11220                                info->attrs[NL80211_ATTR_NAN_FUNC],
11221                                nl80211_nan_func_policy, info->extack);
11222         if (err)
11223                 return err;
11224
11225         func = kzalloc(sizeof(*func), GFP_KERNEL);
11226         if (!func)
11227                 return -ENOMEM;
11228
11229         func->cookie = wdev->wiphy->cookie_counter++;
11230
11231         if (!tb[NL80211_NAN_FUNC_TYPE] ||
11232             nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]) > NL80211_NAN_FUNC_MAX_TYPE) {
11233                 err = -EINVAL;
11234                 goto out;
11235         }
11236
11237
11238         func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]);
11239
11240         if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) {
11241                 err = -EINVAL;
11242                 goto out;
11243         }
11244
11245         memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]),
11246                sizeof(func->service_id));
11247
11248         func->close_range =
11249                 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]);
11250
11251         if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) {
11252                 func->serv_spec_info_len =
11253                         nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]);
11254                 func->serv_spec_info =
11255                         kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]),
11256                                 func->serv_spec_info_len,
11257                                 GFP_KERNEL);
11258                 if (!func->serv_spec_info) {
11259                         err = -ENOMEM;
11260                         goto out;
11261                 }
11262         }
11263
11264         if (tb[NL80211_NAN_FUNC_TTL])
11265                 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]);
11266
11267         switch (func->type) {
11268         case NL80211_NAN_FUNC_PUBLISH:
11269                 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) {
11270                         err = -EINVAL;
11271                         goto out;
11272                 }
11273
11274                 func->publish_type =
11275                         nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]);
11276                 func->publish_bcast =
11277                         nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]);
11278
11279                 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) &&
11280                         func->publish_bcast) {
11281                         err = -EINVAL;
11282                         goto out;
11283                 }
11284                 break;
11285         case NL80211_NAN_FUNC_SUBSCRIBE:
11286                 func->subscribe_active =
11287                         nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]);
11288                 break;
11289         case NL80211_NAN_FUNC_FOLLOW_UP:
11290                 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] ||
11291                     !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]) {
11292                         err = -EINVAL;
11293                         goto out;
11294                 }
11295
11296                 func->followup_id =
11297                         nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]);
11298                 func->followup_reqid =
11299                         nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]);
11300                 memcpy(func->followup_dest.addr,
11301                        nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]),
11302                        sizeof(func->followup_dest.addr));
11303                 if (func->ttl) {
11304                         err = -EINVAL;
11305                         goto out;
11306                 }
11307                 break;
11308         default:
11309                 err = -EINVAL;
11310                 goto out;
11311         }
11312
11313         if (tb[NL80211_NAN_FUNC_SRF]) {
11314                 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR];
11315
11316                 err = nla_parse_nested(srf_tb, NL80211_NAN_SRF_ATTR_MAX,
11317                                        tb[NL80211_NAN_FUNC_SRF],
11318                                        nl80211_nan_srf_policy, info->extack);
11319                 if (err)
11320                         goto out;
11321
11322                 func->srf_include =
11323                         nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]);
11324
11325                 if (srf_tb[NL80211_NAN_SRF_BF]) {
11326                         if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] ||
11327                             !srf_tb[NL80211_NAN_SRF_BF_IDX]) {
11328                                 err = -EINVAL;
11329                                 goto out;
11330                         }
11331
11332                         func->srf_bf_len =
11333                                 nla_len(srf_tb[NL80211_NAN_SRF_BF]);
11334                         func->srf_bf =
11335                                 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]),
11336                                         func->srf_bf_len, GFP_KERNEL);
11337                         if (!func->srf_bf) {
11338                                 err = -ENOMEM;
11339                                 goto out;
11340                         }
11341
11342                         func->srf_bf_idx =
11343                                 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]);
11344                 } else {
11345                         struct nlattr *attr, *mac_attr =
11346                                 srf_tb[NL80211_NAN_SRF_MAC_ADDRS];
11347                         int n_entries, rem, i = 0;
11348
11349                         if (!mac_attr) {
11350                                 err = -EINVAL;
11351                                 goto out;
11352                         }
11353
11354                         n_entries = validate_acl_mac_addrs(mac_attr);
11355                         if (n_entries <= 0) {
11356                                 err = -EINVAL;
11357                                 goto out;
11358                         }
11359
11360                         func->srf_num_macs = n_entries;
11361                         func->srf_macs =
11362                                 kzalloc(sizeof(*func->srf_macs) * n_entries,
11363                                         GFP_KERNEL);
11364                         if (!func->srf_macs) {
11365                                 err = -ENOMEM;
11366                                 goto out;
11367                         }
11368
11369                         nla_for_each_nested(attr, mac_attr, rem)
11370                                 memcpy(func->srf_macs[i++].addr, nla_data(attr),
11371                                        sizeof(*func->srf_macs));
11372                 }
11373         }
11374
11375         if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) {
11376                 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER],
11377                                         func, true);
11378                 if (err)
11379                         goto out;
11380         }
11381
11382         if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) {
11383                 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER],
11384                                         func, false);
11385                 if (err)
11386                         goto out;
11387         }
11388
11389         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11390         if (!msg) {
11391                 err = -ENOMEM;
11392                 goto out;
11393         }
11394
11395         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11396                              NL80211_CMD_ADD_NAN_FUNCTION);
11397         /* This can't really happen - we just allocated 4KB */
11398         if (WARN_ON(!hdr)) {
11399                 err = -ENOMEM;
11400                 goto out;
11401         }
11402
11403         err = rdev_add_nan_func(rdev, wdev, func);
11404 out:
11405         if (err < 0) {
11406                 cfg80211_free_nan_func(func);
11407                 nlmsg_free(msg);
11408                 return err;
11409         }
11410
11411         /* propagate the instance id and cookie to userspace  */
11412         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie,
11413                               NL80211_ATTR_PAD))
11414                 goto nla_put_failure;
11415
11416         func_attr = nla_nest_start(msg, NL80211_ATTR_NAN_FUNC);
11417         if (!func_attr)
11418                 goto nla_put_failure;
11419
11420         if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID,
11421                        func->instance_id))
11422                 goto nla_put_failure;
11423
11424         nla_nest_end(msg, func_attr);
11425
11426         genlmsg_end(msg, hdr);
11427         return genlmsg_reply(msg, info);
11428
11429 nla_put_failure:
11430         nlmsg_free(msg);
11431         return -ENOBUFS;
11432 }
11433
11434 static int nl80211_nan_del_func(struct sk_buff *skb,
11435                                struct genl_info *info)
11436 {
11437         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11438         struct wireless_dev *wdev = info->user_ptr[1];
11439         u64 cookie;
11440
11441         if (wdev->iftype != NL80211_IFTYPE_NAN)
11442                 return -EOPNOTSUPP;
11443
11444         if (!wdev_running(wdev))
11445                 return -ENOTCONN;
11446
11447         if (!info->attrs[NL80211_ATTR_COOKIE])
11448                 return -EINVAL;
11449
11450         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
11451
11452         rdev_del_nan_func(rdev, wdev, cookie);
11453
11454         return 0;
11455 }
11456
11457 static int nl80211_nan_change_config(struct sk_buff *skb,
11458                                      struct genl_info *info)
11459 {
11460         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11461         struct wireless_dev *wdev = info->user_ptr[1];
11462         struct cfg80211_nan_conf conf = {};
11463         u32 changed = 0;
11464
11465         if (wdev->iftype != NL80211_IFTYPE_NAN)
11466                 return -EOPNOTSUPP;
11467
11468         if (!wdev_running(wdev))
11469                 return -ENOTCONN;
11470
11471         if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) {
11472                 conf.master_pref =
11473                         nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
11474                 if (conf.master_pref <= 1 || conf.master_pref == 255)
11475                         return -EINVAL;
11476
11477                 changed |= CFG80211_NAN_CONF_CHANGED_PREF;
11478         }
11479
11480         if (info->attrs[NL80211_ATTR_BANDS]) {
11481                 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
11482
11483                 if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
11484                         return -EOPNOTSUPP;
11485
11486                 if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
11487                         return -EINVAL;
11488
11489                 conf.bands = bands;
11490                 changed |= CFG80211_NAN_CONF_CHANGED_BANDS;
11491         }
11492
11493         if (!changed)
11494                 return -EINVAL;
11495
11496         return rdev_nan_change_conf(rdev, wdev, &conf, changed);
11497 }
11498
11499 void cfg80211_nan_match(struct wireless_dev *wdev,
11500                         struct cfg80211_nan_match_params *match, gfp_t gfp)
11501 {
11502         struct wiphy *wiphy = wdev->wiphy;
11503         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
11504         struct nlattr *match_attr, *local_func_attr, *peer_func_attr;
11505         struct sk_buff *msg;
11506         void *hdr;
11507
11508         if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr))
11509                 return;
11510
11511         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11512         if (!msg)
11513                 return;
11514
11515         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH);
11516         if (!hdr) {
11517                 nlmsg_free(msg);
11518                 return;
11519         }
11520
11521         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11522             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
11523                                          wdev->netdev->ifindex)) ||
11524             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
11525                               NL80211_ATTR_PAD))
11526                 goto nla_put_failure;
11527
11528         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie,
11529                               NL80211_ATTR_PAD) ||
11530             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr))
11531                 goto nla_put_failure;
11532
11533         match_attr = nla_nest_start(msg, NL80211_ATTR_NAN_MATCH);
11534         if (!match_attr)
11535                 goto nla_put_failure;
11536
11537         local_func_attr = nla_nest_start(msg, NL80211_NAN_MATCH_FUNC_LOCAL);
11538         if (!local_func_attr)
11539                 goto nla_put_failure;
11540
11541         if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id))
11542                 goto nla_put_failure;
11543
11544         nla_nest_end(msg, local_func_attr);
11545
11546         peer_func_attr = nla_nest_start(msg, NL80211_NAN_MATCH_FUNC_PEER);
11547         if (!peer_func_attr)
11548                 goto nla_put_failure;
11549
11550         if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) ||
11551             nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id))
11552                 goto nla_put_failure;
11553
11554         if (match->info && match->info_len &&
11555             nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len,
11556                     match->info))
11557                 goto nla_put_failure;
11558
11559         nla_nest_end(msg, peer_func_attr);
11560         nla_nest_end(msg, match_attr);
11561         genlmsg_end(msg, hdr);
11562
11563         if (!wdev->owner_nlportid)
11564                 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
11565                                         msg, 0, NL80211_MCGRP_NAN, gfp);
11566         else
11567                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
11568                                 wdev->owner_nlportid);
11569
11570         return;
11571
11572 nla_put_failure:
11573         nlmsg_free(msg);
11574 }
11575 EXPORT_SYMBOL(cfg80211_nan_match);
11576
11577 void cfg80211_nan_func_terminated(struct wireless_dev *wdev,
11578                                   u8 inst_id,
11579                                   enum nl80211_nan_func_term_reason reason,
11580                                   u64 cookie, gfp_t gfp)
11581 {
11582         struct wiphy *wiphy = wdev->wiphy;
11583         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
11584         struct sk_buff *msg;
11585         struct nlattr *func_attr;
11586         void *hdr;
11587
11588         if (WARN_ON(!inst_id))
11589                 return;
11590
11591         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11592         if (!msg)
11593                 return;
11594
11595         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION);
11596         if (!hdr) {
11597                 nlmsg_free(msg);
11598                 return;
11599         }
11600
11601         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11602             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
11603                                          wdev->netdev->ifindex)) ||
11604             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
11605                               NL80211_ATTR_PAD))
11606                 goto nla_put_failure;
11607
11608         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
11609                               NL80211_ATTR_PAD))
11610                 goto nla_put_failure;
11611
11612         func_attr = nla_nest_start(msg, NL80211_ATTR_NAN_FUNC);
11613         if (!func_attr)
11614                 goto nla_put_failure;
11615
11616         if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) ||
11617             nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason))
11618                 goto nla_put_failure;
11619
11620         nla_nest_end(msg, func_attr);
11621         genlmsg_end(msg, hdr);
11622
11623         if (!wdev->owner_nlportid)
11624                 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
11625                                         msg, 0, NL80211_MCGRP_NAN, gfp);
11626         else
11627                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
11628                                 wdev->owner_nlportid);
11629
11630         return;
11631
11632 nla_put_failure:
11633         nlmsg_free(msg);
11634 }
11635 EXPORT_SYMBOL(cfg80211_nan_func_terminated);
11636
11637 static int nl80211_get_protocol_features(struct sk_buff *skb,
11638                                          struct genl_info *info)
11639 {
11640         void *hdr;
11641         struct sk_buff *msg;
11642
11643         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11644         if (!msg)
11645                 return -ENOMEM;
11646
11647         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11648                              NL80211_CMD_GET_PROTOCOL_FEATURES);
11649         if (!hdr)
11650                 goto nla_put_failure;
11651
11652         if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES,
11653                         NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP))
11654                 goto nla_put_failure;
11655
11656         genlmsg_end(msg, hdr);
11657         return genlmsg_reply(msg, info);
11658
11659  nla_put_failure:
11660         kfree_skb(msg);
11661         return -ENOBUFS;
11662 }
11663
11664 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info)
11665 {
11666         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11667         struct cfg80211_update_ft_ies_params ft_params;
11668         struct net_device *dev = info->user_ptr[1];
11669
11670         if (!rdev->ops->update_ft_ies)
11671                 return -EOPNOTSUPP;
11672
11673         if (!info->attrs[NL80211_ATTR_MDID] ||
11674             !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
11675                 return -EINVAL;
11676
11677         memset(&ft_params, 0, sizeof(ft_params));
11678         ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]);
11679         ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
11680         ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
11681
11682         return rdev_update_ft_ies(rdev, dev, &ft_params);
11683 }
11684
11685 static int nl80211_crit_protocol_start(struct sk_buff *skb,
11686                                        struct genl_info *info)
11687 {
11688         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11689         struct wireless_dev *wdev = info->user_ptr[1];
11690         enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC;
11691         u16 duration;
11692         int ret;
11693
11694         if (!rdev->ops->crit_proto_start)
11695                 return -EOPNOTSUPP;
11696
11697         if (WARN_ON(!rdev->ops->crit_proto_stop))
11698                 return -EINVAL;
11699
11700         if (rdev->crit_proto_nlportid)
11701                 return -EBUSY;
11702
11703         /* determine protocol if provided */
11704         if (info->attrs[NL80211_ATTR_CRIT_PROT_ID])
11705                 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]);
11706
11707         if (proto >= NUM_NL80211_CRIT_PROTO)
11708                 return -EINVAL;
11709
11710         /* timeout must be provided */
11711         if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION])
11712                 return -EINVAL;
11713
11714         duration =
11715                 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
11716
11717         if (duration > NL80211_CRIT_PROTO_MAX_DURATION)
11718                 return -ERANGE;
11719
11720         ret = rdev_crit_proto_start(rdev, wdev, proto, duration);
11721         if (!ret)
11722                 rdev->crit_proto_nlportid = info->snd_portid;
11723
11724         return ret;
11725 }
11726
11727 static int nl80211_crit_protocol_stop(struct sk_buff *skb,
11728                                       struct genl_info *info)
11729 {
11730         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11731         struct wireless_dev *wdev = info->user_ptr[1];
11732
11733         if (!rdev->ops->crit_proto_stop)
11734                 return -EOPNOTSUPP;
11735
11736         if (rdev->crit_proto_nlportid) {
11737                 rdev->crit_proto_nlportid = 0;
11738                 rdev_crit_proto_stop(rdev, wdev);
11739         }
11740         return 0;
11741 }
11742
11743 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
11744 {
11745         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11746         struct wireless_dev *wdev =
11747                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
11748         int i, err;
11749         u32 vid, subcmd;
11750
11751         if (!rdev->wiphy.vendor_commands)
11752                 return -EOPNOTSUPP;
11753
11754         if (IS_ERR(wdev)) {
11755                 err = PTR_ERR(wdev);
11756                 if (err != -EINVAL)
11757                         return err;
11758                 wdev = NULL;
11759         } else if (wdev->wiphy != &rdev->wiphy) {
11760                 return -EINVAL;
11761         }
11762
11763         if (!info->attrs[NL80211_ATTR_VENDOR_ID] ||
11764             !info->attrs[NL80211_ATTR_VENDOR_SUBCMD])
11765                 return -EINVAL;
11766
11767         vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]);
11768         subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]);
11769         for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
11770                 const struct wiphy_vendor_command *vcmd;
11771                 void *data = NULL;
11772                 int len = 0;
11773
11774                 vcmd = &rdev->wiphy.vendor_commands[i];
11775
11776                 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
11777                         continue;
11778
11779                 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
11780                                    WIPHY_VENDOR_CMD_NEED_NETDEV)) {
11781                         if (!wdev)
11782                                 return -EINVAL;
11783                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
11784                             !wdev->netdev)
11785                                 return -EINVAL;
11786
11787                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
11788                                 if (!wdev_running(wdev))
11789                                         return -ENETDOWN;
11790                         }
11791
11792                         if (!vcmd->doit)
11793                                 return -EOPNOTSUPP;
11794                 } else {
11795                         wdev = NULL;
11796                 }
11797
11798                 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
11799                         data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
11800                         len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
11801                 }
11802
11803                 rdev->cur_cmd_info = info;
11804                 err = rdev->wiphy.vendor_commands[i].doit(&rdev->wiphy, wdev,
11805                                                           data, len);
11806                 rdev->cur_cmd_info = NULL;
11807                 return err;
11808         }
11809
11810         return -EOPNOTSUPP;
11811 }
11812
11813 static int nl80211_prepare_vendor_dump(struct sk_buff *skb,
11814                                        struct netlink_callback *cb,
11815                                        struct cfg80211_registered_device **rdev,
11816                                        struct wireless_dev **wdev)
11817 {
11818         struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
11819         u32 vid, subcmd;
11820         unsigned int i;
11821         int vcmd_idx = -1;
11822         int err;
11823         void *data = NULL;
11824         unsigned int data_len = 0;
11825
11826         if (cb->args[0]) {
11827                 /* subtract the 1 again here */
11828                 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
11829                 struct wireless_dev *tmp;
11830
11831                 if (!wiphy)
11832                         return -ENODEV;
11833                 *rdev = wiphy_to_rdev(wiphy);
11834                 *wdev = NULL;
11835
11836                 if (cb->args[1]) {
11837                         list_for_each_entry(tmp, &wiphy->wdev_list, list) {
11838                                 if (tmp->identifier == cb->args[1] - 1) {
11839                                         *wdev = tmp;
11840                                         break;
11841                                 }
11842                         }
11843                 }
11844
11845                 /* keep rtnl locked in successful case */
11846                 return 0;
11847         }
11848
11849         err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, attrbuf,
11850                           nl80211_fam.maxattr, nl80211_policy, NULL);
11851         if (err)
11852                 return err;
11853
11854         if (!attrbuf[NL80211_ATTR_VENDOR_ID] ||
11855             !attrbuf[NL80211_ATTR_VENDOR_SUBCMD])
11856                 return -EINVAL;
11857
11858         *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf);
11859         if (IS_ERR(*wdev))
11860                 *wdev = NULL;
11861
11862         *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
11863         if (IS_ERR(*rdev))
11864                 return PTR_ERR(*rdev);
11865
11866         vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]);
11867         subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
11868
11869         for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) {
11870                 const struct wiphy_vendor_command *vcmd;
11871
11872                 vcmd = &(*rdev)->wiphy.vendor_commands[i];
11873
11874                 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
11875                         continue;
11876
11877                 if (!vcmd->dumpit)
11878                         return -EOPNOTSUPP;
11879
11880                 vcmd_idx = i;
11881                 break;
11882         }
11883
11884         if (vcmd_idx < 0)
11885                 return -EOPNOTSUPP;
11886
11887         if (attrbuf[NL80211_ATTR_VENDOR_DATA]) {
11888                 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]);
11889                 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]);
11890         }
11891
11892         /* 0 is the first index - add 1 to parse only once */
11893         cb->args[0] = (*rdev)->wiphy_idx + 1;
11894         /* add 1 to know if it was NULL */
11895         cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0;
11896         cb->args[2] = vcmd_idx;
11897         cb->args[3] = (unsigned long)data;
11898         cb->args[4] = data_len;
11899
11900         /* keep rtnl locked in successful case */
11901         return 0;
11902 }
11903
11904 static int nl80211_vendor_cmd_dump(struct sk_buff *skb,
11905                                    struct netlink_callback *cb)
11906 {
11907         struct cfg80211_registered_device *rdev;
11908         struct wireless_dev *wdev;
11909         unsigned int vcmd_idx;
11910         const struct wiphy_vendor_command *vcmd;
11911         void *data;
11912         int data_len;
11913         int err;
11914         struct nlattr *vendor_data;
11915
11916         rtnl_lock();
11917         err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev);
11918         if (err)
11919                 goto out;
11920
11921         vcmd_idx = cb->args[2];
11922         data = (void *)cb->args[3];
11923         data_len = cb->args[4];
11924         vcmd = &rdev->wiphy.vendor_commands[vcmd_idx];
11925
11926         if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
11927                            WIPHY_VENDOR_CMD_NEED_NETDEV)) {
11928                 if (!wdev) {
11929                         err = -EINVAL;
11930                         goto out;
11931                 }
11932                 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
11933                     !wdev->netdev) {
11934                         err = -EINVAL;
11935                         goto out;
11936                 }
11937
11938                 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
11939                         if (!wdev_running(wdev)) {
11940                                 err = -ENETDOWN;
11941                                 goto out;
11942                         }
11943                 }
11944         }
11945
11946         while (1) {
11947                 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
11948                                            cb->nlh->nlmsg_seq, NLM_F_MULTI,
11949                                            NL80211_CMD_VENDOR);
11950                 if (!hdr)
11951                         break;
11952
11953                 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11954                     (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
11955                                                wdev_id(wdev),
11956                                                NL80211_ATTR_PAD))) {
11957                         genlmsg_cancel(skb, hdr);
11958                         break;
11959                 }
11960
11961                 vendor_data = nla_nest_start(skb, NL80211_ATTR_VENDOR_DATA);
11962                 if (!vendor_data) {
11963                         genlmsg_cancel(skb, hdr);
11964                         break;
11965                 }
11966
11967                 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len,
11968                                    (unsigned long *)&cb->args[5]);
11969                 nla_nest_end(skb, vendor_data);
11970
11971                 if (err == -ENOBUFS || err == -ENOENT) {
11972                         genlmsg_cancel(skb, hdr);
11973                         break;
11974                 } else if (err) {
11975                         genlmsg_cancel(skb, hdr);
11976                         goto out;
11977                 }
11978
11979                 genlmsg_end(skb, hdr);
11980         }
11981
11982         err = skb->len;
11983  out:
11984         rtnl_unlock();
11985         return err;
11986 }
11987
11988 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
11989                                            enum nl80211_commands cmd,
11990                                            enum nl80211_attrs attr,
11991                                            int approxlen)
11992 {
11993         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
11994
11995         if (WARN_ON(!rdev->cur_cmd_info))
11996                 return NULL;
11997
11998         return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen,
11999                                            rdev->cur_cmd_info->snd_portid,
12000                                            rdev->cur_cmd_info->snd_seq,
12001                                            cmd, attr, NULL, GFP_KERNEL);
12002 }
12003 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb);
12004
12005 int cfg80211_vendor_cmd_reply(struct sk_buff *skb)
12006 {
12007         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
12008         void *hdr = ((void **)skb->cb)[1];
12009         struct nlattr *data = ((void **)skb->cb)[2];
12010
12011         /* clear CB data for netlink core to own from now on */
12012         memset(skb->cb, 0, sizeof(skb->cb));
12013
12014         if (WARN_ON(!rdev->cur_cmd_info)) {
12015                 kfree_skb(skb);
12016                 return -EINVAL;
12017         }
12018
12019         nla_nest_end(skb, data);
12020         genlmsg_end(skb, hdr);
12021         return genlmsg_reply(skb, rdev->cur_cmd_info);
12022 }
12023 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply);
12024
12025 static int nl80211_set_qos_map(struct sk_buff *skb,
12026                                struct genl_info *info)
12027 {
12028         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12029         struct cfg80211_qos_map *qos_map = NULL;
12030         struct net_device *dev = info->user_ptr[1];
12031         u8 *pos, len, num_des, des_len, des;
12032         int ret;
12033
12034         if (!rdev->ops->set_qos_map)
12035                 return -EOPNOTSUPP;
12036
12037         if (info->attrs[NL80211_ATTR_QOS_MAP]) {
12038                 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]);
12039                 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]);
12040
12041                 if (len % 2 || len < IEEE80211_QOS_MAP_LEN_MIN ||
12042                     len > IEEE80211_QOS_MAP_LEN_MAX)
12043                         return -EINVAL;
12044
12045                 qos_map = kzalloc(sizeof(struct cfg80211_qos_map), GFP_KERNEL);
12046                 if (!qos_map)
12047                         return -ENOMEM;
12048
12049                 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1;
12050                 if (num_des) {
12051                         des_len = num_des *
12052                                 sizeof(struct cfg80211_dscp_exception);
12053                         memcpy(qos_map->dscp_exception, pos, des_len);
12054                         qos_map->num_des = num_des;
12055                         for (des = 0; des < num_des; des++) {
12056                                 if (qos_map->dscp_exception[des].up > 7) {
12057                                         kfree(qos_map);
12058                                         return -EINVAL;
12059                                 }
12060                         }
12061                         pos += des_len;
12062                 }
12063                 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN);
12064         }
12065
12066         wdev_lock(dev->ieee80211_ptr);
12067         ret = nl80211_key_allowed(dev->ieee80211_ptr);
12068         if (!ret)
12069                 ret = rdev_set_qos_map(rdev, dev, qos_map);
12070         wdev_unlock(dev->ieee80211_ptr);
12071
12072         kfree(qos_map);
12073         return ret;
12074 }
12075
12076 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info)
12077 {
12078         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12079         struct net_device *dev = info->user_ptr[1];
12080         struct wireless_dev *wdev = dev->ieee80211_ptr;
12081         const u8 *peer;
12082         u8 tsid, up;
12083         u16 admitted_time = 0;
12084         int err;
12085
12086         if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION))
12087                 return -EOPNOTSUPP;
12088
12089         if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] ||
12090             !info->attrs[NL80211_ATTR_USER_PRIO])
12091                 return -EINVAL;
12092
12093         tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
12094         if (tsid >= IEEE80211_NUM_TIDS)
12095                 return -EINVAL;
12096
12097         up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]);
12098         if (up >= IEEE80211_NUM_UPS)
12099                 return -EINVAL;
12100
12101         /* WMM uses TIDs 0-7 even for TSPEC */
12102         if (tsid >= IEEE80211_FIRST_TSPEC_TSID) {
12103                 /* TODO: handle 802.11 TSPEC/admission control
12104                  * need more attributes for that (e.g. BA session requirement);
12105                  * change the WMM adminssion test above to allow both then
12106                  */
12107                 return -EINVAL;
12108         }
12109
12110         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
12111
12112         if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) {
12113                 admitted_time =
12114                         nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]);
12115                 if (!admitted_time)
12116                         return -EINVAL;
12117         }
12118
12119         wdev_lock(wdev);
12120         switch (wdev->iftype) {
12121         case NL80211_IFTYPE_STATION:
12122         case NL80211_IFTYPE_P2P_CLIENT:
12123                 if (wdev->current_bss)
12124                         break;
12125                 err = -ENOTCONN;
12126                 goto out;
12127         default:
12128                 err = -EOPNOTSUPP;
12129                 goto out;
12130         }
12131
12132         err = rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time);
12133
12134  out:
12135         wdev_unlock(wdev);
12136         return err;
12137 }
12138
12139 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info)
12140 {
12141         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12142         struct net_device *dev = info->user_ptr[1];
12143         struct wireless_dev *wdev = dev->ieee80211_ptr;
12144         const u8 *peer;
12145         u8 tsid;
12146         int err;
12147
12148         if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC])
12149                 return -EINVAL;
12150
12151         tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
12152         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
12153
12154         wdev_lock(wdev);
12155         err = rdev_del_tx_ts(rdev, dev, tsid, peer);
12156         wdev_unlock(wdev);
12157
12158         return err;
12159 }
12160
12161 static int nl80211_tdls_channel_switch(struct sk_buff *skb,
12162                                        struct genl_info *info)
12163 {
12164         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12165         struct net_device *dev = info->user_ptr[1];
12166         struct wireless_dev *wdev = dev->ieee80211_ptr;
12167         struct cfg80211_chan_def chandef = {};
12168         const u8 *addr;
12169         u8 oper_class;
12170         int err;
12171
12172         if (!rdev->ops->tdls_channel_switch ||
12173             !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
12174                 return -EOPNOTSUPP;
12175
12176         switch (dev->ieee80211_ptr->iftype) {
12177         case NL80211_IFTYPE_STATION:
12178         case NL80211_IFTYPE_P2P_CLIENT:
12179                 break;
12180         default:
12181                 return -EOPNOTSUPP;
12182         }
12183
12184         if (!info->attrs[NL80211_ATTR_MAC] ||
12185             !info->attrs[NL80211_ATTR_OPER_CLASS])
12186                 return -EINVAL;
12187
12188         err = nl80211_parse_chandef(rdev, info, &chandef);
12189         if (err)
12190                 return err;
12191
12192         /*
12193          * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012
12194          * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the
12195          * specification is not defined for them.
12196          */
12197         if (chandef.chan->band == NL80211_BAND_2GHZ &&
12198             chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
12199             chandef.width != NL80211_CHAN_WIDTH_20)
12200                 return -EINVAL;
12201
12202         /* we will be active on the TDLS link */
12203         if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
12204                                            wdev->iftype))
12205                 return -EINVAL;
12206
12207         /* don't allow switching to DFS channels */
12208         if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype))
12209                 return -EINVAL;
12210
12211         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
12212         oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]);
12213
12214         wdev_lock(wdev);
12215         err = rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef);
12216         wdev_unlock(wdev);
12217
12218         return err;
12219 }
12220
12221 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb,
12222                                               struct genl_info *info)
12223 {
12224         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12225         struct net_device *dev = info->user_ptr[1];
12226         struct wireless_dev *wdev = dev->ieee80211_ptr;
12227         const u8 *addr;
12228
12229         if (!rdev->ops->tdls_channel_switch ||
12230             !rdev->ops->tdls_cancel_channel_switch ||
12231             !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
12232                 return -EOPNOTSUPP;
12233
12234         switch (dev->ieee80211_ptr->iftype) {
12235         case NL80211_IFTYPE_STATION:
12236         case NL80211_IFTYPE_P2P_CLIENT:
12237                 break;
12238         default:
12239                 return -EOPNOTSUPP;
12240         }
12241
12242         if (!info->attrs[NL80211_ATTR_MAC])
12243                 return -EINVAL;
12244
12245         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
12246
12247         wdev_lock(wdev);
12248         rdev_tdls_cancel_channel_switch(rdev, dev, addr);
12249         wdev_unlock(wdev);
12250
12251         return 0;
12252 }
12253
12254 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb,
12255                                             struct genl_info *info)
12256 {
12257         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12258         struct net_device *dev = info->user_ptr[1];
12259         struct wireless_dev *wdev = dev->ieee80211_ptr;
12260         const struct nlattr *nla;
12261         bool enabled;
12262
12263         if (!rdev->ops->set_multicast_to_unicast)
12264                 return -EOPNOTSUPP;
12265
12266         if (wdev->iftype != NL80211_IFTYPE_AP &&
12267             wdev->iftype != NL80211_IFTYPE_P2P_GO)
12268                 return -EOPNOTSUPP;
12269
12270         nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED];
12271         enabled = nla_get_flag(nla);
12272
12273         return rdev_set_multicast_to_unicast(rdev, dev, enabled);
12274 }
12275
12276 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info)
12277 {
12278         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12279         struct net_device *dev = info->user_ptr[1];
12280         struct wireless_dev *wdev = dev->ieee80211_ptr;
12281         struct cfg80211_pmk_conf pmk_conf = {};
12282         int ret;
12283
12284         if (wdev->iftype != NL80211_IFTYPE_STATION &&
12285             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
12286                 return -EOPNOTSUPP;
12287
12288         if (!wiphy_ext_feature_isset(&rdev->wiphy,
12289                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
12290                 return -EOPNOTSUPP;
12291
12292         if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK])
12293                 return -EINVAL;
12294
12295         wdev_lock(wdev);
12296         if (!wdev->current_bss) {
12297                 ret = -ENOTCONN;
12298                 goto out;
12299         }
12300
12301         pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
12302         if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) {
12303                 ret = -EINVAL;
12304                 goto out;
12305         }
12306
12307         pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
12308         pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
12309         if (pmk_conf.pmk_len != WLAN_PMK_LEN &&
12310             pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) {
12311                 ret = -EINVAL;
12312                 goto out;
12313         }
12314
12315         if (info->attrs[NL80211_ATTR_PMKR0_NAME]) {
12316                 int r0_name_len = nla_len(info->attrs[NL80211_ATTR_PMKR0_NAME]);
12317
12318                 if (r0_name_len != WLAN_PMK_NAME_LEN) {
12319                         ret = -EINVAL;
12320                         goto out;
12321                 }
12322
12323                 pmk_conf.pmk_r0_name =
12324                         nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]);
12325         }
12326
12327         ret = rdev_set_pmk(rdev, dev, &pmk_conf);
12328 out:
12329         wdev_unlock(wdev);
12330         return ret;
12331 }
12332
12333 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info)
12334 {
12335         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12336         struct net_device *dev = info->user_ptr[1];
12337         struct wireless_dev *wdev = dev->ieee80211_ptr;
12338         const u8 *aa;
12339         int ret;
12340
12341         if (wdev->iftype != NL80211_IFTYPE_STATION &&
12342             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
12343                 return -EOPNOTSUPP;
12344
12345         if (!wiphy_ext_feature_isset(&rdev->wiphy,
12346                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
12347                 return -EOPNOTSUPP;
12348
12349         if (!info->attrs[NL80211_ATTR_MAC])
12350                 return -EINVAL;
12351
12352         wdev_lock(wdev);
12353         aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
12354         ret = rdev_del_pmk(rdev, dev, aa);
12355         wdev_unlock(wdev);
12356
12357         return ret;
12358 }
12359
12360 #define NL80211_FLAG_NEED_WIPHY         0x01
12361 #define NL80211_FLAG_NEED_NETDEV        0x02
12362 #define NL80211_FLAG_NEED_RTNL          0x04
12363 #define NL80211_FLAG_CHECK_NETDEV_UP    0x08
12364 #define NL80211_FLAG_NEED_NETDEV_UP     (NL80211_FLAG_NEED_NETDEV |\
12365                                          NL80211_FLAG_CHECK_NETDEV_UP)
12366 #define NL80211_FLAG_NEED_WDEV          0x10
12367 /* If a netdev is associated, it must be UP, P2P must be started */
12368 #define NL80211_FLAG_NEED_WDEV_UP       (NL80211_FLAG_NEED_WDEV |\
12369                                          NL80211_FLAG_CHECK_NETDEV_UP)
12370 #define NL80211_FLAG_CLEAR_SKB          0x20
12371
12372 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
12373                             struct genl_info *info)
12374 {
12375         struct cfg80211_registered_device *rdev;
12376         struct wireless_dev *wdev;
12377         struct net_device *dev;
12378         bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL;
12379
12380         if (rtnl)
12381                 rtnl_lock();
12382
12383         if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) {
12384                 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
12385                 if (IS_ERR(rdev)) {
12386                         if (rtnl)
12387                                 rtnl_unlock();
12388                         return PTR_ERR(rdev);
12389                 }
12390                 info->user_ptr[0] = rdev;
12391         } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV ||
12392                    ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
12393                 ASSERT_RTNL();
12394
12395                 wdev = __cfg80211_wdev_from_attrs(genl_info_net(info),
12396                                                   info->attrs);
12397                 if (IS_ERR(wdev)) {
12398                         if (rtnl)
12399                                 rtnl_unlock();
12400                         return PTR_ERR(wdev);
12401                 }
12402
12403                 dev = wdev->netdev;
12404                 rdev = wiphy_to_rdev(wdev->wiphy);
12405
12406                 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) {
12407                         if (!dev) {
12408                                 if (rtnl)
12409                                         rtnl_unlock();
12410                                 return -EINVAL;
12411                         }
12412
12413                         info->user_ptr[1] = dev;
12414                 } else {
12415                         info->user_ptr[1] = wdev;
12416                 }
12417
12418                 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
12419                     !wdev_running(wdev)) {
12420                         if (rtnl)
12421                                 rtnl_unlock();
12422                         return -ENETDOWN;
12423                 }
12424
12425                 if (dev)
12426                         dev_hold(dev);
12427
12428                 info->user_ptr[0] = rdev;
12429         }
12430
12431         return 0;
12432 }
12433
12434 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
12435                               struct genl_info *info)
12436 {
12437         if (info->user_ptr[1]) {
12438                 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
12439                         struct wireless_dev *wdev = info->user_ptr[1];
12440
12441                         if (wdev->netdev)
12442                                 dev_put(wdev->netdev);
12443                 } else {
12444                         dev_put(info->user_ptr[1]);
12445                 }
12446         }
12447
12448         if (ops->internal_flags & NL80211_FLAG_NEED_RTNL)
12449                 rtnl_unlock();
12450
12451         /* If needed, clear the netlink message payload from the SKB
12452          * as it might contain key data that shouldn't stick around on
12453          * the heap after the SKB is freed. The netlink message header
12454          * is still needed for further processing, so leave it intact.
12455          */
12456         if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) {
12457                 struct nlmsghdr *nlh = nlmsg_hdr(skb);
12458
12459                 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh));
12460         }
12461 }
12462
12463 static const struct genl_ops nl80211_ops[] = {
12464         {
12465                 .cmd = NL80211_CMD_GET_WIPHY,
12466                 .doit = nl80211_get_wiphy,
12467                 .dumpit = nl80211_dump_wiphy,
12468                 .done = nl80211_dump_wiphy_done,
12469                 .policy = nl80211_policy,
12470                 /* can be retrieved by unprivileged users */
12471                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12472                                   NL80211_FLAG_NEED_RTNL,
12473         },
12474         {
12475                 .cmd = NL80211_CMD_SET_WIPHY,
12476                 .doit = nl80211_set_wiphy,
12477                 .policy = nl80211_policy,
12478                 .flags = GENL_UNS_ADMIN_PERM,
12479                 .internal_flags = NL80211_FLAG_NEED_RTNL,
12480         },
12481         {
12482                 .cmd = NL80211_CMD_GET_INTERFACE,
12483                 .doit = nl80211_get_interface,
12484                 .dumpit = nl80211_dump_interface,
12485                 .policy = nl80211_policy,
12486                 /* can be retrieved by unprivileged users */
12487                 .internal_flags = NL80211_FLAG_NEED_WDEV |
12488                                   NL80211_FLAG_NEED_RTNL,
12489         },
12490         {
12491                 .cmd = NL80211_CMD_SET_INTERFACE,
12492                 .doit = nl80211_set_interface,
12493                 .policy = nl80211_policy,
12494                 .flags = GENL_UNS_ADMIN_PERM,
12495                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12496                                   NL80211_FLAG_NEED_RTNL,
12497         },
12498         {
12499                 .cmd = NL80211_CMD_NEW_INTERFACE,
12500                 .doit = nl80211_new_interface,
12501                 .policy = nl80211_policy,
12502                 .flags = GENL_UNS_ADMIN_PERM,
12503                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12504                                   NL80211_FLAG_NEED_RTNL,
12505         },
12506         {
12507                 .cmd = NL80211_CMD_DEL_INTERFACE,
12508                 .doit = nl80211_del_interface,
12509                 .policy = nl80211_policy,
12510                 .flags = GENL_UNS_ADMIN_PERM,
12511                 .internal_flags = NL80211_FLAG_NEED_WDEV |
12512                                   NL80211_FLAG_NEED_RTNL,
12513         },
12514         {
12515                 .cmd = NL80211_CMD_GET_KEY,
12516                 .doit = nl80211_get_key,
12517                 .policy = nl80211_policy,
12518                 .flags = GENL_UNS_ADMIN_PERM,
12519                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12520                                   NL80211_FLAG_NEED_RTNL,
12521         },
12522         {
12523                 .cmd = NL80211_CMD_SET_KEY,
12524                 .doit = nl80211_set_key,
12525                 .policy = nl80211_policy,
12526                 .flags = GENL_UNS_ADMIN_PERM,
12527                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12528                                   NL80211_FLAG_NEED_RTNL |
12529                                   NL80211_FLAG_CLEAR_SKB,
12530         },
12531         {
12532                 .cmd = NL80211_CMD_NEW_KEY,
12533                 .doit = nl80211_new_key,
12534                 .policy = nl80211_policy,
12535                 .flags = GENL_UNS_ADMIN_PERM,
12536                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12537                                   NL80211_FLAG_NEED_RTNL |
12538                                   NL80211_FLAG_CLEAR_SKB,
12539         },
12540         {
12541                 .cmd = NL80211_CMD_DEL_KEY,
12542                 .doit = nl80211_del_key,
12543                 .policy = nl80211_policy,
12544                 .flags = GENL_UNS_ADMIN_PERM,
12545                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12546                                   NL80211_FLAG_NEED_RTNL,
12547         },
12548         {
12549                 .cmd = NL80211_CMD_SET_BEACON,
12550                 .policy = nl80211_policy,
12551                 .flags = GENL_UNS_ADMIN_PERM,
12552                 .doit = nl80211_set_beacon,
12553                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12554                                   NL80211_FLAG_NEED_RTNL,
12555         },
12556         {
12557                 .cmd = NL80211_CMD_START_AP,
12558                 .policy = nl80211_policy,
12559                 .flags = GENL_UNS_ADMIN_PERM,
12560                 .doit = nl80211_start_ap,
12561                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12562                                   NL80211_FLAG_NEED_RTNL,
12563         },
12564         {
12565                 .cmd = NL80211_CMD_STOP_AP,
12566                 .policy = nl80211_policy,
12567                 .flags = GENL_UNS_ADMIN_PERM,
12568                 .doit = nl80211_stop_ap,
12569                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12570                                   NL80211_FLAG_NEED_RTNL,
12571         },
12572         {
12573                 .cmd = NL80211_CMD_GET_STATION,
12574                 .doit = nl80211_get_station,
12575                 .dumpit = nl80211_dump_station,
12576                 .policy = nl80211_policy,
12577                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12578                                   NL80211_FLAG_NEED_RTNL,
12579         },
12580         {
12581                 .cmd = NL80211_CMD_SET_STATION,
12582                 .doit = nl80211_set_station,
12583                 .policy = nl80211_policy,
12584                 .flags = GENL_UNS_ADMIN_PERM,
12585                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12586                                   NL80211_FLAG_NEED_RTNL,
12587         },
12588         {
12589                 .cmd = NL80211_CMD_NEW_STATION,
12590                 .doit = nl80211_new_station,
12591                 .policy = nl80211_policy,
12592                 .flags = GENL_UNS_ADMIN_PERM,
12593                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12594                                   NL80211_FLAG_NEED_RTNL,
12595         },
12596         {
12597                 .cmd = NL80211_CMD_DEL_STATION,
12598                 .doit = nl80211_del_station,
12599                 .policy = nl80211_policy,
12600                 .flags = GENL_UNS_ADMIN_PERM,
12601                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12602                                   NL80211_FLAG_NEED_RTNL,
12603         },
12604         {
12605                 .cmd = NL80211_CMD_GET_MPATH,
12606                 .doit = nl80211_get_mpath,
12607                 .dumpit = nl80211_dump_mpath,
12608                 .policy = nl80211_policy,
12609                 .flags = GENL_UNS_ADMIN_PERM,
12610                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12611                                   NL80211_FLAG_NEED_RTNL,
12612         },
12613         {
12614                 .cmd = NL80211_CMD_GET_MPP,
12615                 .doit = nl80211_get_mpp,
12616                 .dumpit = nl80211_dump_mpp,
12617                 .policy = nl80211_policy,
12618                 .flags = GENL_UNS_ADMIN_PERM,
12619                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12620                                   NL80211_FLAG_NEED_RTNL,
12621         },
12622         {
12623                 .cmd = NL80211_CMD_SET_MPATH,
12624                 .doit = nl80211_set_mpath,
12625                 .policy = nl80211_policy,
12626                 .flags = GENL_UNS_ADMIN_PERM,
12627                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12628                                   NL80211_FLAG_NEED_RTNL,
12629         },
12630         {
12631                 .cmd = NL80211_CMD_NEW_MPATH,
12632                 .doit = nl80211_new_mpath,
12633                 .policy = nl80211_policy,
12634                 .flags = GENL_UNS_ADMIN_PERM,
12635                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12636                                   NL80211_FLAG_NEED_RTNL,
12637         },
12638         {
12639                 .cmd = NL80211_CMD_DEL_MPATH,
12640                 .doit = nl80211_del_mpath,
12641                 .policy = nl80211_policy,
12642                 .flags = GENL_UNS_ADMIN_PERM,
12643                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12644                                   NL80211_FLAG_NEED_RTNL,
12645         },
12646         {
12647                 .cmd = NL80211_CMD_SET_BSS,
12648                 .doit = nl80211_set_bss,
12649                 .policy = nl80211_policy,
12650                 .flags = GENL_UNS_ADMIN_PERM,
12651                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12652                                   NL80211_FLAG_NEED_RTNL,
12653         },
12654         {
12655                 .cmd = NL80211_CMD_GET_REG,
12656                 .doit = nl80211_get_reg_do,
12657                 .dumpit = nl80211_get_reg_dump,
12658                 .policy = nl80211_policy,
12659                 .internal_flags = NL80211_FLAG_NEED_RTNL,
12660                 /* can be retrieved by unprivileged users */
12661         },
12662 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
12663         {
12664                 .cmd = NL80211_CMD_SET_REG,
12665                 .doit = nl80211_set_reg,
12666                 .policy = nl80211_policy,
12667                 .flags = GENL_ADMIN_PERM,
12668                 .internal_flags = NL80211_FLAG_NEED_RTNL,
12669         },
12670 #endif
12671         {
12672                 .cmd = NL80211_CMD_REQ_SET_REG,
12673                 .doit = nl80211_req_set_reg,
12674                 .policy = nl80211_policy,
12675                 .flags = GENL_ADMIN_PERM,
12676         },
12677         {
12678                 .cmd = NL80211_CMD_GET_MESH_CONFIG,
12679                 .doit = nl80211_get_mesh_config,
12680                 .policy = nl80211_policy,
12681                 /* can be retrieved by unprivileged users */
12682                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12683                                   NL80211_FLAG_NEED_RTNL,
12684         },
12685         {
12686                 .cmd = NL80211_CMD_SET_MESH_CONFIG,
12687                 .doit = nl80211_update_mesh_config,
12688                 .policy = nl80211_policy,
12689                 .flags = GENL_UNS_ADMIN_PERM,
12690                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12691                                   NL80211_FLAG_NEED_RTNL,
12692         },
12693         {
12694                 .cmd = NL80211_CMD_TRIGGER_SCAN,
12695                 .doit = nl80211_trigger_scan,
12696                 .policy = nl80211_policy,
12697                 .flags = GENL_UNS_ADMIN_PERM,
12698                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12699                                   NL80211_FLAG_NEED_RTNL,
12700         },
12701         {
12702                 .cmd = NL80211_CMD_ABORT_SCAN,
12703                 .doit = nl80211_abort_scan,
12704                 .policy = nl80211_policy,
12705                 .flags = GENL_UNS_ADMIN_PERM,
12706                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12707                                   NL80211_FLAG_NEED_RTNL,
12708         },
12709         {
12710                 .cmd = NL80211_CMD_GET_SCAN,
12711                 .policy = nl80211_policy,
12712                 .dumpit = nl80211_dump_scan,
12713         },
12714         {
12715                 .cmd = NL80211_CMD_START_SCHED_SCAN,
12716                 .doit = nl80211_start_sched_scan,
12717                 .policy = nl80211_policy,
12718                 .flags = GENL_UNS_ADMIN_PERM,
12719                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12720                                   NL80211_FLAG_NEED_RTNL,
12721         },
12722         {
12723                 .cmd = NL80211_CMD_STOP_SCHED_SCAN,
12724                 .doit = nl80211_stop_sched_scan,
12725                 .policy = nl80211_policy,
12726                 .flags = GENL_UNS_ADMIN_PERM,
12727                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12728                                   NL80211_FLAG_NEED_RTNL,
12729         },
12730         {
12731                 .cmd = NL80211_CMD_AUTHENTICATE,
12732                 .doit = nl80211_authenticate,
12733                 .policy = nl80211_policy,
12734                 .flags = GENL_UNS_ADMIN_PERM,
12735                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12736                                   NL80211_FLAG_NEED_RTNL |
12737                                   NL80211_FLAG_CLEAR_SKB,
12738         },
12739         {
12740                 .cmd = NL80211_CMD_ASSOCIATE,
12741                 .doit = nl80211_associate,
12742                 .policy = nl80211_policy,
12743                 .flags = GENL_UNS_ADMIN_PERM,
12744                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12745                                   NL80211_FLAG_NEED_RTNL,
12746         },
12747         {
12748                 .cmd = NL80211_CMD_DEAUTHENTICATE,
12749                 .doit = nl80211_deauthenticate,
12750                 .policy = nl80211_policy,
12751                 .flags = GENL_UNS_ADMIN_PERM,
12752                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12753                                   NL80211_FLAG_NEED_RTNL,
12754         },
12755         {
12756                 .cmd = NL80211_CMD_DISASSOCIATE,
12757                 .doit = nl80211_disassociate,
12758                 .policy = nl80211_policy,
12759                 .flags = GENL_UNS_ADMIN_PERM,
12760                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12761                                   NL80211_FLAG_NEED_RTNL,
12762         },
12763         {
12764                 .cmd = NL80211_CMD_JOIN_IBSS,
12765                 .doit = nl80211_join_ibss,
12766                 .policy = nl80211_policy,
12767                 .flags = GENL_UNS_ADMIN_PERM,
12768                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12769                                   NL80211_FLAG_NEED_RTNL,
12770         },
12771         {
12772                 .cmd = NL80211_CMD_LEAVE_IBSS,
12773                 .doit = nl80211_leave_ibss,
12774                 .policy = nl80211_policy,
12775                 .flags = GENL_UNS_ADMIN_PERM,
12776                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12777                                   NL80211_FLAG_NEED_RTNL,
12778         },
12779 #ifdef CONFIG_NL80211_TESTMODE
12780         {
12781                 .cmd = NL80211_CMD_TESTMODE,
12782                 .doit = nl80211_testmode_do,
12783                 .dumpit = nl80211_testmode_dump,
12784                 .policy = nl80211_policy,
12785                 .flags = GENL_UNS_ADMIN_PERM,
12786                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12787                                   NL80211_FLAG_NEED_RTNL,
12788         },
12789 #endif
12790         {
12791                 .cmd = NL80211_CMD_CONNECT,
12792                 .doit = nl80211_connect,
12793                 .policy = nl80211_policy,
12794                 .flags = GENL_UNS_ADMIN_PERM,
12795                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12796                                   NL80211_FLAG_NEED_RTNL,
12797         },
12798         {
12799                 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS,
12800                 .doit = nl80211_update_connect_params,
12801                 .policy = nl80211_policy,
12802                 .flags = GENL_ADMIN_PERM,
12803                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12804                                   NL80211_FLAG_NEED_RTNL,
12805         },
12806         {
12807                 .cmd = NL80211_CMD_DISCONNECT,
12808                 .doit = nl80211_disconnect,
12809                 .policy = nl80211_policy,
12810                 .flags = GENL_UNS_ADMIN_PERM,
12811                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12812                                   NL80211_FLAG_NEED_RTNL,
12813         },
12814         {
12815                 .cmd = NL80211_CMD_SET_WIPHY_NETNS,
12816                 .doit = nl80211_wiphy_netns,
12817                 .policy = nl80211_policy,
12818                 .flags = GENL_UNS_ADMIN_PERM,
12819                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12820                                   NL80211_FLAG_NEED_RTNL,
12821         },
12822         {
12823                 .cmd = NL80211_CMD_GET_SURVEY,
12824                 .policy = nl80211_policy,
12825                 .dumpit = nl80211_dump_survey,
12826         },
12827         {
12828                 .cmd = NL80211_CMD_SET_PMKSA,
12829                 .doit = nl80211_setdel_pmksa,
12830                 .policy = nl80211_policy,
12831                 .flags = GENL_UNS_ADMIN_PERM,
12832                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12833                                   NL80211_FLAG_NEED_RTNL,
12834         },
12835         {
12836                 .cmd = NL80211_CMD_DEL_PMKSA,
12837                 .doit = nl80211_setdel_pmksa,
12838                 .policy = nl80211_policy,
12839                 .flags = GENL_UNS_ADMIN_PERM,
12840                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12841                                   NL80211_FLAG_NEED_RTNL,
12842         },
12843         {
12844                 .cmd = NL80211_CMD_FLUSH_PMKSA,
12845                 .doit = nl80211_flush_pmksa,
12846                 .policy = nl80211_policy,
12847                 .flags = GENL_UNS_ADMIN_PERM,
12848                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12849                                   NL80211_FLAG_NEED_RTNL,
12850         },
12851         {
12852                 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
12853                 .doit = nl80211_remain_on_channel,
12854                 .policy = nl80211_policy,
12855                 .flags = GENL_UNS_ADMIN_PERM,
12856                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12857                                   NL80211_FLAG_NEED_RTNL,
12858         },
12859         {
12860                 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
12861                 .doit = nl80211_cancel_remain_on_channel,
12862                 .policy = nl80211_policy,
12863                 .flags = GENL_UNS_ADMIN_PERM,
12864                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12865                                   NL80211_FLAG_NEED_RTNL,
12866         },
12867         {
12868                 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
12869                 .doit = nl80211_set_tx_bitrate_mask,
12870                 .policy = nl80211_policy,
12871                 .flags = GENL_UNS_ADMIN_PERM,
12872                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12873                                   NL80211_FLAG_NEED_RTNL,
12874         },
12875         {
12876                 .cmd = NL80211_CMD_REGISTER_FRAME,
12877                 .doit = nl80211_register_mgmt,
12878                 .policy = nl80211_policy,
12879                 .flags = GENL_UNS_ADMIN_PERM,
12880                 .internal_flags = NL80211_FLAG_NEED_WDEV |
12881                                   NL80211_FLAG_NEED_RTNL,
12882         },
12883         {
12884                 .cmd = NL80211_CMD_FRAME,
12885                 .doit = nl80211_tx_mgmt,
12886                 .policy = nl80211_policy,
12887                 .flags = GENL_UNS_ADMIN_PERM,
12888                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12889                                   NL80211_FLAG_NEED_RTNL,
12890         },
12891         {
12892                 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
12893                 .doit = nl80211_tx_mgmt_cancel_wait,
12894                 .policy = nl80211_policy,
12895                 .flags = GENL_UNS_ADMIN_PERM,
12896                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12897                                   NL80211_FLAG_NEED_RTNL,
12898         },
12899         {
12900                 .cmd = NL80211_CMD_SET_POWER_SAVE,
12901                 .doit = nl80211_set_power_save,
12902                 .policy = nl80211_policy,
12903                 .flags = GENL_UNS_ADMIN_PERM,
12904                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12905                                   NL80211_FLAG_NEED_RTNL,
12906         },
12907         {
12908                 .cmd = NL80211_CMD_GET_POWER_SAVE,
12909                 .doit = nl80211_get_power_save,
12910                 .policy = nl80211_policy,
12911                 /* can be retrieved by unprivileged users */
12912                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12913                                   NL80211_FLAG_NEED_RTNL,
12914         },
12915         {
12916                 .cmd = NL80211_CMD_SET_CQM,
12917                 .doit = nl80211_set_cqm,
12918                 .policy = nl80211_policy,
12919                 .flags = GENL_UNS_ADMIN_PERM,
12920                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12921                                   NL80211_FLAG_NEED_RTNL,
12922         },
12923         {
12924                 .cmd = NL80211_CMD_SET_CHANNEL,
12925                 .doit = nl80211_set_channel,
12926                 .policy = nl80211_policy,
12927                 .flags = GENL_UNS_ADMIN_PERM,
12928                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12929                                   NL80211_FLAG_NEED_RTNL,
12930         },
12931         {
12932                 .cmd = NL80211_CMD_SET_WDS_PEER,
12933                 .doit = nl80211_set_wds_peer,
12934                 .policy = nl80211_policy,
12935                 .flags = GENL_UNS_ADMIN_PERM,
12936                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12937                                   NL80211_FLAG_NEED_RTNL,
12938         },
12939         {
12940                 .cmd = NL80211_CMD_JOIN_MESH,
12941                 .doit = nl80211_join_mesh,
12942                 .policy = nl80211_policy,
12943                 .flags = GENL_UNS_ADMIN_PERM,
12944                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12945                                   NL80211_FLAG_NEED_RTNL,
12946         },
12947         {
12948                 .cmd = NL80211_CMD_LEAVE_MESH,
12949                 .doit = nl80211_leave_mesh,
12950                 .policy = nl80211_policy,
12951                 .flags = GENL_UNS_ADMIN_PERM,
12952                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12953                                   NL80211_FLAG_NEED_RTNL,
12954         },
12955         {
12956                 .cmd = NL80211_CMD_JOIN_OCB,
12957                 .doit = nl80211_join_ocb,
12958                 .policy = nl80211_policy,
12959                 .flags = GENL_UNS_ADMIN_PERM,
12960                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12961                                   NL80211_FLAG_NEED_RTNL,
12962         },
12963         {
12964                 .cmd = NL80211_CMD_LEAVE_OCB,
12965                 .doit = nl80211_leave_ocb,
12966                 .policy = nl80211_policy,
12967                 .flags = GENL_UNS_ADMIN_PERM,
12968                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12969                                   NL80211_FLAG_NEED_RTNL,
12970         },
12971 #ifdef CONFIG_PM
12972         {
12973                 .cmd = NL80211_CMD_GET_WOWLAN,
12974                 .doit = nl80211_get_wowlan,
12975                 .policy = nl80211_policy,
12976                 /* can be retrieved by unprivileged users */
12977                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12978                                   NL80211_FLAG_NEED_RTNL,
12979         },
12980         {
12981                 .cmd = NL80211_CMD_SET_WOWLAN,
12982                 .doit = nl80211_set_wowlan,
12983                 .policy = nl80211_policy,
12984                 .flags = GENL_UNS_ADMIN_PERM,
12985                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12986                                   NL80211_FLAG_NEED_RTNL,
12987         },
12988 #endif
12989         {
12990                 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
12991                 .doit = nl80211_set_rekey_data,
12992                 .policy = nl80211_policy,
12993                 .flags = GENL_UNS_ADMIN_PERM,
12994                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12995                                   NL80211_FLAG_NEED_RTNL |
12996                                   NL80211_FLAG_CLEAR_SKB,
12997         },
12998         {
12999                 .cmd = NL80211_CMD_TDLS_MGMT,
13000                 .doit = nl80211_tdls_mgmt,
13001                 .policy = nl80211_policy,
13002                 .flags = GENL_UNS_ADMIN_PERM,
13003                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13004                                   NL80211_FLAG_NEED_RTNL,
13005         },
13006         {
13007                 .cmd = NL80211_CMD_TDLS_OPER,
13008                 .doit = nl80211_tdls_oper,
13009                 .policy = nl80211_policy,
13010                 .flags = GENL_UNS_ADMIN_PERM,
13011                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13012                                   NL80211_FLAG_NEED_RTNL,
13013         },
13014         {
13015                 .cmd = NL80211_CMD_UNEXPECTED_FRAME,
13016                 .doit = nl80211_register_unexpected_frame,
13017                 .policy = nl80211_policy,
13018                 .flags = GENL_UNS_ADMIN_PERM,
13019                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13020                                   NL80211_FLAG_NEED_RTNL,
13021         },
13022         {
13023                 .cmd = NL80211_CMD_PROBE_CLIENT,
13024                 .doit = nl80211_probe_client,
13025                 .policy = nl80211_policy,
13026                 .flags = GENL_UNS_ADMIN_PERM,
13027                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13028                                   NL80211_FLAG_NEED_RTNL,
13029         },
13030         {
13031                 .cmd = NL80211_CMD_REGISTER_BEACONS,
13032                 .doit = nl80211_register_beacons,
13033                 .policy = nl80211_policy,
13034                 .flags = GENL_UNS_ADMIN_PERM,
13035                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13036                                   NL80211_FLAG_NEED_RTNL,
13037         },
13038         {
13039                 .cmd = NL80211_CMD_SET_NOACK_MAP,
13040                 .doit = nl80211_set_noack_map,
13041                 .policy = nl80211_policy,
13042                 .flags = GENL_UNS_ADMIN_PERM,
13043                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13044                                   NL80211_FLAG_NEED_RTNL,
13045         },
13046         {
13047                 .cmd = NL80211_CMD_START_P2P_DEVICE,
13048                 .doit = nl80211_start_p2p_device,
13049                 .policy = nl80211_policy,
13050                 .flags = GENL_UNS_ADMIN_PERM,
13051                 .internal_flags = NL80211_FLAG_NEED_WDEV |
13052                                   NL80211_FLAG_NEED_RTNL,
13053         },
13054         {
13055                 .cmd = NL80211_CMD_STOP_P2P_DEVICE,
13056                 .doit = nl80211_stop_p2p_device,
13057                 .policy = nl80211_policy,
13058                 .flags = GENL_UNS_ADMIN_PERM,
13059                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13060                                   NL80211_FLAG_NEED_RTNL,
13061         },
13062         {
13063                 .cmd = NL80211_CMD_START_NAN,
13064                 .doit = nl80211_start_nan,
13065                 .policy = nl80211_policy,
13066                 .flags = GENL_ADMIN_PERM,
13067                 .internal_flags = NL80211_FLAG_NEED_WDEV |
13068                                   NL80211_FLAG_NEED_RTNL,
13069         },
13070         {
13071                 .cmd = NL80211_CMD_STOP_NAN,
13072                 .doit = nl80211_stop_nan,
13073                 .policy = nl80211_policy,
13074                 .flags = GENL_ADMIN_PERM,
13075                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13076                                   NL80211_FLAG_NEED_RTNL,
13077         },
13078         {
13079                 .cmd = NL80211_CMD_ADD_NAN_FUNCTION,
13080                 .doit = nl80211_nan_add_func,
13081                 .policy = nl80211_policy,
13082                 .flags = GENL_ADMIN_PERM,
13083                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13084                                   NL80211_FLAG_NEED_RTNL,
13085         },
13086         {
13087                 .cmd = NL80211_CMD_DEL_NAN_FUNCTION,
13088                 .doit = nl80211_nan_del_func,
13089                 .policy = nl80211_policy,
13090                 .flags = GENL_ADMIN_PERM,
13091                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13092                                   NL80211_FLAG_NEED_RTNL,
13093         },
13094         {
13095                 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG,
13096                 .doit = nl80211_nan_change_config,
13097                 .policy = nl80211_policy,
13098                 .flags = GENL_ADMIN_PERM,
13099                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13100                                   NL80211_FLAG_NEED_RTNL,
13101         },
13102         {
13103                 .cmd = NL80211_CMD_SET_MCAST_RATE,
13104                 .doit = nl80211_set_mcast_rate,
13105                 .policy = nl80211_policy,
13106                 .flags = GENL_UNS_ADMIN_PERM,
13107                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13108                                   NL80211_FLAG_NEED_RTNL,
13109         },
13110         {
13111                 .cmd = NL80211_CMD_SET_MAC_ACL,
13112                 .doit = nl80211_set_mac_acl,
13113                 .policy = nl80211_policy,
13114                 .flags = GENL_UNS_ADMIN_PERM,
13115                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13116                                   NL80211_FLAG_NEED_RTNL,
13117         },
13118         {
13119                 .cmd = NL80211_CMD_RADAR_DETECT,
13120                 .doit = nl80211_start_radar_detection,
13121                 .policy = nl80211_policy,
13122                 .flags = GENL_UNS_ADMIN_PERM,
13123                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13124                                   NL80211_FLAG_NEED_RTNL,
13125         },
13126         {
13127                 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
13128                 .doit = nl80211_get_protocol_features,
13129                 .policy = nl80211_policy,
13130         },
13131         {
13132                 .cmd = NL80211_CMD_UPDATE_FT_IES,
13133                 .doit = nl80211_update_ft_ies,
13134                 .policy = nl80211_policy,
13135                 .flags = GENL_UNS_ADMIN_PERM,
13136                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13137                                   NL80211_FLAG_NEED_RTNL,
13138         },
13139         {
13140                 .cmd = NL80211_CMD_CRIT_PROTOCOL_START,
13141                 .doit = nl80211_crit_protocol_start,
13142                 .policy = nl80211_policy,
13143                 .flags = GENL_UNS_ADMIN_PERM,
13144                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13145                                   NL80211_FLAG_NEED_RTNL,
13146         },
13147         {
13148                 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
13149                 .doit = nl80211_crit_protocol_stop,
13150                 .policy = nl80211_policy,
13151                 .flags = GENL_UNS_ADMIN_PERM,
13152                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13153                                   NL80211_FLAG_NEED_RTNL,
13154         },
13155         {
13156                 .cmd = NL80211_CMD_GET_COALESCE,
13157                 .doit = nl80211_get_coalesce,
13158                 .policy = nl80211_policy,
13159                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13160                                   NL80211_FLAG_NEED_RTNL,
13161         },
13162         {
13163                 .cmd = NL80211_CMD_SET_COALESCE,
13164                 .doit = nl80211_set_coalesce,
13165                 .policy = nl80211_policy,
13166                 .flags = GENL_UNS_ADMIN_PERM,
13167                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13168                                   NL80211_FLAG_NEED_RTNL,
13169         },
13170         {
13171                 .cmd = NL80211_CMD_CHANNEL_SWITCH,
13172                 .doit = nl80211_channel_switch,
13173                 .policy = nl80211_policy,
13174                 .flags = GENL_UNS_ADMIN_PERM,
13175                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13176                                   NL80211_FLAG_NEED_RTNL,
13177         },
13178         {
13179                 .cmd = NL80211_CMD_VENDOR,
13180                 .doit = nl80211_vendor_cmd,
13181                 .dumpit = nl80211_vendor_cmd_dump,
13182                 .policy = nl80211_policy,
13183                 .flags = GENL_UNS_ADMIN_PERM,
13184                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13185                                   NL80211_FLAG_NEED_RTNL,
13186         },
13187         {
13188                 .cmd = NL80211_CMD_SET_QOS_MAP,
13189                 .doit = nl80211_set_qos_map,
13190                 .policy = nl80211_policy,
13191                 .flags = GENL_UNS_ADMIN_PERM,
13192                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13193                                   NL80211_FLAG_NEED_RTNL,
13194         },
13195         {
13196                 .cmd = NL80211_CMD_ADD_TX_TS,
13197                 .doit = nl80211_add_tx_ts,
13198                 .policy = nl80211_policy,
13199                 .flags = GENL_UNS_ADMIN_PERM,
13200                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13201                                   NL80211_FLAG_NEED_RTNL,
13202         },
13203         {
13204                 .cmd = NL80211_CMD_DEL_TX_TS,
13205                 .doit = nl80211_del_tx_ts,
13206                 .policy = nl80211_policy,
13207                 .flags = GENL_UNS_ADMIN_PERM,
13208                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13209                                   NL80211_FLAG_NEED_RTNL,
13210         },
13211         {
13212                 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH,
13213                 .doit = nl80211_tdls_channel_switch,
13214                 .policy = nl80211_policy,
13215                 .flags = GENL_UNS_ADMIN_PERM,
13216                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13217                                   NL80211_FLAG_NEED_RTNL,
13218         },
13219         {
13220                 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
13221                 .doit = nl80211_tdls_cancel_channel_switch,
13222                 .policy = nl80211_policy,
13223                 .flags = GENL_UNS_ADMIN_PERM,
13224                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13225                                   NL80211_FLAG_NEED_RTNL,
13226         },
13227         {
13228                 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST,
13229                 .doit = nl80211_set_multicast_to_unicast,
13230                 .policy = nl80211_policy,
13231                 .flags = GENL_UNS_ADMIN_PERM,
13232                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13233                                   NL80211_FLAG_NEED_RTNL,
13234         },
13235         {
13236                 .cmd = NL80211_CMD_SET_PMK,
13237                 .doit = nl80211_set_pmk,
13238                 .policy = nl80211_policy,
13239                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13240                                   NL80211_FLAG_NEED_RTNL,
13241         },
13242         {
13243                 .cmd = NL80211_CMD_DEL_PMK,
13244                 .doit = nl80211_del_pmk,
13245                 .policy = nl80211_policy,
13246                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13247                                   NL80211_FLAG_NEED_RTNL,
13248         },
13249
13250 };
13251
13252 static struct genl_family nl80211_fam __ro_after_init = {
13253         .name = NL80211_GENL_NAME,      /* have users key off the name instead */
13254         .hdrsize = 0,                   /* no private header */
13255         .version = 1,                   /* no particular meaning now */
13256         .maxattr = NL80211_ATTR_MAX,
13257         .netnsok = true,
13258         .pre_doit = nl80211_pre_doit,
13259         .post_doit = nl80211_post_doit,
13260         .module = THIS_MODULE,
13261         .ops = nl80211_ops,
13262         .n_ops = ARRAY_SIZE(nl80211_ops),
13263         .mcgrps = nl80211_mcgrps,
13264         .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps),
13265 };
13266
13267 /* notification functions */
13268
13269 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
13270                           enum nl80211_commands cmd)
13271 {
13272         struct sk_buff *msg;
13273         struct nl80211_dump_wiphy_state state = {};
13274
13275         WARN_ON(cmd != NL80211_CMD_NEW_WIPHY &&
13276                 cmd != NL80211_CMD_DEL_WIPHY);
13277
13278         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13279         if (!msg)
13280                 return;
13281
13282         if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) {
13283                 nlmsg_free(msg);
13284                 return;
13285         }
13286
13287         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13288                                 NL80211_MCGRP_CONFIG, GFP_KERNEL);
13289 }
13290
13291 void nl80211_notify_iface(struct cfg80211_registered_device *rdev,
13292                                 struct wireless_dev *wdev,
13293                                 enum nl80211_commands cmd)
13294 {
13295         struct sk_buff *msg;
13296
13297         WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE &&
13298                 cmd != NL80211_CMD_DEL_INTERFACE);
13299
13300         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13301         if (!msg)
13302                 return;
13303
13304         if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev,
13305                                cmd == NL80211_CMD_DEL_INTERFACE) < 0) {
13306                 nlmsg_free(msg);
13307                 return;
13308         }
13309
13310         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13311                                 NL80211_MCGRP_CONFIG, GFP_KERNEL);
13312 }
13313
13314 static int nl80211_add_scan_req(struct sk_buff *msg,
13315                                 struct cfg80211_registered_device *rdev)
13316 {
13317         struct cfg80211_scan_request *req = rdev->scan_req;
13318         struct nlattr *nest;
13319         int i;
13320
13321         if (WARN_ON(!req))
13322                 return 0;
13323
13324         nest = nla_nest_start(msg, NL80211_ATTR_SCAN_SSIDS);
13325         if (!nest)
13326                 goto nla_put_failure;
13327         for (i = 0; i < req->n_ssids; i++) {
13328                 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid))
13329                         goto nla_put_failure;
13330         }
13331         nla_nest_end(msg, nest);
13332
13333         nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
13334         if (!nest)
13335                 goto nla_put_failure;
13336         for (i = 0; i < req->n_channels; i++) {
13337                 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
13338                         goto nla_put_failure;
13339         }
13340         nla_nest_end(msg, nest);
13341
13342         if (req->ie &&
13343             nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie))
13344                 goto nla_put_failure;
13345
13346         if (req->flags &&
13347             nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags))
13348                 goto nla_put_failure;
13349
13350         if (req->info.scan_start_tsf &&
13351             (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF,
13352                                req->info.scan_start_tsf, NL80211_BSS_PAD) ||
13353              nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN,
13354                      req->info.tsf_bssid)))
13355                 goto nla_put_failure;
13356
13357         return 0;
13358  nla_put_failure:
13359         return -ENOBUFS;
13360 }
13361
13362 static int nl80211_prep_scan_msg(struct sk_buff *msg,
13363                                  struct cfg80211_registered_device *rdev,
13364                                  struct wireless_dev *wdev,
13365                                  u32 portid, u32 seq, int flags,
13366                                  u32 cmd)
13367 {
13368         void *hdr;
13369
13370         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
13371         if (!hdr)
13372                 return -1;
13373
13374         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13375             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
13376                                          wdev->netdev->ifindex)) ||
13377             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
13378                               NL80211_ATTR_PAD))
13379                 goto nla_put_failure;
13380
13381         /* ignore errors and send incomplete event anyway */
13382         nl80211_add_scan_req(msg, rdev);
13383
13384         genlmsg_end(msg, hdr);
13385         return 0;
13386
13387  nla_put_failure:
13388         genlmsg_cancel(msg, hdr);
13389         return -EMSGSIZE;
13390 }
13391
13392 static int
13393 nl80211_prep_sched_scan_msg(struct sk_buff *msg,
13394                             struct cfg80211_sched_scan_request *req, u32 cmd)
13395 {
13396         void *hdr;
13397
13398         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
13399         if (!hdr)
13400                 return -1;
13401
13402         if (nla_put_u32(msg, NL80211_ATTR_WIPHY,
13403                         wiphy_to_rdev(req->wiphy)->wiphy_idx) ||
13404             nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) ||
13405             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid,
13406                               NL80211_ATTR_PAD))
13407                 goto nla_put_failure;
13408
13409         genlmsg_end(msg, hdr);
13410         return 0;
13411
13412  nla_put_failure:
13413         genlmsg_cancel(msg, hdr);
13414         return -EMSGSIZE;
13415 }
13416
13417 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
13418                              struct wireless_dev *wdev)
13419 {
13420         struct sk_buff *msg;
13421
13422         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13423         if (!msg)
13424                 return;
13425
13426         if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
13427                                   NL80211_CMD_TRIGGER_SCAN) < 0) {
13428                 nlmsg_free(msg);
13429                 return;
13430         }
13431
13432         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13433                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
13434 }
13435
13436 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
13437                                        struct wireless_dev *wdev, bool aborted)
13438 {
13439         struct sk_buff *msg;
13440
13441         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13442         if (!msg)
13443                 return NULL;
13444
13445         if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
13446                                   aborted ? NL80211_CMD_SCAN_ABORTED :
13447                                             NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
13448                 nlmsg_free(msg);
13449                 return NULL;
13450         }
13451
13452         return msg;
13453 }
13454
13455 /* send message created by nl80211_build_scan_msg() */
13456 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev,
13457                            struct sk_buff *msg)
13458 {
13459         if (!msg)
13460                 return;
13461
13462         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13463                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
13464 }
13465
13466 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd)
13467 {
13468         struct sk_buff *msg;
13469
13470         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13471         if (!msg)
13472                 return;
13473
13474         if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) {
13475                 nlmsg_free(msg);
13476                 return;
13477         }
13478
13479         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0,
13480                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
13481 }
13482
13483 static bool nl80211_reg_change_event_fill(struct sk_buff *msg,
13484                                           struct regulatory_request *request)
13485 {
13486         /* Userspace can always count this one always being set */
13487         if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator))
13488                 goto nla_put_failure;
13489
13490         if (request->alpha2[0] == '0' && request->alpha2[1] == '0') {
13491                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
13492                                NL80211_REGDOM_TYPE_WORLD))
13493                         goto nla_put_failure;
13494         } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') {
13495                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
13496                                NL80211_REGDOM_TYPE_CUSTOM_WORLD))
13497                         goto nla_put_failure;
13498         } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
13499                    request->intersect) {
13500                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
13501                                NL80211_REGDOM_TYPE_INTERSECTION))
13502                         goto nla_put_failure;
13503         } else {
13504                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
13505                                NL80211_REGDOM_TYPE_COUNTRY) ||
13506                     nla_put_string(msg, NL80211_ATTR_REG_ALPHA2,
13507                                    request->alpha2))
13508                         goto nla_put_failure;
13509         }
13510
13511         if (request->wiphy_idx != WIPHY_IDX_INVALID) {
13512                 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx);
13513
13514                 if (wiphy &&
13515                     nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx))
13516                         goto nla_put_failure;
13517
13518                 if (wiphy &&
13519                     wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
13520                     nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
13521                         goto nla_put_failure;
13522         }
13523
13524         return true;
13525
13526 nla_put_failure:
13527         return false;
13528 }
13529
13530 /*
13531  * This can happen on global regulatory changes or device specific settings
13532  * based on custom regulatory domains.
13533  */
13534 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id,
13535                                      struct regulatory_request *request)
13536 {
13537         struct sk_buff *msg;
13538         void *hdr;
13539
13540         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13541         if (!msg)
13542                 return;
13543
13544         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id);
13545         if (!hdr) {
13546                 nlmsg_free(msg);
13547                 return;
13548         }
13549
13550         if (nl80211_reg_change_event_fill(msg, request) == false)
13551                 goto nla_put_failure;
13552
13553         genlmsg_end(msg, hdr);
13554
13555         rcu_read_lock();
13556         genlmsg_multicast_allns(&nl80211_fam, msg, 0,
13557                                 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
13558         rcu_read_unlock();
13559
13560         return;
13561
13562 nla_put_failure:
13563         genlmsg_cancel(msg, hdr);
13564         nlmsg_free(msg);
13565 }
13566
13567 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
13568                                     struct net_device *netdev,
13569                                     const u8 *buf, size_t len,
13570                                     enum nl80211_commands cmd, gfp_t gfp,
13571                                     int uapsd_queues)
13572 {
13573         struct sk_buff *msg;
13574         void *hdr;
13575
13576         msg = nlmsg_new(100 + len, gfp);
13577         if (!msg)
13578                 return;
13579
13580         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
13581         if (!hdr) {
13582                 nlmsg_free(msg);
13583                 return;
13584         }
13585
13586         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13587             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13588             nla_put(msg, NL80211_ATTR_FRAME, len, buf))
13589                 goto nla_put_failure;
13590
13591         if (uapsd_queues >= 0) {
13592                 struct nlattr *nla_wmm =
13593                         nla_nest_start(msg, NL80211_ATTR_STA_WME);
13594                 if (!nla_wmm)
13595                         goto nla_put_failure;
13596
13597                 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES,
13598                                uapsd_queues))
13599                         goto nla_put_failure;
13600
13601                 nla_nest_end(msg, nla_wmm);
13602         }
13603
13604         genlmsg_end(msg, hdr);
13605
13606         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13607                                 NL80211_MCGRP_MLME, gfp);
13608         return;
13609
13610  nla_put_failure:
13611         genlmsg_cancel(msg, hdr);
13612         nlmsg_free(msg);
13613 }
13614
13615 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
13616                           struct net_device *netdev, const u8 *buf,
13617                           size_t len, gfp_t gfp)
13618 {
13619         nl80211_send_mlme_event(rdev, netdev, buf, len,
13620                                 NL80211_CMD_AUTHENTICATE, gfp, -1);
13621 }
13622
13623 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
13624                            struct net_device *netdev, const u8 *buf,
13625                            size_t len, gfp_t gfp, int uapsd_queues)
13626 {
13627         nl80211_send_mlme_event(rdev, netdev, buf, len,
13628                                 NL80211_CMD_ASSOCIATE, gfp, uapsd_queues);
13629 }
13630
13631 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
13632                          struct net_device *netdev, const u8 *buf,
13633                          size_t len, gfp_t gfp)
13634 {
13635         nl80211_send_mlme_event(rdev, netdev, buf, len,
13636                                 NL80211_CMD_DEAUTHENTICATE, gfp, -1);
13637 }
13638
13639 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
13640                            struct net_device *netdev, const u8 *buf,
13641                            size_t len, gfp_t gfp)
13642 {
13643         nl80211_send_mlme_event(rdev, netdev, buf, len,
13644                                 NL80211_CMD_DISASSOCIATE, gfp, -1);
13645 }
13646
13647 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
13648                                   size_t len)
13649 {
13650         struct wireless_dev *wdev = dev->ieee80211_ptr;
13651         struct wiphy *wiphy = wdev->wiphy;
13652         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
13653         const struct ieee80211_mgmt *mgmt = (void *)buf;
13654         u32 cmd;
13655
13656         if (WARN_ON(len < 2))
13657                 return;
13658
13659         if (ieee80211_is_deauth(mgmt->frame_control))
13660                 cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE;
13661         else
13662                 cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
13663
13664         trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
13665         nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1);
13666 }
13667 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
13668
13669 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
13670                                       struct net_device *netdev, int cmd,
13671                                       const u8 *addr, gfp_t gfp)
13672 {
13673         struct sk_buff *msg;
13674         void *hdr;
13675
13676         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13677         if (!msg)
13678                 return;
13679
13680         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
13681         if (!hdr) {
13682                 nlmsg_free(msg);
13683                 return;
13684         }
13685
13686         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13687             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13688             nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
13689             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
13690                 goto nla_put_failure;
13691
13692         genlmsg_end(msg, hdr);
13693
13694         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13695                                 NL80211_MCGRP_MLME, gfp);
13696         return;
13697
13698  nla_put_failure:
13699         genlmsg_cancel(msg, hdr);
13700         nlmsg_free(msg);
13701 }
13702
13703 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
13704                                struct net_device *netdev, const u8 *addr,
13705                                gfp_t gfp)
13706 {
13707         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
13708                                   addr, gfp);
13709 }
13710
13711 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
13712                                 struct net_device *netdev, const u8 *addr,
13713                                 gfp_t gfp)
13714 {
13715         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
13716                                   addr, gfp);
13717 }
13718
13719 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
13720                                  struct net_device *netdev,
13721                                  struct cfg80211_connect_resp_params *cr,
13722                                  gfp_t gfp)
13723 {
13724         struct sk_buff *msg;
13725         void *hdr;
13726
13727         msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len +
13728                         cr->fils_kek_len + cr->pmk_len +
13729                         (cr->pmkid ? WLAN_PMKID_LEN : 0), gfp);
13730         if (!msg)
13731                 return;
13732
13733         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
13734         if (!hdr) {
13735                 nlmsg_free(msg);
13736                 return;
13737         }
13738
13739         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13740             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13741             (cr->bssid &&
13742              nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) ||
13743             nla_put_u16(msg, NL80211_ATTR_STATUS_CODE,
13744                         cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE :
13745                         cr->status) ||
13746             (cr->status < 0 &&
13747              (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
13748               nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON,
13749                           cr->timeout_reason))) ||
13750             (cr->req_ie &&
13751              nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) ||
13752             (cr->resp_ie &&
13753              nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len,
13754                      cr->resp_ie)) ||
13755             (cr->update_erp_next_seq_num &&
13756              nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
13757                          cr->fils_erp_next_seq_num)) ||
13758             (cr->status == WLAN_STATUS_SUCCESS &&
13759              ((cr->fils_kek &&
13760                nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils_kek_len,
13761                        cr->fils_kek)) ||
13762               (cr->pmk &&
13763                nla_put(msg, NL80211_ATTR_PMK, cr->pmk_len, cr->pmk)) ||
13764               (cr->pmkid &&
13765                nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->pmkid)))))
13766                 goto nla_put_failure;
13767
13768         genlmsg_end(msg, hdr);
13769
13770         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13771                                 NL80211_MCGRP_MLME, gfp);
13772         return;
13773
13774  nla_put_failure:
13775         genlmsg_cancel(msg, hdr);
13776         nlmsg_free(msg);
13777 }
13778
13779 void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
13780                          struct net_device *netdev,
13781                          struct cfg80211_roam_info *info, gfp_t gfp)
13782 {
13783         struct sk_buff *msg;
13784         void *hdr;
13785         const u8 *bssid = info->bss ? info->bss->bssid : info->bssid;
13786
13787         msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len, gfp);
13788         if (!msg)
13789                 return;
13790
13791         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
13792         if (!hdr) {
13793                 nlmsg_free(msg);
13794                 return;
13795         }
13796
13797         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13798             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13799             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) ||
13800             (info->req_ie &&
13801              nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len,
13802                      info->req_ie)) ||
13803             (info->resp_ie &&
13804              nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len,
13805                      info->resp_ie)) ||
13806             (info->authorized &&
13807              nla_put_flag(msg, NL80211_ATTR_PORT_AUTHORIZED)))
13808                 goto nla_put_failure;
13809
13810         genlmsg_end(msg, hdr);
13811
13812         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13813                                 NL80211_MCGRP_MLME, gfp);
13814         return;
13815
13816  nla_put_failure:
13817         genlmsg_cancel(msg, hdr);
13818         nlmsg_free(msg);
13819 }
13820
13821 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
13822                                struct net_device *netdev, u16 reason,
13823                                const u8 *ie, size_t ie_len, bool from_ap)
13824 {
13825         struct sk_buff *msg;
13826         void *hdr;
13827
13828         msg = nlmsg_new(100 + ie_len, GFP_KERNEL);
13829         if (!msg)
13830                 return;
13831
13832         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
13833         if (!hdr) {
13834                 nlmsg_free(msg);
13835                 return;
13836         }
13837
13838         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13839             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13840             (from_ap && reason &&
13841              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) ||
13842             (from_ap &&
13843              nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) ||
13844             (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie)))
13845                 goto nla_put_failure;
13846
13847         genlmsg_end(msg, hdr);
13848
13849         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13850                                 NL80211_MCGRP_MLME, GFP_KERNEL);
13851         return;
13852
13853  nla_put_failure:
13854         genlmsg_cancel(msg, hdr);
13855         nlmsg_free(msg);
13856 }
13857
13858 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
13859                              struct net_device *netdev, const u8 *bssid,
13860                              gfp_t gfp)
13861 {
13862         struct sk_buff *msg;
13863         void *hdr;
13864
13865         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13866         if (!msg)
13867                 return;
13868
13869         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
13870         if (!hdr) {
13871                 nlmsg_free(msg);
13872                 return;
13873         }
13874
13875         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13876             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13877             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
13878                 goto nla_put_failure;
13879
13880         genlmsg_end(msg, hdr);
13881
13882         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13883                                 NL80211_MCGRP_MLME, gfp);
13884         return;
13885
13886  nla_put_failure:
13887         genlmsg_cancel(msg, hdr);
13888         nlmsg_free(msg);
13889 }
13890
13891 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
13892                                         const u8* ie, u8 ie_len, gfp_t gfp)
13893 {
13894         struct wireless_dev *wdev = dev->ieee80211_ptr;
13895         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
13896         struct sk_buff *msg;
13897         void *hdr;
13898
13899         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
13900                 return;
13901
13902         trace_cfg80211_notify_new_peer_candidate(dev, addr);
13903
13904         msg = nlmsg_new(100 + ie_len, gfp);
13905         if (!msg)
13906                 return;
13907
13908         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
13909         if (!hdr) {
13910                 nlmsg_free(msg);
13911                 return;
13912         }
13913
13914         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13915             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
13916             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
13917             (ie_len && ie &&
13918              nla_put(msg, NL80211_ATTR_IE, ie_len , ie)))
13919                 goto nla_put_failure;
13920
13921         genlmsg_end(msg, hdr);
13922
13923         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13924                                 NL80211_MCGRP_MLME, gfp);
13925         return;
13926
13927  nla_put_failure:
13928         genlmsg_cancel(msg, hdr);
13929         nlmsg_free(msg);
13930 }
13931 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
13932
13933 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
13934                                  struct net_device *netdev, const u8 *addr,
13935                                  enum nl80211_key_type key_type, int key_id,
13936                                  const u8 *tsc, gfp_t gfp)
13937 {
13938         struct sk_buff *msg;
13939         void *hdr;
13940
13941         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13942         if (!msg)
13943                 return;
13944
13945         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
13946         if (!hdr) {
13947                 nlmsg_free(msg);
13948                 return;
13949         }
13950
13951         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13952             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13953             (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) ||
13954             nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) ||
13955             (key_id != -1 &&
13956              nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) ||
13957             (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc)))
13958                 goto nla_put_failure;
13959
13960         genlmsg_end(msg, hdr);
13961
13962         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13963                                 NL80211_MCGRP_MLME, gfp);
13964         return;
13965
13966  nla_put_failure:
13967         genlmsg_cancel(msg, hdr);
13968         nlmsg_free(msg);
13969 }
13970
13971 void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
13972                                     struct ieee80211_channel *channel_before,
13973                                     struct ieee80211_channel *channel_after)
13974 {
13975         struct sk_buff *msg;
13976         void *hdr;
13977         struct nlattr *nl_freq;
13978
13979         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
13980         if (!msg)
13981                 return;
13982
13983         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
13984         if (!hdr) {
13985                 nlmsg_free(msg);
13986                 return;
13987         }
13988
13989         /*
13990          * Since we are applying the beacon hint to a wiphy we know its
13991          * wiphy_idx is valid
13992          */
13993         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
13994                 goto nla_put_failure;
13995
13996         /* Before */
13997         nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_BEFORE);
13998         if (!nl_freq)
13999                 goto nla_put_failure;
14000         if (nl80211_msg_put_channel(msg, channel_before, false))
14001                 goto nla_put_failure;
14002         nla_nest_end(msg, nl_freq);
14003
14004         /* After */
14005         nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_AFTER);
14006         if (!nl_freq)
14007                 goto nla_put_failure;
14008         if (nl80211_msg_put_channel(msg, channel_after, false))
14009                 goto nla_put_failure;
14010         nla_nest_end(msg, nl_freq);
14011
14012         genlmsg_end(msg, hdr);
14013
14014         rcu_read_lock();
14015         genlmsg_multicast_allns(&nl80211_fam, msg, 0,
14016                                 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
14017         rcu_read_unlock();
14018
14019         return;
14020
14021 nla_put_failure:
14022         genlmsg_cancel(msg, hdr);
14023         nlmsg_free(msg);
14024 }
14025
14026 static void nl80211_send_remain_on_chan_event(
14027         int cmd, struct cfg80211_registered_device *rdev,
14028         struct wireless_dev *wdev, u64 cookie,
14029         struct ieee80211_channel *chan,
14030         unsigned int duration, gfp_t gfp)
14031 {
14032         struct sk_buff *msg;
14033         void *hdr;
14034
14035         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14036         if (!msg)
14037                 return;
14038
14039         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
14040         if (!hdr) {
14041                 nlmsg_free(msg);
14042                 return;
14043         }
14044
14045         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14046             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
14047                                          wdev->netdev->ifindex)) ||
14048             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14049                               NL80211_ATTR_PAD) ||
14050             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) ||
14051             nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
14052                         NL80211_CHAN_NO_HT) ||
14053             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
14054                               NL80211_ATTR_PAD))
14055                 goto nla_put_failure;
14056
14057         if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL &&
14058             nla_put_u32(msg, NL80211_ATTR_DURATION, duration))
14059                 goto nla_put_failure;
14060
14061         genlmsg_end(msg, hdr);
14062
14063         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14064                                 NL80211_MCGRP_MLME, gfp);
14065         return;
14066
14067  nla_put_failure:
14068         genlmsg_cancel(msg, hdr);
14069         nlmsg_free(msg);
14070 }
14071
14072 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
14073                                struct ieee80211_channel *chan,
14074                                unsigned int duration, gfp_t gfp)
14075 {
14076         struct wiphy *wiphy = wdev->wiphy;
14077         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14078
14079         trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
14080         nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
14081                                           rdev, wdev, cookie, chan,
14082                                           duration, gfp);
14083 }
14084 EXPORT_SYMBOL(cfg80211_ready_on_channel);
14085
14086 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
14087                                         struct ieee80211_channel *chan,
14088                                         gfp_t gfp)
14089 {
14090         struct wiphy *wiphy = wdev->wiphy;
14091         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14092
14093         trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
14094         nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
14095                                           rdev, wdev, cookie, chan, 0, gfp);
14096 }
14097 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
14098
14099 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
14100                       struct station_info *sinfo, gfp_t gfp)
14101 {
14102         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
14103         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14104         struct sk_buff *msg;
14105
14106         trace_cfg80211_new_sta(dev, mac_addr, sinfo);
14107
14108         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14109         if (!msg)
14110                 return;
14111
14112         if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0,
14113                                  rdev, dev, mac_addr, sinfo) < 0) {
14114                 nlmsg_free(msg);
14115                 return;
14116         }
14117
14118         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14119                                 NL80211_MCGRP_MLME, gfp);
14120 }
14121 EXPORT_SYMBOL(cfg80211_new_sta);
14122
14123 void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
14124                             struct station_info *sinfo, gfp_t gfp)
14125 {
14126         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
14127         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14128         struct sk_buff *msg;
14129         struct station_info empty_sinfo = {};
14130
14131         if (!sinfo)
14132                 sinfo = &empty_sinfo;
14133
14134         trace_cfg80211_del_sta(dev, mac_addr);
14135
14136         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14137         if (!msg)
14138                 return;
14139
14140         if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0,
14141                                  rdev, dev, mac_addr, sinfo) < 0) {
14142                 nlmsg_free(msg);
14143                 return;
14144         }
14145
14146         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14147                                 NL80211_MCGRP_MLME, gfp);
14148 }
14149 EXPORT_SYMBOL(cfg80211_del_sta_sinfo);
14150
14151 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
14152                           enum nl80211_connect_failed_reason reason,
14153                           gfp_t gfp)
14154 {
14155         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
14156         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14157         struct sk_buff *msg;
14158         void *hdr;
14159
14160         msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
14161         if (!msg)
14162                 return;
14163
14164         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
14165         if (!hdr) {
14166                 nlmsg_free(msg);
14167                 return;
14168         }
14169
14170         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
14171             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
14172             nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
14173                 goto nla_put_failure;
14174
14175         genlmsg_end(msg, hdr);
14176
14177         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14178                                 NL80211_MCGRP_MLME, gfp);
14179         return;
14180
14181  nla_put_failure:
14182         genlmsg_cancel(msg, hdr);
14183         nlmsg_free(msg);
14184 }
14185 EXPORT_SYMBOL(cfg80211_conn_failed);
14186
14187 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
14188                                        const u8 *addr, gfp_t gfp)
14189 {
14190         struct wireless_dev *wdev = dev->ieee80211_ptr;
14191         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14192         struct sk_buff *msg;
14193         void *hdr;
14194         u32 nlportid = ACCESS_ONCE(wdev->ap_unexpected_nlportid);
14195
14196         if (!nlportid)
14197                 return false;
14198
14199         msg = nlmsg_new(100, gfp);
14200         if (!msg)
14201                 return true;
14202
14203         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
14204         if (!hdr) {
14205                 nlmsg_free(msg);
14206                 return true;
14207         }
14208
14209         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14210             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
14211             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
14212                 goto nla_put_failure;
14213
14214         genlmsg_end(msg, hdr);
14215         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
14216         return true;
14217
14218  nla_put_failure:
14219         genlmsg_cancel(msg, hdr);
14220         nlmsg_free(msg);
14221         return true;
14222 }
14223
14224 bool cfg80211_rx_spurious_frame(struct net_device *dev,
14225                                 const u8 *addr, gfp_t gfp)
14226 {
14227         struct wireless_dev *wdev = dev->ieee80211_ptr;
14228         bool ret;
14229
14230         trace_cfg80211_rx_spurious_frame(dev, addr);
14231
14232         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
14233                     wdev->iftype != NL80211_IFTYPE_P2P_GO)) {
14234                 trace_cfg80211_return_bool(false);
14235                 return false;
14236         }
14237         ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME,
14238                                          addr, gfp);
14239         trace_cfg80211_return_bool(ret);
14240         return ret;
14241 }
14242 EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
14243
14244 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
14245                                         const u8 *addr, gfp_t gfp)
14246 {
14247         struct wireless_dev *wdev = dev->ieee80211_ptr;
14248         bool ret;
14249
14250         trace_cfg80211_rx_unexpected_4addr_frame(dev, addr);
14251
14252         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
14253                     wdev->iftype != NL80211_IFTYPE_P2P_GO &&
14254                     wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
14255                 trace_cfg80211_return_bool(false);
14256                 return false;
14257         }
14258         ret = __nl80211_unexpected_frame(dev,
14259                                          NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
14260                                          addr, gfp);
14261         trace_cfg80211_return_bool(ret);
14262         return ret;
14263 }
14264 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
14265
14266 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
14267                       struct wireless_dev *wdev, u32 nlportid,
14268                       int freq, int sig_dbm,
14269                       const u8 *buf, size_t len, u32 flags, gfp_t gfp)
14270 {
14271         struct net_device *netdev = wdev->netdev;
14272         struct sk_buff *msg;
14273         void *hdr;
14274
14275         msg = nlmsg_new(100 + len, gfp);
14276         if (!msg)
14277                 return -ENOMEM;
14278
14279         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
14280         if (!hdr) {
14281                 nlmsg_free(msg);
14282                 return -ENOMEM;
14283         }
14284
14285         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14286             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
14287                                         netdev->ifindex)) ||
14288             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14289                               NL80211_ATTR_PAD) ||
14290             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
14291             (sig_dbm &&
14292              nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
14293             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
14294             (flags &&
14295              nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags)))
14296                 goto nla_put_failure;
14297
14298         genlmsg_end(msg, hdr);
14299
14300         return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
14301
14302  nla_put_failure:
14303         genlmsg_cancel(msg, hdr);
14304         nlmsg_free(msg);
14305         return -ENOBUFS;
14306 }
14307
14308 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
14309                              const u8 *buf, size_t len, bool ack, gfp_t gfp)
14310 {
14311         struct wiphy *wiphy = wdev->wiphy;
14312         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14313         struct net_device *netdev = wdev->netdev;
14314         struct sk_buff *msg;
14315         void *hdr;
14316
14317         trace_cfg80211_mgmt_tx_status(wdev, cookie, ack);
14318
14319         msg = nlmsg_new(100 + len, gfp);
14320         if (!msg)
14321                 return;
14322
14323         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS);
14324         if (!hdr) {
14325                 nlmsg_free(msg);
14326                 return;
14327         }
14328
14329         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14330             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
14331                                    netdev->ifindex)) ||
14332             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14333                               NL80211_ATTR_PAD) ||
14334             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
14335             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
14336                               NL80211_ATTR_PAD) ||
14337             (ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
14338                 goto nla_put_failure;
14339
14340         genlmsg_end(msg, hdr);
14341
14342         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14343                                 NL80211_MCGRP_MLME, gfp);
14344         return;
14345
14346  nla_put_failure:
14347         genlmsg_cancel(msg, hdr);
14348         nlmsg_free(msg);
14349 }
14350 EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
14351
14352 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev,
14353                                             const char *mac, gfp_t gfp)
14354 {
14355         struct wireless_dev *wdev = dev->ieee80211_ptr;
14356         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14357         struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14358         void **cb;
14359
14360         if (!msg)
14361                 return NULL;
14362
14363         cb = (void **)msg->cb;
14364
14365         cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
14366         if (!cb[0]) {
14367                 nlmsg_free(msg);
14368                 return NULL;
14369         }
14370
14371         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14372             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
14373                 goto nla_put_failure;
14374
14375         if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
14376                 goto nla_put_failure;
14377
14378         cb[1] = nla_nest_start(msg, NL80211_ATTR_CQM);
14379         if (!cb[1])
14380                 goto nla_put_failure;
14381
14382         cb[2] = rdev;
14383
14384         return msg;
14385  nla_put_failure:
14386         nlmsg_free(msg);
14387         return NULL;
14388 }
14389
14390 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp)
14391 {
14392         void **cb = (void **)msg->cb;
14393         struct cfg80211_registered_device *rdev = cb[2];
14394
14395         nla_nest_end(msg, cb[1]);
14396         genlmsg_end(msg, cb[0]);
14397
14398         memset(msg->cb, 0, sizeof(msg->cb));
14399
14400         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14401                                 NL80211_MCGRP_MLME, gfp);
14402 }
14403
14404 void cfg80211_cqm_rssi_notify(struct net_device *dev,
14405                               enum nl80211_cqm_rssi_threshold_event rssi_event,
14406                               s32 rssi_level, gfp_t gfp)
14407 {
14408         struct sk_buff *msg;
14409         struct wireless_dev *wdev = dev->ieee80211_ptr;
14410         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14411
14412         trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level);
14413
14414         if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
14415                     rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
14416                 return;
14417
14418         if (wdev->cqm_config) {
14419                 wdev->cqm_config->last_rssi_event_value = rssi_level;
14420
14421                 cfg80211_cqm_rssi_update(rdev, dev);
14422
14423                 if (rssi_level == 0)
14424                         rssi_level = wdev->cqm_config->last_rssi_event_value;
14425         }
14426
14427         msg = cfg80211_prepare_cqm(dev, NULL, gfp);
14428         if (!msg)
14429                 return;
14430
14431         if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
14432                         rssi_event))
14433                 goto nla_put_failure;
14434
14435         if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL,
14436                                       rssi_level))
14437                 goto nla_put_failure;
14438
14439         cfg80211_send_cqm(msg, gfp);
14440
14441         return;
14442
14443  nla_put_failure:
14444         nlmsg_free(msg);
14445 }
14446 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
14447
14448 void cfg80211_cqm_txe_notify(struct net_device *dev,
14449                              const u8 *peer, u32 num_packets,
14450                              u32 rate, u32 intvl, gfp_t gfp)
14451 {
14452         struct sk_buff *msg;
14453
14454         msg = cfg80211_prepare_cqm(dev, peer, gfp);
14455         if (!msg)
14456                 return;
14457
14458         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets))
14459                 goto nla_put_failure;
14460
14461         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate))
14462                 goto nla_put_failure;
14463
14464         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl))
14465                 goto nla_put_failure;
14466
14467         cfg80211_send_cqm(msg, gfp);
14468         return;
14469
14470  nla_put_failure:
14471         nlmsg_free(msg);
14472 }
14473 EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
14474
14475 void cfg80211_cqm_pktloss_notify(struct net_device *dev,
14476                                  const u8 *peer, u32 num_packets, gfp_t gfp)
14477 {
14478         struct sk_buff *msg;
14479
14480         trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
14481
14482         msg = cfg80211_prepare_cqm(dev, peer, gfp);
14483         if (!msg)
14484                 return;
14485
14486         if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets))
14487                 goto nla_put_failure;
14488
14489         cfg80211_send_cqm(msg, gfp);
14490         return;
14491
14492  nla_put_failure:
14493         nlmsg_free(msg);
14494 }
14495 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
14496
14497 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp)
14498 {
14499         struct sk_buff *msg;
14500
14501         msg = cfg80211_prepare_cqm(dev, NULL, gfp);
14502         if (!msg)
14503                 return;
14504
14505         if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT))
14506                 goto nla_put_failure;
14507
14508         cfg80211_send_cqm(msg, gfp);
14509         return;
14510
14511  nla_put_failure:
14512         nlmsg_free(msg);
14513 }
14514 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify);
14515
14516 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
14517                                      struct net_device *netdev, const u8 *bssid,
14518                                      const u8 *replay_ctr, gfp_t gfp)
14519 {
14520         struct sk_buff *msg;
14521         struct nlattr *rekey_attr;
14522         void *hdr;
14523
14524         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14525         if (!msg)
14526                 return;
14527
14528         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD);
14529         if (!hdr) {
14530                 nlmsg_free(msg);
14531                 return;
14532         }
14533
14534         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14535             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
14536             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
14537                 goto nla_put_failure;
14538
14539         rekey_attr = nla_nest_start(msg, NL80211_ATTR_REKEY_DATA);
14540         if (!rekey_attr)
14541                 goto nla_put_failure;
14542
14543         if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR,
14544                     NL80211_REPLAY_CTR_LEN, replay_ctr))
14545                 goto nla_put_failure;
14546
14547         nla_nest_end(msg, rekey_attr);
14548
14549         genlmsg_end(msg, hdr);
14550
14551         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14552                                 NL80211_MCGRP_MLME, gfp);
14553         return;
14554
14555  nla_put_failure:
14556         genlmsg_cancel(msg, hdr);
14557         nlmsg_free(msg);
14558 }
14559
14560 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
14561                                const u8 *replay_ctr, gfp_t gfp)
14562 {
14563         struct wireless_dev *wdev = dev->ieee80211_ptr;
14564         struct wiphy *wiphy = wdev->wiphy;
14565         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14566
14567         trace_cfg80211_gtk_rekey_notify(dev, bssid);
14568         nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
14569 }
14570 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
14571
14572 static void
14573 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
14574                                struct net_device *netdev, int index,
14575                                const u8 *bssid, bool preauth, gfp_t gfp)
14576 {
14577         struct sk_buff *msg;
14578         struct nlattr *attr;
14579         void *hdr;
14580
14581         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14582         if (!msg)
14583                 return;
14584
14585         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE);
14586         if (!hdr) {
14587                 nlmsg_free(msg);
14588                 return;
14589         }
14590
14591         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14592             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
14593                 goto nla_put_failure;
14594
14595         attr = nla_nest_start(msg, NL80211_ATTR_PMKSA_CANDIDATE);
14596         if (!attr)
14597                 goto nla_put_failure;
14598
14599         if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) ||
14600             nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) ||
14601             (preauth &&
14602              nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH)))
14603                 goto nla_put_failure;
14604
14605         nla_nest_end(msg, attr);
14606
14607         genlmsg_end(msg, hdr);
14608
14609         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14610                                 NL80211_MCGRP_MLME, gfp);
14611         return;
14612
14613  nla_put_failure:
14614         genlmsg_cancel(msg, hdr);
14615         nlmsg_free(msg);
14616 }
14617
14618 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
14619                                      const u8 *bssid, bool preauth, gfp_t gfp)
14620 {
14621         struct wireless_dev *wdev = dev->ieee80211_ptr;
14622         struct wiphy *wiphy = wdev->wiphy;
14623         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14624
14625         trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
14626         nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
14627 }
14628 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
14629
14630 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
14631                                      struct net_device *netdev,
14632                                      struct cfg80211_chan_def *chandef,
14633                                      gfp_t gfp,
14634                                      enum nl80211_commands notif,
14635                                      u8 count)
14636 {
14637         struct sk_buff *msg;
14638         void *hdr;
14639
14640         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14641         if (!msg)
14642                 return;
14643
14644         hdr = nl80211hdr_put(msg, 0, 0, 0, notif);
14645         if (!hdr) {
14646                 nlmsg_free(msg);
14647                 return;
14648         }
14649
14650         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
14651                 goto nla_put_failure;
14652
14653         if (nl80211_send_chandef(msg, chandef))
14654                 goto nla_put_failure;
14655
14656         if ((notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) &&
14657             (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)))
14658                         goto nla_put_failure;
14659
14660         genlmsg_end(msg, hdr);
14661
14662         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14663                                 NL80211_MCGRP_MLME, gfp);
14664         return;
14665
14666  nla_put_failure:
14667         genlmsg_cancel(msg, hdr);
14668         nlmsg_free(msg);
14669 }
14670
14671 void cfg80211_ch_switch_notify(struct net_device *dev,
14672                                struct cfg80211_chan_def *chandef)
14673 {
14674         struct wireless_dev *wdev = dev->ieee80211_ptr;
14675         struct wiphy *wiphy = wdev->wiphy;
14676         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14677
14678         ASSERT_WDEV_LOCK(wdev);
14679
14680         trace_cfg80211_ch_switch_notify(dev, chandef);
14681
14682         wdev->chandef = *chandef;
14683         wdev->preset_chandef = *chandef;
14684         nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
14685                                  NL80211_CMD_CH_SWITCH_NOTIFY, 0);
14686 }
14687 EXPORT_SYMBOL(cfg80211_ch_switch_notify);
14688
14689 void cfg80211_ch_switch_started_notify(struct net_device *dev,
14690                                        struct cfg80211_chan_def *chandef,
14691                                        u8 count)
14692 {
14693         struct wireless_dev *wdev = dev->ieee80211_ptr;
14694         struct wiphy *wiphy = wdev->wiphy;
14695         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14696
14697         trace_cfg80211_ch_switch_started_notify(dev, chandef);
14698
14699         nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
14700                                  NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, count);
14701 }
14702 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
14703
14704 void
14705 nl80211_radar_notify(struct cfg80211_registered_device *rdev,
14706                      const struct cfg80211_chan_def *chandef,
14707                      enum nl80211_radar_event event,
14708                      struct net_device *netdev, gfp_t gfp)
14709 {
14710         struct sk_buff *msg;
14711         void *hdr;
14712
14713         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14714         if (!msg)
14715                 return;
14716
14717         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT);
14718         if (!hdr) {
14719                 nlmsg_free(msg);
14720                 return;
14721         }
14722
14723         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
14724                 goto nla_put_failure;
14725
14726         /* NOP and radar events don't need a netdev parameter */
14727         if (netdev) {
14728                 struct wireless_dev *wdev = netdev->ieee80211_ptr;
14729
14730                 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
14731                     nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14732                                       NL80211_ATTR_PAD))
14733                         goto nla_put_failure;
14734         }
14735
14736         if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
14737                 goto nla_put_failure;
14738
14739         if (nl80211_send_chandef(msg, chandef))
14740                 goto nla_put_failure;
14741
14742         genlmsg_end(msg, hdr);
14743
14744         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14745                                 NL80211_MCGRP_MLME, gfp);
14746         return;
14747
14748  nla_put_failure:
14749         genlmsg_cancel(msg, hdr);
14750         nlmsg_free(msg);
14751 }
14752
14753 void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
14754                            u64 cookie, bool acked, gfp_t gfp)
14755 {
14756         struct wireless_dev *wdev = dev->ieee80211_ptr;
14757         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14758         struct sk_buff *msg;
14759         void *hdr;
14760
14761         trace_cfg80211_probe_status(dev, addr, cookie, acked);
14762
14763         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14764
14765         if (!msg)
14766                 return;
14767
14768         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT);
14769         if (!hdr) {
14770                 nlmsg_free(msg);
14771                 return;
14772         }
14773
14774         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14775             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
14776             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
14777             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
14778                               NL80211_ATTR_PAD) ||
14779             (acked && nla_put_flag(msg, NL80211_ATTR_ACK)))
14780                 goto nla_put_failure;
14781
14782         genlmsg_end(msg, hdr);
14783
14784         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14785                                 NL80211_MCGRP_MLME, gfp);
14786         return;
14787
14788  nla_put_failure:
14789         genlmsg_cancel(msg, hdr);
14790         nlmsg_free(msg);
14791 }
14792 EXPORT_SYMBOL(cfg80211_probe_status);
14793
14794 void cfg80211_report_obss_beacon(struct wiphy *wiphy,
14795                                  const u8 *frame, size_t len,
14796                                  int freq, int sig_dbm)
14797 {
14798         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14799         struct sk_buff *msg;
14800         void *hdr;
14801         struct cfg80211_beacon_registration *reg;
14802
14803         trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm);
14804
14805         spin_lock_bh(&rdev->beacon_registrations_lock);
14806         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
14807                 msg = nlmsg_new(len + 100, GFP_ATOMIC);
14808                 if (!msg) {
14809                         spin_unlock_bh(&rdev->beacon_registrations_lock);
14810                         return;
14811                 }
14812
14813                 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
14814                 if (!hdr)
14815                         goto nla_put_failure;
14816
14817                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14818                     (freq &&
14819                      nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq)) ||
14820                     (sig_dbm &&
14821                      nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
14822                     nla_put(msg, NL80211_ATTR_FRAME, len, frame))
14823                         goto nla_put_failure;
14824
14825                 genlmsg_end(msg, hdr);
14826
14827                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid);
14828         }
14829         spin_unlock_bh(&rdev->beacon_registrations_lock);
14830         return;
14831
14832  nla_put_failure:
14833         spin_unlock_bh(&rdev->beacon_registrations_lock);
14834         if (hdr)
14835                 genlmsg_cancel(msg, hdr);
14836         nlmsg_free(msg);
14837 }
14838 EXPORT_SYMBOL(cfg80211_report_obss_beacon);
14839
14840 #ifdef CONFIG_PM
14841 static int cfg80211_net_detect_results(struct sk_buff *msg,
14842                                        struct cfg80211_wowlan_wakeup *wakeup)
14843 {
14844         struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect;
14845         struct nlattr *nl_results, *nl_match, *nl_freqs;
14846         int i, j;
14847
14848         nl_results = nla_nest_start(
14849                 msg, NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS);
14850         if (!nl_results)
14851                 return -EMSGSIZE;
14852
14853         for (i = 0; i < nd->n_matches; i++) {
14854                 struct cfg80211_wowlan_nd_match *match = nd->matches[i];
14855
14856                 nl_match = nla_nest_start(msg, i);
14857                 if (!nl_match)
14858                         break;
14859
14860                 /* The SSID attribute is optional in nl80211, but for
14861                  * simplicity reasons it's always present in the
14862                  * cfg80211 structure.  If a driver can't pass the
14863                  * SSID, that needs to be changed.  A zero length SSID
14864                  * is still a valid SSID (wildcard), so it cannot be
14865                  * used for this purpose.
14866                  */
14867                 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len,
14868                             match->ssid.ssid)) {
14869                         nla_nest_cancel(msg, nl_match);
14870                         goto out;
14871                 }
14872
14873                 if (match->n_channels) {
14874                         nl_freqs = nla_nest_start(
14875                                 msg, NL80211_ATTR_SCAN_FREQUENCIES);
14876                         if (!nl_freqs) {
14877                                 nla_nest_cancel(msg, nl_match);
14878                                 goto out;
14879                         }
14880
14881                         for (j = 0; j < match->n_channels; j++) {
14882                                 if (nla_put_u32(msg, j, match->channels[j])) {
14883                                         nla_nest_cancel(msg, nl_freqs);
14884                                         nla_nest_cancel(msg, nl_match);
14885                                         goto out;
14886                                 }
14887                         }
14888
14889                         nla_nest_end(msg, nl_freqs);
14890                 }
14891
14892                 nla_nest_end(msg, nl_match);
14893         }
14894
14895 out:
14896         nla_nest_end(msg, nl_results);
14897         return 0;
14898 }
14899
14900 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
14901                                    struct cfg80211_wowlan_wakeup *wakeup,
14902                                    gfp_t gfp)
14903 {
14904         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14905         struct sk_buff *msg;
14906         void *hdr;
14907         int size = 200;
14908
14909         trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup);
14910
14911         if (wakeup)
14912                 size += wakeup->packet_present_len;
14913
14914         msg = nlmsg_new(size, gfp);
14915         if (!msg)
14916                 return;
14917
14918         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN);
14919         if (!hdr)
14920                 goto free_msg;
14921
14922         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14923             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14924                               NL80211_ATTR_PAD))
14925                 goto free_msg;
14926
14927         if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
14928                                         wdev->netdev->ifindex))
14929                 goto free_msg;
14930
14931         if (wakeup) {
14932                 struct nlattr *reasons;
14933
14934                 reasons = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
14935                 if (!reasons)
14936                         goto free_msg;
14937
14938                 if (wakeup->disconnect &&
14939                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT))
14940                         goto free_msg;
14941                 if (wakeup->magic_pkt &&
14942                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT))
14943                         goto free_msg;
14944                 if (wakeup->gtk_rekey_failure &&
14945                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE))
14946                         goto free_msg;
14947                 if (wakeup->eap_identity_req &&
14948                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST))
14949                         goto free_msg;
14950                 if (wakeup->four_way_handshake &&
14951                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE))
14952                         goto free_msg;
14953                 if (wakeup->rfkill_release &&
14954                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))
14955                         goto free_msg;
14956
14957                 if (wakeup->pattern_idx >= 0 &&
14958                     nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
14959                                 wakeup->pattern_idx))
14960                         goto free_msg;
14961
14962                 if (wakeup->tcp_match &&
14963                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH))
14964                         goto free_msg;
14965
14966                 if (wakeup->tcp_connlost &&
14967                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST))
14968                         goto free_msg;
14969
14970                 if (wakeup->tcp_nomoretokens &&
14971                     nla_put_flag(msg,
14972                                  NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS))
14973                         goto free_msg;
14974
14975                 if (wakeup->packet) {
14976                         u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211;
14977                         u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN;
14978
14979                         if (!wakeup->packet_80211) {
14980                                 pkt_attr =
14981                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023;
14982                                 len_attr =
14983                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN;
14984                         }
14985
14986                         if (wakeup->packet_len &&
14987                             nla_put_u32(msg, len_attr, wakeup->packet_len))
14988                                 goto free_msg;
14989
14990                         if (nla_put(msg, pkt_attr, wakeup->packet_present_len,
14991                                     wakeup->packet))
14992                                 goto free_msg;
14993                 }
14994
14995                 if (wakeup->net_detect &&
14996                     cfg80211_net_detect_results(msg, wakeup))
14997                                 goto free_msg;
14998
14999                 nla_nest_end(msg, reasons);
15000         }
15001
15002         genlmsg_end(msg, hdr);
15003
15004         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15005                                 NL80211_MCGRP_MLME, gfp);
15006         return;
15007
15008  free_msg:
15009         nlmsg_free(msg);
15010 }
15011 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup);
15012 #endif
15013
15014 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
15015                                 enum nl80211_tdls_operation oper,
15016                                 u16 reason_code, gfp_t gfp)
15017 {
15018         struct wireless_dev *wdev = dev->ieee80211_ptr;
15019         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
15020         struct sk_buff *msg;
15021         void *hdr;
15022
15023         trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper,
15024                                          reason_code);
15025
15026         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15027         if (!msg)
15028                 return;
15029
15030         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER);
15031         if (!hdr) {
15032                 nlmsg_free(msg);
15033                 return;
15034         }
15035
15036         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15037             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
15038             nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) ||
15039             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) ||
15040             (reason_code > 0 &&
15041              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code)))
15042                 goto nla_put_failure;
15043
15044         genlmsg_end(msg, hdr);
15045
15046         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15047                                 NL80211_MCGRP_MLME, gfp);
15048         return;
15049
15050  nla_put_failure:
15051         genlmsg_cancel(msg, hdr);
15052         nlmsg_free(msg);
15053 }
15054 EXPORT_SYMBOL(cfg80211_tdls_oper_request);
15055
15056 static int nl80211_netlink_notify(struct notifier_block * nb,
15057                                   unsigned long state,
15058                                   void *_notify)
15059 {
15060         struct netlink_notify *notify = _notify;
15061         struct cfg80211_registered_device *rdev;
15062         struct wireless_dev *wdev;
15063         struct cfg80211_beacon_registration *reg, *tmp;
15064
15065         if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC)
15066                 return NOTIFY_DONE;
15067
15068         rcu_read_lock();
15069
15070         list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
15071                 struct cfg80211_sched_scan_request *sched_scan_req;
15072
15073                 list_for_each_entry_rcu(sched_scan_req,
15074                                         &rdev->sched_scan_req_list,
15075                                         list) {
15076                         if (sched_scan_req->owner_nlportid == notify->portid) {
15077                                 sched_scan_req->nl_owner_dead = true;
15078                                 schedule_work(&rdev->sched_scan_stop_wk);
15079                         }
15080                 }
15081
15082                 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) {
15083                         cfg80211_mlme_unregister_socket(wdev, notify->portid);
15084
15085                         if (wdev->owner_nlportid == notify->portid) {
15086                                 wdev->nl_owner_dead = true;
15087                                 schedule_work(&rdev->destroy_work);
15088                         } else if (wdev->conn_owner_nlportid == notify->portid) {
15089                                 schedule_work(&wdev->disconnect_wk);
15090                         }
15091                 }
15092
15093                 spin_lock_bh(&rdev->beacon_registrations_lock);
15094                 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations,
15095                                          list) {
15096                         if (reg->nlportid == notify->portid) {
15097                                 list_del(&reg->list);
15098                                 kfree(reg);
15099                                 break;
15100                         }
15101                 }
15102                 spin_unlock_bh(&rdev->beacon_registrations_lock);
15103         }
15104
15105         rcu_read_unlock();
15106
15107         /*
15108          * It is possible that the user space process that is controlling the
15109          * indoor setting disappeared, so notify the regulatory core.
15110          */
15111         regulatory_netlink_notify(notify->portid);
15112         return NOTIFY_OK;
15113 }
15114
15115 static struct notifier_block nl80211_netlink_notifier = {
15116         .notifier_call = nl80211_netlink_notify,
15117 };
15118
15119 void cfg80211_ft_event(struct net_device *netdev,
15120                        struct cfg80211_ft_event_params *ft_event)
15121 {
15122         struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
15123         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15124         struct sk_buff *msg;
15125         void *hdr;
15126
15127         trace_cfg80211_ft_event(wiphy, netdev, ft_event);
15128
15129         if (!ft_event->target_ap)
15130                 return;
15131
15132         msg = nlmsg_new(100 + ft_event->ric_ies_len, GFP_KERNEL);
15133         if (!msg)
15134                 return;
15135
15136         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT);
15137         if (!hdr)
15138                 goto out;
15139
15140         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15141             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
15142             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap))
15143                 goto out;
15144
15145         if (ft_event->ies &&
15146             nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies))
15147                 goto out;
15148         if (ft_event->ric_ies &&
15149             nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len,
15150                     ft_event->ric_ies))
15151                 goto out;
15152
15153         genlmsg_end(msg, hdr);
15154
15155         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15156                                 NL80211_MCGRP_MLME, GFP_KERNEL);
15157         return;
15158  out:
15159         nlmsg_free(msg);
15160 }
15161 EXPORT_SYMBOL(cfg80211_ft_event);
15162
15163 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp)
15164 {
15165         struct cfg80211_registered_device *rdev;
15166         struct sk_buff *msg;
15167         void *hdr;
15168         u32 nlportid;
15169
15170         rdev = wiphy_to_rdev(wdev->wiphy);
15171         if (!rdev->crit_proto_nlportid)
15172                 return;
15173
15174         nlportid = rdev->crit_proto_nlportid;
15175         rdev->crit_proto_nlportid = 0;
15176
15177         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15178         if (!msg)
15179                 return;
15180
15181         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP);
15182         if (!hdr)
15183                 goto nla_put_failure;
15184
15185         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15186             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
15187                               NL80211_ATTR_PAD))
15188                 goto nla_put_failure;
15189
15190         genlmsg_end(msg, hdr);
15191
15192         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
15193         return;
15194
15195  nla_put_failure:
15196         if (hdr)
15197                 genlmsg_cancel(msg, hdr);
15198         nlmsg_free(msg);
15199 }
15200 EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
15201
15202 void nl80211_send_ap_stopped(struct wireless_dev *wdev)
15203 {
15204         struct wiphy *wiphy = wdev->wiphy;
15205         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15206         struct sk_buff *msg;
15207         void *hdr;
15208
15209         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
15210         if (!msg)
15211                 return;
15212
15213         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP);
15214         if (!hdr)
15215                 goto out;
15216
15217         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15218             nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) ||
15219             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
15220                               NL80211_ATTR_PAD))
15221                 goto out;
15222
15223         genlmsg_end(msg, hdr);
15224
15225         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
15226                                 NL80211_MCGRP_MLME, GFP_KERNEL);
15227         return;
15228  out:
15229         nlmsg_free(msg);
15230 }
15231
15232 /* initialisation/exit functions */
15233
15234 int __init nl80211_init(void)
15235 {
15236         int err;
15237
15238         err = genl_register_family(&nl80211_fam);
15239         if (err)
15240                 return err;
15241
15242         err = netlink_register_notifier(&nl80211_netlink_notifier);
15243         if (err)
15244                 goto err_out;
15245
15246         return 0;
15247  err_out:
15248         genl_unregister_family(&nl80211_fam);
15249         return err;
15250 }
15251
15252 void nl80211_exit(void)
15253 {
15254         netlink_unregister_notifier(&nl80211_netlink_notifier);
15255         genl_unregister_family(&nl80211_fam);
15256 }