]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - net/wireless/nl80211.c
Merge tag 'for-4.13/dm-changes' of git://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.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] = { .type = NLA_BINARY,
295                                  .len = WLAN_PMKID_LEN },
296         [NL80211_ATTR_DURATION] = { .type = NLA_U32 },
297         [NL80211_ATTR_COOKIE] = { .type = NLA_U64 },
298         [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED },
299         [NL80211_ATTR_FRAME] = { .type = NLA_BINARY,
300                                  .len = IEEE80211_MAX_DATA_LEN },
301         [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, },
302         [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 },
303         [NL80211_ATTR_CQM] = { .type = NLA_NESTED, },
304         [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG },
305         [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 },
306         [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
307         [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
308         [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
309         [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 },
310         [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 },
311         [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 },
312         [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG },
313         [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
314         [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED },
315         [NL80211_ATTR_STA_PLINK_STATE] = { .type = NLA_U8 },
316         [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 },
317         [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED },
318         [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED },
319         [NL80211_ATTR_HIDDEN_SSID] = { .type = NLA_U32 },
320         [NL80211_ATTR_IE_PROBE_RESP] = { .type = NLA_BINARY,
321                                          .len = IEEE80211_MAX_DATA_LEN },
322         [NL80211_ATTR_IE_ASSOC_RESP] = { .type = NLA_BINARY,
323                                          .len = IEEE80211_MAX_DATA_LEN },
324         [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG },
325         [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED },
326         [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG },
327         [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 },
328         [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 },
329         [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 },
330         [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG },
331         [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG },
332         [NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG },
333         [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
334         [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
335                                       .len = IEEE80211_MAX_DATA_LEN },
336         [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 },
337         [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG },
338         [NL80211_ATTR_HT_CAPABILITY_MASK] = {
339                 .len = NL80211_HT_CAPABILITY_LEN
340         },
341         [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 },
342         [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 },
343         [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 },
344         [NL80211_ATTR_WDEV] = { .type = NLA_U64 },
345         [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 },
346         [NL80211_ATTR_AUTH_DATA] = { .type = NLA_BINARY, },
347         [NL80211_ATTR_VHT_CAPABILITY] = { .len = NL80211_VHT_CAPABILITY_LEN },
348         [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
349         [NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 },
350         [NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 },
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] = { .type = NLA_BINARY,
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->beacon_ies_len;
3795         const u8 *ies = bcn->beacon_ies;
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                 n_channels++;
6474                 /*
6475                  * Some hardware has a limited channel list for
6476                  * scanning, and it is pretty much nonsensical
6477                  * to scan for a channel twice, so disallow that
6478                  * and don't require drivers to check that the
6479                  * channel list they get isn't longer than what
6480                  * they can scan, as long as they can scan all
6481                  * the channels they registered at once.
6482                  */
6483                 nla_for_each_nested(attr2, freqs, tmp2)
6484                         if (attr1 != attr2 &&
6485                             nla_get_u32(attr1) == nla_get_u32(attr2))
6486                                 return 0;
6487         }
6488
6489         return n_channels;
6490 }
6491
6492 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b)
6493 {
6494         return b < NUM_NL80211_BANDS && wiphy->bands[b];
6495 }
6496
6497 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy,
6498                             struct cfg80211_bss_selection *bss_select)
6499 {
6500         struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1];
6501         struct nlattr *nest;
6502         int err;
6503         bool found = false;
6504         int i;
6505
6506         /* only process one nested attribute */
6507         nest = nla_data(nla);
6508         if (!nla_ok(nest, nla_len(nest)))
6509                 return -EINVAL;
6510
6511         err = nla_parse_nested(attr, NL80211_BSS_SELECT_ATTR_MAX, nest,
6512                                nl80211_bss_select_policy, NULL);
6513         if (err)
6514                 return err;
6515
6516         /* only one attribute may be given */
6517         for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) {
6518                 if (attr[i]) {
6519                         if (found)
6520                                 return -EINVAL;
6521                         found = true;
6522                 }
6523         }
6524
6525         bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID;
6526
6527         if (attr[NL80211_BSS_SELECT_ATTR_RSSI])
6528                 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI;
6529
6530         if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) {
6531                 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF;
6532                 bss_select->param.band_pref =
6533                         nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]);
6534                 if (!is_band_valid(wiphy, bss_select->param.band_pref))
6535                         return -EINVAL;
6536         }
6537
6538         if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) {
6539                 struct nl80211_bss_select_rssi_adjust *adj_param;
6540
6541                 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]);
6542                 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST;
6543                 bss_select->param.adjust.band = adj_param->band;
6544                 bss_select->param.adjust.delta = adj_param->delta;
6545                 if (!is_band_valid(wiphy, bss_select->param.adjust.band))
6546                         return -EINVAL;
6547         }
6548
6549         /* user-space did not provide behaviour attribute */
6550         if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID)
6551                 return -EINVAL;
6552
6553         if (!(wiphy->bss_select_support & BIT(bss_select->behaviour)))
6554                 return -EINVAL;
6555
6556         return 0;
6557 }
6558
6559 static int nl80211_parse_random_mac(struct nlattr **attrs,
6560                                     u8 *mac_addr, u8 *mac_addr_mask)
6561 {
6562         int i;
6563
6564         if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) {
6565                 eth_zero_addr(mac_addr);
6566                 eth_zero_addr(mac_addr_mask);
6567                 mac_addr[0] = 0x2;
6568                 mac_addr_mask[0] = 0x3;
6569
6570                 return 0;
6571         }
6572
6573         /* need both or none */
6574         if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK])
6575                 return -EINVAL;
6576
6577         memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN);
6578         memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN);
6579
6580         /* don't allow or configure an mcast address */
6581         if (!is_multicast_ether_addr(mac_addr_mask) ||
6582             is_multicast_ether_addr(mac_addr))
6583                 return -EINVAL;
6584
6585         /*
6586          * allow users to pass a MAC address that has bits set outside
6587          * of the mask, but don't bother drivers with having to deal
6588          * with such bits
6589          */
6590         for (i = 0; i < ETH_ALEN; i++)
6591                 mac_addr[i] &= mac_addr_mask[i];
6592
6593         return 0;
6594 }
6595
6596 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev)
6597 {
6598         ASSERT_WDEV_LOCK(wdev);
6599
6600         if (!cfg80211_beaconing_iface_active(wdev))
6601                 return true;
6602
6603         if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR))
6604                 return true;
6605
6606         return regulatory_pre_cac_allowed(wdev->wiphy);
6607 }
6608
6609 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
6610 {
6611         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6612         struct wireless_dev *wdev = info->user_ptr[1];
6613         struct cfg80211_scan_request *request;
6614         struct nlattr *attr;
6615         struct wiphy *wiphy;
6616         int err, tmp, n_ssids = 0, n_channels, i;
6617         size_t ie_len;
6618
6619         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6620                 return -EINVAL;
6621
6622         wiphy = &rdev->wiphy;
6623
6624         if (wdev->iftype == NL80211_IFTYPE_NAN)
6625                 return -EOPNOTSUPP;
6626
6627         if (!rdev->ops->scan)
6628                 return -EOPNOTSUPP;
6629
6630         if (rdev->scan_req || rdev->scan_msg) {
6631                 err = -EBUSY;
6632                 goto unlock;
6633         }
6634
6635         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
6636                 n_channels = validate_scan_freqs(
6637                                 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
6638                 if (!n_channels) {
6639                         err = -EINVAL;
6640                         goto unlock;
6641                 }
6642         } else {
6643                 n_channels = ieee80211_get_num_supported_channels(wiphy);
6644         }
6645
6646         if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
6647                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
6648                         n_ssids++;
6649
6650         if (n_ssids > wiphy->max_scan_ssids) {
6651                 err = -EINVAL;
6652                 goto unlock;
6653         }
6654
6655         if (info->attrs[NL80211_ATTR_IE])
6656                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6657         else
6658                 ie_len = 0;
6659
6660         if (ie_len > wiphy->max_scan_ie_len) {
6661                 err = -EINVAL;
6662                 goto unlock;
6663         }
6664
6665         request = kzalloc(sizeof(*request)
6666                         + sizeof(*request->ssids) * n_ssids
6667                         + sizeof(*request->channels) * n_channels
6668                         + ie_len, GFP_KERNEL);
6669         if (!request) {
6670                 err = -ENOMEM;
6671                 goto unlock;
6672         }
6673
6674         if (n_ssids)
6675                 request->ssids = (void *)&request->channels[n_channels];
6676         request->n_ssids = n_ssids;
6677         if (ie_len) {
6678                 if (n_ssids)
6679                         request->ie = (void *)(request->ssids + n_ssids);
6680                 else
6681                         request->ie = (void *)(request->channels + n_channels);
6682         }
6683
6684         i = 0;
6685         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
6686                 /* user specified, bail out if channel not found */
6687                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) {
6688                         struct ieee80211_channel *chan;
6689
6690                         chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
6691
6692                         if (!chan) {
6693                                 err = -EINVAL;
6694                                 goto out_free;
6695                         }
6696
6697                         /* ignore disabled channels */
6698                         if (chan->flags & IEEE80211_CHAN_DISABLED)
6699                                 continue;
6700
6701                         request->channels[i] = chan;
6702                         i++;
6703                 }
6704         } else {
6705                 enum nl80211_band band;
6706
6707                 /* all channels */
6708                 for (band = 0; band < NUM_NL80211_BANDS; band++) {
6709                         int j;
6710
6711                         if (!wiphy->bands[band])
6712                                 continue;
6713                         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
6714                                 struct ieee80211_channel *chan;
6715
6716                                 chan = &wiphy->bands[band]->channels[j];
6717
6718                                 if (chan->flags & IEEE80211_CHAN_DISABLED)
6719                                         continue;
6720
6721                                 request->channels[i] = chan;
6722                                 i++;
6723                         }
6724                 }
6725         }
6726
6727         if (!i) {
6728                 err = -EINVAL;
6729                 goto out_free;
6730         }
6731
6732         request->n_channels = i;
6733
6734         wdev_lock(wdev);
6735         if (!cfg80211_off_channel_oper_allowed(wdev)) {
6736                 struct ieee80211_channel *chan;
6737
6738                 if (request->n_channels != 1) {
6739                         wdev_unlock(wdev);
6740                         err = -EBUSY;
6741                         goto out_free;
6742                 }
6743
6744                 chan = request->channels[0];
6745                 if (chan->center_freq != wdev->chandef.chan->center_freq) {
6746                         wdev_unlock(wdev);
6747                         err = -EBUSY;
6748                         goto out_free;
6749                 }
6750         }
6751         wdev_unlock(wdev);
6752
6753         i = 0;
6754         if (n_ssids) {
6755                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
6756                         if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
6757                                 err = -EINVAL;
6758                                 goto out_free;
6759                         }
6760                         request->ssids[i].ssid_len = nla_len(attr);
6761                         memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
6762                         i++;
6763                 }
6764         }
6765
6766         if (info->attrs[NL80211_ATTR_IE]) {
6767                 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6768                 memcpy((void *)request->ie,
6769                        nla_data(info->attrs[NL80211_ATTR_IE]),
6770                        request->ie_len);
6771         }
6772
6773         for (i = 0; i < NUM_NL80211_BANDS; i++)
6774                 if (wiphy->bands[i])
6775                         request->rates[i] =
6776                                 (1 << wiphy->bands[i]->n_bitrates) - 1;
6777
6778         if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) {
6779                 nla_for_each_nested(attr,
6780                                     info->attrs[NL80211_ATTR_SCAN_SUPP_RATES],
6781                                     tmp) {
6782                         enum nl80211_band band = nla_type(attr);
6783
6784                         if (band < 0 || band >= NUM_NL80211_BANDS) {
6785                                 err = -EINVAL;
6786                                 goto out_free;
6787                         }
6788
6789                         if (!wiphy->bands[band])
6790                                 continue;
6791
6792                         err = ieee80211_get_ratemask(wiphy->bands[band],
6793                                                      nla_data(attr),
6794                                                      nla_len(attr),
6795                                                      &request->rates[band]);
6796                         if (err)
6797                                 goto out_free;
6798                 }
6799         }
6800
6801         if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) {
6802                 if (!wiphy_ext_feature_isset(wiphy,
6803                                         NL80211_EXT_FEATURE_SET_SCAN_DWELL)) {
6804                         err = -EOPNOTSUPP;
6805                         goto out_free;
6806                 }
6807
6808                 request->duration =
6809                         nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]);
6810                 request->duration_mandatory =
6811                         nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]);
6812         }
6813
6814         if (info->attrs[NL80211_ATTR_SCAN_FLAGS]) {
6815                 request->flags = nla_get_u32(
6816                         info->attrs[NL80211_ATTR_SCAN_FLAGS]);
6817                 if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
6818                     !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) {
6819                         err = -EOPNOTSUPP;
6820                         goto out_free;
6821                 }
6822
6823                 if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
6824                         if (!(wiphy->features &
6825                                         NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR)) {
6826                                 err = -EOPNOTSUPP;
6827                                 goto out_free;
6828                         }
6829
6830                         if (wdev->current_bss) {
6831                                 err = -EOPNOTSUPP;
6832                                 goto out_free;
6833                         }
6834
6835                         err = nl80211_parse_random_mac(info->attrs,
6836                                                        request->mac_addr,
6837                                                        request->mac_addr_mask);
6838                         if (err)
6839                                 goto out_free;
6840                 }
6841         }
6842
6843         request->no_cck =
6844                 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
6845
6846         /* Initial implementation used NL80211_ATTR_MAC to set the specific
6847          * BSSID to scan for. This was problematic because that same attribute
6848          * was already used for another purpose (local random MAC address). The
6849          * NL80211_ATTR_BSSID attribute was added to fix this. For backwards
6850          * compatibility with older userspace components, also use the
6851          * NL80211_ATTR_MAC value here if it can be determined to be used for
6852          * the specific BSSID use case instead of the random MAC address
6853          * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use).
6854          */
6855         if (info->attrs[NL80211_ATTR_BSSID])
6856                 memcpy(request->bssid,
6857                        nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN);
6858         else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) &&
6859                  info->attrs[NL80211_ATTR_MAC])
6860                 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]),
6861                        ETH_ALEN);
6862         else
6863                 eth_broadcast_addr(request->bssid);
6864
6865         request->wdev = wdev;
6866         request->wiphy = &rdev->wiphy;
6867         request->scan_start = jiffies;
6868
6869         rdev->scan_req = request;
6870         err = rdev_scan(rdev, request);
6871
6872         if (!err) {
6873                 nl80211_send_scan_start(rdev, wdev);
6874                 if (wdev->netdev)
6875                         dev_hold(wdev->netdev);
6876         } else {
6877  out_free:
6878                 rdev->scan_req = NULL;
6879                 kfree(request);
6880         }
6881
6882  unlock:
6883         return err;
6884 }
6885
6886 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info)
6887 {
6888         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6889         struct wireless_dev *wdev = info->user_ptr[1];
6890
6891         if (!rdev->ops->abort_scan)
6892                 return -EOPNOTSUPP;
6893
6894         if (rdev->scan_msg)
6895                 return 0;
6896
6897         if (!rdev->scan_req)
6898                 return -ENOENT;
6899
6900         rdev_abort_scan(rdev, wdev);
6901         return 0;
6902 }
6903
6904 static int
6905 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans,
6906                                struct cfg80211_sched_scan_request *request,
6907                                struct nlattr **attrs)
6908 {
6909         int tmp, err, i = 0;
6910         struct nlattr *attr;
6911
6912         if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
6913                 u32 interval;
6914
6915                 /*
6916                  * If scan plans are not specified,
6917                  * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this
6918                  * case one scan plan will be set with the specified scan
6919                  * interval and infinite number of iterations.
6920                  */
6921                 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]);
6922                 if (!interval)
6923                         return -EINVAL;
6924
6925                 request->scan_plans[0].interval =
6926                         DIV_ROUND_UP(interval, MSEC_PER_SEC);
6927                 if (!request->scan_plans[0].interval)
6928                         return -EINVAL;
6929
6930                 if (request->scan_plans[0].interval >
6931                     wiphy->max_sched_scan_plan_interval)
6932                         request->scan_plans[0].interval =
6933                                 wiphy->max_sched_scan_plan_interval;
6934
6935                 return 0;
6936         }
6937
6938         nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) {
6939                 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1];
6940
6941                 if (WARN_ON(i >= n_plans))
6942                         return -EINVAL;
6943
6944                 err = nla_parse_nested(plan, NL80211_SCHED_SCAN_PLAN_MAX,
6945                                        attr, nl80211_plan_policy, NULL);
6946                 if (err)
6947                         return err;
6948
6949                 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL])
6950                         return -EINVAL;
6951
6952                 request->scan_plans[i].interval =
6953                         nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]);
6954                 if (!request->scan_plans[i].interval ||
6955                     request->scan_plans[i].interval >
6956                     wiphy->max_sched_scan_plan_interval)
6957                         return -EINVAL;
6958
6959                 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) {
6960                         request->scan_plans[i].iterations =
6961                                 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]);
6962                         if (!request->scan_plans[i].iterations ||
6963                             (request->scan_plans[i].iterations >
6964                              wiphy->max_sched_scan_plan_iterations))
6965                                 return -EINVAL;
6966                 } else if (i < n_plans - 1) {
6967                         /*
6968                          * All scan plans but the last one must specify
6969                          * a finite number of iterations
6970                          */
6971                         return -EINVAL;
6972                 }
6973
6974                 i++;
6975         }
6976
6977         /*
6978          * The last scan plan must not specify the number of
6979          * iterations, it is supposed to run infinitely
6980          */
6981         if (request->scan_plans[n_plans - 1].iterations)
6982                 return  -EINVAL;
6983
6984         return 0;
6985 }
6986
6987 static struct cfg80211_sched_scan_request *
6988 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
6989                          struct nlattr **attrs, int max_match_sets)
6990 {
6991         struct cfg80211_sched_scan_request *request;
6992         struct nlattr *attr;
6993         int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0;
6994         enum nl80211_band band;
6995         size_t ie_len;
6996         struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1];
6997         s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF;
6998
6999         if (!is_valid_ie_attr(attrs[NL80211_ATTR_IE]))
7000                 return ERR_PTR(-EINVAL);
7001
7002         if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
7003                 n_channels = validate_scan_freqs(
7004                                 attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
7005                 if (!n_channels)
7006                         return ERR_PTR(-EINVAL);
7007         } else {
7008                 n_channels = ieee80211_get_num_supported_channels(wiphy);
7009         }
7010
7011         if (attrs[NL80211_ATTR_SCAN_SSIDS])
7012                 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
7013                                     tmp)
7014                         n_ssids++;
7015
7016         if (n_ssids > wiphy->max_sched_scan_ssids)
7017                 return ERR_PTR(-EINVAL);
7018
7019         /*
7020          * First, count the number of 'real' matchsets. Due to an issue with
7021          * the old implementation, matchsets containing only the RSSI attribute
7022          * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default'
7023          * RSSI for all matchsets, rather than their own matchset for reporting
7024          * all APs with a strong RSSI. This is needed to be compatible with
7025          * older userspace that treated a matchset with only the RSSI as the
7026          * global RSSI for all other matchsets - if there are other matchsets.
7027          */
7028         if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
7029                 nla_for_each_nested(attr,
7030                                     attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
7031                                     tmp) {
7032                         struct nlattr *rssi;
7033
7034                         err = nla_parse_nested(tb,
7035                                                NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
7036                                                attr, nl80211_match_policy,
7037                                                NULL);
7038                         if (err)
7039                                 return ERR_PTR(err);
7040
7041                         /* SSID and BSSID are mutually exclusive */
7042                         if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] &&
7043                             tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID])
7044                                 return ERR_PTR(-EINVAL);
7045
7046                         /* add other standalone attributes here */
7047                         if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] ||
7048                             tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) {
7049                                 n_match_sets++;
7050                                 continue;
7051                         }
7052                         rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
7053                         if (rssi)
7054                                 default_match_rssi = nla_get_s32(rssi);
7055                 }
7056         }
7057
7058         /* However, if there's no other matchset, add the RSSI one */
7059         if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
7060                 n_match_sets = 1;
7061
7062         if (n_match_sets > max_match_sets)
7063                 return ERR_PTR(-EINVAL);
7064
7065         if (attrs[NL80211_ATTR_IE])
7066                 ie_len = nla_len(attrs[NL80211_ATTR_IE]);
7067         else
7068                 ie_len = 0;
7069
7070         if (ie_len > wiphy->max_sched_scan_ie_len)
7071                 return ERR_PTR(-EINVAL);
7072
7073         if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
7074                 /*
7075                  * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since
7076                  * each scan plan already specifies its own interval
7077                  */
7078                 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
7079                         return ERR_PTR(-EINVAL);
7080
7081                 nla_for_each_nested(attr,
7082                                     attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp)
7083                         n_plans++;
7084         } else {
7085                 /*
7086                  * The scan interval attribute is kept for backward
7087                  * compatibility. If no scan plans are specified and sched scan
7088                  * interval is specified, one scan plan will be set with this
7089                  * scan interval and infinite number of iterations.
7090                  */
7091                 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
7092                         return ERR_PTR(-EINVAL);
7093
7094                 n_plans = 1;
7095         }
7096
7097         if (!n_plans || n_plans > wiphy->max_sched_scan_plans)
7098                 return ERR_PTR(-EINVAL);
7099
7100         if (!wiphy_ext_feature_isset(
7101                     wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) &&
7102             (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] ||
7103              attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]))
7104                 return ERR_PTR(-EINVAL);
7105
7106         request = kzalloc(sizeof(*request)
7107                         + sizeof(*request->ssids) * n_ssids
7108                         + sizeof(*request->match_sets) * n_match_sets
7109                         + sizeof(*request->scan_plans) * n_plans
7110                         + sizeof(*request->channels) * n_channels
7111                         + ie_len, GFP_KERNEL);
7112         if (!request)
7113                 return ERR_PTR(-ENOMEM);
7114
7115         if (n_ssids)
7116                 request->ssids = (void *)&request->channels[n_channels];
7117         request->n_ssids = n_ssids;
7118         if (ie_len) {
7119                 if (n_ssids)
7120                         request->ie = (void *)(request->ssids + n_ssids);
7121                 else
7122                         request->ie = (void *)(request->channels + n_channels);
7123         }
7124
7125         if (n_match_sets) {
7126                 if (request->ie)
7127                         request->match_sets = (void *)(request->ie + ie_len);
7128                 else if (n_ssids)
7129                         request->match_sets =
7130                                 (void *)(request->ssids + n_ssids);
7131                 else
7132                         request->match_sets =
7133                                 (void *)(request->channels + n_channels);
7134         }
7135         request->n_match_sets = n_match_sets;
7136
7137         if (n_match_sets)
7138                 request->scan_plans = (void *)(request->match_sets +
7139                                                n_match_sets);
7140         else if (request->ie)
7141                 request->scan_plans = (void *)(request->ie + ie_len);
7142         else if (n_ssids)
7143                 request->scan_plans = (void *)(request->ssids + n_ssids);
7144         else
7145                 request->scan_plans = (void *)(request->channels + n_channels);
7146
7147         request->n_scan_plans = n_plans;
7148
7149         i = 0;
7150         if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
7151                 /* user specified, bail out if channel not found */
7152                 nla_for_each_nested(attr,
7153                                     attrs[NL80211_ATTR_SCAN_FREQUENCIES],
7154                                     tmp) {
7155                         struct ieee80211_channel *chan;
7156
7157                         chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
7158
7159                         if (!chan) {
7160                                 err = -EINVAL;
7161                                 goto out_free;
7162                         }
7163
7164                         /* ignore disabled channels */
7165                         if (chan->flags & IEEE80211_CHAN_DISABLED)
7166                                 continue;
7167
7168                         request->channels[i] = chan;
7169                         i++;
7170                 }
7171         } else {
7172                 /* all channels */
7173                 for (band = 0; band < NUM_NL80211_BANDS; band++) {
7174                         int j;
7175
7176                         if (!wiphy->bands[band])
7177                                 continue;
7178                         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
7179                                 struct ieee80211_channel *chan;
7180
7181                                 chan = &wiphy->bands[band]->channels[j];
7182
7183                                 if (chan->flags & IEEE80211_CHAN_DISABLED)
7184                                         continue;
7185
7186                                 request->channels[i] = chan;
7187                                 i++;
7188                         }
7189                 }
7190         }
7191
7192         if (!i) {
7193                 err = -EINVAL;
7194                 goto out_free;
7195         }
7196
7197         request->n_channels = i;
7198
7199         i = 0;
7200         if (n_ssids) {
7201                 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
7202                                     tmp) {
7203                         if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
7204                                 err = -EINVAL;
7205                                 goto out_free;
7206                         }
7207                         request->ssids[i].ssid_len = nla_len(attr);
7208                         memcpy(request->ssids[i].ssid, nla_data(attr),
7209                                nla_len(attr));
7210                         i++;
7211                 }
7212         }
7213
7214         i = 0;
7215         if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
7216                 nla_for_each_nested(attr,
7217                                     attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
7218                                     tmp) {
7219                         struct nlattr *ssid, *bssid, *rssi;
7220
7221                         err = nla_parse_nested(tb,
7222                                                NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
7223                                                attr, nl80211_match_policy,
7224                                                NULL);
7225                         if (err)
7226                                 goto out_free;
7227                         ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
7228                         bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID];
7229                         if (ssid || bssid) {
7230                                 if (WARN_ON(i >= n_match_sets)) {
7231                                         /* this indicates a programming error,
7232                                          * the loop above should have verified
7233                                          * things properly
7234                                          */
7235                                         err = -EINVAL;
7236                                         goto out_free;
7237                                 }
7238
7239                                 if (ssid) {
7240                                         if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) {
7241                                                 err = -EINVAL;
7242                                                 goto out_free;
7243                                         }
7244                                         memcpy(request->match_sets[i].ssid.ssid,
7245                                                nla_data(ssid), nla_len(ssid));
7246                                         request->match_sets[i].ssid.ssid_len =
7247                                                 nla_len(ssid);
7248                                 }
7249                                 if (bssid) {
7250                                         if (nla_len(bssid) != ETH_ALEN) {
7251                                                 err = -EINVAL;
7252                                                 goto out_free;
7253                                         }
7254                                         memcpy(request->match_sets[i].bssid,
7255                                                nla_data(bssid), ETH_ALEN);
7256                                 }
7257
7258                                 /* special attribute - old implementation w/a */
7259                                 request->match_sets[i].rssi_thold =
7260                                         default_match_rssi;
7261                                 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
7262                                 if (rssi)
7263                                         request->match_sets[i].rssi_thold =
7264                                                 nla_get_s32(rssi);
7265                         }
7266                         i++;
7267                 }
7268
7269                 /* there was no other matchset, so the RSSI one is alone */
7270                 if (i == 0 && n_match_sets)
7271                         request->match_sets[0].rssi_thold = default_match_rssi;
7272
7273                 request->min_rssi_thold = INT_MAX;
7274                 for (i = 0; i < n_match_sets; i++)
7275                         request->min_rssi_thold =
7276                                 min(request->match_sets[i].rssi_thold,
7277                                     request->min_rssi_thold);
7278         } else {
7279                 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF;
7280         }
7281
7282         if (ie_len) {
7283                 request->ie_len = ie_len;
7284                 memcpy((void *)request->ie,
7285                        nla_data(attrs[NL80211_ATTR_IE]),
7286                        request->ie_len);
7287         }
7288
7289         if (attrs[NL80211_ATTR_SCAN_FLAGS]) {
7290                 request->flags = nla_get_u32(
7291                         attrs[NL80211_ATTR_SCAN_FLAGS]);
7292                 if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
7293                     !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) {
7294                         err = -EOPNOTSUPP;
7295                         goto out_free;
7296                 }
7297
7298                 if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
7299                         u32 flg = NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR;
7300
7301                         if (!wdev) /* must be net-detect */
7302                                 flg = NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
7303
7304                         if (!(wiphy->features & flg)) {
7305                                 err = -EOPNOTSUPP;
7306                                 goto out_free;
7307                         }
7308
7309                         if (wdev && wdev->current_bss) {
7310                                 err = -EOPNOTSUPP;
7311                                 goto out_free;
7312                         }
7313
7314                         err = nl80211_parse_random_mac(attrs, request->mac_addr,
7315                                                        request->mac_addr_mask);
7316                         if (err)
7317                                 goto out_free;
7318                 }
7319         }
7320
7321         if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY])
7322                 request->delay =
7323                         nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]);
7324
7325         if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) {
7326                 request->relative_rssi = nla_get_s8(
7327                         attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]);
7328                 request->relative_rssi_set = true;
7329         }
7330
7331         if (request->relative_rssi_set &&
7332             attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) {
7333                 struct nl80211_bss_select_rssi_adjust *rssi_adjust;
7334
7335                 rssi_adjust = nla_data(
7336                         attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]);
7337                 request->rssi_adjust.band = rssi_adjust->band;
7338                 request->rssi_adjust.delta = rssi_adjust->delta;
7339                 if (!is_band_valid(wiphy, request->rssi_adjust.band)) {
7340                         err = -EINVAL;
7341                         goto out_free;
7342                 }
7343         }
7344
7345         err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs);
7346         if (err)
7347                 goto out_free;
7348
7349         request->scan_start = jiffies;
7350
7351         return request;
7352
7353 out_free:
7354         kfree(request);
7355         return ERR_PTR(err);
7356 }
7357
7358 static int nl80211_start_sched_scan(struct sk_buff *skb,
7359                                     struct genl_info *info)
7360 {
7361         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7362         struct net_device *dev = info->user_ptr[1];
7363         struct wireless_dev *wdev = dev->ieee80211_ptr;
7364         struct cfg80211_sched_scan_request *sched_scan_req;
7365         bool want_multi;
7366         int err;
7367
7368         if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start)
7369                 return -EOPNOTSUPP;
7370
7371         want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI];
7372         err = cfg80211_sched_scan_req_possible(rdev, want_multi);
7373         if (err)
7374                 return err;
7375
7376         sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev,
7377                                                   info->attrs,
7378                                                   rdev->wiphy.max_match_sets);
7379
7380         err = PTR_ERR_OR_ZERO(sched_scan_req);
7381         if (err)
7382                 goto out_err;
7383
7384         /* leave request id zero for legacy request
7385          * or if driver does not support multi-scheduled scan
7386          */
7387         if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) {
7388                 while (!sched_scan_req->reqid)
7389                         sched_scan_req->reqid = rdev->wiphy.cookie_counter++;
7390         }
7391
7392         err = rdev_sched_scan_start(rdev, dev, sched_scan_req);
7393         if (err)
7394                 goto out_free;
7395
7396         sched_scan_req->dev = dev;
7397         sched_scan_req->wiphy = &rdev->wiphy;
7398
7399         if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
7400                 sched_scan_req->owner_nlportid = info->snd_portid;
7401
7402         cfg80211_add_sched_scan_req(rdev, sched_scan_req);
7403
7404         nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN);
7405         return 0;
7406
7407 out_free:
7408         kfree(sched_scan_req);
7409 out_err:
7410         return err;
7411 }
7412
7413 static int nl80211_stop_sched_scan(struct sk_buff *skb,
7414                                    struct genl_info *info)
7415 {
7416         struct cfg80211_sched_scan_request *req;
7417         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7418         u64 cookie;
7419
7420         if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop)
7421                 return -EOPNOTSUPP;
7422
7423         if (info->attrs[NL80211_ATTR_COOKIE]) {
7424                 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
7425                 return __cfg80211_stop_sched_scan(rdev, cookie, false);
7426         }
7427
7428         req = list_first_or_null_rcu(&rdev->sched_scan_req_list,
7429                                      struct cfg80211_sched_scan_request,
7430                                      list);
7431         if (!req || req->reqid ||
7432             (req->owner_nlportid &&
7433              req->owner_nlportid != info->snd_portid))
7434                 return -ENOENT;
7435
7436         return cfg80211_stop_sched_scan_req(rdev, req, false);
7437 }
7438
7439 static int nl80211_start_radar_detection(struct sk_buff *skb,
7440                                          struct genl_info *info)
7441 {
7442         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7443         struct net_device *dev = info->user_ptr[1];
7444         struct wireless_dev *wdev = dev->ieee80211_ptr;
7445         struct cfg80211_chan_def chandef;
7446         enum nl80211_dfs_regions dfs_region;
7447         unsigned int cac_time_ms;
7448         int err;
7449
7450         dfs_region = reg_get_dfs_region(wdev->wiphy);
7451         if (dfs_region == NL80211_DFS_UNSET)
7452                 return -EINVAL;
7453
7454         err = nl80211_parse_chandef(rdev, info, &chandef);
7455         if (err)
7456                 return err;
7457
7458         if (netif_carrier_ok(dev))
7459                 return -EBUSY;
7460
7461         if (wdev->cac_started)
7462                 return -EBUSY;
7463
7464         err = cfg80211_chandef_dfs_required(wdev->wiphy, &chandef,
7465                                             wdev->iftype);
7466         if (err < 0)
7467                 return err;
7468
7469         if (err == 0)
7470                 return -EINVAL;
7471
7472         if (!cfg80211_chandef_dfs_usable(wdev->wiphy, &chandef))
7473                 return -EINVAL;
7474
7475         if (!rdev->ops->start_radar_detection)
7476                 return -EOPNOTSUPP;
7477
7478         cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef);
7479         if (WARN_ON(!cac_time_ms))
7480                 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
7481
7482         err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms);
7483         if (!err) {
7484                 wdev->chandef = chandef;
7485                 wdev->cac_started = true;
7486                 wdev->cac_start_time = jiffies;
7487                 wdev->cac_time_ms = cac_time_ms;
7488         }
7489         return err;
7490 }
7491
7492 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
7493 {
7494         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7495         struct net_device *dev = info->user_ptr[1];
7496         struct wireless_dev *wdev = dev->ieee80211_ptr;
7497         struct cfg80211_csa_settings params;
7498         /* csa_attrs is defined static to avoid waste of stack size - this
7499          * function is called under RTNL lock, so this should not be a problem.
7500          */
7501         static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1];
7502         int err;
7503         bool need_new_beacon = false;
7504         bool need_handle_dfs_flag = true;
7505         int len, i;
7506         u32 cs_count;
7507
7508         if (!rdev->ops->channel_switch ||
7509             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
7510                 return -EOPNOTSUPP;
7511
7512         switch (dev->ieee80211_ptr->iftype) {
7513         case NL80211_IFTYPE_AP:
7514         case NL80211_IFTYPE_P2P_GO:
7515                 need_new_beacon = true;
7516                 /* For all modes except AP the handle_dfs flag needs to be
7517                  * supplied to tell the kernel that userspace will handle radar
7518                  * events when they happen. Otherwise a switch to a channel
7519                  * requiring DFS will be rejected.
7520                  */
7521                 need_handle_dfs_flag = false;
7522
7523                 /* useless if AP is not running */
7524                 if (!wdev->beacon_interval)
7525                         return -ENOTCONN;
7526                 break;
7527         case NL80211_IFTYPE_ADHOC:
7528                 if (!wdev->ssid_len)
7529                         return -ENOTCONN;
7530                 break;
7531         case NL80211_IFTYPE_MESH_POINT:
7532                 if (!wdev->mesh_id_len)
7533                         return -ENOTCONN;
7534                 break;
7535         default:
7536                 return -EOPNOTSUPP;
7537         }
7538
7539         memset(&params, 0, sizeof(params));
7540
7541         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
7542             !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT])
7543                 return -EINVAL;
7544
7545         /* only important for AP, IBSS and mesh create IEs internally */
7546         if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES])
7547                 return -EINVAL;
7548
7549         /* Even though the attribute is u32, the specification says
7550          * u8, so let's make sure we don't overflow.
7551          */
7552         cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]);
7553         if (cs_count > 255)
7554                 return -EINVAL;
7555
7556         params.count = cs_count;
7557
7558         if (!need_new_beacon)
7559                 goto skip_beacons;
7560
7561         err = nl80211_parse_beacon(info->attrs, &params.beacon_after);
7562         if (err)
7563                 return err;
7564
7565         err = nla_parse_nested(csa_attrs, NL80211_ATTR_MAX,
7566                                info->attrs[NL80211_ATTR_CSA_IES],
7567                                nl80211_policy, info->extack);
7568         if (err)
7569                 return err;
7570
7571         err = nl80211_parse_beacon(csa_attrs, &params.beacon_csa);
7572         if (err)
7573                 return err;
7574
7575         if (!csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON])
7576                 return -EINVAL;
7577
7578         len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]);
7579         if (!len || (len % sizeof(u16)))
7580                 return -EINVAL;
7581
7582         params.n_counter_offsets_beacon = len / sizeof(u16);
7583         if (rdev->wiphy.max_num_csa_counters &&
7584             (params.n_counter_offsets_beacon >
7585              rdev->wiphy.max_num_csa_counters))
7586                 return -EINVAL;
7587
7588         params.counter_offsets_beacon =
7589                 nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]);
7590
7591         /* sanity checks - counters should fit and be the same */
7592         for (i = 0; i < params.n_counter_offsets_beacon; i++) {
7593                 u16 offset = params.counter_offsets_beacon[i];
7594
7595                 if (offset >= params.beacon_csa.tail_len)
7596                         return -EINVAL;
7597
7598                 if (params.beacon_csa.tail[offset] != params.count)
7599                         return -EINVAL;
7600         }
7601
7602         if (csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]) {
7603                 len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]);
7604                 if (!len || (len % sizeof(u16)))
7605                         return -EINVAL;
7606
7607                 params.n_counter_offsets_presp = len / sizeof(u16);
7608                 if (rdev->wiphy.max_num_csa_counters &&
7609                     (params.n_counter_offsets_presp >
7610                      rdev->wiphy.max_num_csa_counters))
7611                         return -EINVAL;
7612
7613                 params.counter_offsets_presp =
7614                         nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]);
7615
7616                 /* sanity checks - counters should fit and be the same */
7617                 for (i = 0; i < params.n_counter_offsets_presp; i++) {
7618                         u16 offset = params.counter_offsets_presp[i];
7619
7620                         if (offset >= params.beacon_csa.probe_resp_len)
7621                                 return -EINVAL;
7622
7623                         if (params.beacon_csa.probe_resp[offset] !=
7624                             params.count)
7625                                 return -EINVAL;
7626                 }
7627         }
7628
7629 skip_beacons:
7630         err = nl80211_parse_chandef(rdev, info, &params.chandef);
7631         if (err)
7632                 return err;
7633
7634         if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef,
7635                                            wdev->iftype))
7636                 return -EINVAL;
7637
7638         err = cfg80211_chandef_dfs_required(wdev->wiphy,
7639                                             &params.chandef,
7640                                             wdev->iftype);
7641         if (err < 0)
7642                 return err;
7643
7644         if (err > 0) {
7645                 params.radar_required = true;
7646                 if (need_handle_dfs_flag &&
7647                     !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) {
7648                         return -EINVAL;
7649                 }
7650         }
7651
7652         if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
7653                 params.block_tx = true;
7654
7655         wdev_lock(wdev);
7656         err = rdev_channel_switch(rdev, dev, &params);
7657         wdev_unlock(wdev);
7658
7659         return err;
7660 }
7661
7662 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
7663                             u32 seq, int flags,
7664                             struct cfg80211_registered_device *rdev,
7665                             struct wireless_dev *wdev,
7666                             struct cfg80211_internal_bss *intbss)
7667 {
7668         struct cfg80211_bss *res = &intbss->pub;
7669         const struct cfg80211_bss_ies *ies;
7670         void *hdr;
7671         struct nlattr *bss;
7672
7673         ASSERT_WDEV_LOCK(wdev);
7674
7675         hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
7676                              NL80211_CMD_NEW_SCAN_RESULTS);
7677         if (!hdr)
7678                 return -1;
7679
7680         genl_dump_check_consistent(cb, hdr, &nl80211_fam);
7681
7682         if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation))
7683                 goto nla_put_failure;
7684         if (wdev->netdev &&
7685             nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex))
7686                 goto nla_put_failure;
7687         if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
7688                               NL80211_ATTR_PAD))
7689                 goto nla_put_failure;
7690
7691         bss = nla_nest_start(msg, NL80211_ATTR_BSS);
7692         if (!bss)
7693                 goto nla_put_failure;
7694         if ((!is_zero_ether_addr(res->bssid) &&
7695              nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid)))
7696                 goto nla_put_failure;
7697
7698         rcu_read_lock();
7699         /* indicate whether we have probe response data or not */
7700         if (rcu_access_pointer(res->proberesp_ies) &&
7701             nla_put_flag(msg, NL80211_BSS_PRESP_DATA))
7702                 goto fail_unlock_rcu;
7703
7704         /* this pointer prefers to be pointed to probe response data
7705          * but is always valid
7706          */
7707         ies = rcu_dereference(res->ies);
7708         if (ies) {
7709                 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf,
7710                                       NL80211_BSS_PAD))
7711                         goto fail_unlock_rcu;
7712                 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS,
7713                                         ies->len, ies->data))
7714                         goto fail_unlock_rcu;
7715         }
7716
7717         /* and this pointer is always (unless driver didn't know) beacon data */
7718         ies = rcu_dereference(res->beacon_ies);
7719         if (ies && ies->from_beacon) {
7720                 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf,
7721                                       NL80211_BSS_PAD))
7722                         goto fail_unlock_rcu;
7723                 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES,
7724                                         ies->len, ies->data))
7725                         goto fail_unlock_rcu;
7726         }
7727         rcu_read_unlock();
7728
7729         if (res->beacon_interval &&
7730             nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval))
7731                 goto nla_put_failure;
7732         if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) ||
7733             nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) ||
7734             nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) ||
7735             nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO,
7736                         jiffies_to_msecs(jiffies - intbss->ts)))
7737                 goto nla_put_failure;
7738
7739         if (intbss->parent_tsf &&
7740             (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF,
7741                                intbss->parent_tsf, NL80211_BSS_PAD) ||
7742              nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN,
7743                      intbss->parent_bssid)))
7744                 goto nla_put_failure;
7745
7746         if (intbss->ts_boottime &&
7747             nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME,
7748                               intbss->ts_boottime, NL80211_BSS_PAD))
7749                 goto nla_put_failure;
7750
7751         switch (rdev->wiphy.signal_type) {
7752         case CFG80211_SIGNAL_TYPE_MBM:
7753                 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal))
7754                         goto nla_put_failure;
7755                 break;
7756         case CFG80211_SIGNAL_TYPE_UNSPEC:
7757                 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal))
7758                         goto nla_put_failure;
7759                 break;
7760         default:
7761                 break;
7762         }
7763
7764         switch (wdev->iftype) {
7765         case NL80211_IFTYPE_P2P_CLIENT:
7766         case NL80211_IFTYPE_STATION:
7767                 if (intbss == wdev->current_bss &&
7768                     nla_put_u32(msg, NL80211_BSS_STATUS,
7769                                 NL80211_BSS_STATUS_ASSOCIATED))
7770                         goto nla_put_failure;
7771                 break;
7772         case NL80211_IFTYPE_ADHOC:
7773                 if (intbss == wdev->current_bss &&
7774                     nla_put_u32(msg, NL80211_BSS_STATUS,
7775                                 NL80211_BSS_STATUS_IBSS_JOINED))
7776                         goto nla_put_failure;
7777                 break;
7778         default:
7779                 break;
7780         }
7781
7782         nla_nest_end(msg, bss);
7783
7784         genlmsg_end(msg, hdr);
7785         return 0;
7786
7787  fail_unlock_rcu:
7788         rcu_read_unlock();
7789  nla_put_failure:
7790         genlmsg_cancel(msg, hdr);
7791         return -EMSGSIZE;
7792 }
7793
7794 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb)
7795 {
7796         struct cfg80211_registered_device *rdev;
7797         struct cfg80211_internal_bss *scan;
7798         struct wireless_dev *wdev;
7799         int start = cb->args[2], idx = 0;
7800         int err;
7801
7802         rtnl_lock();
7803         err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
7804         if (err) {
7805                 rtnl_unlock();
7806                 return err;
7807         }
7808
7809         wdev_lock(wdev);
7810         spin_lock_bh(&rdev->bss_lock);
7811         cfg80211_bss_expire(rdev);
7812
7813         cb->seq = rdev->bss_generation;
7814
7815         list_for_each_entry(scan, &rdev->bss_list, list) {
7816                 if (++idx <= start)
7817                         continue;
7818                 if (nl80211_send_bss(skb, cb,
7819                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
7820                                 rdev, wdev, scan) < 0) {
7821                         idx--;
7822                         break;
7823                 }
7824         }
7825
7826         spin_unlock_bh(&rdev->bss_lock);
7827         wdev_unlock(wdev);
7828
7829         cb->args[2] = idx;
7830         rtnl_unlock();
7831
7832         return skb->len;
7833 }
7834
7835 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq,
7836                                int flags, struct net_device *dev,
7837                                bool allow_radio_stats,
7838                                struct survey_info *survey)
7839 {
7840         void *hdr;
7841         struct nlattr *infoattr;
7842
7843         /* skip radio stats if userspace didn't request them */
7844         if (!survey->channel && !allow_radio_stats)
7845                 return 0;
7846
7847         hdr = nl80211hdr_put(msg, portid, seq, flags,
7848                              NL80211_CMD_NEW_SURVEY_RESULTS);
7849         if (!hdr)
7850                 return -ENOMEM;
7851
7852         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
7853                 goto nla_put_failure;
7854
7855         infoattr = nla_nest_start(msg, NL80211_ATTR_SURVEY_INFO);
7856         if (!infoattr)
7857                 goto nla_put_failure;
7858
7859         if (survey->channel &&
7860             nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY,
7861                         survey->channel->center_freq))
7862                 goto nla_put_failure;
7863
7864         if ((survey->filled & SURVEY_INFO_NOISE_DBM) &&
7865             nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise))
7866                 goto nla_put_failure;
7867         if ((survey->filled & SURVEY_INFO_IN_USE) &&
7868             nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE))
7869                 goto nla_put_failure;
7870         if ((survey->filled & SURVEY_INFO_TIME) &&
7871             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME,
7872                         survey->time, NL80211_SURVEY_INFO_PAD))
7873                 goto nla_put_failure;
7874         if ((survey->filled & SURVEY_INFO_TIME_BUSY) &&
7875             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY,
7876                               survey->time_busy, NL80211_SURVEY_INFO_PAD))
7877                 goto nla_put_failure;
7878         if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) &&
7879             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY,
7880                               survey->time_ext_busy, NL80211_SURVEY_INFO_PAD))
7881                 goto nla_put_failure;
7882         if ((survey->filled & SURVEY_INFO_TIME_RX) &&
7883             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX,
7884                               survey->time_rx, NL80211_SURVEY_INFO_PAD))
7885                 goto nla_put_failure;
7886         if ((survey->filled & SURVEY_INFO_TIME_TX) &&
7887             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX,
7888                               survey->time_tx, NL80211_SURVEY_INFO_PAD))
7889                 goto nla_put_failure;
7890         if ((survey->filled & SURVEY_INFO_TIME_SCAN) &&
7891             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN,
7892                               survey->time_scan, NL80211_SURVEY_INFO_PAD))
7893                 goto nla_put_failure;
7894
7895         nla_nest_end(msg, infoattr);
7896
7897         genlmsg_end(msg, hdr);
7898         return 0;
7899
7900  nla_put_failure:
7901         genlmsg_cancel(msg, hdr);
7902         return -EMSGSIZE;
7903 }
7904
7905 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
7906 {
7907         struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
7908         struct survey_info survey;
7909         struct cfg80211_registered_device *rdev;
7910         struct wireless_dev *wdev;
7911         int survey_idx = cb->args[2];
7912         int res;
7913         bool radio_stats;
7914
7915         rtnl_lock();
7916         res = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
7917         if (res)
7918                 goto out_err;
7919
7920         /* prepare_wdev_dump parsed the attributes */
7921         radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
7922
7923         if (!wdev->netdev) {
7924                 res = -EINVAL;
7925                 goto out_err;
7926         }
7927
7928         if (!rdev->ops->dump_survey) {
7929                 res = -EOPNOTSUPP;
7930                 goto out_err;
7931         }
7932
7933         while (1) {
7934                 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey);
7935                 if (res == -ENOENT)
7936                         break;
7937                 if (res)
7938                         goto out_err;
7939
7940                 /* don't send disabled channels, but do send non-channel data */
7941                 if (survey.channel &&
7942                     survey.channel->flags & IEEE80211_CHAN_DISABLED) {
7943                         survey_idx++;
7944                         continue;
7945                 }
7946
7947                 if (nl80211_send_survey(skb,
7948                                 NETLINK_CB(cb->skb).portid,
7949                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
7950                                 wdev->netdev, radio_stats, &survey) < 0)
7951                         goto out;
7952                 survey_idx++;
7953         }
7954
7955  out:
7956         cb->args[2] = survey_idx;
7957         res = skb->len;
7958  out_err:
7959         rtnl_unlock();
7960         return res;
7961 }
7962
7963 static bool nl80211_valid_wpa_versions(u32 wpa_versions)
7964 {
7965         return !(wpa_versions & ~(NL80211_WPA_VERSION_1 |
7966                                   NL80211_WPA_VERSION_2));
7967 }
7968
7969 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
7970 {
7971         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7972         struct net_device *dev = info->user_ptr[1];
7973         struct ieee80211_channel *chan;
7974         const u8 *bssid, *ssid, *ie = NULL, *auth_data = NULL;
7975         int err, ssid_len, ie_len = 0, auth_data_len = 0;
7976         enum nl80211_auth_type auth_type;
7977         struct key_parse key;
7978         bool local_state_change;
7979
7980         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
7981                 return -EINVAL;
7982
7983         if (!info->attrs[NL80211_ATTR_MAC])
7984                 return -EINVAL;
7985
7986         if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
7987                 return -EINVAL;
7988
7989         if (!info->attrs[NL80211_ATTR_SSID])
7990                 return -EINVAL;
7991
7992         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
7993                 return -EINVAL;
7994
7995         err = nl80211_parse_key(info, &key);
7996         if (err)
7997                 return err;
7998
7999         if (key.idx >= 0) {
8000                 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP)
8001                         return -EINVAL;
8002                 if (!key.p.key || !key.p.key_len)
8003                         return -EINVAL;
8004                 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 ||
8005                      key.p.key_len != WLAN_KEY_LEN_WEP40) &&
8006                     (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 ||
8007                      key.p.key_len != WLAN_KEY_LEN_WEP104))
8008                         return -EINVAL;
8009                 if (key.idx > 3)
8010                         return -EINVAL;
8011         } else {
8012                 key.p.key_len = 0;
8013                 key.p.key = NULL;
8014         }
8015
8016         if (key.idx >= 0) {
8017                 int i;
8018                 bool ok = false;
8019
8020                 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) {
8021                         if (key.p.cipher == rdev->wiphy.cipher_suites[i]) {
8022                                 ok = true;
8023                                 break;
8024                         }
8025                 }
8026                 if (!ok)
8027                         return -EINVAL;
8028         }
8029
8030         if (!rdev->ops->auth)
8031                 return -EOPNOTSUPP;
8032
8033         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8034             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8035                 return -EOPNOTSUPP;
8036
8037         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8038         chan = nl80211_get_valid_chan(&rdev->wiphy,
8039                                       info->attrs[NL80211_ATTR_WIPHY_FREQ]);
8040         if (!chan)
8041                 return -EINVAL;
8042
8043         ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8044         ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8045
8046         if (info->attrs[NL80211_ATTR_IE]) {
8047                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8048                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8049         }
8050
8051         auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
8052         if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE))
8053                 return -EINVAL;
8054
8055         if ((auth_type == NL80211_AUTHTYPE_SAE ||
8056              auth_type == NL80211_AUTHTYPE_FILS_SK ||
8057              auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
8058              auth_type == NL80211_AUTHTYPE_FILS_PK) &&
8059             !info->attrs[NL80211_ATTR_AUTH_DATA])
8060                 return -EINVAL;
8061
8062         if (info->attrs[NL80211_ATTR_AUTH_DATA]) {
8063                 if (auth_type != NL80211_AUTHTYPE_SAE &&
8064                     auth_type != NL80211_AUTHTYPE_FILS_SK &&
8065                     auth_type != NL80211_AUTHTYPE_FILS_SK_PFS &&
8066                     auth_type != NL80211_AUTHTYPE_FILS_PK)
8067                         return -EINVAL;
8068                 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
8069                 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
8070                 /* need to include at least Auth Transaction and Status Code */
8071                 if (auth_data_len < 4)
8072                         return -EINVAL;
8073         }
8074
8075         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
8076
8077         /*
8078          * Since we no longer track auth state, ignore
8079          * requests to only change local state.
8080          */
8081         if (local_state_change)
8082                 return 0;
8083
8084         wdev_lock(dev->ieee80211_ptr);
8085         err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
8086                                  ssid, ssid_len, ie, ie_len,
8087                                  key.p.key, key.p.key_len, key.idx,
8088                                  auth_data, auth_data_len);
8089         wdev_unlock(dev->ieee80211_ptr);
8090         return err;
8091 }
8092
8093 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
8094                                    struct genl_info *info,
8095                                    struct cfg80211_crypto_settings *settings,
8096                                    int cipher_limit)
8097 {
8098         memset(settings, 0, sizeof(*settings));
8099
8100         settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
8101
8102         if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
8103                 u16 proto;
8104
8105                 proto = nla_get_u16(
8106                         info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
8107                 settings->control_port_ethertype = cpu_to_be16(proto);
8108                 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
8109                     proto != ETH_P_PAE)
8110                         return -EINVAL;
8111                 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT])
8112                         settings->control_port_no_encrypt = true;
8113         } else
8114                 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE);
8115
8116         if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
8117                 void *data;
8118                 int len, i;
8119
8120                 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
8121                 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
8122                 settings->n_ciphers_pairwise = len / sizeof(u32);
8123
8124                 if (len % sizeof(u32))
8125                         return -EINVAL;
8126
8127                 if (settings->n_ciphers_pairwise > cipher_limit)
8128                         return -EINVAL;
8129
8130                 memcpy(settings->ciphers_pairwise, data, len);
8131
8132                 for (i = 0; i < settings->n_ciphers_pairwise; i++)
8133                         if (!cfg80211_supported_cipher_suite(
8134                                         &rdev->wiphy,
8135                                         settings->ciphers_pairwise[i]))
8136                                 return -EINVAL;
8137         }
8138
8139         if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
8140                 settings->cipher_group =
8141                         nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
8142                 if (!cfg80211_supported_cipher_suite(&rdev->wiphy,
8143                                                      settings->cipher_group))
8144                         return -EINVAL;
8145         }
8146
8147         if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) {
8148                 settings->wpa_versions =
8149                         nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
8150                 if (!nl80211_valid_wpa_versions(settings->wpa_versions))
8151                         return -EINVAL;
8152         }
8153
8154         if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
8155                 void *data;
8156                 int len;
8157
8158                 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
8159                 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
8160                 settings->n_akm_suites = len / sizeof(u32);
8161
8162                 if (len % sizeof(u32))
8163                         return -EINVAL;
8164
8165                 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
8166                         return -EINVAL;
8167
8168                 memcpy(settings->akm_suites, data, len);
8169         }
8170
8171         if (info->attrs[NL80211_ATTR_PMK]) {
8172                 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN)
8173                         return -EINVAL;
8174                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
8175                                              NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK))
8176                         return -EINVAL;
8177                 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]);
8178         }
8179
8180         return 0;
8181 }
8182
8183 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
8184 {
8185         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8186         struct net_device *dev = info->user_ptr[1];
8187         struct ieee80211_channel *chan;
8188         struct cfg80211_assoc_request req = {};
8189         const u8 *bssid, *ssid;
8190         int err, ssid_len = 0;
8191
8192         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8193                 return -EINVAL;
8194
8195         if (!info->attrs[NL80211_ATTR_MAC] ||
8196             !info->attrs[NL80211_ATTR_SSID] ||
8197             !info->attrs[NL80211_ATTR_WIPHY_FREQ])
8198                 return -EINVAL;
8199
8200         if (!rdev->ops->assoc)
8201                 return -EOPNOTSUPP;
8202
8203         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8204             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8205                 return -EOPNOTSUPP;
8206
8207         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8208
8209         chan = nl80211_get_valid_chan(&rdev->wiphy,
8210                                       info->attrs[NL80211_ATTR_WIPHY_FREQ]);
8211         if (!chan)
8212                 return -EINVAL;
8213
8214         ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8215         ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8216
8217         if (info->attrs[NL80211_ATTR_IE]) {
8218                 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8219                 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8220         }
8221
8222         if (info->attrs[NL80211_ATTR_USE_MFP]) {
8223                 enum nl80211_mfp mfp =
8224                         nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
8225                 if (mfp == NL80211_MFP_REQUIRED)
8226                         req.use_mfp = true;
8227                 else if (mfp != NL80211_MFP_NO)
8228                         return -EINVAL;
8229         }
8230
8231         if (info->attrs[NL80211_ATTR_PREV_BSSID])
8232                 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
8233
8234         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
8235                 req.flags |= ASSOC_REQ_DISABLE_HT;
8236
8237         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8238                 memcpy(&req.ht_capa_mask,
8239                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
8240                        sizeof(req.ht_capa_mask));
8241
8242         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
8243                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8244                         return -EINVAL;
8245                 memcpy(&req.ht_capa,
8246                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
8247                        sizeof(req.ht_capa));
8248         }
8249
8250         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
8251                 req.flags |= ASSOC_REQ_DISABLE_VHT;
8252
8253         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
8254                 memcpy(&req.vht_capa_mask,
8255                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
8256                        sizeof(req.vht_capa_mask));
8257
8258         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
8259                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
8260                         return -EINVAL;
8261                 memcpy(&req.vht_capa,
8262                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
8263                        sizeof(req.vht_capa));
8264         }
8265
8266         if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
8267                 if (!((rdev->wiphy.features &
8268                         NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
8269                        (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
8270                     !wiphy_ext_feature_isset(&rdev->wiphy,
8271                                              NL80211_EXT_FEATURE_RRM))
8272                         return -EINVAL;
8273                 req.flags |= ASSOC_REQ_USE_RRM;
8274         }
8275
8276         if (info->attrs[NL80211_ATTR_FILS_KEK]) {
8277                 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]);
8278                 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]);
8279                 if (!info->attrs[NL80211_ATTR_FILS_NONCES])
8280                         return -EINVAL;
8281                 req.fils_nonces =
8282                         nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]);
8283         }
8284
8285         err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
8286         if (!err) {
8287                 wdev_lock(dev->ieee80211_ptr);
8288
8289                 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid,
8290                                           ssid, ssid_len, &req);
8291
8292                 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
8293                         dev->ieee80211_ptr->conn_owner_nlportid =
8294                                 info->snd_portid;
8295                         memcpy(dev->ieee80211_ptr->disconnect_bssid,
8296                                bssid, ETH_ALEN);
8297                 }
8298
8299                 wdev_unlock(dev->ieee80211_ptr);
8300         }
8301
8302         return err;
8303 }
8304
8305 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
8306 {
8307         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8308         struct net_device *dev = info->user_ptr[1];
8309         const u8 *ie = NULL, *bssid;
8310         int ie_len = 0, err;
8311         u16 reason_code;
8312         bool local_state_change;
8313
8314         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8315                 return -EINVAL;
8316
8317         if (!info->attrs[NL80211_ATTR_MAC])
8318                 return -EINVAL;
8319
8320         if (!info->attrs[NL80211_ATTR_REASON_CODE])
8321                 return -EINVAL;
8322
8323         if (!rdev->ops->deauth)
8324                 return -EOPNOTSUPP;
8325
8326         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8327             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8328                 return -EOPNOTSUPP;
8329
8330         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8331
8332         reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
8333         if (reason_code == 0) {
8334                 /* Reason Code 0 is reserved */
8335                 return -EINVAL;
8336         }
8337
8338         if (info->attrs[NL80211_ATTR_IE]) {
8339                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8340                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8341         }
8342
8343         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
8344
8345         wdev_lock(dev->ieee80211_ptr);
8346         err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code,
8347                                    local_state_change);
8348         wdev_unlock(dev->ieee80211_ptr);
8349         return err;
8350 }
8351
8352 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
8353 {
8354         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8355         struct net_device *dev = info->user_ptr[1];
8356         const u8 *ie = NULL, *bssid;
8357         int ie_len = 0, err;
8358         u16 reason_code;
8359         bool local_state_change;
8360
8361         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8362                 return -EINVAL;
8363
8364         if (!info->attrs[NL80211_ATTR_MAC])
8365                 return -EINVAL;
8366
8367         if (!info->attrs[NL80211_ATTR_REASON_CODE])
8368                 return -EINVAL;
8369
8370         if (!rdev->ops->disassoc)
8371                 return -EOPNOTSUPP;
8372
8373         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8374             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8375                 return -EOPNOTSUPP;
8376
8377         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8378
8379         reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
8380         if (reason_code == 0) {
8381                 /* Reason Code 0 is reserved */
8382                 return -EINVAL;
8383         }
8384
8385         if (info->attrs[NL80211_ATTR_IE]) {
8386                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8387                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8388         }
8389
8390         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
8391
8392         wdev_lock(dev->ieee80211_ptr);
8393         err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code,
8394                                      local_state_change);
8395         wdev_unlock(dev->ieee80211_ptr);
8396         return err;
8397 }
8398
8399 static bool
8400 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev,
8401                          int mcast_rate[NUM_NL80211_BANDS],
8402                          int rateval)
8403 {
8404         struct wiphy *wiphy = &rdev->wiphy;
8405         bool found = false;
8406         int band, i;
8407
8408         for (band = 0; band < NUM_NL80211_BANDS; band++) {
8409                 struct ieee80211_supported_band *sband;
8410
8411                 sband = wiphy->bands[band];
8412                 if (!sband)
8413                         continue;
8414
8415                 for (i = 0; i < sband->n_bitrates; i++) {
8416                         if (sband->bitrates[i].bitrate == rateval) {
8417                                 mcast_rate[band] = i + 1;
8418                                 found = true;
8419                                 break;
8420                         }
8421                 }
8422         }
8423
8424         return found;
8425 }
8426
8427 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
8428 {
8429         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8430         struct net_device *dev = info->user_ptr[1];
8431         struct cfg80211_ibss_params ibss;
8432         struct wiphy *wiphy;
8433         struct cfg80211_cached_keys *connkeys = NULL;
8434         int err;
8435
8436         memset(&ibss, 0, sizeof(ibss));
8437
8438         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8439                 return -EINVAL;
8440
8441         if (!info->attrs[NL80211_ATTR_SSID] ||
8442             !nla_len(info->attrs[NL80211_ATTR_SSID]))
8443                 return -EINVAL;
8444
8445         ibss.beacon_interval = 100;
8446
8447         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL])
8448                 ibss.beacon_interval =
8449                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
8450
8451         err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC,
8452                                            ibss.beacon_interval);
8453         if (err)
8454                 return err;
8455
8456         if (!rdev->ops->join_ibss)
8457                 return -EOPNOTSUPP;
8458
8459         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
8460                 return -EOPNOTSUPP;
8461
8462         wiphy = &rdev->wiphy;
8463
8464         if (info->attrs[NL80211_ATTR_MAC]) {
8465                 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8466
8467                 if (!is_valid_ether_addr(ibss.bssid))
8468                         return -EINVAL;
8469         }
8470         ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8471         ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8472
8473         if (info->attrs[NL80211_ATTR_IE]) {
8474                 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8475                 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8476         }
8477
8478         err = nl80211_parse_chandef(rdev, info, &ibss.chandef);
8479         if (err)
8480                 return err;
8481
8482         if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef,
8483                                      NL80211_IFTYPE_ADHOC))
8484                 return -EINVAL;
8485
8486         switch (ibss.chandef.width) {
8487         case NL80211_CHAN_WIDTH_5:
8488         case NL80211_CHAN_WIDTH_10:
8489         case NL80211_CHAN_WIDTH_20_NOHT:
8490                 break;
8491         case NL80211_CHAN_WIDTH_20:
8492         case NL80211_CHAN_WIDTH_40:
8493                 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
8494                         return -EINVAL;
8495                 break;
8496         case NL80211_CHAN_WIDTH_80:
8497         case NL80211_CHAN_WIDTH_80P80:
8498         case NL80211_CHAN_WIDTH_160:
8499                 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
8500                         return -EINVAL;
8501                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
8502                                              NL80211_EXT_FEATURE_VHT_IBSS))
8503                         return -EINVAL;
8504                 break;
8505         default:
8506                 return -EINVAL;
8507         }
8508
8509         ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
8510         ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
8511
8512         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
8513                 u8 *rates =
8514                         nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
8515                 int n_rates =
8516                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
8517                 struct ieee80211_supported_band *sband =
8518                         wiphy->bands[ibss.chandef.chan->band];
8519
8520                 err = ieee80211_get_ratemask(sband, rates, n_rates,
8521                                              &ibss.basic_rates);
8522                 if (err)
8523                         return err;
8524         }
8525
8526         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8527                 memcpy(&ibss.ht_capa_mask,
8528                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
8529                        sizeof(ibss.ht_capa_mask));
8530
8531         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
8532                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8533                         return -EINVAL;
8534                 memcpy(&ibss.ht_capa,
8535                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
8536                        sizeof(ibss.ht_capa));
8537         }
8538
8539         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
8540             !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate,
8541                         nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
8542                 return -EINVAL;
8543
8544         if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
8545                 bool no_ht = false;
8546
8547                 connkeys = nl80211_parse_connkeys(rdev,
8548                                           info->attrs[NL80211_ATTR_KEYS],
8549                                           &no_ht);
8550                 if (IS_ERR(connkeys))
8551                         return PTR_ERR(connkeys);
8552
8553                 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) &&
8554                     no_ht) {
8555                         kzfree(connkeys);
8556                         return -EINVAL;
8557                 }
8558         }
8559
8560         ibss.control_port =
8561                 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]);
8562
8563         ibss.userspace_handles_dfs =
8564                 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
8565
8566         err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
8567         if (err)
8568                 kzfree(connkeys);
8569         return err;
8570 }
8571
8572 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
8573 {
8574         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8575         struct net_device *dev = info->user_ptr[1];
8576
8577         if (!rdev->ops->leave_ibss)
8578                 return -EOPNOTSUPP;
8579
8580         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
8581                 return -EOPNOTSUPP;
8582
8583         return cfg80211_leave_ibss(rdev, dev, false);
8584 }
8585
8586 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info)
8587 {
8588         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8589         struct net_device *dev = info->user_ptr[1];
8590         int mcast_rate[NUM_NL80211_BANDS];
8591         u32 nla_rate;
8592         int err;
8593
8594         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
8595             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
8596             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB)
8597                 return -EOPNOTSUPP;
8598
8599         if (!rdev->ops->set_mcast_rate)
8600                 return -EOPNOTSUPP;
8601
8602         memset(mcast_rate, 0, sizeof(mcast_rate));
8603
8604         if (!info->attrs[NL80211_ATTR_MCAST_RATE])
8605                 return -EINVAL;
8606
8607         nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
8608         if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate))
8609                 return -EINVAL;
8610
8611         err = rdev_set_mcast_rate(rdev, dev, mcast_rate);
8612
8613         return err;
8614 }
8615
8616 static struct sk_buff *
8617 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
8618                             struct wireless_dev *wdev, int approxlen,
8619                             u32 portid, u32 seq, enum nl80211_commands cmd,
8620                             enum nl80211_attrs attr,
8621                             const struct nl80211_vendor_cmd_info *info,
8622                             gfp_t gfp)
8623 {
8624         struct sk_buff *skb;
8625         void *hdr;
8626         struct nlattr *data;
8627
8628         skb = nlmsg_new(approxlen + 100, gfp);
8629         if (!skb)
8630                 return NULL;
8631
8632         hdr = nl80211hdr_put(skb, portid, seq, 0, cmd);
8633         if (!hdr) {
8634                 kfree_skb(skb);
8635                 return NULL;
8636         }
8637
8638         if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
8639                 goto nla_put_failure;
8640
8641         if (info) {
8642                 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID,
8643                                 info->vendor_id))
8644                         goto nla_put_failure;
8645                 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD,
8646                                 info->subcmd))
8647                         goto nla_put_failure;
8648         }
8649
8650         if (wdev) {
8651                 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
8652                                       wdev_id(wdev), NL80211_ATTR_PAD))
8653                         goto nla_put_failure;
8654                 if (wdev->netdev &&
8655                     nla_put_u32(skb, NL80211_ATTR_IFINDEX,
8656                                 wdev->netdev->ifindex))
8657                         goto nla_put_failure;
8658         }
8659
8660         data = nla_nest_start(skb, attr);
8661         if (!data)
8662                 goto nla_put_failure;
8663
8664         ((void **)skb->cb)[0] = rdev;
8665         ((void **)skb->cb)[1] = hdr;
8666         ((void **)skb->cb)[2] = data;
8667
8668         return skb;
8669
8670  nla_put_failure:
8671         kfree_skb(skb);
8672         return NULL;
8673 }
8674
8675 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
8676                                            struct wireless_dev *wdev,
8677                                            enum nl80211_commands cmd,
8678                                            enum nl80211_attrs attr,
8679                                            int vendor_event_idx,
8680                                            int approxlen, gfp_t gfp)
8681 {
8682         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
8683         const struct nl80211_vendor_cmd_info *info;
8684
8685         switch (cmd) {
8686         case NL80211_CMD_TESTMODE:
8687                 if (WARN_ON(vendor_event_idx != -1))
8688                         return NULL;
8689                 info = NULL;
8690                 break;
8691         case NL80211_CMD_VENDOR:
8692                 if (WARN_ON(vendor_event_idx < 0 ||
8693                             vendor_event_idx >= wiphy->n_vendor_events))
8694                         return NULL;
8695                 info = &wiphy->vendor_events[vendor_event_idx];
8696                 break;
8697         default:
8698                 WARN_ON(1);
8699                 return NULL;
8700         }
8701
8702         return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, 0, 0,
8703                                            cmd, attr, info, gfp);
8704 }
8705 EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
8706
8707 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
8708 {
8709         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
8710         void *hdr = ((void **)skb->cb)[1];
8711         struct nlattr *data = ((void **)skb->cb)[2];
8712         enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
8713
8714         /* clear CB data for netlink core to own from now on */
8715         memset(skb->cb, 0, sizeof(skb->cb));
8716
8717         nla_nest_end(skb, data);
8718         genlmsg_end(skb, hdr);
8719
8720         if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
8721                 mcgrp = NL80211_MCGRP_VENDOR;
8722
8723         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0,
8724                                 mcgrp, gfp);
8725 }
8726 EXPORT_SYMBOL(__cfg80211_send_event_skb);
8727
8728 #ifdef CONFIG_NL80211_TESTMODE
8729 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
8730 {
8731         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8732         struct wireless_dev *wdev =
8733                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
8734         int err;
8735
8736         if (!rdev->ops->testmode_cmd)
8737                 return -EOPNOTSUPP;
8738
8739         if (IS_ERR(wdev)) {
8740                 err = PTR_ERR(wdev);
8741                 if (err != -EINVAL)
8742                         return err;
8743                 wdev = NULL;
8744         } else if (wdev->wiphy != &rdev->wiphy) {
8745                 return -EINVAL;
8746         }
8747
8748         if (!info->attrs[NL80211_ATTR_TESTDATA])
8749                 return -EINVAL;
8750
8751         rdev->cur_cmd_info = info;
8752         err = rdev_testmode_cmd(rdev, wdev,
8753                                 nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
8754                                 nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
8755         rdev->cur_cmd_info = NULL;
8756
8757         return err;
8758 }
8759
8760 static int nl80211_testmode_dump(struct sk_buff *skb,
8761                                  struct netlink_callback *cb)
8762 {
8763         struct cfg80211_registered_device *rdev;
8764         int err;
8765         long phy_idx;
8766         void *data = NULL;
8767         int data_len = 0;
8768
8769         rtnl_lock();
8770
8771         if (cb->args[0]) {
8772                 /*
8773                  * 0 is a valid index, but not valid for args[0],
8774                  * so we need to offset by 1.
8775                  */
8776                 phy_idx = cb->args[0] - 1;
8777
8778                 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
8779                 if (!rdev) {
8780                         err = -ENOENT;
8781                         goto out_err;
8782                 }
8783         } else {
8784                 struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
8785
8786                 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
8787                                   attrbuf, nl80211_fam.maxattr,
8788                                   nl80211_policy, NULL);
8789                 if (err)
8790                         goto out_err;
8791
8792                 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
8793                 if (IS_ERR(rdev)) {
8794                         err = PTR_ERR(rdev);
8795                         goto out_err;
8796                 }
8797                 phy_idx = rdev->wiphy_idx;
8798
8799                 if (attrbuf[NL80211_ATTR_TESTDATA])
8800                         cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA];
8801         }
8802
8803         if (cb->args[1]) {
8804                 data = nla_data((void *)cb->args[1]);
8805                 data_len = nla_len((void *)cb->args[1]);
8806         }
8807
8808         if (!rdev->ops->testmode_dump) {
8809                 err = -EOPNOTSUPP;
8810                 goto out_err;
8811         }
8812
8813         while (1) {
8814                 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
8815                                            cb->nlh->nlmsg_seq, NLM_F_MULTI,
8816                                            NL80211_CMD_TESTMODE);
8817                 struct nlattr *tmdata;
8818
8819                 if (!hdr)
8820                         break;
8821
8822                 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) {
8823                         genlmsg_cancel(skb, hdr);
8824                         break;
8825                 }
8826
8827                 tmdata = nla_nest_start(skb, NL80211_ATTR_TESTDATA);
8828                 if (!tmdata) {
8829                         genlmsg_cancel(skb, hdr);
8830                         break;
8831                 }
8832                 err = rdev_testmode_dump(rdev, skb, cb, data, data_len);
8833                 nla_nest_end(skb, tmdata);
8834
8835                 if (err == -ENOBUFS || err == -ENOENT) {
8836                         genlmsg_cancel(skb, hdr);
8837                         break;
8838                 } else if (err) {
8839                         genlmsg_cancel(skb, hdr);
8840                         goto out_err;
8841                 }
8842
8843                 genlmsg_end(skb, hdr);
8844         }
8845
8846         err = skb->len;
8847         /* see above */
8848         cb->args[0] = phy_idx + 1;
8849  out_err:
8850         rtnl_unlock();
8851         return err;
8852 }
8853 #endif
8854
8855 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
8856 {
8857         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8858         struct net_device *dev = info->user_ptr[1];
8859         struct cfg80211_connect_params connect;
8860         struct wiphy *wiphy;
8861         struct cfg80211_cached_keys *connkeys = NULL;
8862         int err;
8863
8864         memset(&connect, 0, sizeof(connect));
8865
8866         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8867                 return -EINVAL;
8868
8869         if (!info->attrs[NL80211_ATTR_SSID] ||
8870             !nla_len(info->attrs[NL80211_ATTR_SSID]))
8871                 return -EINVAL;
8872
8873         if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
8874                 connect.auth_type =
8875                         nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
8876                 if (!nl80211_valid_auth_type(rdev, connect.auth_type,
8877                                              NL80211_CMD_CONNECT))
8878                         return -EINVAL;
8879         } else
8880                 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
8881
8882         connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
8883
8884         if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] &&
8885             !wiphy_ext_feature_isset(&rdev->wiphy,
8886                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
8887                 return -EINVAL;
8888         connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS];
8889
8890         err = nl80211_crypto_settings(rdev, info, &connect.crypto,
8891                                       NL80211_MAX_NR_CIPHER_SUITES);
8892         if (err)
8893                 return err;
8894
8895         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8896             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8897                 return -EOPNOTSUPP;
8898
8899         wiphy = &rdev->wiphy;
8900
8901         connect.bg_scan_period = -1;
8902         if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] &&
8903                 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) {
8904                 connect.bg_scan_period =
8905                         nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]);
8906         }
8907
8908         if (info->attrs[NL80211_ATTR_MAC])
8909                 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8910         else if (info->attrs[NL80211_ATTR_MAC_HINT])
8911                 connect.bssid_hint =
8912                         nla_data(info->attrs[NL80211_ATTR_MAC_HINT]);
8913         connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8914         connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8915
8916         if (info->attrs[NL80211_ATTR_IE]) {
8917                 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8918                 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8919         }
8920
8921         if (info->attrs[NL80211_ATTR_USE_MFP]) {
8922                 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
8923                 if (connect.mfp != NL80211_MFP_REQUIRED &&
8924                     connect.mfp != NL80211_MFP_NO)
8925                         return -EINVAL;
8926         } else {
8927                 connect.mfp = NL80211_MFP_NO;
8928         }
8929
8930         if (info->attrs[NL80211_ATTR_PREV_BSSID])
8931                 connect.prev_bssid =
8932                         nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
8933
8934         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
8935                 connect.channel = nl80211_get_valid_chan(
8936                         wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ]);
8937                 if (!connect.channel)
8938                         return -EINVAL;
8939         } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) {
8940                 connect.channel_hint = nl80211_get_valid_chan(
8941                         wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]);
8942                 if (!connect.channel_hint)
8943                         return -EINVAL;
8944         }
8945
8946         if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
8947                 connkeys = nl80211_parse_connkeys(rdev,
8948                                           info->attrs[NL80211_ATTR_KEYS], NULL);
8949                 if (IS_ERR(connkeys))
8950                         return PTR_ERR(connkeys);
8951         }
8952
8953         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
8954                 connect.flags |= ASSOC_REQ_DISABLE_HT;
8955
8956         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8957                 memcpy(&connect.ht_capa_mask,
8958                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
8959                        sizeof(connect.ht_capa_mask));
8960
8961         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
8962                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
8963                         kzfree(connkeys);
8964                         return -EINVAL;
8965                 }
8966                 memcpy(&connect.ht_capa,
8967                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
8968                        sizeof(connect.ht_capa));
8969         }
8970
8971         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
8972                 connect.flags |= ASSOC_REQ_DISABLE_VHT;
8973
8974         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
8975                 memcpy(&connect.vht_capa_mask,
8976                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
8977                        sizeof(connect.vht_capa_mask));
8978
8979         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
8980                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
8981                         kzfree(connkeys);
8982                         return -EINVAL;
8983                 }
8984                 memcpy(&connect.vht_capa,
8985                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
8986                        sizeof(connect.vht_capa));
8987         }
8988
8989         if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
8990                 if (!((rdev->wiphy.features &
8991                         NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
8992                        (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
8993                     !wiphy_ext_feature_isset(&rdev->wiphy,
8994                                              NL80211_EXT_FEATURE_RRM)) {
8995                         kzfree(connkeys);
8996                         return -EINVAL;
8997                 }
8998                 connect.flags |= ASSOC_REQ_USE_RRM;
8999         }
9000
9001         connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
9002         if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) {
9003                 kzfree(connkeys);
9004                 return -EOPNOTSUPP;
9005         }
9006
9007         if (info->attrs[NL80211_ATTR_BSS_SELECT]) {
9008                 /* bss selection makes no sense if bssid is set */
9009                 if (connect.bssid) {
9010                         kzfree(connkeys);
9011                         return -EINVAL;
9012                 }
9013
9014                 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT],
9015                                        wiphy, &connect.bss_select);
9016                 if (err) {
9017                         kzfree(connkeys);
9018                         return err;
9019                 }
9020         }
9021
9022         if (wiphy_ext_feature_isset(&rdev->wiphy,
9023                                     NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
9024             info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
9025             info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
9026             info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
9027             info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
9028                 connect.fils_erp_username =
9029                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
9030                 connect.fils_erp_username_len =
9031                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
9032                 connect.fils_erp_realm =
9033                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
9034                 connect.fils_erp_realm_len =
9035                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
9036                 connect.fils_erp_next_seq_num =
9037                         nla_get_u16(
9038                            info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
9039                 connect.fils_erp_rrk =
9040                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
9041                 connect.fils_erp_rrk_len =
9042                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
9043         } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
9044                    info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
9045                    info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
9046                    info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
9047                 kzfree(connkeys);
9048                 return -EINVAL;
9049         }
9050
9051         wdev_lock(dev->ieee80211_ptr);
9052
9053         err = cfg80211_connect(rdev, dev, &connect, connkeys,
9054                                connect.prev_bssid);
9055         if (err)
9056                 kzfree(connkeys);
9057
9058         if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
9059                 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
9060                 if (connect.bssid)
9061                         memcpy(dev->ieee80211_ptr->disconnect_bssid,
9062                                connect.bssid, ETH_ALEN);
9063                 else
9064                         memset(dev->ieee80211_ptr->disconnect_bssid,
9065                                0, ETH_ALEN);
9066         }
9067
9068         wdev_unlock(dev->ieee80211_ptr);
9069
9070         return err;
9071 }
9072
9073 static int nl80211_update_connect_params(struct sk_buff *skb,
9074                                          struct genl_info *info)
9075 {
9076         struct cfg80211_connect_params connect = {};
9077         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9078         struct net_device *dev = info->user_ptr[1];
9079         struct wireless_dev *wdev = dev->ieee80211_ptr;
9080         u32 changed = 0;
9081         int ret;
9082
9083         if (!rdev->ops->update_connect_params)
9084                 return -EOPNOTSUPP;
9085
9086         if (info->attrs[NL80211_ATTR_IE]) {
9087                 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
9088                         return -EINVAL;
9089                 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
9090                 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9091                 changed |= UPDATE_ASSOC_IES;
9092         }
9093
9094         wdev_lock(dev->ieee80211_ptr);
9095         if (!wdev->current_bss)
9096                 ret = -ENOLINK;
9097         else
9098                 ret = rdev_update_connect_params(rdev, dev, &connect, changed);
9099         wdev_unlock(dev->ieee80211_ptr);
9100
9101         return ret;
9102 }
9103
9104 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
9105 {
9106         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9107         struct net_device *dev = info->user_ptr[1];
9108         u16 reason;
9109         int ret;
9110
9111         if (!info->attrs[NL80211_ATTR_REASON_CODE])
9112                 reason = WLAN_REASON_DEAUTH_LEAVING;
9113         else
9114                 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
9115
9116         if (reason == 0)
9117                 return -EINVAL;
9118
9119         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9120             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9121                 return -EOPNOTSUPP;
9122
9123         wdev_lock(dev->ieee80211_ptr);
9124         ret = cfg80211_disconnect(rdev, dev, reason, true);
9125         wdev_unlock(dev->ieee80211_ptr);
9126         return ret;
9127 }
9128
9129 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
9130 {
9131         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9132         struct net *net;
9133         int err;
9134
9135         if (info->attrs[NL80211_ATTR_PID]) {
9136                 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
9137
9138                 net = get_net_ns_by_pid(pid);
9139         } else if (info->attrs[NL80211_ATTR_NETNS_FD]) {
9140                 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]);
9141
9142                 net = get_net_ns_by_fd(fd);
9143         } else {
9144                 return -EINVAL;
9145         }
9146
9147         if (IS_ERR(net))
9148                 return PTR_ERR(net);
9149
9150         err = 0;
9151
9152         /* check if anything to do */
9153         if (!net_eq(wiphy_net(&rdev->wiphy), net))
9154                 err = cfg80211_switch_netns(rdev, net);
9155
9156         put_net(net);
9157         return err;
9158 }
9159
9160 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
9161 {
9162         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9163         int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev,
9164                         struct cfg80211_pmksa *pmksa) = NULL;
9165         struct net_device *dev = info->user_ptr[1];
9166         struct cfg80211_pmksa pmksa;
9167
9168         memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
9169
9170         if (!info->attrs[NL80211_ATTR_PMKID])
9171                 return -EINVAL;
9172
9173         pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
9174
9175         if (info->attrs[NL80211_ATTR_MAC]) {
9176                 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
9177         } else if (info->attrs[NL80211_ATTR_SSID] &&
9178                    info->attrs[NL80211_ATTR_FILS_CACHE_ID] &&
9179                    (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA ||
9180                     info->attrs[NL80211_ATTR_PMK])) {
9181                 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
9182                 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
9183                 pmksa.cache_id =
9184                         nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]);
9185         } else {
9186                 return -EINVAL;
9187         }
9188         if (info->attrs[NL80211_ATTR_PMK]) {
9189                 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
9190                 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
9191         }
9192
9193         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9194             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9195                 return -EOPNOTSUPP;
9196
9197         switch (info->genlhdr->cmd) {
9198         case NL80211_CMD_SET_PMKSA:
9199                 rdev_ops = rdev->ops->set_pmksa;
9200                 break;
9201         case NL80211_CMD_DEL_PMKSA:
9202                 rdev_ops = rdev->ops->del_pmksa;
9203                 break;
9204         default:
9205                 WARN_ON(1);
9206                 break;
9207         }
9208
9209         if (!rdev_ops)
9210                 return -EOPNOTSUPP;
9211
9212         return rdev_ops(&rdev->wiphy, dev, &pmksa);
9213 }
9214
9215 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
9216 {
9217         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9218         struct net_device *dev = info->user_ptr[1];
9219
9220         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9221             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9222                 return -EOPNOTSUPP;
9223
9224         if (!rdev->ops->flush_pmksa)
9225                 return -EOPNOTSUPP;
9226
9227         return rdev_flush_pmksa(rdev, dev);
9228 }
9229
9230 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
9231 {
9232         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9233         struct net_device *dev = info->user_ptr[1];
9234         u8 action_code, dialog_token;
9235         u32 peer_capability = 0;
9236         u16 status_code;
9237         u8 *peer;
9238         bool initiator;
9239
9240         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
9241             !rdev->ops->tdls_mgmt)
9242                 return -EOPNOTSUPP;
9243
9244         if (!info->attrs[NL80211_ATTR_TDLS_ACTION] ||
9245             !info->attrs[NL80211_ATTR_STATUS_CODE] ||
9246             !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] ||
9247             !info->attrs[NL80211_ATTR_IE] ||
9248             !info->attrs[NL80211_ATTR_MAC])
9249                 return -EINVAL;
9250
9251         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
9252         action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
9253         status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
9254         dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
9255         initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]);
9256         if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
9257                 peer_capability =
9258                         nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
9259
9260         return rdev_tdls_mgmt(rdev, dev, peer, action_code,
9261                               dialog_token, status_code, peer_capability,
9262                               initiator,
9263                               nla_data(info->attrs[NL80211_ATTR_IE]),
9264                               nla_len(info->attrs[NL80211_ATTR_IE]));
9265 }
9266
9267 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info)
9268 {
9269         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9270         struct net_device *dev = info->user_ptr[1];
9271         enum nl80211_tdls_operation operation;
9272         u8 *peer;
9273
9274         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
9275             !rdev->ops->tdls_oper)
9276                 return -EOPNOTSUPP;
9277
9278         if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] ||
9279             !info->attrs[NL80211_ATTR_MAC])
9280                 return -EINVAL;
9281
9282         operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]);
9283         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
9284
9285         return rdev_tdls_oper(rdev, dev, peer, operation);
9286 }
9287
9288 static int nl80211_remain_on_channel(struct sk_buff *skb,
9289                                      struct genl_info *info)
9290 {
9291         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9292         struct wireless_dev *wdev = info->user_ptr[1];
9293         struct cfg80211_chan_def chandef;
9294         const struct cfg80211_chan_def *compat_chandef;
9295         struct sk_buff *msg;
9296         void *hdr;
9297         u64 cookie;
9298         u32 duration;
9299         int err;
9300
9301         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
9302             !info->attrs[NL80211_ATTR_DURATION])
9303                 return -EINVAL;
9304
9305         duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
9306
9307         if (!rdev->ops->remain_on_channel ||
9308             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL))
9309                 return -EOPNOTSUPP;
9310
9311         /*
9312          * We should be on that channel for at least a minimum amount of
9313          * time (10ms) but no longer than the driver supports.
9314          */
9315         if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
9316             duration > rdev->wiphy.max_remain_on_channel_duration)
9317                 return -EINVAL;
9318
9319         err = nl80211_parse_chandef(rdev, info, &chandef);
9320         if (err)
9321                 return err;
9322
9323         wdev_lock(wdev);
9324         if (!cfg80211_off_channel_oper_allowed(wdev) &&
9325             !cfg80211_chandef_identical(&wdev->chandef, &chandef)) {
9326                 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef,
9327                                                              &chandef);
9328                 if (compat_chandef != &chandef) {
9329                         wdev_unlock(wdev);
9330                         return -EBUSY;
9331                 }
9332         }
9333         wdev_unlock(wdev);
9334
9335         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9336         if (!msg)
9337                 return -ENOMEM;
9338
9339         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
9340                              NL80211_CMD_REMAIN_ON_CHANNEL);
9341         if (!hdr) {
9342                 err = -ENOBUFS;
9343                 goto free_msg;
9344         }
9345
9346         err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
9347                                      duration, &cookie);
9348
9349         if (err)
9350                 goto free_msg;
9351
9352         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
9353                               NL80211_ATTR_PAD))
9354                 goto nla_put_failure;
9355
9356         genlmsg_end(msg, hdr);
9357
9358         return genlmsg_reply(msg, info);
9359
9360  nla_put_failure:
9361         err = -ENOBUFS;
9362  free_msg:
9363         nlmsg_free(msg);
9364         return err;
9365 }
9366
9367 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
9368                                             struct genl_info *info)
9369 {
9370         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9371         struct wireless_dev *wdev = info->user_ptr[1];
9372         u64 cookie;
9373
9374         if (!info->attrs[NL80211_ATTR_COOKIE])
9375                 return -EINVAL;
9376
9377         if (!rdev->ops->cancel_remain_on_channel)
9378                 return -EOPNOTSUPP;
9379
9380         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
9381
9382         return rdev_cancel_remain_on_channel(rdev, wdev, cookie);
9383 }
9384
9385 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
9386                                        struct genl_info *info)
9387 {
9388         struct cfg80211_bitrate_mask mask;
9389         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9390         struct net_device *dev = info->user_ptr[1];
9391         int err;
9392
9393         if (!rdev->ops->set_bitrate_mask)
9394                 return -EOPNOTSUPP;
9395
9396         err = nl80211_parse_tx_bitrate_mask(info, &mask);
9397         if (err)
9398                 return err;
9399
9400         return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
9401 }
9402
9403 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
9404 {
9405         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9406         struct wireless_dev *wdev = info->user_ptr[1];
9407         u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
9408
9409         if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
9410                 return -EINVAL;
9411
9412         if (info->attrs[NL80211_ATTR_FRAME_TYPE])
9413                 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
9414
9415         switch (wdev->iftype) {
9416         case NL80211_IFTYPE_STATION:
9417         case NL80211_IFTYPE_ADHOC:
9418         case NL80211_IFTYPE_P2P_CLIENT:
9419         case NL80211_IFTYPE_AP:
9420         case NL80211_IFTYPE_AP_VLAN:
9421         case NL80211_IFTYPE_MESH_POINT:
9422         case NL80211_IFTYPE_P2P_GO:
9423         case NL80211_IFTYPE_P2P_DEVICE:
9424                 break;
9425         case NL80211_IFTYPE_NAN:
9426         default:
9427                 return -EOPNOTSUPP;
9428         }
9429
9430         /* not much point in registering if we can't reply */
9431         if (!rdev->ops->mgmt_tx)
9432                 return -EOPNOTSUPP;
9433
9434         return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type,
9435                         nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
9436                         nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]));
9437 }
9438
9439 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
9440 {
9441         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9442         struct wireless_dev *wdev = info->user_ptr[1];
9443         struct cfg80211_chan_def chandef;
9444         int err;
9445         void *hdr = NULL;
9446         u64 cookie;
9447         struct sk_buff *msg = NULL;
9448         struct cfg80211_mgmt_tx_params params = {
9449                 .dont_wait_for_ack =
9450                         info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK],
9451         };
9452
9453         if (!info->attrs[NL80211_ATTR_FRAME])
9454                 return -EINVAL;
9455
9456         if (!rdev->ops->mgmt_tx)
9457                 return -EOPNOTSUPP;
9458
9459         switch (wdev->iftype) {
9460         case NL80211_IFTYPE_P2P_DEVICE:
9461                 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
9462                         return -EINVAL;
9463         case NL80211_IFTYPE_STATION:
9464         case NL80211_IFTYPE_ADHOC:
9465         case NL80211_IFTYPE_P2P_CLIENT:
9466         case NL80211_IFTYPE_AP:
9467         case NL80211_IFTYPE_AP_VLAN:
9468         case NL80211_IFTYPE_MESH_POINT:
9469         case NL80211_IFTYPE_P2P_GO:
9470                 break;
9471         case NL80211_IFTYPE_NAN:
9472         default:
9473                 return -EOPNOTSUPP;
9474         }
9475
9476         if (info->attrs[NL80211_ATTR_DURATION]) {
9477                 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
9478                         return -EINVAL;
9479                 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
9480
9481                 /*
9482                  * We should wait on the channel for at least a minimum amount
9483                  * of time (10ms) but no longer than the driver supports.
9484                  */
9485                 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
9486                     params.wait > rdev->wiphy.max_remain_on_channel_duration)
9487                         return -EINVAL;
9488         }
9489
9490         params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
9491
9492         if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
9493                 return -EINVAL;
9494
9495         params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
9496
9497         /* get the channel if any has been specified, otherwise pass NULL to
9498          * the driver. The latter will use the current one
9499          */
9500         chandef.chan = NULL;
9501         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
9502                 err = nl80211_parse_chandef(rdev, info, &chandef);
9503                 if (err)
9504                         return err;
9505         }
9506
9507         if (!chandef.chan && params.offchan)
9508                 return -EINVAL;
9509
9510         wdev_lock(wdev);
9511         if (params.offchan && !cfg80211_off_channel_oper_allowed(wdev)) {
9512                 wdev_unlock(wdev);
9513                 return -EBUSY;
9514         }
9515         wdev_unlock(wdev);
9516
9517         params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
9518         params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
9519
9520         if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) {
9521                 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
9522                 int i;
9523
9524                 if (len % sizeof(u16))
9525                         return -EINVAL;
9526
9527                 params.n_csa_offsets = len / sizeof(u16);
9528                 params.csa_offsets =
9529                         nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
9530
9531                 /* check that all the offsets fit the frame */
9532                 for (i = 0; i < params.n_csa_offsets; i++) {
9533                         if (params.csa_offsets[i] >= params.len)
9534                                 return -EINVAL;
9535                 }
9536         }
9537
9538         if (!params.dont_wait_for_ack) {
9539                 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9540                 if (!msg)
9541                         return -ENOMEM;
9542
9543                 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
9544                                      NL80211_CMD_FRAME);
9545                 if (!hdr) {
9546                         err = -ENOBUFS;
9547                         goto free_msg;
9548                 }
9549         }
9550
9551         params.chan = chandef.chan;
9552         err = cfg80211_mlme_mgmt_tx(rdev, wdev, &params, &cookie);
9553         if (err)
9554                 goto free_msg;
9555
9556         if (msg) {
9557                 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
9558                                       NL80211_ATTR_PAD))
9559                         goto nla_put_failure;
9560
9561                 genlmsg_end(msg, hdr);
9562                 return genlmsg_reply(msg, info);
9563         }
9564
9565         return 0;
9566
9567  nla_put_failure:
9568         err = -ENOBUFS;
9569  free_msg:
9570         nlmsg_free(msg);
9571         return err;
9572 }
9573
9574 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
9575 {
9576         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9577         struct wireless_dev *wdev = info->user_ptr[1];
9578         u64 cookie;
9579
9580         if (!info->attrs[NL80211_ATTR_COOKIE])
9581                 return -EINVAL;
9582
9583         if (!rdev->ops->mgmt_tx_cancel_wait)
9584                 return -EOPNOTSUPP;
9585
9586         switch (wdev->iftype) {
9587         case NL80211_IFTYPE_STATION:
9588         case NL80211_IFTYPE_ADHOC:
9589         case NL80211_IFTYPE_P2P_CLIENT:
9590         case NL80211_IFTYPE_AP:
9591         case NL80211_IFTYPE_AP_VLAN:
9592         case NL80211_IFTYPE_P2P_GO:
9593         case NL80211_IFTYPE_P2P_DEVICE:
9594                 break;
9595         case NL80211_IFTYPE_NAN:
9596         default:
9597                 return -EOPNOTSUPP;
9598         }
9599
9600         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
9601
9602         return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie);
9603 }
9604
9605 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
9606 {
9607         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9608         struct wireless_dev *wdev;
9609         struct net_device *dev = info->user_ptr[1];
9610         u8 ps_state;
9611         bool state;
9612         int err;
9613
9614         if (!info->attrs[NL80211_ATTR_PS_STATE])
9615                 return -EINVAL;
9616
9617         ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
9618
9619         if (ps_state != NL80211_PS_DISABLED && ps_state != NL80211_PS_ENABLED)
9620                 return -EINVAL;
9621
9622         wdev = dev->ieee80211_ptr;
9623
9624         if (!rdev->ops->set_power_mgmt)
9625                 return -EOPNOTSUPP;
9626
9627         state = (ps_state == NL80211_PS_ENABLED) ? true : false;
9628
9629         if (state == wdev->ps)
9630                 return 0;
9631
9632         err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout);
9633         if (!err)
9634                 wdev->ps = state;
9635         return err;
9636 }
9637
9638 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
9639 {
9640         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9641         enum nl80211_ps_state ps_state;
9642         struct wireless_dev *wdev;
9643         struct net_device *dev = info->user_ptr[1];
9644         struct sk_buff *msg;
9645         void *hdr;
9646         int err;
9647
9648         wdev = dev->ieee80211_ptr;
9649
9650         if (!rdev->ops->set_power_mgmt)
9651                 return -EOPNOTSUPP;
9652
9653         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9654         if (!msg)
9655                 return -ENOMEM;
9656
9657         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
9658                              NL80211_CMD_GET_POWER_SAVE);
9659         if (!hdr) {
9660                 err = -ENOBUFS;
9661                 goto free_msg;
9662         }
9663
9664         if (wdev->ps)
9665                 ps_state = NL80211_PS_ENABLED;
9666         else
9667                 ps_state = NL80211_PS_DISABLED;
9668
9669         if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state))
9670                 goto nla_put_failure;
9671
9672         genlmsg_end(msg, hdr);
9673         return genlmsg_reply(msg, info);
9674
9675  nla_put_failure:
9676         err = -ENOBUFS;
9677  free_msg:
9678         nlmsg_free(msg);
9679         return err;
9680 }
9681
9682 static const struct nla_policy
9683 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
9684         [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY },
9685         [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 },
9686         [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
9687         [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
9688         [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
9689         [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
9690         [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 },
9691 };
9692
9693 static int nl80211_set_cqm_txe(struct genl_info *info,
9694                                u32 rate, u32 pkts, u32 intvl)
9695 {
9696         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9697         struct net_device *dev = info->user_ptr[1];
9698         struct wireless_dev *wdev = dev->ieee80211_ptr;
9699
9700         if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL)
9701                 return -EINVAL;
9702
9703         if (!rdev->ops->set_cqm_txe_config)
9704                 return -EOPNOTSUPP;
9705
9706         if (wdev->iftype != NL80211_IFTYPE_STATION &&
9707             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
9708                 return -EOPNOTSUPP;
9709
9710         return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl);
9711 }
9712
9713 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
9714                                     struct net_device *dev)
9715 {
9716         struct wireless_dev *wdev = dev->ieee80211_ptr;
9717         s32 last, low, high;
9718         u32 hyst;
9719         int i, n;
9720         int err;
9721
9722         /* RSSI reporting disabled? */
9723         if (!wdev->cqm_config)
9724                 return rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0);
9725
9726         /*
9727          * Obtain current RSSI value if possible, if not and no RSSI threshold
9728          * event has been received yet, we should receive an event after a
9729          * connection is established and enough beacons received to calculate
9730          * the average.
9731          */
9732         if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss &&
9733             rdev->ops->get_station) {
9734                 struct station_info sinfo;
9735                 u8 *mac_addr;
9736
9737                 mac_addr = wdev->current_bss->pub.bssid;
9738
9739                 err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
9740                 if (err)
9741                         return err;
9742
9743                 if (sinfo.filled & BIT(NL80211_STA_INFO_BEACON_SIGNAL_AVG))
9744                         wdev->cqm_config->last_rssi_event_value =
9745                                 (s8) sinfo.rx_beacon_signal_avg;
9746         }
9747
9748         last = wdev->cqm_config->last_rssi_event_value;
9749         hyst = wdev->cqm_config->rssi_hyst;
9750         n = wdev->cqm_config->n_rssi_thresholds;
9751
9752         for (i = 0; i < n; i++)
9753                 if (last < wdev->cqm_config->rssi_thresholds[i])
9754                         break;
9755
9756         low = i > 0 ?
9757                 (wdev->cqm_config->rssi_thresholds[i - 1] - hyst) : S32_MIN;
9758         high = i < n ?
9759                 (wdev->cqm_config->rssi_thresholds[i] + hyst - 1) : S32_MAX;
9760
9761         return rdev_set_cqm_rssi_range_config(rdev, dev, low, high);
9762 }
9763
9764 static int nl80211_set_cqm_rssi(struct genl_info *info,
9765                                 const s32 *thresholds, int n_thresholds,
9766                                 u32 hysteresis)
9767 {
9768         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9769         struct net_device *dev = info->user_ptr[1];
9770         struct wireless_dev *wdev = dev->ieee80211_ptr;
9771         int i, err;
9772         s32 prev = S32_MIN;
9773
9774         /* Check all values negative and sorted */
9775         for (i = 0; i < n_thresholds; i++) {
9776                 if (thresholds[i] > 0 || thresholds[i] <= prev)
9777                         return -EINVAL;
9778
9779                 prev = thresholds[i];
9780         }
9781
9782         if (wdev->iftype != NL80211_IFTYPE_STATION &&
9783             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
9784                 return -EOPNOTSUPP;
9785
9786         wdev_lock(wdev);
9787         cfg80211_cqm_config_free(wdev);
9788         wdev_unlock(wdev);
9789
9790         if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) {
9791                 if (n_thresholds == 0 || thresholds[0] == 0) /* Disabling */
9792                         return rdev_set_cqm_rssi_config(rdev, dev, 0, 0);
9793
9794                 return rdev_set_cqm_rssi_config(rdev, dev,
9795                                                 thresholds[0], hysteresis);
9796         }
9797
9798         if (!wiphy_ext_feature_isset(&rdev->wiphy,
9799                                      NL80211_EXT_FEATURE_CQM_RSSI_LIST))
9800                 return -EOPNOTSUPP;
9801
9802         if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */
9803                 n_thresholds = 0;
9804
9805         wdev_lock(wdev);
9806         if (n_thresholds) {
9807                 struct cfg80211_cqm_config *cqm_config;
9808
9809                 cqm_config = kzalloc(sizeof(struct cfg80211_cqm_config) +
9810                                      n_thresholds * sizeof(s32), GFP_KERNEL);
9811                 if (!cqm_config) {
9812                         err = -ENOMEM;
9813                         goto unlock;
9814                 }
9815
9816                 cqm_config->rssi_hyst = hysteresis;
9817                 cqm_config->n_rssi_thresholds = n_thresholds;
9818                 memcpy(cqm_config->rssi_thresholds, thresholds,
9819                        n_thresholds * sizeof(s32));
9820
9821                 wdev->cqm_config = cqm_config;
9822         }
9823
9824         err = cfg80211_cqm_rssi_update(rdev, dev);
9825
9826 unlock:
9827         wdev_unlock(wdev);
9828
9829         return err;
9830 }
9831
9832 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
9833 {
9834         struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1];
9835         struct nlattr *cqm;
9836         int err;
9837
9838         cqm = info->attrs[NL80211_ATTR_CQM];
9839         if (!cqm)
9840                 return -EINVAL;
9841
9842         err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm,
9843                                nl80211_attr_cqm_policy, info->extack);
9844         if (err)
9845                 return err;
9846
9847         if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
9848             attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
9849                 const s32 *thresholds =
9850                         nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
9851                 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
9852                 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
9853
9854                 if (len % 4)
9855                         return -EINVAL;
9856
9857                 return nl80211_set_cqm_rssi(info, thresholds, len / 4,
9858                                             hysteresis);
9859         }
9860
9861         if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
9862             attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
9863             attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
9864                 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
9865                 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
9866                 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
9867
9868                 return nl80211_set_cqm_txe(info, rate, pkts, intvl);
9869         }
9870
9871         return -EINVAL;
9872 }
9873
9874 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info)
9875 {
9876         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9877         struct net_device *dev = info->user_ptr[1];
9878         struct ocb_setup setup = {};
9879         int err;
9880
9881         err = nl80211_parse_chandef(rdev, info, &setup.chandef);
9882         if (err)
9883                 return err;
9884
9885         return cfg80211_join_ocb(rdev, dev, &setup);
9886 }
9887
9888 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info)
9889 {
9890         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9891         struct net_device *dev = info->user_ptr[1];
9892
9893         return cfg80211_leave_ocb(rdev, dev);
9894 }
9895
9896 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
9897 {
9898         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9899         struct net_device *dev = info->user_ptr[1];
9900         struct mesh_config cfg;
9901         struct mesh_setup setup;
9902         int err;
9903
9904         /* start with default */
9905         memcpy(&cfg, &default_mesh_config, sizeof(cfg));
9906         memcpy(&setup, &default_mesh_setup, sizeof(setup));
9907
9908         if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
9909                 /* and parse parameters if given */
9910                 err = nl80211_parse_mesh_config(info, &cfg, NULL);
9911                 if (err)
9912                         return err;
9913         }
9914
9915         if (!info->attrs[NL80211_ATTR_MESH_ID] ||
9916             !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
9917                 return -EINVAL;
9918
9919         setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
9920         setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
9921
9922         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
9923             !nl80211_parse_mcast_rate(rdev, setup.mcast_rate,
9924                             nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
9925                         return -EINVAL;
9926
9927         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
9928                 setup.beacon_interval =
9929                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
9930
9931                 err = cfg80211_validate_beacon_int(rdev,
9932                                                    NL80211_IFTYPE_MESH_POINT,
9933                                                    setup.beacon_interval);
9934                 if (err)
9935                         return err;
9936         }
9937
9938         if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
9939                 setup.dtim_period =
9940                         nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
9941                 if (setup.dtim_period < 1 || setup.dtim_period > 100)
9942                         return -EINVAL;
9943         }
9944
9945         if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
9946                 /* parse additional setup parameters if given */
9947                 err = nl80211_parse_mesh_setup(info, &setup);
9948                 if (err)
9949                         return err;
9950         }
9951
9952         if (setup.user_mpm)
9953                 cfg.auto_open_plinks = false;
9954
9955         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
9956                 err = nl80211_parse_chandef(rdev, info, &setup.chandef);
9957                 if (err)
9958                         return err;
9959         } else {
9960                 /* cfg80211_join_mesh() will sort it out */
9961                 setup.chandef.chan = NULL;
9962         }
9963
9964         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
9965                 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
9966                 int n_rates =
9967                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
9968                 struct ieee80211_supported_band *sband;
9969
9970                 if (!setup.chandef.chan)
9971                         return -EINVAL;
9972
9973                 sband = rdev->wiphy.bands[setup.chandef.chan->band];
9974
9975                 err = ieee80211_get_ratemask(sband, rates, n_rates,
9976                                              &setup.basic_rates);
9977                 if (err)
9978                         return err;
9979         }
9980
9981         if (info->attrs[NL80211_ATTR_TX_RATES]) {
9982                 err = nl80211_parse_tx_bitrate_mask(info, &setup.beacon_rate);
9983                 if (err)
9984                         return err;
9985
9986                 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band,
9987                                               &setup.beacon_rate);
9988                 if (err)
9989                         return err;
9990         }
9991
9992         setup.userspace_handles_dfs =
9993                 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
9994
9995         return cfg80211_join_mesh(rdev, dev, &setup, &cfg);
9996 }
9997
9998 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
9999 {
10000         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10001         struct net_device *dev = info->user_ptr[1];
10002
10003         return cfg80211_leave_mesh(rdev, dev);
10004 }
10005
10006 #ifdef CONFIG_PM
10007 static int nl80211_send_wowlan_patterns(struct sk_buff *msg,
10008                                         struct cfg80211_registered_device *rdev)
10009 {
10010         struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config;
10011         struct nlattr *nl_pats, *nl_pat;
10012         int i, pat_len;
10013
10014         if (!wowlan->n_patterns)
10015                 return 0;
10016
10017         nl_pats = nla_nest_start(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN);
10018         if (!nl_pats)
10019                 return -ENOBUFS;
10020
10021         for (i = 0; i < wowlan->n_patterns; i++) {
10022                 nl_pat = nla_nest_start(msg, i + 1);
10023                 if (!nl_pat)
10024                         return -ENOBUFS;
10025                 pat_len = wowlan->patterns[i].pattern_len;
10026                 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8),
10027                             wowlan->patterns[i].mask) ||
10028                     nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
10029                             wowlan->patterns[i].pattern) ||
10030                     nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
10031                                 wowlan->patterns[i].pkt_offset))
10032                         return -ENOBUFS;
10033                 nla_nest_end(msg, nl_pat);
10034         }
10035         nla_nest_end(msg, nl_pats);
10036
10037         return 0;
10038 }
10039
10040 static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
10041                                    struct cfg80211_wowlan_tcp *tcp)
10042 {
10043         struct nlattr *nl_tcp;
10044
10045         if (!tcp)
10046                 return 0;
10047
10048         nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
10049         if (!nl_tcp)
10050                 return -ENOBUFS;
10051
10052         if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) ||
10053             nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) ||
10054             nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) ||
10055             nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) ||
10056             nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) ||
10057             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
10058                     tcp->payload_len, tcp->payload) ||
10059             nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
10060                         tcp->data_interval) ||
10061             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
10062                     tcp->wake_len, tcp->wake_data) ||
10063             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK,
10064                     DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask))
10065                 return -ENOBUFS;
10066
10067         if (tcp->payload_seq.len &&
10068             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
10069                     sizeof(tcp->payload_seq), &tcp->payload_seq))
10070                 return -ENOBUFS;
10071
10072         if (tcp->payload_tok.len &&
10073             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
10074                     sizeof(tcp->payload_tok) + tcp->tokens_size,
10075                     &tcp->payload_tok))
10076                 return -ENOBUFS;
10077
10078         nla_nest_end(msg, nl_tcp);
10079
10080         return 0;
10081 }
10082
10083 static int nl80211_send_wowlan_nd(struct sk_buff *msg,
10084                                   struct cfg80211_sched_scan_request *req)
10085 {
10086         struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan;
10087         int i;
10088
10089         if (!req)
10090                 return 0;
10091
10092         nd = nla_nest_start(msg, NL80211_WOWLAN_TRIG_NET_DETECT);
10093         if (!nd)
10094                 return -ENOBUFS;
10095
10096         if (req->n_scan_plans == 1 &&
10097             nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL,
10098                         req->scan_plans[0].interval * 1000))
10099                 return -ENOBUFS;
10100
10101         if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay))
10102                 return -ENOBUFS;
10103
10104         if (req->relative_rssi_set) {
10105                 struct nl80211_bss_select_rssi_adjust rssi_adjust;
10106
10107                 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI,
10108                                req->relative_rssi))
10109                         return -ENOBUFS;
10110
10111                 rssi_adjust.band = req->rssi_adjust.band;
10112                 rssi_adjust.delta = req->rssi_adjust.delta;
10113                 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST,
10114                             sizeof(rssi_adjust), &rssi_adjust))
10115                         return -ENOBUFS;
10116         }
10117
10118         freqs = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
10119         if (!freqs)
10120                 return -ENOBUFS;
10121
10122         for (i = 0; i < req->n_channels; i++) {
10123                 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
10124                         return -ENOBUFS;
10125         }
10126
10127         nla_nest_end(msg, freqs);
10128
10129         if (req->n_match_sets) {
10130                 matches = nla_nest_start(msg, NL80211_ATTR_SCHED_SCAN_MATCH);
10131                 if (!matches)
10132                         return -ENOBUFS;
10133
10134                 for (i = 0; i < req->n_match_sets; i++) {
10135                         match = nla_nest_start(msg, i);
10136                         if (!match)
10137                                 return -ENOBUFS;
10138
10139                         if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
10140                                     req->match_sets[i].ssid.ssid_len,
10141                                     req->match_sets[i].ssid.ssid))
10142                                 return -ENOBUFS;
10143                         nla_nest_end(msg, match);
10144                 }
10145                 nla_nest_end(msg, matches);
10146         }
10147
10148         scan_plans = nla_nest_start(msg, NL80211_ATTR_SCHED_SCAN_PLANS);
10149         if (!scan_plans)
10150                 return -ENOBUFS;
10151
10152         for (i = 0; i < req->n_scan_plans; i++) {
10153                 scan_plan = nla_nest_start(msg, i + 1);
10154                 if (!scan_plan)
10155                         return -ENOBUFS;
10156
10157                 if (!scan_plan ||
10158                     nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL,
10159                                 req->scan_plans[i].interval) ||
10160                     (req->scan_plans[i].iterations &&
10161                      nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS,
10162                                  req->scan_plans[i].iterations)))
10163                         return -ENOBUFS;
10164                 nla_nest_end(msg, scan_plan);
10165         }
10166         nla_nest_end(msg, scan_plans);
10167
10168         nla_nest_end(msg, nd);
10169
10170         return 0;
10171 }
10172
10173 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
10174 {
10175         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10176         struct sk_buff *msg;
10177         void *hdr;
10178         u32 size = NLMSG_DEFAULT_SIZE;
10179
10180         if (!rdev->wiphy.wowlan)
10181                 return -EOPNOTSUPP;
10182
10183         if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) {
10184                 /* adjust size to have room for all the data */
10185                 size += rdev->wiphy.wowlan_config->tcp->tokens_size +
10186                         rdev->wiphy.wowlan_config->tcp->payload_len +
10187                         rdev->wiphy.wowlan_config->tcp->wake_len +
10188                         rdev->wiphy.wowlan_config->tcp->wake_len / 8;
10189         }
10190
10191         msg = nlmsg_new(size, GFP_KERNEL);
10192         if (!msg)
10193                 return -ENOMEM;
10194
10195         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10196                              NL80211_CMD_GET_WOWLAN);
10197         if (!hdr)
10198                 goto nla_put_failure;
10199
10200         if (rdev->wiphy.wowlan_config) {
10201                 struct nlattr *nl_wowlan;
10202
10203                 nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
10204                 if (!nl_wowlan)
10205                         goto nla_put_failure;
10206
10207                 if ((rdev->wiphy.wowlan_config->any &&
10208                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
10209                     (rdev->wiphy.wowlan_config->disconnect &&
10210                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
10211                     (rdev->wiphy.wowlan_config->magic_pkt &&
10212                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
10213                     (rdev->wiphy.wowlan_config->gtk_rekey_failure &&
10214                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
10215                     (rdev->wiphy.wowlan_config->eap_identity_req &&
10216                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
10217                     (rdev->wiphy.wowlan_config->four_way_handshake &&
10218                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
10219                     (rdev->wiphy.wowlan_config->rfkill_release &&
10220                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
10221                         goto nla_put_failure;
10222
10223                 if (nl80211_send_wowlan_patterns(msg, rdev))
10224                         goto nla_put_failure;
10225
10226                 if (nl80211_send_wowlan_tcp(msg,
10227                                             rdev->wiphy.wowlan_config->tcp))
10228                         goto nla_put_failure;
10229
10230                 if (nl80211_send_wowlan_nd(
10231                             msg,
10232                             rdev->wiphy.wowlan_config->nd_config))
10233                         goto nla_put_failure;
10234
10235                 nla_nest_end(msg, nl_wowlan);
10236         }
10237
10238         genlmsg_end(msg, hdr);
10239         return genlmsg_reply(msg, info);
10240
10241 nla_put_failure:
10242         nlmsg_free(msg);
10243         return -ENOBUFS;
10244 }
10245
10246 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev,
10247                                     struct nlattr *attr,
10248                                     struct cfg80211_wowlan *trig)
10249 {
10250         struct nlattr *tb[NUM_NL80211_WOWLAN_TCP];
10251         struct cfg80211_wowlan_tcp *cfg;
10252         struct nl80211_wowlan_tcp_data_token *tok = NULL;
10253         struct nl80211_wowlan_tcp_data_seq *seq = NULL;
10254         u32 size;
10255         u32 data_size, wake_size, tokens_size = 0, wake_mask_size;
10256         int err, port;
10257
10258         if (!rdev->wiphy.wowlan->tcp)
10259                 return -EINVAL;
10260
10261         err = nla_parse_nested(tb, MAX_NL80211_WOWLAN_TCP, attr,
10262                                nl80211_wowlan_tcp_policy, NULL);
10263         if (err)
10264                 return err;
10265
10266         if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] ||
10267             !tb[NL80211_WOWLAN_TCP_DST_IPV4] ||
10268             !tb[NL80211_WOWLAN_TCP_DST_MAC] ||
10269             !tb[NL80211_WOWLAN_TCP_DST_PORT] ||
10270             !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] ||
10271             !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] ||
10272             !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] ||
10273             !tb[NL80211_WOWLAN_TCP_WAKE_MASK])
10274                 return -EINVAL;
10275
10276         data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]);
10277         if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max)
10278                 return -EINVAL;
10279
10280         if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) >
10281                         rdev->wiphy.wowlan->tcp->data_interval_max ||
10282             nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0)
10283                 return -EINVAL;
10284
10285         wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]);
10286         if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max)
10287                 return -EINVAL;
10288
10289         wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]);
10290         if (wake_mask_size != DIV_ROUND_UP(wake_size, 8))
10291                 return -EINVAL;
10292
10293         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) {
10294                 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
10295
10296                 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
10297                 tokens_size = tokln - sizeof(*tok);
10298
10299                 if (!tok->len || tokens_size % tok->len)
10300                         return -EINVAL;
10301                 if (!rdev->wiphy.wowlan->tcp->tok)
10302                         return -EINVAL;
10303                 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len)
10304                         return -EINVAL;
10305                 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len)
10306                         return -EINVAL;
10307                 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize)
10308                         return -EINVAL;
10309                 if (tok->offset + tok->len > data_size)
10310                         return -EINVAL;
10311         }
10312
10313         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) {
10314                 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]);
10315                 if (!rdev->wiphy.wowlan->tcp->seq)
10316                         return -EINVAL;
10317                 if (seq->len == 0 || seq->len > 4)
10318                         return -EINVAL;
10319                 if (seq->len + seq->offset > data_size)
10320                         return -EINVAL;
10321         }
10322
10323         size = sizeof(*cfg);
10324         size += data_size;
10325         size += wake_size + wake_mask_size;
10326         size += tokens_size;
10327
10328         cfg = kzalloc(size, GFP_KERNEL);
10329         if (!cfg)
10330                 return -ENOMEM;
10331         cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]);
10332         cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]);
10333         memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]),
10334                ETH_ALEN);
10335         if (tb[NL80211_WOWLAN_TCP_SRC_PORT])
10336                 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]);
10337         else
10338                 port = 0;
10339 #ifdef CONFIG_INET
10340         /* allocate a socket and port for it and use it */
10341         err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM,
10342                             IPPROTO_TCP, &cfg->sock, 1);
10343         if (err) {
10344                 kfree(cfg);
10345                 return err;
10346         }
10347         if (inet_csk_get_port(cfg->sock->sk, port)) {
10348                 sock_release(cfg->sock);
10349                 kfree(cfg);
10350                 return -EADDRINUSE;
10351         }
10352         cfg->src_port = inet_sk(cfg->sock->sk)->inet_num;
10353 #else
10354         if (!port) {
10355                 kfree(cfg);
10356                 return -EINVAL;
10357         }
10358         cfg->src_port = port;
10359 #endif
10360
10361         cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]);
10362         cfg->payload_len = data_size;
10363         cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size;
10364         memcpy((void *)cfg->payload,
10365                nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]),
10366                data_size);
10367         if (seq)
10368                 cfg->payload_seq = *seq;
10369         cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]);
10370         cfg->wake_len = wake_size;
10371         cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size;
10372         memcpy((void *)cfg->wake_data,
10373                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]),
10374                wake_size);
10375         cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size +
10376                          data_size + wake_size;
10377         memcpy((void *)cfg->wake_mask,
10378                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]),
10379                wake_mask_size);
10380         if (tok) {
10381                 cfg->tokens_size = tokens_size;
10382                 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size);
10383         }
10384
10385         trig->tcp = cfg;
10386
10387         return 0;
10388 }
10389
10390 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev,
10391                                    const struct wiphy_wowlan_support *wowlan,
10392                                    struct nlattr *attr,
10393                                    struct cfg80211_wowlan *trig)
10394 {
10395         struct nlattr **tb;
10396         int err;
10397
10398         tb = kzalloc(NUM_NL80211_ATTR * sizeof(*tb), GFP_KERNEL);
10399         if (!tb)
10400                 return -ENOMEM;
10401
10402         if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) {
10403                 err = -EOPNOTSUPP;
10404                 goto out;
10405         }
10406
10407         err = nla_parse_nested(tb, NL80211_ATTR_MAX, attr, nl80211_policy,
10408                                NULL);
10409         if (err)
10410                 goto out;
10411
10412         trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb,
10413                                                    wowlan->max_nd_match_sets);
10414         err = PTR_ERR_OR_ZERO(trig->nd_config);
10415         if (err)
10416                 trig->nd_config = NULL;
10417
10418 out:
10419         kfree(tb);
10420         return err;
10421 }
10422
10423 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
10424 {
10425         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10426         struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG];
10427         struct cfg80211_wowlan new_triggers = {};
10428         struct cfg80211_wowlan *ntrig;
10429         const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan;
10430         int err, i;
10431         bool prev_enabled = rdev->wiphy.wowlan_config;
10432         bool regular = false;
10433
10434         if (!wowlan)
10435                 return -EOPNOTSUPP;
10436
10437         if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) {
10438                 cfg80211_rdev_free_wowlan(rdev);
10439                 rdev->wiphy.wowlan_config = NULL;
10440                 goto set_wakeup;
10441         }
10442
10443         err = nla_parse_nested(tb, MAX_NL80211_WOWLAN_TRIG,
10444                                info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS],
10445                                nl80211_wowlan_policy, info->extack);
10446         if (err)
10447                 return err;
10448
10449         if (tb[NL80211_WOWLAN_TRIG_ANY]) {
10450                 if (!(wowlan->flags & WIPHY_WOWLAN_ANY))
10451                         return -EINVAL;
10452                 new_triggers.any = true;
10453         }
10454
10455         if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) {
10456                 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT))
10457                         return -EINVAL;
10458                 new_triggers.disconnect = true;
10459                 regular = true;
10460         }
10461
10462         if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) {
10463                 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT))
10464                         return -EINVAL;
10465                 new_triggers.magic_pkt = true;
10466                 regular = true;
10467         }
10468
10469         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED])
10470                 return -EINVAL;
10471
10472         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) {
10473                 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE))
10474                         return -EINVAL;
10475                 new_triggers.gtk_rekey_failure = true;
10476                 regular = true;
10477         }
10478
10479         if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) {
10480                 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ))
10481                         return -EINVAL;
10482                 new_triggers.eap_identity_req = true;
10483                 regular = true;
10484         }
10485
10486         if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) {
10487                 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE))
10488                         return -EINVAL;
10489                 new_triggers.four_way_handshake = true;
10490                 regular = true;
10491         }
10492
10493         if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) {
10494                 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE))
10495                         return -EINVAL;
10496                 new_triggers.rfkill_release = true;
10497                 regular = true;
10498         }
10499
10500         if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) {
10501                 struct nlattr *pat;
10502                 int n_patterns = 0;
10503                 int rem, pat_len, mask_len, pkt_offset;
10504                 struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
10505
10506                 regular = true;
10507
10508                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
10509                                     rem)
10510                         n_patterns++;
10511                 if (n_patterns > wowlan->n_patterns)
10512                         return -EINVAL;
10513
10514                 new_triggers.patterns = kcalloc(n_patterns,
10515                                                 sizeof(new_triggers.patterns[0]),
10516                                                 GFP_KERNEL);
10517                 if (!new_triggers.patterns)
10518                         return -ENOMEM;
10519
10520                 new_triggers.n_patterns = n_patterns;
10521                 i = 0;
10522
10523                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
10524                                     rem) {
10525                         u8 *mask_pat;
10526
10527                         nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat,
10528                                          NULL, info->extack);
10529                         err = -EINVAL;
10530                         if (!pat_tb[NL80211_PKTPAT_MASK] ||
10531                             !pat_tb[NL80211_PKTPAT_PATTERN])
10532                                 goto error;
10533                         pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
10534                         mask_len = DIV_ROUND_UP(pat_len, 8);
10535                         if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
10536                                 goto error;
10537                         if (pat_len > wowlan->pattern_max_len ||
10538                             pat_len < wowlan->pattern_min_len)
10539                                 goto error;
10540
10541                         if (!pat_tb[NL80211_PKTPAT_OFFSET])
10542                                 pkt_offset = 0;
10543                         else
10544                                 pkt_offset = nla_get_u32(
10545                                         pat_tb[NL80211_PKTPAT_OFFSET]);
10546                         if (pkt_offset > wowlan->max_pkt_offset)
10547                                 goto error;
10548                         new_triggers.patterns[i].pkt_offset = pkt_offset;
10549
10550                         mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
10551                         if (!mask_pat) {
10552                                 err = -ENOMEM;
10553                                 goto error;
10554                         }
10555                         new_triggers.patterns[i].mask = mask_pat;
10556                         memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
10557                                mask_len);
10558                         mask_pat += mask_len;
10559                         new_triggers.patterns[i].pattern = mask_pat;
10560                         new_triggers.patterns[i].pattern_len = pat_len;
10561                         memcpy(mask_pat,
10562                                nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
10563                                pat_len);
10564                         i++;
10565                 }
10566         }
10567
10568         if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) {
10569                 regular = true;
10570                 err = nl80211_parse_wowlan_tcp(
10571                         rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION],
10572                         &new_triggers);
10573                 if (err)
10574                         goto error;
10575         }
10576
10577         if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) {
10578                 regular = true;
10579                 err = nl80211_parse_wowlan_nd(
10580                         rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT],
10581                         &new_triggers);
10582                 if (err)
10583                         goto error;
10584         }
10585
10586         /* The 'any' trigger means the device continues operating more or less
10587          * as in its normal operation mode and wakes up the host on most of the
10588          * normal interrupts (like packet RX, ...)
10589          * It therefore makes little sense to combine with the more constrained
10590          * wakeup trigger modes.
10591          */
10592         if (new_triggers.any && regular) {
10593                 err = -EINVAL;
10594                 goto error;
10595         }
10596
10597         ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL);
10598         if (!ntrig) {
10599                 err = -ENOMEM;
10600                 goto error;
10601         }
10602         cfg80211_rdev_free_wowlan(rdev);
10603         rdev->wiphy.wowlan_config = ntrig;
10604
10605  set_wakeup:
10606         if (rdev->ops->set_wakeup &&
10607             prev_enabled != !!rdev->wiphy.wowlan_config)
10608                 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config);
10609
10610         return 0;
10611  error:
10612         for (i = 0; i < new_triggers.n_patterns; i++)
10613                 kfree(new_triggers.patterns[i].mask);
10614         kfree(new_triggers.patterns);
10615         if (new_triggers.tcp && new_triggers.tcp->sock)
10616                 sock_release(new_triggers.tcp->sock);
10617         kfree(new_triggers.tcp);
10618         kfree(new_triggers.nd_config);
10619         return err;
10620 }
10621 #endif
10622
10623 static int nl80211_send_coalesce_rules(struct sk_buff *msg,
10624                                        struct cfg80211_registered_device *rdev)
10625 {
10626         struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules;
10627         int i, j, pat_len;
10628         struct cfg80211_coalesce_rules *rule;
10629
10630         if (!rdev->coalesce->n_rules)
10631                 return 0;
10632
10633         nl_rules = nla_nest_start(msg, NL80211_ATTR_COALESCE_RULE);
10634         if (!nl_rules)
10635                 return -ENOBUFS;
10636
10637         for (i = 0; i < rdev->coalesce->n_rules; i++) {
10638                 nl_rule = nla_nest_start(msg, i + 1);
10639                 if (!nl_rule)
10640                         return -ENOBUFS;
10641
10642                 rule = &rdev->coalesce->rules[i];
10643                 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY,
10644                                 rule->delay))
10645                         return -ENOBUFS;
10646
10647                 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION,
10648                                 rule->condition))
10649                         return -ENOBUFS;
10650
10651                 nl_pats = nla_nest_start(msg,
10652                                 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN);
10653                 if (!nl_pats)
10654                         return -ENOBUFS;
10655
10656                 for (j = 0; j < rule->n_patterns; j++) {
10657                         nl_pat = nla_nest_start(msg, j + 1);
10658                         if (!nl_pat)
10659                                 return -ENOBUFS;
10660                         pat_len = rule->patterns[j].pattern_len;
10661                         if (nla_put(msg, NL80211_PKTPAT_MASK,
10662                                     DIV_ROUND_UP(pat_len, 8),
10663                                     rule->patterns[j].mask) ||
10664                             nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
10665                                     rule->patterns[j].pattern) ||
10666                             nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
10667                                         rule->patterns[j].pkt_offset))
10668                                 return -ENOBUFS;
10669                         nla_nest_end(msg, nl_pat);
10670                 }
10671                 nla_nest_end(msg, nl_pats);
10672                 nla_nest_end(msg, nl_rule);
10673         }
10674         nla_nest_end(msg, nl_rules);
10675
10676         return 0;
10677 }
10678
10679 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info)
10680 {
10681         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10682         struct sk_buff *msg;
10683         void *hdr;
10684
10685         if (!rdev->wiphy.coalesce)
10686                 return -EOPNOTSUPP;
10687
10688         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10689         if (!msg)
10690                 return -ENOMEM;
10691
10692         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10693                              NL80211_CMD_GET_COALESCE);
10694         if (!hdr)
10695                 goto nla_put_failure;
10696
10697         if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev))
10698                 goto nla_put_failure;
10699
10700         genlmsg_end(msg, hdr);
10701         return genlmsg_reply(msg, info);
10702
10703 nla_put_failure:
10704         nlmsg_free(msg);
10705         return -ENOBUFS;
10706 }
10707
10708 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev)
10709 {
10710         struct cfg80211_coalesce *coalesce = rdev->coalesce;
10711         int i, j;
10712         struct cfg80211_coalesce_rules *rule;
10713
10714         if (!coalesce)
10715                 return;
10716
10717         for (i = 0; i < coalesce->n_rules; i++) {
10718                 rule = &coalesce->rules[i];
10719                 for (j = 0; j < rule->n_patterns; j++)
10720                         kfree(rule->patterns[j].mask);
10721                 kfree(rule->patterns);
10722         }
10723         kfree(coalesce->rules);
10724         kfree(coalesce);
10725         rdev->coalesce = NULL;
10726 }
10727
10728 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,
10729                                        struct nlattr *rule,
10730                                        struct cfg80211_coalesce_rules *new_rule)
10731 {
10732         int err, i;
10733         const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
10734         struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat;
10735         int rem, pat_len, mask_len, pkt_offset, n_patterns = 0;
10736         struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
10737
10738         err = nla_parse_nested(tb, NL80211_ATTR_COALESCE_RULE_MAX, rule,
10739                                nl80211_coalesce_policy, NULL);
10740         if (err)
10741                 return err;
10742
10743         if (tb[NL80211_ATTR_COALESCE_RULE_DELAY])
10744                 new_rule->delay =
10745                         nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]);
10746         if (new_rule->delay > coalesce->max_delay)
10747                 return -EINVAL;
10748
10749         if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION])
10750                 new_rule->condition =
10751                         nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]);
10752         if (new_rule->condition != NL80211_COALESCE_CONDITION_MATCH &&
10753             new_rule->condition != NL80211_COALESCE_CONDITION_NO_MATCH)
10754                 return -EINVAL;
10755
10756         if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN])
10757                 return -EINVAL;
10758
10759         nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
10760                             rem)
10761                 n_patterns++;
10762         if (n_patterns > coalesce->n_patterns)
10763                 return -EINVAL;
10764
10765         new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]),
10766                                      GFP_KERNEL);
10767         if (!new_rule->patterns)
10768                 return -ENOMEM;
10769
10770         new_rule->n_patterns = n_patterns;
10771         i = 0;
10772
10773         nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
10774                             rem) {
10775                 u8 *mask_pat;
10776
10777                 nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat, NULL, NULL);
10778                 if (!pat_tb[NL80211_PKTPAT_MASK] ||
10779                     !pat_tb[NL80211_PKTPAT_PATTERN])
10780                         return -EINVAL;
10781                 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
10782                 mask_len = DIV_ROUND_UP(pat_len, 8);
10783                 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
10784                         return -EINVAL;
10785                 if (pat_len > coalesce->pattern_max_len ||
10786                     pat_len < coalesce->pattern_min_len)
10787                         return -EINVAL;
10788
10789                 if (!pat_tb[NL80211_PKTPAT_OFFSET])
10790                         pkt_offset = 0;
10791                 else
10792                         pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]);
10793                 if (pkt_offset > coalesce->max_pkt_offset)
10794                         return -EINVAL;
10795                 new_rule->patterns[i].pkt_offset = pkt_offset;
10796
10797                 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
10798                 if (!mask_pat)
10799                         return -ENOMEM;
10800
10801                 new_rule->patterns[i].mask = mask_pat;
10802                 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
10803                        mask_len);
10804
10805                 mask_pat += mask_len;
10806                 new_rule->patterns[i].pattern = mask_pat;
10807                 new_rule->patterns[i].pattern_len = pat_len;
10808                 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
10809                        pat_len);
10810                 i++;
10811         }
10812
10813         return 0;
10814 }
10815
10816 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info)
10817 {
10818         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10819         const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
10820         struct cfg80211_coalesce new_coalesce = {};
10821         struct cfg80211_coalesce *n_coalesce;
10822         int err, rem_rule, n_rules = 0, i, j;
10823         struct nlattr *rule;
10824         struct cfg80211_coalesce_rules *tmp_rule;
10825
10826         if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce)
10827                 return -EOPNOTSUPP;
10828
10829         if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) {
10830                 cfg80211_rdev_free_coalesce(rdev);
10831                 rdev_set_coalesce(rdev, NULL);
10832                 return 0;
10833         }
10834
10835         nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
10836                             rem_rule)
10837                 n_rules++;
10838         if (n_rules > coalesce->n_rules)
10839                 return -EINVAL;
10840
10841         new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]),
10842                                      GFP_KERNEL);
10843         if (!new_coalesce.rules)
10844                 return -ENOMEM;
10845
10846         new_coalesce.n_rules = n_rules;
10847         i = 0;
10848
10849         nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
10850                             rem_rule) {
10851                 err = nl80211_parse_coalesce_rule(rdev, rule,
10852                                                   &new_coalesce.rules[i]);
10853                 if (err)
10854                         goto error;
10855
10856                 i++;
10857         }
10858
10859         err = rdev_set_coalesce(rdev, &new_coalesce);
10860         if (err)
10861                 goto error;
10862
10863         n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL);
10864         if (!n_coalesce) {
10865                 err = -ENOMEM;
10866                 goto error;
10867         }
10868         cfg80211_rdev_free_coalesce(rdev);
10869         rdev->coalesce = n_coalesce;
10870
10871         return 0;
10872 error:
10873         for (i = 0; i < new_coalesce.n_rules; i++) {
10874                 tmp_rule = &new_coalesce.rules[i];
10875                 for (j = 0; j < tmp_rule->n_patterns; j++)
10876                         kfree(tmp_rule->patterns[j].mask);
10877                 kfree(tmp_rule->patterns);
10878         }
10879         kfree(new_coalesce.rules);
10880
10881         return err;
10882 }
10883
10884 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
10885 {
10886         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10887         struct net_device *dev = info->user_ptr[1];
10888         struct wireless_dev *wdev = dev->ieee80211_ptr;
10889         struct nlattr *tb[NUM_NL80211_REKEY_DATA];
10890         struct cfg80211_gtk_rekey_data rekey_data;
10891         int err;
10892
10893         if (!info->attrs[NL80211_ATTR_REKEY_DATA])
10894                 return -EINVAL;
10895
10896         err = nla_parse_nested(tb, MAX_NL80211_REKEY_DATA,
10897                                info->attrs[NL80211_ATTR_REKEY_DATA],
10898                                nl80211_rekey_policy, info->extack);
10899         if (err)
10900                 return err;
10901
10902         if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN)
10903                 return -ERANGE;
10904         if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN)
10905                 return -ERANGE;
10906         if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN)
10907                 return -ERANGE;
10908
10909         rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]);
10910         rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]);
10911         rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]);
10912
10913         wdev_lock(wdev);
10914         if (!wdev->current_bss) {
10915                 err = -ENOTCONN;
10916                 goto out;
10917         }
10918
10919         if (!rdev->ops->set_rekey_data) {
10920                 err = -EOPNOTSUPP;
10921                 goto out;
10922         }
10923
10924         err = rdev_set_rekey_data(rdev, dev, &rekey_data);
10925  out:
10926         wdev_unlock(wdev);
10927         return err;
10928 }
10929
10930 static int nl80211_register_unexpected_frame(struct sk_buff *skb,
10931                                              struct genl_info *info)
10932 {
10933         struct net_device *dev = info->user_ptr[1];
10934         struct wireless_dev *wdev = dev->ieee80211_ptr;
10935
10936         if (wdev->iftype != NL80211_IFTYPE_AP &&
10937             wdev->iftype != NL80211_IFTYPE_P2P_GO)
10938                 return -EINVAL;
10939
10940         if (wdev->ap_unexpected_nlportid)
10941                 return -EBUSY;
10942
10943         wdev->ap_unexpected_nlportid = info->snd_portid;
10944         return 0;
10945 }
10946
10947 static int nl80211_probe_client(struct sk_buff *skb,
10948                                 struct genl_info *info)
10949 {
10950         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10951         struct net_device *dev = info->user_ptr[1];
10952         struct wireless_dev *wdev = dev->ieee80211_ptr;
10953         struct sk_buff *msg;
10954         void *hdr;
10955         const u8 *addr;
10956         u64 cookie;
10957         int err;
10958
10959         if (wdev->iftype != NL80211_IFTYPE_AP &&
10960             wdev->iftype != NL80211_IFTYPE_P2P_GO)
10961                 return -EOPNOTSUPP;
10962
10963         if (!info->attrs[NL80211_ATTR_MAC])
10964                 return -EINVAL;
10965
10966         if (!rdev->ops->probe_client)
10967                 return -EOPNOTSUPP;
10968
10969         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10970         if (!msg)
10971                 return -ENOMEM;
10972
10973         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10974                              NL80211_CMD_PROBE_CLIENT);
10975         if (!hdr) {
10976                 err = -ENOBUFS;
10977                 goto free_msg;
10978         }
10979
10980         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
10981
10982         err = rdev_probe_client(rdev, dev, addr, &cookie);
10983         if (err)
10984                 goto free_msg;
10985
10986         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
10987                               NL80211_ATTR_PAD))
10988                 goto nla_put_failure;
10989
10990         genlmsg_end(msg, hdr);
10991
10992         return genlmsg_reply(msg, info);
10993
10994  nla_put_failure:
10995         err = -ENOBUFS;
10996  free_msg:
10997         nlmsg_free(msg);
10998         return err;
10999 }
11000
11001 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info)
11002 {
11003         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11004         struct cfg80211_beacon_registration *reg, *nreg;
11005         int rv;
11006
11007         if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS))
11008                 return -EOPNOTSUPP;
11009
11010         nreg = kzalloc(sizeof(*nreg), GFP_KERNEL);
11011         if (!nreg)
11012                 return -ENOMEM;
11013
11014         /* First, check if already registered. */
11015         spin_lock_bh(&rdev->beacon_registrations_lock);
11016         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
11017                 if (reg->nlportid == info->snd_portid) {
11018                         rv = -EALREADY;
11019                         goto out_err;
11020                 }
11021         }
11022         /* Add it to the list */
11023         nreg->nlportid = info->snd_portid;
11024         list_add(&nreg->list, &rdev->beacon_registrations);
11025
11026         spin_unlock_bh(&rdev->beacon_registrations_lock);
11027
11028         return 0;
11029 out_err:
11030         spin_unlock_bh(&rdev->beacon_registrations_lock);
11031         kfree(nreg);
11032         return rv;
11033 }
11034
11035 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
11036 {
11037         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11038         struct wireless_dev *wdev = info->user_ptr[1];
11039         int err;
11040
11041         if (!rdev->ops->start_p2p_device)
11042                 return -EOPNOTSUPP;
11043
11044         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
11045                 return -EOPNOTSUPP;
11046
11047         if (wdev_running(wdev))
11048                 return 0;
11049
11050         if (rfkill_blocked(rdev->rfkill))
11051                 return -ERFKILL;
11052
11053         err = rdev_start_p2p_device(rdev, wdev);
11054         if (err)
11055                 return err;
11056
11057         wdev->is_running = true;
11058         rdev->opencount++;
11059
11060         return 0;
11061 }
11062
11063 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info)
11064 {
11065         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11066         struct wireless_dev *wdev = info->user_ptr[1];
11067
11068         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
11069                 return -EOPNOTSUPP;
11070
11071         if (!rdev->ops->stop_p2p_device)
11072                 return -EOPNOTSUPP;
11073
11074         cfg80211_stop_p2p_device(rdev, wdev);
11075
11076         return 0;
11077 }
11078
11079 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
11080 {
11081         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11082         struct wireless_dev *wdev = info->user_ptr[1];
11083         struct cfg80211_nan_conf conf = {};
11084         int err;
11085
11086         if (wdev->iftype != NL80211_IFTYPE_NAN)
11087                 return -EOPNOTSUPP;
11088
11089         if (wdev_running(wdev))
11090                 return -EEXIST;
11091
11092         if (rfkill_blocked(rdev->rfkill))
11093                 return -ERFKILL;
11094
11095         if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF])
11096                 return -EINVAL;
11097
11098         conf.master_pref =
11099                 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
11100         if (!conf.master_pref)
11101                 return -EINVAL;
11102
11103         if (info->attrs[NL80211_ATTR_BANDS]) {
11104                 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
11105
11106                 if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
11107                         return -EOPNOTSUPP;
11108
11109                 if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
11110                         return -EINVAL;
11111
11112                 conf.bands = bands;
11113         }
11114
11115         err = rdev_start_nan(rdev, wdev, &conf);
11116         if (err)
11117                 return err;
11118
11119         wdev->is_running = true;
11120         rdev->opencount++;
11121
11122         return 0;
11123 }
11124
11125 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info)
11126 {
11127         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11128         struct wireless_dev *wdev = info->user_ptr[1];
11129
11130         if (wdev->iftype != NL80211_IFTYPE_NAN)
11131                 return -EOPNOTSUPP;
11132
11133         cfg80211_stop_nan(rdev, wdev);
11134
11135         return 0;
11136 }
11137
11138 static int validate_nan_filter(struct nlattr *filter_attr)
11139 {
11140         struct nlattr *attr;
11141         int len = 0, n_entries = 0, rem;
11142
11143         nla_for_each_nested(attr, filter_attr, rem) {
11144                 len += nla_len(attr);
11145                 n_entries++;
11146         }
11147
11148         if (len >= U8_MAX)
11149                 return -EINVAL;
11150
11151         return n_entries;
11152 }
11153
11154 static int handle_nan_filter(struct nlattr *attr_filter,
11155                              struct cfg80211_nan_func *func,
11156                              bool tx)
11157 {
11158         struct nlattr *attr;
11159         int n_entries, rem, i;
11160         struct cfg80211_nan_func_filter *filter;
11161
11162         n_entries = validate_nan_filter(attr_filter);
11163         if (n_entries < 0)
11164                 return n_entries;
11165
11166         BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters));
11167
11168         filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL);
11169         if (!filter)
11170                 return -ENOMEM;
11171
11172         i = 0;
11173         nla_for_each_nested(attr, attr_filter, rem) {
11174                 filter[i].filter = nla_memdup(attr, GFP_KERNEL);
11175                 filter[i].len = nla_len(attr);
11176                 i++;
11177         }
11178         if (tx) {
11179                 func->num_tx_filters = n_entries;
11180                 func->tx_filters = filter;
11181         } else {
11182                 func->num_rx_filters = n_entries;
11183                 func->rx_filters = filter;
11184         }
11185
11186         return 0;
11187 }
11188
11189 static int nl80211_nan_add_func(struct sk_buff *skb,
11190                                 struct genl_info *info)
11191 {
11192         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11193         struct wireless_dev *wdev = info->user_ptr[1];
11194         struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr;
11195         struct cfg80211_nan_func *func;
11196         struct sk_buff *msg = NULL;
11197         void *hdr = NULL;
11198         int err = 0;
11199
11200         if (wdev->iftype != NL80211_IFTYPE_NAN)
11201                 return -EOPNOTSUPP;
11202
11203         if (!wdev_running(wdev))
11204                 return -ENOTCONN;
11205
11206         if (!info->attrs[NL80211_ATTR_NAN_FUNC])
11207                 return -EINVAL;
11208
11209         err = nla_parse_nested(tb, NL80211_NAN_FUNC_ATTR_MAX,
11210                                info->attrs[NL80211_ATTR_NAN_FUNC],
11211                                nl80211_nan_func_policy, info->extack);
11212         if (err)
11213                 return err;
11214
11215         func = kzalloc(sizeof(*func), GFP_KERNEL);
11216         if (!func)
11217                 return -ENOMEM;
11218
11219         func->cookie = wdev->wiphy->cookie_counter++;
11220
11221         if (!tb[NL80211_NAN_FUNC_TYPE] ||
11222             nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]) > NL80211_NAN_FUNC_MAX_TYPE) {
11223                 err = -EINVAL;
11224                 goto out;
11225         }
11226
11227
11228         func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]);
11229
11230         if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) {
11231                 err = -EINVAL;
11232                 goto out;
11233         }
11234
11235         memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]),
11236                sizeof(func->service_id));
11237
11238         func->close_range =
11239                 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]);
11240
11241         if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) {
11242                 func->serv_spec_info_len =
11243                         nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]);
11244                 func->serv_spec_info =
11245                         kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]),
11246                                 func->serv_spec_info_len,
11247                                 GFP_KERNEL);
11248                 if (!func->serv_spec_info) {
11249                         err = -ENOMEM;
11250                         goto out;
11251                 }
11252         }
11253
11254         if (tb[NL80211_NAN_FUNC_TTL])
11255                 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]);
11256
11257         switch (func->type) {
11258         case NL80211_NAN_FUNC_PUBLISH:
11259                 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) {
11260                         err = -EINVAL;
11261                         goto out;
11262                 }
11263
11264                 func->publish_type =
11265                         nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]);
11266                 func->publish_bcast =
11267                         nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]);
11268
11269                 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) &&
11270                         func->publish_bcast) {
11271                         err = -EINVAL;
11272                         goto out;
11273                 }
11274                 break;
11275         case NL80211_NAN_FUNC_SUBSCRIBE:
11276                 func->subscribe_active =
11277                         nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]);
11278                 break;
11279         case NL80211_NAN_FUNC_FOLLOW_UP:
11280                 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] ||
11281                     !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]) {
11282                         err = -EINVAL;
11283                         goto out;
11284                 }
11285
11286                 func->followup_id =
11287                         nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]);
11288                 func->followup_reqid =
11289                         nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]);
11290                 memcpy(func->followup_dest.addr,
11291                        nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]),
11292                        sizeof(func->followup_dest.addr));
11293                 if (func->ttl) {
11294                         err = -EINVAL;
11295                         goto out;
11296                 }
11297                 break;
11298         default:
11299                 err = -EINVAL;
11300                 goto out;
11301         }
11302
11303         if (tb[NL80211_NAN_FUNC_SRF]) {
11304                 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR];
11305
11306                 err = nla_parse_nested(srf_tb, NL80211_NAN_SRF_ATTR_MAX,
11307                                        tb[NL80211_NAN_FUNC_SRF],
11308                                        nl80211_nan_srf_policy, info->extack);
11309                 if (err)
11310                         goto out;
11311
11312                 func->srf_include =
11313                         nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]);
11314
11315                 if (srf_tb[NL80211_NAN_SRF_BF]) {
11316                         if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] ||
11317                             !srf_tb[NL80211_NAN_SRF_BF_IDX]) {
11318                                 err = -EINVAL;
11319                                 goto out;
11320                         }
11321
11322                         func->srf_bf_len =
11323                                 nla_len(srf_tb[NL80211_NAN_SRF_BF]);
11324                         func->srf_bf =
11325                                 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]),
11326                                         func->srf_bf_len, GFP_KERNEL);
11327                         if (!func->srf_bf) {
11328                                 err = -ENOMEM;
11329                                 goto out;
11330                         }
11331
11332                         func->srf_bf_idx =
11333                                 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]);
11334                 } else {
11335                         struct nlattr *attr, *mac_attr =
11336                                 srf_tb[NL80211_NAN_SRF_MAC_ADDRS];
11337                         int n_entries, rem, i = 0;
11338
11339                         if (!mac_attr) {
11340                                 err = -EINVAL;
11341                                 goto out;
11342                         }
11343
11344                         n_entries = validate_acl_mac_addrs(mac_attr);
11345                         if (n_entries <= 0) {
11346                                 err = -EINVAL;
11347                                 goto out;
11348                         }
11349
11350                         func->srf_num_macs = n_entries;
11351                         func->srf_macs =
11352                                 kzalloc(sizeof(*func->srf_macs) * n_entries,
11353                                         GFP_KERNEL);
11354                         if (!func->srf_macs) {
11355                                 err = -ENOMEM;
11356                                 goto out;
11357                         }
11358
11359                         nla_for_each_nested(attr, mac_attr, rem)
11360                                 memcpy(func->srf_macs[i++].addr, nla_data(attr),
11361                                        sizeof(*func->srf_macs));
11362                 }
11363         }
11364
11365         if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) {
11366                 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER],
11367                                         func, true);
11368                 if (err)
11369                         goto out;
11370         }
11371
11372         if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) {
11373                 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER],
11374                                         func, false);
11375                 if (err)
11376                         goto out;
11377         }
11378
11379         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11380         if (!msg) {
11381                 err = -ENOMEM;
11382                 goto out;
11383         }
11384
11385         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11386                              NL80211_CMD_ADD_NAN_FUNCTION);
11387         /* This can't really happen - we just allocated 4KB */
11388         if (WARN_ON(!hdr)) {
11389                 err = -ENOMEM;
11390                 goto out;
11391         }
11392
11393         err = rdev_add_nan_func(rdev, wdev, func);
11394 out:
11395         if (err < 0) {
11396                 cfg80211_free_nan_func(func);
11397                 nlmsg_free(msg);
11398                 return err;
11399         }
11400
11401         /* propagate the instance id and cookie to userspace  */
11402         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie,
11403                               NL80211_ATTR_PAD))
11404                 goto nla_put_failure;
11405
11406         func_attr = nla_nest_start(msg, NL80211_ATTR_NAN_FUNC);
11407         if (!func_attr)
11408                 goto nla_put_failure;
11409
11410         if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID,
11411                        func->instance_id))
11412                 goto nla_put_failure;
11413
11414         nla_nest_end(msg, func_attr);
11415
11416         genlmsg_end(msg, hdr);
11417         return genlmsg_reply(msg, info);
11418
11419 nla_put_failure:
11420         nlmsg_free(msg);
11421         return -ENOBUFS;
11422 }
11423
11424 static int nl80211_nan_del_func(struct sk_buff *skb,
11425                                struct genl_info *info)
11426 {
11427         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11428         struct wireless_dev *wdev = info->user_ptr[1];
11429         u64 cookie;
11430
11431         if (wdev->iftype != NL80211_IFTYPE_NAN)
11432                 return -EOPNOTSUPP;
11433
11434         if (!wdev_running(wdev))
11435                 return -ENOTCONN;
11436
11437         if (!info->attrs[NL80211_ATTR_COOKIE])
11438                 return -EINVAL;
11439
11440         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
11441
11442         rdev_del_nan_func(rdev, wdev, cookie);
11443
11444         return 0;
11445 }
11446
11447 static int nl80211_nan_change_config(struct sk_buff *skb,
11448                                      struct genl_info *info)
11449 {
11450         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11451         struct wireless_dev *wdev = info->user_ptr[1];
11452         struct cfg80211_nan_conf conf = {};
11453         u32 changed = 0;
11454
11455         if (wdev->iftype != NL80211_IFTYPE_NAN)
11456                 return -EOPNOTSUPP;
11457
11458         if (!wdev_running(wdev))
11459                 return -ENOTCONN;
11460
11461         if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) {
11462                 conf.master_pref =
11463                         nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
11464                 if (conf.master_pref <= 1 || conf.master_pref == 255)
11465                         return -EINVAL;
11466
11467                 changed |= CFG80211_NAN_CONF_CHANGED_PREF;
11468         }
11469
11470         if (info->attrs[NL80211_ATTR_BANDS]) {
11471                 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
11472
11473                 if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
11474                         return -EOPNOTSUPP;
11475
11476                 if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
11477                         return -EINVAL;
11478
11479                 conf.bands = bands;
11480                 changed |= CFG80211_NAN_CONF_CHANGED_BANDS;
11481         }
11482
11483         if (!changed)
11484                 return -EINVAL;
11485
11486         return rdev_nan_change_conf(rdev, wdev, &conf, changed);
11487 }
11488
11489 void cfg80211_nan_match(struct wireless_dev *wdev,
11490                         struct cfg80211_nan_match_params *match, gfp_t gfp)
11491 {
11492         struct wiphy *wiphy = wdev->wiphy;
11493         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
11494         struct nlattr *match_attr, *local_func_attr, *peer_func_attr;
11495         struct sk_buff *msg;
11496         void *hdr;
11497
11498         if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr))
11499                 return;
11500
11501         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11502         if (!msg)
11503                 return;
11504
11505         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH);
11506         if (!hdr) {
11507                 nlmsg_free(msg);
11508                 return;
11509         }
11510
11511         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11512             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
11513                                          wdev->netdev->ifindex)) ||
11514             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
11515                               NL80211_ATTR_PAD))
11516                 goto nla_put_failure;
11517
11518         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie,
11519                               NL80211_ATTR_PAD) ||
11520             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr))
11521                 goto nla_put_failure;
11522
11523         match_attr = nla_nest_start(msg, NL80211_ATTR_NAN_MATCH);
11524         if (!match_attr)
11525                 goto nla_put_failure;
11526
11527         local_func_attr = nla_nest_start(msg, NL80211_NAN_MATCH_FUNC_LOCAL);
11528         if (!local_func_attr)
11529                 goto nla_put_failure;
11530
11531         if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id))
11532                 goto nla_put_failure;
11533
11534         nla_nest_end(msg, local_func_attr);
11535
11536         peer_func_attr = nla_nest_start(msg, NL80211_NAN_MATCH_FUNC_PEER);
11537         if (!peer_func_attr)
11538                 goto nla_put_failure;
11539
11540         if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) ||
11541             nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id))
11542                 goto nla_put_failure;
11543
11544         if (match->info && match->info_len &&
11545             nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len,
11546                     match->info))
11547                 goto nla_put_failure;
11548
11549         nla_nest_end(msg, peer_func_attr);
11550         nla_nest_end(msg, match_attr);
11551         genlmsg_end(msg, hdr);
11552
11553         if (!wdev->owner_nlportid)
11554                 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
11555                                         msg, 0, NL80211_MCGRP_NAN, gfp);
11556         else
11557                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
11558                                 wdev->owner_nlportid);
11559
11560         return;
11561
11562 nla_put_failure:
11563         nlmsg_free(msg);
11564 }
11565 EXPORT_SYMBOL(cfg80211_nan_match);
11566
11567 void cfg80211_nan_func_terminated(struct wireless_dev *wdev,
11568                                   u8 inst_id,
11569                                   enum nl80211_nan_func_term_reason reason,
11570                                   u64 cookie, gfp_t gfp)
11571 {
11572         struct wiphy *wiphy = wdev->wiphy;
11573         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
11574         struct sk_buff *msg;
11575         struct nlattr *func_attr;
11576         void *hdr;
11577
11578         if (WARN_ON(!inst_id))
11579                 return;
11580
11581         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11582         if (!msg)
11583                 return;
11584
11585         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION);
11586         if (!hdr) {
11587                 nlmsg_free(msg);
11588                 return;
11589         }
11590
11591         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11592             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
11593                                          wdev->netdev->ifindex)) ||
11594             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
11595                               NL80211_ATTR_PAD))
11596                 goto nla_put_failure;
11597
11598         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
11599                               NL80211_ATTR_PAD))
11600                 goto nla_put_failure;
11601
11602         func_attr = nla_nest_start(msg, NL80211_ATTR_NAN_FUNC);
11603         if (!func_attr)
11604                 goto nla_put_failure;
11605
11606         if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) ||
11607             nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason))
11608                 goto nla_put_failure;
11609
11610         nla_nest_end(msg, func_attr);
11611         genlmsg_end(msg, hdr);
11612
11613         if (!wdev->owner_nlportid)
11614                 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
11615                                         msg, 0, NL80211_MCGRP_NAN, gfp);
11616         else
11617                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
11618                                 wdev->owner_nlportid);
11619
11620         return;
11621
11622 nla_put_failure:
11623         nlmsg_free(msg);
11624 }
11625 EXPORT_SYMBOL(cfg80211_nan_func_terminated);
11626
11627 static int nl80211_get_protocol_features(struct sk_buff *skb,
11628                                          struct genl_info *info)
11629 {
11630         void *hdr;
11631         struct sk_buff *msg;
11632
11633         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11634         if (!msg)
11635                 return -ENOMEM;
11636
11637         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11638                              NL80211_CMD_GET_PROTOCOL_FEATURES);
11639         if (!hdr)
11640                 goto nla_put_failure;
11641
11642         if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES,
11643                         NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP))
11644                 goto nla_put_failure;
11645
11646         genlmsg_end(msg, hdr);
11647         return genlmsg_reply(msg, info);
11648
11649  nla_put_failure:
11650         kfree_skb(msg);
11651         return -ENOBUFS;
11652 }
11653
11654 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info)
11655 {
11656         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11657         struct cfg80211_update_ft_ies_params ft_params;
11658         struct net_device *dev = info->user_ptr[1];
11659
11660         if (!rdev->ops->update_ft_ies)
11661                 return -EOPNOTSUPP;
11662
11663         if (!info->attrs[NL80211_ATTR_MDID] ||
11664             !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
11665                 return -EINVAL;
11666
11667         memset(&ft_params, 0, sizeof(ft_params));
11668         ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]);
11669         ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
11670         ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
11671
11672         return rdev_update_ft_ies(rdev, dev, &ft_params);
11673 }
11674
11675 static int nl80211_crit_protocol_start(struct sk_buff *skb,
11676                                        struct genl_info *info)
11677 {
11678         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11679         struct wireless_dev *wdev = info->user_ptr[1];
11680         enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC;
11681         u16 duration;
11682         int ret;
11683
11684         if (!rdev->ops->crit_proto_start)
11685                 return -EOPNOTSUPP;
11686
11687         if (WARN_ON(!rdev->ops->crit_proto_stop))
11688                 return -EINVAL;
11689
11690         if (rdev->crit_proto_nlportid)
11691                 return -EBUSY;
11692
11693         /* determine protocol if provided */
11694         if (info->attrs[NL80211_ATTR_CRIT_PROT_ID])
11695                 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]);
11696
11697         if (proto >= NUM_NL80211_CRIT_PROTO)
11698                 return -EINVAL;
11699
11700         /* timeout must be provided */
11701         if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION])
11702                 return -EINVAL;
11703
11704         duration =
11705                 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
11706
11707         if (duration > NL80211_CRIT_PROTO_MAX_DURATION)
11708                 return -ERANGE;
11709
11710         ret = rdev_crit_proto_start(rdev, wdev, proto, duration);
11711         if (!ret)
11712                 rdev->crit_proto_nlportid = info->snd_portid;
11713
11714         return ret;
11715 }
11716
11717 static int nl80211_crit_protocol_stop(struct sk_buff *skb,
11718                                       struct genl_info *info)
11719 {
11720         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11721         struct wireless_dev *wdev = info->user_ptr[1];
11722
11723         if (!rdev->ops->crit_proto_stop)
11724                 return -EOPNOTSUPP;
11725
11726         if (rdev->crit_proto_nlportid) {
11727                 rdev->crit_proto_nlportid = 0;
11728                 rdev_crit_proto_stop(rdev, wdev);
11729         }
11730         return 0;
11731 }
11732
11733 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
11734 {
11735         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11736         struct wireless_dev *wdev =
11737                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
11738         int i, err;
11739         u32 vid, subcmd;
11740
11741         if (!rdev->wiphy.vendor_commands)
11742                 return -EOPNOTSUPP;
11743
11744         if (IS_ERR(wdev)) {
11745                 err = PTR_ERR(wdev);
11746                 if (err != -EINVAL)
11747                         return err;
11748                 wdev = NULL;
11749         } else if (wdev->wiphy != &rdev->wiphy) {
11750                 return -EINVAL;
11751         }
11752
11753         if (!info->attrs[NL80211_ATTR_VENDOR_ID] ||
11754             !info->attrs[NL80211_ATTR_VENDOR_SUBCMD])
11755                 return -EINVAL;
11756
11757         vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]);
11758         subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]);
11759         for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
11760                 const struct wiphy_vendor_command *vcmd;
11761                 void *data = NULL;
11762                 int len = 0;
11763
11764                 vcmd = &rdev->wiphy.vendor_commands[i];
11765
11766                 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
11767                         continue;
11768
11769                 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
11770                                    WIPHY_VENDOR_CMD_NEED_NETDEV)) {
11771                         if (!wdev)
11772                                 return -EINVAL;
11773                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
11774                             !wdev->netdev)
11775                                 return -EINVAL;
11776
11777                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
11778                                 if (!wdev_running(wdev))
11779                                         return -ENETDOWN;
11780                         }
11781
11782                         if (!vcmd->doit)
11783                                 return -EOPNOTSUPP;
11784                 } else {
11785                         wdev = NULL;
11786                 }
11787
11788                 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
11789                         data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
11790                         len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
11791                 }
11792
11793                 rdev->cur_cmd_info = info;
11794                 err = rdev->wiphy.vendor_commands[i].doit(&rdev->wiphy, wdev,
11795                                                           data, len);
11796                 rdev->cur_cmd_info = NULL;
11797                 return err;
11798         }
11799
11800         return -EOPNOTSUPP;
11801 }
11802
11803 static int nl80211_prepare_vendor_dump(struct sk_buff *skb,
11804                                        struct netlink_callback *cb,
11805                                        struct cfg80211_registered_device **rdev,
11806                                        struct wireless_dev **wdev)
11807 {
11808         struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
11809         u32 vid, subcmd;
11810         unsigned int i;
11811         int vcmd_idx = -1;
11812         int err;
11813         void *data = NULL;
11814         unsigned int data_len = 0;
11815
11816         if (cb->args[0]) {
11817                 /* subtract the 1 again here */
11818                 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
11819                 struct wireless_dev *tmp;
11820
11821                 if (!wiphy)
11822                         return -ENODEV;
11823                 *rdev = wiphy_to_rdev(wiphy);
11824                 *wdev = NULL;
11825
11826                 if (cb->args[1]) {
11827                         list_for_each_entry(tmp, &wiphy->wdev_list, list) {
11828                                 if (tmp->identifier == cb->args[1] - 1) {
11829                                         *wdev = tmp;
11830                                         break;
11831                                 }
11832                         }
11833                 }
11834
11835                 /* keep rtnl locked in successful case */
11836                 return 0;
11837         }
11838
11839         err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, attrbuf,
11840                           nl80211_fam.maxattr, nl80211_policy, NULL);
11841         if (err)
11842                 return err;
11843
11844         if (!attrbuf[NL80211_ATTR_VENDOR_ID] ||
11845             !attrbuf[NL80211_ATTR_VENDOR_SUBCMD])
11846                 return -EINVAL;
11847
11848         *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf);
11849         if (IS_ERR(*wdev))
11850                 *wdev = NULL;
11851
11852         *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
11853         if (IS_ERR(*rdev))
11854                 return PTR_ERR(*rdev);
11855
11856         vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]);
11857         subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
11858
11859         for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) {
11860                 const struct wiphy_vendor_command *vcmd;
11861
11862                 vcmd = &(*rdev)->wiphy.vendor_commands[i];
11863
11864                 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
11865                         continue;
11866
11867                 if (!vcmd->dumpit)
11868                         return -EOPNOTSUPP;
11869
11870                 vcmd_idx = i;
11871                 break;
11872         }
11873
11874         if (vcmd_idx < 0)
11875                 return -EOPNOTSUPP;
11876
11877         if (attrbuf[NL80211_ATTR_VENDOR_DATA]) {
11878                 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]);
11879                 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]);
11880         }
11881
11882         /* 0 is the first index - add 1 to parse only once */
11883         cb->args[0] = (*rdev)->wiphy_idx + 1;
11884         /* add 1 to know if it was NULL */
11885         cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0;
11886         cb->args[2] = vcmd_idx;
11887         cb->args[3] = (unsigned long)data;
11888         cb->args[4] = data_len;
11889
11890         /* keep rtnl locked in successful case */
11891         return 0;
11892 }
11893
11894 static int nl80211_vendor_cmd_dump(struct sk_buff *skb,
11895                                    struct netlink_callback *cb)
11896 {
11897         struct cfg80211_registered_device *rdev;
11898         struct wireless_dev *wdev;
11899         unsigned int vcmd_idx;
11900         const struct wiphy_vendor_command *vcmd;
11901         void *data;
11902         int data_len;
11903         int err;
11904         struct nlattr *vendor_data;
11905
11906         rtnl_lock();
11907         err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev);
11908         if (err)
11909                 goto out;
11910
11911         vcmd_idx = cb->args[2];
11912         data = (void *)cb->args[3];
11913         data_len = cb->args[4];
11914         vcmd = &rdev->wiphy.vendor_commands[vcmd_idx];
11915
11916         if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
11917                            WIPHY_VENDOR_CMD_NEED_NETDEV)) {
11918                 if (!wdev) {
11919                         err = -EINVAL;
11920                         goto out;
11921                 }
11922                 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
11923                     !wdev->netdev) {
11924                         err = -EINVAL;
11925                         goto out;
11926                 }
11927
11928                 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
11929                         if (!wdev_running(wdev)) {
11930                                 err = -ENETDOWN;
11931                                 goto out;
11932                         }
11933                 }
11934         }
11935
11936         while (1) {
11937                 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
11938                                            cb->nlh->nlmsg_seq, NLM_F_MULTI,
11939                                            NL80211_CMD_VENDOR);
11940                 if (!hdr)
11941                         break;
11942
11943                 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11944                     (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
11945                                                wdev_id(wdev),
11946                                                NL80211_ATTR_PAD))) {
11947                         genlmsg_cancel(skb, hdr);
11948                         break;
11949                 }
11950
11951                 vendor_data = nla_nest_start(skb, NL80211_ATTR_VENDOR_DATA);
11952                 if (!vendor_data) {
11953                         genlmsg_cancel(skb, hdr);
11954                         break;
11955                 }
11956
11957                 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len,
11958                                    (unsigned long *)&cb->args[5]);
11959                 nla_nest_end(skb, vendor_data);
11960
11961                 if (err == -ENOBUFS || err == -ENOENT) {
11962                         genlmsg_cancel(skb, hdr);
11963                         break;
11964                 } else if (err) {
11965                         genlmsg_cancel(skb, hdr);
11966                         goto out;
11967                 }
11968
11969                 genlmsg_end(skb, hdr);
11970         }
11971
11972         err = skb->len;
11973  out:
11974         rtnl_unlock();
11975         return err;
11976 }
11977
11978 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
11979                                            enum nl80211_commands cmd,
11980                                            enum nl80211_attrs attr,
11981                                            int approxlen)
11982 {
11983         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
11984
11985         if (WARN_ON(!rdev->cur_cmd_info))
11986                 return NULL;
11987
11988         return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen,
11989                                            rdev->cur_cmd_info->snd_portid,
11990                                            rdev->cur_cmd_info->snd_seq,
11991                                            cmd, attr, NULL, GFP_KERNEL);
11992 }
11993 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb);
11994
11995 int cfg80211_vendor_cmd_reply(struct sk_buff *skb)
11996 {
11997         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
11998         void *hdr = ((void **)skb->cb)[1];
11999         struct nlattr *data = ((void **)skb->cb)[2];
12000
12001         /* clear CB data for netlink core to own from now on */
12002         memset(skb->cb, 0, sizeof(skb->cb));
12003
12004         if (WARN_ON(!rdev->cur_cmd_info)) {
12005                 kfree_skb(skb);
12006                 return -EINVAL;
12007         }
12008
12009         nla_nest_end(skb, data);
12010         genlmsg_end(skb, hdr);
12011         return genlmsg_reply(skb, rdev->cur_cmd_info);
12012 }
12013 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply);
12014
12015 static int nl80211_set_qos_map(struct sk_buff *skb,
12016                                struct genl_info *info)
12017 {
12018         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12019         struct cfg80211_qos_map *qos_map = NULL;
12020         struct net_device *dev = info->user_ptr[1];
12021         u8 *pos, len, num_des, des_len, des;
12022         int ret;
12023
12024         if (!rdev->ops->set_qos_map)
12025                 return -EOPNOTSUPP;
12026
12027         if (info->attrs[NL80211_ATTR_QOS_MAP]) {
12028                 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]);
12029                 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]);
12030
12031                 if (len % 2 || len < IEEE80211_QOS_MAP_LEN_MIN ||
12032                     len > IEEE80211_QOS_MAP_LEN_MAX)
12033                         return -EINVAL;
12034
12035                 qos_map = kzalloc(sizeof(struct cfg80211_qos_map), GFP_KERNEL);
12036                 if (!qos_map)
12037                         return -ENOMEM;
12038
12039                 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1;
12040                 if (num_des) {
12041                         des_len = num_des *
12042                                 sizeof(struct cfg80211_dscp_exception);
12043                         memcpy(qos_map->dscp_exception, pos, des_len);
12044                         qos_map->num_des = num_des;
12045                         for (des = 0; des < num_des; des++) {
12046                                 if (qos_map->dscp_exception[des].up > 7) {
12047                                         kfree(qos_map);
12048                                         return -EINVAL;
12049                                 }
12050                         }
12051                         pos += des_len;
12052                 }
12053                 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN);
12054         }
12055
12056         wdev_lock(dev->ieee80211_ptr);
12057         ret = nl80211_key_allowed(dev->ieee80211_ptr);
12058         if (!ret)
12059                 ret = rdev_set_qos_map(rdev, dev, qos_map);
12060         wdev_unlock(dev->ieee80211_ptr);
12061
12062         kfree(qos_map);
12063         return ret;
12064 }
12065
12066 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info)
12067 {
12068         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12069         struct net_device *dev = info->user_ptr[1];
12070         struct wireless_dev *wdev = dev->ieee80211_ptr;
12071         const u8 *peer;
12072         u8 tsid, up;
12073         u16 admitted_time = 0;
12074         int err;
12075
12076         if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION))
12077                 return -EOPNOTSUPP;
12078
12079         if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] ||
12080             !info->attrs[NL80211_ATTR_USER_PRIO])
12081                 return -EINVAL;
12082
12083         tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
12084         if (tsid >= IEEE80211_NUM_TIDS)
12085                 return -EINVAL;
12086
12087         up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]);
12088         if (up >= IEEE80211_NUM_UPS)
12089                 return -EINVAL;
12090
12091         /* WMM uses TIDs 0-7 even for TSPEC */
12092         if (tsid >= IEEE80211_FIRST_TSPEC_TSID) {
12093                 /* TODO: handle 802.11 TSPEC/admission control
12094                  * need more attributes for that (e.g. BA session requirement);
12095                  * change the WMM adminssion test above to allow both then
12096                  */
12097                 return -EINVAL;
12098         }
12099
12100         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
12101
12102         if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) {
12103                 admitted_time =
12104                         nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]);
12105                 if (!admitted_time)
12106                         return -EINVAL;
12107         }
12108
12109         wdev_lock(wdev);
12110         switch (wdev->iftype) {
12111         case NL80211_IFTYPE_STATION:
12112         case NL80211_IFTYPE_P2P_CLIENT:
12113                 if (wdev->current_bss)
12114                         break;
12115                 err = -ENOTCONN;
12116                 goto out;
12117         default:
12118                 err = -EOPNOTSUPP;
12119                 goto out;
12120         }
12121
12122         err = rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time);
12123
12124  out:
12125         wdev_unlock(wdev);
12126         return err;
12127 }
12128
12129 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info)
12130 {
12131         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12132         struct net_device *dev = info->user_ptr[1];
12133         struct wireless_dev *wdev = dev->ieee80211_ptr;
12134         const u8 *peer;
12135         u8 tsid;
12136         int err;
12137
12138         if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC])
12139                 return -EINVAL;
12140
12141         tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
12142         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
12143
12144         wdev_lock(wdev);
12145         err = rdev_del_tx_ts(rdev, dev, tsid, peer);
12146         wdev_unlock(wdev);
12147
12148         return err;
12149 }
12150
12151 static int nl80211_tdls_channel_switch(struct sk_buff *skb,
12152                                        struct genl_info *info)
12153 {
12154         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12155         struct net_device *dev = info->user_ptr[1];
12156         struct wireless_dev *wdev = dev->ieee80211_ptr;
12157         struct cfg80211_chan_def chandef = {};
12158         const u8 *addr;
12159         u8 oper_class;
12160         int err;
12161
12162         if (!rdev->ops->tdls_channel_switch ||
12163             !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
12164                 return -EOPNOTSUPP;
12165
12166         switch (dev->ieee80211_ptr->iftype) {
12167         case NL80211_IFTYPE_STATION:
12168         case NL80211_IFTYPE_P2P_CLIENT:
12169                 break;
12170         default:
12171                 return -EOPNOTSUPP;
12172         }
12173
12174         if (!info->attrs[NL80211_ATTR_MAC] ||
12175             !info->attrs[NL80211_ATTR_OPER_CLASS])
12176                 return -EINVAL;
12177
12178         err = nl80211_parse_chandef(rdev, info, &chandef);
12179         if (err)
12180                 return err;
12181
12182         /*
12183          * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012
12184          * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the
12185          * specification is not defined for them.
12186          */
12187         if (chandef.chan->band == NL80211_BAND_2GHZ &&
12188             chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
12189             chandef.width != NL80211_CHAN_WIDTH_20)
12190                 return -EINVAL;
12191
12192         /* we will be active on the TDLS link */
12193         if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
12194                                            wdev->iftype))
12195                 return -EINVAL;
12196
12197         /* don't allow switching to DFS channels */
12198         if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype))
12199                 return -EINVAL;
12200
12201         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
12202         oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]);
12203
12204         wdev_lock(wdev);
12205         err = rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef);
12206         wdev_unlock(wdev);
12207
12208         return err;
12209 }
12210
12211 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb,
12212                                               struct genl_info *info)
12213 {
12214         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12215         struct net_device *dev = info->user_ptr[1];
12216         struct wireless_dev *wdev = dev->ieee80211_ptr;
12217         const u8 *addr;
12218
12219         if (!rdev->ops->tdls_channel_switch ||
12220             !rdev->ops->tdls_cancel_channel_switch ||
12221             !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
12222                 return -EOPNOTSUPP;
12223
12224         switch (dev->ieee80211_ptr->iftype) {
12225         case NL80211_IFTYPE_STATION:
12226         case NL80211_IFTYPE_P2P_CLIENT:
12227                 break;
12228         default:
12229                 return -EOPNOTSUPP;
12230         }
12231
12232         if (!info->attrs[NL80211_ATTR_MAC])
12233                 return -EINVAL;
12234
12235         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
12236
12237         wdev_lock(wdev);
12238         rdev_tdls_cancel_channel_switch(rdev, dev, addr);
12239         wdev_unlock(wdev);
12240
12241         return 0;
12242 }
12243
12244 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb,
12245                                             struct genl_info *info)
12246 {
12247         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12248         struct net_device *dev = info->user_ptr[1];
12249         struct wireless_dev *wdev = dev->ieee80211_ptr;
12250         const struct nlattr *nla;
12251         bool enabled;
12252
12253         if (!rdev->ops->set_multicast_to_unicast)
12254                 return -EOPNOTSUPP;
12255
12256         if (wdev->iftype != NL80211_IFTYPE_AP &&
12257             wdev->iftype != NL80211_IFTYPE_P2P_GO)
12258                 return -EOPNOTSUPP;
12259
12260         nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED];
12261         enabled = nla_get_flag(nla);
12262
12263         return rdev_set_multicast_to_unicast(rdev, dev, enabled);
12264 }
12265
12266 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info)
12267 {
12268         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12269         struct net_device *dev = info->user_ptr[1];
12270         struct wireless_dev *wdev = dev->ieee80211_ptr;
12271         struct cfg80211_pmk_conf pmk_conf = {};
12272         int ret;
12273
12274         if (wdev->iftype != NL80211_IFTYPE_STATION &&
12275             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
12276                 return -EOPNOTSUPP;
12277
12278         if (!wiphy_ext_feature_isset(&rdev->wiphy,
12279                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
12280                 return -EOPNOTSUPP;
12281
12282         if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK])
12283                 return -EINVAL;
12284
12285         wdev_lock(wdev);
12286         if (!wdev->current_bss) {
12287                 ret = -ENOTCONN;
12288                 goto out;
12289         }
12290
12291         pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
12292         if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) {
12293                 ret = -EINVAL;
12294                 goto out;
12295         }
12296
12297         pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
12298         pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
12299         if (pmk_conf.pmk_len != WLAN_PMK_LEN &&
12300             pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) {
12301                 ret = -EINVAL;
12302                 goto out;
12303         }
12304
12305         if (info->attrs[NL80211_ATTR_PMKR0_NAME]) {
12306                 int r0_name_len = nla_len(info->attrs[NL80211_ATTR_PMKR0_NAME]);
12307
12308                 if (r0_name_len != WLAN_PMK_NAME_LEN) {
12309                         ret = -EINVAL;
12310                         goto out;
12311                 }
12312
12313                 pmk_conf.pmk_r0_name =
12314                         nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]);
12315         }
12316
12317         ret = rdev_set_pmk(rdev, dev, &pmk_conf);
12318 out:
12319         wdev_unlock(wdev);
12320         return ret;
12321 }
12322
12323 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info)
12324 {
12325         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12326         struct net_device *dev = info->user_ptr[1];
12327         struct wireless_dev *wdev = dev->ieee80211_ptr;
12328         const u8 *aa;
12329         int ret;
12330
12331         if (wdev->iftype != NL80211_IFTYPE_STATION &&
12332             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
12333                 return -EOPNOTSUPP;
12334
12335         if (!wiphy_ext_feature_isset(&rdev->wiphy,
12336                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
12337                 return -EOPNOTSUPP;
12338
12339         if (!info->attrs[NL80211_ATTR_MAC])
12340                 return -EINVAL;
12341
12342         wdev_lock(wdev);
12343         aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
12344         ret = rdev_del_pmk(rdev, dev, aa);
12345         wdev_unlock(wdev);
12346
12347         return ret;
12348 }
12349
12350 #define NL80211_FLAG_NEED_WIPHY         0x01
12351 #define NL80211_FLAG_NEED_NETDEV        0x02
12352 #define NL80211_FLAG_NEED_RTNL          0x04
12353 #define NL80211_FLAG_CHECK_NETDEV_UP    0x08
12354 #define NL80211_FLAG_NEED_NETDEV_UP     (NL80211_FLAG_NEED_NETDEV |\
12355                                          NL80211_FLAG_CHECK_NETDEV_UP)
12356 #define NL80211_FLAG_NEED_WDEV          0x10
12357 /* If a netdev is associated, it must be UP, P2P must be started */
12358 #define NL80211_FLAG_NEED_WDEV_UP       (NL80211_FLAG_NEED_WDEV |\
12359                                          NL80211_FLAG_CHECK_NETDEV_UP)
12360 #define NL80211_FLAG_CLEAR_SKB          0x20
12361
12362 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
12363                             struct genl_info *info)
12364 {
12365         struct cfg80211_registered_device *rdev;
12366         struct wireless_dev *wdev;
12367         struct net_device *dev;
12368         bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL;
12369
12370         if (rtnl)
12371                 rtnl_lock();
12372
12373         if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) {
12374                 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
12375                 if (IS_ERR(rdev)) {
12376                         if (rtnl)
12377                                 rtnl_unlock();
12378                         return PTR_ERR(rdev);
12379                 }
12380                 info->user_ptr[0] = rdev;
12381         } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV ||
12382                    ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
12383                 ASSERT_RTNL();
12384
12385                 wdev = __cfg80211_wdev_from_attrs(genl_info_net(info),
12386                                                   info->attrs);
12387                 if (IS_ERR(wdev)) {
12388                         if (rtnl)
12389                                 rtnl_unlock();
12390                         return PTR_ERR(wdev);
12391                 }
12392
12393                 dev = wdev->netdev;
12394                 rdev = wiphy_to_rdev(wdev->wiphy);
12395
12396                 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) {
12397                         if (!dev) {
12398                                 if (rtnl)
12399                                         rtnl_unlock();
12400                                 return -EINVAL;
12401                         }
12402
12403                         info->user_ptr[1] = dev;
12404                 } else {
12405                         info->user_ptr[1] = wdev;
12406                 }
12407
12408                 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
12409                     !wdev_running(wdev)) {
12410                         if (rtnl)
12411                                 rtnl_unlock();
12412                         return -ENETDOWN;
12413                 }
12414
12415                 if (dev)
12416                         dev_hold(dev);
12417
12418                 info->user_ptr[0] = rdev;
12419         }
12420
12421         return 0;
12422 }
12423
12424 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
12425                               struct genl_info *info)
12426 {
12427         if (info->user_ptr[1]) {
12428                 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
12429                         struct wireless_dev *wdev = info->user_ptr[1];
12430
12431                         if (wdev->netdev)
12432                                 dev_put(wdev->netdev);
12433                 } else {
12434                         dev_put(info->user_ptr[1]);
12435                 }
12436         }
12437
12438         if (ops->internal_flags & NL80211_FLAG_NEED_RTNL)
12439                 rtnl_unlock();
12440
12441         /* If needed, clear the netlink message payload from the SKB
12442          * as it might contain key data that shouldn't stick around on
12443          * the heap after the SKB is freed. The netlink message header
12444          * is still needed for further processing, so leave it intact.
12445          */
12446         if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) {
12447                 struct nlmsghdr *nlh = nlmsg_hdr(skb);
12448
12449                 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh));
12450         }
12451 }
12452
12453 static const struct genl_ops nl80211_ops[] = {
12454         {
12455                 .cmd = NL80211_CMD_GET_WIPHY,
12456                 .doit = nl80211_get_wiphy,
12457                 .dumpit = nl80211_dump_wiphy,
12458                 .done = nl80211_dump_wiphy_done,
12459                 .policy = nl80211_policy,
12460                 /* can be retrieved by unprivileged users */
12461                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12462                                   NL80211_FLAG_NEED_RTNL,
12463         },
12464         {
12465                 .cmd = NL80211_CMD_SET_WIPHY,
12466                 .doit = nl80211_set_wiphy,
12467                 .policy = nl80211_policy,
12468                 .flags = GENL_UNS_ADMIN_PERM,
12469                 .internal_flags = NL80211_FLAG_NEED_RTNL,
12470         },
12471         {
12472                 .cmd = NL80211_CMD_GET_INTERFACE,
12473                 .doit = nl80211_get_interface,
12474                 .dumpit = nl80211_dump_interface,
12475                 .policy = nl80211_policy,
12476                 /* can be retrieved by unprivileged users */
12477                 .internal_flags = NL80211_FLAG_NEED_WDEV |
12478                                   NL80211_FLAG_NEED_RTNL,
12479         },
12480         {
12481                 .cmd = NL80211_CMD_SET_INTERFACE,
12482                 .doit = nl80211_set_interface,
12483                 .policy = nl80211_policy,
12484                 .flags = GENL_UNS_ADMIN_PERM,
12485                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12486                                   NL80211_FLAG_NEED_RTNL,
12487         },
12488         {
12489                 .cmd = NL80211_CMD_NEW_INTERFACE,
12490                 .doit = nl80211_new_interface,
12491                 .policy = nl80211_policy,
12492                 .flags = GENL_UNS_ADMIN_PERM,
12493                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12494                                   NL80211_FLAG_NEED_RTNL,
12495         },
12496         {
12497                 .cmd = NL80211_CMD_DEL_INTERFACE,
12498                 .doit = nl80211_del_interface,
12499                 .policy = nl80211_policy,
12500                 .flags = GENL_UNS_ADMIN_PERM,
12501                 .internal_flags = NL80211_FLAG_NEED_WDEV |
12502                                   NL80211_FLAG_NEED_RTNL,
12503         },
12504         {
12505                 .cmd = NL80211_CMD_GET_KEY,
12506                 .doit = nl80211_get_key,
12507                 .policy = nl80211_policy,
12508                 .flags = GENL_UNS_ADMIN_PERM,
12509                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12510                                   NL80211_FLAG_NEED_RTNL,
12511         },
12512         {
12513                 .cmd = NL80211_CMD_SET_KEY,
12514                 .doit = nl80211_set_key,
12515                 .policy = nl80211_policy,
12516                 .flags = GENL_UNS_ADMIN_PERM,
12517                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12518                                   NL80211_FLAG_NEED_RTNL |
12519                                   NL80211_FLAG_CLEAR_SKB,
12520         },
12521         {
12522                 .cmd = NL80211_CMD_NEW_KEY,
12523                 .doit = nl80211_new_key,
12524                 .policy = nl80211_policy,
12525                 .flags = GENL_UNS_ADMIN_PERM,
12526                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12527                                   NL80211_FLAG_NEED_RTNL |
12528                                   NL80211_FLAG_CLEAR_SKB,
12529         },
12530         {
12531                 .cmd = NL80211_CMD_DEL_KEY,
12532                 .doit = nl80211_del_key,
12533                 .policy = nl80211_policy,
12534                 .flags = GENL_UNS_ADMIN_PERM,
12535                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12536                                   NL80211_FLAG_NEED_RTNL,
12537         },
12538         {
12539                 .cmd = NL80211_CMD_SET_BEACON,
12540                 .policy = nl80211_policy,
12541                 .flags = GENL_UNS_ADMIN_PERM,
12542                 .doit = nl80211_set_beacon,
12543                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12544                                   NL80211_FLAG_NEED_RTNL,
12545         },
12546         {
12547                 .cmd = NL80211_CMD_START_AP,
12548                 .policy = nl80211_policy,
12549                 .flags = GENL_UNS_ADMIN_PERM,
12550                 .doit = nl80211_start_ap,
12551                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12552                                   NL80211_FLAG_NEED_RTNL,
12553         },
12554         {
12555                 .cmd = NL80211_CMD_STOP_AP,
12556                 .policy = nl80211_policy,
12557                 .flags = GENL_UNS_ADMIN_PERM,
12558                 .doit = nl80211_stop_ap,
12559                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12560                                   NL80211_FLAG_NEED_RTNL,
12561         },
12562         {
12563                 .cmd = NL80211_CMD_GET_STATION,
12564                 .doit = nl80211_get_station,
12565                 .dumpit = nl80211_dump_station,
12566                 .policy = nl80211_policy,
12567                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12568                                   NL80211_FLAG_NEED_RTNL,
12569         },
12570         {
12571                 .cmd = NL80211_CMD_SET_STATION,
12572                 .doit = nl80211_set_station,
12573                 .policy = nl80211_policy,
12574                 .flags = GENL_UNS_ADMIN_PERM,
12575                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12576                                   NL80211_FLAG_NEED_RTNL,
12577         },
12578         {
12579                 .cmd = NL80211_CMD_NEW_STATION,
12580                 .doit = nl80211_new_station,
12581                 .policy = nl80211_policy,
12582                 .flags = GENL_UNS_ADMIN_PERM,
12583                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12584                                   NL80211_FLAG_NEED_RTNL,
12585         },
12586         {
12587                 .cmd = NL80211_CMD_DEL_STATION,
12588                 .doit = nl80211_del_station,
12589                 .policy = nl80211_policy,
12590                 .flags = GENL_UNS_ADMIN_PERM,
12591                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12592                                   NL80211_FLAG_NEED_RTNL,
12593         },
12594         {
12595                 .cmd = NL80211_CMD_GET_MPATH,
12596                 .doit = nl80211_get_mpath,
12597                 .dumpit = nl80211_dump_mpath,
12598                 .policy = nl80211_policy,
12599                 .flags = GENL_UNS_ADMIN_PERM,
12600                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12601                                   NL80211_FLAG_NEED_RTNL,
12602         },
12603         {
12604                 .cmd = NL80211_CMD_GET_MPP,
12605                 .doit = nl80211_get_mpp,
12606                 .dumpit = nl80211_dump_mpp,
12607                 .policy = nl80211_policy,
12608                 .flags = GENL_UNS_ADMIN_PERM,
12609                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12610                                   NL80211_FLAG_NEED_RTNL,
12611         },
12612         {
12613                 .cmd = NL80211_CMD_SET_MPATH,
12614                 .doit = nl80211_set_mpath,
12615                 .policy = nl80211_policy,
12616                 .flags = GENL_UNS_ADMIN_PERM,
12617                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12618                                   NL80211_FLAG_NEED_RTNL,
12619         },
12620         {
12621                 .cmd = NL80211_CMD_NEW_MPATH,
12622                 .doit = nl80211_new_mpath,
12623                 .policy = nl80211_policy,
12624                 .flags = GENL_UNS_ADMIN_PERM,
12625                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12626                                   NL80211_FLAG_NEED_RTNL,
12627         },
12628         {
12629                 .cmd = NL80211_CMD_DEL_MPATH,
12630                 .doit = nl80211_del_mpath,
12631                 .policy = nl80211_policy,
12632                 .flags = GENL_UNS_ADMIN_PERM,
12633                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12634                                   NL80211_FLAG_NEED_RTNL,
12635         },
12636         {
12637                 .cmd = NL80211_CMD_SET_BSS,
12638                 .doit = nl80211_set_bss,
12639                 .policy = nl80211_policy,
12640                 .flags = GENL_UNS_ADMIN_PERM,
12641                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12642                                   NL80211_FLAG_NEED_RTNL,
12643         },
12644         {
12645                 .cmd = NL80211_CMD_GET_REG,
12646                 .doit = nl80211_get_reg_do,
12647                 .dumpit = nl80211_get_reg_dump,
12648                 .policy = nl80211_policy,
12649                 .internal_flags = NL80211_FLAG_NEED_RTNL,
12650                 /* can be retrieved by unprivileged users */
12651         },
12652 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
12653         {
12654                 .cmd = NL80211_CMD_SET_REG,
12655                 .doit = nl80211_set_reg,
12656                 .policy = nl80211_policy,
12657                 .flags = GENL_ADMIN_PERM,
12658                 .internal_flags = NL80211_FLAG_NEED_RTNL,
12659         },
12660 #endif
12661         {
12662                 .cmd = NL80211_CMD_REQ_SET_REG,
12663                 .doit = nl80211_req_set_reg,
12664                 .policy = nl80211_policy,
12665                 .flags = GENL_ADMIN_PERM,
12666         },
12667         {
12668                 .cmd = NL80211_CMD_GET_MESH_CONFIG,
12669                 .doit = nl80211_get_mesh_config,
12670                 .policy = nl80211_policy,
12671                 /* can be retrieved by unprivileged users */
12672                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12673                                   NL80211_FLAG_NEED_RTNL,
12674         },
12675         {
12676                 .cmd = NL80211_CMD_SET_MESH_CONFIG,
12677                 .doit = nl80211_update_mesh_config,
12678                 .policy = nl80211_policy,
12679                 .flags = GENL_UNS_ADMIN_PERM,
12680                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12681                                   NL80211_FLAG_NEED_RTNL,
12682         },
12683         {
12684                 .cmd = NL80211_CMD_TRIGGER_SCAN,
12685                 .doit = nl80211_trigger_scan,
12686                 .policy = nl80211_policy,
12687                 .flags = GENL_UNS_ADMIN_PERM,
12688                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12689                                   NL80211_FLAG_NEED_RTNL,
12690         },
12691         {
12692                 .cmd = NL80211_CMD_ABORT_SCAN,
12693                 .doit = nl80211_abort_scan,
12694                 .policy = nl80211_policy,
12695                 .flags = GENL_UNS_ADMIN_PERM,
12696                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12697                                   NL80211_FLAG_NEED_RTNL,
12698         },
12699         {
12700                 .cmd = NL80211_CMD_GET_SCAN,
12701                 .policy = nl80211_policy,
12702                 .dumpit = nl80211_dump_scan,
12703         },
12704         {
12705                 .cmd = NL80211_CMD_START_SCHED_SCAN,
12706                 .doit = nl80211_start_sched_scan,
12707                 .policy = nl80211_policy,
12708                 .flags = GENL_UNS_ADMIN_PERM,
12709                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12710                                   NL80211_FLAG_NEED_RTNL,
12711         },
12712         {
12713                 .cmd = NL80211_CMD_STOP_SCHED_SCAN,
12714                 .doit = nl80211_stop_sched_scan,
12715                 .policy = nl80211_policy,
12716                 .flags = GENL_UNS_ADMIN_PERM,
12717                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12718                                   NL80211_FLAG_NEED_RTNL,
12719         },
12720         {
12721                 .cmd = NL80211_CMD_AUTHENTICATE,
12722                 .doit = nl80211_authenticate,
12723                 .policy = nl80211_policy,
12724                 .flags = GENL_UNS_ADMIN_PERM,
12725                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12726                                   NL80211_FLAG_NEED_RTNL |
12727                                   NL80211_FLAG_CLEAR_SKB,
12728         },
12729         {
12730                 .cmd = NL80211_CMD_ASSOCIATE,
12731                 .doit = nl80211_associate,
12732                 .policy = nl80211_policy,
12733                 .flags = GENL_UNS_ADMIN_PERM,
12734                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12735                                   NL80211_FLAG_NEED_RTNL,
12736         },
12737         {
12738                 .cmd = NL80211_CMD_DEAUTHENTICATE,
12739                 .doit = nl80211_deauthenticate,
12740                 .policy = nl80211_policy,
12741                 .flags = GENL_UNS_ADMIN_PERM,
12742                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12743                                   NL80211_FLAG_NEED_RTNL,
12744         },
12745         {
12746                 .cmd = NL80211_CMD_DISASSOCIATE,
12747                 .doit = nl80211_disassociate,
12748                 .policy = nl80211_policy,
12749                 .flags = GENL_UNS_ADMIN_PERM,
12750                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12751                                   NL80211_FLAG_NEED_RTNL,
12752         },
12753         {
12754                 .cmd = NL80211_CMD_JOIN_IBSS,
12755                 .doit = nl80211_join_ibss,
12756                 .policy = nl80211_policy,
12757                 .flags = GENL_UNS_ADMIN_PERM,
12758                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12759                                   NL80211_FLAG_NEED_RTNL,
12760         },
12761         {
12762                 .cmd = NL80211_CMD_LEAVE_IBSS,
12763                 .doit = nl80211_leave_ibss,
12764                 .policy = nl80211_policy,
12765                 .flags = GENL_UNS_ADMIN_PERM,
12766                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12767                                   NL80211_FLAG_NEED_RTNL,
12768         },
12769 #ifdef CONFIG_NL80211_TESTMODE
12770         {
12771                 .cmd = NL80211_CMD_TESTMODE,
12772                 .doit = nl80211_testmode_do,
12773                 .dumpit = nl80211_testmode_dump,
12774                 .policy = nl80211_policy,
12775                 .flags = GENL_UNS_ADMIN_PERM,
12776                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12777                                   NL80211_FLAG_NEED_RTNL,
12778         },
12779 #endif
12780         {
12781                 .cmd = NL80211_CMD_CONNECT,
12782                 .doit = nl80211_connect,
12783                 .policy = nl80211_policy,
12784                 .flags = GENL_UNS_ADMIN_PERM,
12785                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12786                                   NL80211_FLAG_NEED_RTNL,
12787         },
12788         {
12789                 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS,
12790                 .doit = nl80211_update_connect_params,
12791                 .policy = nl80211_policy,
12792                 .flags = GENL_ADMIN_PERM,
12793                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12794                                   NL80211_FLAG_NEED_RTNL,
12795         },
12796         {
12797                 .cmd = NL80211_CMD_DISCONNECT,
12798                 .doit = nl80211_disconnect,
12799                 .policy = nl80211_policy,
12800                 .flags = GENL_UNS_ADMIN_PERM,
12801                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12802                                   NL80211_FLAG_NEED_RTNL,
12803         },
12804         {
12805                 .cmd = NL80211_CMD_SET_WIPHY_NETNS,
12806                 .doit = nl80211_wiphy_netns,
12807                 .policy = nl80211_policy,
12808                 .flags = GENL_UNS_ADMIN_PERM,
12809                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12810                                   NL80211_FLAG_NEED_RTNL,
12811         },
12812         {
12813                 .cmd = NL80211_CMD_GET_SURVEY,
12814                 .policy = nl80211_policy,
12815                 .dumpit = nl80211_dump_survey,
12816         },
12817         {
12818                 .cmd = NL80211_CMD_SET_PMKSA,
12819                 .doit = nl80211_setdel_pmksa,
12820                 .policy = nl80211_policy,
12821                 .flags = GENL_UNS_ADMIN_PERM,
12822                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12823                                   NL80211_FLAG_NEED_RTNL,
12824         },
12825         {
12826                 .cmd = NL80211_CMD_DEL_PMKSA,
12827                 .doit = nl80211_setdel_pmksa,
12828                 .policy = nl80211_policy,
12829                 .flags = GENL_UNS_ADMIN_PERM,
12830                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12831                                   NL80211_FLAG_NEED_RTNL,
12832         },
12833         {
12834                 .cmd = NL80211_CMD_FLUSH_PMKSA,
12835                 .doit = nl80211_flush_pmksa,
12836                 .policy = nl80211_policy,
12837                 .flags = GENL_UNS_ADMIN_PERM,
12838                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12839                                   NL80211_FLAG_NEED_RTNL,
12840         },
12841         {
12842                 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
12843                 .doit = nl80211_remain_on_channel,
12844                 .policy = nl80211_policy,
12845                 .flags = GENL_UNS_ADMIN_PERM,
12846                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12847                                   NL80211_FLAG_NEED_RTNL,
12848         },
12849         {
12850                 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
12851                 .doit = nl80211_cancel_remain_on_channel,
12852                 .policy = nl80211_policy,
12853                 .flags = GENL_UNS_ADMIN_PERM,
12854                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12855                                   NL80211_FLAG_NEED_RTNL,
12856         },
12857         {
12858                 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
12859                 .doit = nl80211_set_tx_bitrate_mask,
12860                 .policy = nl80211_policy,
12861                 .flags = GENL_UNS_ADMIN_PERM,
12862                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12863                                   NL80211_FLAG_NEED_RTNL,
12864         },
12865         {
12866                 .cmd = NL80211_CMD_REGISTER_FRAME,
12867                 .doit = nl80211_register_mgmt,
12868                 .policy = nl80211_policy,
12869                 .flags = GENL_UNS_ADMIN_PERM,
12870                 .internal_flags = NL80211_FLAG_NEED_WDEV |
12871                                   NL80211_FLAG_NEED_RTNL,
12872         },
12873         {
12874                 .cmd = NL80211_CMD_FRAME,
12875                 .doit = nl80211_tx_mgmt,
12876                 .policy = nl80211_policy,
12877                 .flags = GENL_UNS_ADMIN_PERM,
12878                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12879                                   NL80211_FLAG_NEED_RTNL,
12880         },
12881         {
12882                 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
12883                 .doit = nl80211_tx_mgmt_cancel_wait,
12884                 .policy = nl80211_policy,
12885                 .flags = GENL_UNS_ADMIN_PERM,
12886                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12887                                   NL80211_FLAG_NEED_RTNL,
12888         },
12889         {
12890                 .cmd = NL80211_CMD_SET_POWER_SAVE,
12891                 .doit = nl80211_set_power_save,
12892                 .policy = nl80211_policy,
12893                 .flags = GENL_UNS_ADMIN_PERM,
12894                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12895                                   NL80211_FLAG_NEED_RTNL,
12896         },
12897         {
12898                 .cmd = NL80211_CMD_GET_POWER_SAVE,
12899                 .doit = nl80211_get_power_save,
12900                 .policy = nl80211_policy,
12901                 /* can be retrieved by unprivileged users */
12902                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12903                                   NL80211_FLAG_NEED_RTNL,
12904         },
12905         {
12906                 .cmd = NL80211_CMD_SET_CQM,
12907                 .doit = nl80211_set_cqm,
12908                 .policy = nl80211_policy,
12909                 .flags = GENL_UNS_ADMIN_PERM,
12910                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12911                                   NL80211_FLAG_NEED_RTNL,
12912         },
12913         {
12914                 .cmd = NL80211_CMD_SET_CHANNEL,
12915                 .doit = nl80211_set_channel,
12916                 .policy = nl80211_policy,
12917                 .flags = GENL_UNS_ADMIN_PERM,
12918                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12919                                   NL80211_FLAG_NEED_RTNL,
12920         },
12921         {
12922                 .cmd = NL80211_CMD_SET_WDS_PEER,
12923                 .doit = nl80211_set_wds_peer,
12924                 .policy = nl80211_policy,
12925                 .flags = GENL_UNS_ADMIN_PERM,
12926                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12927                                   NL80211_FLAG_NEED_RTNL,
12928         },
12929         {
12930                 .cmd = NL80211_CMD_JOIN_MESH,
12931                 .doit = nl80211_join_mesh,
12932                 .policy = nl80211_policy,
12933                 .flags = GENL_UNS_ADMIN_PERM,
12934                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12935                                   NL80211_FLAG_NEED_RTNL,
12936         },
12937         {
12938                 .cmd = NL80211_CMD_LEAVE_MESH,
12939                 .doit = nl80211_leave_mesh,
12940                 .policy = nl80211_policy,
12941                 .flags = GENL_UNS_ADMIN_PERM,
12942                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12943                                   NL80211_FLAG_NEED_RTNL,
12944         },
12945         {
12946                 .cmd = NL80211_CMD_JOIN_OCB,
12947                 .doit = nl80211_join_ocb,
12948                 .policy = nl80211_policy,
12949                 .flags = GENL_UNS_ADMIN_PERM,
12950                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12951                                   NL80211_FLAG_NEED_RTNL,
12952         },
12953         {
12954                 .cmd = NL80211_CMD_LEAVE_OCB,
12955                 .doit = nl80211_leave_ocb,
12956                 .policy = nl80211_policy,
12957                 .flags = GENL_UNS_ADMIN_PERM,
12958                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12959                                   NL80211_FLAG_NEED_RTNL,
12960         },
12961 #ifdef CONFIG_PM
12962         {
12963                 .cmd = NL80211_CMD_GET_WOWLAN,
12964                 .doit = nl80211_get_wowlan,
12965                 .policy = nl80211_policy,
12966                 /* can be retrieved by unprivileged users */
12967                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12968                                   NL80211_FLAG_NEED_RTNL,
12969         },
12970         {
12971                 .cmd = NL80211_CMD_SET_WOWLAN,
12972                 .doit = nl80211_set_wowlan,
12973                 .policy = nl80211_policy,
12974                 .flags = GENL_UNS_ADMIN_PERM,
12975                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12976                                   NL80211_FLAG_NEED_RTNL,
12977         },
12978 #endif
12979         {
12980                 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
12981                 .doit = nl80211_set_rekey_data,
12982                 .policy = nl80211_policy,
12983                 .flags = GENL_UNS_ADMIN_PERM,
12984                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12985                                   NL80211_FLAG_NEED_RTNL |
12986                                   NL80211_FLAG_CLEAR_SKB,
12987         },
12988         {
12989                 .cmd = NL80211_CMD_TDLS_MGMT,
12990                 .doit = nl80211_tdls_mgmt,
12991                 .policy = nl80211_policy,
12992                 .flags = GENL_UNS_ADMIN_PERM,
12993                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12994                                   NL80211_FLAG_NEED_RTNL,
12995         },
12996         {
12997                 .cmd = NL80211_CMD_TDLS_OPER,
12998                 .doit = nl80211_tdls_oper,
12999                 .policy = nl80211_policy,
13000                 .flags = GENL_UNS_ADMIN_PERM,
13001                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13002                                   NL80211_FLAG_NEED_RTNL,
13003         },
13004         {
13005                 .cmd = NL80211_CMD_UNEXPECTED_FRAME,
13006                 .doit = nl80211_register_unexpected_frame,
13007                 .policy = nl80211_policy,
13008                 .flags = GENL_UNS_ADMIN_PERM,
13009                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13010                                   NL80211_FLAG_NEED_RTNL,
13011         },
13012         {
13013                 .cmd = NL80211_CMD_PROBE_CLIENT,
13014                 .doit = nl80211_probe_client,
13015                 .policy = nl80211_policy,
13016                 .flags = GENL_UNS_ADMIN_PERM,
13017                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13018                                   NL80211_FLAG_NEED_RTNL,
13019         },
13020         {
13021                 .cmd = NL80211_CMD_REGISTER_BEACONS,
13022                 .doit = nl80211_register_beacons,
13023                 .policy = nl80211_policy,
13024                 .flags = GENL_UNS_ADMIN_PERM,
13025                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13026                                   NL80211_FLAG_NEED_RTNL,
13027         },
13028         {
13029                 .cmd = NL80211_CMD_SET_NOACK_MAP,
13030                 .doit = nl80211_set_noack_map,
13031                 .policy = nl80211_policy,
13032                 .flags = GENL_UNS_ADMIN_PERM,
13033                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13034                                   NL80211_FLAG_NEED_RTNL,
13035         },
13036         {
13037                 .cmd = NL80211_CMD_START_P2P_DEVICE,
13038                 .doit = nl80211_start_p2p_device,
13039                 .policy = nl80211_policy,
13040                 .flags = GENL_UNS_ADMIN_PERM,
13041                 .internal_flags = NL80211_FLAG_NEED_WDEV |
13042                                   NL80211_FLAG_NEED_RTNL,
13043         },
13044         {
13045                 .cmd = NL80211_CMD_STOP_P2P_DEVICE,
13046                 .doit = nl80211_stop_p2p_device,
13047                 .policy = nl80211_policy,
13048                 .flags = GENL_UNS_ADMIN_PERM,
13049                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13050                                   NL80211_FLAG_NEED_RTNL,
13051         },
13052         {
13053                 .cmd = NL80211_CMD_START_NAN,
13054                 .doit = nl80211_start_nan,
13055                 .policy = nl80211_policy,
13056                 .flags = GENL_ADMIN_PERM,
13057                 .internal_flags = NL80211_FLAG_NEED_WDEV |
13058                                   NL80211_FLAG_NEED_RTNL,
13059         },
13060         {
13061                 .cmd = NL80211_CMD_STOP_NAN,
13062                 .doit = nl80211_stop_nan,
13063                 .policy = nl80211_policy,
13064                 .flags = GENL_ADMIN_PERM,
13065                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13066                                   NL80211_FLAG_NEED_RTNL,
13067         },
13068         {
13069                 .cmd = NL80211_CMD_ADD_NAN_FUNCTION,
13070                 .doit = nl80211_nan_add_func,
13071                 .policy = nl80211_policy,
13072                 .flags = GENL_ADMIN_PERM,
13073                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13074                                   NL80211_FLAG_NEED_RTNL,
13075         },
13076         {
13077                 .cmd = NL80211_CMD_DEL_NAN_FUNCTION,
13078                 .doit = nl80211_nan_del_func,
13079                 .policy = nl80211_policy,
13080                 .flags = GENL_ADMIN_PERM,
13081                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13082                                   NL80211_FLAG_NEED_RTNL,
13083         },
13084         {
13085                 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG,
13086                 .doit = nl80211_nan_change_config,
13087                 .policy = nl80211_policy,
13088                 .flags = GENL_ADMIN_PERM,
13089                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13090                                   NL80211_FLAG_NEED_RTNL,
13091         },
13092         {
13093                 .cmd = NL80211_CMD_SET_MCAST_RATE,
13094                 .doit = nl80211_set_mcast_rate,
13095                 .policy = nl80211_policy,
13096                 .flags = GENL_UNS_ADMIN_PERM,
13097                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13098                                   NL80211_FLAG_NEED_RTNL,
13099         },
13100         {
13101                 .cmd = NL80211_CMD_SET_MAC_ACL,
13102                 .doit = nl80211_set_mac_acl,
13103                 .policy = nl80211_policy,
13104                 .flags = GENL_UNS_ADMIN_PERM,
13105                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13106                                   NL80211_FLAG_NEED_RTNL,
13107         },
13108         {
13109                 .cmd = NL80211_CMD_RADAR_DETECT,
13110                 .doit = nl80211_start_radar_detection,
13111                 .policy = nl80211_policy,
13112                 .flags = GENL_UNS_ADMIN_PERM,
13113                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13114                                   NL80211_FLAG_NEED_RTNL,
13115         },
13116         {
13117                 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
13118                 .doit = nl80211_get_protocol_features,
13119                 .policy = nl80211_policy,
13120         },
13121         {
13122                 .cmd = NL80211_CMD_UPDATE_FT_IES,
13123                 .doit = nl80211_update_ft_ies,
13124                 .policy = nl80211_policy,
13125                 .flags = GENL_UNS_ADMIN_PERM,
13126                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13127                                   NL80211_FLAG_NEED_RTNL,
13128         },
13129         {
13130                 .cmd = NL80211_CMD_CRIT_PROTOCOL_START,
13131                 .doit = nl80211_crit_protocol_start,
13132                 .policy = nl80211_policy,
13133                 .flags = GENL_UNS_ADMIN_PERM,
13134                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13135                                   NL80211_FLAG_NEED_RTNL,
13136         },
13137         {
13138                 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
13139                 .doit = nl80211_crit_protocol_stop,
13140                 .policy = nl80211_policy,
13141                 .flags = GENL_UNS_ADMIN_PERM,
13142                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13143                                   NL80211_FLAG_NEED_RTNL,
13144         },
13145         {
13146                 .cmd = NL80211_CMD_GET_COALESCE,
13147                 .doit = nl80211_get_coalesce,
13148                 .policy = nl80211_policy,
13149                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13150                                   NL80211_FLAG_NEED_RTNL,
13151         },
13152         {
13153                 .cmd = NL80211_CMD_SET_COALESCE,
13154                 .doit = nl80211_set_coalesce,
13155                 .policy = nl80211_policy,
13156                 .flags = GENL_UNS_ADMIN_PERM,
13157                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13158                                   NL80211_FLAG_NEED_RTNL,
13159         },
13160         {
13161                 .cmd = NL80211_CMD_CHANNEL_SWITCH,
13162                 .doit = nl80211_channel_switch,
13163                 .policy = nl80211_policy,
13164                 .flags = GENL_UNS_ADMIN_PERM,
13165                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13166                                   NL80211_FLAG_NEED_RTNL,
13167         },
13168         {
13169                 .cmd = NL80211_CMD_VENDOR,
13170                 .doit = nl80211_vendor_cmd,
13171                 .dumpit = nl80211_vendor_cmd_dump,
13172                 .policy = nl80211_policy,
13173                 .flags = GENL_UNS_ADMIN_PERM,
13174                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13175                                   NL80211_FLAG_NEED_RTNL,
13176         },
13177         {
13178                 .cmd = NL80211_CMD_SET_QOS_MAP,
13179                 .doit = nl80211_set_qos_map,
13180                 .policy = nl80211_policy,
13181                 .flags = GENL_UNS_ADMIN_PERM,
13182                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13183                                   NL80211_FLAG_NEED_RTNL,
13184         },
13185         {
13186                 .cmd = NL80211_CMD_ADD_TX_TS,
13187                 .doit = nl80211_add_tx_ts,
13188                 .policy = nl80211_policy,
13189                 .flags = GENL_UNS_ADMIN_PERM,
13190                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13191                                   NL80211_FLAG_NEED_RTNL,
13192         },
13193         {
13194                 .cmd = NL80211_CMD_DEL_TX_TS,
13195                 .doit = nl80211_del_tx_ts,
13196                 .policy = nl80211_policy,
13197                 .flags = GENL_UNS_ADMIN_PERM,
13198                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13199                                   NL80211_FLAG_NEED_RTNL,
13200         },
13201         {
13202                 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH,
13203                 .doit = nl80211_tdls_channel_switch,
13204                 .policy = nl80211_policy,
13205                 .flags = GENL_UNS_ADMIN_PERM,
13206                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13207                                   NL80211_FLAG_NEED_RTNL,
13208         },
13209         {
13210                 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
13211                 .doit = nl80211_tdls_cancel_channel_switch,
13212                 .policy = nl80211_policy,
13213                 .flags = GENL_UNS_ADMIN_PERM,
13214                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13215                                   NL80211_FLAG_NEED_RTNL,
13216         },
13217         {
13218                 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST,
13219                 .doit = nl80211_set_multicast_to_unicast,
13220                 .policy = nl80211_policy,
13221                 .flags = GENL_UNS_ADMIN_PERM,
13222                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13223                                   NL80211_FLAG_NEED_RTNL,
13224         },
13225         {
13226                 .cmd = NL80211_CMD_SET_PMK,
13227                 .doit = nl80211_set_pmk,
13228                 .policy = nl80211_policy,
13229                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13230                                   NL80211_FLAG_NEED_RTNL,
13231         },
13232         {
13233                 .cmd = NL80211_CMD_DEL_PMK,
13234                 .doit = nl80211_del_pmk,
13235                 .policy = nl80211_policy,
13236                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13237                                   NL80211_FLAG_NEED_RTNL,
13238         },
13239
13240 };
13241
13242 static struct genl_family nl80211_fam __ro_after_init = {
13243         .name = NL80211_GENL_NAME,      /* have users key off the name instead */
13244         .hdrsize = 0,                   /* no private header */
13245         .version = 1,                   /* no particular meaning now */
13246         .maxattr = NL80211_ATTR_MAX,
13247         .netnsok = true,
13248         .pre_doit = nl80211_pre_doit,
13249         .post_doit = nl80211_post_doit,
13250         .module = THIS_MODULE,
13251         .ops = nl80211_ops,
13252         .n_ops = ARRAY_SIZE(nl80211_ops),
13253         .mcgrps = nl80211_mcgrps,
13254         .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps),
13255 };
13256
13257 /* notification functions */
13258
13259 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
13260                           enum nl80211_commands cmd)
13261 {
13262         struct sk_buff *msg;
13263         struct nl80211_dump_wiphy_state state = {};
13264
13265         WARN_ON(cmd != NL80211_CMD_NEW_WIPHY &&
13266                 cmd != NL80211_CMD_DEL_WIPHY);
13267
13268         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13269         if (!msg)
13270                 return;
13271
13272         if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) {
13273                 nlmsg_free(msg);
13274                 return;
13275         }
13276
13277         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13278                                 NL80211_MCGRP_CONFIG, GFP_KERNEL);
13279 }
13280
13281 void nl80211_notify_iface(struct cfg80211_registered_device *rdev,
13282                                 struct wireless_dev *wdev,
13283                                 enum nl80211_commands cmd)
13284 {
13285         struct sk_buff *msg;
13286
13287         WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE &&
13288                 cmd != NL80211_CMD_DEL_INTERFACE);
13289
13290         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13291         if (!msg)
13292                 return;
13293
13294         if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev,
13295                                cmd == NL80211_CMD_DEL_INTERFACE) < 0) {
13296                 nlmsg_free(msg);
13297                 return;
13298         }
13299
13300         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13301                                 NL80211_MCGRP_CONFIG, GFP_KERNEL);
13302 }
13303
13304 static int nl80211_add_scan_req(struct sk_buff *msg,
13305                                 struct cfg80211_registered_device *rdev)
13306 {
13307         struct cfg80211_scan_request *req = rdev->scan_req;
13308         struct nlattr *nest;
13309         int i;
13310
13311         if (WARN_ON(!req))
13312                 return 0;
13313
13314         nest = nla_nest_start(msg, NL80211_ATTR_SCAN_SSIDS);
13315         if (!nest)
13316                 goto nla_put_failure;
13317         for (i = 0; i < req->n_ssids; i++) {
13318                 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid))
13319                         goto nla_put_failure;
13320         }
13321         nla_nest_end(msg, nest);
13322
13323         nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
13324         if (!nest)
13325                 goto nla_put_failure;
13326         for (i = 0; i < req->n_channels; i++) {
13327                 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
13328                         goto nla_put_failure;
13329         }
13330         nla_nest_end(msg, nest);
13331
13332         if (req->ie &&
13333             nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie))
13334                 goto nla_put_failure;
13335
13336         if (req->flags &&
13337             nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags))
13338                 goto nla_put_failure;
13339
13340         if (req->info.scan_start_tsf &&
13341             (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF,
13342                                req->info.scan_start_tsf, NL80211_BSS_PAD) ||
13343              nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN,
13344                      req->info.tsf_bssid)))
13345                 goto nla_put_failure;
13346
13347         return 0;
13348  nla_put_failure:
13349         return -ENOBUFS;
13350 }
13351
13352 static int nl80211_prep_scan_msg(struct sk_buff *msg,
13353                                  struct cfg80211_registered_device *rdev,
13354                                  struct wireless_dev *wdev,
13355                                  u32 portid, u32 seq, int flags,
13356                                  u32 cmd)
13357 {
13358         void *hdr;
13359
13360         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
13361         if (!hdr)
13362                 return -1;
13363
13364         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13365             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
13366                                          wdev->netdev->ifindex)) ||
13367             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
13368                               NL80211_ATTR_PAD))
13369                 goto nla_put_failure;
13370
13371         /* ignore errors and send incomplete event anyway */
13372         nl80211_add_scan_req(msg, rdev);
13373
13374         genlmsg_end(msg, hdr);
13375         return 0;
13376
13377  nla_put_failure:
13378         genlmsg_cancel(msg, hdr);
13379         return -EMSGSIZE;
13380 }
13381
13382 static int
13383 nl80211_prep_sched_scan_msg(struct sk_buff *msg,
13384                             struct cfg80211_sched_scan_request *req, u32 cmd)
13385 {
13386         void *hdr;
13387
13388         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
13389         if (!hdr)
13390                 return -1;
13391
13392         if (nla_put_u32(msg, NL80211_ATTR_WIPHY,
13393                         wiphy_to_rdev(req->wiphy)->wiphy_idx) ||
13394             nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) ||
13395             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid,
13396                               NL80211_ATTR_PAD))
13397                 goto nla_put_failure;
13398
13399         genlmsg_end(msg, hdr);
13400         return 0;
13401
13402  nla_put_failure:
13403         genlmsg_cancel(msg, hdr);
13404         return -EMSGSIZE;
13405 }
13406
13407 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
13408                              struct wireless_dev *wdev)
13409 {
13410         struct sk_buff *msg;
13411
13412         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13413         if (!msg)
13414                 return;
13415
13416         if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
13417                                   NL80211_CMD_TRIGGER_SCAN) < 0) {
13418                 nlmsg_free(msg);
13419                 return;
13420         }
13421
13422         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13423                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
13424 }
13425
13426 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
13427                                        struct wireless_dev *wdev, bool aborted)
13428 {
13429         struct sk_buff *msg;
13430
13431         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13432         if (!msg)
13433                 return NULL;
13434
13435         if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
13436                                   aborted ? NL80211_CMD_SCAN_ABORTED :
13437                                             NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
13438                 nlmsg_free(msg);
13439                 return NULL;
13440         }
13441
13442         return msg;
13443 }
13444
13445 /* send message created by nl80211_build_scan_msg() */
13446 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev,
13447                            struct sk_buff *msg)
13448 {
13449         if (!msg)
13450                 return;
13451
13452         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13453                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
13454 }
13455
13456 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd)
13457 {
13458         struct sk_buff *msg;
13459
13460         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13461         if (!msg)
13462                 return;
13463
13464         if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) {
13465                 nlmsg_free(msg);
13466                 return;
13467         }
13468
13469         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0,
13470                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
13471 }
13472
13473 static bool nl80211_reg_change_event_fill(struct sk_buff *msg,
13474                                           struct regulatory_request *request)
13475 {
13476         /* Userspace can always count this one always being set */
13477         if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator))
13478                 goto nla_put_failure;
13479
13480         if (request->alpha2[0] == '0' && request->alpha2[1] == '0') {
13481                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
13482                                NL80211_REGDOM_TYPE_WORLD))
13483                         goto nla_put_failure;
13484         } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') {
13485                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
13486                                NL80211_REGDOM_TYPE_CUSTOM_WORLD))
13487                         goto nla_put_failure;
13488         } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
13489                    request->intersect) {
13490                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
13491                                NL80211_REGDOM_TYPE_INTERSECTION))
13492                         goto nla_put_failure;
13493         } else {
13494                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
13495                                NL80211_REGDOM_TYPE_COUNTRY) ||
13496                     nla_put_string(msg, NL80211_ATTR_REG_ALPHA2,
13497                                    request->alpha2))
13498                         goto nla_put_failure;
13499         }
13500
13501         if (request->wiphy_idx != WIPHY_IDX_INVALID) {
13502                 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx);
13503
13504                 if (wiphy &&
13505                     nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx))
13506                         goto nla_put_failure;
13507
13508                 if (wiphy &&
13509                     wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
13510                     nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
13511                         goto nla_put_failure;
13512         }
13513
13514         return true;
13515
13516 nla_put_failure:
13517         return false;
13518 }
13519
13520 /*
13521  * This can happen on global regulatory changes or device specific settings
13522  * based on custom regulatory domains.
13523  */
13524 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id,
13525                                      struct regulatory_request *request)
13526 {
13527         struct sk_buff *msg;
13528         void *hdr;
13529
13530         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13531         if (!msg)
13532                 return;
13533
13534         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id);
13535         if (!hdr) {
13536                 nlmsg_free(msg);
13537                 return;
13538         }
13539
13540         if (nl80211_reg_change_event_fill(msg, request) == false)
13541                 goto nla_put_failure;
13542
13543         genlmsg_end(msg, hdr);
13544
13545         rcu_read_lock();
13546         genlmsg_multicast_allns(&nl80211_fam, msg, 0,
13547                                 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
13548         rcu_read_unlock();
13549
13550         return;
13551
13552 nla_put_failure:
13553         genlmsg_cancel(msg, hdr);
13554         nlmsg_free(msg);
13555 }
13556
13557 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
13558                                     struct net_device *netdev,
13559                                     const u8 *buf, size_t len,
13560                                     enum nl80211_commands cmd, gfp_t gfp,
13561                                     int uapsd_queues)
13562 {
13563         struct sk_buff *msg;
13564         void *hdr;
13565
13566         msg = nlmsg_new(100 + len, gfp);
13567         if (!msg)
13568                 return;
13569
13570         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
13571         if (!hdr) {
13572                 nlmsg_free(msg);
13573                 return;
13574         }
13575
13576         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13577             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13578             nla_put(msg, NL80211_ATTR_FRAME, len, buf))
13579                 goto nla_put_failure;
13580
13581         if (uapsd_queues >= 0) {
13582                 struct nlattr *nla_wmm =
13583                         nla_nest_start(msg, NL80211_ATTR_STA_WME);
13584                 if (!nla_wmm)
13585                         goto nla_put_failure;
13586
13587                 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES,
13588                                uapsd_queues))
13589                         goto nla_put_failure;
13590
13591                 nla_nest_end(msg, nla_wmm);
13592         }
13593
13594         genlmsg_end(msg, hdr);
13595
13596         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13597                                 NL80211_MCGRP_MLME, gfp);
13598         return;
13599
13600  nla_put_failure:
13601         genlmsg_cancel(msg, hdr);
13602         nlmsg_free(msg);
13603 }
13604
13605 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
13606                           struct net_device *netdev, const u8 *buf,
13607                           size_t len, gfp_t gfp)
13608 {
13609         nl80211_send_mlme_event(rdev, netdev, buf, len,
13610                                 NL80211_CMD_AUTHENTICATE, gfp, -1);
13611 }
13612
13613 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
13614                            struct net_device *netdev, const u8 *buf,
13615                            size_t len, gfp_t gfp, int uapsd_queues)
13616 {
13617         nl80211_send_mlme_event(rdev, netdev, buf, len,
13618                                 NL80211_CMD_ASSOCIATE, gfp, uapsd_queues);
13619 }
13620
13621 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
13622                          struct net_device *netdev, const u8 *buf,
13623                          size_t len, gfp_t gfp)
13624 {
13625         nl80211_send_mlme_event(rdev, netdev, buf, len,
13626                                 NL80211_CMD_DEAUTHENTICATE, gfp, -1);
13627 }
13628
13629 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
13630                            struct net_device *netdev, const u8 *buf,
13631                            size_t len, gfp_t gfp)
13632 {
13633         nl80211_send_mlme_event(rdev, netdev, buf, len,
13634                                 NL80211_CMD_DISASSOCIATE, gfp, -1);
13635 }
13636
13637 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
13638                                   size_t len)
13639 {
13640         struct wireless_dev *wdev = dev->ieee80211_ptr;
13641         struct wiphy *wiphy = wdev->wiphy;
13642         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
13643         const struct ieee80211_mgmt *mgmt = (void *)buf;
13644         u32 cmd;
13645
13646         if (WARN_ON(len < 2))
13647                 return;
13648
13649         if (ieee80211_is_deauth(mgmt->frame_control))
13650                 cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE;
13651         else
13652                 cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
13653
13654         trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
13655         nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1);
13656 }
13657 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
13658
13659 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
13660                                       struct net_device *netdev, int cmd,
13661                                       const u8 *addr, gfp_t gfp)
13662 {
13663         struct sk_buff *msg;
13664         void *hdr;
13665
13666         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13667         if (!msg)
13668                 return;
13669
13670         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
13671         if (!hdr) {
13672                 nlmsg_free(msg);
13673                 return;
13674         }
13675
13676         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13677             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13678             nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
13679             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
13680                 goto nla_put_failure;
13681
13682         genlmsg_end(msg, hdr);
13683
13684         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13685                                 NL80211_MCGRP_MLME, gfp);
13686         return;
13687
13688  nla_put_failure:
13689         genlmsg_cancel(msg, hdr);
13690         nlmsg_free(msg);
13691 }
13692
13693 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
13694                                struct net_device *netdev, const u8 *addr,
13695                                gfp_t gfp)
13696 {
13697         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
13698                                   addr, gfp);
13699 }
13700
13701 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
13702                                 struct net_device *netdev, const u8 *addr,
13703                                 gfp_t gfp)
13704 {
13705         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
13706                                   addr, gfp);
13707 }
13708
13709 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
13710                                  struct net_device *netdev,
13711                                  struct cfg80211_connect_resp_params *cr,
13712                                  gfp_t gfp)
13713 {
13714         struct sk_buff *msg;
13715         void *hdr;
13716
13717         msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len +
13718                         cr->fils_kek_len + cr->pmk_len +
13719                         (cr->pmkid ? WLAN_PMKID_LEN : 0), gfp);
13720         if (!msg)
13721                 return;
13722
13723         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
13724         if (!hdr) {
13725                 nlmsg_free(msg);
13726                 return;
13727         }
13728
13729         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13730             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13731             (cr->bssid &&
13732              nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) ||
13733             nla_put_u16(msg, NL80211_ATTR_STATUS_CODE,
13734                         cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE :
13735                         cr->status) ||
13736             (cr->status < 0 &&
13737              (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
13738               nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON,
13739                           cr->timeout_reason))) ||
13740             (cr->req_ie &&
13741              nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) ||
13742             (cr->resp_ie &&
13743              nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len,
13744                      cr->resp_ie)) ||
13745             (cr->update_erp_next_seq_num &&
13746              nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
13747                          cr->fils_erp_next_seq_num)) ||
13748             (cr->status == WLAN_STATUS_SUCCESS &&
13749              ((cr->fils_kek &&
13750                nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils_kek_len,
13751                        cr->fils_kek)) ||
13752               (cr->pmk &&
13753                nla_put(msg, NL80211_ATTR_PMK, cr->pmk_len, cr->pmk)) ||
13754               (cr->pmkid &&
13755                nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->pmkid)))))
13756                 goto nla_put_failure;
13757
13758         genlmsg_end(msg, hdr);
13759
13760         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13761                                 NL80211_MCGRP_MLME, gfp);
13762         return;
13763
13764  nla_put_failure:
13765         genlmsg_cancel(msg, hdr);
13766         nlmsg_free(msg);
13767 }
13768
13769 void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
13770                          struct net_device *netdev,
13771                          struct cfg80211_roam_info *info, gfp_t gfp)
13772 {
13773         struct sk_buff *msg;
13774         void *hdr;
13775         const u8 *bssid = info->bss ? info->bss->bssid : info->bssid;
13776
13777         msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len, gfp);
13778         if (!msg)
13779                 return;
13780
13781         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
13782         if (!hdr) {
13783                 nlmsg_free(msg);
13784                 return;
13785         }
13786
13787         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13788             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13789             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) ||
13790             (info->req_ie &&
13791              nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len,
13792                      info->req_ie)) ||
13793             (info->resp_ie &&
13794              nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len,
13795                      info->resp_ie)) ||
13796             (info->authorized &&
13797              nla_put_flag(msg, NL80211_ATTR_PORT_AUTHORIZED)))
13798                 goto nla_put_failure;
13799
13800         genlmsg_end(msg, hdr);
13801
13802         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13803                                 NL80211_MCGRP_MLME, gfp);
13804         return;
13805
13806  nla_put_failure:
13807         genlmsg_cancel(msg, hdr);
13808         nlmsg_free(msg);
13809 }
13810
13811 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
13812                                struct net_device *netdev, u16 reason,
13813                                const u8 *ie, size_t ie_len, bool from_ap)
13814 {
13815         struct sk_buff *msg;
13816         void *hdr;
13817
13818         msg = nlmsg_new(100 + ie_len, GFP_KERNEL);
13819         if (!msg)
13820                 return;
13821
13822         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
13823         if (!hdr) {
13824                 nlmsg_free(msg);
13825                 return;
13826         }
13827
13828         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13829             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13830             (from_ap && reason &&
13831              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) ||
13832             (from_ap &&
13833              nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) ||
13834             (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie)))
13835                 goto nla_put_failure;
13836
13837         genlmsg_end(msg, hdr);
13838
13839         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13840                                 NL80211_MCGRP_MLME, GFP_KERNEL);
13841         return;
13842
13843  nla_put_failure:
13844         genlmsg_cancel(msg, hdr);
13845         nlmsg_free(msg);
13846 }
13847
13848 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
13849                              struct net_device *netdev, const u8 *bssid,
13850                              gfp_t gfp)
13851 {
13852         struct sk_buff *msg;
13853         void *hdr;
13854
13855         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13856         if (!msg)
13857                 return;
13858
13859         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
13860         if (!hdr) {
13861                 nlmsg_free(msg);
13862                 return;
13863         }
13864
13865         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13866             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13867             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
13868                 goto nla_put_failure;
13869
13870         genlmsg_end(msg, hdr);
13871
13872         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13873                                 NL80211_MCGRP_MLME, gfp);
13874         return;
13875
13876  nla_put_failure:
13877         genlmsg_cancel(msg, hdr);
13878         nlmsg_free(msg);
13879 }
13880
13881 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
13882                                         const u8* ie, u8 ie_len, gfp_t gfp)
13883 {
13884         struct wireless_dev *wdev = dev->ieee80211_ptr;
13885         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
13886         struct sk_buff *msg;
13887         void *hdr;
13888
13889         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
13890                 return;
13891
13892         trace_cfg80211_notify_new_peer_candidate(dev, addr);
13893
13894         msg = nlmsg_new(100 + ie_len, gfp);
13895         if (!msg)
13896                 return;
13897
13898         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
13899         if (!hdr) {
13900                 nlmsg_free(msg);
13901                 return;
13902         }
13903
13904         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13905             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
13906             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
13907             (ie_len && ie &&
13908              nla_put(msg, NL80211_ATTR_IE, ie_len , ie)))
13909                 goto nla_put_failure;
13910
13911         genlmsg_end(msg, hdr);
13912
13913         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13914                                 NL80211_MCGRP_MLME, gfp);
13915         return;
13916
13917  nla_put_failure:
13918         genlmsg_cancel(msg, hdr);
13919         nlmsg_free(msg);
13920 }
13921 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
13922
13923 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
13924                                  struct net_device *netdev, const u8 *addr,
13925                                  enum nl80211_key_type key_type, int key_id,
13926                                  const u8 *tsc, gfp_t gfp)
13927 {
13928         struct sk_buff *msg;
13929         void *hdr;
13930
13931         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13932         if (!msg)
13933                 return;
13934
13935         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
13936         if (!hdr) {
13937                 nlmsg_free(msg);
13938                 return;
13939         }
13940
13941         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13942             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13943             (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) ||
13944             nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) ||
13945             (key_id != -1 &&
13946              nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) ||
13947             (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc)))
13948                 goto nla_put_failure;
13949
13950         genlmsg_end(msg, hdr);
13951
13952         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13953                                 NL80211_MCGRP_MLME, gfp);
13954         return;
13955
13956  nla_put_failure:
13957         genlmsg_cancel(msg, hdr);
13958         nlmsg_free(msg);
13959 }
13960
13961 void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
13962                                     struct ieee80211_channel *channel_before,
13963                                     struct ieee80211_channel *channel_after)
13964 {
13965         struct sk_buff *msg;
13966         void *hdr;
13967         struct nlattr *nl_freq;
13968
13969         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
13970         if (!msg)
13971                 return;
13972
13973         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
13974         if (!hdr) {
13975                 nlmsg_free(msg);
13976                 return;
13977         }
13978
13979         /*
13980          * Since we are applying the beacon hint to a wiphy we know its
13981          * wiphy_idx is valid
13982          */
13983         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
13984                 goto nla_put_failure;
13985
13986         /* Before */
13987         nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_BEFORE);
13988         if (!nl_freq)
13989                 goto nla_put_failure;
13990         if (nl80211_msg_put_channel(msg, channel_before, false))
13991                 goto nla_put_failure;
13992         nla_nest_end(msg, nl_freq);
13993
13994         /* After */
13995         nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_AFTER);
13996         if (!nl_freq)
13997                 goto nla_put_failure;
13998         if (nl80211_msg_put_channel(msg, channel_after, false))
13999                 goto nla_put_failure;
14000         nla_nest_end(msg, nl_freq);
14001
14002         genlmsg_end(msg, hdr);
14003
14004         rcu_read_lock();
14005         genlmsg_multicast_allns(&nl80211_fam, msg, 0,
14006                                 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
14007         rcu_read_unlock();
14008
14009         return;
14010
14011 nla_put_failure:
14012         genlmsg_cancel(msg, hdr);
14013         nlmsg_free(msg);
14014 }
14015
14016 static void nl80211_send_remain_on_chan_event(
14017         int cmd, struct cfg80211_registered_device *rdev,
14018         struct wireless_dev *wdev, u64 cookie,
14019         struct ieee80211_channel *chan,
14020         unsigned int duration, gfp_t gfp)
14021 {
14022         struct sk_buff *msg;
14023         void *hdr;
14024
14025         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14026         if (!msg)
14027                 return;
14028
14029         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
14030         if (!hdr) {
14031                 nlmsg_free(msg);
14032                 return;
14033         }
14034
14035         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14036             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
14037                                          wdev->netdev->ifindex)) ||
14038             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14039                               NL80211_ATTR_PAD) ||
14040             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) ||
14041             nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
14042                         NL80211_CHAN_NO_HT) ||
14043             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
14044                               NL80211_ATTR_PAD))
14045                 goto nla_put_failure;
14046
14047         if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL &&
14048             nla_put_u32(msg, NL80211_ATTR_DURATION, duration))
14049                 goto nla_put_failure;
14050
14051         genlmsg_end(msg, hdr);
14052
14053         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14054                                 NL80211_MCGRP_MLME, gfp);
14055         return;
14056
14057  nla_put_failure:
14058         genlmsg_cancel(msg, hdr);
14059         nlmsg_free(msg);
14060 }
14061
14062 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
14063                                struct ieee80211_channel *chan,
14064                                unsigned int duration, gfp_t gfp)
14065 {
14066         struct wiphy *wiphy = wdev->wiphy;
14067         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14068
14069         trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
14070         nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
14071                                           rdev, wdev, cookie, chan,
14072                                           duration, gfp);
14073 }
14074 EXPORT_SYMBOL(cfg80211_ready_on_channel);
14075
14076 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
14077                                         struct ieee80211_channel *chan,
14078                                         gfp_t gfp)
14079 {
14080         struct wiphy *wiphy = wdev->wiphy;
14081         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14082
14083         trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
14084         nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
14085                                           rdev, wdev, cookie, chan, 0, gfp);
14086 }
14087 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
14088
14089 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
14090                       struct station_info *sinfo, gfp_t gfp)
14091 {
14092         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
14093         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14094         struct sk_buff *msg;
14095
14096         trace_cfg80211_new_sta(dev, mac_addr, sinfo);
14097
14098         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14099         if (!msg)
14100                 return;
14101
14102         if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0,
14103                                  rdev, dev, mac_addr, sinfo) < 0) {
14104                 nlmsg_free(msg);
14105                 return;
14106         }
14107
14108         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14109                                 NL80211_MCGRP_MLME, gfp);
14110 }
14111 EXPORT_SYMBOL(cfg80211_new_sta);
14112
14113 void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
14114                             struct station_info *sinfo, gfp_t gfp)
14115 {
14116         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
14117         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14118         struct sk_buff *msg;
14119         struct station_info empty_sinfo = {};
14120
14121         if (!sinfo)
14122                 sinfo = &empty_sinfo;
14123
14124         trace_cfg80211_del_sta(dev, mac_addr);
14125
14126         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14127         if (!msg)
14128                 return;
14129
14130         if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0,
14131                                  rdev, dev, mac_addr, sinfo) < 0) {
14132                 nlmsg_free(msg);
14133                 return;
14134         }
14135
14136         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14137                                 NL80211_MCGRP_MLME, gfp);
14138 }
14139 EXPORT_SYMBOL(cfg80211_del_sta_sinfo);
14140
14141 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
14142                           enum nl80211_connect_failed_reason reason,
14143                           gfp_t gfp)
14144 {
14145         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
14146         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14147         struct sk_buff *msg;
14148         void *hdr;
14149
14150         msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
14151         if (!msg)
14152                 return;
14153
14154         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
14155         if (!hdr) {
14156                 nlmsg_free(msg);
14157                 return;
14158         }
14159
14160         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
14161             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
14162             nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
14163                 goto nla_put_failure;
14164
14165         genlmsg_end(msg, hdr);
14166
14167         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14168                                 NL80211_MCGRP_MLME, gfp);
14169         return;
14170
14171  nla_put_failure:
14172         genlmsg_cancel(msg, hdr);
14173         nlmsg_free(msg);
14174 }
14175 EXPORT_SYMBOL(cfg80211_conn_failed);
14176
14177 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
14178                                        const u8 *addr, gfp_t gfp)
14179 {
14180         struct wireless_dev *wdev = dev->ieee80211_ptr;
14181         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14182         struct sk_buff *msg;
14183         void *hdr;
14184         u32 nlportid = ACCESS_ONCE(wdev->ap_unexpected_nlportid);
14185
14186         if (!nlportid)
14187                 return false;
14188
14189         msg = nlmsg_new(100, gfp);
14190         if (!msg)
14191                 return true;
14192
14193         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
14194         if (!hdr) {
14195                 nlmsg_free(msg);
14196                 return true;
14197         }
14198
14199         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14200             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
14201             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
14202                 goto nla_put_failure;
14203
14204         genlmsg_end(msg, hdr);
14205         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
14206         return true;
14207
14208  nla_put_failure:
14209         genlmsg_cancel(msg, hdr);
14210         nlmsg_free(msg);
14211         return true;
14212 }
14213
14214 bool cfg80211_rx_spurious_frame(struct net_device *dev,
14215                                 const u8 *addr, gfp_t gfp)
14216 {
14217         struct wireless_dev *wdev = dev->ieee80211_ptr;
14218         bool ret;
14219
14220         trace_cfg80211_rx_spurious_frame(dev, addr);
14221
14222         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
14223                     wdev->iftype != NL80211_IFTYPE_P2P_GO)) {
14224                 trace_cfg80211_return_bool(false);
14225                 return false;
14226         }
14227         ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME,
14228                                          addr, gfp);
14229         trace_cfg80211_return_bool(ret);
14230         return ret;
14231 }
14232 EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
14233
14234 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
14235                                         const u8 *addr, gfp_t gfp)
14236 {
14237         struct wireless_dev *wdev = dev->ieee80211_ptr;
14238         bool ret;
14239
14240         trace_cfg80211_rx_unexpected_4addr_frame(dev, addr);
14241
14242         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
14243                     wdev->iftype != NL80211_IFTYPE_P2P_GO &&
14244                     wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
14245                 trace_cfg80211_return_bool(false);
14246                 return false;
14247         }
14248         ret = __nl80211_unexpected_frame(dev,
14249                                          NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
14250                                          addr, gfp);
14251         trace_cfg80211_return_bool(ret);
14252         return ret;
14253 }
14254 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
14255
14256 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
14257                       struct wireless_dev *wdev, u32 nlportid,
14258                       int freq, int sig_dbm,
14259                       const u8 *buf, size_t len, u32 flags, gfp_t gfp)
14260 {
14261         struct net_device *netdev = wdev->netdev;
14262         struct sk_buff *msg;
14263         void *hdr;
14264
14265         msg = nlmsg_new(100 + len, gfp);
14266         if (!msg)
14267                 return -ENOMEM;
14268
14269         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
14270         if (!hdr) {
14271                 nlmsg_free(msg);
14272                 return -ENOMEM;
14273         }
14274
14275         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14276             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
14277                                         netdev->ifindex)) ||
14278             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14279                               NL80211_ATTR_PAD) ||
14280             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
14281             (sig_dbm &&
14282              nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
14283             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
14284             (flags &&
14285              nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags)))
14286                 goto nla_put_failure;
14287
14288         genlmsg_end(msg, hdr);
14289
14290         return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
14291
14292  nla_put_failure:
14293         genlmsg_cancel(msg, hdr);
14294         nlmsg_free(msg);
14295         return -ENOBUFS;
14296 }
14297
14298 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
14299                              const u8 *buf, size_t len, bool ack, gfp_t gfp)
14300 {
14301         struct wiphy *wiphy = wdev->wiphy;
14302         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14303         struct net_device *netdev = wdev->netdev;
14304         struct sk_buff *msg;
14305         void *hdr;
14306
14307         trace_cfg80211_mgmt_tx_status(wdev, cookie, ack);
14308
14309         msg = nlmsg_new(100 + len, gfp);
14310         if (!msg)
14311                 return;
14312
14313         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS);
14314         if (!hdr) {
14315                 nlmsg_free(msg);
14316                 return;
14317         }
14318
14319         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14320             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
14321                                    netdev->ifindex)) ||
14322             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14323                               NL80211_ATTR_PAD) ||
14324             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
14325             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
14326                               NL80211_ATTR_PAD) ||
14327             (ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
14328                 goto nla_put_failure;
14329
14330         genlmsg_end(msg, hdr);
14331
14332         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14333                                 NL80211_MCGRP_MLME, gfp);
14334         return;
14335
14336  nla_put_failure:
14337         genlmsg_cancel(msg, hdr);
14338         nlmsg_free(msg);
14339 }
14340 EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
14341
14342 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev,
14343                                             const char *mac, gfp_t gfp)
14344 {
14345         struct wireless_dev *wdev = dev->ieee80211_ptr;
14346         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14347         struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14348         void **cb;
14349
14350         if (!msg)
14351                 return NULL;
14352
14353         cb = (void **)msg->cb;
14354
14355         cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
14356         if (!cb[0]) {
14357                 nlmsg_free(msg);
14358                 return NULL;
14359         }
14360
14361         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14362             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
14363                 goto nla_put_failure;
14364
14365         if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
14366                 goto nla_put_failure;
14367
14368         cb[1] = nla_nest_start(msg, NL80211_ATTR_CQM);
14369         if (!cb[1])
14370                 goto nla_put_failure;
14371
14372         cb[2] = rdev;
14373
14374         return msg;
14375  nla_put_failure:
14376         nlmsg_free(msg);
14377         return NULL;
14378 }
14379
14380 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp)
14381 {
14382         void **cb = (void **)msg->cb;
14383         struct cfg80211_registered_device *rdev = cb[2];
14384
14385         nla_nest_end(msg, cb[1]);
14386         genlmsg_end(msg, cb[0]);
14387
14388         memset(msg->cb, 0, sizeof(msg->cb));
14389
14390         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14391                                 NL80211_MCGRP_MLME, gfp);
14392 }
14393
14394 void cfg80211_cqm_rssi_notify(struct net_device *dev,
14395                               enum nl80211_cqm_rssi_threshold_event rssi_event,
14396                               s32 rssi_level, gfp_t gfp)
14397 {
14398         struct sk_buff *msg;
14399         struct wireless_dev *wdev = dev->ieee80211_ptr;
14400         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14401
14402         trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level);
14403
14404         if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
14405                     rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
14406                 return;
14407
14408         if (wdev->cqm_config) {
14409                 wdev->cqm_config->last_rssi_event_value = rssi_level;
14410
14411                 cfg80211_cqm_rssi_update(rdev, dev);
14412
14413                 if (rssi_level == 0)
14414                         rssi_level = wdev->cqm_config->last_rssi_event_value;
14415         }
14416
14417         msg = cfg80211_prepare_cqm(dev, NULL, gfp);
14418         if (!msg)
14419                 return;
14420
14421         if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
14422                         rssi_event))
14423                 goto nla_put_failure;
14424
14425         if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL,
14426                                       rssi_level))
14427                 goto nla_put_failure;
14428
14429         cfg80211_send_cqm(msg, gfp);
14430
14431         return;
14432
14433  nla_put_failure:
14434         nlmsg_free(msg);
14435 }
14436 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
14437
14438 void cfg80211_cqm_txe_notify(struct net_device *dev,
14439                              const u8 *peer, u32 num_packets,
14440                              u32 rate, u32 intvl, gfp_t gfp)
14441 {
14442         struct sk_buff *msg;
14443
14444         msg = cfg80211_prepare_cqm(dev, peer, gfp);
14445         if (!msg)
14446                 return;
14447
14448         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets))
14449                 goto nla_put_failure;
14450
14451         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate))
14452                 goto nla_put_failure;
14453
14454         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl))
14455                 goto nla_put_failure;
14456
14457         cfg80211_send_cqm(msg, gfp);
14458         return;
14459
14460  nla_put_failure:
14461         nlmsg_free(msg);
14462 }
14463 EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
14464
14465 void cfg80211_cqm_pktloss_notify(struct net_device *dev,
14466                                  const u8 *peer, u32 num_packets, gfp_t gfp)
14467 {
14468         struct sk_buff *msg;
14469
14470         trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
14471
14472         msg = cfg80211_prepare_cqm(dev, peer, gfp);
14473         if (!msg)
14474                 return;
14475
14476         if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets))
14477                 goto nla_put_failure;
14478
14479         cfg80211_send_cqm(msg, gfp);
14480         return;
14481
14482  nla_put_failure:
14483         nlmsg_free(msg);
14484 }
14485 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
14486
14487 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp)
14488 {
14489         struct sk_buff *msg;
14490
14491         msg = cfg80211_prepare_cqm(dev, NULL, gfp);
14492         if (!msg)
14493                 return;
14494
14495         if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT))
14496                 goto nla_put_failure;
14497
14498         cfg80211_send_cqm(msg, gfp);
14499         return;
14500
14501  nla_put_failure:
14502         nlmsg_free(msg);
14503 }
14504 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify);
14505
14506 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
14507                                      struct net_device *netdev, const u8 *bssid,
14508                                      const u8 *replay_ctr, gfp_t gfp)
14509 {
14510         struct sk_buff *msg;
14511         struct nlattr *rekey_attr;
14512         void *hdr;
14513
14514         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14515         if (!msg)
14516                 return;
14517
14518         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD);
14519         if (!hdr) {
14520                 nlmsg_free(msg);
14521                 return;
14522         }
14523
14524         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14525             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
14526             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
14527                 goto nla_put_failure;
14528
14529         rekey_attr = nla_nest_start(msg, NL80211_ATTR_REKEY_DATA);
14530         if (!rekey_attr)
14531                 goto nla_put_failure;
14532
14533         if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR,
14534                     NL80211_REPLAY_CTR_LEN, replay_ctr))
14535                 goto nla_put_failure;
14536
14537         nla_nest_end(msg, rekey_attr);
14538
14539         genlmsg_end(msg, hdr);
14540
14541         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14542                                 NL80211_MCGRP_MLME, gfp);
14543         return;
14544
14545  nla_put_failure:
14546         genlmsg_cancel(msg, hdr);
14547         nlmsg_free(msg);
14548 }
14549
14550 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
14551                                const u8 *replay_ctr, gfp_t gfp)
14552 {
14553         struct wireless_dev *wdev = dev->ieee80211_ptr;
14554         struct wiphy *wiphy = wdev->wiphy;
14555         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14556
14557         trace_cfg80211_gtk_rekey_notify(dev, bssid);
14558         nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
14559 }
14560 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
14561
14562 static void
14563 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
14564                                struct net_device *netdev, int index,
14565                                const u8 *bssid, bool preauth, gfp_t gfp)
14566 {
14567         struct sk_buff *msg;
14568         struct nlattr *attr;
14569         void *hdr;
14570
14571         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14572         if (!msg)
14573                 return;
14574
14575         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE);
14576         if (!hdr) {
14577                 nlmsg_free(msg);
14578                 return;
14579         }
14580
14581         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14582             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
14583                 goto nla_put_failure;
14584
14585         attr = nla_nest_start(msg, NL80211_ATTR_PMKSA_CANDIDATE);
14586         if (!attr)
14587                 goto nla_put_failure;
14588
14589         if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) ||
14590             nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) ||
14591             (preauth &&
14592              nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH)))
14593                 goto nla_put_failure;
14594
14595         nla_nest_end(msg, attr);
14596
14597         genlmsg_end(msg, hdr);
14598
14599         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14600                                 NL80211_MCGRP_MLME, gfp);
14601         return;
14602
14603  nla_put_failure:
14604         genlmsg_cancel(msg, hdr);
14605         nlmsg_free(msg);
14606 }
14607
14608 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
14609                                      const u8 *bssid, bool preauth, gfp_t gfp)
14610 {
14611         struct wireless_dev *wdev = dev->ieee80211_ptr;
14612         struct wiphy *wiphy = wdev->wiphy;
14613         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14614
14615         trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
14616         nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
14617 }
14618 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
14619
14620 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
14621                                      struct net_device *netdev,
14622                                      struct cfg80211_chan_def *chandef,
14623                                      gfp_t gfp,
14624                                      enum nl80211_commands notif,
14625                                      u8 count)
14626 {
14627         struct sk_buff *msg;
14628         void *hdr;
14629
14630         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14631         if (!msg)
14632                 return;
14633
14634         hdr = nl80211hdr_put(msg, 0, 0, 0, notif);
14635         if (!hdr) {
14636                 nlmsg_free(msg);
14637                 return;
14638         }
14639
14640         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
14641                 goto nla_put_failure;
14642
14643         if (nl80211_send_chandef(msg, chandef))
14644                 goto nla_put_failure;
14645
14646         if ((notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) &&
14647             (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)))
14648                         goto nla_put_failure;
14649
14650         genlmsg_end(msg, hdr);
14651
14652         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14653                                 NL80211_MCGRP_MLME, gfp);
14654         return;
14655
14656  nla_put_failure:
14657         genlmsg_cancel(msg, hdr);
14658         nlmsg_free(msg);
14659 }
14660
14661 void cfg80211_ch_switch_notify(struct net_device *dev,
14662                                struct cfg80211_chan_def *chandef)
14663 {
14664         struct wireless_dev *wdev = dev->ieee80211_ptr;
14665         struct wiphy *wiphy = wdev->wiphy;
14666         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14667
14668         ASSERT_WDEV_LOCK(wdev);
14669
14670         trace_cfg80211_ch_switch_notify(dev, chandef);
14671
14672         wdev->chandef = *chandef;
14673         wdev->preset_chandef = *chandef;
14674         nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
14675                                  NL80211_CMD_CH_SWITCH_NOTIFY, 0);
14676 }
14677 EXPORT_SYMBOL(cfg80211_ch_switch_notify);
14678
14679 void cfg80211_ch_switch_started_notify(struct net_device *dev,
14680                                        struct cfg80211_chan_def *chandef,
14681                                        u8 count)
14682 {
14683         struct wireless_dev *wdev = dev->ieee80211_ptr;
14684         struct wiphy *wiphy = wdev->wiphy;
14685         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14686
14687         trace_cfg80211_ch_switch_started_notify(dev, chandef);
14688
14689         nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
14690                                  NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, count);
14691 }
14692 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
14693
14694 void
14695 nl80211_radar_notify(struct cfg80211_registered_device *rdev,
14696                      const struct cfg80211_chan_def *chandef,
14697                      enum nl80211_radar_event event,
14698                      struct net_device *netdev, gfp_t gfp)
14699 {
14700         struct sk_buff *msg;
14701         void *hdr;
14702
14703         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14704         if (!msg)
14705                 return;
14706
14707         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT);
14708         if (!hdr) {
14709                 nlmsg_free(msg);
14710                 return;
14711         }
14712
14713         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
14714                 goto nla_put_failure;
14715
14716         /* NOP and radar events don't need a netdev parameter */
14717         if (netdev) {
14718                 struct wireless_dev *wdev = netdev->ieee80211_ptr;
14719
14720                 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
14721                     nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14722                                       NL80211_ATTR_PAD))
14723                         goto nla_put_failure;
14724         }
14725
14726         if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
14727                 goto nla_put_failure;
14728
14729         if (nl80211_send_chandef(msg, chandef))
14730                 goto nla_put_failure;
14731
14732         genlmsg_end(msg, hdr);
14733
14734         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14735                                 NL80211_MCGRP_MLME, gfp);
14736         return;
14737
14738  nla_put_failure:
14739         genlmsg_cancel(msg, hdr);
14740         nlmsg_free(msg);
14741 }
14742
14743 void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
14744                            u64 cookie, bool acked, gfp_t gfp)
14745 {
14746         struct wireless_dev *wdev = dev->ieee80211_ptr;
14747         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14748         struct sk_buff *msg;
14749         void *hdr;
14750
14751         trace_cfg80211_probe_status(dev, addr, cookie, acked);
14752
14753         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14754
14755         if (!msg)
14756                 return;
14757
14758         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT);
14759         if (!hdr) {
14760                 nlmsg_free(msg);
14761                 return;
14762         }
14763
14764         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14765             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
14766             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
14767             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
14768                               NL80211_ATTR_PAD) ||
14769             (acked && nla_put_flag(msg, NL80211_ATTR_ACK)))
14770                 goto nla_put_failure;
14771
14772         genlmsg_end(msg, hdr);
14773
14774         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14775                                 NL80211_MCGRP_MLME, gfp);
14776         return;
14777
14778  nla_put_failure:
14779         genlmsg_cancel(msg, hdr);
14780         nlmsg_free(msg);
14781 }
14782 EXPORT_SYMBOL(cfg80211_probe_status);
14783
14784 void cfg80211_report_obss_beacon(struct wiphy *wiphy,
14785                                  const u8 *frame, size_t len,
14786                                  int freq, int sig_dbm)
14787 {
14788         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14789         struct sk_buff *msg;
14790         void *hdr;
14791         struct cfg80211_beacon_registration *reg;
14792
14793         trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm);
14794
14795         spin_lock_bh(&rdev->beacon_registrations_lock);
14796         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
14797                 msg = nlmsg_new(len + 100, GFP_ATOMIC);
14798                 if (!msg) {
14799                         spin_unlock_bh(&rdev->beacon_registrations_lock);
14800                         return;
14801                 }
14802
14803                 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
14804                 if (!hdr)
14805                         goto nla_put_failure;
14806
14807                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14808                     (freq &&
14809                      nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq)) ||
14810                     (sig_dbm &&
14811                      nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
14812                     nla_put(msg, NL80211_ATTR_FRAME, len, frame))
14813                         goto nla_put_failure;
14814
14815                 genlmsg_end(msg, hdr);
14816
14817                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid);
14818         }
14819         spin_unlock_bh(&rdev->beacon_registrations_lock);
14820         return;
14821
14822  nla_put_failure:
14823         spin_unlock_bh(&rdev->beacon_registrations_lock);
14824         if (hdr)
14825                 genlmsg_cancel(msg, hdr);
14826         nlmsg_free(msg);
14827 }
14828 EXPORT_SYMBOL(cfg80211_report_obss_beacon);
14829
14830 #ifdef CONFIG_PM
14831 static int cfg80211_net_detect_results(struct sk_buff *msg,
14832                                        struct cfg80211_wowlan_wakeup *wakeup)
14833 {
14834         struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect;
14835         struct nlattr *nl_results, *nl_match, *nl_freqs;
14836         int i, j;
14837
14838         nl_results = nla_nest_start(
14839                 msg, NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS);
14840         if (!nl_results)
14841                 return -EMSGSIZE;
14842
14843         for (i = 0; i < nd->n_matches; i++) {
14844                 struct cfg80211_wowlan_nd_match *match = nd->matches[i];
14845
14846                 nl_match = nla_nest_start(msg, i);
14847                 if (!nl_match)
14848                         break;
14849
14850                 /* The SSID attribute is optional in nl80211, but for
14851                  * simplicity reasons it's always present in the
14852                  * cfg80211 structure.  If a driver can't pass the
14853                  * SSID, that needs to be changed.  A zero length SSID
14854                  * is still a valid SSID (wildcard), so it cannot be
14855                  * used for this purpose.
14856                  */
14857                 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len,
14858                             match->ssid.ssid)) {
14859                         nla_nest_cancel(msg, nl_match);
14860                         goto out;
14861                 }
14862
14863                 if (match->n_channels) {
14864                         nl_freqs = nla_nest_start(
14865                                 msg, NL80211_ATTR_SCAN_FREQUENCIES);
14866                         if (!nl_freqs) {
14867                                 nla_nest_cancel(msg, nl_match);
14868                                 goto out;
14869                         }
14870
14871                         for (j = 0; j < match->n_channels; j++) {
14872                                 if (nla_put_u32(msg, j, match->channels[j])) {
14873                                         nla_nest_cancel(msg, nl_freqs);
14874                                         nla_nest_cancel(msg, nl_match);
14875                                         goto out;
14876                                 }
14877                         }
14878
14879                         nla_nest_end(msg, nl_freqs);
14880                 }
14881
14882                 nla_nest_end(msg, nl_match);
14883         }
14884
14885 out:
14886         nla_nest_end(msg, nl_results);
14887         return 0;
14888 }
14889
14890 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
14891                                    struct cfg80211_wowlan_wakeup *wakeup,
14892                                    gfp_t gfp)
14893 {
14894         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14895         struct sk_buff *msg;
14896         void *hdr;
14897         int size = 200;
14898
14899         trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup);
14900
14901         if (wakeup)
14902                 size += wakeup->packet_present_len;
14903
14904         msg = nlmsg_new(size, gfp);
14905         if (!msg)
14906                 return;
14907
14908         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN);
14909         if (!hdr)
14910                 goto free_msg;
14911
14912         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14913             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14914                               NL80211_ATTR_PAD))
14915                 goto free_msg;
14916
14917         if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
14918                                         wdev->netdev->ifindex))
14919                 goto free_msg;
14920
14921         if (wakeup) {
14922                 struct nlattr *reasons;
14923
14924                 reasons = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
14925                 if (!reasons)
14926                         goto free_msg;
14927
14928                 if (wakeup->disconnect &&
14929                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT))
14930                         goto free_msg;
14931                 if (wakeup->magic_pkt &&
14932                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT))
14933                         goto free_msg;
14934                 if (wakeup->gtk_rekey_failure &&
14935                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE))
14936                         goto free_msg;
14937                 if (wakeup->eap_identity_req &&
14938                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST))
14939                         goto free_msg;
14940                 if (wakeup->four_way_handshake &&
14941                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE))
14942                         goto free_msg;
14943                 if (wakeup->rfkill_release &&
14944                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))
14945                         goto free_msg;
14946
14947                 if (wakeup->pattern_idx >= 0 &&
14948                     nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
14949                                 wakeup->pattern_idx))
14950                         goto free_msg;
14951
14952                 if (wakeup->tcp_match &&
14953                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH))
14954                         goto free_msg;
14955
14956                 if (wakeup->tcp_connlost &&
14957                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST))
14958                         goto free_msg;
14959
14960                 if (wakeup->tcp_nomoretokens &&
14961                     nla_put_flag(msg,
14962                                  NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS))
14963                         goto free_msg;
14964
14965                 if (wakeup->packet) {
14966                         u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211;
14967                         u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN;
14968
14969                         if (!wakeup->packet_80211) {
14970                                 pkt_attr =
14971                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023;
14972                                 len_attr =
14973                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN;
14974                         }
14975
14976                         if (wakeup->packet_len &&
14977                             nla_put_u32(msg, len_attr, wakeup->packet_len))
14978                                 goto free_msg;
14979
14980                         if (nla_put(msg, pkt_attr, wakeup->packet_present_len,
14981                                     wakeup->packet))
14982                                 goto free_msg;
14983                 }
14984
14985                 if (wakeup->net_detect &&
14986                     cfg80211_net_detect_results(msg, wakeup))
14987                                 goto free_msg;
14988
14989                 nla_nest_end(msg, reasons);
14990         }
14991
14992         genlmsg_end(msg, hdr);
14993
14994         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14995                                 NL80211_MCGRP_MLME, gfp);
14996         return;
14997
14998  free_msg:
14999         nlmsg_free(msg);
15000 }
15001 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup);
15002 #endif
15003
15004 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
15005                                 enum nl80211_tdls_operation oper,
15006                                 u16 reason_code, gfp_t gfp)
15007 {
15008         struct wireless_dev *wdev = dev->ieee80211_ptr;
15009         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
15010         struct sk_buff *msg;
15011         void *hdr;
15012
15013         trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper,
15014                                          reason_code);
15015
15016         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15017         if (!msg)
15018                 return;
15019
15020         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER);
15021         if (!hdr) {
15022                 nlmsg_free(msg);
15023                 return;
15024         }
15025
15026         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15027             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
15028             nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) ||
15029             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) ||
15030             (reason_code > 0 &&
15031              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code)))
15032                 goto nla_put_failure;
15033
15034         genlmsg_end(msg, hdr);
15035
15036         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15037                                 NL80211_MCGRP_MLME, gfp);
15038         return;
15039
15040  nla_put_failure:
15041         genlmsg_cancel(msg, hdr);
15042         nlmsg_free(msg);
15043 }
15044 EXPORT_SYMBOL(cfg80211_tdls_oper_request);
15045
15046 static int nl80211_netlink_notify(struct notifier_block * nb,
15047                                   unsigned long state,
15048                                   void *_notify)
15049 {
15050         struct netlink_notify *notify = _notify;
15051         struct cfg80211_registered_device *rdev;
15052         struct wireless_dev *wdev;
15053         struct cfg80211_beacon_registration *reg, *tmp;
15054
15055         if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC)
15056                 return NOTIFY_DONE;
15057
15058         rcu_read_lock();
15059
15060         list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
15061                 struct cfg80211_sched_scan_request *sched_scan_req;
15062
15063                 list_for_each_entry_rcu(sched_scan_req,
15064                                         &rdev->sched_scan_req_list,
15065                                         list) {
15066                         if (sched_scan_req->owner_nlportid == notify->portid) {
15067                                 sched_scan_req->nl_owner_dead = true;
15068                                 schedule_work(&rdev->sched_scan_stop_wk);
15069                         }
15070                 }
15071
15072                 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) {
15073                         cfg80211_mlme_unregister_socket(wdev, notify->portid);
15074
15075                         if (wdev->owner_nlportid == notify->portid) {
15076                                 wdev->nl_owner_dead = true;
15077                                 schedule_work(&rdev->destroy_work);
15078                         } else if (wdev->conn_owner_nlportid == notify->portid) {
15079                                 schedule_work(&wdev->disconnect_wk);
15080                         }
15081                 }
15082
15083                 spin_lock_bh(&rdev->beacon_registrations_lock);
15084                 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations,
15085                                          list) {
15086                         if (reg->nlportid == notify->portid) {
15087                                 list_del(&reg->list);
15088                                 kfree(reg);
15089                                 break;
15090                         }
15091                 }
15092                 spin_unlock_bh(&rdev->beacon_registrations_lock);
15093         }
15094
15095         rcu_read_unlock();
15096
15097         /*
15098          * It is possible that the user space process that is controlling the
15099          * indoor setting disappeared, so notify the regulatory core.
15100          */
15101         regulatory_netlink_notify(notify->portid);
15102         return NOTIFY_OK;
15103 }
15104
15105 static struct notifier_block nl80211_netlink_notifier = {
15106         .notifier_call = nl80211_netlink_notify,
15107 };
15108
15109 void cfg80211_ft_event(struct net_device *netdev,
15110                        struct cfg80211_ft_event_params *ft_event)
15111 {
15112         struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
15113         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15114         struct sk_buff *msg;
15115         void *hdr;
15116
15117         trace_cfg80211_ft_event(wiphy, netdev, ft_event);
15118
15119         if (!ft_event->target_ap)
15120                 return;
15121
15122         msg = nlmsg_new(100 + ft_event->ric_ies_len, GFP_KERNEL);
15123         if (!msg)
15124                 return;
15125
15126         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT);
15127         if (!hdr)
15128                 goto out;
15129
15130         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15131             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
15132             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap))
15133                 goto out;
15134
15135         if (ft_event->ies &&
15136             nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies))
15137                 goto out;
15138         if (ft_event->ric_ies &&
15139             nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len,
15140                     ft_event->ric_ies))
15141                 goto out;
15142
15143         genlmsg_end(msg, hdr);
15144
15145         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15146                                 NL80211_MCGRP_MLME, GFP_KERNEL);
15147         return;
15148  out:
15149         nlmsg_free(msg);
15150 }
15151 EXPORT_SYMBOL(cfg80211_ft_event);
15152
15153 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp)
15154 {
15155         struct cfg80211_registered_device *rdev;
15156         struct sk_buff *msg;
15157         void *hdr;
15158         u32 nlportid;
15159
15160         rdev = wiphy_to_rdev(wdev->wiphy);
15161         if (!rdev->crit_proto_nlportid)
15162                 return;
15163
15164         nlportid = rdev->crit_proto_nlportid;
15165         rdev->crit_proto_nlportid = 0;
15166
15167         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15168         if (!msg)
15169                 return;
15170
15171         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP);
15172         if (!hdr)
15173                 goto nla_put_failure;
15174
15175         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15176             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
15177                               NL80211_ATTR_PAD))
15178                 goto nla_put_failure;
15179
15180         genlmsg_end(msg, hdr);
15181
15182         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
15183         return;
15184
15185  nla_put_failure:
15186         if (hdr)
15187                 genlmsg_cancel(msg, hdr);
15188         nlmsg_free(msg);
15189 }
15190 EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
15191
15192 void nl80211_send_ap_stopped(struct wireless_dev *wdev)
15193 {
15194         struct wiphy *wiphy = wdev->wiphy;
15195         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15196         struct sk_buff *msg;
15197         void *hdr;
15198
15199         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
15200         if (!msg)
15201                 return;
15202
15203         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP);
15204         if (!hdr)
15205                 goto out;
15206
15207         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15208             nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) ||
15209             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
15210                               NL80211_ATTR_PAD))
15211                 goto out;
15212
15213         genlmsg_end(msg, hdr);
15214
15215         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
15216                                 NL80211_MCGRP_MLME, GFP_KERNEL);
15217         return;
15218  out:
15219         nlmsg_free(msg);
15220 }
15221
15222 /* initialisation/exit functions */
15223
15224 int __init nl80211_init(void)
15225 {
15226         int err;
15227
15228         err = genl_register_family(&nl80211_fam);
15229         if (err)
15230                 return err;
15231
15232         err = netlink_register_notifier(&nl80211_netlink_notifier);
15233         if (err)
15234                 goto err_out;
15235
15236         return 0;
15237  err_out:
15238         genl_unregister_family(&nl80211_fam);
15239         return err;
15240 }
15241
15242 void nl80211_exit(void)
15243 {
15244         netlink_unregister_notifier(&nl80211_netlink_notifier);
15245         genl_unregister_family(&nl80211_fam);
15246 }