Merge tag 'mac80211-next-for-davem-2018-02-22' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-block.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/nospec.h>
20 #include <linux/etherdevice.h>
21 #include <net/net_namespace.h>
22 #include <net/genetlink.h>
23 #include <net/cfg80211.h>
24 #include <net/sock.h>
25 #include <net/inet_connection_sock.h>
26 #include "core.h"
27 #include "nl80211.h"
28 #include "reg.h"
29 #include "rdev-ops.h"
30
31 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
32                                    struct genl_info *info,
33                                    struct cfg80211_crypto_settings *settings,
34                                    int cipher_limit);
35
36 /* the netlink family */
37 static struct genl_family nl80211_fam;
38
39 /* multicast groups */
40 enum nl80211_multicast_groups {
41         NL80211_MCGRP_CONFIG,
42         NL80211_MCGRP_SCAN,
43         NL80211_MCGRP_REGULATORY,
44         NL80211_MCGRP_MLME,
45         NL80211_MCGRP_VENDOR,
46         NL80211_MCGRP_NAN,
47         NL80211_MCGRP_TESTMODE /* keep last - ifdef! */
48 };
49
50 static const struct genl_multicast_group nl80211_mcgrps[] = {
51         [NL80211_MCGRP_CONFIG] = { .name = NL80211_MULTICAST_GROUP_CONFIG },
52         [NL80211_MCGRP_SCAN] = { .name = NL80211_MULTICAST_GROUP_SCAN },
53         [NL80211_MCGRP_REGULATORY] = { .name = NL80211_MULTICAST_GROUP_REG },
54         [NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME },
55         [NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR },
56         [NL80211_MCGRP_NAN] = { .name = NL80211_MULTICAST_GROUP_NAN },
57 #ifdef CONFIG_NL80211_TESTMODE
58         [NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE }
59 #endif
60 };
61
62 /* returns ERR_PTR values */
63 static struct wireless_dev *
64 __cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs)
65 {
66         struct cfg80211_registered_device *rdev;
67         struct wireless_dev *result = NULL;
68         bool have_ifidx = attrs[NL80211_ATTR_IFINDEX];
69         bool have_wdev_id = attrs[NL80211_ATTR_WDEV];
70         u64 wdev_id;
71         int wiphy_idx = -1;
72         int ifidx = -1;
73
74         ASSERT_RTNL();
75
76         if (!have_ifidx && !have_wdev_id)
77                 return ERR_PTR(-EINVAL);
78
79         if (have_ifidx)
80                 ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
81         if (have_wdev_id) {
82                 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
83                 wiphy_idx = wdev_id >> 32;
84         }
85
86         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
87                 struct wireless_dev *wdev;
88
89                 if (wiphy_net(&rdev->wiphy) != netns)
90                         continue;
91
92                 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx)
93                         continue;
94
95                 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
96                         if (have_ifidx && wdev->netdev &&
97                             wdev->netdev->ifindex == ifidx) {
98                                 result = wdev;
99                                 break;
100                         }
101                         if (have_wdev_id && wdev->identifier == (u32)wdev_id) {
102                                 result = wdev;
103                                 break;
104                         }
105                 }
106
107                 if (result)
108                         break;
109         }
110
111         if (result)
112                 return result;
113         return ERR_PTR(-ENODEV);
114 }
115
116 static struct cfg80211_registered_device *
117 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs)
118 {
119         struct cfg80211_registered_device *rdev = NULL, *tmp;
120         struct net_device *netdev;
121
122         ASSERT_RTNL();
123
124         if (!attrs[NL80211_ATTR_WIPHY] &&
125             !attrs[NL80211_ATTR_IFINDEX] &&
126             !attrs[NL80211_ATTR_WDEV])
127                 return ERR_PTR(-EINVAL);
128
129         if (attrs[NL80211_ATTR_WIPHY])
130                 rdev = cfg80211_rdev_by_wiphy_idx(
131                                 nla_get_u32(attrs[NL80211_ATTR_WIPHY]));
132
133         if (attrs[NL80211_ATTR_WDEV]) {
134                 u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
135                 struct wireless_dev *wdev;
136                 bool found = false;
137
138                 tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32);
139                 if (tmp) {
140                         /* make sure wdev exists */
141                         list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) {
142                                 if (wdev->identifier != (u32)wdev_id)
143                                         continue;
144                                 found = true;
145                                 break;
146                         }
147
148                         if (!found)
149                                 tmp = NULL;
150
151                         if (rdev && tmp != rdev)
152                                 return ERR_PTR(-EINVAL);
153                         rdev = tmp;
154                 }
155         }
156
157         if (attrs[NL80211_ATTR_IFINDEX]) {
158                 int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
159
160                 netdev = __dev_get_by_index(netns, ifindex);
161                 if (netdev) {
162                         if (netdev->ieee80211_ptr)
163                                 tmp = wiphy_to_rdev(
164                                         netdev->ieee80211_ptr->wiphy);
165                         else
166                                 tmp = NULL;
167
168                         /* not wireless device -- return error */
169                         if (!tmp)
170                                 return ERR_PTR(-EINVAL);
171
172                         /* mismatch -- return error */
173                         if (rdev && tmp != rdev)
174                                 return ERR_PTR(-EINVAL);
175
176                         rdev = tmp;
177                 }
178         }
179
180         if (!rdev)
181                 return ERR_PTR(-ENODEV);
182
183         if (netns != wiphy_net(&rdev->wiphy))
184                 return ERR_PTR(-ENODEV);
185
186         return rdev;
187 }
188
189 /*
190  * This function returns a pointer to the driver
191  * that the genl_info item that is passed refers to.
192  *
193  * The result of this can be a PTR_ERR and hence must
194  * be checked with IS_ERR() for errors.
195  */
196 static struct cfg80211_registered_device *
197 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info)
198 {
199         return __cfg80211_rdev_from_attrs(netns, info->attrs);
200 }
201
202 /* policy for the attributes */
203 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
204         [NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
205         [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
206                                       .len = 20-1 },
207         [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED },
208
209         [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 },
210         [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 },
211         [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 },
212         [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 },
213         [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 },
214
215         [NL80211_ATTR_WIPHY_RETRY_SHORT] = { .type = NLA_U8 },
216         [NL80211_ATTR_WIPHY_RETRY_LONG] = { .type = NLA_U8 },
217         [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 },
218         [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 },
219         [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 },
220         [NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG },
221
222         [NL80211_ATTR_IFTYPE] = { .type = NLA_U32 },
223         [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
224         [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
225
226         [NL80211_ATTR_MAC] = { .len = ETH_ALEN },
227         [NL80211_ATTR_PREV_BSSID] = { .len = ETH_ALEN },
228
229         [NL80211_ATTR_KEY] = { .type = NLA_NESTED, },
230         [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
231                                     .len = WLAN_MAX_KEY_LEN },
232         [NL80211_ATTR_KEY_IDX] = { .type = NLA_U8 },
233         [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 },
234         [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG },
235         [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
236         [NL80211_ATTR_KEY_TYPE] = { .type = NLA_U32 },
237
238         [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 },
239         [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 },
240         [NL80211_ATTR_BEACON_HEAD] = { .type = NLA_BINARY,
241                                        .len = IEEE80211_MAX_DATA_LEN },
242         [NL80211_ATTR_BEACON_TAIL] = { .type = NLA_BINARY,
243                                        .len = IEEE80211_MAX_DATA_LEN },
244         [NL80211_ATTR_STA_AID] = { .type = NLA_U16 },
245         [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED },
246         [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 },
247         [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY,
248                                                .len = NL80211_MAX_SUPP_RATES },
249         [NL80211_ATTR_STA_PLINK_ACTION] = { .type = NLA_U8 },
250         [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 },
251         [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
252         [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
253                                    .len = IEEE80211_MAX_MESH_ID_LEN },
254         [NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 },
255
256         [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 },
257         [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
258
259         [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
260         [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
261         [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
262         [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY,
263                                            .len = NL80211_MAX_SUPP_RATES },
264         [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 },
265
266         [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED },
267         [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG },
268
269         [NL80211_ATTR_HT_CAPABILITY] = { .len = NL80211_HT_CAPABILITY_LEN },
270
271         [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
272         [NL80211_ATTR_IE] = { .type = NLA_BINARY,
273                               .len = IEEE80211_MAX_DATA_LEN },
274         [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
275         [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
276
277         [NL80211_ATTR_SSID] = { .type = NLA_BINARY,
278                                 .len = IEEE80211_MAX_SSID_LEN },
279         [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
280         [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
281         [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
282         [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
283         [NL80211_ATTR_USE_MFP] = { .type = NLA_U32 },
284         [NL80211_ATTR_STA_FLAGS2] = {
285                 .len = sizeof(struct nl80211_sta_flag_update),
286         },
287         [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
288         [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 },
289         [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG },
290         [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG },
291         [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 },
292         [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 },
293         [NL80211_ATTR_PID] = { .type = NLA_U32 },
294         [NL80211_ATTR_4ADDR] = { .type = NLA_U8 },
295         [NL80211_ATTR_PMKID] = { .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_LOCAL_MESH_POWER_MODE] = {. type = NLA_U32 },
352         [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 },
353         [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
354         [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
355         [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, },
356         [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, },
357         [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG },
358         [NL80211_ATTR_VHT_CAPABILITY_MASK] = {
359                 .len = NL80211_VHT_CAPABILITY_LEN,
360         },
361         [NL80211_ATTR_MDID] = { .type = NLA_U16 },
362         [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
363                                   .len = IEEE80211_MAX_DATA_LEN },
364         [NL80211_ATTR_PEER_AID] = { .type = NLA_U16 },
365         [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 },
366         [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG },
367         [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
368         [NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_BINARY },
369         [NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_BINARY },
370         [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY },
371         [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY },
372         [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG },
373         [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 },
374         [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 },
375         [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 },
376         [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
377         [NL80211_ATTR_QOS_MAP] = { .type = NLA_BINARY,
378                                    .len = IEEE80211_QOS_MAP_LEN_MAX },
379         [NL80211_ATTR_MAC_HINT] = { .len = ETH_ALEN },
380         [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 },
381         [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 },
382         [NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG },
383         [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY },
384         [NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG },
385         [NL80211_ATTR_TSID] = { .type = NLA_U8 },
386         [NL80211_ATTR_USER_PRIO] = { .type = NLA_U8 },
387         [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 },
388         [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 },
389         [NL80211_ATTR_MAC_MASK] = { .len = ETH_ALEN },
390         [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG },
391         [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 },
392         [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 },
393         [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG },
394         [NL80211_ATTR_PBSS] = { .type = NLA_FLAG },
395         [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED },
396         [NL80211_ATTR_STA_SUPPORT_P2P_PS] = { .type = NLA_U8 },
397         [NL80211_ATTR_MU_MIMO_GROUP_DATA] = {
398                 .len = VHT_MUMIMO_GROUPS_DATA_LEN
399         },
400         [NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = { .len = ETH_ALEN },
401         [NL80211_ATTR_NAN_MASTER_PREF] = { .type = NLA_U8 },
402         [NL80211_ATTR_BANDS] = { .type = NLA_U32 },
403         [NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED },
404         [NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY,
405                                     .len = FILS_MAX_KEK_LEN },
406         [NL80211_ATTR_FILS_NONCES] = { .len = 2 * FILS_NONCE_LEN },
407         [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, },
408         [NL80211_ATTR_BSSID] = { .len = ETH_ALEN },
409         [NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 },
410         [NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = {
411                 .len = sizeof(struct nl80211_bss_select_rssi_adjust)
412         },
413         [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 },
414         [NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY,
415                                              .len = FILS_ERP_MAX_USERNAME_LEN },
416         [NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY,
417                                           .len = FILS_ERP_MAX_REALM_LEN },
418         [NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 },
419         [NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY,
420                                         .len = FILS_ERP_MAX_RRK_LEN },
421         [NL80211_ATTR_FILS_CACHE_ID] = { .len = 2 },
422         [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN },
423         [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG },
424         [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG },
425 };
426
427 /* policy for the key attributes */
428 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
429         [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
430         [NL80211_KEY_IDX] = { .type = NLA_U8 },
431         [NL80211_KEY_CIPHER] = { .type = NLA_U32 },
432         [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
433         [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG },
434         [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG },
435         [NL80211_KEY_TYPE] = { .type = NLA_U32 },
436         [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
437 };
438
439 /* policy for the key default flags */
440 static const struct nla_policy
441 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = {
442         [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG },
443         [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG },
444 };
445
446 #ifdef CONFIG_PM
447 /* policy for WoWLAN attributes */
448 static const struct nla_policy
449 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = {
450         [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG },
451         [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG },
452         [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG },
453         [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED },
454         [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG },
455         [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG },
456         [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG },
457         [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG },
458         [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED },
459         [NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED },
460 };
461
462 static const struct nla_policy
463 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = {
464         [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 },
465         [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 },
466         [NL80211_WOWLAN_TCP_DST_MAC] = { .len = ETH_ALEN },
467         [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 },
468         [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 },
469         [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = { .len = 1 },
470         [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = {
471                 .len = sizeof(struct nl80211_wowlan_tcp_data_seq)
472         },
473         [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = {
474                 .len = sizeof(struct nl80211_wowlan_tcp_data_token)
475         },
476         [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 },
477         [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = { .len = 1 },
478         [NL80211_WOWLAN_TCP_WAKE_MASK] = { .len = 1 },
479 };
480 #endif /* CONFIG_PM */
481
482 /* policy for coalesce rule attributes */
483 static const struct nla_policy
484 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = {
485         [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 },
486         [NL80211_ATTR_COALESCE_RULE_CONDITION] = { .type = NLA_U32 },
487         [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED },
488 };
489
490 /* policy for GTK rekey offload attributes */
491 static const struct nla_policy
492 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
493         [NL80211_REKEY_DATA_KEK] = { .len = NL80211_KEK_LEN },
494         [NL80211_REKEY_DATA_KCK] = { .len = NL80211_KCK_LEN },
495         [NL80211_REKEY_DATA_REPLAY_CTR] = { .len = NL80211_REPLAY_CTR_LEN },
496 };
497
498 static const struct nla_policy
499 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = {
500         [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY,
501                                                  .len = IEEE80211_MAX_SSID_LEN },
502         [NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = { .len = ETH_ALEN },
503         [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 },
504 };
505
506 static const struct nla_policy
507 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = {
508         [NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 },
509         [NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 },
510 };
511
512 static const struct nla_policy
513 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = {
514         [NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG },
515         [NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 },
516         [NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = {
517                 .len = sizeof(struct nl80211_bss_select_rssi_adjust)
518         },
519 };
520
521 /* policy for NAN function attributes */
522 static const struct nla_policy
523 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = {
524         [NL80211_NAN_FUNC_TYPE] = { .type = NLA_U8 },
525         [NL80211_NAN_FUNC_SERVICE_ID] = {
526                                     .len = NL80211_NAN_FUNC_SERVICE_ID_LEN },
527         [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 },
528         [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG },
529         [NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG },
530         [NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 },
531         [NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 },
532         [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = { .len = ETH_ALEN },
533         [NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG },
534         [NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 },
535         [NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY,
536                         .len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN },
537         [NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED },
538         [NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED },
539         [NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED },
540         [NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 },
541         [NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 },
542 };
543
544 /* policy for Service Response Filter attributes */
545 static const struct nla_policy
546 nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = {
547         [NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG },
548         [NL80211_NAN_SRF_BF] = { .type = NLA_BINARY,
549                                  .len =  NL80211_NAN_FUNC_SRF_MAX_LEN },
550         [NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 },
551         [NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED },
552 };
553
554 /* policy for packet pattern attributes */
555 static const struct nla_policy
556 nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = {
557         [NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, },
558         [NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, },
559         [NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 },
560 };
561
562 static int nl80211_prepare_wdev_dump(struct sk_buff *skb,
563                                      struct netlink_callback *cb,
564                                      struct cfg80211_registered_device **rdev,
565                                      struct wireless_dev **wdev)
566 {
567         int err;
568
569         if (!cb->args[0]) {
570                 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
571                                   genl_family_attrbuf(&nl80211_fam),
572                                   nl80211_fam.maxattr, nl80211_policy, NULL);
573                 if (err)
574                         return err;
575
576                 *wdev = __cfg80211_wdev_from_attrs(
577                                         sock_net(skb->sk),
578                                         genl_family_attrbuf(&nl80211_fam));
579                 if (IS_ERR(*wdev))
580                         return PTR_ERR(*wdev);
581                 *rdev = wiphy_to_rdev((*wdev)->wiphy);
582                 /* 0 is the first index - add 1 to parse only once */
583                 cb->args[0] = (*rdev)->wiphy_idx + 1;
584                 cb->args[1] = (*wdev)->identifier;
585         } else {
586                 /* subtract the 1 again here */
587                 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
588                 struct wireless_dev *tmp;
589
590                 if (!wiphy)
591                         return -ENODEV;
592                 *rdev = wiphy_to_rdev(wiphy);
593                 *wdev = NULL;
594
595                 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) {
596                         if (tmp->identifier == cb->args[1]) {
597                                 *wdev = tmp;
598                                 break;
599                         }
600                 }
601
602                 if (!*wdev)
603                         return -ENODEV;
604         }
605
606         return 0;
607 }
608
609 /* IE validation */
610 static bool is_valid_ie_attr(const struct nlattr *attr)
611 {
612         const u8 *pos;
613         int len;
614
615         if (!attr)
616                 return true;
617
618         pos = nla_data(attr);
619         len = nla_len(attr);
620
621         while (len) {
622                 u8 elemlen;
623
624                 if (len < 2)
625                         return false;
626                 len -= 2;
627
628                 elemlen = pos[1];
629                 if (elemlen > len)
630                         return false;
631
632                 len -= elemlen;
633                 pos += 2 + elemlen;
634         }
635
636         return true;
637 }
638
639 /* message building helper */
640 static inline void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
641                                    int flags, u8 cmd)
642 {
643         /* since there is no private header just add the generic one */
644         return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd);
645 }
646
647 static int nl80211_msg_put_channel(struct sk_buff *msg,
648                                    struct ieee80211_channel *chan,
649                                    bool large)
650 {
651         /* Some channels must be completely excluded from the
652          * list to protect old user-space tools from breaking
653          */
654         if (!large && chan->flags &
655             (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ))
656                 return 0;
657
658         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ,
659                         chan->center_freq))
660                 goto nla_put_failure;
661
662         if ((chan->flags & IEEE80211_CHAN_DISABLED) &&
663             nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED))
664                 goto nla_put_failure;
665         if (chan->flags & IEEE80211_CHAN_NO_IR) {
666                 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR))
667                         goto nla_put_failure;
668                 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS))
669                         goto nla_put_failure;
670         }
671         if (chan->flags & IEEE80211_CHAN_RADAR) {
672                 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
673                         goto nla_put_failure;
674                 if (large) {
675                         u32 time;
676
677                         time = elapsed_jiffies_msecs(chan->dfs_state_entered);
678
679                         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE,
680                                         chan->dfs_state))
681                                 goto nla_put_failure;
682                         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME,
683                                         time))
684                                 goto nla_put_failure;
685                         if (nla_put_u32(msg,
686                                         NL80211_FREQUENCY_ATTR_DFS_CAC_TIME,
687                                         chan->dfs_cac_ms))
688                                 goto nla_put_failure;
689                 }
690         }
691
692         if (large) {
693                 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
694                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
695                         goto nla_put_failure;
696                 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) &&
697                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS))
698                         goto nla_put_failure;
699                 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) &&
700                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ))
701                         goto nla_put_failure;
702                 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) &&
703                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ))
704                         goto nla_put_failure;
705                 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) &&
706                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY))
707                         goto nla_put_failure;
708                 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) &&
709                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT))
710                         goto nla_put_failure;
711                 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) &&
712                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ))
713                         goto nla_put_failure;
714                 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) &&
715                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ))
716                         goto nla_put_failure;
717         }
718
719         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
720                         DBM_TO_MBM(chan->max_power)))
721                 goto nla_put_failure;
722
723         return 0;
724
725  nla_put_failure:
726         return -ENOBUFS;
727 }
728
729 /* netlink command implementations */
730
731 struct key_parse {
732         struct key_params p;
733         int idx;
734         int type;
735         bool def, defmgmt;
736         bool def_uni, def_multi;
737 };
738
739 static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key,
740                                  struct key_parse *k)
741 {
742         struct nlattr *tb[NL80211_KEY_MAX + 1];
743         int err = nla_parse_nested(tb, NL80211_KEY_MAX, key,
744                                    nl80211_key_policy, info->extack);
745         if (err)
746                 return err;
747
748         k->def = !!tb[NL80211_KEY_DEFAULT];
749         k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT];
750
751         if (k->def) {
752                 k->def_uni = true;
753                 k->def_multi = true;
754         }
755         if (k->defmgmt)
756                 k->def_multi = true;
757
758         if (tb[NL80211_KEY_IDX])
759                 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]);
760
761         if (tb[NL80211_KEY_DATA]) {
762                 k->p.key = nla_data(tb[NL80211_KEY_DATA]);
763                 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]);
764         }
765
766         if (tb[NL80211_KEY_SEQ]) {
767                 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]);
768                 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]);
769         }
770
771         if (tb[NL80211_KEY_CIPHER])
772                 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]);
773
774         if (tb[NL80211_KEY_TYPE]) {
775                 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]);
776                 if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
777                         return genl_err_attr(info, -EINVAL,
778                                              tb[NL80211_KEY_TYPE]);
779         }
780
781         if (tb[NL80211_KEY_DEFAULT_TYPES]) {
782                 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
783
784                 err = nla_parse_nested(kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
785                                        tb[NL80211_KEY_DEFAULT_TYPES],
786                                        nl80211_key_default_policy,
787                                        info->extack);
788                 if (err)
789                         return err;
790
791                 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
792                 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
793         }
794
795         return 0;
796 }
797
798 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
799 {
800         if (info->attrs[NL80211_ATTR_KEY_DATA]) {
801                 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
802                 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
803         }
804
805         if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
806                 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
807                 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
808         }
809
810         if (info->attrs[NL80211_ATTR_KEY_IDX])
811                 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
812
813         if (info->attrs[NL80211_ATTR_KEY_CIPHER])
814                 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
815
816         k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
817         k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
818
819         if (k->def) {
820                 k->def_uni = true;
821                 k->def_multi = true;
822         }
823         if (k->defmgmt)
824                 k->def_multi = true;
825
826         if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
827                 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
828                 if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES) {
829                         GENL_SET_ERR_MSG(info, "key type out of range");
830                         return -EINVAL;
831                 }
832         }
833
834         if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
835                 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
836                 int err = nla_parse_nested(kdt,
837                                            NUM_NL80211_KEY_DEFAULT_TYPES - 1,
838                                            info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
839                                            nl80211_key_default_policy,
840                                            info->extack);
841                 if (err)
842                         return err;
843
844                 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
845                 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
846         }
847
848         return 0;
849 }
850
851 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
852 {
853         int err;
854
855         memset(k, 0, sizeof(*k));
856         k->idx = -1;
857         k->type = -1;
858
859         if (info->attrs[NL80211_ATTR_KEY])
860                 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k);
861         else
862                 err = nl80211_parse_key_old(info, k);
863
864         if (err)
865                 return err;
866
867         if (k->def && k->defmgmt) {
868                 GENL_SET_ERR_MSG(info, "key with def && defmgmt is invalid");
869                 return -EINVAL;
870         }
871
872         if (k->defmgmt) {
873                 if (k->def_uni || !k->def_multi) {
874                         GENL_SET_ERR_MSG(info, "defmgmt key must be mcast");
875                         return -EINVAL;
876                 }
877         }
878
879         if (k->idx != -1) {
880                 if (k->defmgmt) {
881                         if (k->idx < 4 || k->idx > 5) {
882                                 GENL_SET_ERR_MSG(info,
883                                                  "defmgmt key idx not 4 or 5");
884                                 return -EINVAL;
885                         }
886                 } else if (k->def) {
887                         if (k->idx < 0 || k->idx > 3) {
888                                 GENL_SET_ERR_MSG(info, "def key idx not 0-3");
889                                 return -EINVAL;
890                         }
891                 } else {
892                         if (k->idx < 0 || k->idx > 5) {
893                                 GENL_SET_ERR_MSG(info, "key idx not 0-5");
894                                 return -EINVAL;
895                         }
896                 }
897         }
898
899         return 0;
900 }
901
902 static struct cfg80211_cached_keys *
903 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
904                        struct genl_info *info, bool *no_ht)
905 {
906         struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS];
907         struct key_parse parse;
908         struct nlattr *key;
909         struct cfg80211_cached_keys *result;
910         int rem, err, def = 0;
911         bool have_key = false;
912
913         nla_for_each_nested(key, keys, rem) {
914                 have_key = true;
915                 break;
916         }
917
918         if (!have_key)
919                 return NULL;
920
921         result = kzalloc(sizeof(*result), GFP_KERNEL);
922         if (!result)
923                 return ERR_PTR(-ENOMEM);
924
925         result->def = -1;
926
927         nla_for_each_nested(key, keys, rem) {
928                 memset(&parse, 0, sizeof(parse));
929                 parse.idx = -1;
930
931                 err = nl80211_parse_key_new(info, key, &parse);
932                 if (err)
933                         goto error;
934                 err = -EINVAL;
935                 if (!parse.p.key)
936                         goto error;
937                 if (parse.idx < 0 || parse.idx > 3) {
938                         GENL_SET_ERR_MSG(info, "key index out of range [0-3]");
939                         goto error;
940                 }
941                 if (parse.def) {
942                         if (def) {
943                                 GENL_SET_ERR_MSG(info,
944                                                  "only one key can be default");
945                                 goto error;
946                         }
947                         def = 1;
948                         result->def = parse.idx;
949                         if (!parse.def_uni || !parse.def_multi)
950                                 goto error;
951                 } else if (parse.defmgmt)
952                         goto error;
953                 err = cfg80211_validate_key_settings(rdev, &parse.p,
954                                                      parse.idx, false, NULL);
955                 if (err)
956                         goto error;
957                 if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 &&
958                     parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) {
959                         GENL_SET_ERR_MSG(info, "connect key must be WEP");
960                         err = -EINVAL;
961                         goto error;
962                 }
963                 result->params[parse.idx].cipher = parse.p.cipher;
964                 result->params[parse.idx].key_len = parse.p.key_len;
965                 result->params[parse.idx].key = result->data[parse.idx];
966                 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len);
967
968                 /* must be WEP key if we got here */
969                 if (no_ht)
970                         *no_ht = true;
971         }
972
973         if (result->def < 0) {
974                 err = -EINVAL;
975                 GENL_SET_ERR_MSG(info, "need a default/TX key");
976                 goto error;
977         }
978
979         return result;
980  error:
981         kfree(result);
982         return ERR_PTR(err);
983 }
984
985 static int nl80211_key_allowed(struct wireless_dev *wdev)
986 {
987         ASSERT_WDEV_LOCK(wdev);
988
989         switch (wdev->iftype) {
990         case NL80211_IFTYPE_AP:
991         case NL80211_IFTYPE_AP_VLAN:
992         case NL80211_IFTYPE_P2P_GO:
993         case NL80211_IFTYPE_MESH_POINT:
994                 break;
995         case NL80211_IFTYPE_ADHOC:
996         case NL80211_IFTYPE_STATION:
997         case NL80211_IFTYPE_P2P_CLIENT:
998                 if (!wdev->current_bss)
999                         return -ENOLINK;
1000                 break;
1001         case NL80211_IFTYPE_UNSPECIFIED:
1002         case NL80211_IFTYPE_OCB:
1003         case NL80211_IFTYPE_MONITOR:
1004         case NL80211_IFTYPE_NAN:
1005         case NL80211_IFTYPE_P2P_DEVICE:
1006         case NL80211_IFTYPE_WDS:
1007         case NUM_NL80211_IFTYPES:
1008                 return -EINVAL;
1009         }
1010
1011         return 0;
1012 }
1013
1014 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy,
1015                                                         struct nlattr *tb)
1016 {
1017         struct ieee80211_channel *chan;
1018
1019         if (tb == NULL)
1020                 return NULL;
1021         chan = ieee80211_get_channel(wiphy, nla_get_u32(tb));
1022         if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
1023                 return NULL;
1024         return chan;
1025 }
1026
1027 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
1028 {
1029         struct nlattr *nl_modes = nla_nest_start(msg, attr);
1030         int i;
1031
1032         if (!nl_modes)
1033                 goto nla_put_failure;
1034
1035         i = 0;
1036         while (ifmodes) {
1037                 if ((ifmodes & 1) && nla_put_flag(msg, i))
1038                         goto nla_put_failure;
1039                 ifmodes >>= 1;
1040                 i++;
1041         }
1042
1043         nla_nest_end(msg, nl_modes);
1044         return 0;
1045
1046 nla_put_failure:
1047         return -ENOBUFS;
1048 }
1049
1050 static int nl80211_put_iface_combinations(struct wiphy *wiphy,
1051                                           struct sk_buff *msg,
1052                                           bool large)
1053 {
1054         struct nlattr *nl_combis;
1055         int i, j;
1056
1057         nl_combis = nla_nest_start(msg,
1058                                 NL80211_ATTR_INTERFACE_COMBINATIONS);
1059         if (!nl_combis)
1060                 goto nla_put_failure;
1061
1062         for (i = 0; i < wiphy->n_iface_combinations; i++) {
1063                 const struct ieee80211_iface_combination *c;
1064                 struct nlattr *nl_combi, *nl_limits;
1065
1066                 c = &wiphy->iface_combinations[i];
1067
1068                 nl_combi = nla_nest_start(msg, i + 1);
1069                 if (!nl_combi)
1070                         goto nla_put_failure;
1071
1072                 nl_limits = nla_nest_start(msg, NL80211_IFACE_COMB_LIMITS);
1073                 if (!nl_limits)
1074                         goto nla_put_failure;
1075
1076                 for (j = 0; j < c->n_limits; j++) {
1077                         struct nlattr *nl_limit;
1078
1079                         nl_limit = nla_nest_start(msg, j + 1);
1080                         if (!nl_limit)
1081                                 goto nla_put_failure;
1082                         if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX,
1083                                         c->limits[j].max))
1084                                 goto nla_put_failure;
1085                         if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
1086                                                 c->limits[j].types))
1087                                 goto nla_put_failure;
1088                         nla_nest_end(msg, nl_limit);
1089                 }
1090
1091                 nla_nest_end(msg, nl_limits);
1092
1093                 if (c->beacon_int_infra_match &&
1094                     nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
1095                         goto nla_put_failure;
1096                 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
1097                                 c->num_different_channels) ||
1098                     nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
1099                                 c->max_interfaces))
1100                         goto nla_put_failure;
1101                 if (large &&
1102                     (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
1103                                 c->radar_detect_widths) ||
1104                      nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
1105                                 c->radar_detect_regions)))
1106                         goto nla_put_failure;
1107                 if (c->beacon_int_min_gcd &&
1108                     nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD,
1109                                 c->beacon_int_min_gcd))
1110                         goto nla_put_failure;
1111
1112                 nla_nest_end(msg, nl_combi);
1113         }
1114
1115         nla_nest_end(msg, nl_combis);
1116
1117         return 0;
1118 nla_put_failure:
1119         return -ENOBUFS;
1120 }
1121
1122 #ifdef CONFIG_PM
1123 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev,
1124                                         struct sk_buff *msg)
1125 {
1126         const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp;
1127         struct nlattr *nl_tcp;
1128
1129         if (!tcp)
1130                 return 0;
1131
1132         nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
1133         if (!nl_tcp)
1134                 return -ENOBUFS;
1135
1136         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
1137                         tcp->data_payload_max))
1138                 return -ENOBUFS;
1139
1140         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
1141                         tcp->data_payload_max))
1142                 return -ENOBUFS;
1143
1144         if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ))
1145                 return -ENOBUFS;
1146
1147         if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
1148                                 sizeof(*tcp->tok), tcp->tok))
1149                 return -ENOBUFS;
1150
1151         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
1152                         tcp->data_interval_max))
1153                 return -ENOBUFS;
1154
1155         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
1156                         tcp->wake_payload_max))
1157                 return -ENOBUFS;
1158
1159         nla_nest_end(msg, nl_tcp);
1160         return 0;
1161 }
1162
1163 static int nl80211_send_wowlan(struct sk_buff *msg,
1164                                struct cfg80211_registered_device *rdev,
1165                                bool large)
1166 {
1167         struct nlattr *nl_wowlan;
1168
1169         if (!rdev->wiphy.wowlan)
1170                 return 0;
1171
1172         nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED);
1173         if (!nl_wowlan)
1174                 return -ENOBUFS;
1175
1176         if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) &&
1177              nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
1178             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) &&
1179              nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
1180             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) &&
1181              nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
1182             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) &&
1183              nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) ||
1184             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
1185              nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
1186             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) &&
1187              nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
1188             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) &&
1189              nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
1190             ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) &&
1191              nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
1192                 return -ENOBUFS;
1193
1194         if (rdev->wiphy.wowlan->n_patterns) {
1195                 struct nl80211_pattern_support pat = {
1196                         .max_patterns = rdev->wiphy.wowlan->n_patterns,
1197                         .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len,
1198                         .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len,
1199                         .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset,
1200                 };
1201
1202                 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
1203                             sizeof(pat), &pat))
1204                         return -ENOBUFS;
1205         }
1206
1207         if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) &&
1208             nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT,
1209                         rdev->wiphy.wowlan->max_nd_match_sets))
1210                 return -ENOBUFS;
1211
1212         if (large && nl80211_send_wowlan_tcp_caps(rdev, msg))
1213                 return -ENOBUFS;
1214
1215         nla_nest_end(msg, nl_wowlan);
1216
1217         return 0;
1218 }
1219 #endif
1220
1221 static int nl80211_send_coalesce(struct sk_buff *msg,
1222                                  struct cfg80211_registered_device *rdev)
1223 {
1224         struct nl80211_coalesce_rule_support rule;
1225
1226         if (!rdev->wiphy.coalesce)
1227                 return 0;
1228
1229         rule.max_rules = rdev->wiphy.coalesce->n_rules;
1230         rule.max_delay = rdev->wiphy.coalesce->max_delay;
1231         rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns;
1232         rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len;
1233         rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len;
1234         rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset;
1235
1236         if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule))
1237                 return -ENOBUFS;
1238
1239         return 0;
1240 }
1241
1242 static int nl80211_send_band_rateinfo(struct sk_buff *msg,
1243                                       struct ieee80211_supported_band *sband)
1244 {
1245         struct nlattr *nl_rates, *nl_rate;
1246         struct ieee80211_rate *rate;
1247         int i;
1248
1249         /* add HT info */
1250         if (sband->ht_cap.ht_supported &&
1251             (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET,
1252                      sizeof(sband->ht_cap.mcs),
1253                      &sband->ht_cap.mcs) ||
1254              nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA,
1255                          sband->ht_cap.cap) ||
1256              nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
1257                         sband->ht_cap.ampdu_factor) ||
1258              nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
1259                         sband->ht_cap.ampdu_density)))
1260                 return -ENOBUFS;
1261
1262         /* add VHT info */
1263         if (sband->vht_cap.vht_supported &&
1264             (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET,
1265                      sizeof(sband->vht_cap.vht_mcs),
1266                      &sband->vht_cap.vht_mcs) ||
1267              nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA,
1268                          sband->vht_cap.cap)))
1269                 return -ENOBUFS;
1270
1271         /* add bitrates */
1272         nl_rates = nla_nest_start(msg, NL80211_BAND_ATTR_RATES);
1273         if (!nl_rates)
1274                 return -ENOBUFS;
1275
1276         for (i = 0; i < sband->n_bitrates; i++) {
1277                 nl_rate = nla_nest_start(msg, i);
1278                 if (!nl_rate)
1279                         return -ENOBUFS;
1280
1281                 rate = &sband->bitrates[i];
1282                 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE,
1283                                 rate->bitrate))
1284                         return -ENOBUFS;
1285                 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) &&
1286                     nla_put_flag(msg,
1287                                  NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE))
1288                         return -ENOBUFS;
1289
1290                 nla_nest_end(msg, nl_rate);
1291         }
1292
1293         nla_nest_end(msg, nl_rates);
1294
1295         return 0;
1296 }
1297
1298 static int
1299 nl80211_send_mgmt_stypes(struct sk_buff *msg,
1300                          const struct ieee80211_txrx_stypes *mgmt_stypes)
1301 {
1302         u16 stypes;
1303         struct nlattr *nl_ftypes, *nl_ifs;
1304         enum nl80211_iftype ift;
1305         int i;
1306
1307         if (!mgmt_stypes)
1308                 return 0;
1309
1310         nl_ifs = nla_nest_start(msg, NL80211_ATTR_TX_FRAME_TYPES);
1311         if (!nl_ifs)
1312                 return -ENOBUFS;
1313
1314         for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1315                 nl_ftypes = nla_nest_start(msg, ift);
1316                 if (!nl_ftypes)
1317                         return -ENOBUFS;
1318                 i = 0;
1319                 stypes = mgmt_stypes[ift].tx;
1320                 while (stypes) {
1321                         if ((stypes & 1) &&
1322                             nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1323                                         (i << 4) | IEEE80211_FTYPE_MGMT))
1324                                 return -ENOBUFS;
1325                         stypes >>= 1;
1326                         i++;
1327                 }
1328                 nla_nest_end(msg, nl_ftypes);
1329         }
1330
1331         nla_nest_end(msg, nl_ifs);
1332
1333         nl_ifs = nla_nest_start(msg, NL80211_ATTR_RX_FRAME_TYPES);
1334         if (!nl_ifs)
1335                 return -ENOBUFS;
1336
1337         for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1338                 nl_ftypes = nla_nest_start(msg, ift);
1339                 if (!nl_ftypes)
1340                         return -ENOBUFS;
1341                 i = 0;
1342                 stypes = mgmt_stypes[ift].rx;
1343                 while (stypes) {
1344                         if ((stypes & 1) &&
1345                             nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1346                                         (i << 4) | IEEE80211_FTYPE_MGMT))
1347                                 return -ENOBUFS;
1348                         stypes >>= 1;
1349                         i++;
1350                 }
1351                 nla_nest_end(msg, nl_ftypes);
1352         }
1353         nla_nest_end(msg, nl_ifs);
1354
1355         return 0;
1356 }
1357
1358 #define CMD(op, n)                                                      \
1359          do {                                                           \
1360                 if (rdev->ops->op) {                                    \
1361                         i++;                                            \
1362                         if (nla_put_u32(msg, i, NL80211_CMD_ ## n))     \
1363                                 goto nla_put_failure;                   \
1364                 }                                                       \
1365         } while (0)
1366
1367 static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev,
1368                                         struct sk_buff *msg)
1369 {
1370         int i = 0;
1371
1372         /*
1373          * do *NOT* add anything into this function, new things need to be
1374          * advertised only to new versions of userspace that can deal with
1375          * the split (and they can't possibly care about new features...
1376          */
1377         CMD(add_virtual_intf, NEW_INTERFACE);
1378         CMD(change_virtual_intf, SET_INTERFACE);
1379         CMD(add_key, NEW_KEY);
1380         CMD(start_ap, START_AP);
1381         CMD(add_station, NEW_STATION);
1382         CMD(add_mpath, NEW_MPATH);
1383         CMD(update_mesh_config, SET_MESH_CONFIG);
1384         CMD(change_bss, SET_BSS);
1385         CMD(auth, AUTHENTICATE);
1386         CMD(assoc, ASSOCIATE);
1387         CMD(deauth, DEAUTHENTICATE);
1388         CMD(disassoc, DISASSOCIATE);
1389         CMD(join_ibss, JOIN_IBSS);
1390         CMD(join_mesh, JOIN_MESH);
1391         CMD(set_pmksa, SET_PMKSA);
1392         CMD(del_pmksa, DEL_PMKSA);
1393         CMD(flush_pmksa, FLUSH_PMKSA);
1394         if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)
1395                 CMD(remain_on_channel, REMAIN_ON_CHANNEL);
1396         CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
1397         CMD(mgmt_tx, FRAME);
1398         CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL);
1399         if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) {
1400                 i++;
1401                 if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS))
1402                         goto nla_put_failure;
1403         }
1404         if (rdev->ops->set_monitor_channel || rdev->ops->start_ap ||
1405             rdev->ops->join_mesh) {
1406                 i++;
1407                 if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL))
1408                         goto nla_put_failure;
1409         }
1410         CMD(set_wds_peer, SET_WDS_PEER);
1411         if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) {
1412                 CMD(tdls_mgmt, TDLS_MGMT);
1413                 CMD(tdls_oper, TDLS_OPER);
1414         }
1415         if (rdev->wiphy.max_sched_scan_reqs)
1416                 CMD(sched_scan_start, START_SCHED_SCAN);
1417         CMD(probe_client, PROBE_CLIENT);
1418         CMD(set_noack_map, SET_NOACK_MAP);
1419         if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) {
1420                 i++;
1421                 if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS))
1422                         goto nla_put_failure;
1423         }
1424         CMD(start_p2p_device, START_P2P_DEVICE);
1425         CMD(set_mcast_rate, SET_MCAST_RATE);
1426 #ifdef CONFIG_NL80211_TESTMODE
1427         CMD(testmode_cmd, TESTMODE);
1428 #endif
1429
1430         if (rdev->ops->connect || rdev->ops->auth) {
1431                 i++;
1432                 if (nla_put_u32(msg, i, NL80211_CMD_CONNECT))
1433                         goto nla_put_failure;
1434         }
1435
1436         if (rdev->ops->disconnect || rdev->ops->deauth) {
1437                 i++;
1438                 if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT))
1439                         goto nla_put_failure;
1440         }
1441
1442         return i;
1443  nla_put_failure:
1444         return -ENOBUFS;
1445 }
1446
1447 struct nl80211_dump_wiphy_state {
1448         s64 filter_wiphy;
1449         long start;
1450         long split_start, band_start, chan_start, capa_start;
1451         bool split;
1452 };
1453
1454 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
1455                               enum nl80211_commands cmd,
1456                               struct sk_buff *msg, u32 portid, u32 seq,
1457                               int flags, struct nl80211_dump_wiphy_state *state)
1458 {
1459         void *hdr;
1460         struct nlattr *nl_bands, *nl_band;
1461         struct nlattr *nl_freqs, *nl_freq;
1462         struct nlattr *nl_cmds;
1463         enum nl80211_band band;
1464         struct ieee80211_channel *chan;
1465         int i;
1466         const struct ieee80211_txrx_stypes *mgmt_stypes =
1467                                 rdev->wiphy.mgmt_stypes;
1468         u32 features;
1469
1470         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
1471         if (!hdr)
1472                 return -ENOBUFS;
1473
1474         if (WARN_ON(!state))
1475                 return -EINVAL;
1476
1477         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
1478             nla_put_string(msg, NL80211_ATTR_WIPHY_NAME,
1479                            wiphy_name(&rdev->wiphy)) ||
1480             nla_put_u32(msg, NL80211_ATTR_GENERATION,
1481                         cfg80211_rdev_list_generation))
1482                 goto nla_put_failure;
1483
1484         if (cmd != NL80211_CMD_NEW_WIPHY)
1485                 goto finish;
1486
1487         switch (state->split_start) {
1488         case 0:
1489                 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
1490                                rdev->wiphy.retry_short) ||
1491                     nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
1492                                rdev->wiphy.retry_long) ||
1493                     nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
1494                                 rdev->wiphy.frag_threshold) ||
1495                     nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
1496                                 rdev->wiphy.rts_threshold) ||
1497                     nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS,
1498                                rdev->wiphy.coverage_class) ||
1499                     nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
1500                                rdev->wiphy.max_scan_ssids) ||
1501                     nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
1502                                rdev->wiphy.max_sched_scan_ssids) ||
1503                     nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
1504                                 rdev->wiphy.max_scan_ie_len) ||
1505                     nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
1506                                 rdev->wiphy.max_sched_scan_ie_len) ||
1507                     nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS,
1508                                rdev->wiphy.max_match_sets) ||
1509                     nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS,
1510                                 rdev->wiphy.max_sched_scan_plans) ||
1511                     nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL,
1512                                 rdev->wiphy.max_sched_scan_plan_interval) ||
1513                     nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
1514                                 rdev->wiphy.max_sched_scan_plan_iterations))
1515                         goto nla_put_failure;
1516
1517                 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) &&
1518                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN))
1519                         goto nla_put_failure;
1520                 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
1521                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH))
1522                         goto nla_put_failure;
1523                 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) &&
1524                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD))
1525                         goto nla_put_failure;
1526                 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) &&
1527                     nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT))
1528                         goto nla_put_failure;
1529                 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) &&
1530                     nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT))
1531                         goto nla_put_failure;
1532                 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) &&
1533                     nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP))
1534                         goto nla_put_failure;
1535                 state->split_start++;
1536                 if (state->split)
1537                         break;
1538         case 1:
1539                 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES,
1540                             sizeof(u32) * rdev->wiphy.n_cipher_suites,
1541                             rdev->wiphy.cipher_suites))
1542                         goto nla_put_failure;
1543
1544                 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS,
1545                                rdev->wiphy.max_num_pmkids))
1546                         goto nla_put_failure;
1547
1548                 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
1549                     nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE))
1550                         goto nla_put_failure;
1551
1552                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
1553                                 rdev->wiphy.available_antennas_tx) ||
1554                     nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
1555                                 rdev->wiphy.available_antennas_rx))
1556                         goto nla_put_failure;
1557
1558                 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) &&
1559                     nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD,
1560                                 rdev->wiphy.probe_resp_offload))
1561                         goto nla_put_failure;
1562
1563                 if ((rdev->wiphy.available_antennas_tx ||
1564                      rdev->wiphy.available_antennas_rx) &&
1565                     rdev->ops->get_antenna) {
1566                         u32 tx_ant = 0, rx_ant = 0;
1567                         int res;
1568
1569                         res = rdev_get_antenna(rdev, &tx_ant, &rx_ant);
1570                         if (!res) {
1571                                 if (nla_put_u32(msg,
1572                                                 NL80211_ATTR_WIPHY_ANTENNA_TX,
1573                                                 tx_ant) ||
1574                                     nla_put_u32(msg,
1575                                                 NL80211_ATTR_WIPHY_ANTENNA_RX,
1576                                                 rx_ant))
1577                                         goto nla_put_failure;
1578                         }
1579                 }
1580
1581                 state->split_start++;
1582                 if (state->split)
1583                         break;
1584         case 2:
1585                 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
1586                                         rdev->wiphy.interface_modes))
1587                                 goto nla_put_failure;
1588                 state->split_start++;
1589                 if (state->split)
1590                         break;
1591         case 3:
1592                 nl_bands = nla_nest_start(msg, NL80211_ATTR_WIPHY_BANDS);
1593                 if (!nl_bands)
1594                         goto nla_put_failure;
1595
1596                 for (band = state->band_start;
1597                      band < NUM_NL80211_BANDS; band++) {
1598                         struct ieee80211_supported_band *sband;
1599
1600                         sband = rdev->wiphy.bands[band];
1601
1602                         if (!sband)
1603                                 continue;
1604
1605                         nl_band = nla_nest_start(msg, band);
1606                         if (!nl_band)
1607                                 goto nla_put_failure;
1608
1609                         switch (state->chan_start) {
1610                         case 0:
1611                                 if (nl80211_send_band_rateinfo(msg, sband))
1612                                         goto nla_put_failure;
1613                                 state->chan_start++;
1614                                 if (state->split)
1615                                         break;
1616                         default:
1617                                 /* add frequencies */
1618                                 nl_freqs = nla_nest_start(
1619                                         msg, NL80211_BAND_ATTR_FREQS);
1620                                 if (!nl_freqs)
1621                                         goto nla_put_failure;
1622
1623                                 for (i = state->chan_start - 1;
1624                                      i < sband->n_channels;
1625                                      i++) {
1626                                         nl_freq = nla_nest_start(msg, i);
1627                                         if (!nl_freq)
1628                                                 goto nla_put_failure;
1629
1630                                         chan = &sband->channels[i];
1631
1632                                         if (nl80211_msg_put_channel(
1633                                                         msg, chan,
1634                                                         state->split))
1635                                                 goto nla_put_failure;
1636
1637                                         nla_nest_end(msg, nl_freq);
1638                                         if (state->split)
1639                                                 break;
1640                                 }
1641                                 if (i < sband->n_channels)
1642                                         state->chan_start = i + 2;
1643                                 else
1644                                         state->chan_start = 0;
1645                                 nla_nest_end(msg, nl_freqs);
1646                         }
1647
1648                         nla_nest_end(msg, nl_band);
1649
1650                         if (state->split) {
1651                                 /* start again here */
1652                                 if (state->chan_start)
1653                                         band--;
1654                                 break;
1655                         }
1656                 }
1657                 nla_nest_end(msg, nl_bands);
1658
1659                 if (band < NUM_NL80211_BANDS)
1660                         state->band_start = band + 1;
1661                 else
1662                         state->band_start = 0;
1663
1664                 /* if bands & channels are done, continue outside */
1665                 if (state->band_start == 0 && state->chan_start == 0)
1666                         state->split_start++;
1667                 if (state->split)
1668                         break;
1669         case 4:
1670                 nl_cmds = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_COMMANDS);
1671                 if (!nl_cmds)
1672                         goto nla_put_failure;
1673
1674                 i = nl80211_add_commands_unsplit(rdev, msg);
1675                 if (i < 0)
1676                         goto nla_put_failure;
1677                 if (state->split) {
1678                         CMD(crit_proto_start, CRIT_PROTOCOL_START);
1679                         CMD(crit_proto_stop, CRIT_PROTOCOL_STOP);
1680                         if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)
1681                                 CMD(channel_switch, CHANNEL_SWITCH);
1682                         CMD(set_qos_map, SET_QOS_MAP);
1683                         if (rdev->wiphy.features &
1684                                         NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)
1685                                 CMD(add_tx_ts, ADD_TX_TS);
1686                         CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST);
1687                         CMD(update_connect_params, UPDATE_CONNECT_PARAMS);
1688                 }
1689 #undef CMD
1690
1691                 nla_nest_end(msg, nl_cmds);
1692                 state->split_start++;
1693                 if (state->split)
1694                         break;
1695         case 5:
1696                 if (rdev->ops->remain_on_channel &&
1697                     (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) &&
1698                     nla_put_u32(msg,
1699                                 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
1700                                 rdev->wiphy.max_remain_on_channel_duration))
1701                         goto nla_put_failure;
1702
1703                 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) &&
1704                     nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK))
1705                         goto nla_put_failure;
1706
1707                 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes))
1708                         goto nla_put_failure;
1709                 state->split_start++;
1710                 if (state->split)
1711                         break;
1712         case 6:
1713 #ifdef CONFIG_PM
1714                 if (nl80211_send_wowlan(msg, rdev, state->split))
1715                         goto nla_put_failure;
1716                 state->split_start++;
1717                 if (state->split)
1718                         break;
1719 #else
1720                 state->split_start++;
1721 #endif
1722         case 7:
1723                 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
1724                                         rdev->wiphy.software_iftypes))
1725                         goto nla_put_failure;
1726
1727                 if (nl80211_put_iface_combinations(&rdev->wiphy, msg,
1728                                                    state->split))
1729                         goto nla_put_failure;
1730
1731                 state->split_start++;
1732                 if (state->split)
1733                         break;
1734         case 8:
1735                 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) &&
1736                     nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME,
1737                                 rdev->wiphy.ap_sme_capa))
1738                         goto nla_put_failure;
1739
1740                 features = rdev->wiphy.features;
1741                 /*
1742                  * We can only add the per-channel limit information if the
1743                  * dump is split, otherwise it makes it too big. Therefore
1744                  * only advertise it in that case.
1745                  */
1746                 if (state->split)
1747                         features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS;
1748                 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features))
1749                         goto nla_put_failure;
1750
1751                 if (rdev->wiphy.ht_capa_mod_mask &&
1752                     nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK,
1753                             sizeof(*rdev->wiphy.ht_capa_mod_mask),
1754                             rdev->wiphy.ht_capa_mod_mask))
1755                         goto nla_put_failure;
1756
1757                 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME &&
1758                     rdev->wiphy.max_acl_mac_addrs &&
1759                     nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX,
1760                                 rdev->wiphy.max_acl_mac_addrs))
1761                         goto nla_put_failure;
1762
1763                 /*
1764                  * Any information below this point is only available to
1765                  * applications that can deal with it being split. This
1766                  * helps ensure that newly added capabilities don't break
1767                  * older tools by overrunning their buffers.
1768                  *
1769                  * We still increment split_start so that in the split
1770                  * case we'll continue with more data in the next round,
1771                  * but break unconditionally so unsplit data stops here.
1772                  */
1773                 state->split_start++;
1774                 break;
1775         case 9:
1776                 if (rdev->wiphy.extended_capabilities &&
1777                     (nla_put(msg, NL80211_ATTR_EXT_CAPA,
1778                              rdev->wiphy.extended_capabilities_len,
1779                              rdev->wiphy.extended_capabilities) ||
1780                      nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
1781                              rdev->wiphy.extended_capabilities_len,
1782                              rdev->wiphy.extended_capabilities_mask)))
1783                         goto nla_put_failure;
1784
1785                 if (rdev->wiphy.vht_capa_mod_mask &&
1786                     nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK,
1787                             sizeof(*rdev->wiphy.vht_capa_mod_mask),
1788                             rdev->wiphy.vht_capa_mod_mask))
1789                         goto nla_put_failure;
1790
1791                 state->split_start++;
1792                 break;
1793         case 10:
1794                 if (nl80211_send_coalesce(msg, rdev))
1795                         goto nla_put_failure;
1796
1797                 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) &&
1798                     (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) ||
1799                      nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ)))
1800                         goto nla_put_failure;
1801
1802                 if (rdev->wiphy.max_ap_assoc_sta &&
1803                     nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA,
1804                                 rdev->wiphy.max_ap_assoc_sta))
1805                         goto nla_put_failure;
1806
1807                 state->split_start++;
1808                 break;
1809         case 11:
1810                 if (rdev->wiphy.n_vendor_commands) {
1811                         const struct nl80211_vendor_cmd_info *info;
1812                         struct nlattr *nested;
1813
1814                         nested = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA);
1815                         if (!nested)
1816                                 goto nla_put_failure;
1817
1818                         for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
1819                                 info = &rdev->wiphy.vendor_commands[i].info;
1820                                 if (nla_put(msg, i + 1, sizeof(*info), info))
1821                                         goto nla_put_failure;
1822                         }
1823                         nla_nest_end(msg, nested);
1824                 }
1825
1826                 if (rdev->wiphy.n_vendor_events) {
1827                         const struct nl80211_vendor_cmd_info *info;
1828                         struct nlattr *nested;
1829
1830                         nested = nla_nest_start(msg,
1831                                                 NL80211_ATTR_VENDOR_EVENTS);
1832                         if (!nested)
1833                                 goto nla_put_failure;
1834
1835                         for (i = 0; i < rdev->wiphy.n_vendor_events; i++) {
1836                                 info = &rdev->wiphy.vendor_events[i];
1837                                 if (nla_put(msg, i + 1, sizeof(*info), info))
1838                                         goto nla_put_failure;
1839                         }
1840                         nla_nest_end(msg, nested);
1841                 }
1842                 state->split_start++;
1843                 break;
1844         case 12:
1845                 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH &&
1846                     nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS,
1847                                rdev->wiphy.max_num_csa_counters))
1848                         goto nla_put_failure;
1849
1850                 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
1851                     nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
1852                         goto nla_put_failure;
1853
1854                 if (rdev->wiphy.max_sched_scan_reqs &&
1855                     nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS,
1856                                 rdev->wiphy.max_sched_scan_reqs))
1857                         goto nla_put_failure;
1858
1859                 if (nla_put(msg, NL80211_ATTR_EXT_FEATURES,
1860                             sizeof(rdev->wiphy.ext_features),
1861                             rdev->wiphy.ext_features))
1862                         goto nla_put_failure;
1863
1864                 if (rdev->wiphy.bss_select_support) {
1865                         struct nlattr *nested;
1866                         u32 bss_select_support = rdev->wiphy.bss_select_support;
1867
1868                         nested = nla_nest_start(msg, NL80211_ATTR_BSS_SELECT);
1869                         if (!nested)
1870                                 goto nla_put_failure;
1871
1872                         i = 0;
1873                         while (bss_select_support) {
1874                                 if ((bss_select_support & 1) &&
1875                                     nla_put_flag(msg, i))
1876                                         goto nla_put_failure;
1877                                 i++;
1878                                 bss_select_support >>= 1;
1879                         }
1880                         nla_nest_end(msg, nested);
1881                 }
1882
1883                 state->split_start++;
1884                 break;
1885         case 13:
1886                 if (rdev->wiphy.num_iftype_ext_capab &&
1887                     rdev->wiphy.iftype_ext_capab) {
1888                         struct nlattr *nested_ext_capab, *nested;
1889
1890                         nested = nla_nest_start(msg,
1891                                                 NL80211_ATTR_IFTYPE_EXT_CAPA);
1892                         if (!nested)
1893                                 goto nla_put_failure;
1894
1895                         for (i = state->capa_start;
1896                              i < rdev->wiphy.num_iftype_ext_capab; i++) {
1897                                 const struct wiphy_iftype_ext_capab *capab;
1898
1899                                 capab = &rdev->wiphy.iftype_ext_capab[i];
1900
1901                                 nested_ext_capab = nla_nest_start(msg, i);
1902                                 if (!nested_ext_capab ||
1903                                     nla_put_u32(msg, NL80211_ATTR_IFTYPE,
1904                                                 capab->iftype) ||
1905                                     nla_put(msg, NL80211_ATTR_EXT_CAPA,
1906                                             capab->extended_capabilities_len,
1907                                             capab->extended_capabilities) ||
1908                                     nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
1909                                             capab->extended_capabilities_len,
1910                                             capab->extended_capabilities_mask))
1911                                         goto nla_put_failure;
1912
1913                                 nla_nest_end(msg, nested_ext_capab);
1914                                 if (state->split)
1915                                         break;
1916                         }
1917                         nla_nest_end(msg, nested);
1918                         if (i < rdev->wiphy.num_iftype_ext_capab) {
1919                                 state->capa_start = i + 1;
1920                                 break;
1921                         }
1922                 }
1923
1924                 if (nla_put_u32(msg, NL80211_ATTR_BANDS,
1925                                 rdev->wiphy.nan_supported_bands))
1926                         goto nla_put_failure;
1927
1928                 /* done */
1929                 state->split_start = 0;
1930                 break;
1931         }
1932  finish:
1933         genlmsg_end(msg, hdr);
1934         return 0;
1935
1936  nla_put_failure:
1937         genlmsg_cancel(msg, hdr);
1938         return -EMSGSIZE;
1939 }
1940
1941 static int nl80211_dump_wiphy_parse(struct sk_buff *skb,
1942                                     struct netlink_callback *cb,
1943                                     struct nl80211_dump_wiphy_state *state)
1944 {
1945         struct nlattr **tb = genl_family_attrbuf(&nl80211_fam);
1946         int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, tb,
1947                               nl80211_fam.maxattr, nl80211_policy, NULL);
1948         /* ignore parse errors for backward compatibility */
1949         if (ret)
1950                 return 0;
1951
1952         state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP];
1953         if (tb[NL80211_ATTR_WIPHY])
1954                 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
1955         if (tb[NL80211_ATTR_WDEV])
1956                 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32;
1957         if (tb[NL80211_ATTR_IFINDEX]) {
1958                 struct net_device *netdev;
1959                 struct cfg80211_registered_device *rdev;
1960                 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
1961
1962                 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx);
1963                 if (!netdev)
1964                         return -ENODEV;
1965                 if (netdev->ieee80211_ptr) {
1966                         rdev = wiphy_to_rdev(
1967                                 netdev->ieee80211_ptr->wiphy);
1968                         state->filter_wiphy = rdev->wiphy_idx;
1969                 }
1970         }
1971
1972         return 0;
1973 }
1974
1975 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
1976 {
1977         int idx = 0, ret;
1978         struct nl80211_dump_wiphy_state *state = (void *)cb->args[0];
1979         struct cfg80211_registered_device *rdev;
1980
1981         rtnl_lock();
1982         if (!state) {
1983                 state = kzalloc(sizeof(*state), GFP_KERNEL);
1984                 if (!state) {
1985                         rtnl_unlock();
1986                         return -ENOMEM;
1987                 }
1988                 state->filter_wiphy = -1;
1989                 ret = nl80211_dump_wiphy_parse(skb, cb, state);
1990                 if (ret) {
1991                         kfree(state);
1992                         rtnl_unlock();
1993                         return ret;
1994                 }
1995                 cb->args[0] = (long)state;
1996         }
1997
1998         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
1999                 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
2000                         continue;
2001                 if (++idx <= state->start)
2002                         continue;
2003                 if (state->filter_wiphy != -1 &&
2004                     state->filter_wiphy != rdev->wiphy_idx)
2005                         continue;
2006                 /* attempt to fit multiple wiphy data chunks into the skb */
2007                 do {
2008                         ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY,
2009                                                  skb,
2010                                                  NETLINK_CB(cb->skb).portid,
2011                                                  cb->nlh->nlmsg_seq,
2012                                                  NLM_F_MULTI, state);
2013                         if (ret < 0) {
2014                                 /*
2015                                  * If sending the wiphy data didn't fit (ENOBUFS
2016                                  * or EMSGSIZE returned), this SKB is still
2017                                  * empty (so it's not too big because another
2018                                  * wiphy dataset is already in the skb) and
2019                                  * we've not tried to adjust the dump allocation
2020                                  * yet ... then adjust the alloc size to be
2021                                  * bigger, and return 1 but with the empty skb.
2022                                  * This results in an empty message being RX'ed
2023                                  * in userspace, but that is ignored.
2024                                  *
2025                                  * We can then retry with the larger buffer.
2026                                  */
2027                                 if ((ret == -ENOBUFS || ret == -EMSGSIZE) &&
2028                                     !skb->len && !state->split &&
2029                                     cb->min_dump_alloc < 4096) {
2030                                         cb->min_dump_alloc = 4096;
2031                                         state->split_start = 0;
2032                                         rtnl_unlock();
2033                                         return 1;
2034                                 }
2035                                 idx--;
2036                                 break;
2037                         }
2038                 } while (state->split_start > 0);
2039                 break;
2040         }
2041         rtnl_unlock();
2042
2043         state->start = idx;
2044
2045         return skb->len;
2046 }
2047
2048 static int nl80211_dump_wiphy_done(struct netlink_callback *cb)
2049 {
2050         kfree((void *)cb->args[0]);
2051         return 0;
2052 }
2053
2054 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
2055 {
2056         struct sk_buff *msg;
2057         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2058         struct nl80211_dump_wiphy_state state = {};
2059
2060         msg = nlmsg_new(4096, GFP_KERNEL);
2061         if (!msg)
2062                 return -ENOMEM;
2063
2064         if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg,
2065                                info->snd_portid, info->snd_seq, 0,
2066                                &state) < 0) {
2067                 nlmsg_free(msg);
2068                 return -ENOBUFS;
2069         }
2070
2071         return genlmsg_reply(msg, info);
2072 }
2073
2074 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
2075         [NL80211_TXQ_ATTR_QUEUE]                = { .type = NLA_U8 },
2076         [NL80211_TXQ_ATTR_TXOP]                 = { .type = NLA_U16 },
2077         [NL80211_TXQ_ATTR_CWMIN]                = { .type = NLA_U16 },
2078         [NL80211_TXQ_ATTR_CWMAX]                = { .type = NLA_U16 },
2079         [NL80211_TXQ_ATTR_AIFS]                 = { .type = NLA_U8 },
2080 };
2081
2082 static int parse_txq_params(struct nlattr *tb[],
2083                             struct ieee80211_txq_params *txq_params)
2084 {
2085         u8 ac;
2086
2087         if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] ||
2088             !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
2089             !tb[NL80211_TXQ_ATTR_AIFS])
2090                 return -EINVAL;
2091
2092         ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]);
2093         txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
2094         txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
2095         txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
2096         txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
2097
2098         if (ac >= NL80211_NUM_ACS)
2099                 return -EINVAL;
2100         txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS);
2101         return 0;
2102 }
2103
2104 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
2105 {
2106         /*
2107          * You can only set the channel explicitly for WDS interfaces,
2108          * all others have their channel managed via their respective
2109          * "establish a connection" command (connect, join, ...)
2110          *
2111          * For AP/GO and mesh mode, the channel can be set with the
2112          * channel userspace API, but is only stored and passed to the
2113          * low-level driver when the AP starts or the mesh is joined.
2114          * This is for backward compatibility, userspace can also give
2115          * the channel in the start-ap or join-mesh commands instead.
2116          *
2117          * Monitors are special as they are normally slaved to
2118          * whatever else is going on, so they have their own special
2119          * operation to set the monitor channel if possible.
2120          */
2121         return !wdev ||
2122                 wdev->iftype == NL80211_IFTYPE_AP ||
2123                 wdev->iftype == NL80211_IFTYPE_MESH_POINT ||
2124                 wdev->iftype == NL80211_IFTYPE_MONITOR ||
2125                 wdev->iftype == NL80211_IFTYPE_P2P_GO;
2126 }
2127
2128 static int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
2129                                  struct genl_info *info,
2130                                  struct cfg80211_chan_def *chandef)
2131 {
2132         u32 control_freq;
2133
2134         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
2135                 return -EINVAL;
2136
2137         control_freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
2138
2139         chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq);
2140         chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
2141         chandef->center_freq1 = control_freq;
2142         chandef->center_freq2 = 0;
2143
2144         /* Primary channel not allowed */
2145         if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED)
2146                 return -EINVAL;
2147
2148         if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
2149                 enum nl80211_channel_type chantype;
2150
2151                 chantype = nla_get_u32(
2152                                 info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
2153
2154                 switch (chantype) {
2155                 case NL80211_CHAN_NO_HT:
2156                 case NL80211_CHAN_HT20:
2157                 case NL80211_CHAN_HT40PLUS:
2158                 case NL80211_CHAN_HT40MINUS:
2159                         cfg80211_chandef_create(chandef, chandef->chan,
2160                                                 chantype);
2161                         /* user input for center_freq is incorrect */
2162                         if (info->attrs[NL80211_ATTR_CENTER_FREQ1] &&
2163                             chandef->center_freq1 != nla_get_u32(
2164                                         info->attrs[NL80211_ATTR_CENTER_FREQ1]))
2165                                 return -EINVAL;
2166                         /* center_freq2 must be zero */
2167                         if (info->attrs[NL80211_ATTR_CENTER_FREQ2] &&
2168                             nla_get_u32(info->attrs[NL80211_ATTR_CENTER_FREQ2]))
2169                                 return -EINVAL;
2170                         break;
2171                 default:
2172                         return -EINVAL;
2173                 }
2174         } else if (info->attrs[NL80211_ATTR_CHANNEL_WIDTH]) {
2175                 chandef->width =
2176                         nla_get_u32(info->attrs[NL80211_ATTR_CHANNEL_WIDTH]);
2177                 if (info->attrs[NL80211_ATTR_CENTER_FREQ1])
2178                         chandef->center_freq1 =
2179                                 nla_get_u32(
2180                                         info->attrs[NL80211_ATTR_CENTER_FREQ1]);
2181                 if (info->attrs[NL80211_ATTR_CENTER_FREQ2])
2182                         chandef->center_freq2 =
2183                                 nla_get_u32(
2184                                         info->attrs[NL80211_ATTR_CENTER_FREQ2]);
2185         }
2186
2187         if (!cfg80211_chandef_valid(chandef))
2188                 return -EINVAL;
2189
2190         if (!cfg80211_chandef_usable(&rdev->wiphy, chandef,
2191                                      IEEE80211_CHAN_DISABLED))
2192                 return -EINVAL;
2193
2194         if ((chandef->width == NL80211_CHAN_WIDTH_5 ||
2195              chandef->width == NL80211_CHAN_WIDTH_10) &&
2196             !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ))
2197                 return -EINVAL;
2198
2199         return 0;
2200 }
2201
2202 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
2203                                  struct net_device *dev,
2204                                  struct genl_info *info)
2205 {
2206         struct cfg80211_chan_def chandef;
2207         int result;
2208         enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR;
2209         struct wireless_dev *wdev = NULL;
2210
2211         if (dev)
2212                 wdev = dev->ieee80211_ptr;
2213         if (!nl80211_can_set_dev_channel(wdev))
2214                 return -EOPNOTSUPP;
2215         if (wdev)
2216                 iftype = wdev->iftype;
2217
2218         result = nl80211_parse_chandef(rdev, info, &chandef);
2219         if (result)
2220                 return result;
2221
2222         switch (iftype) {
2223         case NL80211_IFTYPE_AP:
2224         case NL80211_IFTYPE_P2P_GO:
2225                 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
2226                                                    iftype)) {
2227                         result = -EINVAL;
2228                         break;
2229                 }
2230                 if (wdev->beacon_interval) {
2231                         if (!dev || !rdev->ops->set_ap_chanwidth ||
2232                             !(rdev->wiphy.features &
2233                               NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) {
2234                                 result = -EBUSY;
2235                                 break;
2236                         }
2237
2238                         /* Only allow dynamic channel width changes */
2239                         if (chandef.chan != wdev->preset_chandef.chan) {
2240                                 result = -EBUSY;
2241                                 break;
2242                         }
2243                         result = rdev_set_ap_chanwidth(rdev, dev, &chandef);
2244                         if (result)
2245                                 break;
2246                 }
2247                 wdev->preset_chandef = chandef;
2248                 result = 0;
2249                 break;
2250         case NL80211_IFTYPE_MESH_POINT:
2251                 result = cfg80211_set_mesh_channel(rdev, wdev, &chandef);
2252                 break;
2253         case NL80211_IFTYPE_MONITOR:
2254                 result = cfg80211_set_monitor_channel(rdev, &chandef);
2255                 break;
2256         default:
2257                 result = -EINVAL;
2258         }
2259
2260         return result;
2261 }
2262
2263 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
2264 {
2265         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2266         struct net_device *netdev = info->user_ptr[1];
2267
2268         return __nl80211_set_channel(rdev, netdev, info);
2269 }
2270
2271 static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info)
2272 {
2273         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2274         struct net_device *dev = info->user_ptr[1];
2275         struct wireless_dev *wdev = dev->ieee80211_ptr;
2276         const u8 *bssid;
2277
2278         if (!info->attrs[NL80211_ATTR_MAC])
2279                 return -EINVAL;
2280
2281         if (netif_running(dev))
2282                 return -EBUSY;
2283
2284         if (!rdev->ops->set_wds_peer)
2285                 return -EOPNOTSUPP;
2286
2287         if (wdev->iftype != NL80211_IFTYPE_WDS)
2288                 return -EOPNOTSUPP;
2289
2290         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
2291         return rdev_set_wds_peer(rdev, dev, bssid);
2292 }
2293
2294 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
2295 {
2296         struct cfg80211_registered_device *rdev;
2297         struct net_device *netdev = NULL;
2298         struct wireless_dev *wdev;
2299         int result = 0, rem_txq_params = 0;
2300         struct nlattr *nl_txq_params;
2301         u32 changed;
2302         u8 retry_short = 0, retry_long = 0;
2303         u32 frag_threshold = 0, rts_threshold = 0;
2304         u8 coverage_class = 0;
2305
2306         ASSERT_RTNL();
2307
2308         /*
2309          * Try to find the wiphy and netdev. Normally this
2310          * function shouldn't need the netdev, but this is
2311          * done for backward compatibility -- previously
2312          * setting the channel was done per wiphy, but now
2313          * it is per netdev. Previous userland like hostapd
2314          * also passed a netdev to set_wiphy, so that it is
2315          * possible to let that go to the right netdev!
2316          */
2317
2318         if (info->attrs[NL80211_ATTR_IFINDEX]) {
2319                 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
2320
2321                 netdev = __dev_get_by_index(genl_info_net(info), ifindex);
2322                 if (netdev && netdev->ieee80211_ptr)
2323                         rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy);
2324                 else
2325                         netdev = NULL;
2326         }
2327
2328         if (!netdev) {
2329                 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info),
2330                                                   info->attrs);
2331                 if (IS_ERR(rdev))
2332                         return PTR_ERR(rdev);
2333                 wdev = NULL;
2334                 netdev = NULL;
2335                 result = 0;
2336         } else
2337                 wdev = netdev->ieee80211_ptr;
2338
2339         /*
2340          * end workaround code, by now the rdev is available
2341          * and locked, and wdev may or may not be NULL.
2342          */
2343
2344         if (info->attrs[NL80211_ATTR_WIPHY_NAME])
2345                 result = cfg80211_dev_rename(
2346                         rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
2347
2348         if (result)
2349                 return result;
2350
2351         if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
2352                 struct ieee80211_txq_params txq_params;
2353                 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
2354
2355                 if (!rdev->ops->set_txq_params)
2356                         return -EOPNOTSUPP;
2357
2358                 if (!netdev)
2359                         return -EINVAL;
2360
2361                 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
2362                     netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
2363                         return -EINVAL;
2364
2365                 if (!netif_running(netdev))
2366                         return -ENETDOWN;
2367
2368                 nla_for_each_nested(nl_txq_params,
2369                                     info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
2370                                     rem_txq_params) {
2371                         result = nla_parse_nested(tb, NL80211_TXQ_ATTR_MAX,
2372                                                   nl_txq_params,
2373                                                   txq_params_policy,
2374                                                   info->extack);
2375                         if (result)
2376                                 return result;
2377                         result = parse_txq_params(tb, &txq_params);
2378                         if (result)
2379                                 return result;
2380
2381                         result = rdev_set_txq_params(rdev, netdev,
2382                                                      &txq_params);
2383                         if (result)
2384                                 return result;
2385                 }
2386         }
2387
2388         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
2389                 result = __nl80211_set_channel(
2390                         rdev,
2391                         nl80211_can_set_dev_channel(wdev) ? netdev : NULL,
2392                         info);
2393                 if (result)
2394                         return result;
2395         }
2396
2397         if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
2398                 struct wireless_dev *txp_wdev = wdev;
2399                 enum nl80211_tx_power_setting type;
2400                 int idx, mbm = 0;
2401
2402                 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER))
2403                         txp_wdev = NULL;
2404
2405                 if (!rdev->ops->set_tx_power)
2406                         return -EOPNOTSUPP;
2407
2408                 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
2409                 type = nla_get_u32(info->attrs[idx]);
2410
2411                 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
2412                     (type != NL80211_TX_POWER_AUTOMATIC))
2413                         return -EINVAL;
2414
2415                 if (type != NL80211_TX_POWER_AUTOMATIC) {
2416                         idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
2417                         mbm = nla_get_u32(info->attrs[idx]);
2418                 }
2419
2420                 result = rdev_set_tx_power(rdev, txp_wdev, type, mbm);
2421                 if (result)
2422                         return result;
2423         }
2424
2425         if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
2426             info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
2427                 u32 tx_ant, rx_ant;
2428
2429                 if ((!rdev->wiphy.available_antennas_tx &&
2430                      !rdev->wiphy.available_antennas_rx) ||
2431                     !rdev->ops->set_antenna)
2432                         return -EOPNOTSUPP;
2433
2434                 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
2435                 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
2436
2437                 /* reject antenna configurations which don't match the
2438                  * available antenna masks, except for the "all" mask */
2439                 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
2440                     (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx)))
2441                         return -EINVAL;
2442
2443                 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
2444                 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
2445
2446                 result = rdev_set_antenna(rdev, tx_ant, rx_ant);
2447                 if (result)
2448                         return result;
2449         }
2450
2451         changed = 0;
2452
2453         if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
2454                 retry_short = nla_get_u8(
2455                         info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
2456                 if (retry_short == 0)
2457                         return -EINVAL;
2458
2459                 changed |= WIPHY_PARAM_RETRY_SHORT;
2460         }
2461
2462         if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
2463                 retry_long = nla_get_u8(
2464                         info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
2465                 if (retry_long == 0)
2466                         return -EINVAL;
2467
2468                 changed |= WIPHY_PARAM_RETRY_LONG;
2469         }
2470
2471         if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
2472                 frag_threshold = nla_get_u32(
2473                         info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
2474                 if (frag_threshold < 256)
2475                         return -EINVAL;
2476
2477                 if (frag_threshold != (u32) -1) {
2478                         /*
2479                          * Fragments (apart from the last one) are required to
2480                          * have even length. Make the fragmentation code
2481                          * simpler by stripping LSB should someone try to use
2482                          * odd threshold value.
2483                          */
2484                         frag_threshold &= ~0x1;
2485                 }
2486                 changed |= WIPHY_PARAM_FRAG_THRESHOLD;
2487         }
2488
2489         if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
2490                 rts_threshold = nla_get_u32(
2491                         info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
2492                 changed |= WIPHY_PARAM_RTS_THRESHOLD;
2493         }
2494
2495         if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
2496                 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK])
2497                         return -EINVAL;
2498
2499                 coverage_class = nla_get_u8(
2500                         info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
2501                 changed |= WIPHY_PARAM_COVERAGE_CLASS;
2502         }
2503
2504         if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) {
2505                 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION))
2506                         return -EOPNOTSUPP;
2507
2508                 changed |= WIPHY_PARAM_DYN_ACK;
2509         }
2510
2511         if (changed) {
2512                 u8 old_retry_short, old_retry_long;
2513                 u32 old_frag_threshold, old_rts_threshold;
2514                 u8 old_coverage_class;
2515
2516                 if (!rdev->ops->set_wiphy_params)
2517                         return -EOPNOTSUPP;
2518
2519                 old_retry_short = rdev->wiphy.retry_short;
2520                 old_retry_long = rdev->wiphy.retry_long;
2521                 old_frag_threshold = rdev->wiphy.frag_threshold;
2522                 old_rts_threshold = rdev->wiphy.rts_threshold;
2523                 old_coverage_class = rdev->wiphy.coverage_class;
2524
2525                 if (changed & WIPHY_PARAM_RETRY_SHORT)
2526                         rdev->wiphy.retry_short = retry_short;
2527                 if (changed & WIPHY_PARAM_RETRY_LONG)
2528                         rdev->wiphy.retry_long = retry_long;
2529                 if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
2530                         rdev->wiphy.frag_threshold = frag_threshold;
2531                 if (changed & WIPHY_PARAM_RTS_THRESHOLD)
2532                         rdev->wiphy.rts_threshold = rts_threshold;
2533                 if (changed & WIPHY_PARAM_COVERAGE_CLASS)
2534                         rdev->wiphy.coverage_class = coverage_class;
2535
2536                 result = rdev_set_wiphy_params(rdev, changed);
2537                 if (result) {
2538                         rdev->wiphy.retry_short = old_retry_short;
2539                         rdev->wiphy.retry_long = old_retry_long;
2540                         rdev->wiphy.frag_threshold = old_frag_threshold;
2541                         rdev->wiphy.rts_threshold = old_rts_threshold;
2542                         rdev->wiphy.coverage_class = old_coverage_class;
2543                         return result;
2544                 }
2545         }
2546         return 0;
2547 }
2548
2549 static inline u64 wdev_id(struct wireless_dev *wdev)
2550 {
2551         return (u64)wdev->identifier |
2552                ((u64)wiphy_to_rdev(wdev->wiphy)->wiphy_idx << 32);
2553 }
2554
2555 static int nl80211_send_chandef(struct sk_buff *msg,
2556                                 const struct cfg80211_chan_def *chandef)
2557 {
2558         if (WARN_ON(!cfg80211_chandef_valid(chandef)))
2559                 return -EINVAL;
2560
2561         if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ,
2562                         chandef->chan->center_freq))
2563                 return -ENOBUFS;
2564         switch (chandef->width) {
2565         case NL80211_CHAN_WIDTH_20_NOHT:
2566         case NL80211_CHAN_WIDTH_20:
2567         case NL80211_CHAN_WIDTH_40:
2568                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
2569                                 cfg80211_get_chandef_type(chandef)))
2570                         return -ENOBUFS;
2571                 break;
2572         default:
2573                 break;
2574         }
2575         if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width))
2576                 return -ENOBUFS;
2577         if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1))
2578                 return -ENOBUFS;
2579         if (chandef->center_freq2 &&
2580             nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2))
2581                 return -ENOBUFS;
2582         return 0;
2583 }
2584
2585 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags,
2586                               struct cfg80211_registered_device *rdev,
2587                               struct wireless_dev *wdev, bool removal)
2588 {
2589         struct net_device *dev = wdev->netdev;
2590         u8 cmd = NL80211_CMD_NEW_INTERFACE;
2591         void *hdr;
2592
2593         if (removal)
2594                 cmd = NL80211_CMD_DEL_INTERFACE;
2595
2596         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
2597         if (!hdr)
2598                 return -1;
2599
2600         if (dev &&
2601             (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
2602              nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name)))
2603                 goto nla_put_failure;
2604
2605         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
2606             nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) ||
2607             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
2608                               NL80211_ATTR_PAD) ||
2609             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) ||
2610             nla_put_u32(msg, NL80211_ATTR_GENERATION,
2611                         rdev->devlist_generation ^
2612                         (cfg80211_rdev_list_generation << 2)))
2613                 goto nla_put_failure;
2614
2615         if (rdev->ops->get_channel) {
2616                 int ret;
2617                 struct cfg80211_chan_def chandef;
2618
2619                 ret = rdev_get_channel(rdev, wdev, &chandef);
2620                 if (ret == 0) {
2621                         if (nl80211_send_chandef(msg, &chandef))
2622                                 goto nla_put_failure;
2623                 }
2624         }
2625
2626         if (rdev->ops->get_tx_power) {
2627                 int dbm, ret;
2628
2629                 ret = rdev_get_tx_power(rdev, wdev, &dbm);
2630                 if (ret == 0 &&
2631                     nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
2632                                 DBM_TO_MBM(dbm)))
2633                         goto nla_put_failure;
2634         }
2635
2636         wdev_lock(wdev);
2637         switch (wdev->iftype) {
2638         case NL80211_IFTYPE_AP:
2639                 if (wdev->ssid_len &&
2640                     nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid))
2641                         goto nla_put_failure_locked;
2642                 break;
2643         case NL80211_IFTYPE_STATION:
2644         case NL80211_IFTYPE_P2P_CLIENT:
2645         case NL80211_IFTYPE_ADHOC: {
2646                 const u8 *ssid_ie;
2647                 if (!wdev->current_bss)
2648                         break;
2649                 rcu_read_lock();
2650                 ssid_ie = ieee80211_bss_get_ie(&wdev->current_bss->pub,
2651                                                WLAN_EID_SSID);
2652                 if (ssid_ie &&
2653                     nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2))
2654                         goto nla_put_failure_rcu_locked;
2655                 rcu_read_unlock();
2656                 break;
2657                 }
2658         default:
2659                 /* nothing */
2660                 break;
2661         }
2662         wdev_unlock(wdev);
2663
2664         genlmsg_end(msg, hdr);
2665         return 0;
2666
2667  nla_put_failure_rcu_locked:
2668         rcu_read_unlock();
2669  nla_put_failure_locked:
2670         wdev_unlock(wdev);
2671  nla_put_failure:
2672         genlmsg_cancel(msg, hdr);
2673         return -EMSGSIZE;
2674 }
2675
2676 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
2677 {
2678         int wp_idx = 0;
2679         int if_idx = 0;
2680         int wp_start = cb->args[0];
2681         int if_start = cb->args[1];
2682         int filter_wiphy = -1;
2683         struct cfg80211_registered_device *rdev;
2684         struct wireless_dev *wdev;
2685         int ret;
2686
2687         rtnl_lock();
2688         if (!cb->args[2]) {
2689                 struct nl80211_dump_wiphy_state state = {
2690                         .filter_wiphy = -1,
2691                 };
2692
2693                 ret = nl80211_dump_wiphy_parse(skb, cb, &state);
2694                 if (ret)
2695                         goto out_unlock;
2696
2697                 filter_wiphy = state.filter_wiphy;
2698
2699                 /*
2700                  * if filtering, set cb->args[2] to +1 since 0 is the default
2701                  * value needed to determine that parsing is necessary.
2702                  */
2703                 if (filter_wiphy >= 0)
2704                         cb->args[2] = filter_wiphy + 1;
2705                 else
2706                         cb->args[2] = -1;
2707         } else if (cb->args[2] > 0) {
2708                 filter_wiphy = cb->args[2] - 1;
2709         }
2710
2711         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
2712                 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
2713                         continue;
2714                 if (wp_idx < wp_start) {
2715                         wp_idx++;
2716                         continue;
2717                 }
2718
2719                 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx)
2720                         continue;
2721
2722                 if_idx = 0;
2723
2724                 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
2725                         if (if_idx < if_start) {
2726                                 if_idx++;
2727                                 continue;
2728                         }
2729                         if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid,
2730                                                cb->nlh->nlmsg_seq, NLM_F_MULTI,
2731                                                rdev, wdev, false) < 0) {
2732                                 goto out;
2733                         }
2734                         if_idx++;
2735                 }
2736
2737                 wp_idx++;
2738         }
2739  out:
2740         cb->args[0] = wp_idx;
2741         cb->args[1] = if_idx;
2742
2743         ret = skb->len;
2744  out_unlock:
2745         rtnl_unlock();
2746
2747         return ret;
2748 }
2749
2750 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
2751 {
2752         struct sk_buff *msg;
2753         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2754         struct wireless_dev *wdev = info->user_ptr[1];
2755
2756         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2757         if (!msg)
2758                 return -ENOMEM;
2759
2760         if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
2761                                rdev, wdev, false) < 0) {
2762                 nlmsg_free(msg);
2763                 return -ENOBUFS;
2764         }
2765
2766         return genlmsg_reply(msg, info);
2767 }
2768
2769 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = {
2770         [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG },
2771         [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG },
2772         [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG },
2773         [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
2774         [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
2775         [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG },
2776 };
2777
2778 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
2779 {
2780         struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1];
2781         int flag;
2782
2783         *mntrflags = 0;
2784
2785         if (!nla)
2786                 return -EINVAL;
2787
2788         if (nla_parse_nested(flags, NL80211_MNTR_FLAG_MAX, nla,
2789                              mntr_flags_policy, NULL))
2790                 return -EINVAL;
2791
2792         for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
2793                 if (flags[flag])
2794                         *mntrflags |= (1<<flag);
2795
2796         *mntrflags |= MONITOR_FLAG_CHANGED;
2797
2798         return 0;
2799 }
2800
2801 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev,
2802                                      enum nl80211_iftype type,
2803                                      struct genl_info *info,
2804                                      struct vif_params *params)
2805 {
2806         bool change = false;
2807         int err;
2808
2809         if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
2810                 if (type != NL80211_IFTYPE_MONITOR)
2811                         return -EINVAL;
2812
2813                 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
2814                                           &params->flags);
2815                 if (err)
2816                         return err;
2817
2818                 change = true;
2819         }
2820
2821         if (params->flags & MONITOR_FLAG_ACTIVE &&
2822             !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
2823                 return -EOPNOTSUPP;
2824
2825         if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) {
2826                 const u8 *mumimo_groups;
2827                 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
2828
2829                 if (type != NL80211_IFTYPE_MONITOR)
2830                         return -EINVAL;
2831
2832                 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
2833                         return -EOPNOTSUPP;
2834
2835                 mumimo_groups =
2836                         nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]);
2837
2838                 /* bits 0 and 63 are reserved and must be zero */
2839                 if ((mumimo_groups[0] & BIT(0)) ||
2840                     (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7)))
2841                         return -EINVAL;
2842
2843                 params->vht_mumimo_groups = mumimo_groups;
2844                 change = true;
2845         }
2846
2847         if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) {
2848                 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
2849
2850                 if (type != NL80211_IFTYPE_MONITOR)
2851                         return -EINVAL;
2852
2853                 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
2854                         return -EOPNOTSUPP;
2855
2856                 params->vht_mumimo_follow_addr =
2857                         nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]);
2858                 change = true;
2859         }
2860
2861         return change ? 1 : 0;
2862 }
2863
2864 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev,
2865                                struct net_device *netdev, u8 use_4addr,
2866                                enum nl80211_iftype iftype)
2867 {
2868         if (!use_4addr) {
2869                 if (netdev && (netdev->priv_flags & IFF_BRIDGE_PORT))
2870                         return -EBUSY;
2871                 return 0;
2872         }
2873
2874         switch (iftype) {
2875         case NL80211_IFTYPE_AP_VLAN:
2876                 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP)
2877                         return 0;
2878                 break;
2879         case NL80211_IFTYPE_STATION:
2880                 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION)
2881                         return 0;
2882                 break;
2883         default:
2884                 break;
2885         }
2886
2887         return -EOPNOTSUPP;
2888 }
2889
2890 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
2891 {
2892         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2893         struct vif_params params;
2894         int err;
2895         enum nl80211_iftype otype, ntype;
2896         struct net_device *dev = info->user_ptr[1];
2897         bool change = false;
2898
2899         memset(&params, 0, sizeof(params));
2900
2901         otype = ntype = dev->ieee80211_ptr->iftype;
2902
2903         if (info->attrs[NL80211_ATTR_IFTYPE]) {
2904                 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
2905                 if (otype != ntype)
2906                         change = true;
2907                 if (ntype > NL80211_IFTYPE_MAX)
2908                         return -EINVAL;
2909         }
2910
2911         if (info->attrs[NL80211_ATTR_MESH_ID]) {
2912                 struct wireless_dev *wdev = dev->ieee80211_ptr;
2913
2914                 if (ntype != NL80211_IFTYPE_MESH_POINT)
2915                         return -EINVAL;
2916                 if (netif_running(dev))
2917                         return -EBUSY;
2918
2919                 wdev_lock(wdev);
2920                 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
2921                              IEEE80211_MAX_MESH_ID_LEN);
2922                 wdev->mesh_id_up_len =
2923                         nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
2924                 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
2925                        wdev->mesh_id_up_len);
2926                 wdev_unlock(wdev);
2927         }
2928
2929         if (info->attrs[NL80211_ATTR_4ADDR]) {
2930                 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
2931                 change = true;
2932                 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype);
2933                 if (err)
2934                         return err;
2935         } else {
2936                 params.use_4addr = -1;
2937         }
2938
2939         err = nl80211_parse_mon_options(rdev, ntype, info, &params);
2940         if (err < 0)
2941                 return err;
2942         if (err > 0)
2943                 change = true;
2944
2945         if (change)
2946                 err = cfg80211_change_iface(rdev, dev, ntype, &params);
2947         else
2948                 err = 0;
2949
2950         if (!err && params.use_4addr != -1)
2951                 dev->ieee80211_ptr->use_4addr = params.use_4addr;
2952
2953         return err;
2954 }
2955
2956 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
2957 {
2958         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2959         struct vif_params params;
2960         struct wireless_dev *wdev;
2961         struct sk_buff *msg;
2962         int err;
2963         enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
2964
2965         /* to avoid failing a new interface creation due to pending removal */
2966         cfg80211_destroy_ifaces(rdev);
2967
2968         memset(&params, 0, sizeof(params));
2969
2970         if (!info->attrs[NL80211_ATTR_IFNAME])
2971                 return -EINVAL;
2972
2973         if (info->attrs[NL80211_ATTR_IFTYPE]) {
2974                 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
2975                 if (type > NL80211_IFTYPE_MAX)
2976                         return -EINVAL;
2977         }
2978
2979         if (!rdev->ops->add_virtual_intf ||
2980             !(rdev->wiphy.interface_modes & (1 << type)))
2981                 return -EOPNOTSUPP;
2982
2983         if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN ||
2984              rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) &&
2985             info->attrs[NL80211_ATTR_MAC]) {
2986                 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC],
2987                            ETH_ALEN);
2988                 if (!is_valid_ether_addr(params.macaddr))
2989                         return -EADDRNOTAVAIL;
2990         }
2991
2992         if (info->attrs[NL80211_ATTR_4ADDR]) {
2993                 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
2994                 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type);
2995                 if (err)
2996                         return err;
2997         }
2998
2999         err = nl80211_parse_mon_options(rdev, type, info, &params);
3000         if (err < 0)
3001                 return err;
3002
3003         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3004         if (!msg)
3005                 return -ENOMEM;
3006
3007         wdev = rdev_add_virtual_intf(rdev,
3008                                 nla_data(info->attrs[NL80211_ATTR_IFNAME]),
3009                                 NET_NAME_USER, type, &params);
3010         if (WARN_ON(!wdev)) {
3011                 nlmsg_free(msg);
3012                 return -EPROTO;
3013         } else if (IS_ERR(wdev)) {
3014                 nlmsg_free(msg);
3015                 return PTR_ERR(wdev);
3016         }
3017
3018         if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
3019                 wdev->owner_nlportid = info->snd_portid;
3020
3021         switch (type) {
3022         case NL80211_IFTYPE_MESH_POINT:
3023                 if (!info->attrs[NL80211_ATTR_MESH_ID])
3024                         break;
3025                 wdev_lock(wdev);
3026                 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
3027                              IEEE80211_MAX_MESH_ID_LEN);
3028                 wdev->mesh_id_up_len =
3029                         nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
3030                 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
3031                        wdev->mesh_id_up_len);
3032                 wdev_unlock(wdev);
3033                 break;
3034         case NL80211_IFTYPE_NAN:
3035         case NL80211_IFTYPE_P2P_DEVICE:
3036                 /*
3037                  * P2P Device and NAN do not have a netdev, so don't go
3038                  * through the netdev notifier and must be added here
3039                  */
3040                 mutex_init(&wdev->mtx);
3041                 INIT_LIST_HEAD(&wdev->event_list);
3042                 spin_lock_init(&wdev->event_lock);
3043                 INIT_LIST_HEAD(&wdev->mgmt_registrations);
3044                 spin_lock_init(&wdev->mgmt_registrations_lock);
3045
3046                 wdev->identifier = ++rdev->wdev_id;
3047                 list_add_rcu(&wdev->list, &rdev->wiphy.wdev_list);
3048                 rdev->devlist_generation++;
3049                 break;
3050         default:
3051                 break;
3052         }
3053
3054         if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
3055                                rdev, wdev, false) < 0) {
3056                 nlmsg_free(msg);
3057                 return -ENOBUFS;
3058         }
3059
3060         /*
3061          * For wdevs which have no associated netdev object (e.g. of type
3062          * NL80211_IFTYPE_P2P_DEVICE), emit the NEW_INTERFACE event here.
3063          * For all other types, the event will be generated from the
3064          * netdev notifier
3065          */
3066         if (!wdev->netdev)
3067                 nl80211_notify_iface(rdev, wdev, NL80211_CMD_NEW_INTERFACE);
3068
3069         return genlmsg_reply(msg, info);
3070 }
3071
3072 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
3073 {
3074         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3075         struct wireless_dev *wdev = info->user_ptr[1];
3076
3077         if (!rdev->ops->del_virtual_intf)
3078                 return -EOPNOTSUPP;
3079
3080         /*
3081          * If we remove a wireless device without a netdev then clear
3082          * user_ptr[1] so that nl80211_post_doit won't dereference it
3083          * to check if it needs to do dev_put(). Otherwise it crashes
3084          * since the wdev has been freed, unlike with a netdev where
3085          * we need the dev_put() for the netdev to really be freed.
3086          */
3087         if (!wdev->netdev)
3088                 info->user_ptr[1] = NULL;
3089
3090         return rdev_del_virtual_intf(rdev, wdev);
3091 }
3092
3093 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info)
3094 {
3095         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3096         struct net_device *dev = info->user_ptr[1];
3097         u16 noack_map;
3098
3099         if (!info->attrs[NL80211_ATTR_NOACK_MAP])
3100                 return -EINVAL;
3101
3102         if (!rdev->ops->set_noack_map)
3103                 return -EOPNOTSUPP;
3104
3105         noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]);
3106
3107         return rdev_set_noack_map(rdev, dev, noack_map);
3108 }
3109
3110 struct get_key_cookie {
3111         struct sk_buff *msg;
3112         int error;
3113         int idx;
3114 };
3115
3116 static void get_key_callback(void *c, struct key_params *params)
3117 {
3118         struct nlattr *key;
3119         struct get_key_cookie *cookie = c;
3120
3121         if ((params->key &&
3122              nla_put(cookie->msg, NL80211_ATTR_KEY_DATA,
3123                      params->key_len, params->key)) ||
3124             (params->seq &&
3125              nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ,
3126                      params->seq_len, params->seq)) ||
3127             (params->cipher &&
3128              nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER,
3129                          params->cipher)))
3130                 goto nla_put_failure;
3131
3132         key = nla_nest_start(cookie->msg, NL80211_ATTR_KEY);
3133         if (!key)
3134                 goto nla_put_failure;
3135
3136         if ((params->key &&
3137              nla_put(cookie->msg, NL80211_KEY_DATA,
3138                      params->key_len, params->key)) ||
3139             (params->seq &&
3140              nla_put(cookie->msg, NL80211_KEY_SEQ,
3141                      params->seq_len, params->seq)) ||
3142             (params->cipher &&
3143              nla_put_u32(cookie->msg, NL80211_KEY_CIPHER,
3144                          params->cipher)))
3145                 goto nla_put_failure;
3146
3147         if (nla_put_u8(cookie->msg, NL80211_ATTR_KEY_IDX, cookie->idx))
3148                 goto nla_put_failure;
3149
3150         nla_nest_end(cookie->msg, key);
3151
3152         return;
3153  nla_put_failure:
3154         cookie->error = 1;
3155 }
3156
3157 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
3158 {
3159         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3160         int err;
3161         struct net_device *dev = info->user_ptr[1];
3162         u8 key_idx = 0;
3163         const u8 *mac_addr = NULL;
3164         bool pairwise;
3165         struct get_key_cookie cookie = {
3166                 .error = 0,
3167         };
3168         void *hdr;
3169         struct sk_buff *msg;
3170
3171         if (info->attrs[NL80211_ATTR_KEY_IDX])
3172                 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
3173
3174         if (key_idx > 5)
3175                 return -EINVAL;
3176
3177         if (info->attrs[NL80211_ATTR_MAC])
3178                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3179
3180         pairwise = !!mac_addr;
3181         if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
3182                 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
3183
3184                 if (kt >= NUM_NL80211_KEYTYPES)
3185                         return -EINVAL;
3186                 if (kt != NL80211_KEYTYPE_GROUP &&
3187                     kt != NL80211_KEYTYPE_PAIRWISE)
3188                         return -EINVAL;
3189                 pairwise = kt == NL80211_KEYTYPE_PAIRWISE;
3190         }
3191
3192         if (!rdev->ops->get_key)
3193                 return -EOPNOTSUPP;
3194
3195         if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
3196                 return -ENOENT;
3197
3198         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3199         if (!msg)
3200                 return -ENOMEM;
3201
3202         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
3203                              NL80211_CMD_NEW_KEY);
3204         if (!hdr)
3205                 goto nla_put_failure;
3206
3207         cookie.msg = msg;
3208         cookie.idx = key_idx;
3209
3210         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
3211             nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx))
3212                 goto nla_put_failure;
3213         if (mac_addr &&
3214             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
3215                 goto nla_put_failure;
3216
3217         err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie,
3218                            get_key_callback);
3219
3220         if (err)
3221                 goto free_msg;
3222
3223         if (cookie.error)
3224                 goto nla_put_failure;
3225
3226         genlmsg_end(msg, hdr);
3227         return genlmsg_reply(msg, info);
3228
3229  nla_put_failure:
3230         err = -ENOBUFS;
3231  free_msg:
3232         nlmsg_free(msg);
3233         return err;
3234 }
3235
3236 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
3237 {
3238         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3239         struct key_parse key;
3240         int err;
3241         struct net_device *dev = info->user_ptr[1];
3242
3243         err = nl80211_parse_key(info, &key);
3244         if (err)
3245                 return err;
3246
3247         if (key.idx < 0)
3248                 return -EINVAL;
3249
3250         /* only support setting default key */
3251         if (!key.def && !key.defmgmt)
3252                 return -EINVAL;
3253
3254         wdev_lock(dev->ieee80211_ptr);
3255
3256         if (key.def) {
3257                 if (!rdev->ops->set_default_key) {
3258                         err = -EOPNOTSUPP;
3259                         goto out;
3260                 }
3261
3262                 err = nl80211_key_allowed(dev->ieee80211_ptr);
3263                 if (err)
3264                         goto out;
3265
3266                 err = rdev_set_default_key(rdev, dev, key.idx,
3267                                                  key.def_uni, key.def_multi);
3268
3269                 if (err)
3270                         goto out;
3271
3272 #ifdef CONFIG_CFG80211_WEXT
3273                 dev->ieee80211_ptr->wext.default_key = key.idx;
3274 #endif
3275         } else {
3276                 if (key.def_uni || !key.def_multi) {
3277                         err = -EINVAL;
3278                         goto out;
3279                 }
3280
3281                 if (!rdev->ops->set_default_mgmt_key) {
3282                         err = -EOPNOTSUPP;
3283                         goto out;
3284                 }
3285
3286                 err = nl80211_key_allowed(dev->ieee80211_ptr);
3287                 if (err)
3288                         goto out;
3289
3290                 err = rdev_set_default_mgmt_key(rdev, dev, key.idx);
3291                 if (err)
3292                         goto out;
3293
3294 #ifdef CONFIG_CFG80211_WEXT
3295                 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx;
3296 #endif
3297         }
3298
3299  out:
3300         wdev_unlock(dev->ieee80211_ptr);
3301
3302         return err;
3303 }
3304
3305 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
3306 {
3307         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3308         int err;
3309         struct net_device *dev = info->user_ptr[1];
3310         struct key_parse key;
3311         const u8 *mac_addr = NULL;
3312
3313         err = nl80211_parse_key(info, &key);
3314         if (err)
3315                 return err;
3316
3317         if (!key.p.key)
3318                 return -EINVAL;
3319
3320         if (info->attrs[NL80211_ATTR_MAC])
3321                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3322
3323         if (key.type == -1) {
3324                 if (mac_addr)
3325                         key.type = NL80211_KEYTYPE_PAIRWISE;
3326                 else
3327                         key.type = NL80211_KEYTYPE_GROUP;
3328         }
3329
3330         /* for now */
3331         if (key.type != NL80211_KEYTYPE_PAIRWISE &&
3332             key.type != NL80211_KEYTYPE_GROUP)
3333                 return -EINVAL;
3334
3335         if (!rdev->ops->add_key)
3336                 return -EOPNOTSUPP;
3337
3338         if (cfg80211_validate_key_settings(rdev, &key.p, key.idx,
3339                                            key.type == NL80211_KEYTYPE_PAIRWISE,
3340                                            mac_addr))
3341                 return -EINVAL;
3342
3343         wdev_lock(dev->ieee80211_ptr);
3344         err = nl80211_key_allowed(dev->ieee80211_ptr);
3345         if (!err)
3346                 err = rdev_add_key(rdev, dev, key.idx,
3347                                    key.type == NL80211_KEYTYPE_PAIRWISE,
3348                                     mac_addr, &key.p);
3349         wdev_unlock(dev->ieee80211_ptr);
3350
3351         return err;
3352 }
3353
3354 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
3355 {
3356         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3357         int err;
3358         struct net_device *dev = info->user_ptr[1];
3359         u8 *mac_addr = NULL;
3360         struct key_parse key;
3361
3362         err = nl80211_parse_key(info, &key);
3363         if (err)
3364                 return err;
3365
3366         if (info->attrs[NL80211_ATTR_MAC])
3367                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3368
3369         if (key.type == -1) {
3370                 if (mac_addr)
3371                         key.type = NL80211_KEYTYPE_PAIRWISE;
3372                 else
3373                         key.type = NL80211_KEYTYPE_GROUP;
3374         }
3375
3376         /* for now */
3377         if (key.type != NL80211_KEYTYPE_PAIRWISE &&
3378             key.type != NL80211_KEYTYPE_GROUP)
3379                 return -EINVAL;
3380
3381         if (!rdev->ops->del_key)
3382                 return -EOPNOTSUPP;
3383
3384         wdev_lock(dev->ieee80211_ptr);
3385         err = nl80211_key_allowed(dev->ieee80211_ptr);
3386
3387         if (key.type == NL80211_KEYTYPE_GROUP && mac_addr &&
3388             !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
3389                 err = -ENOENT;
3390
3391         if (!err)
3392                 err = rdev_del_key(rdev, dev, key.idx,
3393                                    key.type == NL80211_KEYTYPE_PAIRWISE,
3394                                    mac_addr);
3395
3396 #ifdef CONFIG_CFG80211_WEXT
3397         if (!err) {
3398                 if (key.idx == dev->ieee80211_ptr->wext.default_key)
3399                         dev->ieee80211_ptr->wext.default_key = -1;
3400                 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key)
3401                         dev->ieee80211_ptr->wext.default_mgmt_key = -1;
3402         }
3403 #endif
3404         wdev_unlock(dev->ieee80211_ptr);
3405
3406         return err;
3407 }
3408
3409 /* This function returns an error or the number of nested attributes */
3410 static int validate_acl_mac_addrs(struct nlattr *nl_attr)
3411 {
3412         struct nlattr *attr;
3413         int n_entries = 0, tmp;
3414
3415         nla_for_each_nested(attr, nl_attr, tmp) {
3416                 if (nla_len(attr) != ETH_ALEN)
3417                         return -EINVAL;
3418
3419                 n_entries++;
3420         }
3421
3422         return n_entries;
3423 }
3424
3425 /*
3426  * This function parses ACL information and allocates memory for ACL data.
3427  * On successful return, the calling function is responsible to free the
3428  * ACL buffer returned by this function.
3429  */
3430 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy,
3431                                                 struct genl_info *info)
3432 {
3433         enum nl80211_acl_policy acl_policy;
3434         struct nlattr *attr;
3435         struct cfg80211_acl_data *acl;
3436         int i = 0, n_entries, tmp;
3437
3438         if (!wiphy->max_acl_mac_addrs)
3439                 return ERR_PTR(-EOPNOTSUPP);
3440
3441         if (!info->attrs[NL80211_ATTR_ACL_POLICY])
3442                 return ERR_PTR(-EINVAL);
3443
3444         acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]);
3445         if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED &&
3446             acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED)
3447                 return ERR_PTR(-EINVAL);
3448
3449         if (!info->attrs[NL80211_ATTR_MAC_ADDRS])
3450                 return ERR_PTR(-EINVAL);
3451
3452         n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]);
3453         if (n_entries < 0)
3454                 return ERR_PTR(n_entries);
3455
3456         if (n_entries > wiphy->max_acl_mac_addrs)
3457                 return ERR_PTR(-ENOTSUPP);
3458
3459         acl = kzalloc(sizeof(*acl) + (sizeof(struct mac_address) * n_entries),
3460                       GFP_KERNEL);
3461         if (!acl)
3462                 return ERR_PTR(-ENOMEM);
3463
3464         nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) {
3465                 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN);
3466                 i++;
3467         }
3468
3469         acl->n_acl_entries = n_entries;
3470         acl->acl_policy = acl_policy;
3471
3472         return acl;
3473 }
3474
3475 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info)
3476 {
3477         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3478         struct net_device *dev = info->user_ptr[1];
3479         struct cfg80211_acl_data *acl;
3480         int err;
3481
3482         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3483             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3484                 return -EOPNOTSUPP;
3485
3486         if (!dev->ieee80211_ptr->beacon_interval)
3487                 return -EINVAL;
3488
3489         acl = parse_acl_data(&rdev->wiphy, info);
3490         if (IS_ERR(acl))
3491                 return PTR_ERR(acl);
3492
3493         err = rdev_set_mac_acl(rdev, dev, acl);
3494
3495         kfree(acl);
3496
3497         return err;
3498 }
3499
3500 static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
3501                            u8 *rates, u8 rates_len)
3502 {
3503         u8 i;
3504         u32 mask = 0;
3505
3506         for (i = 0; i < rates_len; i++) {
3507                 int rate = (rates[i] & 0x7f) * 5;
3508                 int ridx;
3509
3510                 for (ridx = 0; ridx < sband->n_bitrates; ridx++) {
3511                         struct ieee80211_rate *srate =
3512                                 &sband->bitrates[ridx];
3513                         if (rate == srate->bitrate) {
3514                                 mask |= 1 << ridx;
3515                                 break;
3516                         }
3517                 }
3518                 if (ridx == sband->n_bitrates)
3519                         return 0; /* rate not found */
3520         }
3521
3522         return mask;
3523 }
3524
3525 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband,
3526                                u8 *rates, u8 rates_len,
3527                                u8 mcs[IEEE80211_HT_MCS_MASK_LEN])
3528 {
3529         u8 i;
3530
3531         memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN);
3532
3533         for (i = 0; i < rates_len; i++) {
3534                 int ridx, rbit;
3535
3536                 ridx = rates[i] / 8;
3537                 rbit = BIT(rates[i] % 8);
3538
3539                 /* check validity */
3540                 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN))
3541                         return false;
3542
3543                 /* check availability */
3544                 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit)
3545                         mcs[ridx] |= rbit;
3546                 else
3547                         return false;
3548         }
3549
3550         return true;
3551 }
3552
3553 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map)
3554 {
3555         u16 mcs_mask = 0;
3556
3557         switch (vht_mcs_map) {
3558         case IEEE80211_VHT_MCS_NOT_SUPPORTED:
3559                 break;
3560         case IEEE80211_VHT_MCS_SUPPORT_0_7:
3561                 mcs_mask = 0x00FF;
3562                 break;
3563         case IEEE80211_VHT_MCS_SUPPORT_0_8:
3564                 mcs_mask = 0x01FF;
3565                 break;
3566         case IEEE80211_VHT_MCS_SUPPORT_0_9:
3567                 mcs_mask = 0x03FF;
3568                 break;
3569         default:
3570                 break;
3571         }
3572
3573         return mcs_mask;
3574 }
3575
3576 static void vht_build_mcs_mask(u16 vht_mcs_map,
3577                                u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
3578 {
3579         u8 nss;
3580
3581         for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
3582                 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03);
3583                 vht_mcs_map >>= 2;
3584         }
3585 }
3586
3587 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband,
3588                              struct nl80211_txrate_vht *txrate,
3589                              u16 mcs[NL80211_VHT_NSS_MAX])
3590 {
3591         u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
3592         u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {};
3593         u8 i;
3594
3595         if (!sband->vht_cap.vht_supported)
3596                 return false;
3597
3598         memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX);
3599
3600         /* Build vht_mcs_mask from VHT capabilities */
3601         vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask);
3602
3603         for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
3604                 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
3605                         mcs[i] = txrate->mcs[i];
3606                 else
3607                         return false;
3608         }
3609
3610         return true;
3611 }
3612
3613 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
3614         [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY,
3615                                     .len = NL80211_MAX_SUPP_RATES },
3616         [NL80211_TXRATE_HT] = { .type = NLA_BINARY,
3617                                 .len = NL80211_MAX_SUPP_HT_RATES },
3618         [NL80211_TXRATE_VHT] = { .len = sizeof(struct nl80211_txrate_vht)},
3619         [NL80211_TXRATE_GI] = { .type = NLA_U8 },
3620 };
3621
3622 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
3623                                          struct cfg80211_bitrate_mask *mask)
3624 {
3625         struct nlattr *tb[NL80211_TXRATE_MAX + 1];
3626         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3627         int rem, i;
3628         struct nlattr *tx_rates;
3629         struct ieee80211_supported_band *sband;
3630         u16 vht_tx_mcs_map;
3631
3632         memset(mask, 0, sizeof(*mask));
3633         /* Default to all rates enabled */
3634         for (i = 0; i < NUM_NL80211_BANDS; i++) {
3635                 sband = rdev->wiphy.bands[i];
3636
3637                 if (!sband)
3638                         continue;
3639
3640                 mask->control[i].legacy = (1 << sband->n_bitrates) - 1;
3641                 memcpy(mask->control[i].ht_mcs,
3642                        sband->ht_cap.mcs.rx_mask,
3643                        sizeof(mask->control[i].ht_mcs));
3644
3645                 if (!sband->vht_cap.vht_supported)
3646                         continue;
3647
3648                 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
3649                 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs);
3650         }
3651
3652         /* if no rates are given set it back to the defaults */
3653         if (!info->attrs[NL80211_ATTR_TX_RATES])
3654                 goto out;
3655
3656         /* The nested attribute uses enum nl80211_band as the index. This maps
3657          * directly to the enum nl80211_band values used in cfg80211.
3658          */
3659         BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
3660         nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem) {
3661                 enum nl80211_band band = nla_type(tx_rates);
3662                 int err;
3663
3664                 if (band < 0 || band >= NUM_NL80211_BANDS)
3665                         return -EINVAL;
3666                 sband = rdev->wiphy.bands[band];
3667                 if (sband == NULL)
3668                         return -EINVAL;
3669                 err = nla_parse_nested(tb, NL80211_TXRATE_MAX, tx_rates,
3670                                        nl80211_txattr_policy, info->extack);
3671                 if (err)
3672                         return err;
3673                 if (tb[NL80211_TXRATE_LEGACY]) {
3674                         mask->control[band].legacy = rateset_to_mask(
3675                                 sband,
3676                                 nla_data(tb[NL80211_TXRATE_LEGACY]),
3677                                 nla_len(tb[NL80211_TXRATE_LEGACY]));
3678                         if ((mask->control[band].legacy == 0) &&
3679                             nla_len(tb[NL80211_TXRATE_LEGACY]))
3680                                 return -EINVAL;
3681                 }
3682                 if (tb[NL80211_TXRATE_HT]) {
3683                         if (!ht_rateset_to_mask(
3684                                         sband,
3685                                         nla_data(tb[NL80211_TXRATE_HT]),
3686                                         nla_len(tb[NL80211_TXRATE_HT]),
3687                                         mask->control[band].ht_mcs))
3688                                 return -EINVAL;
3689                 }
3690                 if (tb[NL80211_TXRATE_VHT]) {
3691                         if (!vht_set_mcs_mask(
3692                                         sband,
3693                                         nla_data(tb[NL80211_TXRATE_VHT]),
3694                                         mask->control[band].vht_mcs))
3695                                 return -EINVAL;
3696                 }
3697                 if (tb[NL80211_TXRATE_GI]) {
3698                         mask->control[band].gi =
3699                                 nla_get_u8(tb[NL80211_TXRATE_GI]);
3700                         if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI)
3701                                 return -EINVAL;
3702                 }
3703
3704                 if (mask->control[band].legacy == 0) {
3705                         /* don't allow empty legacy rates if HT or VHT
3706                          * are not even supported.
3707                          */
3708                         if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported ||
3709                               rdev->wiphy.bands[band]->vht_cap.vht_supported))
3710                                 return -EINVAL;
3711
3712                         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
3713                                 if (mask->control[band].ht_mcs[i])
3714                                         goto out;
3715
3716                         for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
3717                                 if (mask->control[band].vht_mcs[i])
3718                                         goto out;
3719
3720                         /* legacy and mcs rates may not be both empty */
3721                         return -EINVAL;
3722                 }
3723         }
3724
3725 out:
3726         return 0;
3727 }
3728
3729 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev,
3730                                    enum nl80211_band band,
3731                                    struct cfg80211_bitrate_mask *beacon_rate)
3732 {
3733         u32 count_ht, count_vht, i;
3734         u32 rate = beacon_rate->control[band].legacy;
3735
3736         /* Allow only one rate */
3737         if (hweight32(rate) > 1)
3738                 return -EINVAL;
3739
3740         count_ht = 0;
3741         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
3742                 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) {
3743                         return -EINVAL;
3744                 } else if (beacon_rate->control[band].ht_mcs[i]) {
3745                         count_ht++;
3746                         if (count_ht > 1)
3747                                 return -EINVAL;
3748                 }
3749                 if (count_ht && rate)
3750                         return -EINVAL;
3751         }
3752
3753         count_vht = 0;
3754         for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
3755                 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) {
3756                         return -EINVAL;
3757                 } else if (beacon_rate->control[band].vht_mcs[i]) {
3758                         count_vht++;
3759                         if (count_vht > 1)
3760                                 return -EINVAL;
3761                 }
3762                 if (count_vht && rate)
3763                         return -EINVAL;
3764         }
3765
3766         if ((count_ht && count_vht) || (!rate && !count_ht && !count_vht))
3767                 return -EINVAL;
3768
3769         if (rate &&
3770             !wiphy_ext_feature_isset(&rdev->wiphy,
3771                                      NL80211_EXT_FEATURE_BEACON_RATE_LEGACY))
3772                 return -EINVAL;
3773         if (count_ht &&
3774             !wiphy_ext_feature_isset(&rdev->wiphy,
3775                                      NL80211_EXT_FEATURE_BEACON_RATE_HT))
3776                 return -EINVAL;
3777         if (count_vht &&
3778             !wiphy_ext_feature_isset(&rdev->wiphy,
3779                                      NL80211_EXT_FEATURE_BEACON_RATE_VHT))
3780                 return -EINVAL;
3781
3782         return 0;
3783 }
3784
3785 static int nl80211_parse_beacon(struct nlattr *attrs[],
3786                                 struct cfg80211_beacon_data *bcn)
3787 {
3788         bool haveinfo = false;
3789
3790         if (!is_valid_ie_attr(attrs[NL80211_ATTR_BEACON_TAIL]) ||
3791             !is_valid_ie_attr(attrs[NL80211_ATTR_IE]) ||
3792             !is_valid_ie_attr(attrs[NL80211_ATTR_IE_PROBE_RESP]) ||
3793             !is_valid_ie_attr(attrs[NL80211_ATTR_IE_ASSOC_RESP]))
3794                 return -EINVAL;
3795
3796         memset(bcn, 0, sizeof(*bcn));
3797
3798         if (attrs[NL80211_ATTR_BEACON_HEAD]) {
3799                 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]);
3800                 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]);
3801                 if (!bcn->head_len)
3802                         return -EINVAL;
3803                 haveinfo = true;
3804         }
3805
3806         if (attrs[NL80211_ATTR_BEACON_TAIL]) {
3807                 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]);
3808                 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]);
3809                 haveinfo = true;
3810         }
3811
3812         if (!haveinfo)
3813                 return -EINVAL;
3814
3815         if (attrs[NL80211_ATTR_IE]) {
3816                 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]);
3817                 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]);
3818         }
3819
3820         if (attrs[NL80211_ATTR_IE_PROBE_RESP]) {
3821                 bcn->proberesp_ies =
3822                         nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]);
3823                 bcn->proberesp_ies_len =
3824                         nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]);
3825         }
3826
3827         if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) {
3828                 bcn->assocresp_ies =
3829                         nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
3830                 bcn->assocresp_ies_len =
3831                         nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
3832         }
3833
3834         if (attrs[NL80211_ATTR_PROBE_RESP]) {
3835                 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]);
3836                 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]);
3837         }
3838
3839         return 0;
3840 }
3841
3842 static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params,
3843                                             const u8 *rates)
3844 {
3845         int i;
3846
3847         if (!rates)
3848                 return;
3849
3850         for (i = 0; i < rates[1]; i++) {
3851                 if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
3852                         params->ht_required = true;
3853                 if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY)
3854                         params->vht_required = true;
3855         }
3856 }
3857
3858 /*
3859  * Since the nl80211 API didn't include, from the beginning, attributes about
3860  * HT/VHT requirements/capabilities, we parse them out of the IEs for the
3861  * benefit of drivers that rebuild IEs in the firmware.
3862  */
3863 static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params)
3864 {
3865         const struct cfg80211_beacon_data *bcn = &params->beacon;
3866         size_t ies_len = bcn->tail_len;
3867         const u8 *ies = bcn->tail;
3868         const u8 *rates;
3869         const u8 *cap;
3870
3871         rates = cfg80211_find_ie(WLAN_EID_SUPP_RATES, ies, ies_len);
3872         nl80211_check_ap_rate_selectors(params, rates);
3873
3874         rates = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, ies, ies_len);
3875         nl80211_check_ap_rate_selectors(params, rates);
3876
3877         cap = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, ies, ies_len);
3878         if (cap && cap[1] >= sizeof(*params->ht_cap))
3879                 params->ht_cap = (void *)(cap + 2);
3880         cap = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, ies, ies_len);
3881         if (cap && cap[1] >= sizeof(*params->vht_cap))
3882                 params->vht_cap = (void *)(cap + 2);
3883 }
3884
3885 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
3886                                    struct cfg80211_ap_settings *params)
3887 {
3888         struct wireless_dev *wdev;
3889         bool ret = false;
3890
3891         list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
3892                 if (wdev->iftype != NL80211_IFTYPE_AP &&
3893                     wdev->iftype != NL80211_IFTYPE_P2P_GO)
3894                         continue;
3895
3896                 if (!wdev->preset_chandef.chan)
3897                         continue;
3898
3899                 params->chandef = wdev->preset_chandef;
3900                 ret = true;
3901                 break;
3902         }
3903
3904         return ret;
3905 }
3906
3907 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
3908                                     enum nl80211_auth_type auth_type,
3909                                     enum nl80211_commands cmd)
3910 {
3911         if (auth_type > NL80211_AUTHTYPE_MAX)
3912                 return false;
3913
3914         switch (cmd) {
3915         case NL80211_CMD_AUTHENTICATE:
3916                 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
3917                     auth_type == NL80211_AUTHTYPE_SAE)
3918                         return false;
3919                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
3920                                              NL80211_EXT_FEATURE_FILS_STA) &&
3921                     (auth_type == NL80211_AUTHTYPE_FILS_SK ||
3922                      auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
3923                      auth_type == NL80211_AUTHTYPE_FILS_PK))
3924                         return false;
3925                 return true;
3926         case NL80211_CMD_CONNECT:
3927                 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
3928                     auth_type == NL80211_AUTHTYPE_SAE)
3929                         return false;
3930
3931                 /* FILS with SK PFS or PK not supported yet */
3932                 if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
3933                     auth_type == NL80211_AUTHTYPE_FILS_PK)
3934                         return false;
3935                 if (!wiphy_ext_feature_isset(
3936                             &rdev->wiphy,
3937                             NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
3938                     auth_type == NL80211_AUTHTYPE_FILS_SK)
3939                         return false;
3940                 return true;
3941         case NL80211_CMD_START_AP:
3942                 /* SAE not supported yet */
3943                 if (auth_type == NL80211_AUTHTYPE_SAE)
3944                         return false;
3945                 /* FILS not supported yet */
3946                 if (auth_type == NL80211_AUTHTYPE_FILS_SK ||
3947                     auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
3948                     auth_type == NL80211_AUTHTYPE_FILS_PK)
3949                         return false;
3950                 return true;
3951         default:
3952                 return false;
3953         }
3954 }
3955
3956 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
3957 {
3958         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3959         struct net_device *dev = info->user_ptr[1];
3960         struct wireless_dev *wdev = dev->ieee80211_ptr;
3961         struct cfg80211_ap_settings params;
3962         int err;
3963
3964         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3965             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3966                 return -EOPNOTSUPP;
3967
3968         if (!rdev->ops->start_ap)
3969                 return -EOPNOTSUPP;
3970
3971         if (wdev->beacon_interval)
3972                 return -EALREADY;
3973
3974         memset(&params, 0, sizeof(params));
3975
3976         /* these are required for START_AP */
3977         if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
3978             !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
3979             !info->attrs[NL80211_ATTR_BEACON_HEAD])
3980                 return -EINVAL;
3981
3982         err = nl80211_parse_beacon(info->attrs, &params.beacon);
3983         if (err)
3984                 return err;
3985
3986         params.beacon_interval =
3987                 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
3988         params.dtim_period =
3989                 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
3990
3991         err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype,
3992                                            params.beacon_interval);
3993         if (err)
3994                 return err;
3995
3996         /*
3997          * In theory, some of these attributes should be required here
3998          * but since they were not used when the command was originally
3999          * added, keep them optional for old user space programs to let
4000          * them continue to work with drivers that do not need the
4001          * additional information -- drivers must check!
4002          */
4003         if (info->attrs[NL80211_ATTR_SSID]) {
4004                 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
4005                 params.ssid_len =
4006                         nla_len(info->attrs[NL80211_ATTR_SSID]);
4007                 if (params.ssid_len == 0 ||
4008                     params.ssid_len > IEEE80211_MAX_SSID_LEN)
4009                         return -EINVAL;
4010         }
4011
4012         if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) {
4013                 params.hidden_ssid = nla_get_u32(
4014                         info->attrs[NL80211_ATTR_HIDDEN_SSID]);
4015                 if (params.hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE &&
4016                     params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_LEN &&
4017                     params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_CONTENTS)
4018                         return -EINVAL;
4019         }
4020
4021         params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
4022
4023         if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
4024                 params.auth_type = nla_get_u32(
4025                         info->attrs[NL80211_ATTR_AUTH_TYPE]);
4026                 if (!nl80211_valid_auth_type(rdev, params.auth_type,
4027                                              NL80211_CMD_START_AP))
4028                         return -EINVAL;
4029         } else
4030                 params.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
4031
4032         err = nl80211_crypto_settings(rdev, info, &params.crypto,
4033                                       NL80211_MAX_NR_CIPHER_SUITES);
4034         if (err)
4035                 return err;
4036
4037         if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) {
4038                 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER))
4039                         return -EOPNOTSUPP;
4040                 params.inactivity_timeout = nla_get_u16(
4041                         info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]);
4042         }
4043
4044         if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
4045                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4046                         return -EINVAL;
4047                 params.p2p_ctwindow =
4048                         nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
4049                 if (params.p2p_ctwindow > 127)
4050                         return -EINVAL;
4051                 if (params.p2p_ctwindow != 0 &&
4052                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
4053                         return -EINVAL;
4054         }
4055
4056         if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
4057                 u8 tmp;
4058
4059                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4060                         return -EINVAL;
4061                 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
4062                 if (tmp > 1)
4063                         return -EINVAL;
4064                 params.p2p_opp_ps = tmp;
4065                 if (params.p2p_opp_ps != 0 &&
4066                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
4067                         return -EINVAL;
4068         }
4069
4070         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
4071                 err = nl80211_parse_chandef(rdev, info, &params.chandef);
4072                 if (err)
4073                         return err;
4074         } else if (wdev->preset_chandef.chan) {
4075                 params.chandef = wdev->preset_chandef;
4076         } else if (!nl80211_get_ap_channel(rdev, &params))
4077                 return -EINVAL;
4078
4079         if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef,
4080                                            wdev->iftype))
4081                 return -EINVAL;
4082
4083         if (info->attrs[NL80211_ATTR_TX_RATES]) {
4084                 err = nl80211_parse_tx_bitrate_mask(info, &params.beacon_rate);
4085                 if (err)
4086                         return err;
4087
4088                 err = validate_beacon_tx_rate(rdev, params.chandef.chan->band,
4089                                               &params.beacon_rate);
4090                 if (err)
4091                         return err;
4092         }
4093
4094         if (info->attrs[NL80211_ATTR_SMPS_MODE]) {
4095                 params.smps_mode =
4096                         nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]);
4097                 switch (params.smps_mode) {
4098                 case NL80211_SMPS_OFF:
4099                         break;
4100                 case NL80211_SMPS_STATIC:
4101                         if (!(rdev->wiphy.features &
4102                               NL80211_FEATURE_STATIC_SMPS))
4103                                 return -EINVAL;
4104                         break;
4105                 case NL80211_SMPS_DYNAMIC:
4106                         if (!(rdev->wiphy.features &
4107                               NL80211_FEATURE_DYNAMIC_SMPS))
4108                                 return -EINVAL;
4109                         break;
4110                 default:
4111                         return -EINVAL;
4112                 }
4113         } else {
4114                 params.smps_mode = NL80211_SMPS_OFF;
4115         }
4116
4117         params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
4118         if (params.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ])
4119                 return -EOPNOTSUPP;
4120
4121         if (info->attrs[NL80211_ATTR_ACL_POLICY]) {
4122                 params.acl = parse_acl_data(&rdev->wiphy, info);
4123                 if (IS_ERR(params.acl))
4124                         return PTR_ERR(params.acl);
4125         }
4126
4127         nl80211_calculate_ap_params(&params);
4128
4129         wdev_lock(wdev);
4130         err = rdev_start_ap(rdev, dev, &params);
4131         if (!err) {
4132                 wdev->preset_chandef = params.chandef;
4133                 wdev->beacon_interval = params.beacon_interval;
4134                 wdev->chandef = params.chandef;
4135                 wdev->ssid_len = params.ssid_len;
4136                 memcpy(wdev->ssid, params.ssid, wdev->ssid_len);
4137         }
4138         wdev_unlock(wdev);
4139
4140         kfree(params.acl);
4141
4142         return err;
4143 }
4144
4145 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
4146 {
4147         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4148         struct net_device *dev = info->user_ptr[1];
4149         struct wireless_dev *wdev = dev->ieee80211_ptr;
4150         struct cfg80211_beacon_data params;
4151         int err;
4152
4153         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
4154             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4155                 return -EOPNOTSUPP;
4156
4157         if (!rdev->ops->change_beacon)
4158                 return -EOPNOTSUPP;
4159
4160         if (!wdev->beacon_interval)
4161                 return -EINVAL;
4162
4163         err = nl80211_parse_beacon(info->attrs, &params);
4164         if (err)
4165                 return err;
4166
4167         wdev_lock(wdev);
4168         err = rdev_change_beacon(rdev, dev, &params);
4169         wdev_unlock(wdev);
4170
4171         return err;
4172 }
4173
4174 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info)
4175 {
4176         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4177         struct net_device *dev = info->user_ptr[1];
4178
4179         return cfg80211_stop_ap(rdev, dev, false);
4180 }
4181
4182 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
4183         [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG },
4184         [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
4185         [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
4186         [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
4187         [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG },
4188         [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG },
4189 };
4190
4191 static int parse_station_flags(struct genl_info *info,
4192                                enum nl80211_iftype iftype,
4193                                struct station_parameters *params)
4194 {
4195         struct nlattr *flags[NL80211_STA_FLAG_MAX + 1];
4196         struct nlattr *nla;
4197         int flag;
4198
4199         /*
4200          * Try parsing the new attribute first so userspace
4201          * can specify both for older kernels.
4202          */
4203         nla = info->attrs[NL80211_ATTR_STA_FLAGS2];
4204         if (nla) {
4205                 struct nl80211_sta_flag_update *sta_flags;
4206
4207                 sta_flags = nla_data(nla);
4208                 params->sta_flags_mask = sta_flags->mask;
4209                 params->sta_flags_set = sta_flags->set;
4210                 params->sta_flags_set &= params->sta_flags_mask;
4211                 if ((params->sta_flags_mask |
4212                      params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID))
4213                         return -EINVAL;
4214                 return 0;
4215         }
4216
4217         /* if present, parse the old attribute */
4218
4219         nla = info->attrs[NL80211_ATTR_STA_FLAGS];
4220         if (!nla)
4221                 return 0;
4222
4223         if (nla_parse_nested(flags, NL80211_STA_FLAG_MAX, nla,
4224                              sta_flags_policy, info->extack))
4225                 return -EINVAL;
4226
4227         /*
4228          * Only allow certain flags for interface types so that
4229          * other attributes are silently ignored. Remember that
4230          * this is backward compatibility code with old userspace
4231          * and shouldn't be hit in other cases anyway.
4232          */
4233         switch (iftype) {
4234         case NL80211_IFTYPE_AP:
4235         case NL80211_IFTYPE_AP_VLAN:
4236         case NL80211_IFTYPE_P2P_GO:
4237                 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
4238                                          BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
4239                                          BIT(NL80211_STA_FLAG_WME) |
4240                                          BIT(NL80211_STA_FLAG_MFP);
4241                 break;
4242         case NL80211_IFTYPE_P2P_CLIENT:
4243         case NL80211_IFTYPE_STATION:
4244                 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
4245                                          BIT(NL80211_STA_FLAG_TDLS_PEER);
4246                 break;
4247         case NL80211_IFTYPE_MESH_POINT:
4248                 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4249                                          BIT(NL80211_STA_FLAG_MFP) |
4250                                          BIT(NL80211_STA_FLAG_AUTHORIZED);
4251         default:
4252                 return -EINVAL;
4253         }
4254
4255         for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) {
4256                 if (flags[flag]) {
4257                         params->sta_flags_set |= (1<<flag);
4258
4259                         /* no longer support new API additions in old API */
4260                         if (flag > NL80211_STA_FLAG_MAX_OLD_API)
4261                                 return -EINVAL;
4262                 }
4263         }
4264
4265         return 0;
4266 }
4267
4268 static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info,
4269                                  int attr)
4270 {
4271         struct nlattr *rate;
4272         u32 bitrate;
4273         u16 bitrate_compat;
4274         enum nl80211_rate_info rate_flg;
4275
4276         rate = nla_nest_start(msg, attr);
4277         if (!rate)
4278                 return false;
4279
4280         /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
4281         bitrate = cfg80211_calculate_bitrate(info);
4282         /* report 16-bit bitrate only if we can */
4283         bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0;
4284         if (bitrate > 0 &&
4285             nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate))
4286                 return false;
4287         if (bitrate_compat > 0 &&
4288             nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat))
4289                 return false;
4290
4291         switch (info->bw) {
4292         case RATE_INFO_BW_5:
4293                 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH;
4294                 break;
4295         case RATE_INFO_BW_10:
4296                 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH;
4297                 break;
4298         default:
4299                 WARN_ON(1);
4300                 /* fall through */
4301         case RATE_INFO_BW_20:
4302                 rate_flg = 0;
4303                 break;
4304         case RATE_INFO_BW_40:
4305                 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH;
4306                 break;
4307         case RATE_INFO_BW_80:
4308                 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH;
4309                 break;
4310         case RATE_INFO_BW_160:
4311                 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH;
4312                 break;
4313         }
4314
4315         if (rate_flg && nla_put_flag(msg, rate_flg))
4316                 return false;
4317
4318         if (info->flags & RATE_INFO_FLAGS_MCS) {
4319                 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs))
4320                         return false;
4321                 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
4322                     nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
4323                         return false;
4324         } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) {
4325                 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs))
4326                         return false;
4327                 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss))
4328                         return false;
4329                 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
4330                     nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
4331                         return false;
4332         }
4333
4334         nla_nest_end(msg, rate);
4335         return true;
4336 }
4337
4338 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal,
4339                                int id)
4340 {
4341         void *attr;
4342         int i = 0;
4343
4344         if (!mask)
4345                 return true;
4346
4347         attr = nla_nest_start(msg, id);
4348         if (!attr)
4349                 return false;
4350
4351         for (i = 0; i < IEEE80211_MAX_CHAINS; i++) {
4352                 if (!(mask & BIT(i)))
4353                         continue;
4354
4355                 if (nla_put_u8(msg, i, signal[i]))
4356                         return false;
4357         }
4358
4359         nla_nest_end(msg, attr);
4360
4361         return true;
4362 }
4363
4364 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
4365                                 u32 seq, int flags,
4366                                 struct cfg80211_registered_device *rdev,
4367                                 struct net_device *dev,
4368                                 const u8 *mac_addr, struct station_info *sinfo)
4369 {
4370         void *hdr;
4371         struct nlattr *sinfoattr, *bss_param;
4372
4373         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
4374         if (!hdr)
4375                 return -1;
4376
4377         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
4378             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
4379             nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation))
4380                 goto nla_put_failure;
4381
4382         sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO);
4383         if (!sinfoattr)
4384                 goto nla_put_failure;
4385
4386 #define PUT_SINFO(attr, memb, type) do {                                \
4387         BUILD_BUG_ON(sizeof(type) == sizeof(u64));                      \
4388         if (sinfo->filled & (1ULL << NL80211_STA_INFO_ ## attr) &&      \
4389             nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr,            \
4390                              sinfo->memb))                              \
4391                 goto nla_put_failure;                                   \
4392         } while (0)
4393 #define PUT_SINFO_U64(attr, memb) do {                                  \
4394         if (sinfo->filled & (1ULL << NL80211_STA_INFO_ ## attr) &&      \
4395             nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr,           \
4396                               sinfo->memb, NL80211_STA_INFO_PAD))       \
4397                 goto nla_put_failure;                                   \
4398         } while (0)
4399
4400         PUT_SINFO(CONNECTED_TIME, connected_time, u32);
4401         PUT_SINFO(INACTIVE_TIME, inactive_time, u32);
4402
4403         if (sinfo->filled & (BIT(NL80211_STA_INFO_RX_BYTES) |
4404                              BIT(NL80211_STA_INFO_RX_BYTES64)) &&
4405             nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES,
4406                         (u32)sinfo->rx_bytes))
4407                 goto nla_put_failure;
4408
4409         if (sinfo->filled & (BIT(NL80211_STA_INFO_TX_BYTES) |
4410                              BIT(NL80211_STA_INFO_TX_BYTES64)) &&
4411             nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES,
4412                         (u32)sinfo->tx_bytes))
4413                 goto nla_put_failure;
4414
4415         PUT_SINFO_U64(RX_BYTES64, rx_bytes);
4416         PUT_SINFO_U64(TX_BYTES64, tx_bytes);
4417         PUT_SINFO(LLID, llid, u16);
4418         PUT_SINFO(PLID, plid, u16);
4419         PUT_SINFO(PLINK_STATE, plink_state, u8);
4420         PUT_SINFO_U64(RX_DURATION, rx_duration);
4421
4422         switch (rdev->wiphy.signal_type) {
4423         case CFG80211_SIGNAL_TYPE_MBM:
4424                 PUT_SINFO(SIGNAL, signal, u8);
4425                 PUT_SINFO(SIGNAL_AVG, signal_avg, u8);
4426                 break;
4427         default:
4428                 break;
4429         }
4430         if (sinfo->filled & BIT(NL80211_STA_INFO_CHAIN_SIGNAL)) {
4431                 if (!nl80211_put_signal(msg, sinfo->chains,
4432                                         sinfo->chain_signal,
4433                                         NL80211_STA_INFO_CHAIN_SIGNAL))
4434                         goto nla_put_failure;
4435         }
4436         if (sinfo->filled & BIT(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) {
4437                 if (!nl80211_put_signal(msg, sinfo->chains,
4438                                         sinfo->chain_signal_avg,
4439                                         NL80211_STA_INFO_CHAIN_SIGNAL_AVG))
4440                         goto nla_put_failure;
4441         }
4442         if (sinfo->filled & BIT(NL80211_STA_INFO_TX_BITRATE)) {
4443                 if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
4444                                           NL80211_STA_INFO_TX_BITRATE))
4445                         goto nla_put_failure;
4446         }
4447         if (sinfo->filled & BIT(NL80211_STA_INFO_RX_BITRATE)) {
4448                 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate,
4449                                           NL80211_STA_INFO_RX_BITRATE))
4450                         goto nla_put_failure;
4451         }
4452
4453         PUT_SINFO(RX_PACKETS, rx_packets, u32);
4454         PUT_SINFO(TX_PACKETS, tx_packets, u32);
4455         PUT_SINFO(TX_RETRIES, tx_retries, u32);
4456         PUT_SINFO(TX_FAILED, tx_failed, u32);
4457         PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32);
4458         PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32);
4459         PUT_SINFO(LOCAL_PM, local_pm, u32);
4460         PUT_SINFO(PEER_PM, peer_pm, u32);
4461         PUT_SINFO(NONPEER_PM, nonpeer_pm, u32);
4462
4463         if (sinfo->filled & BIT(NL80211_STA_INFO_BSS_PARAM)) {
4464                 bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM);
4465                 if (!bss_param)
4466                         goto nla_put_failure;
4467
4468                 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) &&
4469                      nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) ||
4470                     ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) &&
4471                      nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) ||
4472                     ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) &&
4473                      nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) ||
4474                     nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD,
4475                                sinfo->bss_param.dtim_period) ||
4476                     nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL,
4477                                 sinfo->bss_param.beacon_interval))
4478                         goto nla_put_failure;
4479
4480                 nla_nest_end(msg, bss_param);
4481         }
4482         if ((sinfo->filled & BIT(NL80211_STA_INFO_STA_FLAGS)) &&
4483             nla_put(msg, NL80211_STA_INFO_STA_FLAGS,
4484                     sizeof(struct nl80211_sta_flag_update),
4485                     &sinfo->sta_flags))
4486                 goto nla_put_failure;
4487
4488         PUT_SINFO_U64(T_OFFSET, t_offset);
4489         PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc);
4490         PUT_SINFO_U64(BEACON_RX, rx_beacon);
4491         PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
4492         PUT_SINFO(ACK_SIGNAL, ack_signal, u8);
4493
4494 #undef PUT_SINFO
4495 #undef PUT_SINFO_U64
4496
4497         if (sinfo->filled & BIT(NL80211_STA_INFO_TID_STATS)) {
4498                 struct nlattr *tidsattr;
4499                 int tid;
4500
4501                 tidsattr = nla_nest_start(msg, NL80211_STA_INFO_TID_STATS);
4502                 if (!tidsattr)
4503                         goto nla_put_failure;
4504
4505                 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) {
4506                         struct cfg80211_tid_stats *tidstats;
4507                         struct nlattr *tidattr;
4508
4509                         tidstats = &sinfo->pertid[tid];
4510
4511                         if (!tidstats->filled)
4512                                 continue;
4513
4514                         tidattr = nla_nest_start(msg, tid + 1);
4515                         if (!tidattr)
4516                                 goto nla_put_failure;
4517
4518 #define PUT_TIDVAL_U64(attr, memb) do {                                 \
4519         if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) &&       \
4520             nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr,          \
4521                               tidstats->memb, NL80211_TID_STATS_PAD))   \
4522                 goto nla_put_failure;                                   \
4523         } while (0)
4524
4525                         PUT_TIDVAL_U64(RX_MSDU, rx_msdu);
4526                         PUT_TIDVAL_U64(TX_MSDU, tx_msdu);
4527                         PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries);
4528                         PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed);
4529
4530 #undef PUT_TIDVAL_U64
4531                         nla_nest_end(msg, tidattr);
4532                 }
4533
4534                 nla_nest_end(msg, tidsattr);
4535         }
4536
4537         nla_nest_end(msg, sinfoattr);
4538
4539         if (sinfo->assoc_req_ies_len &&
4540             nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len,
4541                     sinfo->assoc_req_ies))
4542                 goto nla_put_failure;
4543
4544         genlmsg_end(msg, hdr);
4545         return 0;
4546
4547  nla_put_failure:
4548         genlmsg_cancel(msg, hdr);
4549         return -EMSGSIZE;
4550 }
4551
4552 static int nl80211_dump_station(struct sk_buff *skb,
4553                                 struct netlink_callback *cb)
4554 {
4555         struct station_info sinfo;
4556         struct cfg80211_registered_device *rdev;
4557         struct wireless_dev *wdev;
4558         u8 mac_addr[ETH_ALEN];
4559         int sta_idx = cb->args[2];
4560         int err;
4561
4562         rtnl_lock();
4563         err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
4564         if (err)
4565                 goto out_err;
4566
4567         if (!wdev->netdev) {
4568                 err = -EINVAL;
4569                 goto out_err;
4570         }
4571
4572         if (!rdev->ops->dump_station) {
4573                 err = -EOPNOTSUPP;
4574                 goto out_err;
4575         }
4576
4577         while (1) {
4578                 memset(&sinfo, 0, sizeof(sinfo));
4579                 err = rdev_dump_station(rdev, wdev->netdev, sta_idx,
4580                                         mac_addr, &sinfo);
4581                 if (err == -ENOENT)
4582                         break;
4583                 if (err)
4584                         goto out_err;
4585
4586                 if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION,
4587                                 NETLINK_CB(cb->skb).portid,
4588                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
4589                                 rdev, wdev->netdev, mac_addr,
4590                                 &sinfo) < 0)
4591                         goto out;
4592
4593                 sta_idx++;
4594         }
4595
4596  out:
4597         cb->args[2] = sta_idx;
4598         err = skb->len;
4599  out_err:
4600         rtnl_unlock();
4601
4602         return err;
4603 }
4604
4605 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
4606 {
4607         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4608         struct net_device *dev = info->user_ptr[1];
4609         struct station_info sinfo;
4610         struct sk_buff *msg;
4611         u8 *mac_addr = NULL;
4612         int err;
4613
4614         memset(&sinfo, 0, sizeof(sinfo));
4615
4616         if (!info->attrs[NL80211_ATTR_MAC])
4617                 return -EINVAL;
4618
4619         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4620
4621         if (!rdev->ops->get_station)
4622                 return -EOPNOTSUPP;
4623
4624         err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
4625         if (err)
4626                 return err;
4627
4628         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
4629         if (!msg)
4630                 return -ENOMEM;
4631
4632         if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION,
4633                                  info->snd_portid, info->snd_seq, 0,
4634                                  rdev, dev, mac_addr, &sinfo) < 0) {
4635                 nlmsg_free(msg);
4636                 return -ENOBUFS;
4637         }
4638
4639         return genlmsg_reply(msg, info);
4640 }
4641
4642 int cfg80211_check_station_change(struct wiphy *wiphy,
4643                                   struct station_parameters *params,
4644                                   enum cfg80211_station_type statype)
4645 {
4646         if (params->listen_interval != -1 &&
4647             statype != CFG80211_STA_AP_CLIENT_UNASSOC)
4648                 return -EINVAL;
4649
4650         if (params->support_p2p_ps != -1 &&
4651             statype != CFG80211_STA_AP_CLIENT_UNASSOC)
4652                 return -EINVAL;
4653
4654         if (params->aid &&
4655             !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) &&
4656             statype != CFG80211_STA_AP_CLIENT_UNASSOC)
4657                 return -EINVAL;
4658
4659         /* When you run into this, adjust the code below for the new flag */
4660         BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
4661
4662         switch (statype) {
4663         case CFG80211_STA_MESH_PEER_KERNEL:
4664         case CFG80211_STA_MESH_PEER_USER:
4665                 /*
4666                  * No ignoring the TDLS flag here -- the userspace mesh
4667                  * code doesn't have the bug of including TDLS in the
4668                  * mask everywhere.
4669                  */
4670                 if (params->sta_flags_mask &
4671                                 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4672                                   BIT(NL80211_STA_FLAG_MFP) |
4673                                   BIT(NL80211_STA_FLAG_AUTHORIZED)))
4674                         return -EINVAL;
4675                 break;
4676         case CFG80211_STA_TDLS_PEER_SETUP:
4677         case CFG80211_STA_TDLS_PEER_ACTIVE:
4678                 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
4679                         return -EINVAL;
4680                 /* ignore since it can't change */
4681                 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
4682                 break;
4683         default:
4684                 /* disallow mesh-specific things */
4685                 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION)
4686                         return -EINVAL;
4687                 if (params->local_pm)
4688                         return -EINVAL;
4689                 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
4690                         return -EINVAL;
4691         }
4692
4693         if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
4694             statype != CFG80211_STA_TDLS_PEER_ACTIVE) {
4695                 /* TDLS can't be set, ... */
4696                 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
4697                         return -EINVAL;
4698                 /*
4699                  * ... but don't bother the driver with it. This works around
4700                  * a hostapd/wpa_supplicant issue -- it always includes the
4701                  * TLDS_PEER flag in the mask even for AP mode.
4702                  */
4703                 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
4704         }
4705
4706         if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
4707             statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
4708                 /* reject other things that can't change */
4709                 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD)
4710                         return -EINVAL;
4711                 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY)
4712                         return -EINVAL;
4713                 if (params->supported_rates)
4714                         return -EINVAL;
4715                 if (params->ext_capab || params->ht_capa || params->vht_capa)
4716                         return -EINVAL;
4717         }
4718
4719         if (statype != CFG80211_STA_AP_CLIENT &&
4720             statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
4721                 if (params->vlan)
4722                         return -EINVAL;
4723         }
4724
4725         switch (statype) {
4726         case CFG80211_STA_AP_MLME_CLIENT:
4727                 /* Use this only for authorizing/unauthorizing a station */
4728                 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)))
4729                         return -EOPNOTSUPP;
4730                 break;
4731         case CFG80211_STA_AP_CLIENT:
4732         case CFG80211_STA_AP_CLIENT_UNASSOC:
4733                 /* accept only the listed bits */
4734                 if (params->sta_flags_mask &
4735                                 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
4736                                   BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4737                                   BIT(NL80211_STA_FLAG_ASSOCIATED) |
4738                                   BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
4739                                   BIT(NL80211_STA_FLAG_WME) |
4740                                   BIT(NL80211_STA_FLAG_MFP)))
4741                         return -EINVAL;
4742
4743                 /* but authenticated/associated only if driver handles it */
4744                 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
4745                     params->sta_flags_mask &
4746                                 (BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4747                                  BIT(NL80211_STA_FLAG_ASSOCIATED)))
4748                         return -EINVAL;
4749                 break;
4750         case CFG80211_STA_IBSS:
4751         case CFG80211_STA_AP_STA:
4752                 /* reject any changes other than AUTHORIZED */
4753                 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
4754                         return -EINVAL;
4755                 break;
4756         case CFG80211_STA_TDLS_PEER_SETUP:
4757                 /* reject any changes other than AUTHORIZED or WME */
4758                 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
4759                                                BIT(NL80211_STA_FLAG_WME)))
4760                         return -EINVAL;
4761                 /* force (at least) rates when authorizing */
4762                 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) &&
4763                     !params->supported_rates)
4764                         return -EINVAL;
4765                 break;
4766         case CFG80211_STA_TDLS_PEER_ACTIVE:
4767                 /* reject any changes */
4768                 return -EINVAL;
4769         case CFG80211_STA_MESH_PEER_KERNEL:
4770                 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
4771                         return -EINVAL;
4772                 break;
4773         case CFG80211_STA_MESH_PEER_USER:
4774                 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION &&
4775                     params->plink_action != NL80211_PLINK_ACTION_BLOCK)
4776                         return -EINVAL;
4777                 break;
4778         }
4779
4780         /*
4781          * Older kernel versions ignored this attribute entirely, so don't
4782          * reject attempts to update it but mark it as unused instead so the
4783          * driver won't look at the data.
4784          */
4785         if (statype != CFG80211_STA_AP_CLIENT_UNASSOC &&
4786             statype != CFG80211_STA_TDLS_PEER_SETUP)
4787                 params->opmode_notif_used = false;
4788
4789         return 0;
4790 }
4791 EXPORT_SYMBOL(cfg80211_check_station_change);
4792
4793 /*
4794  * Get vlan interface making sure it is running and on the right wiphy.
4795  */
4796 static struct net_device *get_vlan(struct genl_info *info,
4797                                    struct cfg80211_registered_device *rdev)
4798 {
4799         struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN];
4800         struct net_device *v;
4801         int ret;
4802
4803         if (!vlanattr)
4804                 return NULL;
4805
4806         v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr));
4807         if (!v)
4808                 return ERR_PTR(-ENODEV);
4809
4810         if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) {
4811                 ret = -EINVAL;
4812                 goto error;
4813         }
4814
4815         if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
4816             v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
4817             v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
4818                 ret = -EINVAL;
4819                 goto error;
4820         }
4821
4822         if (!netif_running(v)) {
4823                 ret = -ENETDOWN;
4824                 goto error;
4825         }
4826
4827         return v;
4828  error:
4829         dev_put(v);
4830         return ERR_PTR(ret);
4831 }
4832
4833 static const struct nla_policy
4834 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = {
4835         [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 },
4836         [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 },
4837 };
4838
4839 static int nl80211_parse_sta_wme(struct genl_info *info,
4840                                  struct station_parameters *params)
4841 {
4842         struct nlattr *tb[NL80211_STA_WME_MAX + 1];
4843         struct nlattr *nla;
4844         int err;
4845
4846         /* parse WME attributes if present */
4847         if (!info->attrs[NL80211_ATTR_STA_WME])
4848                 return 0;
4849
4850         nla = info->attrs[NL80211_ATTR_STA_WME];
4851         err = nla_parse_nested(tb, NL80211_STA_WME_MAX, nla,
4852                                nl80211_sta_wme_policy, info->extack);
4853         if (err)
4854                 return err;
4855
4856         if (tb[NL80211_STA_WME_UAPSD_QUEUES])
4857                 params->uapsd_queues = nla_get_u8(
4858                         tb[NL80211_STA_WME_UAPSD_QUEUES]);
4859         if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK)
4860                 return -EINVAL;
4861
4862         if (tb[NL80211_STA_WME_MAX_SP])
4863                 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]);
4864
4865         if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK)
4866                 return -EINVAL;
4867
4868         params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD;
4869
4870         return 0;
4871 }
4872
4873 static int nl80211_parse_sta_channel_info(struct genl_info *info,
4874                                       struct station_parameters *params)
4875 {
4876         if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
4877                 params->supported_channels =
4878                      nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
4879                 params->supported_channels_len =
4880                      nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
4881                 /*
4882                  * Need to include at least one (first channel, number of
4883                  * channels) tuple for each subband, and must have proper
4884                  * tuples for the rest of the data as well.
4885                  */
4886                 if (params->supported_channels_len < 2)
4887                         return -EINVAL;
4888                 if (params->supported_channels_len % 2)
4889                         return -EINVAL;
4890         }
4891
4892         if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
4893                 params->supported_oper_classes =
4894                  nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
4895                 params->supported_oper_classes_len =
4896                   nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
4897                 /*
4898                  * The value of the Length field of the Supported Operating
4899                  * Classes element is between 2 and 253.
4900                  */
4901                 if (params->supported_oper_classes_len < 2 ||
4902                     params->supported_oper_classes_len > 253)
4903                         return -EINVAL;
4904         }
4905         return 0;
4906 }
4907
4908 static int nl80211_set_station_tdls(struct genl_info *info,
4909                                     struct station_parameters *params)
4910 {
4911         int err;
4912         /* Dummy STA entry gets updated once the peer capabilities are known */
4913         if (info->attrs[NL80211_ATTR_PEER_AID])
4914                 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
4915         if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
4916                 params->ht_capa =
4917                         nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
4918         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
4919                 params->vht_capa =
4920                         nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
4921
4922         err = nl80211_parse_sta_channel_info(info, params);
4923         if (err)
4924                 return err;
4925
4926         return nl80211_parse_sta_wme(info, params);
4927 }
4928
4929 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
4930 {
4931         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4932         struct net_device *dev = info->user_ptr[1];
4933         struct station_parameters params;
4934         u8 *mac_addr;
4935         int err;
4936
4937         memset(&params, 0, sizeof(params));
4938
4939         if (!rdev->ops->change_station)
4940                 return -EOPNOTSUPP;
4941
4942         /*
4943          * AID and listen_interval properties can be set only for unassociated
4944          * station. Include these parameters here and will check them in
4945          * cfg80211_check_station_change().
4946          */
4947         if (info->attrs[NL80211_ATTR_STA_AID])
4948                 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
4949
4950         if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
4951                 params.listen_interval =
4952                      nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
4953         else
4954                 params.listen_interval = -1;
4955
4956         if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
4957                 u8 tmp;
4958
4959                 tmp = nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
4960                 if (tmp >= NUM_NL80211_P2P_PS_STATUS)
4961                         return -EINVAL;
4962
4963                 params.support_p2p_ps = tmp;
4964         } else {
4965                 params.support_p2p_ps = -1;
4966         }
4967
4968         if (!info->attrs[NL80211_ATTR_MAC])
4969                 return -EINVAL;
4970
4971         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4972
4973         if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
4974                 params.supported_rates =
4975                         nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
4976                 params.supported_rates_len =
4977                         nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
4978         }
4979
4980         if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
4981                 params.capability =
4982                         nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
4983                 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
4984         }
4985
4986         if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
4987                 params.ext_capab =
4988                         nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
4989                 params.ext_capab_len =
4990                         nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
4991         }
4992
4993         if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
4994                 return -EINVAL;
4995
4996         if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) {
4997                 params.plink_action =
4998                         nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
4999                 if (params.plink_action >= NUM_NL80211_PLINK_ACTIONS)
5000                         return -EINVAL;
5001         }
5002
5003         if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) {
5004                 params.plink_state =
5005                         nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]);
5006                 if (params.plink_state >= NUM_NL80211_PLINK_STATES)
5007                         return -EINVAL;
5008                 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) {
5009                         params.peer_aid = nla_get_u16(
5010                                 info->attrs[NL80211_ATTR_MESH_PEER_AID]);
5011                         if (params.peer_aid > IEEE80211_MAX_AID)
5012                                 return -EINVAL;
5013                 }
5014                 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE;
5015         }
5016
5017         if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) {
5018                 enum nl80211_mesh_power_mode pm = nla_get_u32(
5019                         info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]);
5020
5021                 if (pm <= NL80211_MESH_POWER_UNKNOWN ||
5022                     pm > NL80211_MESH_POWER_MAX)
5023                         return -EINVAL;
5024
5025                 params.local_pm = pm;
5026         }
5027
5028         if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
5029                 params.opmode_notif_used = true;
5030                 params.opmode_notif =
5031                         nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
5032         }
5033
5034         /* Include parameters for TDLS peer (will check later) */
5035         err = nl80211_set_station_tdls(info, &params);
5036         if (err)
5037                 return err;
5038
5039         params.vlan = get_vlan(info, rdev);
5040         if (IS_ERR(params.vlan))
5041                 return PTR_ERR(params.vlan);
5042
5043         switch (dev->ieee80211_ptr->iftype) {
5044         case NL80211_IFTYPE_AP:
5045         case NL80211_IFTYPE_AP_VLAN:
5046         case NL80211_IFTYPE_P2P_GO:
5047         case NL80211_IFTYPE_P2P_CLIENT:
5048         case NL80211_IFTYPE_STATION:
5049         case NL80211_IFTYPE_ADHOC:
5050         case NL80211_IFTYPE_MESH_POINT:
5051                 break;
5052         default:
5053                 err = -EOPNOTSUPP;
5054                 goto out_put_vlan;
5055         }
5056
5057         /* driver will call cfg80211_check_station_change() */
5058         err = rdev_change_station(rdev, dev, mac_addr, &params);
5059
5060  out_put_vlan:
5061         if (params.vlan)
5062                 dev_put(params.vlan);
5063
5064         return err;
5065 }
5066
5067 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
5068 {
5069         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5070         int err;
5071         struct net_device *dev = info->user_ptr[1];
5072         struct station_parameters params;
5073         u8 *mac_addr = NULL;
5074         u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
5075                          BIT(NL80211_STA_FLAG_ASSOCIATED);
5076
5077         memset(&params, 0, sizeof(params));
5078
5079         if (!rdev->ops->add_station)
5080                 return -EOPNOTSUPP;
5081
5082         if (!info->attrs[NL80211_ATTR_MAC])
5083                 return -EINVAL;
5084
5085         if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
5086                 return -EINVAL;
5087
5088         if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
5089                 return -EINVAL;
5090
5091         if (!info->attrs[NL80211_ATTR_STA_AID] &&
5092             !info->attrs[NL80211_ATTR_PEER_AID])
5093                 return -EINVAL;
5094
5095         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
5096         params.supported_rates =
5097                 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
5098         params.supported_rates_len =
5099                 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
5100         params.listen_interval =
5101                 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
5102
5103         if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
5104                 u8 tmp;
5105
5106                 tmp = nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
5107                 if (tmp >= NUM_NL80211_P2P_PS_STATUS)
5108                         return -EINVAL;
5109
5110                 params.support_p2p_ps = tmp;
5111         } else {
5112                 /*
5113                  * if not specified, assume it's supported for P2P GO interface,
5114                  * and is NOT supported for AP interface
5115                  */
5116                 params.support_p2p_ps =
5117                         dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO;
5118         }
5119
5120         if (info->attrs[NL80211_ATTR_PEER_AID])
5121                 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
5122         else
5123                 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
5124         if (!params.aid || params.aid > IEEE80211_MAX_AID)
5125                 return -EINVAL;
5126
5127         if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
5128                 params.capability =
5129                         nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
5130                 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
5131         }
5132
5133         if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
5134                 params.ext_capab =
5135                         nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
5136                 params.ext_capab_len =
5137                         nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
5138         }
5139
5140         if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
5141                 params.ht_capa =
5142                         nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
5143
5144         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
5145                 params.vht_capa =
5146                         nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
5147
5148         if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
5149                 params.opmode_notif_used = true;
5150                 params.opmode_notif =
5151                         nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
5152         }
5153
5154         if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) {
5155                 params.plink_action =
5156                         nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
5157                 if (params.plink_action >= NUM_NL80211_PLINK_ACTIONS)
5158                         return -EINVAL;
5159         }
5160
5161         err = nl80211_parse_sta_channel_info(info, &params);
5162         if (err)
5163                 return err;
5164
5165         err = nl80211_parse_sta_wme(info, &params);
5166         if (err)
5167                 return err;
5168
5169         if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
5170                 return -EINVAL;
5171
5172         /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT
5173          * as userspace might just pass through the capabilities from the IEs
5174          * directly, rather than enforcing this restriction and returning an
5175          * error in this case.
5176          */
5177         if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) {
5178                 params.ht_capa = NULL;
5179                 params.vht_capa = NULL;
5180         }
5181
5182         /* When you run into this, adjust the code below for the new flag */
5183         BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
5184
5185         switch (dev->ieee80211_ptr->iftype) {
5186         case NL80211_IFTYPE_AP:
5187         case NL80211_IFTYPE_AP_VLAN:
5188         case NL80211_IFTYPE_P2P_GO:
5189                 /* ignore WME attributes if iface/sta is not capable */
5190                 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) ||
5191                     !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME)))
5192                         params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
5193
5194                 /* TDLS peers cannot be added */
5195                 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
5196                     info->attrs[NL80211_ATTR_PEER_AID])
5197                         return -EINVAL;
5198                 /* but don't bother the driver with it */
5199                 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
5200
5201                 /* allow authenticated/associated only if driver handles it */
5202                 if (!(rdev->wiphy.features &
5203                                 NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
5204                     params.sta_flags_mask & auth_assoc)
5205                         return -EINVAL;
5206
5207                 /* Older userspace, or userspace wanting to be compatible with
5208                  * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth
5209                  * and assoc flags in the mask, but assumes the station will be
5210                  * added as associated anyway since this was the required driver
5211                  * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was
5212                  * introduced.
5213                  * In order to not bother drivers with this quirk in the API
5214                  * set the flags in both the mask and set for new stations in
5215                  * this case.
5216                  */
5217                 if (!(params.sta_flags_mask & auth_assoc)) {
5218                         params.sta_flags_mask |= auth_assoc;
5219                         params.sta_flags_set |= auth_assoc;
5220                 }
5221
5222                 /* must be last in here for error handling */
5223                 params.vlan = get_vlan(info, rdev);
5224                 if (IS_ERR(params.vlan))
5225                         return PTR_ERR(params.vlan);
5226                 break;
5227         case NL80211_IFTYPE_MESH_POINT:
5228                 /* ignore uAPSD data */
5229                 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
5230
5231                 /* associated is disallowed */
5232                 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED))
5233                         return -EINVAL;
5234                 /* TDLS peers cannot be added */
5235                 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
5236                     info->attrs[NL80211_ATTR_PEER_AID])
5237                         return -EINVAL;
5238                 break;
5239         case NL80211_IFTYPE_STATION:
5240         case NL80211_IFTYPE_P2P_CLIENT:
5241                 /* ignore uAPSD data */
5242                 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
5243
5244                 /* these are disallowed */
5245                 if (params.sta_flags_mask &
5246                                 (BIT(NL80211_STA_FLAG_ASSOCIATED) |
5247                                  BIT(NL80211_STA_FLAG_AUTHENTICATED)))
5248                         return -EINVAL;
5249                 /* Only TDLS peers can be added */
5250                 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
5251                         return -EINVAL;
5252                 /* Can only add if TDLS ... */
5253                 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS))
5254                         return -EOPNOTSUPP;
5255                 /* ... with external setup is supported */
5256                 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP))
5257                         return -EOPNOTSUPP;
5258                 /*
5259                  * Older wpa_supplicant versions always mark the TDLS peer
5260                  * as authorized, but it shouldn't yet be.
5261                  */
5262                 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED);
5263                 break;
5264         default:
5265                 return -EOPNOTSUPP;
5266         }
5267
5268         /* be aware of params.vlan when changing code here */
5269
5270         err = rdev_add_station(rdev, dev, mac_addr, &params);
5271
5272         if (params.vlan)
5273                 dev_put(params.vlan);
5274         return err;
5275 }
5276
5277 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
5278 {
5279         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5280         struct net_device *dev = info->user_ptr[1];
5281         struct station_del_parameters params;
5282
5283         memset(&params, 0, sizeof(params));
5284
5285         if (info->attrs[NL80211_ATTR_MAC])
5286                 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]);
5287
5288         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
5289             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
5290             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
5291             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5292                 return -EINVAL;
5293
5294         if (!rdev->ops->del_station)
5295                 return -EOPNOTSUPP;
5296
5297         if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) {
5298                 params.subtype =
5299                         nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]);
5300                 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 &&
5301                     params.subtype != IEEE80211_STYPE_DEAUTH >> 4)
5302                         return -EINVAL;
5303         } else {
5304                 /* Default to Deauthentication frame */
5305                 params.subtype = IEEE80211_STYPE_DEAUTH >> 4;
5306         }
5307
5308         if (info->attrs[NL80211_ATTR_REASON_CODE]) {
5309                 params.reason_code =
5310                         nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
5311                 if (params.reason_code == 0)
5312                         return -EINVAL; /* 0 is reserved */
5313         } else {
5314                 /* Default to reason code 2 */
5315                 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID;
5316         }
5317
5318         return rdev_del_station(rdev, dev, &params);
5319 }
5320
5321 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq,
5322                                 int flags, struct net_device *dev,
5323                                 u8 *dst, u8 *next_hop,
5324                                 struct mpath_info *pinfo)
5325 {
5326         void *hdr;
5327         struct nlattr *pinfoattr;
5328
5329         hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH);
5330         if (!hdr)
5331                 return -1;
5332
5333         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
5334             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) ||
5335             nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) ||
5336             nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation))
5337                 goto nla_put_failure;
5338
5339         pinfoattr = nla_nest_start(msg, NL80211_ATTR_MPATH_INFO);
5340         if (!pinfoattr)
5341                 goto nla_put_failure;
5342         if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) &&
5343             nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN,
5344                         pinfo->frame_qlen))
5345                 goto nla_put_failure;
5346         if (((pinfo->filled & MPATH_INFO_SN) &&
5347              nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) ||
5348             ((pinfo->filled & MPATH_INFO_METRIC) &&
5349              nla_put_u32(msg, NL80211_MPATH_INFO_METRIC,
5350                          pinfo->metric)) ||
5351             ((pinfo->filled & MPATH_INFO_EXPTIME) &&
5352              nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME,
5353                          pinfo->exptime)) ||
5354             ((pinfo->filled & MPATH_INFO_FLAGS) &&
5355              nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS,
5356                         pinfo->flags)) ||
5357             ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) &&
5358              nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
5359                          pinfo->discovery_timeout)) ||
5360             ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) &&
5361              nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES,
5362                         pinfo->discovery_retries)))
5363                 goto nla_put_failure;
5364
5365         nla_nest_end(msg, pinfoattr);
5366
5367         genlmsg_end(msg, hdr);
5368         return 0;
5369
5370  nla_put_failure:
5371         genlmsg_cancel(msg, hdr);
5372         return -EMSGSIZE;
5373 }
5374
5375 static int nl80211_dump_mpath(struct sk_buff *skb,
5376                               struct netlink_callback *cb)
5377 {
5378         struct mpath_info pinfo;
5379         struct cfg80211_registered_device *rdev;
5380         struct wireless_dev *wdev;
5381         u8 dst[ETH_ALEN];
5382         u8 next_hop[ETH_ALEN];
5383         int path_idx = cb->args[2];
5384         int err;
5385
5386         rtnl_lock();
5387         err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
5388         if (err)
5389                 goto out_err;
5390
5391         if (!rdev->ops->dump_mpath) {
5392                 err = -EOPNOTSUPP;
5393                 goto out_err;
5394         }
5395
5396         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
5397                 err = -EOPNOTSUPP;
5398                 goto out_err;
5399         }
5400
5401         while (1) {
5402                 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst,
5403                                       next_hop, &pinfo);
5404                 if (err == -ENOENT)
5405                         break;
5406                 if (err)
5407                         goto out_err;
5408
5409                 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
5410                                        cb->nlh->nlmsg_seq, NLM_F_MULTI,
5411                                        wdev->netdev, dst, next_hop,
5412                                        &pinfo) < 0)
5413                         goto out;
5414
5415                 path_idx++;
5416         }
5417
5418  out:
5419         cb->args[2] = path_idx;
5420         err = skb->len;
5421  out_err:
5422         rtnl_unlock();
5423         return err;
5424 }
5425
5426 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
5427 {
5428         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5429         int err;
5430         struct net_device *dev = info->user_ptr[1];
5431         struct mpath_info pinfo;
5432         struct sk_buff *msg;
5433         u8 *dst = NULL;
5434         u8 next_hop[ETH_ALEN];
5435
5436         memset(&pinfo, 0, sizeof(pinfo));
5437
5438         if (!info->attrs[NL80211_ATTR_MAC])
5439                 return -EINVAL;
5440
5441         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
5442
5443         if (!rdev->ops->get_mpath)
5444                 return -EOPNOTSUPP;
5445
5446         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
5447                 return -EOPNOTSUPP;
5448
5449         err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo);
5450         if (err)
5451                 return err;
5452
5453         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
5454         if (!msg)
5455                 return -ENOMEM;
5456
5457         if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
5458                                  dev, dst, next_hop, &pinfo) < 0) {
5459                 nlmsg_free(msg);
5460                 return -ENOBUFS;
5461         }
5462
5463         return genlmsg_reply(msg, info);
5464 }
5465
5466 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
5467 {
5468         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5469         struct net_device *dev = info->user_ptr[1];
5470         u8 *dst = NULL;
5471         u8 *next_hop = NULL;
5472
5473         if (!info->attrs[NL80211_ATTR_MAC])
5474                 return -EINVAL;
5475
5476         if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
5477                 return -EINVAL;
5478
5479         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
5480         next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
5481
5482         if (!rdev->ops->change_mpath)
5483                 return -EOPNOTSUPP;
5484
5485         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
5486                 return -EOPNOTSUPP;
5487
5488         return rdev_change_mpath(rdev, dev, dst, next_hop);
5489 }
5490
5491 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
5492 {
5493         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5494         struct net_device *dev = info->user_ptr[1];
5495         u8 *dst = NULL;
5496         u8 *next_hop = NULL;
5497
5498         if (!info->attrs[NL80211_ATTR_MAC])
5499                 return -EINVAL;
5500
5501         if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
5502                 return -EINVAL;
5503
5504         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
5505         next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
5506
5507         if (!rdev->ops->add_mpath)
5508                 return -EOPNOTSUPP;
5509
5510         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
5511                 return -EOPNOTSUPP;
5512
5513         return rdev_add_mpath(rdev, dev, dst, next_hop);
5514 }
5515
5516 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
5517 {
5518         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5519         struct net_device *dev = info->user_ptr[1];
5520         u8 *dst = NULL;
5521
5522         if (info->attrs[NL80211_ATTR_MAC])
5523                 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
5524
5525         if (!rdev->ops->del_mpath)
5526                 return -EOPNOTSUPP;
5527
5528         return rdev_del_mpath(rdev, dev, dst);
5529 }
5530
5531 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info)
5532 {
5533         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5534         int err;
5535         struct net_device *dev = info->user_ptr[1];
5536         struct mpath_info pinfo;
5537         struct sk_buff *msg;
5538         u8 *dst = NULL;
5539         u8 mpp[ETH_ALEN];
5540
5541         memset(&pinfo, 0, sizeof(pinfo));
5542
5543         if (!info->attrs[NL80211_ATTR_MAC])
5544                 return -EINVAL;
5545
5546         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
5547
5548         if (!rdev->ops->get_mpp)
5549                 return -EOPNOTSUPP;
5550
5551         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
5552                 return -EOPNOTSUPP;
5553
5554         err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo);
5555         if (err)
5556                 return err;
5557
5558         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
5559         if (!msg)
5560                 return -ENOMEM;
5561
5562         if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
5563                                dev, dst, mpp, &pinfo) < 0) {
5564                 nlmsg_free(msg);
5565                 return -ENOBUFS;
5566         }
5567
5568         return genlmsg_reply(msg, info);
5569 }
5570
5571 static int nl80211_dump_mpp(struct sk_buff *skb,
5572                             struct netlink_callback *cb)
5573 {
5574         struct mpath_info pinfo;
5575         struct cfg80211_registered_device *rdev;
5576         struct wireless_dev *wdev;
5577         u8 dst[ETH_ALEN];
5578         u8 mpp[ETH_ALEN];
5579         int path_idx = cb->args[2];
5580         int err;
5581
5582         rtnl_lock();
5583         err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
5584         if (err)
5585                 goto out_err;
5586
5587         if (!rdev->ops->dump_mpp) {
5588                 err = -EOPNOTSUPP;
5589                 goto out_err;
5590         }
5591
5592         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
5593                 err = -EOPNOTSUPP;
5594                 goto out_err;
5595         }
5596
5597         while (1) {
5598                 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst,
5599                                     mpp, &pinfo);
5600                 if (err == -ENOENT)
5601                         break;
5602                 if (err)
5603                         goto out_err;
5604
5605                 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
5606                                        cb->nlh->nlmsg_seq, NLM_F_MULTI,
5607                                        wdev->netdev, dst, mpp,
5608                                        &pinfo) < 0)
5609                         goto out;
5610
5611                 path_idx++;
5612         }
5613
5614  out:
5615         cb->args[2] = path_idx;
5616         err = skb->len;
5617  out_err:
5618         rtnl_unlock();
5619         return err;
5620 }
5621
5622 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
5623 {
5624         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5625         struct net_device *dev = info->user_ptr[1];
5626         struct wireless_dev *wdev = dev->ieee80211_ptr;
5627         struct bss_parameters params;
5628         int err;
5629
5630         memset(&params, 0, sizeof(params));
5631         /* default to not changing parameters */
5632         params.use_cts_prot = -1;
5633         params.use_short_preamble = -1;
5634         params.use_short_slot_time = -1;
5635         params.ap_isolate = -1;
5636         params.ht_opmode = -1;
5637         params.p2p_ctwindow = -1;
5638         params.p2p_opp_ps = -1;
5639
5640         if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
5641                 params.use_cts_prot =
5642                     nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
5643         if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE])
5644                 params.use_short_preamble =
5645                     nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
5646         if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME])
5647                 params.use_short_slot_time =
5648                     nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
5649         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
5650                 params.basic_rates =
5651                         nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
5652                 params.basic_rates_len =
5653                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
5654         }
5655         if (info->attrs[NL80211_ATTR_AP_ISOLATE])
5656                 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]);
5657         if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE])
5658                 params.ht_opmode =
5659                         nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]);
5660
5661         if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
5662                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5663                         return -EINVAL;
5664                 params.p2p_ctwindow =
5665                         nla_get_s8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
5666                 if (params.p2p_ctwindow < 0)
5667                         return -EINVAL;
5668                 if (params.p2p_ctwindow != 0 &&
5669                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
5670                         return -EINVAL;
5671         }
5672
5673         if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
5674                 u8 tmp;
5675
5676                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5677                         return -EINVAL;
5678                 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
5679                 if (tmp > 1)
5680                         return -EINVAL;
5681                 params.p2p_opp_ps = tmp;
5682                 if (params.p2p_opp_ps &&
5683                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
5684                         return -EINVAL;
5685         }
5686
5687         if (!rdev->ops->change_bss)
5688                 return -EOPNOTSUPP;
5689
5690         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
5691             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
5692                 return -EOPNOTSUPP;
5693
5694         wdev_lock(wdev);
5695         err = rdev_change_bss(rdev, dev, &params);
5696         wdev_unlock(wdev);
5697
5698         return err;
5699 }
5700
5701 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
5702 {
5703         char *data = NULL;
5704         bool is_indoor;
5705         enum nl80211_user_reg_hint_type user_reg_hint_type;
5706         u32 owner_nlportid;
5707
5708         /*
5709          * You should only get this when cfg80211 hasn't yet initialized
5710          * completely when built-in to the kernel right between the time
5711          * window between nl80211_init() and regulatory_init(), if that is
5712          * even possible.
5713          */
5714         if (unlikely(!rcu_access_pointer(cfg80211_regdomain)))
5715                 return -EINPROGRESS;
5716
5717         if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE])
5718                 user_reg_hint_type =
5719                   nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]);
5720         else
5721                 user_reg_hint_type = NL80211_USER_REG_HINT_USER;
5722
5723         switch (user_reg_hint_type) {
5724         case NL80211_USER_REG_HINT_USER:
5725         case NL80211_USER_REG_HINT_CELL_BASE:
5726                 if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
5727                         return -EINVAL;
5728
5729                 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
5730                 return regulatory_hint_user(data, user_reg_hint_type);
5731         case NL80211_USER_REG_HINT_INDOOR:
5732                 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
5733                         owner_nlportid = info->snd_portid;
5734                         is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR];
5735                 } else {
5736                         owner_nlportid = 0;
5737                         is_indoor = true;
5738                 }
5739
5740                 return regulatory_hint_indoor(is_indoor, owner_nlportid);
5741         default:
5742                 return -EINVAL;
5743         }
5744 }
5745
5746 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info)
5747 {
5748         return reg_reload_regdb();
5749 }
5750
5751 static int nl80211_get_mesh_config(struct sk_buff *skb,
5752                                    struct genl_info *info)
5753 {
5754         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5755         struct net_device *dev = info->user_ptr[1];
5756         struct wireless_dev *wdev = dev->ieee80211_ptr;
5757         struct mesh_config cur_params;
5758         int err = 0;
5759         void *hdr;
5760         struct nlattr *pinfoattr;
5761         struct sk_buff *msg;
5762
5763         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
5764                 return -EOPNOTSUPP;
5765
5766         if (!rdev->ops->get_mesh_config)
5767                 return -EOPNOTSUPP;
5768
5769         wdev_lock(wdev);
5770         /* If not connected, get default parameters */
5771         if (!wdev->mesh_id_len)
5772                 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params));
5773         else
5774                 err = rdev_get_mesh_config(rdev, dev, &cur_params);
5775         wdev_unlock(wdev);
5776
5777         if (err)
5778                 return err;
5779
5780         /* Draw up a netlink message to send back */
5781         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
5782         if (!msg)
5783                 return -ENOMEM;
5784         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
5785                              NL80211_CMD_GET_MESH_CONFIG);
5786         if (!hdr)
5787                 goto out;
5788         pinfoattr = nla_nest_start(msg, NL80211_ATTR_MESH_CONFIG);
5789         if (!pinfoattr)
5790                 goto nla_put_failure;
5791         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
5792             nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT,
5793                         cur_params.dot11MeshRetryTimeout) ||
5794             nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT,
5795                         cur_params.dot11MeshConfirmTimeout) ||
5796             nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT,
5797                         cur_params.dot11MeshHoldingTimeout) ||
5798             nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
5799                         cur_params.dot11MeshMaxPeerLinks) ||
5800             nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES,
5801                        cur_params.dot11MeshMaxRetries) ||
5802             nla_put_u8(msg, NL80211_MESHCONF_TTL,
5803                        cur_params.dot11MeshTTL) ||
5804             nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL,
5805                        cur_params.element_ttl) ||
5806             nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
5807                        cur_params.auto_open_plinks) ||
5808             nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
5809                         cur_params.dot11MeshNbrOffsetMaxNeighbor) ||
5810             nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
5811                        cur_params.dot11MeshHWMPmaxPREQretries) ||
5812             nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME,
5813                         cur_params.path_refresh_time) ||
5814             nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
5815                         cur_params.min_discovery_timeout) ||
5816             nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
5817                         cur_params.dot11MeshHWMPactivePathTimeout) ||
5818             nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
5819                         cur_params.dot11MeshHWMPpreqMinInterval) ||
5820             nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
5821                         cur_params.dot11MeshHWMPperrMinInterval) ||
5822             nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
5823                         cur_params.dot11MeshHWMPnetDiameterTraversalTime) ||
5824             nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE,
5825                        cur_params.dot11MeshHWMPRootMode) ||
5826             nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
5827                         cur_params.dot11MeshHWMPRannInterval) ||
5828             nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
5829                        cur_params.dot11MeshGateAnnouncementProtocol) ||
5830             nla_put_u8(msg, NL80211_MESHCONF_FORWARDING,
5831                        cur_params.dot11MeshForwarding) ||
5832             nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD,
5833                         cur_params.rssi_threshold) ||
5834             nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE,
5835                         cur_params.ht_opmode) ||
5836             nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
5837                         cur_params.dot11MeshHWMPactivePathToRootTimeout) ||
5838             nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
5839                         cur_params.dot11MeshHWMProotInterval) ||
5840             nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
5841                         cur_params.dot11MeshHWMPconfirmationInterval) ||
5842             nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE,
5843                         cur_params.power_mode) ||
5844             nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW,
5845                         cur_params.dot11MeshAwakeWindowDuration) ||
5846             nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT,
5847                         cur_params.plink_timeout))
5848                 goto nla_put_failure;
5849         nla_nest_end(msg, pinfoattr);
5850         genlmsg_end(msg, hdr);
5851         return genlmsg_reply(msg, info);
5852
5853  nla_put_failure:
5854  out:
5855         nlmsg_free(msg);
5856         return -ENOBUFS;
5857 }
5858
5859 static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = {
5860         [NL80211_MESHCONF_RETRY_TIMEOUT] = { .type = NLA_U16 },
5861         [NL80211_MESHCONF_CONFIRM_TIMEOUT] = { .type = NLA_U16 },
5862         [NL80211_MESHCONF_HOLDING_TIMEOUT] = { .type = NLA_U16 },
5863         [NL80211_MESHCONF_MAX_PEER_LINKS] = { .type = NLA_U16 },
5864         [NL80211_MESHCONF_MAX_RETRIES] = { .type = NLA_U8 },
5865         [NL80211_MESHCONF_TTL] = { .type = NLA_U8 },
5866         [NL80211_MESHCONF_ELEMENT_TTL] = { .type = NLA_U8 },
5867         [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = { .type = NLA_U8 },
5868         [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = { .type = NLA_U32 },
5869         [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 },
5870         [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 },
5871         [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = { .type = NLA_U16 },
5872         [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
5873         [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = { .type = NLA_U16 },
5874         [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = { .type = NLA_U16 },
5875         [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = { .type = NLA_U16 },
5876         [NL80211_MESHCONF_HWMP_ROOTMODE] = { .type = NLA_U8 },
5877         [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = { .type = NLA_U16 },
5878         [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = { .type = NLA_U8 },
5879         [NL80211_MESHCONF_FORWARDING] = { .type = NLA_U8 },
5880         [NL80211_MESHCONF_RSSI_THRESHOLD] = { .type = NLA_U32 },
5881         [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 },
5882         [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 },
5883         [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = { .type = NLA_U16 },
5884         [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = { .type = NLA_U16 },
5885         [NL80211_MESHCONF_POWER_MODE] = { .type = NLA_U32 },
5886         [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 },
5887         [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 },
5888 };
5889
5890 static const struct nla_policy
5891         nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
5892         [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 },
5893         [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
5894         [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
5895         [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
5896         [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 },
5897         [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG },
5898         [NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY,
5899                                     .len = IEEE80211_MAX_DATA_LEN },
5900         [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG },
5901 };
5902
5903 static int nl80211_check_bool(const struct nlattr *nla, u8 min, u8 max, bool *out)
5904 {
5905         u8 val = nla_get_u8(nla);
5906         if (val < min || val > max)
5907                 return -EINVAL;
5908         *out = val;
5909         return 0;
5910 }
5911
5912 static int nl80211_check_u8(const struct nlattr *nla, u8 min, u8 max, u8 *out)
5913 {
5914         u8 val = nla_get_u8(nla);
5915         if (val < min || val > max)
5916                 return -EINVAL;
5917         *out = val;
5918         return 0;
5919 }
5920
5921 static int nl80211_check_u16(const struct nlattr *nla, u16 min, u16 max, u16 *out)
5922 {
5923         u16 val = nla_get_u16(nla);
5924         if (val < min || val > max)
5925                 return -EINVAL;
5926         *out = val;
5927         return 0;
5928 }
5929
5930 static int nl80211_check_u32(const struct nlattr *nla, u32 min, u32 max, u32 *out)
5931 {
5932         u32 val = nla_get_u32(nla);
5933         if (val < min || val > max)
5934                 return -EINVAL;
5935         *out = val;
5936         return 0;
5937 }
5938
5939 static int nl80211_check_s32(const struct nlattr *nla, s32 min, s32 max, s32 *out)
5940 {
5941         s32 val = nla_get_s32(nla);
5942         if (val < min || val > max)
5943                 return -EINVAL;
5944         *out = val;
5945         return 0;
5946 }
5947
5948 static int nl80211_check_power_mode(const struct nlattr *nla,
5949                                     enum nl80211_mesh_power_mode min,
5950                                     enum nl80211_mesh_power_mode max,
5951                                     enum nl80211_mesh_power_mode *out)
5952 {
5953         u32 val = nla_get_u32(nla);
5954         if (val < min || val > max)
5955                 return -EINVAL;
5956         *out = val;
5957         return 0;
5958 }
5959
5960 static int nl80211_parse_mesh_config(struct genl_info *info,
5961                                      struct mesh_config *cfg,
5962                                      u32 *mask_out)
5963 {
5964         struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1];
5965         u32 mask = 0;
5966         u16 ht_opmode;
5967
5968 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, min, max, mask, attr, fn) \
5969 do {                                                                        \
5970         if (tb[attr]) {                                                     \
5971                 if (fn(tb[attr], min, max, &cfg->param))                    \
5972                         return -EINVAL;                                     \
5973                 mask |= (1 << (attr - 1));                                  \
5974         }                                                                   \
5975 } while (0)
5976
5977         if (!info->attrs[NL80211_ATTR_MESH_CONFIG])
5978                 return -EINVAL;
5979         if (nla_parse_nested(tb, NL80211_MESHCONF_ATTR_MAX,
5980                              info->attrs[NL80211_ATTR_MESH_CONFIG],
5981                              nl80211_meshconf_params_policy, info->extack))
5982                 return -EINVAL;
5983
5984         /* This makes sure that there aren't more than 32 mesh config
5985          * parameters (otherwise our bitfield scheme would not work.) */
5986         BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
5987
5988         /* Fill in the params struct */
5989         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, 1, 255,
5990                                   mask, NL80211_MESHCONF_RETRY_TIMEOUT,
5991                                   nl80211_check_u16);
5992         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, 1, 255,
5993                                   mask, NL80211_MESHCONF_CONFIRM_TIMEOUT,
5994                                   nl80211_check_u16);
5995         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, 1, 255,
5996                                   mask, NL80211_MESHCONF_HOLDING_TIMEOUT,
5997                                   nl80211_check_u16);
5998         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, 0, 255,
5999                                   mask, NL80211_MESHCONF_MAX_PEER_LINKS,
6000                                   nl80211_check_u16);
6001         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, 0, 16,
6002                                   mask, NL80211_MESHCONF_MAX_RETRIES,
6003                                   nl80211_check_u8);
6004         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, 1, 255,
6005                                   mask, NL80211_MESHCONF_TTL, nl80211_check_u8);
6006         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, 1, 255,
6007                                   mask, NL80211_MESHCONF_ELEMENT_TTL,
6008                                   nl80211_check_u8);
6009         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, 0, 1,
6010                                   mask, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
6011                                   nl80211_check_bool);
6012         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor,
6013                                   1, 255, mask,
6014                                   NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
6015                                   nl80211_check_u32);
6016         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, 0, 255,
6017                                   mask, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
6018                                   nl80211_check_u8);
6019         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, 1, 65535,
6020                                   mask, NL80211_MESHCONF_PATH_REFRESH_TIME,
6021                                   nl80211_check_u32);
6022         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, 1, 65535,
6023                                   mask, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
6024                                   nl80211_check_u16);
6025         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout,
6026                                   1, 65535, mask,
6027                                   NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
6028                                   nl80211_check_u32);
6029         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval,
6030                                   1, 65535, mask,
6031                                   NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
6032                                   nl80211_check_u16);
6033         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval,
6034                                   1, 65535, mask,
6035                                   NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
6036                                   nl80211_check_u16);
6037         FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
6038                                   dot11MeshHWMPnetDiameterTraversalTime,
6039                                   1, 65535, mask,
6040                                   NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
6041                                   nl80211_check_u16);
6042         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, 0, 4,
6043                                   mask, NL80211_MESHCONF_HWMP_ROOTMODE,
6044                                   nl80211_check_u8);
6045         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, 1, 65535,
6046                                   mask, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
6047                                   nl80211_check_u16);
6048         FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
6049                                   dot11MeshGateAnnouncementProtocol, 0, 1,
6050                                   mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
6051                                   nl80211_check_bool);
6052         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, 0, 1,
6053                                   mask, NL80211_MESHCONF_FORWARDING,
6054                                   nl80211_check_bool);
6055         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, -255, 0,
6056                                   mask, NL80211_MESHCONF_RSSI_THRESHOLD,
6057                                   nl80211_check_s32);
6058         /*
6059          * Check HT operation mode based on
6060          * IEEE 802.11 2012 8.4.2.59 HT Operation element.
6061          */
6062         if (tb[NL80211_MESHCONF_HT_OPMODE]) {
6063                 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]);
6064
6065                 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION |
6066                                   IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT |
6067                                   IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
6068                         return -EINVAL;
6069
6070                 if ((ht_opmode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT) &&
6071                     (ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
6072                         return -EINVAL;
6073
6074                 switch (ht_opmode & IEEE80211_HT_OP_MODE_PROTECTION) {
6075                 case IEEE80211_HT_OP_MODE_PROTECTION_NONE:
6076                 case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ:
6077                         if (ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)
6078                                 return -EINVAL;
6079                         break;
6080                 case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER:
6081                 case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED:
6082                         if (!(ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
6083                                 return -EINVAL;
6084                         break;
6085                 }
6086                 cfg->ht_opmode = ht_opmode;
6087                 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1));
6088         }
6089         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathToRootTimeout,
6090                                   1, 65535, mask,
6091                                   NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
6092                                   nl80211_check_u32);
6093         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, 1, 65535,
6094                                   mask, NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
6095                                   nl80211_check_u16);
6096         FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
6097                                   dot11MeshHWMPconfirmationInterval,
6098                                   1, 65535, mask,
6099                                   NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
6100                                   nl80211_check_u16);
6101         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode,
6102                                   NL80211_MESH_POWER_ACTIVE,
6103                                   NL80211_MESH_POWER_MAX,
6104                                   mask, NL80211_MESHCONF_POWER_MODE,
6105                                   nl80211_check_power_mode);
6106         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration,
6107                                   0, 65535, mask,
6108                                   NL80211_MESHCONF_AWAKE_WINDOW, nl80211_check_u16);
6109         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, 0, 0xffffffff,
6110                                   mask, NL80211_MESHCONF_PLINK_TIMEOUT,
6111                                   nl80211_check_u32);
6112         if (mask_out)
6113                 *mask_out = mask;
6114
6115         return 0;
6116
6117 #undef FILL_IN_MESH_PARAM_IF_SET
6118 }
6119
6120 static int nl80211_parse_mesh_setup(struct genl_info *info,
6121                                      struct mesh_setup *setup)
6122 {
6123         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6124         struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1];
6125
6126         if (!info->attrs[NL80211_ATTR_MESH_SETUP])
6127                 return -EINVAL;
6128         if (nla_parse_nested(tb, NL80211_MESH_SETUP_ATTR_MAX,
6129                              info->attrs[NL80211_ATTR_MESH_SETUP],
6130                              nl80211_mesh_setup_params_policy, info->extack))
6131                 return -EINVAL;
6132
6133         if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])
6134                 setup->sync_method =
6135                 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ?
6136                  IEEE80211_SYNC_METHOD_VENDOR :
6137                  IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET;
6138
6139         if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])
6140                 setup->path_sel_proto =
6141                 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ?
6142                  IEEE80211_PATH_PROTOCOL_VENDOR :
6143                  IEEE80211_PATH_PROTOCOL_HWMP;
6144
6145         if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])
6146                 setup->path_metric =
6147                 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ?
6148                  IEEE80211_PATH_METRIC_VENDOR :
6149                  IEEE80211_PATH_METRIC_AIRTIME;
6150
6151         if (tb[NL80211_MESH_SETUP_IE]) {
6152                 struct nlattr *ieattr =
6153                         tb[NL80211_MESH_SETUP_IE];
6154                 if (!is_valid_ie_attr(ieattr))
6155                         return -EINVAL;
6156                 setup->ie = nla_data(ieattr);
6157                 setup->ie_len = nla_len(ieattr);
6158         }
6159         if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] &&
6160             !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM))
6161                 return -EINVAL;
6162         setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]);
6163         setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]);
6164         setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]);
6165         if (setup->is_secure)
6166                 setup->user_mpm = true;
6167
6168         if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) {
6169                 if (!setup->user_mpm)
6170                         return -EINVAL;
6171                 setup->auth_id =
6172                         nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]);
6173         }
6174
6175         return 0;
6176 }
6177
6178 static int nl80211_update_mesh_config(struct sk_buff *skb,
6179                                       struct genl_info *info)
6180 {
6181         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6182         struct net_device *dev = info->user_ptr[1];
6183         struct wireless_dev *wdev = dev->ieee80211_ptr;
6184         struct mesh_config cfg;
6185         u32 mask;
6186         int err;
6187
6188         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
6189                 return -EOPNOTSUPP;
6190
6191         if (!rdev->ops->update_mesh_config)
6192                 return -EOPNOTSUPP;
6193
6194         err = nl80211_parse_mesh_config(info, &cfg, &mask);
6195         if (err)
6196                 return err;
6197
6198         wdev_lock(wdev);
6199         if (!wdev->mesh_id_len)
6200                 err = -ENOLINK;
6201
6202         if (!err)
6203                 err = rdev_update_mesh_config(rdev, dev, mask, &cfg);
6204
6205         wdev_unlock(wdev);
6206
6207         return err;
6208 }
6209
6210 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom,
6211                               struct sk_buff *msg)
6212 {
6213         struct nlattr *nl_reg_rules;
6214         unsigned int i;
6215
6216         if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) ||
6217             (regdom->dfs_region &&
6218              nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region)))
6219                 goto nla_put_failure;
6220
6221         nl_reg_rules = nla_nest_start(msg, NL80211_ATTR_REG_RULES);
6222         if (!nl_reg_rules)
6223                 goto nla_put_failure;
6224
6225         for (i = 0; i < regdom->n_reg_rules; i++) {
6226                 struct nlattr *nl_reg_rule;
6227                 const struct ieee80211_reg_rule *reg_rule;
6228                 const struct ieee80211_freq_range *freq_range;
6229                 const struct ieee80211_power_rule *power_rule;
6230                 unsigned int max_bandwidth_khz;
6231
6232                 reg_rule = &regdom->reg_rules[i];
6233                 freq_range = &reg_rule->freq_range;
6234                 power_rule = &reg_rule->power_rule;
6235
6236                 nl_reg_rule = nla_nest_start(msg, i);
6237                 if (!nl_reg_rule)
6238                         goto nla_put_failure;
6239
6240                 max_bandwidth_khz = freq_range->max_bandwidth_khz;
6241                 if (!max_bandwidth_khz)
6242                         max_bandwidth_khz = reg_get_max_bandwidth(regdom,
6243                                                                   reg_rule);
6244
6245                 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS,
6246                                 reg_rule->flags) ||
6247                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START,
6248                                 freq_range->start_freq_khz) ||
6249                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END,
6250                                 freq_range->end_freq_khz) ||
6251                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW,
6252                                 max_bandwidth_khz) ||
6253                     nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
6254                                 power_rule->max_antenna_gain) ||
6255                     nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP,
6256                                 power_rule->max_eirp) ||
6257                     nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME,
6258                                 reg_rule->dfs_cac_ms))
6259                         goto nla_put_failure;
6260
6261                 nla_nest_end(msg, nl_reg_rule);
6262         }
6263
6264         nla_nest_end(msg, nl_reg_rules);
6265         return 0;
6266
6267 nla_put_failure:
6268         return -EMSGSIZE;
6269 }
6270
6271 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info)
6272 {
6273         const struct ieee80211_regdomain *regdom = NULL;
6274         struct cfg80211_registered_device *rdev;
6275         struct wiphy *wiphy = NULL;
6276         struct sk_buff *msg;
6277         void *hdr;
6278
6279         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
6280         if (!msg)
6281                 return -ENOBUFS;
6282
6283         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
6284                              NL80211_CMD_GET_REG);
6285         if (!hdr)
6286                 goto put_failure;
6287
6288         if (info->attrs[NL80211_ATTR_WIPHY]) {
6289                 bool self_managed;
6290
6291                 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
6292                 if (IS_ERR(rdev)) {
6293                         nlmsg_free(msg);
6294                         return PTR_ERR(rdev);
6295                 }
6296
6297                 wiphy = &rdev->wiphy;
6298                 self_managed = wiphy->regulatory_flags &
6299                                REGULATORY_WIPHY_SELF_MANAGED;
6300                 regdom = get_wiphy_regdom(wiphy);
6301
6302                 /* a self-managed-reg device must have a private regdom */
6303                 if (WARN_ON(!regdom && self_managed)) {
6304                         nlmsg_free(msg);
6305                         return -EINVAL;
6306                 }
6307
6308                 if (regdom &&
6309                     nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
6310                         goto nla_put_failure;
6311         }
6312
6313         if (!wiphy && reg_last_request_cell_base() &&
6314             nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
6315                         NL80211_USER_REG_HINT_CELL_BASE))
6316                 goto nla_put_failure;
6317
6318         rcu_read_lock();
6319
6320         if (!regdom)
6321                 regdom = rcu_dereference(cfg80211_regdomain);
6322
6323         if (nl80211_put_regdom(regdom, msg))
6324                 goto nla_put_failure_rcu;
6325
6326         rcu_read_unlock();
6327
6328         genlmsg_end(msg, hdr);
6329         return genlmsg_reply(msg, info);
6330
6331 nla_put_failure_rcu:
6332         rcu_read_unlock();
6333 nla_put_failure:
6334 put_failure:
6335         nlmsg_free(msg);
6336         return -EMSGSIZE;
6337 }
6338
6339 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb,
6340                                u32 seq, int flags, struct wiphy *wiphy,
6341                                const struct ieee80211_regdomain *regdom)
6342 {
6343         void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
6344                                    NL80211_CMD_GET_REG);
6345
6346         if (!hdr)
6347                 return -1;
6348
6349         genl_dump_check_consistent(cb, hdr);
6350
6351         if (nl80211_put_regdom(regdom, msg))
6352                 goto nla_put_failure;
6353
6354         if (!wiphy && reg_last_request_cell_base() &&
6355             nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
6356                         NL80211_USER_REG_HINT_CELL_BASE))
6357                 goto nla_put_failure;
6358
6359         if (wiphy &&
6360             nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
6361                 goto nla_put_failure;
6362
6363         if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
6364             nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
6365                 goto nla_put_failure;
6366
6367         genlmsg_end(msg, hdr);
6368         return 0;
6369
6370 nla_put_failure:
6371         genlmsg_cancel(msg, hdr);
6372         return -EMSGSIZE;
6373 }
6374
6375 static int nl80211_get_reg_dump(struct sk_buff *skb,
6376                                 struct netlink_callback *cb)
6377 {
6378         const struct ieee80211_regdomain *regdom = NULL;
6379         struct cfg80211_registered_device *rdev;
6380         int err, reg_idx, start = cb->args[2];
6381
6382         rtnl_lock();
6383
6384         if (cfg80211_regdomain && start == 0) {
6385                 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
6386                                           NLM_F_MULTI, NULL,
6387                                           rtnl_dereference(cfg80211_regdomain));
6388                 if (err < 0)
6389                         goto out_err;
6390         }
6391
6392         /* the global regdom is idx 0 */
6393         reg_idx = 1;
6394         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
6395                 regdom = get_wiphy_regdom(&rdev->wiphy);
6396                 if (!regdom)
6397                         continue;
6398
6399                 if (++reg_idx <= start)
6400                         continue;
6401
6402                 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
6403                                           NLM_F_MULTI, &rdev->wiphy, regdom);
6404                 if (err < 0) {
6405                         reg_idx--;
6406                         break;
6407                 }
6408         }
6409
6410         cb->args[2] = reg_idx;
6411         err = skb->len;
6412 out_err:
6413         rtnl_unlock();
6414         return err;
6415 }
6416
6417 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
6418 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
6419         [NL80211_ATTR_REG_RULE_FLAGS]           = { .type = NLA_U32 },
6420         [NL80211_ATTR_FREQ_RANGE_START]         = { .type = NLA_U32 },
6421         [NL80211_ATTR_FREQ_RANGE_END]           = { .type = NLA_U32 },
6422         [NL80211_ATTR_FREQ_RANGE_MAX_BW]        = { .type = NLA_U32 },
6423         [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]  = { .type = NLA_U32 },
6424         [NL80211_ATTR_POWER_RULE_MAX_EIRP]      = { .type = NLA_U32 },
6425         [NL80211_ATTR_DFS_CAC_TIME]             = { .type = NLA_U32 },
6426 };
6427
6428 static int parse_reg_rule(struct nlattr *tb[],
6429         struct ieee80211_reg_rule *reg_rule)
6430 {
6431         struct ieee80211_freq_range *freq_range = &reg_rule->freq_range;
6432         struct ieee80211_power_rule *power_rule = &reg_rule->power_rule;
6433
6434         if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
6435                 return -EINVAL;
6436         if (!tb[NL80211_ATTR_FREQ_RANGE_START])
6437                 return -EINVAL;
6438         if (!tb[NL80211_ATTR_FREQ_RANGE_END])
6439                 return -EINVAL;
6440         if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
6441                 return -EINVAL;
6442         if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
6443                 return -EINVAL;
6444
6445         reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
6446
6447         freq_range->start_freq_khz =
6448                 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
6449         freq_range->end_freq_khz =
6450                 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
6451         freq_range->max_bandwidth_khz =
6452                 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
6453
6454         power_rule->max_eirp =
6455                 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
6456
6457         if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
6458                 power_rule->max_antenna_gain =
6459                         nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
6460
6461         if (tb[NL80211_ATTR_DFS_CAC_TIME])
6462                 reg_rule->dfs_cac_ms =
6463                         nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]);
6464
6465         return 0;
6466 }
6467
6468 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
6469 {
6470         struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
6471         struct nlattr *nl_reg_rule;
6472         char *alpha2;
6473         int rem_reg_rules, r;
6474         u32 num_rules = 0, rule_idx = 0, size_of_regd;
6475         enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET;
6476         struct ieee80211_regdomain *rd;
6477
6478         if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
6479                 return -EINVAL;
6480
6481         if (!info->attrs[NL80211_ATTR_REG_RULES])
6482                 return -EINVAL;
6483
6484         alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
6485
6486         if (info->attrs[NL80211_ATTR_DFS_REGION])
6487                 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]);
6488
6489         nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
6490                             rem_reg_rules) {
6491                 num_rules++;
6492                 if (num_rules > NL80211_MAX_SUPP_REG_RULES)
6493                         return -EINVAL;
6494         }
6495
6496         if (!reg_is_valid_request(alpha2))
6497                 return -EINVAL;
6498
6499         size_of_regd = sizeof(struct ieee80211_regdomain) +
6500                        num_rules * sizeof(struct ieee80211_reg_rule);
6501
6502         rd = kzalloc(size_of_regd, GFP_KERNEL);
6503         if (!rd)
6504                 return -ENOMEM;
6505
6506         rd->n_reg_rules = num_rules;
6507         rd->alpha2[0] = alpha2[0];
6508         rd->alpha2[1] = alpha2[1];
6509
6510         /*
6511          * Disable DFS master mode if the DFS region was
6512          * not supported or known on this kernel.
6513          */
6514         if (reg_supported_dfs_region(dfs_region))
6515                 rd->dfs_region = dfs_region;
6516
6517         nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
6518                             rem_reg_rules) {
6519                 r = nla_parse_nested(tb, NL80211_REG_RULE_ATTR_MAX,
6520                                      nl_reg_rule, reg_rule_policy,
6521                                      info->extack);
6522                 if (r)
6523                         goto bad_reg;
6524                 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
6525                 if (r)
6526                         goto bad_reg;
6527
6528                 rule_idx++;
6529
6530                 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) {
6531                         r = -EINVAL;
6532                         goto bad_reg;
6533                 }
6534         }
6535
6536         /* set_regdom takes ownership of rd */
6537         return set_regdom(rd, REGD_SOURCE_CRDA);
6538  bad_reg:
6539         kfree(rd);
6540         return r;
6541 }
6542 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */
6543
6544 static int validate_scan_freqs(struct nlattr *freqs)
6545 {
6546         struct nlattr *attr1, *attr2;
6547         int n_channels = 0, tmp1, tmp2;
6548
6549         nla_for_each_nested(attr1, freqs, tmp1)
6550                 if (nla_len(attr1) != sizeof(u32))
6551                         return 0;
6552
6553         nla_for_each_nested(attr1, freqs, tmp1) {
6554                 n_channels++;
6555                 /*
6556                  * Some hardware has a limited channel list for
6557                  * scanning, and it is pretty much nonsensical
6558                  * to scan for a channel twice, so disallow that
6559                  * and don't require drivers to check that the
6560                  * channel list they get isn't longer than what
6561                  * they can scan, as long as they can scan all
6562                  * the channels they registered at once.
6563                  */
6564                 nla_for_each_nested(attr2, freqs, tmp2)
6565                         if (attr1 != attr2 &&
6566                             nla_get_u32(attr1) == nla_get_u32(attr2))
6567                                 return 0;
6568         }
6569
6570         return n_channels;
6571 }
6572
6573 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b)
6574 {
6575         return b < NUM_NL80211_BANDS && wiphy->bands[b];
6576 }
6577
6578 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy,
6579                             struct cfg80211_bss_selection *bss_select)
6580 {
6581         struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1];
6582         struct nlattr *nest;
6583         int err;
6584         bool found = false;
6585         int i;
6586
6587         /* only process one nested attribute */
6588         nest = nla_data(nla);
6589         if (!nla_ok(nest, nla_len(nest)))
6590                 return -EINVAL;
6591
6592         err = nla_parse_nested(attr, NL80211_BSS_SELECT_ATTR_MAX, nest,
6593                                nl80211_bss_select_policy, NULL);
6594         if (err)
6595                 return err;
6596
6597         /* only one attribute may be given */
6598         for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) {
6599                 if (attr[i]) {
6600                         if (found)
6601                                 return -EINVAL;
6602                         found = true;
6603                 }
6604         }
6605
6606         bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID;
6607
6608         if (attr[NL80211_BSS_SELECT_ATTR_RSSI])
6609                 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI;
6610
6611         if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) {
6612                 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF;
6613                 bss_select->param.band_pref =
6614                         nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]);
6615                 if (!is_band_valid(wiphy, bss_select->param.band_pref))
6616                         return -EINVAL;
6617         }
6618
6619         if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) {
6620                 struct nl80211_bss_select_rssi_adjust *adj_param;
6621
6622                 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]);
6623                 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST;
6624                 bss_select->param.adjust.band = adj_param->band;
6625                 bss_select->param.adjust.delta = adj_param->delta;
6626                 if (!is_band_valid(wiphy, bss_select->param.adjust.band))
6627                         return -EINVAL;
6628         }
6629
6630         /* user-space did not provide behaviour attribute */
6631         if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID)
6632                 return -EINVAL;
6633
6634         if (!(wiphy->bss_select_support & BIT(bss_select->behaviour)))
6635                 return -EINVAL;
6636
6637         return 0;
6638 }
6639
6640 static int nl80211_parse_random_mac(struct nlattr **attrs,
6641                                     u8 *mac_addr, u8 *mac_addr_mask)
6642 {
6643         int i;
6644
6645         if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) {
6646                 eth_zero_addr(mac_addr);
6647                 eth_zero_addr(mac_addr_mask);
6648                 mac_addr[0] = 0x2;
6649                 mac_addr_mask[0] = 0x3;
6650
6651                 return 0;
6652         }
6653
6654         /* need both or none */
6655         if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK])
6656                 return -EINVAL;
6657
6658         memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN);
6659         memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN);
6660
6661         /* don't allow or configure an mcast address */
6662         if (!is_multicast_ether_addr(mac_addr_mask) ||
6663             is_multicast_ether_addr(mac_addr))
6664                 return -EINVAL;
6665
6666         /*
6667          * allow users to pass a MAC address that has bits set outside
6668          * of the mask, but don't bother drivers with having to deal
6669          * with such bits
6670          */
6671         for (i = 0; i < ETH_ALEN; i++)
6672                 mac_addr[i] &= mac_addr_mask[i];
6673
6674         return 0;
6675 }
6676
6677 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev)
6678 {
6679         ASSERT_WDEV_LOCK(wdev);
6680
6681         if (!cfg80211_beaconing_iface_active(wdev))
6682                 return true;
6683
6684         if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR))
6685                 return true;
6686
6687         return regulatory_pre_cac_allowed(wdev->wiphy);
6688 }
6689
6690 static int
6691 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev,
6692                          void *request, struct nlattr **attrs,
6693                          bool is_sched_scan)
6694 {
6695         u8 *mac_addr, *mac_addr_mask;
6696         u32 *flags;
6697         enum nl80211_feature_flags randomness_flag;
6698
6699         if (!attrs[NL80211_ATTR_SCAN_FLAGS])
6700                 return 0;
6701
6702         if (is_sched_scan) {
6703                 struct cfg80211_sched_scan_request *req = request;
6704
6705                 randomness_flag = wdev ?
6706                                   NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR :
6707                                   NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
6708                 flags = &req->flags;
6709                 mac_addr = req->mac_addr;
6710                 mac_addr_mask = req->mac_addr_mask;
6711         } else {
6712                 struct cfg80211_scan_request *req = request;
6713
6714                 randomness_flag = NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
6715                 flags = &req->flags;
6716                 mac_addr = req->mac_addr;
6717                 mac_addr_mask = req->mac_addr_mask;
6718         }
6719
6720         *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]);
6721
6722         if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
6723              !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) ||
6724             ((*flags & NL80211_SCAN_FLAG_LOW_SPAN) &&
6725              !wiphy_ext_feature_isset(wiphy,
6726                                       NL80211_EXT_FEATURE_LOW_SPAN_SCAN)) ||
6727             ((*flags & NL80211_SCAN_FLAG_LOW_POWER) &&
6728              !wiphy_ext_feature_isset(wiphy,
6729                                       NL80211_EXT_FEATURE_LOW_POWER_SCAN)) ||
6730             ((*flags & NL80211_SCAN_FLAG_HIGH_ACCURACY) &&
6731              !wiphy_ext_feature_isset(wiphy,
6732                                       NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN)))
6733                 return -EOPNOTSUPP;
6734
6735         if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
6736                 int err;
6737
6738                 if (!(wiphy->features & randomness_flag) ||
6739                     (wdev && wdev->current_bss))
6740                         return -EOPNOTSUPP;
6741
6742                 err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask);
6743                 if (err)
6744                         return err;
6745         }
6746
6747         if ((*flags & NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME) &&
6748             !wiphy_ext_feature_isset(wiphy,
6749                                      NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME))
6750                 return -EOPNOTSUPP;
6751
6752         if ((*flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP) &&
6753            !wiphy_ext_feature_isset(wiphy,
6754                                     NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP))
6755                 return -EOPNOTSUPP;
6756
6757         if ((*flags & NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) &&
6758             !wiphy_ext_feature_isset(wiphy,
6759                                      NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION))
6760                 return -EOPNOTSUPP;
6761
6762         if ((*flags & NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE) &&
6763             !wiphy_ext_feature_isset(wiphy,
6764                                      NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE))
6765                 return -EOPNOTSUPP;
6766
6767         return 0;
6768 }
6769
6770 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
6771 {
6772         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6773         struct wireless_dev *wdev = info->user_ptr[1];
6774         struct cfg80211_scan_request *request;
6775         struct nlattr *attr;
6776         struct wiphy *wiphy;
6777         int err, tmp, n_ssids = 0, n_channels, i;
6778         size_t ie_len;
6779
6780         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6781                 return -EINVAL;
6782
6783         wiphy = &rdev->wiphy;
6784
6785         if (wdev->iftype == NL80211_IFTYPE_NAN)
6786                 return -EOPNOTSUPP;
6787
6788         if (!rdev->ops->scan)
6789                 return -EOPNOTSUPP;
6790
6791         if (rdev->scan_req || rdev->scan_msg) {
6792                 err = -EBUSY;
6793                 goto unlock;
6794         }
6795
6796         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
6797                 n_channels = validate_scan_freqs(
6798                                 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
6799                 if (!n_channels) {
6800                         err = -EINVAL;
6801                         goto unlock;
6802                 }
6803         } else {
6804                 n_channels = ieee80211_get_num_supported_channels(wiphy);
6805         }
6806
6807         if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
6808                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
6809                         n_ssids++;
6810
6811         if (n_ssids > wiphy->max_scan_ssids) {
6812                 err = -EINVAL;
6813                 goto unlock;
6814         }
6815
6816         if (info->attrs[NL80211_ATTR_IE])
6817                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6818         else
6819                 ie_len = 0;
6820
6821         if (ie_len > wiphy->max_scan_ie_len) {
6822                 err = -EINVAL;
6823                 goto unlock;
6824         }
6825
6826         request = kzalloc(sizeof(*request)
6827                         + sizeof(*request->ssids) * n_ssids
6828                         + sizeof(*request->channels) * n_channels
6829                         + ie_len, GFP_KERNEL);
6830         if (!request) {
6831                 err = -ENOMEM;
6832                 goto unlock;
6833         }
6834
6835         if (n_ssids)
6836                 request->ssids = (void *)&request->channels[n_channels];
6837         request->n_ssids = n_ssids;
6838         if (ie_len) {
6839                 if (n_ssids)
6840                         request->ie = (void *)(request->ssids + n_ssids);
6841                 else
6842                         request->ie = (void *)(request->channels + n_channels);
6843         }
6844
6845         i = 0;
6846         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
6847                 /* user specified, bail out if channel not found */
6848                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) {
6849                         struct ieee80211_channel *chan;
6850
6851                         chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
6852
6853                         if (!chan) {
6854                                 err = -EINVAL;
6855                                 goto out_free;
6856                         }
6857
6858                         /* ignore disabled channels */
6859                         if (chan->flags & IEEE80211_CHAN_DISABLED)
6860                                 continue;
6861
6862                         request->channels[i] = chan;
6863                         i++;
6864                 }
6865         } else {
6866                 enum nl80211_band band;
6867
6868                 /* all channels */
6869                 for (band = 0; band < NUM_NL80211_BANDS; band++) {
6870                         int j;
6871
6872                         if (!wiphy->bands[band])
6873                                 continue;
6874                         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
6875                                 struct ieee80211_channel *chan;
6876
6877                                 chan = &wiphy->bands[band]->channels[j];
6878
6879                                 if (chan->flags & IEEE80211_CHAN_DISABLED)
6880                                         continue;
6881
6882                                 request->channels[i] = chan;
6883                                 i++;
6884                         }
6885                 }
6886         }
6887
6888         if (!i) {
6889                 err = -EINVAL;
6890                 goto out_free;
6891         }
6892
6893         request->n_channels = i;
6894
6895         wdev_lock(wdev);
6896         if (!cfg80211_off_channel_oper_allowed(wdev)) {
6897                 struct ieee80211_channel *chan;
6898
6899                 if (request->n_channels != 1) {
6900                         wdev_unlock(wdev);
6901                         err = -EBUSY;
6902                         goto out_free;
6903                 }
6904
6905                 chan = request->channels[0];
6906                 if (chan->center_freq != wdev->chandef.chan->center_freq) {
6907                         wdev_unlock(wdev);
6908                         err = -EBUSY;
6909                         goto out_free;
6910                 }
6911         }
6912         wdev_unlock(wdev);
6913
6914         i = 0;
6915         if (n_ssids) {
6916                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
6917                         if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
6918                                 err = -EINVAL;
6919                                 goto out_free;
6920                         }
6921                         request->ssids[i].ssid_len = nla_len(attr);
6922                         memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
6923                         i++;
6924                 }
6925         }
6926
6927         if (info->attrs[NL80211_ATTR_IE]) {
6928                 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6929                 memcpy((void *)request->ie,
6930                        nla_data(info->attrs[NL80211_ATTR_IE]),
6931                        request->ie_len);
6932         }
6933
6934         for (i = 0; i < NUM_NL80211_BANDS; i++)
6935                 if (wiphy->bands[i])
6936                         request->rates[i] =
6937                                 (1 << wiphy->bands[i]->n_bitrates) - 1;
6938
6939         if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) {
6940                 nla_for_each_nested(attr,
6941                                     info->attrs[NL80211_ATTR_SCAN_SUPP_RATES],
6942                                     tmp) {
6943                         enum nl80211_band band = nla_type(attr);
6944
6945                         if (band < 0 || band >= NUM_NL80211_BANDS) {
6946                                 err = -EINVAL;
6947                                 goto out_free;
6948                         }
6949
6950                         if (!wiphy->bands[band])
6951                                 continue;
6952
6953                         err = ieee80211_get_ratemask(wiphy->bands[band],
6954                                                      nla_data(attr),
6955                                                      nla_len(attr),
6956                                                      &request->rates[band]);
6957                         if (err)
6958                                 goto out_free;
6959                 }
6960         }
6961
6962         if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) {
6963                 if (!wiphy_ext_feature_isset(wiphy,
6964                                         NL80211_EXT_FEATURE_SET_SCAN_DWELL)) {
6965                         err = -EOPNOTSUPP;
6966                         goto out_free;
6967                 }
6968
6969                 request->duration =
6970                         nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]);
6971                 request->duration_mandatory =
6972                         nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]);
6973         }
6974
6975         err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs,
6976                                        false);
6977         if (err)
6978                 goto out_free;
6979
6980         request->no_cck =
6981                 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
6982
6983         /* Initial implementation used NL80211_ATTR_MAC to set the specific
6984          * BSSID to scan for. This was problematic because that same attribute
6985          * was already used for another purpose (local random MAC address). The
6986          * NL80211_ATTR_BSSID attribute was added to fix this. For backwards
6987          * compatibility with older userspace components, also use the
6988          * NL80211_ATTR_MAC value here if it can be determined to be used for
6989          * the specific BSSID use case instead of the random MAC address
6990          * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use).
6991          */
6992         if (info->attrs[NL80211_ATTR_BSSID])
6993                 memcpy(request->bssid,
6994                        nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN);
6995         else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) &&
6996                  info->attrs[NL80211_ATTR_MAC])
6997                 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]),
6998                        ETH_ALEN);
6999         else
7000                 eth_broadcast_addr(request->bssid);
7001
7002         request->wdev = wdev;
7003         request->wiphy = &rdev->wiphy;
7004         request->scan_start = jiffies;
7005
7006         rdev->scan_req = request;
7007         err = rdev_scan(rdev, request);
7008
7009         if (!err) {
7010                 nl80211_send_scan_start(rdev, wdev);
7011                 if (wdev->netdev)
7012                         dev_hold(wdev->netdev);
7013         } else {
7014  out_free:
7015                 rdev->scan_req = NULL;
7016                 kfree(request);
7017         }
7018
7019  unlock:
7020         return err;
7021 }
7022
7023 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info)
7024 {
7025         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7026         struct wireless_dev *wdev = info->user_ptr[1];
7027
7028         if (!rdev->ops->abort_scan)
7029                 return -EOPNOTSUPP;
7030
7031         if (rdev->scan_msg)
7032                 return 0;
7033
7034         if (!rdev->scan_req)
7035                 return -ENOENT;
7036
7037         rdev_abort_scan(rdev, wdev);
7038         return 0;
7039 }
7040
7041 static int
7042 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans,
7043                                struct cfg80211_sched_scan_request *request,
7044                                struct nlattr **attrs)
7045 {
7046         int tmp, err, i = 0;
7047         struct nlattr *attr;
7048
7049         if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
7050                 u32 interval;
7051
7052                 /*
7053                  * If scan plans are not specified,
7054                  * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this
7055                  * case one scan plan will be set with the specified scan
7056                  * interval and infinite number of iterations.
7057                  */
7058                 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]);
7059                 if (!interval)
7060                         return -EINVAL;
7061
7062                 request->scan_plans[0].interval =
7063                         DIV_ROUND_UP(interval, MSEC_PER_SEC);
7064                 if (!request->scan_plans[0].interval)
7065                         return -EINVAL;
7066
7067                 if (request->scan_plans[0].interval >
7068                     wiphy->max_sched_scan_plan_interval)
7069                         request->scan_plans[0].interval =
7070                                 wiphy->max_sched_scan_plan_interval;
7071
7072                 return 0;
7073         }
7074
7075         nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) {
7076                 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1];
7077
7078                 if (WARN_ON(i >= n_plans))
7079                         return -EINVAL;
7080
7081                 err = nla_parse_nested(plan, NL80211_SCHED_SCAN_PLAN_MAX,
7082                                        attr, nl80211_plan_policy, NULL);
7083                 if (err)
7084                         return err;
7085
7086                 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL])
7087                         return -EINVAL;
7088
7089                 request->scan_plans[i].interval =
7090                         nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]);
7091                 if (!request->scan_plans[i].interval ||
7092                     request->scan_plans[i].interval >
7093                     wiphy->max_sched_scan_plan_interval)
7094                         return -EINVAL;
7095
7096                 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) {
7097                         request->scan_plans[i].iterations =
7098                                 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]);
7099                         if (!request->scan_plans[i].iterations ||
7100                             (request->scan_plans[i].iterations >
7101                              wiphy->max_sched_scan_plan_iterations))
7102                                 return -EINVAL;
7103                 } else if (i < n_plans - 1) {
7104                         /*
7105                          * All scan plans but the last one must specify
7106                          * a finite number of iterations
7107                          */
7108                         return -EINVAL;
7109                 }
7110
7111                 i++;
7112         }
7113
7114         /*
7115          * The last scan plan must not specify the number of
7116          * iterations, it is supposed to run infinitely
7117          */
7118         if (request->scan_plans[n_plans - 1].iterations)
7119                 return  -EINVAL;
7120
7121         return 0;
7122 }
7123
7124 static struct cfg80211_sched_scan_request *
7125 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
7126                          struct nlattr **attrs, int max_match_sets)
7127 {
7128         struct cfg80211_sched_scan_request *request;
7129         struct nlattr *attr;
7130         int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0;
7131         enum nl80211_band band;
7132         size_t ie_len;
7133         struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1];
7134         s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF;
7135
7136         if (!is_valid_ie_attr(attrs[NL80211_ATTR_IE]))
7137                 return ERR_PTR(-EINVAL);
7138
7139         if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
7140                 n_channels = validate_scan_freqs(
7141                                 attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
7142                 if (!n_channels)
7143                         return ERR_PTR(-EINVAL);
7144         } else {
7145                 n_channels = ieee80211_get_num_supported_channels(wiphy);
7146         }
7147
7148         if (attrs[NL80211_ATTR_SCAN_SSIDS])
7149                 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
7150                                     tmp)
7151                         n_ssids++;
7152
7153         if (n_ssids > wiphy->max_sched_scan_ssids)
7154                 return ERR_PTR(-EINVAL);
7155
7156         /*
7157          * First, count the number of 'real' matchsets. Due to an issue with
7158          * the old implementation, matchsets containing only the RSSI attribute
7159          * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default'
7160          * RSSI for all matchsets, rather than their own matchset for reporting
7161          * all APs with a strong RSSI. This is needed to be compatible with
7162          * older userspace that treated a matchset with only the RSSI as the
7163          * global RSSI for all other matchsets - if there are other matchsets.
7164          */
7165         if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
7166                 nla_for_each_nested(attr,
7167                                     attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
7168                                     tmp) {
7169                         struct nlattr *rssi;
7170
7171                         err = nla_parse_nested(tb,
7172                                                NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
7173                                                attr, nl80211_match_policy,
7174                                                NULL);
7175                         if (err)
7176                                 return ERR_PTR(err);
7177
7178                         /* SSID and BSSID are mutually exclusive */
7179                         if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] &&
7180                             tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID])
7181                                 return ERR_PTR(-EINVAL);
7182
7183                         /* add other standalone attributes here */
7184                         if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] ||
7185                             tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) {
7186                                 n_match_sets++;
7187                                 continue;
7188                         }
7189                         rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
7190                         if (rssi)
7191                                 default_match_rssi = nla_get_s32(rssi);
7192                 }
7193         }
7194
7195         /* However, if there's no other matchset, add the RSSI one */
7196         if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
7197                 n_match_sets = 1;
7198
7199         if (n_match_sets > max_match_sets)
7200                 return ERR_PTR(-EINVAL);
7201
7202         if (attrs[NL80211_ATTR_IE])
7203                 ie_len = nla_len(attrs[NL80211_ATTR_IE]);
7204         else
7205                 ie_len = 0;
7206
7207         if (ie_len > wiphy->max_sched_scan_ie_len)
7208                 return ERR_PTR(-EINVAL);
7209
7210         if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
7211                 /*
7212                  * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since
7213                  * each scan plan already specifies its own interval
7214                  */
7215                 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
7216                         return ERR_PTR(-EINVAL);
7217
7218                 nla_for_each_nested(attr,
7219                                     attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp)
7220                         n_plans++;
7221         } else {
7222                 /*
7223                  * The scan interval attribute is kept for backward
7224                  * compatibility. If no scan plans are specified and sched scan
7225                  * interval is specified, one scan plan will be set with this
7226                  * scan interval and infinite number of iterations.
7227                  */
7228                 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
7229                         return ERR_PTR(-EINVAL);
7230
7231                 n_plans = 1;
7232         }
7233
7234         if (!n_plans || n_plans > wiphy->max_sched_scan_plans)
7235                 return ERR_PTR(-EINVAL);
7236
7237         if (!wiphy_ext_feature_isset(
7238                     wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) &&
7239             (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] ||
7240              attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]))
7241                 return ERR_PTR(-EINVAL);
7242
7243         request = kzalloc(sizeof(*request)
7244                         + sizeof(*request->ssids) * n_ssids
7245                         + sizeof(*request->match_sets) * n_match_sets
7246                         + sizeof(*request->scan_plans) * n_plans
7247                         + sizeof(*request->channels) * n_channels
7248                         + ie_len, GFP_KERNEL);
7249         if (!request)
7250                 return ERR_PTR(-ENOMEM);
7251
7252         if (n_ssids)
7253                 request->ssids = (void *)&request->channels[n_channels];
7254         request->n_ssids = n_ssids;
7255         if (ie_len) {
7256                 if (n_ssids)
7257                         request->ie = (void *)(request->ssids + n_ssids);
7258                 else
7259                         request->ie = (void *)(request->channels + n_channels);
7260         }
7261
7262         if (n_match_sets) {
7263                 if (request->ie)
7264                         request->match_sets = (void *)(request->ie + ie_len);
7265                 else if (n_ssids)
7266                         request->match_sets =
7267                                 (void *)(request->ssids + n_ssids);
7268                 else
7269                         request->match_sets =
7270                                 (void *)(request->channels + n_channels);
7271         }
7272         request->n_match_sets = n_match_sets;
7273
7274         if (n_match_sets)
7275                 request->scan_plans = (void *)(request->match_sets +
7276                                                n_match_sets);
7277         else if (request->ie)
7278                 request->scan_plans = (void *)(request->ie + ie_len);
7279         else if (n_ssids)
7280                 request->scan_plans = (void *)(request->ssids + n_ssids);
7281         else
7282                 request->scan_plans = (void *)(request->channels + n_channels);
7283
7284         request->n_scan_plans = n_plans;
7285
7286         i = 0;
7287         if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
7288                 /* user specified, bail out if channel not found */
7289                 nla_for_each_nested(attr,
7290                                     attrs[NL80211_ATTR_SCAN_FREQUENCIES],
7291                                     tmp) {
7292                         struct ieee80211_channel *chan;
7293
7294                         chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
7295
7296                         if (!chan) {
7297                                 err = -EINVAL;
7298                                 goto out_free;
7299                         }
7300
7301                         /* ignore disabled channels */
7302                         if (chan->flags & IEEE80211_CHAN_DISABLED)
7303                                 continue;
7304
7305                         request->channels[i] = chan;
7306                         i++;
7307                 }
7308         } else {
7309                 /* all channels */
7310                 for (band = 0; band < NUM_NL80211_BANDS; band++) {
7311                         int j;
7312
7313                         if (!wiphy->bands[band])
7314                                 continue;
7315                         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
7316                                 struct ieee80211_channel *chan;
7317
7318                                 chan = &wiphy->bands[band]->channels[j];
7319
7320                                 if (chan->flags & IEEE80211_CHAN_DISABLED)
7321                                         continue;
7322
7323                                 request->channels[i] = chan;
7324                                 i++;
7325                         }
7326                 }
7327         }
7328
7329         if (!i) {
7330                 err = -EINVAL;
7331                 goto out_free;
7332         }
7333
7334         request->n_channels = i;
7335
7336         i = 0;
7337         if (n_ssids) {
7338                 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
7339                                     tmp) {
7340                         if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
7341                                 err = -EINVAL;
7342                                 goto out_free;
7343                         }
7344                         request->ssids[i].ssid_len = nla_len(attr);
7345                         memcpy(request->ssids[i].ssid, nla_data(attr),
7346                                nla_len(attr));
7347                         i++;
7348                 }
7349         }
7350
7351         i = 0;
7352         if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
7353                 nla_for_each_nested(attr,
7354                                     attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
7355                                     tmp) {
7356                         struct nlattr *ssid, *bssid, *rssi;
7357
7358                         err = nla_parse_nested(tb,
7359                                                NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
7360                                                attr, nl80211_match_policy,
7361                                                NULL);
7362                         if (err)
7363                                 goto out_free;
7364                         ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
7365                         bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID];
7366                         if (ssid || bssid) {
7367                                 if (WARN_ON(i >= n_match_sets)) {
7368                                         /* this indicates a programming error,
7369                                          * the loop above should have verified
7370                                          * things properly
7371                                          */
7372                                         err = -EINVAL;
7373                                         goto out_free;
7374                                 }
7375
7376                                 if (ssid) {
7377                                         if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) {
7378                                                 err = -EINVAL;
7379                                                 goto out_free;
7380                                         }
7381                                         memcpy(request->match_sets[i].ssid.ssid,
7382                                                nla_data(ssid), nla_len(ssid));
7383                                         request->match_sets[i].ssid.ssid_len =
7384                                                 nla_len(ssid);
7385                                 }
7386                                 if (bssid) {
7387                                         if (nla_len(bssid) != ETH_ALEN) {
7388                                                 err = -EINVAL;
7389                                                 goto out_free;
7390                                         }
7391                                         memcpy(request->match_sets[i].bssid,
7392                                                nla_data(bssid), ETH_ALEN);
7393                                 }
7394
7395                                 /* special attribute - old implementation w/a */
7396                                 request->match_sets[i].rssi_thold =
7397                                         default_match_rssi;
7398                                 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
7399                                 if (rssi)
7400                                         request->match_sets[i].rssi_thold =
7401                                                 nla_get_s32(rssi);
7402                         }
7403                         i++;
7404                 }
7405
7406                 /* there was no other matchset, so the RSSI one is alone */
7407                 if (i == 0 && n_match_sets)
7408                         request->match_sets[0].rssi_thold = default_match_rssi;
7409
7410                 request->min_rssi_thold = INT_MAX;
7411                 for (i = 0; i < n_match_sets; i++)
7412                         request->min_rssi_thold =
7413                                 min(request->match_sets[i].rssi_thold,
7414                                     request->min_rssi_thold);
7415         } else {
7416                 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF;
7417         }
7418
7419         if (ie_len) {
7420                 request->ie_len = ie_len;
7421                 memcpy((void *)request->ie,
7422                        nla_data(attrs[NL80211_ATTR_IE]),
7423                        request->ie_len);
7424         }
7425
7426         err = nl80211_check_scan_flags(wiphy, wdev, request, attrs, true);
7427         if (err)
7428                 goto out_free;
7429
7430         if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY])
7431                 request->delay =
7432                         nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]);
7433
7434         if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) {
7435                 request->relative_rssi = nla_get_s8(
7436                         attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]);
7437                 request->relative_rssi_set = true;
7438         }
7439
7440         if (request->relative_rssi_set &&
7441             attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) {
7442                 struct nl80211_bss_select_rssi_adjust *rssi_adjust;
7443
7444                 rssi_adjust = nla_data(
7445                         attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]);
7446                 request->rssi_adjust.band = rssi_adjust->band;
7447                 request->rssi_adjust.delta = rssi_adjust->delta;
7448                 if (!is_band_valid(wiphy, request->rssi_adjust.band)) {
7449                         err = -EINVAL;
7450                         goto out_free;
7451                 }
7452         }
7453
7454         err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs);
7455         if (err)
7456                 goto out_free;
7457
7458         request->scan_start = jiffies;
7459
7460         return request;
7461
7462 out_free:
7463         kfree(request);
7464         return ERR_PTR(err);
7465 }
7466
7467 static int nl80211_start_sched_scan(struct sk_buff *skb,
7468                                     struct genl_info *info)
7469 {
7470         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7471         struct net_device *dev = info->user_ptr[1];
7472         struct wireless_dev *wdev = dev->ieee80211_ptr;
7473         struct cfg80211_sched_scan_request *sched_scan_req;
7474         bool want_multi;
7475         int err;
7476
7477         if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start)
7478                 return -EOPNOTSUPP;
7479
7480         want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI];
7481         err = cfg80211_sched_scan_req_possible(rdev, want_multi);
7482         if (err)
7483                 return err;
7484
7485         sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev,
7486                                                   info->attrs,
7487                                                   rdev->wiphy.max_match_sets);
7488
7489         err = PTR_ERR_OR_ZERO(sched_scan_req);
7490         if (err)
7491                 goto out_err;
7492
7493         /* leave request id zero for legacy request
7494          * or if driver does not support multi-scheduled scan
7495          */
7496         if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) {
7497                 while (!sched_scan_req->reqid)
7498                         sched_scan_req->reqid = rdev->wiphy.cookie_counter++;
7499         }
7500
7501         err = rdev_sched_scan_start(rdev, dev, sched_scan_req);
7502         if (err)
7503                 goto out_free;
7504
7505         sched_scan_req->dev = dev;
7506         sched_scan_req->wiphy = &rdev->wiphy;
7507
7508         if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
7509                 sched_scan_req->owner_nlportid = info->snd_portid;
7510
7511         cfg80211_add_sched_scan_req(rdev, sched_scan_req);
7512
7513         nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN);
7514         return 0;
7515
7516 out_free:
7517         kfree(sched_scan_req);
7518 out_err:
7519         return err;
7520 }
7521
7522 static int nl80211_stop_sched_scan(struct sk_buff *skb,
7523                                    struct genl_info *info)
7524 {
7525         struct cfg80211_sched_scan_request *req;
7526         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7527         u64 cookie;
7528
7529         if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop)
7530                 return -EOPNOTSUPP;
7531
7532         if (info->attrs[NL80211_ATTR_COOKIE]) {
7533                 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
7534                 return __cfg80211_stop_sched_scan(rdev, cookie, false);
7535         }
7536
7537         req = list_first_or_null_rcu(&rdev->sched_scan_req_list,
7538                                      struct cfg80211_sched_scan_request,
7539                                      list);
7540         if (!req || req->reqid ||
7541             (req->owner_nlportid &&
7542              req->owner_nlportid != info->snd_portid))
7543                 return -ENOENT;
7544
7545         return cfg80211_stop_sched_scan_req(rdev, req, false);
7546 }
7547
7548 static int nl80211_start_radar_detection(struct sk_buff *skb,
7549                                          struct genl_info *info)
7550 {
7551         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7552         struct net_device *dev = info->user_ptr[1];
7553         struct wireless_dev *wdev = dev->ieee80211_ptr;
7554         struct cfg80211_chan_def chandef;
7555         enum nl80211_dfs_regions dfs_region;
7556         unsigned int cac_time_ms;
7557         int err;
7558
7559         dfs_region = reg_get_dfs_region(wdev->wiphy);
7560         if (dfs_region == NL80211_DFS_UNSET)
7561                 return -EINVAL;
7562
7563         err = nl80211_parse_chandef(rdev, info, &chandef);
7564         if (err)
7565                 return err;
7566
7567         if (netif_carrier_ok(dev))
7568                 return -EBUSY;
7569
7570         if (wdev->cac_started)
7571                 return -EBUSY;
7572
7573         err = cfg80211_chandef_dfs_required(wdev->wiphy, &chandef,
7574                                             wdev->iftype);
7575         if (err < 0)
7576                 return err;
7577
7578         if (err == 0)
7579                 return -EINVAL;
7580
7581         if (!cfg80211_chandef_dfs_usable(wdev->wiphy, &chandef))
7582                 return -EINVAL;
7583
7584         if (!rdev->ops->start_radar_detection)
7585                 return -EOPNOTSUPP;
7586
7587         cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef);
7588         if (WARN_ON(!cac_time_ms))
7589                 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
7590
7591         err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms);
7592         if (!err) {
7593                 wdev->chandef = chandef;
7594                 wdev->cac_started = true;
7595                 wdev->cac_start_time = jiffies;
7596                 wdev->cac_time_ms = cac_time_ms;
7597         }
7598         return err;
7599 }
7600
7601 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
7602 {
7603         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7604         struct net_device *dev = info->user_ptr[1];
7605         struct wireless_dev *wdev = dev->ieee80211_ptr;
7606         struct cfg80211_csa_settings params;
7607         /* csa_attrs is defined static to avoid waste of stack size - this
7608          * function is called under RTNL lock, so this should not be a problem.
7609          */
7610         static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1];
7611         int err;
7612         bool need_new_beacon = false;
7613         bool need_handle_dfs_flag = true;
7614         int len, i;
7615         u32 cs_count;
7616
7617         if (!rdev->ops->channel_switch ||
7618             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
7619                 return -EOPNOTSUPP;
7620
7621         switch (dev->ieee80211_ptr->iftype) {
7622         case NL80211_IFTYPE_AP:
7623         case NL80211_IFTYPE_P2P_GO:
7624                 need_new_beacon = true;
7625                 /* For all modes except AP the handle_dfs flag needs to be
7626                  * supplied to tell the kernel that userspace will handle radar
7627                  * events when they happen. Otherwise a switch to a channel
7628                  * requiring DFS will be rejected.
7629                  */
7630                 need_handle_dfs_flag = false;
7631
7632                 /* useless if AP is not running */
7633                 if (!wdev->beacon_interval)
7634                         return -ENOTCONN;
7635                 break;
7636         case NL80211_IFTYPE_ADHOC:
7637                 if (!wdev->ssid_len)
7638                         return -ENOTCONN;
7639                 break;
7640         case NL80211_IFTYPE_MESH_POINT:
7641                 if (!wdev->mesh_id_len)
7642                         return -ENOTCONN;
7643                 break;
7644         default:
7645                 return -EOPNOTSUPP;
7646         }
7647
7648         memset(&params, 0, sizeof(params));
7649
7650         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
7651             !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT])
7652                 return -EINVAL;
7653
7654         /* only important for AP, IBSS and mesh create IEs internally */
7655         if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES])
7656                 return -EINVAL;
7657
7658         /* Even though the attribute is u32, the specification says
7659          * u8, so let's make sure we don't overflow.
7660          */
7661         cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]);
7662         if (cs_count > 255)
7663                 return -EINVAL;
7664
7665         params.count = cs_count;
7666
7667         if (!need_new_beacon)
7668                 goto skip_beacons;
7669
7670         err = nl80211_parse_beacon(info->attrs, &params.beacon_after);
7671         if (err)
7672                 return err;
7673
7674         err = nla_parse_nested(csa_attrs, NL80211_ATTR_MAX,
7675                                info->attrs[NL80211_ATTR_CSA_IES],
7676                                nl80211_policy, info->extack);
7677         if (err)
7678                 return err;
7679
7680         err = nl80211_parse_beacon(csa_attrs, &params.beacon_csa);
7681         if (err)
7682                 return err;
7683
7684         if (!csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON])
7685                 return -EINVAL;
7686
7687         len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]);
7688         if (!len || (len % sizeof(u16)))
7689                 return -EINVAL;
7690
7691         params.n_counter_offsets_beacon = len / sizeof(u16);
7692         if (rdev->wiphy.max_num_csa_counters &&
7693             (params.n_counter_offsets_beacon >
7694              rdev->wiphy.max_num_csa_counters))
7695                 return -EINVAL;
7696
7697         params.counter_offsets_beacon =
7698                 nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]);
7699
7700         /* sanity checks - counters should fit and be the same */
7701         for (i = 0; i < params.n_counter_offsets_beacon; i++) {
7702                 u16 offset = params.counter_offsets_beacon[i];
7703
7704                 if (offset >= params.beacon_csa.tail_len)
7705                         return -EINVAL;
7706
7707                 if (params.beacon_csa.tail[offset] != params.count)
7708                         return -EINVAL;
7709         }
7710
7711         if (csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]) {
7712                 len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]);
7713                 if (!len || (len % sizeof(u16)))
7714                         return -EINVAL;
7715
7716                 params.n_counter_offsets_presp = len / sizeof(u16);
7717                 if (rdev->wiphy.max_num_csa_counters &&
7718                     (params.n_counter_offsets_presp >
7719                      rdev->wiphy.max_num_csa_counters))
7720                         return -EINVAL;
7721
7722                 params.counter_offsets_presp =
7723                         nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]);
7724
7725                 /* sanity checks - counters should fit and be the same */
7726                 for (i = 0; i < params.n_counter_offsets_presp; i++) {
7727                         u16 offset = params.counter_offsets_presp[i];
7728
7729                         if (offset >= params.beacon_csa.probe_resp_len)
7730                                 return -EINVAL;
7731
7732                         if (params.beacon_csa.probe_resp[offset] !=
7733                             params.count)
7734                                 return -EINVAL;
7735                 }
7736         }
7737
7738 skip_beacons:
7739         err = nl80211_parse_chandef(rdev, info, &params.chandef);
7740         if (err)
7741                 return err;
7742
7743         if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef,
7744                                            wdev->iftype))
7745                 return -EINVAL;
7746
7747         err = cfg80211_chandef_dfs_required(wdev->wiphy,
7748                                             &params.chandef,
7749                                             wdev->iftype);
7750         if (err < 0)
7751                 return err;
7752
7753         if (err > 0) {
7754                 params.radar_required = true;
7755                 if (need_handle_dfs_flag &&
7756                     !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) {
7757                         return -EINVAL;
7758                 }
7759         }
7760
7761         if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
7762                 params.block_tx = true;
7763
7764         wdev_lock(wdev);
7765         err = rdev_channel_switch(rdev, dev, &params);
7766         wdev_unlock(wdev);
7767
7768         return err;
7769 }
7770
7771 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
7772                             u32 seq, int flags,
7773                             struct cfg80211_registered_device *rdev,
7774                             struct wireless_dev *wdev,
7775                             struct cfg80211_internal_bss *intbss)
7776 {
7777         struct cfg80211_bss *res = &intbss->pub;
7778         const struct cfg80211_bss_ies *ies;
7779         void *hdr;
7780         struct nlattr *bss;
7781
7782         ASSERT_WDEV_LOCK(wdev);
7783
7784         hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
7785                              NL80211_CMD_NEW_SCAN_RESULTS);
7786         if (!hdr)
7787                 return -1;
7788
7789         genl_dump_check_consistent(cb, hdr);
7790
7791         if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation))
7792                 goto nla_put_failure;
7793         if (wdev->netdev &&
7794             nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex))
7795                 goto nla_put_failure;
7796         if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
7797                               NL80211_ATTR_PAD))
7798                 goto nla_put_failure;
7799
7800         bss = nla_nest_start(msg, NL80211_ATTR_BSS);
7801         if (!bss)
7802                 goto nla_put_failure;
7803         if ((!is_zero_ether_addr(res->bssid) &&
7804              nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid)))
7805                 goto nla_put_failure;
7806
7807         rcu_read_lock();
7808         /* indicate whether we have probe response data or not */
7809         if (rcu_access_pointer(res->proberesp_ies) &&
7810             nla_put_flag(msg, NL80211_BSS_PRESP_DATA))
7811                 goto fail_unlock_rcu;
7812
7813         /* this pointer prefers to be pointed to probe response data
7814          * but is always valid
7815          */
7816         ies = rcu_dereference(res->ies);
7817         if (ies) {
7818                 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf,
7819                                       NL80211_BSS_PAD))
7820                         goto fail_unlock_rcu;
7821                 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS,
7822                                         ies->len, ies->data))
7823                         goto fail_unlock_rcu;
7824         }
7825
7826         /* and this pointer is always (unless driver didn't know) beacon data */
7827         ies = rcu_dereference(res->beacon_ies);
7828         if (ies && ies->from_beacon) {
7829                 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf,
7830                                       NL80211_BSS_PAD))
7831                         goto fail_unlock_rcu;
7832                 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES,
7833                                         ies->len, ies->data))
7834                         goto fail_unlock_rcu;
7835         }
7836         rcu_read_unlock();
7837
7838         if (res->beacon_interval &&
7839             nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval))
7840                 goto nla_put_failure;
7841         if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) ||
7842             nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) ||
7843             nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) ||
7844             nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO,
7845                         jiffies_to_msecs(jiffies - intbss->ts)))
7846                 goto nla_put_failure;
7847
7848         if (intbss->parent_tsf &&
7849             (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF,
7850                                intbss->parent_tsf, NL80211_BSS_PAD) ||
7851              nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN,
7852                      intbss->parent_bssid)))
7853                 goto nla_put_failure;
7854
7855         if (intbss->ts_boottime &&
7856             nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME,
7857                               intbss->ts_boottime, NL80211_BSS_PAD))
7858                 goto nla_put_failure;
7859
7860         if (!nl80211_put_signal(msg, intbss->pub.chains,
7861                                 intbss->pub.chain_signal,
7862                                 NL80211_BSS_CHAIN_SIGNAL))
7863                 goto nla_put_failure;
7864
7865         switch (rdev->wiphy.signal_type) {
7866         case CFG80211_SIGNAL_TYPE_MBM:
7867                 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal))
7868                         goto nla_put_failure;
7869                 break;
7870         case CFG80211_SIGNAL_TYPE_UNSPEC:
7871                 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal))
7872                         goto nla_put_failure;
7873                 break;
7874         default:
7875                 break;
7876         }
7877
7878         switch (wdev->iftype) {
7879         case NL80211_IFTYPE_P2P_CLIENT:
7880         case NL80211_IFTYPE_STATION:
7881                 if (intbss == wdev->current_bss &&
7882                     nla_put_u32(msg, NL80211_BSS_STATUS,
7883                                 NL80211_BSS_STATUS_ASSOCIATED))
7884                         goto nla_put_failure;
7885                 break;
7886         case NL80211_IFTYPE_ADHOC:
7887                 if (intbss == wdev->current_bss &&
7888                     nla_put_u32(msg, NL80211_BSS_STATUS,
7889                                 NL80211_BSS_STATUS_IBSS_JOINED))
7890                         goto nla_put_failure;
7891                 break;
7892         default:
7893                 break;
7894         }
7895
7896         nla_nest_end(msg, bss);
7897
7898         genlmsg_end(msg, hdr);
7899         return 0;
7900
7901  fail_unlock_rcu:
7902         rcu_read_unlock();
7903  nla_put_failure:
7904         genlmsg_cancel(msg, hdr);
7905         return -EMSGSIZE;
7906 }
7907
7908 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb)
7909 {
7910         struct cfg80211_registered_device *rdev;
7911         struct cfg80211_internal_bss *scan;
7912         struct wireless_dev *wdev;
7913         int start = cb->args[2], idx = 0;
7914         int err;
7915
7916         rtnl_lock();
7917         err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
7918         if (err) {
7919                 rtnl_unlock();
7920                 return err;
7921         }
7922
7923         wdev_lock(wdev);
7924         spin_lock_bh(&rdev->bss_lock);
7925         cfg80211_bss_expire(rdev);
7926
7927         cb->seq = rdev->bss_generation;
7928
7929         list_for_each_entry(scan, &rdev->bss_list, list) {
7930                 if (++idx <= start)
7931                         continue;
7932                 if (nl80211_send_bss(skb, cb,
7933                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
7934                                 rdev, wdev, scan) < 0) {
7935                         idx--;
7936                         break;
7937                 }
7938         }
7939
7940         spin_unlock_bh(&rdev->bss_lock);
7941         wdev_unlock(wdev);
7942
7943         cb->args[2] = idx;
7944         rtnl_unlock();
7945
7946         return skb->len;
7947 }
7948
7949 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq,
7950                                int flags, struct net_device *dev,
7951                                bool allow_radio_stats,
7952                                struct survey_info *survey)
7953 {
7954         void *hdr;
7955         struct nlattr *infoattr;
7956
7957         /* skip radio stats if userspace didn't request them */
7958         if (!survey->channel && !allow_radio_stats)
7959                 return 0;
7960
7961         hdr = nl80211hdr_put(msg, portid, seq, flags,
7962                              NL80211_CMD_NEW_SURVEY_RESULTS);
7963         if (!hdr)
7964                 return -ENOMEM;
7965
7966         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
7967                 goto nla_put_failure;
7968
7969         infoattr = nla_nest_start(msg, NL80211_ATTR_SURVEY_INFO);
7970         if (!infoattr)
7971                 goto nla_put_failure;
7972
7973         if (survey->channel &&
7974             nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY,
7975                         survey->channel->center_freq))
7976                 goto nla_put_failure;
7977
7978         if ((survey->filled & SURVEY_INFO_NOISE_DBM) &&
7979             nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise))
7980                 goto nla_put_failure;
7981         if ((survey->filled & SURVEY_INFO_IN_USE) &&
7982             nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE))
7983                 goto nla_put_failure;
7984         if ((survey->filled & SURVEY_INFO_TIME) &&
7985             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME,
7986                         survey->time, NL80211_SURVEY_INFO_PAD))
7987                 goto nla_put_failure;
7988         if ((survey->filled & SURVEY_INFO_TIME_BUSY) &&
7989             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY,
7990                               survey->time_busy, NL80211_SURVEY_INFO_PAD))
7991                 goto nla_put_failure;
7992         if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) &&
7993             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY,
7994                               survey->time_ext_busy, NL80211_SURVEY_INFO_PAD))
7995                 goto nla_put_failure;
7996         if ((survey->filled & SURVEY_INFO_TIME_RX) &&
7997             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX,
7998                               survey->time_rx, NL80211_SURVEY_INFO_PAD))
7999                 goto nla_put_failure;
8000         if ((survey->filled & SURVEY_INFO_TIME_TX) &&
8001             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX,
8002                               survey->time_tx, NL80211_SURVEY_INFO_PAD))
8003                 goto nla_put_failure;
8004         if ((survey->filled & SURVEY_INFO_TIME_SCAN) &&
8005             nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN,
8006                               survey->time_scan, NL80211_SURVEY_INFO_PAD))
8007                 goto nla_put_failure;
8008
8009         nla_nest_end(msg, infoattr);
8010
8011         genlmsg_end(msg, hdr);
8012         return 0;
8013
8014  nla_put_failure:
8015         genlmsg_cancel(msg, hdr);
8016         return -EMSGSIZE;
8017 }
8018
8019 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
8020 {
8021         struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
8022         struct survey_info survey;
8023         struct cfg80211_registered_device *rdev;
8024         struct wireless_dev *wdev;
8025         int survey_idx = cb->args[2];
8026         int res;
8027         bool radio_stats;
8028
8029         rtnl_lock();
8030         res = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
8031         if (res)
8032                 goto out_err;
8033
8034         /* prepare_wdev_dump parsed the attributes */
8035         radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
8036
8037         if (!wdev->netdev) {
8038                 res = -EINVAL;
8039                 goto out_err;
8040         }
8041
8042         if (!rdev->ops->dump_survey) {
8043                 res = -EOPNOTSUPP;
8044                 goto out_err;
8045         }
8046
8047         while (1) {
8048                 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey);
8049                 if (res == -ENOENT)
8050                         break;
8051                 if (res)
8052                         goto out_err;
8053
8054                 /* don't send disabled channels, but do send non-channel data */
8055                 if (survey.channel &&
8056                     survey.channel->flags & IEEE80211_CHAN_DISABLED) {
8057                         survey_idx++;
8058                         continue;
8059                 }
8060
8061                 if (nl80211_send_survey(skb,
8062                                 NETLINK_CB(cb->skb).portid,
8063                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
8064                                 wdev->netdev, radio_stats, &survey) < 0)
8065                         goto out;
8066                 survey_idx++;
8067         }
8068
8069  out:
8070         cb->args[2] = survey_idx;
8071         res = skb->len;
8072  out_err:
8073         rtnl_unlock();
8074         return res;
8075 }
8076
8077 static bool nl80211_valid_wpa_versions(u32 wpa_versions)
8078 {
8079         return !(wpa_versions & ~(NL80211_WPA_VERSION_1 |
8080                                   NL80211_WPA_VERSION_2));
8081 }
8082
8083 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
8084 {
8085         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8086         struct net_device *dev = info->user_ptr[1];
8087         struct ieee80211_channel *chan;
8088         const u8 *bssid, *ssid, *ie = NULL, *auth_data = NULL;
8089         int err, ssid_len, ie_len = 0, auth_data_len = 0;
8090         enum nl80211_auth_type auth_type;
8091         struct key_parse key;
8092         bool local_state_change;
8093
8094         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8095                 return -EINVAL;
8096
8097         if (!info->attrs[NL80211_ATTR_MAC])
8098                 return -EINVAL;
8099
8100         if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
8101                 return -EINVAL;
8102
8103         if (!info->attrs[NL80211_ATTR_SSID])
8104                 return -EINVAL;
8105
8106         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
8107                 return -EINVAL;
8108
8109         err = nl80211_parse_key(info, &key);
8110         if (err)
8111                 return err;
8112
8113         if (key.idx >= 0) {
8114                 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP)
8115                         return -EINVAL;
8116                 if (!key.p.key || !key.p.key_len)
8117                         return -EINVAL;
8118                 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 ||
8119                      key.p.key_len != WLAN_KEY_LEN_WEP40) &&
8120                     (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 ||
8121                      key.p.key_len != WLAN_KEY_LEN_WEP104))
8122                         return -EINVAL;
8123                 if (key.idx > 3)
8124                         return -EINVAL;
8125         } else {
8126                 key.p.key_len = 0;
8127                 key.p.key = NULL;
8128         }
8129
8130         if (key.idx >= 0) {
8131                 int i;
8132                 bool ok = false;
8133
8134                 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) {
8135                         if (key.p.cipher == rdev->wiphy.cipher_suites[i]) {
8136                                 ok = true;
8137                                 break;
8138                         }
8139                 }
8140                 if (!ok)
8141                         return -EINVAL;
8142         }
8143
8144         if (!rdev->ops->auth)
8145                 return -EOPNOTSUPP;
8146
8147         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8148             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8149                 return -EOPNOTSUPP;
8150
8151         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8152         chan = nl80211_get_valid_chan(&rdev->wiphy,
8153                                       info->attrs[NL80211_ATTR_WIPHY_FREQ]);
8154         if (!chan)
8155                 return -EINVAL;
8156
8157         ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8158         ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8159
8160         if (info->attrs[NL80211_ATTR_IE]) {
8161                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8162                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8163         }
8164
8165         auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
8166         if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE))
8167                 return -EINVAL;
8168
8169         if ((auth_type == NL80211_AUTHTYPE_SAE ||
8170              auth_type == NL80211_AUTHTYPE_FILS_SK ||
8171              auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
8172              auth_type == NL80211_AUTHTYPE_FILS_PK) &&
8173             !info->attrs[NL80211_ATTR_AUTH_DATA])
8174                 return -EINVAL;
8175
8176         if (info->attrs[NL80211_ATTR_AUTH_DATA]) {
8177                 if (auth_type != NL80211_AUTHTYPE_SAE &&
8178                     auth_type != NL80211_AUTHTYPE_FILS_SK &&
8179                     auth_type != NL80211_AUTHTYPE_FILS_SK_PFS &&
8180                     auth_type != NL80211_AUTHTYPE_FILS_PK)
8181                         return -EINVAL;
8182                 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
8183                 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
8184                 /* need to include at least Auth Transaction and Status Code */
8185                 if (auth_data_len < 4)
8186                         return -EINVAL;
8187         }
8188
8189         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
8190
8191         /*
8192          * Since we no longer track auth state, ignore
8193          * requests to only change local state.
8194          */
8195         if (local_state_change)
8196                 return 0;
8197
8198         wdev_lock(dev->ieee80211_ptr);
8199         err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
8200                                  ssid, ssid_len, ie, ie_len,
8201                                  key.p.key, key.p.key_len, key.idx,
8202                                  auth_data, auth_data_len);
8203         wdev_unlock(dev->ieee80211_ptr);
8204         return err;
8205 }
8206
8207 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
8208                                    struct genl_info *info,
8209                                    struct cfg80211_crypto_settings *settings,
8210                                    int cipher_limit)
8211 {
8212         memset(settings, 0, sizeof(*settings));
8213
8214         settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
8215
8216         if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
8217                 u16 proto;
8218
8219                 proto = nla_get_u16(
8220                         info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
8221                 settings->control_port_ethertype = cpu_to_be16(proto);
8222                 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
8223                     proto != ETH_P_PAE)
8224                         return -EINVAL;
8225                 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT])
8226                         settings->control_port_no_encrypt = true;
8227         } else
8228                 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE);
8229
8230         if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
8231                 void *data;
8232                 int len, i;
8233
8234                 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
8235                 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
8236                 settings->n_ciphers_pairwise = len / sizeof(u32);
8237
8238                 if (len % sizeof(u32))
8239                         return -EINVAL;
8240
8241                 if (settings->n_ciphers_pairwise > cipher_limit)
8242                         return -EINVAL;
8243
8244                 memcpy(settings->ciphers_pairwise, data, len);
8245
8246                 for (i = 0; i < settings->n_ciphers_pairwise; i++)
8247                         if (!cfg80211_supported_cipher_suite(
8248                                         &rdev->wiphy,
8249                                         settings->ciphers_pairwise[i]))
8250                                 return -EINVAL;
8251         }
8252
8253         if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
8254                 settings->cipher_group =
8255                         nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
8256                 if (!cfg80211_supported_cipher_suite(&rdev->wiphy,
8257                                                      settings->cipher_group))
8258                         return -EINVAL;
8259         }
8260
8261         if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) {
8262                 settings->wpa_versions =
8263                         nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
8264                 if (!nl80211_valid_wpa_versions(settings->wpa_versions))
8265                         return -EINVAL;
8266         }
8267
8268         if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
8269                 void *data;
8270                 int len;
8271
8272                 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
8273                 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
8274                 settings->n_akm_suites = len / sizeof(u32);
8275
8276                 if (len % sizeof(u32))
8277                         return -EINVAL;
8278
8279                 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
8280                         return -EINVAL;
8281
8282                 memcpy(settings->akm_suites, data, len);
8283         }
8284
8285         if (info->attrs[NL80211_ATTR_PMK]) {
8286                 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN)
8287                         return -EINVAL;
8288                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
8289                                              NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK))
8290                         return -EINVAL;
8291                 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]);
8292         }
8293
8294         return 0;
8295 }
8296
8297 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
8298 {
8299         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8300         struct net_device *dev = info->user_ptr[1];
8301         struct ieee80211_channel *chan;
8302         struct cfg80211_assoc_request req = {};
8303         const u8 *bssid, *ssid;
8304         int err, ssid_len = 0;
8305
8306         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8307                 return -EINVAL;
8308
8309         if (!info->attrs[NL80211_ATTR_MAC] ||
8310             !info->attrs[NL80211_ATTR_SSID] ||
8311             !info->attrs[NL80211_ATTR_WIPHY_FREQ])
8312                 return -EINVAL;
8313
8314         if (!rdev->ops->assoc)
8315                 return -EOPNOTSUPP;
8316
8317         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8318             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8319                 return -EOPNOTSUPP;
8320
8321         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8322
8323         chan = nl80211_get_valid_chan(&rdev->wiphy,
8324                                       info->attrs[NL80211_ATTR_WIPHY_FREQ]);
8325         if (!chan)
8326                 return -EINVAL;
8327
8328         ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8329         ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8330
8331         if (info->attrs[NL80211_ATTR_IE]) {
8332                 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8333                 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8334         }
8335
8336         if (info->attrs[NL80211_ATTR_USE_MFP]) {
8337                 enum nl80211_mfp mfp =
8338                         nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
8339                 if (mfp == NL80211_MFP_REQUIRED)
8340                         req.use_mfp = true;
8341                 else if (mfp != NL80211_MFP_NO)
8342                         return -EINVAL;
8343         }
8344
8345         if (info->attrs[NL80211_ATTR_PREV_BSSID])
8346                 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
8347
8348         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
8349                 req.flags |= ASSOC_REQ_DISABLE_HT;
8350
8351         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8352                 memcpy(&req.ht_capa_mask,
8353                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
8354                        sizeof(req.ht_capa_mask));
8355
8356         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
8357                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8358                         return -EINVAL;
8359                 memcpy(&req.ht_capa,
8360                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
8361                        sizeof(req.ht_capa));
8362         }
8363
8364         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
8365                 req.flags |= ASSOC_REQ_DISABLE_VHT;
8366
8367         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
8368                 memcpy(&req.vht_capa_mask,
8369                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
8370                        sizeof(req.vht_capa_mask));
8371
8372         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
8373                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
8374                         return -EINVAL;
8375                 memcpy(&req.vht_capa,
8376                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
8377                        sizeof(req.vht_capa));
8378         }
8379
8380         if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
8381                 if (!((rdev->wiphy.features &
8382                         NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
8383                        (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
8384                     !wiphy_ext_feature_isset(&rdev->wiphy,
8385                                              NL80211_EXT_FEATURE_RRM))
8386                         return -EINVAL;
8387                 req.flags |= ASSOC_REQ_USE_RRM;
8388         }
8389
8390         if (info->attrs[NL80211_ATTR_FILS_KEK]) {
8391                 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]);
8392                 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]);
8393                 if (!info->attrs[NL80211_ATTR_FILS_NONCES])
8394                         return -EINVAL;
8395                 req.fils_nonces =
8396                         nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]);
8397         }
8398
8399         err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
8400         if (!err) {
8401                 wdev_lock(dev->ieee80211_ptr);
8402
8403                 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid,
8404                                           ssid, ssid_len, &req);
8405
8406                 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
8407                         dev->ieee80211_ptr->conn_owner_nlportid =
8408                                 info->snd_portid;
8409                         memcpy(dev->ieee80211_ptr->disconnect_bssid,
8410                                bssid, ETH_ALEN);
8411                 }
8412
8413                 wdev_unlock(dev->ieee80211_ptr);
8414         }
8415
8416         return err;
8417 }
8418
8419 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
8420 {
8421         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8422         struct net_device *dev = info->user_ptr[1];
8423         const u8 *ie = NULL, *bssid;
8424         int ie_len = 0, err;
8425         u16 reason_code;
8426         bool local_state_change;
8427
8428         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8429                 return -EINVAL;
8430
8431         if (!info->attrs[NL80211_ATTR_MAC])
8432                 return -EINVAL;
8433
8434         if (!info->attrs[NL80211_ATTR_REASON_CODE])
8435                 return -EINVAL;
8436
8437         if (!rdev->ops->deauth)
8438                 return -EOPNOTSUPP;
8439
8440         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8441             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8442                 return -EOPNOTSUPP;
8443
8444         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8445
8446         reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
8447         if (reason_code == 0) {
8448                 /* Reason Code 0 is reserved */
8449                 return -EINVAL;
8450         }
8451
8452         if (info->attrs[NL80211_ATTR_IE]) {
8453                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8454                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8455         }
8456
8457         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
8458
8459         wdev_lock(dev->ieee80211_ptr);
8460         err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code,
8461                                    local_state_change);
8462         wdev_unlock(dev->ieee80211_ptr);
8463         return err;
8464 }
8465
8466 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
8467 {
8468         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8469         struct net_device *dev = info->user_ptr[1];
8470         const u8 *ie = NULL, *bssid;
8471         int ie_len = 0, err;
8472         u16 reason_code;
8473         bool local_state_change;
8474
8475         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8476                 return -EINVAL;
8477
8478         if (!info->attrs[NL80211_ATTR_MAC])
8479                 return -EINVAL;
8480
8481         if (!info->attrs[NL80211_ATTR_REASON_CODE])
8482                 return -EINVAL;
8483
8484         if (!rdev->ops->disassoc)
8485                 return -EOPNOTSUPP;
8486
8487         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
8488             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
8489                 return -EOPNOTSUPP;
8490
8491         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8492
8493         reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
8494         if (reason_code == 0) {
8495                 /* Reason Code 0 is reserved */
8496                 return -EINVAL;
8497         }
8498
8499         if (info->attrs[NL80211_ATTR_IE]) {
8500                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8501                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8502         }
8503
8504         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
8505
8506         wdev_lock(dev->ieee80211_ptr);
8507         err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code,
8508                                      local_state_change);
8509         wdev_unlock(dev->ieee80211_ptr);
8510         return err;
8511 }
8512
8513 static bool
8514 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev,
8515                          int mcast_rate[NUM_NL80211_BANDS],
8516                          int rateval)
8517 {
8518         struct wiphy *wiphy = &rdev->wiphy;
8519         bool found = false;
8520         int band, i;
8521
8522         for (band = 0; band < NUM_NL80211_BANDS; band++) {
8523                 struct ieee80211_supported_band *sband;
8524
8525                 sband = wiphy->bands[band];
8526                 if (!sband)
8527                         continue;
8528
8529                 for (i = 0; i < sband->n_bitrates; i++) {
8530                         if (sband->bitrates[i].bitrate == rateval) {
8531                                 mcast_rate[band] = i + 1;
8532                                 found = true;
8533                                 break;
8534                         }
8535                 }
8536         }
8537
8538         return found;
8539 }
8540
8541 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
8542 {
8543         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8544         struct net_device *dev = info->user_ptr[1];
8545         struct cfg80211_ibss_params ibss;
8546         struct wiphy *wiphy;
8547         struct cfg80211_cached_keys *connkeys = NULL;
8548         int err;
8549
8550         memset(&ibss, 0, sizeof(ibss));
8551
8552         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8553                 return -EINVAL;
8554
8555         if (!info->attrs[NL80211_ATTR_SSID] ||
8556             !nla_len(info->attrs[NL80211_ATTR_SSID]))
8557                 return -EINVAL;
8558
8559         ibss.beacon_interval = 100;
8560
8561         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL])
8562                 ibss.beacon_interval =
8563                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
8564
8565         err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC,
8566                                            ibss.beacon_interval);
8567         if (err)
8568                 return err;
8569
8570         if (!rdev->ops->join_ibss)
8571                 return -EOPNOTSUPP;
8572
8573         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
8574                 return -EOPNOTSUPP;
8575
8576         wiphy = &rdev->wiphy;
8577
8578         if (info->attrs[NL80211_ATTR_MAC]) {
8579                 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
8580
8581                 if (!is_valid_ether_addr(ibss.bssid))
8582                         return -EINVAL;
8583         }
8584         ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
8585         ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
8586
8587         if (info->attrs[NL80211_ATTR_IE]) {
8588                 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8589                 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8590         }
8591
8592         err = nl80211_parse_chandef(rdev, info, &ibss.chandef);
8593         if (err)
8594                 return err;
8595
8596         if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef,
8597                                      NL80211_IFTYPE_ADHOC))
8598                 return -EINVAL;
8599
8600         switch (ibss.chandef.width) {
8601         case NL80211_CHAN_WIDTH_5:
8602         case NL80211_CHAN_WIDTH_10:
8603         case NL80211_CHAN_WIDTH_20_NOHT:
8604                 break;
8605         case NL80211_CHAN_WIDTH_20:
8606         case NL80211_CHAN_WIDTH_40:
8607                 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
8608                         return -EINVAL;
8609                 break;
8610         case NL80211_CHAN_WIDTH_80:
8611         case NL80211_CHAN_WIDTH_80P80:
8612         case NL80211_CHAN_WIDTH_160:
8613                 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
8614                         return -EINVAL;
8615                 if (!wiphy_ext_feature_isset(&rdev->wiphy,
8616                                              NL80211_EXT_FEATURE_VHT_IBSS))
8617                         return -EINVAL;
8618                 break;
8619         default:
8620                 return -EINVAL;
8621         }
8622
8623         ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
8624         ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
8625
8626         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
8627                 u8 *rates =
8628                         nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
8629                 int n_rates =
8630                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
8631                 struct ieee80211_supported_band *sband =
8632                         wiphy->bands[ibss.chandef.chan->band];
8633
8634                 err = ieee80211_get_ratemask(sband, rates, n_rates,
8635                                              &ibss.basic_rates);
8636                 if (err)
8637                         return err;
8638         }
8639
8640         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8641                 memcpy(&ibss.ht_capa_mask,
8642                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
8643                        sizeof(ibss.ht_capa_mask));
8644
8645         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
8646                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
8647                         return -EINVAL;
8648                 memcpy(&ibss.ht_capa,
8649                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
8650                        sizeof(ibss.ht_capa));
8651         }
8652
8653         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
8654             !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate,
8655                         nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
8656                 return -EINVAL;
8657
8658         if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
8659                 bool no_ht = false;
8660
8661                 connkeys = nl80211_parse_connkeys(rdev, info, &no_ht);
8662                 if (IS_ERR(connkeys))
8663                         return PTR_ERR(connkeys);
8664
8665                 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) &&
8666                     no_ht) {
8667                         kzfree(connkeys);
8668                         return -EINVAL;
8669                 }
8670         }
8671
8672         ibss.control_port =
8673                 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]);
8674
8675         ibss.userspace_handles_dfs =
8676                 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
8677
8678         err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
8679         if (err)
8680                 kzfree(connkeys);
8681         return err;
8682 }
8683
8684 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
8685 {
8686         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8687         struct net_device *dev = info->user_ptr[1];
8688
8689         if (!rdev->ops->leave_ibss)
8690                 return -EOPNOTSUPP;
8691
8692         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
8693                 return -EOPNOTSUPP;
8694
8695         return cfg80211_leave_ibss(rdev, dev, false);
8696 }
8697
8698 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info)
8699 {
8700         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8701         struct net_device *dev = info->user_ptr[1];
8702         int mcast_rate[NUM_NL80211_BANDS];
8703         u32 nla_rate;
8704         int err;
8705
8706         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
8707             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
8708             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB)
8709                 return -EOPNOTSUPP;
8710
8711         if (!rdev->ops->set_mcast_rate)
8712                 return -EOPNOTSUPP;
8713
8714         memset(mcast_rate, 0, sizeof(mcast_rate));
8715
8716         if (!info->attrs[NL80211_ATTR_MCAST_RATE])
8717                 return -EINVAL;
8718
8719         nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
8720         if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate))
8721                 return -EINVAL;
8722
8723         err = rdev_set_mcast_rate(rdev, dev, mcast_rate);
8724
8725         return err;
8726 }
8727
8728 static struct sk_buff *
8729 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
8730                             struct wireless_dev *wdev, int approxlen,
8731                             u32 portid, u32 seq, enum nl80211_commands cmd,
8732                             enum nl80211_attrs attr,
8733                             const struct nl80211_vendor_cmd_info *info,
8734                             gfp_t gfp)
8735 {
8736         struct sk_buff *skb;
8737         void *hdr;
8738         struct nlattr *data;
8739
8740         skb = nlmsg_new(approxlen + 100, gfp);
8741         if (!skb)
8742                 return NULL;
8743
8744         hdr = nl80211hdr_put(skb, portid, seq, 0, cmd);
8745         if (!hdr) {
8746                 kfree_skb(skb);
8747                 return NULL;
8748         }
8749
8750         if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
8751                 goto nla_put_failure;
8752
8753         if (info) {
8754                 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID,
8755                                 info->vendor_id))
8756                         goto nla_put_failure;
8757                 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD,
8758                                 info->subcmd))
8759                         goto nla_put_failure;
8760         }
8761
8762         if (wdev) {
8763                 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
8764                                       wdev_id(wdev), NL80211_ATTR_PAD))
8765                         goto nla_put_failure;
8766                 if (wdev->netdev &&
8767                     nla_put_u32(skb, NL80211_ATTR_IFINDEX,
8768                                 wdev->netdev->ifindex))
8769                         goto nla_put_failure;
8770         }
8771
8772         data = nla_nest_start(skb, attr);
8773         if (!data)
8774                 goto nla_put_failure;
8775
8776         ((void **)skb->cb)[0] = rdev;
8777         ((void **)skb->cb)[1] = hdr;
8778         ((void **)skb->cb)[2] = data;
8779
8780         return skb;
8781
8782  nla_put_failure:
8783         kfree_skb(skb);
8784         return NULL;
8785 }
8786
8787 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
8788                                            struct wireless_dev *wdev,
8789                                            enum nl80211_commands cmd,
8790                                            enum nl80211_attrs attr,
8791                                            int vendor_event_idx,
8792                                            int approxlen, gfp_t gfp)
8793 {
8794         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
8795         const struct nl80211_vendor_cmd_info *info;
8796
8797         switch (cmd) {
8798         case NL80211_CMD_TESTMODE:
8799                 if (WARN_ON(vendor_event_idx != -1))
8800                         return NULL;
8801                 info = NULL;
8802                 break;
8803         case NL80211_CMD_VENDOR:
8804                 if (WARN_ON(vendor_event_idx < 0 ||
8805                             vendor_event_idx >= wiphy->n_vendor_events))
8806                         return NULL;
8807                 info = &wiphy->vendor_events[vendor_event_idx];
8808                 break;
8809         default:
8810                 WARN_ON(1);
8811                 return NULL;
8812         }
8813
8814         return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, 0, 0,
8815                                            cmd, attr, info, gfp);
8816 }
8817 EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
8818
8819 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
8820 {
8821         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
8822         void *hdr = ((void **)skb->cb)[1];
8823         struct nlattr *data = ((void **)skb->cb)[2];
8824         enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
8825
8826         /* clear CB data for netlink core to own from now on */
8827         memset(skb->cb, 0, sizeof(skb->cb));
8828
8829         nla_nest_end(skb, data);
8830         genlmsg_end(skb, hdr);
8831
8832         if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
8833                 mcgrp = NL80211_MCGRP_VENDOR;
8834
8835         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0,
8836                                 mcgrp, gfp);
8837 }
8838 EXPORT_SYMBOL(__cfg80211_send_event_skb);
8839
8840 #ifdef CONFIG_NL80211_TESTMODE
8841 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
8842 {
8843         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8844         struct wireless_dev *wdev =
8845                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
8846         int err;
8847
8848         if (!rdev->ops->testmode_cmd)
8849                 return -EOPNOTSUPP;
8850
8851         if (IS_ERR(wdev)) {
8852                 err = PTR_ERR(wdev);
8853                 if (err != -EINVAL)
8854                         return err;
8855                 wdev = NULL;
8856         } else if (wdev->wiphy != &rdev->wiphy) {
8857                 return -EINVAL;
8858         }
8859
8860         if (!info->attrs[NL80211_ATTR_TESTDATA])
8861                 return -EINVAL;
8862
8863         rdev->cur_cmd_info = info;
8864         err = rdev_testmode_cmd(rdev, wdev,
8865                                 nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
8866                                 nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
8867         rdev->cur_cmd_info = NULL;
8868
8869         return err;
8870 }
8871
8872 static int nl80211_testmode_dump(struct sk_buff *skb,
8873                                  struct netlink_callback *cb)
8874 {
8875         struct cfg80211_registered_device *rdev;
8876         int err;
8877         long phy_idx;
8878         void *data = NULL;
8879         int data_len = 0;
8880
8881         rtnl_lock();
8882
8883         if (cb->args[0]) {
8884                 /*
8885                  * 0 is a valid index, but not valid for args[0],
8886                  * so we need to offset by 1.
8887                  */
8888                 phy_idx = cb->args[0] - 1;
8889
8890                 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
8891                 if (!rdev) {
8892                         err = -ENOENT;
8893                         goto out_err;
8894                 }
8895         } else {
8896                 struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
8897
8898                 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
8899                                   attrbuf, nl80211_fam.maxattr,
8900                                   nl80211_policy, NULL);
8901                 if (err)
8902                         goto out_err;
8903
8904                 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
8905                 if (IS_ERR(rdev)) {
8906                         err = PTR_ERR(rdev);
8907                         goto out_err;
8908                 }
8909                 phy_idx = rdev->wiphy_idx;
8910
8911                 if (attrbuf[NL80211_ATTR_TESTDATA])
8912                         cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA];
8913         }
8914
8915         if (cb->args[1]) {
8916                 data = nla_data((void *)cb->args[1]);
8917                 data_len = nla_len((void *)cb->args[1]);
8918         }
8919
8920         if (!rdev->ops->testmode_dump) {
8921                 err = -EOPNOTSUPP;
8922                 goto out_err;
8923         }
8924
8925         while (1) {
8926                 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
8927                                            cb->nlh->nlmsg_seq, NLM_F_MULTI,
8928                                            NL80211_CMD_TESTMODE);
8929                 struct nlattr *tmdata;
8930
8931                 if (!hdr)
8932                         break;
8933
8934                 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) {
8935                         genlmsg_cancel(skb, hdr);
8936                         break;
8937                 }
8938
8939                 tmdata = nla_nest_start(skb, NL80211_ATTR_TESTDATA);
8940                 if (!tmdata) {
8941                         genlmsg_cancel(skb, hdr);
8942                         break;
8943                 }
8944                 err = rdev_testmode_dump(rdev, skb, cb, data, data_len);
8945                 nla_nest_end(skb, tmdata);
8946
8947                 if (err == -ENOBUFS || err == -ENOENT) {
8948                         genlmsg_cancel(skb, hdr);
8949                         break;
8950                 } else if (err) {
8951                         genlmsg_cancel(skb, hdr);
8952                         goto out_err;
8953                 }
8954
8955                 genlmsg_end(skb, hdr);
8956         }
8957
8958         err = skb->len;
8959         /* see above */
8960         cb->args[0] = phy_idx + 1;
8961  out_err:
8962         rtnl_unlock();
8963         return err;
8964 }
8965 #endif
8966
8967 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
8968 {
8969         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8970         struct net_device *dev = info->user_ptr[1];
8971         struct cfg80211_connect_params connect;
8972         struct wiphy *wiphy;
8973         struct cfg80211_cached_keys *connkeys = NULL;
8974         int err;
8975
8976         memset(&connect, 0, sizeof(connect));
8977
8978         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8979                 return -EINVAL;
8980
8981         if (!info->attrs[NL80211_ATTR_SSID] ||
8982             !nla_len(info->attrs[NL80211_ATTR_SSID]))
8983                 return -EINVAL;
8984
8985         if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
8986                 connect.auth_type =
8987                         nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
8988                 if (!nl80211_valid_auth_type(rdev, connect.auth_type,
8989                                              NL80211_CMD_CONNECT))
8990                         return -EINVAL;
8991         } else
8992                 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
8993
8994         connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
8995
8996         if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] &&
8997             !wiphy_ext_feature_isset(&rdev->wiphy,
8998                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
8999                 return -EINVAL;
9000         connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS];
9001
9002         err = nl80211_crypto_settings(rdev, info, &connect.crypto,
9003                                       NL80211_MAX_NR_CIPHER_SUITES);
9004         if (err)
9005                 return err;
9006
9007         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9008             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9009                 return -EOPNOTSUPP;
9010
9011         wiphy = &rdev->wiphy;
9012
9013         connect.bg_scan_period = -1;
9014         if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] &&
9015                 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) {
9016                 connect.bg_scan_period =
9017                         nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]);
9018         }
9019
9020         if (info->attrs[NL80211_ATTR_MAC])
9021                 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
9022         else if (info->attrs[NL80211_ATTR_MAC_HINT])
9023                 connect.bssid_hint =
9024                         nla_data(info->attrs[NL80211_ATTR_MAC_HINT]);
9025         connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
9026         connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
9027
9028         if (info->attrs[NL80211_ATTR_IE]) {
9029                 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
9030                 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9031         }
9032
9033         if (info->attrs[NL80211_ATTR_USE_MFP]) {
9034                 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
9035                 if (connect.mfp == NL80211_MFP_OPTIONAL &&
9036                     !wiphy_ext_feature_isset(&rdev->wiphy,
9037                                              NL80211_EXT_FEATURE_MFP_OPTIONAL))
9038                         return -EOPNOTSUPP;
9039
9040                 if (connect.mfp != NL80211_MFP_REQUIRED &&
9041                     connect.mfp != NL80211_MFP_NO &&
9042                     connect.mfp != NL80211_MFP_OPTIONAL)
9043                         return -EINVAL;
9044         } else {
9045                 connect.mfp = NL80211_MFP_NO;
9046         }
9047
9048         if (info->attrs[NL80211_ATTR_PREV_BSSID])
9049                 connect.prev_bssid =
9050                         nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
9051
9052         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
9053                 connect.channel = nl80211_get_valid_chan(
9054                         wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ]);
9055                 if (!connect.channel)
9056                         return -EINVAL;
9057         } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) {
9058                 connect.channel_hint = nl80211_get_valid_chan(
9059                         wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]);
9060                 if (!connect.channel_hint)
9061                         return -EINVAL;
9062         }
9063
9064         if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
9065                 connkeys = nl80211_parse_connkeys(rdev, info, NULL);
9066                 if (IS_ERR(connkeys))
9067                         return PTR_ERR(connkeys);
9068         }
9069
9070         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
9071                 connect.flags |= ASSOC_REQ_DISABLE_HT;
9072
9073         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
9074                 memcpy(&connect.ht_capa_mask,
9075                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
9076                        sizeof(connect.ht_capa_mask));
9077
9078         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
9079                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
9080                         kzfree(connkeys);
9081                         return -EINVAL;
9082                 }
9083                 memcpy(&connect.ht_capa,
9084                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
9085                        sizeof(connect.ht_capa));
9086         }
9087
9088         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
9089                 connect.flags |= ASSOC_REQ_DISABLE_VHT;
9090
9091         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
9092                 memcpy(&connect.vht_capa_mask,
9093                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
9094                        sizeof(connect.vht_capa_mask));
9095
9096         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
9097                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
9098                         kzfree(connkeys);
9099                         return -EINVAL;
9100                 }
9101                 memcpy(&connect.vht_capa,
9102                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
9103                        sizeof(connect.vht_capa));
9104         }
9105
9106         if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
9107                 if (!((rdev->wiphy.features &
9108                         NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
9109                        (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
9110                     !wiphy_ext_feature_isset(&rdev->wiphy,
9111                                              NL80211_EXT_FEATURE_RRM)) {
9112                         kzfree(connkeys);
9113                         return -EINVAL;
9114                 }
9115                 connect.flags |= ASSOC_REQ_USE_RRM;
9116         }
9117
9118         connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
9119         if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) {
9120                 kzfree(connkeys);
9121                 return -EOPNOTSUPP;
9122         }
9123
9124         if (info->attrs[NL80211_ATTR_BSS_SELECT]) {
9125                 /* bss selection makes no sense if bssid is set */
9126                 if (connect.bssid) {
9127                         kzfree(connkeys);
9128                         return -EINVAL;
9129                 }
9130
9131                 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT],
9132                                        wiphy, &connect.bss_select);
9133                 if (err) {
9134                         kzfree(connkeys);
9135                         return err;
9136                 }
9137         }
9138
9139         if (wiphy_ext_feature_isset(&rdev->wiphy,
9140                                     NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
9141             info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
9142             info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
9143             info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
9144             info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
9145                 connect.fils_erp_username =
9146                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
9147                 connect.fils_erp_username_len =
9148                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
9149                 connect.fils_erp_realm =
9150                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
9151                 connect.fils_erp_realm_len =
9152                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
9153                 connect.fils_erp_next_seq_num =
9154                         nla_get_u16(
9155                            info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
9156                 connect.fils_erp_rrk =
9157                         nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
9158                 connect.fils_erp_rrk_len =
9159                         nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
9160         } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
9161                    info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
9162                    info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
9163                    info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
9164                 kzfree(connkeys);
9165                 return -EINVAL;
9166         }
9167
9168         if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) {
9169                 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
9170                         GENL_SET_ERR_MSG(info,
9171                                          "external auth requires connection ownership");
9172                         return -EINVAL;
9173                 }
9174                 connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT;
9175         }
9176
9177         wdev_lock(dev->ieee80211_ptr);
9178
9179         err = cfg80211_connect(rdev, dev, &connect, connkeys,
9180                                connect.prev_bssid);
9181         if (err)
9182                 kzfree(connkeys);
9183
9184         if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
9185                 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
9186                 if (connect.bssid)
9187                         memcpy(dev->ieee80211_ptr->disconnect_bssid,
9188                                connect.bssid, ETH_ALEN);
9189                 else
9190                         memset(dev->ieee80211_ptr->disconnect_bssid,
9191                                0, ETH_ALEN);
9192         }
9193
9194         wdev_unlock(dev->ieee80211_ptr);
9195
9196         return err;
9197 }
9198
9199 static int nl80211_update_connect_params(struct sk_buff *skb,
9200                                          struct genl_info *info)
9201 {
9202         struct cfg80211_connect_params connect = {};
9203         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9204         struct net_device *dev = info->user_ptr[1];
9205         struct wireless_dev *wdev = dev->ieee80211_ptr;
9206         u32 changed = 0;
9207         int ret;
9208
9209         if (!rdev->ops->update_connect_params)
9210                 return -EOPNOTSUPP;
9211
9212         if (info->attrs[NL80211_ATTR_IE]) {
9213                 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
9214                         return -EINVAL;
9215                 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
9216                 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9217                 changed |= UPDATE_ASSOC_IES;
9218         }
9219
9220         wdev_lock(dev->ieee80211_ptr);
9221         if (!wdev->current_bss)
9222                 ret = -ENOLINK;
9223         else
9224                 ret = rdev_update_connect_params(rdev, dev, &connect, changed);
9225         wdev_unlock(dev->ieee80211_ptr);
9226
9227         return ret;
9228 }
9229
9230 static int nl80211_disconnect(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         u16 reason;
9235         int ret;
9236
9237         if (!info->attrs[NL80211_ATTR_REASON_CODE])
9238                 reason = WLAN_REASON_DEAUTH_LEAVING;
9239         else
9240                 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
9241
9242         if (reason == 0)
9243                 return -EINVAL;
9244
9245         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9246             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9247                 return -EOPNOTSUPP;
9248
9249         wdev_lock(dev->ieee80211_ptr);
9250         ret = cfg80211_disconnect(rdev, dev, reason, true);
9251         wdev_unlock(dev->ieee80211_ptr);
9252         return ret;
9253 }
9254
9255 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
9256 {
9257         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9258         struct net *net;
9259         int err;
9260
9261         if (info->attrs[NL80211_ATTR_PID]) {
9262                 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
9263
9264                 net = get_net_ns_by_pid(pid);
9265         } else if (info->attrs[NL80211_ATTR_NETNS_FD]) {
9266                 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]);
9267
9268                 net = get_net_ns_by_fd(fd);
9269         } else {
9270                 return -EINVAL;
9271         }
9272
9273         if (IS_ERR(net))
9274                 return PTR_ERR(net);
9275
9276         err = 0;
9277
9278         /* check if anything to do */
9279         if (!net_eq(wiphy_net(&rdev->wiphy), net))
9280                 err = cfg80211_switch_netns(rdev, net);
9281
9282         put_net(net);
9283         return err;
9284 }
9285
9286 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
9287 {
9288         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9289         int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev,
9290                         struct cfg80211_pmksa *pmksa) = NULL;
9291         struct net_device *dev = info->user_ptr[1];
9292         struct cfg80211_pmksa pmksa;
9293
9294         memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
9295
9296         if (!info->attrs[NL80211_ATTR_PMKID])
9297                 return -EINVAL;
9298
9299         pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
9300
9301         if (info->attrs[NL80211_ATTR_MAC]) {
9302                 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
9303         } else if (info->attrs[NL80211_ATTR_SSID] &&
9304                    info->attrs[NL80211_ATTR_FILS_CACHE_ID] &&
9305                    (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA ||
9306                     info->attrs[NL80211_ATTR_PMK])) {
9307                 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
9308                 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
9309                 pmksa.cache_id =
9310                         nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]);
9311         } else {
9312                 return -EINVAL;
9313         }
9314         if (info->attrs[NL80211_ATTR_PMK]) {
9315                 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
9316                 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
9317         }
9318
9319         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9320             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9321                 return -EOPNOTSUPP;
9322
9323         switch (info->genlhdr->cmd) {
9324         case NL80211_CMD_SET_PMKSA:
9325                 rdev_ops = rdev->ops->set_pmksa;
9326                 break;
9327         case NL80211_CMD_DEL_PMKSA:
9328                 rdev_ops = rdev->ops->del_pmksa;
9329                 break;
9330         default:
9331                 WARN_ON(1);
9332                 break;
9333         }
9334
9335         if (!rdev_ops)
9336                 return -EOPNOTSUPP;
9337
9338         return rdev_ops(&rdev->wiphy, dev, &pmksa);
9339 }
9340
9341 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
9342 {
9343         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9344         struct net_device *dev = info->user_ptr[1];
9345
9346         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
9347             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
9348                 return -EOPNOTSUPP;
9349
9350         if (!rdev->ops->flush_pmksa)
9351                 return -EOPNOTSUPP;
9352
9353         return rdev_flush_pmksa(rdev, dev);
9354 }
9355
9356 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
9357 {
9358         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9359         struct net_device *dev = info->user_ptr[1];
9360         u8 action_code, dialog_token;
9361         u32 peer_capability = 0;
9362         u16 status_code;
9363         u8 *peer;
9364         bool initiator;
9365
9366         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
9367             !rdev->ops->tdls_mgmt)
9368                 return -EOPNOTSUPP;
9369
9370         if (!info->attrs[NL80211_ATTR_TDLS_ACTION] ||
9371             !info->attrs[NL80211_ATTR_STATUS_CODE] ||
9372             !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] ||
9373             !info->attrs[NL80211_ATTR_IE] ||
9374             !info->attrs[NL80211_ATTR_MAC])
9375                 return -EINVAL;
9376
9377         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
9378         action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
9379         status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
9380         dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
9381         initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]);
9382         if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
9383                 peer_capability =
9384                         nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
9385
9386         return rdev_tdls_mgmt(rdev, dev, peer, action_code,
9387                               dialog_token, status_code, peer_capability,
9388                               initiator,
9389                               nla_data(info->attrs[NL80211_ATTR_IE]),
9390                               nla_len(info->attrs[NL80211_ATTR_IE]));
9391 }
9392
9393 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info)
9394 {
9395         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9396         struct net_device *dev = info->user_ptr[1];
9397         enum nl80211_tdls_operation operation;
9398         u8 *peer;
9399
9400         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
9401             !rdev->ops->tdls_oper)
9402                 return -EOPNOTSUPP;
9403
9404         if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] ||
9405             !info->attrs[NL80211_ATTR_MAC])
9406                 return -EINVAL;
9407
9408         operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]);
9409         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
9410
9411         return rdev_tdls_oper(rdev, dev, peer, operation);
9412 }
9413
9414 static int nl80211_remain_on_channel(struct sk_buff *skb,
9415                                      struct genl_info *info)
9416 {
9417         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9418         struct wireless_dev *wdev = info->user_ptr[1];
9419         struct cfg80211_chan_def chandef;
9420         const struct cfg80211_chan_def *compat_chandef;
9421         struct sk_buff *msg;
9422         void *hdr;
9423         u64 cookie;
9424         u32 duration;
9425         int err;
9426
9427         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
9428             !info->attrs[NL80211_ATTR_DURATION])
9429                 return -EINVAL;
9430
9431         duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
9432
9433         if (!rdev->ops->remain_on_channel ||
9434             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL))
9435                 return -EOPNOTSUPP;
9436
9437         /*
9438          * We should be on that channel for at least a minimum amount of
9439          * time (10ms) but no longer than the driver supports.
9440          */
9441         if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
9442             duration > rdev->wiphy.max_remain_on_channel_duration)
9443                 return -EINVAL;
9444
9445         err = nl80211_parse_chandef(rdev, info, &chandef);
9446         if (err)
9447                 return err;
9448
9449         wdev_lock(wdev);
9450         if (!cfg80211_off_channel_oper_allowed(wdev) &&
9451             !cfg80211_chandef_identical(&wdev->chandef, &chandef)) {
9452                 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef,
9453                                                              &chandef);
9454                 if (compat_chandef != &chandef) {
9455                         wdev_unlock(wdev);
9456                         return -EBUSY;
9457                 }
9458         }
9459         wdev_unlock(wdev);
9460
9461         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9462         if (!msg)
9463                 return -ENOMEM;
9464
9465         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
9466                              NL80211_CMD_REMAIN_ON_CHANNEL);
9467         if (!hdr) {
9468                 err = -ENOBUFS;
9469                 goto free_msg;
9470         }
9471
9472         err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
9473                                      duration, &cookie);
9474
9475         if (err)
9476                 goto free_msg;
9477
9478         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
9479                               NL80211_ATTR_PAD))
9480                 goto nla_put_failure;
9481
9482         genlmsg_end(msg, hdr);
9483
9484         return genlmsg_reply(msg, info);
9485
9486  nla_put_failure:
9487         err = -ENOBUFS;
9488  free_msg:
9489         nlmsg_free(msg);
9490         return err;
9491 }
9492
9493 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
9494                                             struct genl_info *info)
9495 {
9496         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9497         struct wireless_dev *wdev = info->user_ptr[1];
9498         u64 cookie;
9499
9500         if (!info->attrs[NL80211_ATTR_COOKIE])
9501                 return -EINVAL;
9502
9503         if (!rdev->ops->cancel_remain_on_channel)
9504                 return -EOPNOTSUPP;
9505
9506         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
9507
9508         return rdev_cancel_remain_on_channel(rdev, wdev, cookie);
9509 }
9510
9511 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
9512                                        struct genl_info *info)
9513 {
9514         struct cfg80211_bitrate_mask mask;
9515         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9516         struct net_device *dev = info->user_ptr[1];
9517         int err;
9518
9519         if (!rdev->ops->set_bitrate_mask)
9520                 return -EOPNOTSUPP;
9521
9522         err = nl80211_parse_tx_bitrate_mask(info, &mask);
9523         if (err)
9524                 return err;
9525
9526         return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
9527 }
9528
9529 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
9530 {
9531         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9532         struct wireless_dev *wdev = info->user_ptr[1];
9533         u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
9534
9535         if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
9536                 return -EINVAL;
9537
9538         if (info->attrs[NL80211_ATTR_FRAME_TYPE])
9539                 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
9540
9541         switch (wdev->iftype) {
9542         case NL80211_IFTYPE_STATION:
9543         case NL80211_IFTYPE_ADHOC:
9544         case NL80211_IFTYPE_P2P_CLIENT:
9545         case NL80211_IFTYPE_AP:
9546         case NL80211_IFTYPE_AP_VLAN:
9547         case NL80211_IFTYPE_MESH_POINT:
9548         case NL80211_IFTYPE_P2P_GO:
9549         case NL80211_IFTYPE_P2P_DEVICE:
9550                 break;
9551         case NL80211_IFTYPE_NAN:
9552         default:
9553                 return -EOPNOTSUPP;
9554         }
9555
9556         /* not much point in registering if we can't reply */
9557         if (!rdev->ops->mgmt_tx)
9558                 return -EOPNOTSUPP;
9559
9560         return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type,
9561                         nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
9562                         nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]));
9563 }
9564
9565 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
9566 {
9567         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9568         struct wireless_dev *wdev = info->user_ptr[1];
9569         struct cfg80211_chan_def chandef;
9570         int err;
9571         void *hdr = NULL;
9572         u64 cookie;
9573         struct sk_buff *msg = NULL;
9574         struct cfg80211_mgmt_tx_params params = {
9575                 .dont_wait_for_ack =
9576                         info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK],
9577         };
9578
9579         if (!info->attrs[NL80211_ATTR_FRAME])
9580                 return -EINVAL;
9581
9582         if (!rdev->ops->mgmt_tx)
9583                 return -EOPNOTSUPP;
9584
9585         switch (wdev->iftype) {
9586         case NL80211_IFTYPE_P2P_DEVICE:
9587                 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
9588                         return -EINVAL;
9589         case NL80211_IFTYPE_STATION:
9590         case NL80211_IFTYPE_ADHOC:
9591         case NL80211_IFTYPE_P2P_CLIENT:
9592         case NL80211_IFTYPE_AP:
9593         case NL80211_IFTYPE_AP_VLAN:
9594         case NL80211_IFTYPE_MESH_POINT:
9595         case NL80211_IFTYPE_P2P_GO:
9596                 break;
9597         case NL80211_IFTYPE_NAN:
9598         default:
9599                 return -EOPNOTSUPP;
9600         }
9601
9602         if (info->attrs[NL80211_ATTR_DURATION]) {
9603                 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
9604                         return -EINVAL;
9605                 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
9606
9607                 /*
9608                  * We should wait on the channel for at least a minimum amount
9609                  * of time (10ms) but no longer than the driver supports.
9610                  */
9611                 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
9612                     params.wait > rdev->wiphy.max_remain_on_channel_duration)
9613                         return -EINVAL;
9614         }
9615
9616         params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
9617
9618         if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
9619                 return -EINVAL;
9620
9621         params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
9622
9623         /* get the channel if any has been specified, otherwise pass NULL to
9624          * the driver. The latter will use the current one
9625          */
9626         chandef.chan = NULL;
9627         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
9628                 err = nl80211_parse_chandef(rdev, info, &chandef);
9629                 if (err)
9630                         return err;
9631         }
9632
9633         if (!chandef.chan && params.offchan)
9634                 return -EINVAL;
9635
9636         wdev_lock(wdev);
9637         if (params.offchan && !cfg80211_off_channel_oper_allowed(wdev)) {
9638                 wdev_unlock(wdev);
9639                 return -EBUSY;
9640         }
9641         wdev_unlock(wdev);
9642
9643         params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
9644         params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
9645
9646         if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) {
9647                 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
9648                 int i;
9649
9650                 if (len % sizeof(u16))
9651                         return -EINVAL;
9652
9653                 params.n_csa_offsets = len / sizeof(u16);
9654                 params.csa_offsets =
9655                         nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
9656
9657                 /* check that all the offsets fit the frame */
9658                 for (i = 0; i < params.n_csa_offsets; i++) {
9659                         if (params.csa_offsets[i] >= params.len)
9660                                 return -EINVAL;
9661                 }
9662         }
9663
9664         if (!params.dont_wait_for_ack) {
9665                 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9666                 if (!msg)
9667                         return -ENOMEM;
9668
9669                 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
9670                                      NL80211_CMD_FRAME);
9671                 if (!hdr) {
9672                         err = -ENOBUFS;
9673                         goto free_msg;
9674                 }
9675         }
9676
9677         params.chan = chandef.chan;
9678         err = cfg80211_mlme_mgmt_tx(rdev, wdev, &params, &cookie);
9679         if (err)
9680                 goto free_msg;
9681
9682         if (msg) {
9683                 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
9684                                       NL80211_ATTR_PAD))
9685                         goto nla_put_failure;
9686
9687                 genlmsg_end(msg, hdr);
9688                 return genlmsg_reply(msg, info);
9689         }
9690
9691         return 0;
9692
9693  nla_put_failure:
9694         err = -ENOBUFS;
9695  free_msg:
9696         nlmsg_free(msg);
9697         return err;
9698 }
9699
9700 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
9701 {
9702         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9703         struct wireless_dev *wdev = info->user_ptr[1];
9704         u64 cookie;
9705
9706         if (!info->attrs[NL80211_ATTR_COOKIE])
9707                 return -EINVAL;
9708
9709         if (!rdev->ops->mgmt_tx_cancel_wait)
9710                 return -EOPNOTSUPP;
9711
9712         switch (wdev->iftype) {
9713         case NL80211_IFTYPE_STATION:
9714         case NL80211_IFTYPE_ADHOC:
9715         case NL80211_IFTYPE_P2P_CLIENT:
9716         case NL80211_IFTYPE_AP:
9717         case NL80211_IFTYPE_AP_VLAN:
9718         case NL80211_IFTYPE_P2P_GO:
9719         case NL80211_IFTYPE_P2P_DEVICE:
9720                 break;
9721         case NL80211_IFTYPE_NAN:
9722         default:
9723                 return -EOPNOTSUPP;
9724         }
9725
9726         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
9727
9728         return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie);
9729 }
9730
9731 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
9732 {
9733         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9734         struct wireless_dev *wdev;
9735         struct net_device *dev = info->user_ptr[1];
9736         u8 ps_state;
9737         bool state;
9738         int err;
9739
9740         if (!info->attrs[NL80211_ATTR_PS_STATE])
9741                 return -EINVAL;
9742
9743         ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
9744
9745         if (ps_state != NL80211_PS_DISABLED && ps_state != NL80211_PS_ENABLED)
9746                 return -EINVAL;
9747
9748         wdev = dev->ieee80211_ptr;
9749
9750         if (!rdev->ops->set_power_mgmt)
9751                 return -EOPNOTSUPP;
9752
9753         state = (ps_state == NL80211_PS_ENABLED) ? true : false;
9754
9755         if (state == wdev->ps)
9756                 return 0;
9757
9758         err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout);
9759         if (!err)
9760                 wdev->ps = state;
9761         return err;
9762 }
9763
9764 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
9765 {
9766         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9767         enum nl80211_ps_state ps_state;
9768         struct wireless_dev *wdev;
9769         struct net_device *dev = info->user_ptr[1];
9770         struct sk_buff *msg;
9771         void *hdr;
9772         int err;
9773
9774         wdev = dev->ieee80211_ptr;
9775
9776         if (!rdev->ops->set_power_mgmt)
9777                 return -EOPNOTSUPP;
9778
9779         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9780         if (!msg)
9781                 return -ENOMEM;
9782
9783         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
9784                              NL80211_CMD_GET_POWER_SAVE);
9785         if (!hdr) {
9786                 err = -ENOBUFS;
9787                 goto free_msg;
9788         }
9789
9790         if (wdev->ps)
9791                 ps_state = NL80211_PS_ENABLED;
9792         else
9793                 ps_state = NL80211_PS_DISABLED;
9794
9795         if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state))
9796                 goto nla_put_failure;
9797
9798         genlmsg_end(msg, hdr);
9799         return genlmsg_reply(msg, info);
9800
9801  nla_put_failure:
9802         err = -ENOBUFS;
9803  free_msg:
9804         nlmsg_free(msg);
9805         return err;
9806 }
9807
9808 static const struct nla_policy
9809 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
9810         [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY },
9811         [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 },
9812         [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
9813         [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
9814         [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
9815         [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
9816         [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 },
9817 };
9818
9819 static int nl80211_set_cqm_txe(struct genl_info *info,
9820                                u32 rate, u32 pkts, u32 intvl)
9821 {
9822         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9823         struct net_device *dev = info->user_ptr[1];
9824         struct wireless_dev *wdev = dev->ieee80211_ptr;
9825
9826         if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL)
9827                 return -EINVAL;
9828
9829         if (!rdev->ops->set_cqm_txe_config)
9830                 return -EOPNOTSUPP;
9831
9832         if (wdev->iftype != NL80211_IFTYPE_STATION &&
9833             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
9834                 return -EOPNOTSUPP;
9835
9836         return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl);
9837 }
9838
9839 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
9840                                     struct net_device *dev)
9841 {
9842         struct wireless_dev *wdev = dev->ieee80211_ptr;
9843         s32 last, low, high;
9844         u32 hyst;
9845         int i, n;
9846         int err;
9847
9848         /* RSSI reporting disabled? */
9849         if (!wdev->cqm_config)
9850                 return rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0);
9851
9852         /*
9853          * Obtain current RSSI value if possible, if not and no RSSI threshold
9854          * event has been received yet, we should receive an event after a
9855          * connection is established and enough beacons received to calculate
9856          * the average.
9857          */
9858         if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss &&
9859             rdev->ops->get_station) {
9860                 struct station_info sinfo = {};
9861                 u8 *mac_addr;
9862
9863                 mac_addr = wdev->current_bss->pub.bssid;
9864
9865                 err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
9866                 if (err)
9867                         return err;
9868
9869                 if (sinfo.filled & BIT(NL80211_STA_INFO_BEACON_SIGNAL_AVG))
9870                         wdev->cqm_config->last_rssi_event_value =
9871                                 (s8) sinfo.rx_beacon_signal_avg;
9872         }
9873
9874         last = wdev->cqm_config->last_rssi_event_value;
9875         hyst = wdev->cqm_config->rssi_hyst;
9876         n = wdev->cqm_config->n_rssi_thresholds;
9877
9878         for (i = 0; i < n; i++)
9879                 if (last < wdev->cqm_config->rssi_thresholds[i])
9880                         break;
9881
9882         low = i > 0 ?
9883                 (wdev->cqm_config->rssi_thresholds[i - 1] - hyst) : S32_MIN;
9884         high = i < n ?
9885                 (wdev->cqm_config->rssi_thresholds[i] + hyst - 1) : S32_MAX;
9886
9887         return rdev_set_cqm_rssi_range_config(rdev, dev, low, high);
9888 }
9889
9890 static int nl80211_set_cqm_rssi(struct genl_info *info,
9891                                 const s32 *thresholds, int n_thresholds,
9892                                 u32 hysteresis)
9893 {
9894         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9895         struct net_device *dev = info->user_ptr[1];
9896         struct wireless_dev *wdev = dev->ieee80211_ptr;
9897         int i, err;
9898         s32 prev = S32_MIN;
9899
9900         /* Check all values negative and sorted */
9901         for (i = 0; i < n_thresholds; i++) {
9902                 if (thresholds[i] > 0 || thresholds[i] <= prev)
9903                         return -EINVAL;
9904
9905                 prev = thresholds[i];
9906         }
9907
9908         if (wdev->iftype != NL80211_IFTYPE_STATION &&
9909             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
9910                 return -EOPNOTSUPP;
9911
9912         wdev_lock(wdev);
9913         cfg80211_cqm_config_free(wdev);
9914         wdev_unlock(wdev);
9915
9916         if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) {
9917                 if (n_thresholds == 0 || thresholds[0] == 0) /* Disabling */
9918                         return rdev_set_cqm_rssi_config(rdev, dev, 0, 0);
9919
9920                 return rdev_set_cqm_rssi_config(rdev, dev,
9921                                                 thresholds[0], hysteresis);
9922         }
9923
9924         if (!wiphy_ext_feature_isset(&rdev->wiphy,
9925                                      NL80211_EXT_FEATURE_CQM_RSSI_LIST))
9926                 return -EOPNOTSUPP;
9927
9928         if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */
9929                 n_thresholds = 0;
9930
9931         wdev_lock(wdev);
9932         if (n_thresholds) {
9933                 struct cfg80211_cqm_config *cqm_config;
9934
9935                 cqm_config = kzalloc(sizeof(struct cfg80211_cqm_config) +
9936                                      n_thresholds * sizeof(s32), GFP_KERNEL);
9937                 if (!cqm_config) {
9938                         err = -ENOMEM;
9939                         goto unlock;
9940                 }
9941
9942                 cqm_config->rssi_hyst = hysteresis;
9943                 cqm_config->n_rssi_thresholds = n_thresholds;
9944                 memcpy(cqm_config->rssi_thresholds, thresholds,
9945                        n_thresholds * sizeof(s32));
9946
9947                 wdev->cqm_config = cqm_config;
9948         }
9949
9950         err = cfg80211_cqm_rssi_update(rdev, dev);
9951
9952 unlock:
9953         wdev_unlock(wdev);
9954
9955         return err;
9956 }
9957
9958 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
9959 {
9960         struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1];
9961         struct nlattr *cqm;
9962         int err;
9963
9964         cqm = info->attrs[NL80211_ATTR_CQM];
9965         if (!cqm)
9966                 return -EINVAL;
9967
9968         err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm,
9969                                nl80211_attr_cqm_policy, info->extack);
9970         if (err)
9971                 return err;
9972
9973         if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
9974             attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
9975                 const s32 *thresholds =
9976                         nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
9977                 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
9978                 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
9979
9980                 if (len % 4)
9981                         return -EINVAL;
9982
9983                 return nl80211_set_cqm_rssi(info, thresholds, len / 4,
9984                                             hysteresis);
9985         }
9986
9987         if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
9988             attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
9989             attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
9990                 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
9991                 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
9992                 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
9993
9994                 return nl80211_set_cqm_txe(info, rate, pkts, intvl);
9995         }
9996
9997         return -EINVAL;
9998 }
9999
10000 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info)
10001 {
10002         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10003         struct net_device *dev = info->user_ptr[1];
10004         struct ocb_setup setup = {};
10005         int err;
10006
10007         err = nl80211_parse_chandef(rdev, info, &setup.chandef);
10008         if (err)
10009                 return err;
10010
10011         return cfg80211_join_ocb(rdev, dev, &setup);
10012 }
10013
10014 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info)
10015 {
10016         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10017         struct net_device *dev = info->user_ptr[1];
10018
10019         return cfg80211_leave_ocb(rdev, dev);
10020 }
10021
10022 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
10023 {
10024         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10025         struct net_device *dev = info->user_ptr[1];
10026         struct mesh_config cfg;
10027         struct mesh_setup setup;
10028         int err;
10029
10030         /* start with default */
10031         memcpy(&cfg, &default_mesh_config, sizeof(cfg));
10032         memcpy(&setup, &default_mesh_setup, sizeof(setup));
10033
10034         if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
10035                 /* and parse parameters if given */
10036                 err = nl80211_parse_mesh_config(info, &cfg, NULL);
10037                 if (err)
10038                         return err;
10039         }
10040
10041         if (!info->attrs[NL80211_ATTR_MESH_ID] ||
10042             !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
10043                 return -EINVAL;
10044
10045         setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
10046         setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
10047
10048         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
10049             !nl80211_parse_mcast_rate(rdev, setup.mcast_rate,
10050                             nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
10051                         return -EINVAL;
10052
10053         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
10054                 setup.beacon_interval =
10055                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
10056
10057                 err = cfg80211_validate_beacon_int(rdev,
10058                                                    NL80211_IFTYPE_MESH_POINT,
10059                                                    setup.beacon_interval);
10060                 if (err)
10061                         return err;
10062         }
10063
10064         if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
10065                 setup.dtim_period =
10066                         nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
10067                 if (setup.dtim_period < 1 || setup.dtim_period > 100)
10068                         return -EINVAL;
10069         }
10070
10071         if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
10072                 /* parse additional setup parameters if given */
10073                 err = nl80211_parse_mesh_setup(info, &setup);
10074                 if (err)
10075                         return err;
10076         }
10077
10078         if (setup.user_mpm)
10079                 cfg.auto_open_plinks = false;
10080
10081         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
10082                 err = nl80211_parse_chandef(rdev, info, &setup.chandef);
10083                 if (err)
10084                         return err;
10085         } else {
10086                 /* cfg80211_join_mesh() will sort it out */
10087                 setup.chandef.chan = NULL;
10088         }
10089
10090         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
10091                 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
10092                 int n_rates =
10093                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
10094                 struct ieee80211_supported_band *sband;
10095
10096                 if (!setup.chandef.chan)
10097                         return -EINVAL;
10098
10099                 sband = rdev->wiphy.bands[setup.chandef.chan->band];
10100
10101                 err = ieee80211_get_ratemask(sband, rates, n_rates,
10102                                              &setup.basic_rates);
10103                 if (err)
10104                         return err;
10105         }
10106
10107         if (info->attrs[NL80211_ATTR_TX_RATES]) {
10108                 err = nl80211_parse_tx_bitrate_mask(info, &setup.beacon_rate);
10109                 if (err)
10110                         return err;
10111
10112                 if (!setup.chandef.chan)
10113                         return -EINVAL;
10114
10115                 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band,
10116                                               &setup.beacon_rate);
10117                 if (err)
10118                         return err;
10119         }
10120
10121         setup.userspace_handles_dfs =
10122                 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
10123
10124         return cfg80211_join_mesh(rdev, dev, &setup, &cfg);
10125 }
10126
10127 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
10128 {
10129         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10130         struct net_device *dev = info->user_ptr[1];
10131
10132         return cfg80211_leave_mesh(rdev, dev);
10133 }
10134
10135 #ifdef CONFIG_PM
10136 static int nl80211_send_wowlan_patterns(struct sk_buff *msg,
10137                                         struct cfg80211_registered_device *rdev)
10138 {
10139         struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config;
10140         struct nlattr *nl_pats, *nl_pat;
10141         int i, pat_len;
10142
10143         if (!wowlan->n_patterns)
10144                 return 0;
10145
10146         nl_pats = nla_nest_start(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN);
10147         if (!nl_pats)
10148                 return -ENOBUFS;
10149
10150         for (i = 0; i < wowlan->n_patterns; i++) {
10151                 nl_pat = nla_nest_start(msg, i + 1);
10152                 if (!nl_pat)
10153                         return -ENOBUFS;
10154                 pat_len = wowlan->patterns[i].pattern_len;
10155                 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8),
10156                             wowlan->patterns[i].mask) ||
10157                     nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
10158                             wowlan->patterns[i].pattern) ||
10159                     nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
10160                                 wowlan->patterns[i].pkt_offset))
10161                         return -ENOBUFS;
10162                 nla_nest_end(msg, nl_pat);
10163         }
10164         nla_nest_end(msg, nl_pats);
10165
10166         return 0;
10167 }
10168
10169 static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
10170                                    struct cfg80211_wowlan_tcp *tcp)
10171 {
10172         struct nlattr *nl_tcp;
10173
10174         if (!tcp)
10175                 return 0;
10176
10177         nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
10178         if (!nl_tcp)
10179                 return -ENOBUFS;
10180
10181         if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) ||
10182             nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) ||
10183             nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) ||
10184             nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) ||
10185             nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) ||
10186             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
10187                     tcp->payload_len, tcp->payload) ||
10188             nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
10189                         tcp->data_interval) ||
10190             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
10191                     tcp->wake_len, tcp->wake_data) ||
10192             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK,
10193                     DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask))
10194                 return -ENOBUFS;
10195
10196         if (tcp->payload_seq.len &&
10197             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
10198                     sizeof(tcp->payload_seq), &tcp->payload_seq))
10199                 return -ENOBUFS;
10200
10201         if (tcp->payload_tok.len &&
10202             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
10203                     sizeof(tcp->payload_tok) + tcp->tokens_size,
10204                     &tcp->payload_tok))
10205                 return -ENOBUFS;
10206
10207         nla_nest_end(msg, nl_tcp);
10208
10209         return 0;
10210 }
10211
10212 static int nl80211_send_wowlan_nd(struct sk_buff *msg,
10213                                   struct cfg80211_sched_scan_request *req)
10214 {
10215         struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan;
10216         int i;
10217
10218         if (!req)
10219                 return 0;
10220
10221         nd = nla_nest_start(msg, NL80211_WOWLAN_TRIG_NET_DETECT);
10222         if (!nd)
10223                 return -ENOBUFS;
10224
10225         if (req->n_scan_plans == 1 &&
10226             nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL,
10227                         req->scan_plans[0].interval * 1000))
10228                 return -ENOBUFS;
10229
10230         if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay))
10231                 return -ENOBUFS;
10232
10233         if (req->relative_rssi_set) {
10234                 struct nl80211_bss_select_rssi_adjust rssi_adjust;
10235
10236                 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI,
10237                                req->relative_rssi))
10238                         return -ENOBUFS;
10239
10240                 rssi_adjust.band = req->rssi_adjust.band;
10241                 rssi_adjust.delta = req->rssi_adjust.delta;
10242                 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST,
10243                             sizeof(rssi_adjust), &rssi_adjust))
10244                         return -ENOBUFS;
10245         }
10246
10247         freqs = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
10248         if (!freqs)
10249                 return -ENOBUFS;
10250
10251         for (i = 0; i < req->n_channels; i++) {
10252                 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
10253                         return -ENOBUFS;
10254         }
10255
10256         nla_nest_end(msg, freqs);
10257
10258         if (req->n_match_sets) {
10259                 matches = nla_nest_start(msg, NL80211_ATTR_SCHED_SCAN_MATCH);
10260                 if (!matches)
10261                         return -ENOBUFS;
10262
10263                 for (i = 0; i < req->n_match_sets; i++) {
10264                         match = nla_nest_start(msg, i);
10265                         if (!match)
10266                                 return -ENOBUFS;
10267
10268                         if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
10269                                     req->match_sets[i].ssid.ssid_len,
10270                                     req->match_sets[i].ssid.ssid))
10271                                 return -ENOBUFS;
10272                         nla_nest_end(msg, match);
10273                 }
10274                 nla_nest_end(msg, matches);
10275         }
10276
10277         scan_plans = nla_nest_start(msg, NL80211_ATTR_SCHED_SCAN_PLANS);
10278         if (!scan_plans)
10279                 return -ENOBUFS;
10280
10281         for (i = 0; i < req->n_scan_plans; i++) {
10282                 scan_plan = nla_nest_start(msg, i + 1);
10283                 if (!scan_plan)
10284                         return -ENOBUFS;
10285
10286                 if (!scan_plan ||
10287                     nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL,
10288                                 req->scan_plans[i].interval) ||
10289                     (req->scan_plans[i].iterations &&
10290                      nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS,
10291                                  req->scan_plans[i].iterations)))
10292                         return -ENOBUFS;
10293                 nla_nest_end(msg, scan_plan);
10294         }
10295         nla_nest_end(msg, scan_plans);
10296
10297         nla_nest_end(msg, nd);
10298
10299         return 0;
10300 }
10301
10302 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
10303 {
10304         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10305         struct sk_buff *msg;
10306         void *hdr;
10307         u32 size = NLMSG_DEFAULT_SIZE;
10308
10309         if (!rdev->wiphy.wowlan)
10310                 return -EOPNOTSUPP;
10311
10312         if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) {
10313                 /* adjust size to have room for all the data */
10314                 size += rdev->wiphy.wowlan_config->tcp->tokens_size +
10315                         rdev->wiphy.wowlan_config->tcp->payload_len +
10316                         rdev->wiphy.wowlan_config->tcp->wake_len +
10317                         rdev->wiphy.wowlan_config->tcp->wake_len / 8;
10318         }
10319
10320         msg = nlmsg_new(size, GFP_KERNEL);
10321         if (!msg)
10322                 return -ENOMEM;
10323
10324         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10325                              NL80211_CMD_GET_WOWLAN);
10326         if (!hdr)
10327                 goto nla_put_failure;
10328
10329         if (rdev->wiphy.wowlan_config) {
10330                 struct nlattr *nl_wowlan;
10331
10332                 nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
10333                 if (!nl_wowlan)
10334                         goto nla_put_failure;
10335
10336                 if ((rdev->wiphy.wowlan_config->any &&
10337                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
10338                     (rdev->wiphy.wowlan_config->disconnect &&
10339                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
10340                     (rdev->wiphy.wowlan_config->magic_pkt &&
10341                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
10342                     (rdev->wiphy.wowlan_config->gtk_rekey_failure &&
10343                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
10344                     (rdev->wiphy.wowlan_config->eap_identity_req &&
10345                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
10346                     (rdev->wiphy.wowlan_config->four_way_handshake &&
10347                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
10348                     (rdev->wiphy.wowlan_config->rfkill_release &&
10349                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
10350                         goto nla_put_failure;
10351
10352                 if (nl80211_send_wowlan_patterns(msg, rdev))
10353                         goto nla_put_failure;
10354
10355                 if (nl80211_send_wowlan_tcp(msg,
10356                                             rdev->wiphy.wowlan_config->tcp))
10357                         goto nla_put_failure;
10358
10359                 if (nl80211_send_wowlan_nd(
10360                             msg,
10361                             rdev->wiphy.wowlan_config->nd_config))
10362                         goto nla_put_failure;
10363
10364                 nla_nest_end(msg, nl_wowlan);
10365         }
10366
10367         genlmsg_end(msg, hdr);
10368         return genlmsg_reply(msg, info);
10369
10370 nla_put_failure:
10371         nlmsg_free(msg);
10372         return -ENOBUFS;
10373 }
10374
10375 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev,
10376                                     struct nlattr *attr,
10377                                     struct cfg80211_wowlan *trig)
10378 {
10379         struct nlattr *tb[NUM_NL80211_WOWLAN_TCP];
10380         struct cfg80211_wowlan_tcp *cfg;
10381         struct nl80211_wowlan_tcp_data_token *tok = NULL;
10382         struct nl80211_wowlan_tcp_data_seq *seq = NULL;
10383         u32 size;
10384         u32 data_size, wake_size, tokens_size = 0, wake_mask_size;
10385         int err, port;
10386
10387         if (!rdev->wiphy.wowlan->tcp)
10388                 return -EINVAL;
10389
10390         err = nla_parse_nested(tb, MAX_NL80211_WOWLAN_TCP, attr,
10391                                nl80211_wowlan_tcp_policy, NULL);
10392         if (err)
10393                 return err;
10394
10395         if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] ||
10396             !tb[NL80211_WOWLAN_TCP_DST_IPV4] ||
10397             !tb[NL80211_WOWLAN_TCP_DST_MAC] ||
10398             !tb[NL80211_WOWLAN_TCP_DST_PORT] ||
10399             !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] ||
10400             !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] ||
10401             !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] ||
10402             !tb[NL80211_WOWLAN_TCP_WAKE_MASK])
10403                 return -EINVAL;
10404
10405         data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]);
10406         if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max)
10407                 return -EINVAL;
10408
10409         if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) >
10410                         rdev->wiphy.wowlan->tcp->data_interval_max ||
10411             nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0)
10412                 return -EINVAL;
10413
10414         wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]);
10415         if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max)
10416                 return -EINVAL;
10417
10418         wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]);
10419         if (wake_mask_size != DIV_ROUND_UP(wake_size, 8))
10420                 return -EINVAL;
10421
10422         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) {
10423                 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
10424
10425                 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
10426                 tokens_size = tokln - sizeof(*tok);
10427
10428                 if (!tok->len || tokens_size % tok->len)
10429                         return -EINVAL;
10430                 if (!rdev->wiphy.wowlan->tcp->tok)
10431                         return -EINVAL;
10432                 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len)
10433                         return -EINVAL;
10434                 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len)
10435                         return -EINVAL;
10436                 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize)
10437                         return -EINVAL;
10438                 if (tok->offset + tok->len > data_size)
10439                         return -EINVAL;
10440         }
10441
10442         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) {
10443                 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]);
10444                 if (!rdev->wiphy.wowlan->tcp->seq)
10445                         return -EINVAL;
10446                 if (seq->len == 0 || seq->len > 4)
10447                         return -EINVAL;
10448                 if (seq->len + seq->offset > data_size)
10449                         return -EINVAL;
10450         }
10451
10452         size = sizeof(*cfg);
10453         size += data_size;
10454         size += wake_size + wake_mask_size;
10455         size += tokens_size;
10456
10457         cfg = kzalloc(size, GFP_KERNEL);
10458         if (!cfg)
10459                 return -ENOMEM;
10460         cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]);
10461         cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]);
10462         memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]),
10463                ETH_ALEN);
10464         if (tb[NL80211_WOWLAN_TCP_SRC_PORT])
10465                 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]);
10466         else
10467                 port = 0;
10468 #ifdef CONFIG_INET
10469         /* allocate a socket and port for it and use it */
10470         err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM,
10471                             IPPROTO_TCP, &cfg->sock, 1);
10472         if (err) {
10473                 kfree(cfg);
10474                 return err;
10475         }
10476         if (inet_csk_get_port(cfg->sock->sk, port)) {
10477                 sock_release(cfg->sock);
10478                 kfree(cfg);
10479                 return -EADDRINUSE;
10480         }
10481         cfg->src_port = inet_sk(cfg->sock->sk)->inet_num;
10482 #else
10483         if (!port) {
10484                 kfree(cfg);
10485                 return -EINVAL;
10486         }
10487         cfg->src_port = port;
10488 #endif
10489
10490         cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]);
10491         cfg->payload_len = data_size;
10492         cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size;
10493         memcpy((void *)cfg->payload,
10494                nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]),
10495                data_size);
10496         if (seq)
10497                 cfg->payload_seq = *seq;
10498         cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]);
10499         cfg->wake_len = wake_size;
10500         cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size;
10501         memcpy((void *)cfg->wake_data,
10502                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]),
10503                wake_size);
10504         cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size +
10505                          data_size + wake_size;
10506         memcpy((void *)cfg->wake_mask,
10507                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]),
10508                wake_mask_size);
10509         if (tok) {
10510                 cfg->tokens_size = tokens_size;
10511                 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size);
10512         }
10513
10514         trig->tcp = cfg;
10515
10516         return 0;
10517 }
10518
10519 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev,
10520                                    const struct wiphy_wowlan_support *wowlan,
10521                                    struct nlattr *attr,
10522                                    struct cfg80211_wowlan *trig)
10523 {
10524         struct nlattr **tb;
10525         int err;
10526
10527         tb = kzalloc(NUM_NL80211_ATTR * sizeof(*tb), GFP_KERNEL);
10528         if (!tb)
10529                 return -ENOMEM;
10530
10531         if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) {
10532                 err = -EOPNOTSUPP;
10533                 goto out;
10534         }
10535
10536         err = nla_parse_nested(tb, NL80211_ATTR_MAX, attr, nl80211_policy,
10537                                NULL);
10538         if (err)
10539                 goto out;
10540
10541         trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb,
10542                                                    wowlan->max_nd_match_sets);
10543         err = PTR_ERR_OR_ZERO(trig->nd_config);
10544         if (err)
10545                 trig->nd_config = NULL;
10546
10547 out:
10548         kfree(tb);
10549         return err;
10550 }
10551
10552 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
10553 {
10554         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10555         struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG];
10556         struct cfg80211_wowlan new_triggers = {};
10557         struct cfg80211_wowlan *ntrig;
10558         const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan;
10559         int err, i;
10560         bool prev_enabled = rdev->wiphy.wowlan_config;
10561         bool regular = false;
10562
10563         if (!wowlan)
10564                 return -EOPNOTSUPP;
10565
10566         if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) {
10567                 cfg80211_rdev_free_wowlan(rdev);
10568                 rdev->wiphy.wowlan_config = NULL;
10569                 goto set_wakeup;
10570         }
10571
10572         err = nla_parse_nested(tb, MAX_NL80211_WOWLAN_TRIG,
10573                                info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS],
10574                                nl80211_wowlan_policy, info->extack);
10575         if (err)
10576                 return err;
10577
10578         if (tb[NL80211_WOWLAN_TRIG_ANY]) {
10579                 if (!(wowlan->flags & WIPHY_WOWLAN_ANY))
10580                         return -EINVAL;
10581                 new_triggers.any = true;
10582         }
10583
10584         if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) {
10585                 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT))
10586                         return -EINVAL;
10587                 new_triggers.disconnect = true;
10588                 regular = true;
10589         }
10590
10591         if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) {
10592                 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT))
10593                         return -EINVAL;
10594                 new_triggers.magic_pkt = true;
10595                 regular = true;
10596         }
10597
10598         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED])
10599                 return -EINVAL;
10600
10601         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) {
10602                 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE))
10603                         return -EINVAL;
10604                 new_triggers.gtk_rekey_failure = true;
10605                 regular = true;
10606         }
10607
10608         if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) {
10609                 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ))
10610                         return -EINVAL;
10611                 new_triggers.eap_identity_req = true;
10612                 regular = true;
10613         }
10614
10615         if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) {
10616                 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE))
10617                         return -EINVAL;
10618                 new_triggers.four_way_handshake = true;
10619                 regular = true;
10620         }
10621
10622         if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) {
10623                 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE))
10624                         return -EINVAL;
10625                 new_triggers.rfkill_release = true;
10626                 regular = true;
10627         }
10628
10629         if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) {
10630                 struct nlattr *pat;
10631                 int n_patterns = 0;
10632                 int rem, pat_len, mask_len, pkt_offset;
10633                 struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
10634
10635                 regular = true;
10636
10637                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
10638                                     rem)
10639                         n_patterns++;
10640                 if (n_patterns > wowlan->n_patterns)
10641                         return -EINVAL;
10642
10643                 new_triggers.patterns = kcalloc(n_patterns,
10644                                                 sizeof(new_triggers.patterns[0]),
10645                                                 GFP_KERNEL);
10646                 if (!new_triggers.patterns)
10647                         return -ENOMEM;
10648
10649                 new_triggers.n_patterns = n_patterns;
10650                 i = 0;
10651
10652                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
10653                                     rem) {
10654                         u8 *mask_pat;
10655
10656                         nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat,
10657                                          nl80211_packet_pattern_policy,
10658                                          info->extack);
10659                         err = -EINVAL;
10660                         if (!pat_tb[NL80211_PKTPAT_MASK] ||
10661                             !pat_tb[NL80211_PKTPAT_PATTERN])
10662                                 goto error;
10663                         pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
10664                         mask_len = DIV_ROUND_UP(pat_len, 8);
10665                         if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
10666                                 goto error;
10667                         if (pat_len > wowlan->pattern_max_len ||
10668                             pat_len < wowlan->pattern_min_len)
10669                                 goto error;
10670
10671                         if (!pat_tb[NL80211_PKTPAT_OFFSET])
10672                                 pkt_offset = 0;
10673                         else
10674                                 pkt_offset = nla_get_u32(
10675                                         pat_tb[NL80211_PKTPAT_OFFSET]);
10676                         if (pkt_offset > wowlan->max_pkt_offset)
10677                                 goto error;
10678                         new_triggers.patterns[i].pkt_offset = pkt_offset;
10679
10680                         mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
10681                         if (!mask_pat) {
10682                                 err = -ENOMEM;
10683                                 goto error;
10684                         }
10685                         new_triggers.patterns[i].mask = mask_pat;
10686                         memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
10687                                mask_len);
10688                         mask_pat += mask_len;
10689                         new_triggers.patterns[i].pattern = mask_pat;
10690                         new_triggers.patterns[i].pattern_len = pat_len;
10691                         memcpy(mask_pat,
10692                                nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
10693                                pat_len);
10694                         i++;
10695                 }
10696         }
10697
10698         if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) {
10699                 regular = true;
10700                 err = nl80211_parse_wowlan_tcp(
10701                         rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION],
10702                         &new_triggers);
10703                 if (err)
10704                         goto error;
10705         }
10706
10707         if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) {
10708                 regular = true;
10709                 err = nl80211_parse_wowlan_nd(
10710                         rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT],
10711                         &new_triggers);
10712                 if (err)
10713                         goto error;
10714         }
10715
10716         /* The 'any' trigger means the device continues operating more or less
10717          * as in its normal operation mode and wakes up the host on most of the
10718          * normal interrupts (like packet RX, ...)
10719          * It therefore makes little sense to combine with the more constrained
10720          * wakeup trigger modes.
10721          */
10722         if (new_triggers.any && regular) {
10723                 err = -EINVAL;
10724                 goto error;
10725         }
10726
10727         ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL);
10728         if (!ntrig) {
10729                 err = -ENOMEM;
10730                 goto error;
10731         }
10732         cfg80211_rdev_free_wowlan(rdev);
10733         rdev->wiphy.wowlan_config = ntrig;
10734
10735  set_wakeup:
10736         if (rdev->ops->set_wakeup &&
10737             prev_enabled != !!rdev->wiphy.wowlan_config)
10738                 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config);
10739
10740         return 0;
10741  error:
10742         for (i = 0; i < new_triggers.n_patterns; i++)
10743                 kfree(new_triggers.patterns[i].mask);
10744         kfree(new_triggers.patterns);
10745         if (new_triggers.tcp && new_triggers.tcp->sock)
10746                 sock_release(new_triggers.tcp->sock);
10747         kfree(new_triggers.tcp);
10748         kfree(new_triggers.nd_config);
10749         return err;
10750 }
10751 #endif
10752
10753 static int nl80211_send_coalesce_rules(struct sk_buff *msg,
10754                                        struct cfg80211_registered_device *rdev)
10755 {
10756         struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules;
10757         int i, j, pat_len;
10758         struct cfg80211_coalesce_rules *rule;
10759
10760         if (!rdev->coalesce->n_rules)
10761                 return 0;
10762
10763         nl_rules = nla_nest_start(msg, NL80211_ATTR_COALESCE_RULE);
10764         if (!nl_rules)
10765                 return -ENOBUFS;
10766
10767         for (i = 0; i < rdev->coalesce->n_rules; i++) {
10768                 nl_rule = nla_nest_start(msg, i + 1);
10769                 if (!nl_rule)
10770                         return -ENOBUFS;
10771
10772                 rule = &rdev->coalesce->rules[i];
10773                 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY,
10774                                 rule->delay))
10775                         return -ENOBUFS;
10776
10777                 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION,
10778                                 rule->condition))
10779                         return -ENOBUFS;
10780
10781                 nl_pats = nla_nest_start(msg,
10782                                 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN);
10783                 if (!nl_pats)
10784                         return -ENOBUFS;
10785
10786                 for (j = 0; j < rule->n_patterns; j++) {
10787                         nl_pat = nla_nest_start(msg, j + 1);
10788                         if (!nl_pat)
10789                                 return -ENOBUFS;
10790                         pat_len = rule->patterns[j].pattern_len;
10791                         if (nla_put(msg, NL80211_PKTPAT_MASK,
10792                                     DIV_ROUND_UP(pat_len, 8),
10793                                     rule->patterns[j].mask) ||
10794                             nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
10795                                     rule->patterns[j].pattern) ||
10796                             nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
10797                                         rule->patterns[j].pkt_offset))
10798                                 return -ENOBUFS;
10799                         nla_nest_end(msg, nl_pat);
10800                 }
10801                 nla_nest_end(msg, nl_pats);
10802                 nla_nest_end(msg, nl_rule);
10803         }
10804         nla_nest_end(msg, nl_rules);
10805
10806         return 0;
10807 }
10808
10809 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info)
10810 {
10811         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10812         struct sk_buff *msg;
10813         void *hdr;
10814
10815         if (!rdev->wiphy.coalesce)
10816                 return -EOPNOTSUPP;
10817
10818         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10819         if (!msg)
10820                 return -ENOMEM;
10821
10822         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
10823                              NL80211_CMD_GET_COALESCE);
10824         if (!hdr)
10825                 goto nla_put_failure;
10826
10827         if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev))
10828                 goto nla_put_failure;
10829
10830         genlmsg_end(msg, hdr);
10831         return genlmsg_reply(msg, info);
10832
10833 nla_put_failure:
10834         nlmsg_free(msg);
10835         return -ENOBUFS;
10836 }
10837
10838 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev)
10839 {
10840         struct cfg80211_coalesce *coalesce = rdev->coalesce;
10841         int i, j;
10842         struct cfg80211_coalesce_rules *rule;
10843
10844         if (!coalesce)
10845                 return;
10846
10847         for (i = 0; i < coalesce->n_rules; i++) {
10848                 rule = &coalesce->rules[i];
10849                 for (j = 0; j < rule->n_patterns; j++)
10850                         kfree(rule->patterns[j].mask);
10851                 kfree(rule->patterns);
10852         }
10853         kfree(coalesce->rules);
10854         kfree(coalesce);
10855         rdev->coalesce = NULL;
10856 }
10857
10858 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,
10859                                        struct nlattr *rule,
10860                                        struct cfg80211_coalesce_rules *new_rule)
10861 {
10862         int err, i;
10863         const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
10864         struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat;
10865         int rem, pat_len, mask_len, pkt_offset, n_patterns = 0;
10866         struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
10867
10868         err = nla_parse_nested(tb, NL80211_ATTR_COALESCE_RULE_MAX, rule,
10869                                nl80211_coalesce_policy, NULL);
10870         if (err)
10871                 return err;
10872
10873         if (tb[NL80211_ATTR_COALESCE_RULE_DELAY])
10874                 new_rule->delay =
10875                         nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]);
10876         if (new_rule->delay > coalesce->max_delay)
10877                 return -EINVAL;
10878
10879         if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION])
10880                 new_rule->condition =
10881                         nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]);
10882         if (new_rule->condition != NL80211_COALESCE_CONDITION_MATCH &&
10883             new_rule->condition != NL80211_COALESCE_CONDITION_NO_MATCH)
10884                 return -EINVAL;
10885
10886         if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN])
10887                 return -EINVAL;
10888
10889         nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
10890                             rem)
10891                 n_patterns++;
10892         if (n_patterns > coalesce->n_patterns)
10893                 return -EINVAL;
10894
10895         new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]),
10896                                      GFP_KERNEL);
10897         if (!new_rule->patterns)
10898                 return -ENOMEM;
10899
10900         new_rule->n_patterns = n_patterns;
10901         i = 0;
10902
10903         nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
10904                             rem) {
10905                 u8 *mask_pat;
10906
10907                 nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat,
10908                                  nl80211_packet_pattern_policy, NULL);
10909                 if (!pat_tb[NL80211_PKTPAT_MASK] ||
10910                     !pat_tb[NL80211_PKTPAT_PATTERN])
10911                         return -EINVAL;
10912                 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
10913                 mask_len = DIV_ROUND_UP(pat_len, 8);
10914                 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
10915                         return -EINVAL;
10916                 if (pat_len > coalesce->pattern_max_len ||
10917                     pat_len < coalesce->pattern_min_len)
10918                         return -EINVAL;
10919
10920                 if (!pat_tb[NL80211_PKTPAT_OFFSET])
10921                         pkt_offset = 0;
10922                 else
10923                         pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]);
10924                 if (pkt_offset > coalesce->max_pkt_offset)
10925                         return -EINVAL;
10926                 new_rule->patterns[i].pkt_offset = pkt_offset;
10927
10928                 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
10929                 if (!mask_pat)
10930                         return -ENOMEM;
10931
10932                 new_rule->patterns[i].mask = mask_pat;
10933                 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
10934                        mask_len);
10935
10936                 mask_pat += mask_len;
10937                 new_rule->patterns[i].pattern = mask_pat;
10938                 new_rule->patterns[i].pattern_len = pat_len;
10939                 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
10940                        pat_len);
10941                 i++;
10942         }
10943
10944         return 0;
10945 }
10946
10947 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info)
10948 {
10949         struct cfg80211_registered_device *rdev = info->user_ptr[0];
10950         const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
10951         struct cfg80211_coalesce new_coalesce = {};
10952         struct cfg80211_coalesce *n_coalesce;
10953         int err, rem_rule, n_rules = 0, i, j;
10954         struct nlattr *rule;
10955         struct cfg80211_coalesce_rules *tmp_rule;
10956
10957         if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce)
10958                 return -EOPNOTSUPP;
10959
10960         if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) {
10961                 cfg80211_rdev_free_coalesce(rdev);
10962                 rdev_set_coalesce(rdev, NULL);
10963                 return 0;
10964         }
10965
10966         nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
10967                             rem_rule)
10968                 n_rules++;
10969         if (n_rules > coalesce->n_rules)
10970                 return -EINVAL;
10971
10972         new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]),
10973                                      GFP_KERNEL);
10974         if (!new_coalesce.rules)
10975                 return -ENOMEM;
10976
10977         new_coalesce.n_rules = n_rules;
10978         i = 0;
10979
10980         nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
10981                             rem_rule) {
10982                 err = nl80211_parse_coalesce_rule(rdev, rule,
10983                                                   &new_coalesce.rules[i]);
10984                 if (err)
10985                         goto error;
10986
10987                 i++;
10988         }
10989
10990         err = rdev_set_coalesce(rdev, &new_coalesce);
10991         if (err)
10992                 goto error;
10993
10994         n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL);
10995         if (!n_coalesce) {
10996                 err = -ENOMEM;
10997                 goto error;
10998         }
10999         cfg80211_rdev_free_coalesce(rdev);
11000         rdev->coalesce = n_coalesce;
11001
11002         return 0;
11003 error:
11004         for (i = 0; i < new_coalesce.n_rules; i++) {
11005                 tmp_rule = &new_coalesce.rules[i];
11006                 for (j = 0; j < tmp_rule->n_patterns; j++)
11007                         kfree(tmp_rule->patterns[j].mask);
11008                 kfree(tmp_rule->patterns);
11009         }
11010         kfree(new_coalesce.rules);
11011
11012         return err;
11013 }
11014
11015 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
11016 {
11017         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11018         struct net_device *dev = info->user_ptr[1];
11019         struct wireless_dev *wdev = dev->ieee80211_ptr;
11020         struct nlattr *tb[NUM_NL80211_REKEY_DATA];
11021         struct cfg80211_gtk_rekey_data rekey_data;
11022         int err;
11023
11024         if (!info->attrs[NL80211_ATTR_REKEY_DATA])
11025                 return -EINVAL;
11026
11027         err = nla_parse_nested(tb, MAX_NL80211_REKEY_DATA,
11028                                info->attrs[NL80211_ATTR_REKEY_DATA],
11029                                nl80211_rekey_policy, info->extack);
11030         if (err)
11031                 return err;
11032
11033         if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] ||
11034             !tb[NL80211_REKEY_DATA_KCK])
11035                 return -EINVAL;
11036         if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN)
11037                 return -ERANGE;
11038         if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN)
11039                 return -ERANGE;
11040         if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN)
11041                 return -ERANGE;
11042
11043         rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]);
11044         rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]);
11045         rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]);
11046
11047         wdev_lock(wdev);
11048         if (!wdev->current_bss) {
11049                 err = -ENOTCONN;
11050                 goto out;
11051         }
11052
11053         if (!rdev->ops->set_rekey_data) {
11054                 err = -EOPNOTSUPP;
11055                 goto out;
11056         }
11057
11058         err = rdev_set_rekey_data(rdev, dev, &rekey_data);
11059  out:
11060         wdev_unlock(wdev);
11061         return err;
11062 }
11063
11064 static int nl80211_register_unexpected_frame(struct sk_buff *skb,
11065                                              struct genl_info *info)
11066 {
11067         struct net_device *dev = info->user_ptr[1];
11068         struct wireless_dev *wdev = dev->ieee80211_ptr;
11069
11070         if (wdev->iftype != NL80211_IFTYPE_AP &&
11071             wdev->iftype != NL80211_IFTYPE_P2P_GO)
11072                 return -EINVAL;
11073
11074         if (wdev->ap_unexpected_nlportid)
11075                 return -EBUSY;
11076
11077         wdev->ap_unexpected_nlportid = info->snd_portid;
11078         return 0;
11079 }
11080
11081 static int nl80211_probe_client(struct sk_buff *skb,
11082                                 struct genl_info *info)
11083 {
11084         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11085         struct net_device *dev = info->user_ptr[1];
11086         struct wireless_dev *wdev = dev->ieee80211_ptr;
11087         struct sk_buff *msg;
11088         void *hdr;
11089         const u8 *addr;
11090         u64 cookie;
11091         int err;
11092
11093         if (wdev->iftype != NL80211_IFTYPE_AP &&
11094             wdev->iftype != NL80211_IFTYPE_P2P_GO)
11095                 return -EOPNOTSUPP;
11096
11097         if (!info->attrs[NL80211_ATTR_MAC])
11098                 return -EINVAL;
11099
11100         if (!rdev->ops->probe_client)
11101                 return -EOPNOTSUPP;
11102
11103         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11104         if (!msg)
11105                 return -ENOMEM;
11106
11107         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11108                              NL80211_CMD_PROBE_CLIENT);
11109         if (!hdr) {
11110                 err = -ENOBUFS;
11111                 goto free_msg;
11112         }
11113
11114         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
11115
11116         err = rdev_probe_client(rdev, dev, addr, &cookie);
11117         if (err)
11118                 goto free_msg;
11119
11120         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
11121                               NL80211_ATTR_PAD))
11122                 goto nla_put_failure;
11123
11124         genlmsg_end(msg, hdr);
11125
11126         return genlmsg_reply(msg, info);
11127
11128  nla_put_failure:
11129         err = -ENOBUFS;
11130  free_msg:
11131         nlmsg_free(msg);
11132         return err;
11133 }
11134
11135 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info)
11136 {
11137         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11138         struct cfg80211_beacon_registration *reg, *nreg;
11139         int rv;
11140
11141         if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS))
11142                 return -EOPNOTSUPP;
11143
11144         nreg = kzalloc(sizeof(*nreg), GFP_KERNEL);
11145         if (!nreg)
11146                 return -ENOMEM;
11147
11148         /* First, check if already registered. */
11149         spin_lock_bh(&rdev->beacon_registrations_lock);
11150         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
11151                 if (reg->nlportid == info->snd_portid) {
11152                         rv = -EALREADY;
11153                         goto out_err;
11154                 }
11155         }
11156         /* Add it to the list */
11157         nreg->nlportid = info->snd_portid;
11158         list_add(&nreg->list, &rdev->beacon_registrations);
11159
11160         spin_unlock_bh(&rdev->beacon_registrations_lock);
11161
11162         return 0;
11163 out_err:
11164         spin_unlock_bh(&rdev->beacon_registrations_lock);
11165         kfree(nreg);
11166         return rv;
11167 }
11168
11169 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
11170 {
11171         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11172         struct wireless_dev *wdev = info->user_ptr[1];
11173         int err;
11174
11175         if (!rdev->ops->start_p2p_device)
11176                 return -EOPNOTSUPP;
11177
11178         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
11179                 return -EOPNOTSUPP;
11180
11181         if (wdev_running(wdev))
11182                 return 0;
11183
11184         if (rfkill_blocked(rdev->rfkill))
11185                 return -ERFKILL;
11186
11187         err = rdev_start_p2p_device(rdev, wdev);
11188         if (err)
11189                 return err;
11190
11191         wdev->is_running = true;
11192         rdev->opencount++;
11193
11194         return 0;
11195 }
11196
11197 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info)
11198 {
11199         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11200         struct wireless_dev *wdev = info->user_ptr[1];
11201
11202         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
11203                 return -EOPNOTSUPP;
11204
11205         if (!rdev->ops->stop_p2p_device)
11206                 return -EOPNOTSUPP;
11207
11208         cfg80211_stop_p2p_device(rdev, wdev);
11209
11210         return 0;
11211 }
11212
11213 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
11214 {
11215         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11216         struct wireless_dev *wdev = info->user_ptr[1];
11217         struct cfg80211_nan_conf conf = {};
11218         int err;
11219
11220         if (wdev->iftype != NL80211_IFTYPE_NAN)
11221                 return -EOPNOTSUPP;
11222
11223         if (wdev_running(wdev))
11224                 return -EEXIST;
11225
11226         if (rfkill_blocked(rdev->rfkill))
11227                 return -ERFKILL;
11228
11229         if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF])
11230                 return -EINVAL;
11231
11232         conf.master_pref =
11233                 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
11234         if (!conf.master_pref)
11235                 return -EINVAL;
11236
11237         if (info->attrs[NL80211_ATTR_BANDS]) {
11238                 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
11239
11240                 if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
11241                         return -EOPNOTSUPP;
11242
11243                 if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
11244                         return -EINVAL;
11245
11246                 conf.bands = bands;
11247         }
11248
11249         err = rdev_start_nan(rdev, wdev, &conf);
11250         if (err)
11251                 return err;
11252
11253         wdev->is_running = true;
11254         rdev->opencount++;
11255
11256         return 0;
11257 }
11258
11259 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info)
11260 {
11261         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11262         struct wireless_dev *wdev = info->user_ptr[1];
11263
11264         if (wdev->iftype != NL80211_IFTYPE_NAN)
11265                 return -EOPNOTSUPP;
11266
11267         cfg80211_stop_nan(rdev, wdev);
11268
11269         return 0;
11270 }
11271
11272 static int validate_nan_filter(struct nlattr *filter_attr)
11273 {
11274         struct nlattr *attr;
11275         int len = 0, n_entries = 0, rem;
11276
11277         nla_for_each_nested(attr, filter_attr, rem) {
11278                 len += nla_len(attr);
11279                 n_entries++;
11280         }
11281
11282         if (len >= U8_MAX)
11283                 return -EINVAL;
11284
11285         return n_entries;
11286 }
11287
11288 static int handle_nan_filter(struct nlattr *attr_filter,
11289                              struct cfg80211_nan_func *func,
11290                              bool tx)
11291 {
11292         struct nlattr *attr;
11293         int n_entries, rem, i;
11294         struct cfg80211_nan_func_filter *filter;
11295
11296         n_entries = validate_nan_filter(attr_filter);
11297         if (n_entries < 0)
11298                 return n_entries;
11299
11300         BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters));
11301
11302         filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL);
11303         if (!filter)
11304                 return -ENOMEM;
11305
11306         i = 0;
11307         nla_for_each_nested(attr, attr_filter, rem) {
11308                 filter[i].filter = nla_memdup(attr, GFP_KERNEL);
11309                 filter[i].len = nla_len(attr);
11310                 i++;
11311         }
11312         if (tx) {
11313                 func->num_tx_filters = n_entries;
11314                 func->tx_filters = filter;
11315         } else {
11316                 func->num_rx_filters = n_entries;
11317                 func->rx_filters = filter;
11318         }
11319
11320         return 0;
11321 }
11322
11323 static int nl80211_nan_add_func(struct sk_buff *skb,
11324                                 struct genl_info *info)
11325 {
11326         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11327         struct wireless_dev *wdev = info->user_ptr[1];
11328         struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr;
11329         struct cfg80211_nan_func *func;
11330         struct sk_buff *msg = NULL;
11331         void *hdr = NULL;
11332         int err = 0;
11333
11334         if (wdev->iftype != NL80211_IFTYPE_NAN)
11335                 return -EOPNOTSUPP;
11336
11337         if (!wdev_running(wdev))
11338                 return -ENOTCONN;
11339
11340         if (!info->attrs[NL80211_ATTR_NAN_FUNC])
11341                 return -EINVAL;
11342
11343         err = nla_parse_nested(tb, NL80211_NAN_FUNC_ATTR_MAX,
11344                                info->attrs[NL80211_ATTR_NAN_FUNC],
11345                                nl80211_nan_func_policy, info->extack);
11346         if (err)
11347                 return err;
11348
11349         func = kzalloc(sizeof(*func), GFP_KERNEL);
11350         if (!func)
11351                 return -ENOMEM;
11352
11353         func->cookie = wdev->wiphy->cookie_counter++;
11354
11355         if (!tb[NL80211_NAN_FUNC_TYPE] ||
11356             nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]) > NL80211_NAN_FUNC_MAX_TYPE) {
11357                 err = -EINVAL;
11358                 goto out;
11359         }
11360
11361
11362         func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]);
11363
11364         if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) {
11365                 err = -EINVAL;
11366                 goto out;
11367         }
11368
11369         memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]),
11370                sizeof(func->service_id));
11371
11372         func->close_range =
11373                 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]);
11374
11375         if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) {
11376                 func->serv_spec_info_len =
11377                         nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]);
11378                 func->serv_spec_info =
11379                         kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]),
11380                                 func->serv_spec_info_len,
11381                                 GFP_KERNEL);
11382                 if (!func->serv_spec_info) {
11383                         err = -ENOMEM;
11384                         goto out;
11385                 }
11386         }
11387
11388         if (tb[NL80211_NAN_FUNC_TTL])
11389                 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]);
11390
11391         switch (func->type) {
11392         case NL80211_NAN_FUNC_PUBLISH:
11393                 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) {
11394                         err = -EINVAL;
11395                         goto out;
11396                 }
11397
11398                 func->publish_type =
11399                         nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]);
11400                 func->publish_bcast =
11401                         nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]);
11402
11403                 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) &&
11404                         func->publish_bcast) {
11405                         err = -EINVAL;
11406                         goto out;
11407                 }
11408                 break;
11409         case NL80211_NAN_FUNC_SUBSCRIBE:
11410                 func->subscribe_active =
11411                         nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]);
11412                 break;
11413         case NL80211_NAN_FUNC_FOLLOW_UP:
11414                 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] ||
11415                     !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] ||
11416                     !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) {
11417                         err = -EINVAL;
11418                         goto out;
11419                 }
11420
11421                 func->followup_id =
11422                         nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]);
11423                 func->followup_reqid =
11424                         nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]);
11425                 memcpy(func->followup_dest.addr,
11426                        nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]),
11427                        sizeof(func->followup_dest.addr));
11428                 if (func->ttl) {
11429                         err = -EINVAL;
11430                         goto out;
11431                 }
11432                 break;
11433         default:
11434                 err = -EINVAL;
11435                 goto out;
11436         }
11437
11438         if (tb[NL80211_NAN_FUNC_SRF]) {
11439                 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR];
11440
11441                 err = nla_parse_nested(srf_tb, NL80211_NAN_SRF_ATTR_MAX,
11442                                        tb[NL80211_NAN_FUNC_SRF],
11443                                        nl80211_nan_srf_policy, info->extack);
11444                 if (err)
11445                         goto out;
11446
11447                 func->srf_include =
11448                         nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]);
11449
11450                 if (srf_tb[NL80211_NAN_SRF_BF]) {
11451                         if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] ||
11452                             !srf_tb[NL80211_NAN_SRF_BF_IDX]) {
11453                                 err = -EINVAL;
11454                                 goto out;
11455                         }
11456
11457                         func->srf_bf_len =
11458                                 nla_len(srf_tb[NL80211_NAN_SRF_BF]);
11459                         func->srf_bf =
11460                                 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]),
11461                                         func->srf_bf_len, GFP_KERNEL);
11462                         if (!func->srf_bf) {
11463                                 err = -ENOMEM;
11464                                 goto out;
11465                         }
11466
11467                         func->srf_bf_idx =
11468                                 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]);
11469                 } else {
11470                         struct nlattr *attr, *mac_attr =
11471                                 srf_tb[NL80211_NAN_SRF_MAC_ADDRS];
11472                         int n_entries, rem, i = 0;
11473
11474                         if (!mac_attr) {
11475                                 err = -EINVAL;
11476                                 goto out;
11477                         }
11478
11479                         n_entries = validate_acl_mac_addrs(mac_attr);
11480                         if (n_entries <= 0) {
11481                                 err = -EINVAL;
11482                                 goto out;
11483                         }
11484
11485                         func->srf_num_macs = n_entries;
11486                         func->srf_macs =
11487                                 kzalloc(sizeof(*func->srf_macs) * n_entries,
11488                                         GFP_KERNEL);
11489                         if (!func->srf_macs) {
11490                                 err = -ENOMEM;
11491                                 goto out;
11492                         }
11493
11494                         nla_for_each_nested(attr, mac_attr, rem)
11495                                 memcpy(func->srf_macs[i++].addr, nla_data(attr),
11496                                        sizeof(*func->srf_macs));
11497                 }
11498         }
11499
11500         if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) {
11501                 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER],
11502                                         func, true);
11503                 if (err)
11504                         goto out;
11505         }
11506
11507         if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) {
11508                 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER],
11509                                         func, false);
11510                 if (err)
11511                         goto out;
11512         }
11513
11514         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11515         if (!msg) {
11516                 err = -ENOMEM;
11517                 goto out;
11518         }
11519
11520         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11521                              NL80211_CMD_ADD_NAN_FUNCTION);
11522         /* This can't really happen - we just allocated 4KB */
11523         if (WARN_ON(!hdr)) {
11524                 err = -ENOMEM;
11525                 goto out;
11526         }
11527
11528         err = rdev_add_nan_func(rdev, wdev, func);
11529 out:
11530         if (err < 0) {
11531                 cfg80211_free_nan_func(func);
11532                 nlmsg_free(msg);
11533                 return err;
11534         }
11535
11536         /* propagate the instance id and cookie to userspace  */
11537         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie,
11538                               NL80211_ATTR_PAD))
11539                 goto nla_put_failure;
11540
11541         func_attr = nla_nest_start(msg, NL80211_ATTR_NAN_FUNC);
11542         if (!func_attr)
11543                 goto nla_put_failure;
11544
11545         if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID,
11546                        func->instance_id))
11547                 goto nla_put_failure;
11548
11549         nla_nest_end(msg, func_attr);
11550
11551         genlmsg_end(msg, hdr);
11552         return genlmsg_reply(msg, info);
11553
11554 nla_put_failure:
11555         nlmsg_free(msg);
11556         return -ENOBUFS;
11557 }
11558
11559 static int nl80211_nan_del_func(struct sk_buff *skb,
11560                                struct genl_info *info)
11561 {
11562         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11563         struct wireless_dev *wdev = info->user_ptr[1];
11564         u64 cookie;
11565
11566         if (wdev->iftype != NL80211_IFTYPE_NAN)
11567                 return -EOPNOTSUPP;
11568
11569         if (!wdev_running(wdev))
11570                 return -ENOTCONN;
11571
11572         if (!info->attrs[NL80211_ATTR_COOKIE])
11573                 return -EINVAL;
11574
11575         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
11576
11577         rdev_del_nan_func(rdev, wdev, cookie);
11578
11579         return 0;
11580 }
11581
11582 static int nl80211_nan_change_config(struct sk_buff *skb,
11583                                      struct genl_info *info)
11584 {
11585         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11586         struct wireless_dev *wdev = info->user_ptr[1];
11587         struct cfg80211_nan_conf conf = {};
11588         u32 changed = 0;
11589
11590         if (wdev->iftype != NL80211_IFTYPE_NAN)
11591                 return -EOPNOTSUPP;
11592
11593         if (!wdev_running(wdev))
11594                 return -ENOTCONN;
11595
11596         if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) {
11597                 conf.master_pref =
11598                         nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
11599                 if (conf.master_pref <= 1 || conf.master_pref == 255)
11600                         return -EINVAL;
11601
11602                 changed |= CFG80211_NAN_CONF_CHANGED_PREF;
11603         }
11604
11605         if (info->attrs[NL80211_ATTR_BANDS]) {
11606                 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
11607
11608                 if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
11609                         return -EOPNOTSUPP;
11610
11611                 if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
11612                         return -EINVAL;
11613
11614                 conf.bands = bands;
11615                 changed |= CFG80211_NAN_CONF_CHANGED_BANDS;
11616         }
11617
11618         if (!changed)
11619                 return -EINVAL;
11620
11621         return rdev_nan_change_conf(rdev, wdev, &conf, changed);
11622 }
11623
11624 void cfg80211_nan_match(struct wireless_dev *wdev,
11625                         struct cfg80211_nan_match_params *match, gfp_t gfp)
11626 {
11627         struct wiphy *wiphy = wdev->wiphy;
11628         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
11629         struct nlattr *match_attr, *local_func_attr, *peer_func_attr;
11630         struct sk_buff *msg;
11631         void *hdr;
11632
11633         if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr))
11634                 return;
11635
11636         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11637         if (!msg)
11638                 return;
11639
11640         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH);
11641         if (!hdr) {
11642                 nlmsg_free(msg);
11643                 return;
11644         }
11645
11646         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11647             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
11648                                          wdev->netdev->ifindex)) ||
11649             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
11650                               NL80211_ATTR_PAD))
11651                 goto nla_put_failure;
11652
11653         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie,
11654                               NL80211_ATTR_PAD) ||
11655             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr))
11656                 goto nla_put_failure;
11657
11658         match_attr = nla_nest_start(msg, NL80211_ATTR_NAN_MATCH);
11659         if (!match_attr)
11660                 goto nla_put_failure;
11661
11662         local_func_attr = nla_nest_start(msg, NL80211_NAN_MATCH_FUNC_LOCAL);
11663         if (!local_func_attr)
11664                 goto nla_put_failure;
11665
11666         if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id))
11667                 goto nla_put_failure;
11668
11669         nla_nest_end(msg, local_func_attr);
11670
11671         peer_func_attr = nla_nest_start(msg, NL80211_NAN_MATCH_FUNC_PEER);
11672         if (!peer_func_attr)
11673                 goto nla_put_failure;
11674
11675         if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) ||
11676             nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id))
11677                 goto nla_put_failure;
11678
11679         if (match->info && match->info_len &&
11680             nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len,
11681                     match->info))
11682                 goto nla_put_failure;
11683
11684         nla_nest_end(msg, peer_func_attr);
11685         nla_nest_end(msg, match_attr);
11686         genlmsg_end(msg, hdr);
11687
11688         if (!wdev->owner_nlportid)
11689                 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
11690                                         msg, 0, NL80211_MCGRP_NAN, gfp);
11691         else
11692                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
11693                                 wdev->owner_nlportid);
11694
11695         return;
11696
11697 nla_put_failure:
11698         nlmsg_free(msg);
11699 }
11700 EXPORT_SYMBOL(cfg80211_nan_match);
11701
11702 void cfg80211_nan_func_terminated(struct wireless_dev *wdev,
11703                                   u8 inst_id,
11704                                   enum nl80211_nan_func_term_reason reason,
11705                                   u64 cookie, gfp_t gfp)
11706 {
11707         struct wiphy *wiphy = wdev->wiphy;
11708         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
11709         struct sk_buff *msg;
11710         struct nlattr *func_attr;
11711         void *hdr;
11712
11713         if (WARN_ON(!inst_id))
11714                 return;
11715
11716         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11717         if (!msg)
11718                 return;
11719
11720         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION);
11721         if (!hdr) {
11722                 nlmsg_free(msg);
11723                 return;
11724         }
11725
11726         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11727             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
11728                                          wdev->netdev->ifindex)) ||
11729             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
11730                               NL80211_ATTR_PAD))
11731                 goto nla_put_failure;
11732
11733         if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
11734                               NL80211_ATTR_PAD))
11735                 goto nla_put_failure;
11736
11737         func_attr = nla_nest_start(msg, NL80211_ATTR_NAN_FUNC);
11738         if (!func_attr)
11739                 goto nla_put_failure;
11740
11741         if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) ||
11742             nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason))
11743                 goto nla_put_failure;
11744
11745         nla_nest_end(msg, func_attr);
11746         genlmsg_end(msg, hdr);
11747
11748         if (!wdev->owner_nlportid)
11749                 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
11750                                         msg, 0, NL80211_MCGRP_NAN, gfp);
11751         else
11752                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
11753                                 wdev->owner_nlportid);
11754
11755         return;
11756
11757 nla_put_failure:
11758         nlmsg_free(msg);
11759 }
11760 EXPORT_SYMBOL(cfg80211_nan_func_terminated);
11761
11762 static int nl80211_get_protocol_features(struct sk_buff *skb,
11763                                          struct genl_info *info)
11764 {
11765         void *hdr;
11766         struct sk_buff *msg;
11767
11768         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11769         if (!msg)
11770                 return -ENOMEM;
11771
11772         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
11773                              NL80211_CMD_GET_PROTOCOL_FEATURES);
11774         if (!hdr)
11775                 goto nla_put_failure;
11776
11777         if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES,
11778                         NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP))
11779                 goto nla_put_failure;
11780
11781         genlmsg_end(msg, hdr);
11782         return genlmsg_reply(msg, info);
11783
11784  nla_put_failure:
11785         kfree_skb(msg);
11786         return -ENOBUFS;
11787 }
11788
11789 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info)
11790 {
11791         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11792         struct cfg80211_update_ft_ies_params ft_params;
11793         struct net_device *dev = info->user_ptr[1];
11794
11795         if (!rdev->ops->update_ft_ies)
11796                 return -EOPNOTSUPP;
11797
11798         if (!info->attrs[NL80211_ATTR_MDID] ||
11799             !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
11800                 return -EINVAL;
11801
11802         memset(&ft_params, 0, sizeof(ft_params));
11803         ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]);
11804         ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
11805         ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
11806
11807         return rdev_update_ft_ies(rdev, dev, &ft_params);
11808 }
11809
11810 static int nl80211_crit_protocol_start(struct sk_buff *skb,
11811                                        struct genl_info *info)
11812 {
11813         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11814         struct wireless_dev *wdev = info->user_ptr[1];
11815         enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC;
11816         u16 duration;
11817         int ret;
11818
11819         if (!rdev->ops->crit_proto_start)
11820                 return -EOPNOTSUPP;
11821
11822         if (WARN_ON(!rdev->ops->crit_proto_stop))
11823                 return -EINVAL;
11824
11825         if (rdev->crit_proto_nlportid)
11826                 return -EBUSY;
11827
11828         /* determine protocol if provided */
11829         if (info->attrs[NL80211_ATTR_CRIT_PROT_ID])
11830                 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]);
11831
11832         if (proto >= NUM_NL80211_CRIT_PROTO)
11833                 return -EINVAL;
11834
11835         /* timeout must be provided */
11836         if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION])
11837                 return -EINVAL;
11838
11839         duration =
11840                 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
11841
11842         if (duration > NL80211_CRIT_PROTO_MAX_DURATION)
11843                 return -ERANGE;
11844
11845         ret = rdev_crit_proto_start(rdev, wdev, proto, duration);
11846         if (!ret)
11847                 rdev->crit_proto_nlportid = info->snd_portid;
11848
11849         return ret;
11850 }
11851
11852 static int nl80211_crit_protocol_stop(struct sk_buff *skb,
11853                                       struct genl_info *info)
11854 {
11855         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11856         struct wireless_dev *wdev = info->user_ptr[1];
11857
11858         if (!rdev->ops->crit_proto_stop)
11859                 return -EOPNOTSUPP;
11860
11861         if (rdev->crit_proto_nlportid) {
11862                 rdev->crit_proto_nlportid = 0;
11863                 rdev_crit_proto_stop(rdev, wdev);
11864         }
11865         return 0;
11866 }
11867
11868 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
11869 {
11870         struct cfg80211_registered_device *rdev = info->user_ptr[0];
11871         struct wireless_dev *wdev =
11872                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
11873         int i, err;
11874         u32 vid, subcmd;
11875
11876         if (!rdev->wiphy.vendor_commands)
11877                 return -EOPNOTSUPP;
11878
11879         if (IS_ERR(wdev)) {
11880                 err = PTR_ERR(wdev);
11881                 if (err != -EINVAL)
11882                         return err;
11883                 wdev = NULL;
11884         } else if (wdev->wiphy != &rdev->wiphy) {
11885                 return -EINVAL;
11886         }
11887
11888         if (!info->attrs[NL80211_ATTR_VENDOR_ID] ||
11889             !info->attrs[NL80211_ATTR_VENDOR_SUBCMD])
11890                 return -EINVAL;
11891
11892         vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]);
11893         subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]);
11894         for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
11895                 const struct wiphy_vendor_command *vcmd;
11896                 void *data = NULL;
11897                 int len = 0;
11898
11899                 vcmd = &rdev->wiphy.vendor_commands[i];
11900
11901                 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
11902                         continue;
11903
11904                 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
11905                                    WIPHY_VENDOR_CMD_NEED_NETDEV)) {
11906                         if (!wdev)
11907                                 return -EINVAL;
11908                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
11909                             !wdev->netdev)
11910                                 return -EINVAL;
11911
11912                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
11913                                 if (!wdev_running(wdev))
11914                                         return -ENETDOWN;
11915                         }
11916
11917                         if (!vcmd->doit)
11918                                 return -EOPNOTSUPP;
11919                 } else {
11920                         wdev = NULL;
11921                 }
11922
11923                 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
11924                         data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
11925                         len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
11926                 }
11927
11928                 rdev->cur_cmd_info = info;
11929                 err = rdev->wiphy.vendor_commands[i].doit(&rdev->wiphy, wdev,
11930                                                           data, len);
11931                 rdev->cur_cmd_info = NULL;
11932                 return err;
11933         }
11934
11935         return -EOPNOTSUPP;
11936 }
11937
11938 static int nl80211_prepare_vendor_dump(struct sk_buff *skb,
11939                                        struct netlink_callback *cb,
11940                                        struct cfg80211_registered_device **rdev,
11941                                        struct wireless_dev **wdev)
11942 {
11943         struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam);
11944         u32 vid, subcmd;
11945         unsigned int i;
11946         int vcmd_idx = -1;
11947         int err;
11948         void *data = NULL;
11949         unsigned int data_len = 0;
11950
11951         if (cb->args[0]) {
11952                 /* subtract the 1 again here */
11953                 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
11954                 struct wireless_dev *tmp;
11955
11956                 if (!wiphy)
11957                         return -ENODEV;
11958                 *rdev = wiphy_to_rdev(wiphy);
11959                 *wdev = NULL;
11960
11961                 if (cb->args[1]) {
11962                         list_for_each_entry(tmp, &wiphy->wdev_list, list) {
11963                                 if (tmp->identifier == cb->args[1] - 1) {
11964                                         *wdev = tmp;
11965                                         break;
11966                                 }
11967                         }
11968                 }
11969
11970                 /* keep rtnl locked in successful case */
11971                 return 0;
11972         }
11973
11974         err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, attrbuf,
11975                           nl80211_fam.maxattr, nl80211_policy, NULL);
11976         if (err)
11977                 return err;
11978
11979         if (!attrbuf[NL80211_ATTR_VENDOR_ID] ||
11980             !attrbuf[NL80211_ATTR_VENDOR_SUBCMD])
11981                 return -EINVAL;
11982
11983         *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf);
11984         if (IS_ERR(*wdev))
11985                 *wdev = NULL;
11986
11987         *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
11988         if (IS_ERR(*rdev))
11989                 return PTR_ERR(*rdev);
11990
11991         vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]);
11992         subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
11993
11994         for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) {
11995                 const struct wiphy_vendor_command *vcmd;
11996
11997                 vcmd = &(*rdev)->wiphy.vendor_commands[i];
11998
11999                 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
12000                         continue;
12001
12002                 if (!vcmd->dumpit)
12003                         return -EOPNOTSUPP;
12004
12005                 vcmd_idx = i;
12006                 break;
12007         }
12008
12009         if (vcmd_idx < 0)
12010                 return -EOPNOTSUPP;
12011
12012         if (attrbuf[NL80211_ATTR_VENDOR_DATA]) {
12013                 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]);
12014                 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]);
12015         }
12016
12017         /* 0 is the first index - add 1 to parse only once */
12018         cb->args[0] = (*rdev)->wiphy_idx + 1;
12019         /* add 1 to know if it was NULL */
12020         cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0;
12021         cb->args[2] = vcmd_idx;
12022         cb->args[3] = (unsigned long)data;
12023         cb->args[4] = data_len;
12024
12025         /* keep rtnl locked in successful case */
12026         return 0;
12027 }
12028
12029 static int nl80211_vendor_cmd_dump(struct sk_buff *skb,
12030                                    struct netlink_callback *cb)
12031 {
12032         struct cfg80211_registered_device *rdev;
12033         struct wireless_dev *wdev;
12034         unsigned int vcmd_idx;
12035         const struct wiphy_vendor_command *vcmd;
12036         void *data;
12037         int data_len;
12038         int err;
12039         struct nlattr *vendor_data;
12040
12041         rtnl_lock();
12042         err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev);
12043         if (err)
12044                 goto out;
12045
12046         vcmd_idx = cb->args[2];
12047         data = (void *)cb->args[3];
12048         data_len = cb->args[4];
12049         vcmd = &rdev->wiphy.vendor_commands[vcmd_idx];
12050
12051         if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
12052                            WIPHY_VENDOR_CMD_NEED_NETDEV)) {
12053                 if (!wdev) {
12054                         err = -EINVAL;
12055                         goto out;
12056                 }
12057                 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
12058                     !wdev->netdev) {
12059                         err = -EINVAL;
12060                         goto out;
12061                 }
12062
12063                 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
12064                         if (!wdev_running(wdev)) {
12065                                 err = -ENETDOWN;
12066                                 goto out;
12067                         }
12068                 }
12069         }
12070
12071         while (1) {
12072                 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
12073                                            cb->nlh->nlmsg_seq, NLM_F_MULTI,
12074                                            NL80211_CMD_VENDOR);
12075                 if (!hdr)
12076                         break;
12077
12078                 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
12079                     (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
12080                                                wdev_id(wdev),
12081                                                NL80211_ATTR_PAD))) {
12082                         genlmsg_cancel(skb, hdr);
12083                         break;
12084                 }
12085
12086                 vendor_data = nla_nest_start(skb, NL80211_ATTR_VENDOR_DATA);
12087                 if (!vendor_data) {
12088                         genlmsg_cancel(skb, hdr);
12089                         break;
12090                 }
12091
12092                 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len,
12093                                    (unsigned long *)&cb->args[5]);
12094                 nla_nest_end(skb, vendor_data);
12095
12096                 if (err == -ENOBUFS || err == -ENOENT) {
12097                         genlmsg_cancel(skb, hdr);
12098                         break;
12099                 } else if (err) {
12100                         genlmsg_cancel(skb, hdr);
12101                         goto out;
12102                 }
12103
12104                 genlmsg_end(skb, hdr);
12105         }
12106
12107         err = skb->len;
12108  out:
12109         rtnl_unlock();
12110         return err;
12111 }
12112
12113 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
12114                                            enum nl80211_commands cmd,
12115                                            enum nl80211_attrs attr,
12116                                            int approxlen)
12117 {
12118         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
12119
12120         if (WARN_ON(!rdev->cur_cmd_info))
12121                 return NULL;
12122
12123         return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen,
12124                                            rdev->cur_cmd_info->snd_portid,
12125                                            rdev->cur_cmd_info->snd_seq,
12126                                            cmd, attr, NULL, GFP_KERNEL);
12127 }
12128 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb);
12129
12130 int cfg80211_vendor_cmd_reply(struct sk_buff *skb)
12131 {
12132         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
12133         void *hdr = ((void **)skb->cb)[1];
12134         struct nlattr *data = ((void **)skb->cb)[2];
12135
12136         /* clear CB data for netlink core to own from now on */
12137         memset(skb->cb, 0, sizeof(skb->cb));
12138
12139         if (WARN_ON(!rdev->cur_cmd_info)) {
12140                 kfree_skb(skb);
12141                 return -EINVAL;
12142         }
12143
12144         nla_nest_end(skb, data);
12145         genlmsg_end(skb, hdr);
12146         return genlmsg_reply(skb, rdev->cur_cmd_info);
12147 }
12148 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply);
12149
12150 static int nl80211_set_qos_map(struct sk_buff *skb,
12151                                struct genl_info *info)
12152 {
12153         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12154         struct cfg80211_qos_map *qos_map = NULL;
12155         struct net_device *dev = info->user_ptr[1];
12156         u8 *pos, len, num_des, des_len, des;
12157         int ret;
12158
12159         if (!rdev->ops->set_qos_map)
12160                 return -EOPNOTSUPP;
12161
12162         if (info->attrs[NL80211_ATTR_QOS_MAP]) {
12163                 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]);
12164                 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]);
12165
12166                 if (len % 2 || len < IEEE80211_QOS_MAP_LEN_MIN ||
12167                     len > IEEE80211_QOS_MAP_LEN_MAX)
12168                         return -EINVAL;
12169
12170                 qos_map = kzalloc(sizeof(struct cfg80211_qos_map), GFP_KERNEL);
12171                 if (!qos_map)
12172                         return -ENOMEM;
12173
12174                 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1;
12175                 if (num_des) {
12176                         des_len = num_des *
12177                                 sizeof(struct cfg80211_dscp_exception);
12178                         memcpy(qos_map->dscp_exception, pos, des_len);
12179                         qos_map->num_des = num_des;
12180                         for (des = 0; des < num_des; des++) {
12181                                 if (qos_map->dscp_exception[des].up > 7) {
12182                                         kfree(qos_map);
12183                                         return -EINVAL;
12184                                 }
12185                         }
12186                         pos += des_len;
12187                 }
12188                 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN);
12189         }
12190
12191         wdev_lock(dev->ieee80211_ptr);
12192         ret = nl80211_key_allowed(dev->ieee80211_ptr);
12193         if (!ret)
12194                 ret = rdev_set_qos_map(rdev, dev, qos_map);
12195         wdev_unlock(dev->ieee80211_ptr);
12196
12197         kfree(qos_map);
12198         return ret;
12199 }
12200
12201 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info)
12202 {
12203         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12204         struct net_device *dev = info->user_ptr[1];
12205         struct wireless_dev *wdev = dev->ieee80211_ptr;
12206         const u8 *peer;
12207         u8 tsid, up;
12208         u16 admitted_time = 0;
12209         int err;
12210
12211         if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION))
12212                 return -EOPNOTSUPP;
12213
12214         if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] ||
12215             !info->attrs[NL80211_ATTR_USER_PRIO])
12216                 return -EINVAL;
12217
12218         tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
12219         if (tsid >= IEEE80211_NUM_TIDS)
12220                 return -EINVAL;
12221
12222         up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]);
12223         if (up >= IEEE80211_NUM_UPS)
12224                 return -EINVAL;
12225
12226         /* WMM uses TIDs 0-7 even for TSPEC */
12227         if (tsid >= IEEE80211_FIRST_TSPEC_TSID) {
12228                 /* TODO: handle 802.11 TSPEC/admission control
12229                  * need more attributes for that (e.g. BA session requirement);
12230                  * change the WMM adminssion test above to allow both then
12231                  */
12232                 return -EINVAL;
12233         }
12234
12235         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
12236
12237         if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) {
12238                 admitted_time =
12239                         nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]);
12240                 if (!admitted_time)
12241                         return -EINVAL;
12242         }
12243
12244         wdev_lock(wdev);
12245         switch (wdev->iftype) {
12246         case NL80211_IFTYPE_STATION:
12247         case NL80211_IFTYPE_P2P_CLIENT:
12248                 if (wdev->current_bss)
12249                         break;
12250                 err = -ENOTCONN;
12251                 goto out;
12252         default:
12253                 err = -EOPNOTSUPP;
12254                 goto out;
12255         }
12256
12257         err = rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time);
12258
12259  out:
12260         wdev_unlock(wdev);
12261         return err;
12262 }
12263
12264 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info)
12265 {
12266         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12267         struct net_device *dev = info->user_ptr[1];
12268         struct wireless_dev *wdev = dev->ieee80211_ptr;
12269         const u8 *peer;
12270         u8 tsid;
12271         int err;
12272
12273         if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC])
12274                 return -EINVAL;
12275
12276         tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
12277         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
12278
12279         wdev_lock(wdev);
12280         err = rdev_del_tx_ts(rdev, dev, tsid, peer);
12281         wdev_unlock(wdev);
12282
12283         return err;
12284 }
12285
12286 static int nl80211_tdls_channel_switch(struct sk_buff *skb,
12287                                        struct genl_info *info)
12288 {
12289         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12290         struct net_device *dev = info->user_ptr[1];
12291         struct wireless_dev *wdev = dev->ieee80211_ptr;
12292         struct cfg80211_chan_def chandef = {};
12293         const u8 *addr;
12294         u8 oper_class;
12295         int err;
12296
12297         if (!rdev->ops->tdls_channel_switch ||
12298             !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
12299                 return -EOPNOTSUPP;
12300
12301         switch (dev->ieee80211_ptr->iftype) {
12302         case NL80211_IFTYPE_STATION:
12303         case NL80211_IFTYPE_P2P_CLIENT:
12304                 break;
12305         default:
12306                 return -EOPNOTSUPP;
12307         }
12308
12309         if (!info->attrs[NL80211_ATTR_MAC] ||
12310             !info->attrs[NL80211_ATTR_OPER_CLASS])
12311                 return -EINVAL;
12312
12313         err = nl80211_parse_chandef(rdev, info, &chandef);
12314         if (err)
12315                 return err;
12316
12317         /*
12318          * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012
12319          * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the
12320          * specification is not defined for them.
12321          */
12322         if (chandef.chan->band == NL80211_BAND_2GHZ &&
12323             chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
12324             chandef.width != NL80211_CHAN_WIDTH_20)
12325                 return -EINVAL;
12326
12327         /* we will be active on the TDLS link */
12328         if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
12329                                            wdev->iftype))
12330                 return -EINVAL;
12331
12332         /* don't allow switching to DFS channels */
12333         if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype))
12334                 return -EINVAL;
12335
12336         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
12337         oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]);
12338
12339         wdev_lock(wdev);
12340         err = rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef);
12341         wdev_unlock(wdev);
12342
12343         return err;
12344 }
12345
12346 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb,
12347                                               struct genl_info *info)
12348 {
12349         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12350         struct net_device *dev = info->user_ptr[1];
12351         struct wireless_dev *wdev = dev->ieee80211_ptr;
12352         const u8 *addr;
12353
12354         if (!rdev->ops->tdls_channel_switch ||
12355             !rdev->ops->tdls_cancel_channel_switch ||
12356             !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
12357                 return -EOPNOTSUPP;
12358
12359         switch (dev->ieee80211_ptr->iftype) {
12360         case NL80211_IFTYPE_STATION:
12361         case NL80211_IFTYPE_P2P_CLIENT:
12362                 break;
12363         default:
12364                 return -EOPNOTSUPP;
12365         }
12366
12367         if (!info->attrs[NL80211_ATTR_MAC])
12368                 return -EINVAL;
12369
12370         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
12371
12372         wdev_lock(wdev);
12373         rdev_tdls_cancel_channel_switch(rdev, dev, addr);
12374         wdev_unlock(wdev);
12375
12376         return 0;
12377 }
12378
12379 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb,
12380                                             struct genl_info *info)
12381 {
12382         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12383         struct net_device *dev = info->user_ptr[1];
12384         struct wireless_dev *wdev = dev->ieee80211_ptr;
12385         const struct nlattr *nla;
12386         bool enabled;
12387
12388         if (!rdev->ops->set_multicast_to_unicast)
12389                 return -EOPNOTSUPP;
12390
12391         if (wdev->iftype != NL80211_IFTYPE_AP &&
12392             wdev->iftype != NL80211_IFTYPE_P2P_GO)
12393                 return -EOPNOTSUPP;
12394
12395         nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED];
12396         enabled = nla_get_flag(nla);
12397
12398         return rdev_set_multicast_to_unicast(rdev, dev, enabled);
12399 }
12400
12401 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info)
12402 {
12403         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12404         struct net_device *dev = info->user_ptr[1];
12405         struct wireless_dev *wdev = dev->ieee80211_ptr;
12406         struct cfg80211_pmk_conf pmk_conf = {};
12407         int ret;
12408
12409         if (wdev->iftype != NL80211_IFTYPE_STATION &&
12410             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
12411                 return -EOPNOTSUPP;
12412
12413         if (!wiphy_ext_feature_isset(&rdev->wiphy,
12414                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
12415                 return -EOPNOTSUPP;
12416
12417         if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK])
12418                 return -EINVAL;
12419
12420         wdev_lock(wdev);
12421         if (!wdev->current_bss) {
12422                 ret = -ENOTCONN;
12423                 goto out;
12424         }
12425
12426         pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
12427         if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) {
12428                 ret = -EINVAL;
12429                 goto out;
12430         }
12431
12432         pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
12433         pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
12434         if (pmk_conf.pmk_len != WLAN_PMK_LEN &&
12435             pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) {
12436                 ret = -EINVAL;
12437                 goto out;
12438         }
12439
12440         if (info->attrs[NL80211_ATTR_PMKR0_NAME]) {
12441                 int r0_name_len = nla_len(info->attrs[NL80211_ATTR_PMKR0_NAME]);
12442
12443                 if (r0_name_len != WLAN_PMK_NAME_LEN) {
12444                         ret = -EINVAL;
12445                         goto out;
12446                 }
12447
12448                 pmk_conf.pmk_r0_name =
12449                         nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]);
12450         }
12451
12452         ret = rdev_set_pmk(rdev, dev, &pmk_conf);
12453 out:
12454         wdev_unlock(wdev);
12455         return ret;
12456 }
12457
12458 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info)
12459 {
12460         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12461         struct net_device *dev = info->user_ptr[1];
12462         struct wireless_dev *wdev = dev->ieee80211_ptr;
12463         const u8 *aa;
12464         int ret;
12465
12466         if (wdev->iftype != NL80211_IFTYPE_STATION &&
12467             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
12468                 return -EOPNOTSUPP;
12469
12470         if (!wiphy_ext_feature_isset(&rdev->wiphy,
12471                                      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
12472                 return -EOPNOTSUPP;
12473
12474         if (!info->attrs[NL80211_ATTR_MAC])
12475                 return -EINVAL;
12476
12477         wdev_lock(wdev);
12478         aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
12479         ret = rdev_del_pmk(rdev, dev, aa);
12480         wdev_unlock(wdev);
12481
12482         return ret;
12483 }
12484
12485 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info)
12486 {
12487         struct cfg80211_registered_device *rdev = info->user_ptr[0];
12488         struct net_device *dev = info->user_ptr[1];
12489         struct cfg80211_external_auth_params params;
12490
12491         if (!rdev->ops->external_auth)
12492                 return -EOPNOTSUPP;
12493
12494         if (!info->attrs[NL80211_ATTR_SSID])
12495                 return -EINVAL;
12496
12497         if (!info->attrs[NL80211_ATTR_BSSID])
12498                 return -EINVAL;
12499
12500         if (!info->attrs[NL80211_ATTR_STATUS_CODE])
12501                 return -EINVAL;
12502
12503         memset(&params, 0, sizeof(params));
12504
12505         params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
12506         if (params.ssid.ssid_len == 0 ||
12507             params.ssid.ssid_len > IEEE80211_MAX_SSID_LEN)
12508                 return -EINVAL;
12509         memcpy(params.ssid.ssid, nla_data(info->attrs[NL80211_ATTR_SSID]),
12510                params.ssid.ssid_len);
12511
12512         memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]),
12513                ETH_ALEN);
12514
12515         params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
12516
12517         return rdev_external_auth(rdev, dev, &params);
12518 }
12519
12520 #define NL80211_FLAG_NEED_WIPHY         0x01
12521 #define NL80211_FLAG_NEED_NETDEV        0x02
12522 #define NL80211_FLAG_NEED_RTNL          0x04
12523 #define NL80211_FLAG_CHECK_NETDEV_UP    0x08
12524 #define NL80211_FLAG_NEED_NETDEV_UP     (NL80211_FLAG_NEED_NETDEV |\
12525                                          NL80211_FLAG_CHECK_NETDEV_UP)
12526 #define NL80211_FLAG_NEED_WDEV          0x10
12527 /* If a netdev is associated, it must be UP, P2P must be started */
12528 #define NL80211_FLAG_NEED_WDEV_UP       (NL80211_FLAG_NEED_WDEV |\
12529                                          NL80211_FLAG_CHECK_NETDEV_UP)
12530 #define NL80211_FLAG_CLEAR_SKB          0x20
12531
12532 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
12533                             struct genl_info *info)
12534 {
12535         struct cfg80211_registered_device *rdev;
12536         struct wireless_dev *wdev;
12537         struct net_device *dev;
12538         bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL;
12539
12540         if (rtnl)
12541                 rtnl_lock();
12542
12543         if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) {
12544                 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
12545                 if (IS_ERR(rdev)) {
12546                         if (rtnl)
12547                                 rtnl_unlock();
12548                         return PTR_ERR(rdev);
12549                 }
12550                 info->user_ptr[0] = rdev;
12551         } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV ||
12552                    ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
12553                 ASSERT_RTNL();
12554
12555                 wdev = __cfg80211_wdev_from_attrs(genl_info_net(info),
12556                                                   info->attrs);
12557                 if (IS_ERR(wdev)) {
12558                         if (rtnl)
12559                                 rtnl_unlock();
12560                         return PTR_ERR(wdev);
12561                 }
12562
12563                 dev = wdev->netdev;
12564                 rdev = wiphy_to_rdev(wdev->wiphy);
12565
12566                 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) {
12567                         if (!dev) {
12568                                 if (rtnl)
12569                                         rtnl_unlock();
12570                                 return -EINVAL;
12571                         }
12572
12573                         info->user_ptr[1] = dev;
12574                 } else {
12575                         info->user_ptr[1] = wdev;
12576                 }
12577
12578                 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
12579                     !wdev_running(wdev)) {
12580                         if (rtnl)
12581                                 rtnl_unlock();
12582                         return -ENETDOWN;
12583                 }
12584
12585                 if (dev)
12586                         dev_hold(dev);
12587
12588                 info->user_ptr[0] = rdev;
12589         }
12590
12591         return 0;
12592 }
12593
12594 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
12595                               struct genl_info *info)
12596 {
12597         if (info->user_ptr[1]) {
12598                 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
12599                         struct wireless_dev *wdev = info->user_ptr[1];
12600
12601                         if (wdev->netdev)
12602                                 dev_put(wdev->netdev);
12603                 } else {
12604                         dev_put(info->user_ptr[1]);
12605                 }
12606         }
12607
12608         if (ops->internal_flags & NL80211_FLAG_NEED_RTNL)
12609                 rtnl_unlock();
12610
12611         /* If needed, clear the netlink message payload from the SKB
12612          * as it might contain key data that shouldn't stick around on
12613          * the heap after the SKB is freed. The netlink message header
12614          * is still needed for further processing, so leave it intact.
12615          */
12616         if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) {
12617                 struct nlmsghdr *nlh = nlmsg_hdr(skb);
12618
12619                 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh));
12620         }
12621 }
12622
12623 static const struct genl_ops nl80211_ops[] = {
12624         {
12625                 .cmd = NL80211_CMD_GET_WIPHY,
12626                 .doit = nl80211_get_wiphy,
12627                 .dumpit = nl80211_dump_wiphy,
12628                 .done = nl80211_dump_wiphy_done,
12629                 .policy = nl80211_policy,
12630                 /* can be retrieved by unprivileged users */
12631                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12632                                   NL80211_FLAG_NEED_RTNL,
12633         },
12634         {
12635                 .cmd = NL80211_CMD_SET_WIPHY,
12636                 .doit = nl80211_set_wiphy,
12637                 .policy = nl80211_policy,
12638                 .flags = GENL_UNS_ADMIN_PERM,
12639                 .internal_flags = NL80211_FLAG_NEED_RTNL,
12640         },
12641         {
12642                 .cmd = NL80211_CMD_GET_INTERFACE,
12643                 .doit = nl80211_get_interface,
12644                 .dumpit = nl80211_dump_interface,
12645                 .policy = nl80211_policy,
12646                 /* can be retrieved by unprivileged users */
12647                 .internal_flags = NL80211_FLAG_NEED_WDEV |
12648                                   NL80211_FLAG_NEED_RTNL,
12649         },
12650         {
12651                 .cmd = NL80211_CMD_SET_INTERFACE,
12652                 .doit = nl80211_set_interface,
12653                 .policy = nl80211_policy,
12654                 .flags = GENL_UNS_ADMIN_PERM,
12655                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12656                                   NL80211_FLAG_NEED_RTNL,
12657         },
12658         {
12659                 .cmd = NL80211_CMD_NEW_INTERFACE,
12660                 .doit = nl80211_new_interface,
12661                 .policy = nl80211_policy,
12662                 .flags = GENL_UNS_ADMIN_PERM,
12663                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12664                                   NL80211_FLAG_NEED_RTNL,
12665         },
12666         {
12667                 .cmd = NL80211_CMD_DEL_INTERFACE,
12668                 .doit = nl80211_del_interface,
12669                 .policy = nl80211_policy,
12670                 .flags = GENL_UNS_ADMIN_PERM,
12671                 .internal_flags = NL80211_FLAG_NEED_WDEV |
12672                                   NL80211_FLAG_NEED_RTNL,
12673         },
12674         {
12675                 .cmd = NL80211_CMD_GET_KEY,
12676                 .doit = nl80211_get_key,
12677                 .policy = nl80211_policy,
12678                 .flags = GENL_UNS_ADMIN_PERM,
12679                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12680                                   NL80211_FLAG_NEED_RTNL,
12681         },
12682         {
12683                 .cmd = NL80211_CMD_SET_KEY,
12684                 .doit = nl80211_set_key,
12685                 .policy = nl80211_policy,
12686                 .flags = GENL_UNS_ADMIN_PERM,
12687                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12688                                   NL80211_FLAG_NEED_RTNL |
12689                                   NL80211_FLAG_CLEAR_SKB,
12690         },
12691         {
12692                 .cmd = NL80211_CMD_NEW_KEY,
12693                 .doit = nl80211_new_key,
12694                 .policy = nl80211_policy,
12695                 .flags = GENL_UNS_ADMIN_PERM,
12696                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12697                                   NL80211_FLAG_NEED_RTNL |
12698                                   NL80211_FLAG_CLEAR_SKB,
12699         },
12700         {
12701                 .cmd = NL80211_CMD_DEL_KEY,
12702                 .doit = nl80211_del_key,
12703                 .policy = nl80211_policy,
12704                 .flags = GENL_UNS_ADMIN_PERM,
12705                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12706                                   NL80211_FLAG_NEED_RTNL,
12707         },
12708         {
12709                 .cmd = NL80211_CMD_SET_BEACON,
12710                 .policy = nl80211_policy,
12711                 .flags = GENL_UNS_ADMIN_PERM,
12712                 .doit = nl80211_set_beacon,
12713                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12714                                   NL80211_FLAG_NEED_RTNL,
12715         },
12716         {
12717                 .cmd = NL80211_CMD_START_AP,
12718                 .policy = nl80211_policy,
12719                 .flags = GENL_UNS_ADMIN_PERM,
12720                 .doit = nl80211_start_ap,
12721                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12722                                   NL80211_FLAG_NEED_RTNL,
12723         },
12724         {
12725                 .cmd = NL80211_CMD_STOP_AP,
12726                 .policy = nl80211_policy,
12727                 .flags = GENL_UNS_ADMIN_PERM,
12728                 .doit = nl80211_stop_ap,
12729                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12730                                   NL80211_FLAG_NEED_RTNL,
12731         },
12732         {
12733                 .cmd = NL80211_CMD_GET_STATION,
12734                 .doit = nl80211_get_station,
12735                 .dumpit = nl80211_dump_station,
12736                 .policy = nl80211_policy,
12737                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
12738                                   NL80211_FLAG_NEED_RTNL,
12739         },
12740         {
12741                 .cmd = NL80211_CMD_SET_STATION,
12742                 .doit = nl80211_set_station,
12743                 .policy = nl80211_policy,
12744                 .flags = GENL_UNS_ADMIN_PERM,
12745                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12746                                   NL80211_FLAG_NEED_RTNL,
12747         },
12748         {
12749                 .cmd = NL80211_CMD_NEW_STATION,
12750                 .doit = nl80211_new_station,
12751                 .policy = nl80211_policy,
12752                 .flags = GENL_UNS_ADMIN_PERM,
12753                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12754                                   NL80211_FLAG_NEED_RTNL,
12755         },
12756         {
12757                 .cmd = NL80211_CMD_DEL_STATION,
12758                 .doit = nl80211_del_station,
12759                 .policy = nl80211_policy,
12760                 .flags = GENL_UNS_ADMIN_PERM,
12761                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12762                                   NL80211_FLAG_NEED_RTNL,
12763         },
12764         {
12765                 .cmd = NL80211_CMD_GET_MPATH,
12766                 .doit = nl80211_get_mpath,
12767                 .dumpit = nl80211_dump_mpath,
12768                 .policy = nl80211_policy,
12769                 .flags = GENL_UNS_ADMIN_PERM,
12770                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12771                                   NL80211_FLAG_NEED_RTNL,
12772         },
12773         {
12774                 .cmd = NL80211_CMD_GET_MPP,
12775                 .doit = nl80211_get_mpp,
12776                 .dumpit = nl80211_dump_mpp,
12777                 .policy = nl80211_policy,
12778                 .flags = GENL_UNS_ADMIN_PERM,
12779                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12780                                   NL80211_FLAG_NEED_RTNL,
12781         },
12782         {
12783                 .cmd = NL80211_CMD_SET_MPATH,
12784                 .doit = nl80211_set_mpath,
12785                 .policy = nl80211_policy,
12786                 .flags = GENL_UNS_ADMIN_PERM,
12787                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12788                                   NL80211_FLAG_NEED_RTNL,
12789         },
12790         {
12791                 .cmd = NL80211_CMD_NEW_MPATH,
12792                 .doit = nl80211_new_mpath,
12793                 .policy = nl80211_policy,
12794                 .flags = GENL_UNS_ADMIN_PERM,
12795                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12796                                   NL80211_FLAG_NEED_RTNL,
12797         },
12798         {
12799                 .cmd = NL80211_CMD_DEL_MPATH,
12800                 .doit = nl80211_del_mpath,
12801                 .policy = nl80211_policy,
12802                 .flags = GENL_UNS_ADMIN_PERM,
12803                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12804                                   NL80211_FLAG_NEED_RTNL,
12805         },
12806         {
12807                 .cmd = NL80211_CMD_SET_BSS,
12808                 .doit = nl80211_set_bss,
12809                 .policy = nl80211_policy,
12810                 .flags = GENL_UNS_ADMIN_PERM,
12811                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12812                                   NL80211_FLAG_NEED_RTNL,
12813         },
12814         {
12815                 .cmd = NL80211_CMD_GET_REG,
12816                 .doit = nl80211_get_reg_do,
12817                 .dumpit = nl80211_get_reg_dump,
12818                 .policy = nl80211_policy,
12819                 .internal_flags = NL80211_FLAG_NEED_RTNL,
12820                 /* can be retrieved by unprivileged users */
12821         },
12822 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
12823         {
12824                 .cmd = NL80211_CMD_SET_REG,
12825                 .doit = nl80211_set_reg,
12826                 .policy = nl80211_policy,
12827                 .flags = GENL_ADMIN_PERM,
12828                 .internal_flags = NL80211_FLAG_NEED_RTNL,
12829         },
12830 #endif
12831         {
12832                 .cmd = NL80211_CMD_REQ_SET_REG,
12833                 .doit = nl80211_req_set_reg,
12834                 .policy = nl80211_policy,
12835                 .flags = GENL_ADMIN_PERM,
12836         },
12837         {
12838                 .cmd = NL80211_CMD_RELOAD_REGDB,
12839                 .doit = nl80211_reload_regdb,
12840                 .policy = nl80211_policy,
12841                 .flags = GENL_ADMIN_PERM,
12842         },
12843         {
12844                 .cmd = NL80211_CMD_GET_MESH_CONFIG,
12845                 .doit = nl80211_get_mesh_config,
12846                 .policy = nl80211_policy,
12847                 /* can be retrieved by unprivileged users */
12848                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12849                                   NL80211_FLAG_NEED_RTNL,
12850         },
12851         {
12852                 .cmd = NL80211_CMD_SET_MESH_CONFIG,
12853                 .doit = nl80211_update_mesh_config,
12854                 .policy = nl80211_policy,
12855                 .flags = GENL_UNS_ADMIN_PERM,
12856                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12857                                   NL80211_FLAG_NEED_RTNL,
12858         },
12859         {
12860                 .cmd = NL80211_CMD_TRIGGER_SCAN,
12861                 .doit = nl80211_trigger_scan,
12862                 .policy = nl80211_policy,
12863                 .flags = GENL_UNS_ADMIN_PERM,
12864                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12865                                   NL80211_FLAG_NEED_RTNL,
12866         },
12867         {
12868                 .cmd = NL80211_CMD_ABORT_SCAN,
12869                 .doit = nl80211_abort_scan,
12870                 .policy = nl80211_policy,
12871                 .flags = GENL_UNS_ADMIN_PERM,
12872                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
12873                                   NL80211_FLAG_NEED_RTNL,
12874         },
12875         {
12876                 .cmd = NL80211_CMD_GET_SCAN,
12877                 .policy = nl80211_policy,
12878                 .dumpit = nl80211_dump_scan,
12879         },
12880         {
12881                 .cmd = NL80211_CMD_START_SCHED_SCAN,
12882                 .doit = nl80211_start_sched_scan,
12883                 .policy = nl80211_policy,
12884                 .flags = GENL_UNS_ADMIN_PERM,
12885                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12886                                   NL80211_FLAG_NEED_RTNL,
12887         },
12888         {
12889                 .cmd = NL80211_CMD_STOP_SCHED_SCAN,
12890                 .doit = nl80211_stop_sched_scan,
12891                 .policy = nl80211_policy,
12892                 .flags = GENL_UNS_ADMIN_PERM,
12893                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12894                                   NL80211_FLAG_NEED_RTNL,
12895         },
12896         {
12897                 .cmd = NL80211_CMD_AUTHENTICATE,
12898                 .doit = nl80211_authenticate,
12899                 .policy = nl80211_policy,
12900                 .flags = GENL_UNS_ADMIN_PERM,
12901                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12902                                   NL80211_FLAG_NEED_RTNL |
12903                                   NL80211_FLAG_CLEAR_SKB,
12904         },
12905         {
12906                 .cmd = NL80211_CMD_ASSOCIATE,
12907                 .doit = nl80211_associate,
12908                 .policy = nl80211_policy,
12909                 .flags = GENL_UNS_ADMIN_PERM,
12910                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12911                                   NL80211_FLAG_NEED_RTNL,
12912         },
12913         {
12914                 .cmd = NL80211_CMD_DEAUTHENTICATE,
12915                 .doit = nl80211_deauthenticate,
12916                 .policy = nl80211_policy,
12917                 .flags = GENL_UNS_ADMIN_PERM,
12918                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12919                                   NL80211_FLAG_NEED_RTNL,
12920         },
12921         {
12922                 .cmd = NL80211_CMD_DISASSOCIATE,
12923                 .doit = nl80211_disassociate,
12924                 .policy = nl80211_policy,
12925                 .flags = GENL_UNS_ADMIN_PERM,
12926                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12927                                   NL80211_FLAG_NEED_RTNL,
12928         },
12929         {
12930                 .cmd = NL80211_CMD_JOIN_IBSS,
12931                 .doit = nl80211_join_ibss,
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_IBSS,
12939                 .doit = nl80211_leave_ibss,
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 #ifdef CONFIG_NL80211_TESTMODE
12946         {
12947                 .cmd = NL80211_CMD_TESTMODE,
12948                 .doit = nl80211_testmode_do,
12949                 .dumpit = nl80211_testmode_dump,
12950                 .policy = nl80211_policy,
12951                 .flags = GENL_UNS_ADMIN_PERM,
12952                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12953                                   NL80211_FLAG_NEED_RTNL,
12954         },
12955 #endif
12956         {
12957                 .cmd = NL80211_CMD_CONNECT,
12958                 .doit = nl80211_connect,
12959                 .policy = nl80211_policy,
12960                 .flags = GENL_UNS_ADMIN_PERM,
12961                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12962                                   NL80211_FLAG_NEED_RTNL,
12963         },
12964         {
12965                 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS,
12966                 .doit = nl80211_update_connect_params,
12967                 .policy = nl80211_policy,
12968                 .flags = GENL_ADMIN_PERM,
12969                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12970                                   NL80211_FLAG_NEED_RTNL,
12971         },
12972         {
12973                 .cmd = NL80211_CMD_DISCONNECT,
12974                 .doit = nl80211_disconnect,
12975                 .policy = nl80211_policy,
12976                 .flags = GENL_UNS_ADMIN_PERM,
12977                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12978                                   NL80211_FLAG_NEED_RTNL,
12979         },
12980         {
12981                 .cmd = NL80211_CMD_SET_WIPHY_NETNS,
12982                 .doit = nl80211_wiphy_netns,
12983                 .policy = nl80211_policy,
12984                 .flags = GENL_UNS_ADMIN_PERM,
12985                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
12986                                   NL80211_FLAG_NEED_RTNL,
12987         },
12988         {
12989                 .cmd = NL80211_CMD_GET_SURVEY,
12990                 .policy = nl80211_policy,
12991                 .dumpit = nl80211_dump_survey,
12992         },
12993         {
12994                 .cmd = NL80211_CMD_SET_PMKSA,
12995                 .doit = nl80211_setdel_pmksa,
12996                 .policy = nl80211_policy,
12997                 .flags = GENL_UNS_ADMIN_PERM,
12998                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
12999                                   NL80211_FLAG_NEED_RTNL,
13000         },
13001         {
13002                 .cmd = NL80211_CMD_DEL_PMKSA,
13003                 .doit = nl80211_setdel_pmksa,
13004                 .policy = nl80211_policy,
13005                 .flags = GENL_UNS_ADMIN_PERM,
13006                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13007                                   NL80211_FLAG_NEED_RTNL,
13008         },
13009         {
13010                 .cmd = NL80211_CMD_FLUSH_PMKSA,
13011                 .doit = nl80211_flush_pmksa,
13012                 .policy = nl80211_policy,
13013                 .flags = GENL_UNS_ADMIN_PERM,
13014                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13015                                   NL80211_FLAG_NEED_RTNL,
13016         },
13017         {
13018                 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
13019                 .doit = nl80211_remain_on_channel,
13020                 .policy = nl80211_policy,
13021                 .flags = GENL_UNS_ADMIN_PERM,
13022                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13023                                   NL80211_FLAG_NEED_RTNL,
13024         },
13025         {
13026                 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
13027                 .doit = nl80211_cancel_remain_on_channel,
13028                 .policy = nl80211_policy,
13029                 .flags = GENL_UNS_ADMIN_PERM,
13030                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13031                                   NL80211_FLAG_NEED_RTNL,
13032         },
13033         {
13034                 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
13035                 .doit = nl80211_set_tx_bitrate_mask,
13036                 .policy = nl80211_policy,
13037                 .flags = GENL_UNS_ADMIN_PERM,
13038                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13039                                   NL80211_FLAG_NEED_RTNL,
13040         },
13041         {
13042                 .cmd = NL80211_CMD_REGISTER_FRAME,
13043                 .doit = nl80211_register_mgmt,
13044                 .policy = nl80211_policy,
13045                 .flags = GENL_UNS_ADMIN_PERM,
13046                 .internal_flags = NL80211_FLAG_NEED_WDEV |
13047                                   NL80211_FLAG_NEED_RTNL,
13048         },
13049         {
13050                 .cmd = NL80211_CMD_FRAME,
13051                 .doit = nl80211_tx_mgmt,
13052                 .policy = nl80211_policy,
13053                 .flags = GENL_UNS_ADMIN_PERM,
13054                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13055                                   NL80211_FLAG_NEED_RTNL,
13056         },
13057         {
13058                 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
13059                 .doit = nl80211_tx_mgmt_cancel_wait,
13060                 .policy = nl80211_policy,
13061                 .flags = GENL_UNS_ADMIN_PERM,
13062                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13063                                   NL80211_FLAG_NEED_RTNL,
13064         },
13065         {
13066                 .cmd = NL80211_CMD_SET_POWER_SAVE,
13067                 .doit = nl80211_set_power_save,
13068                 .policy = nl80211_policy,
13069                 .flags = GENL_UNS_ADMIN_PERM,
13070                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13071                                   NL80211_FLAG_NEED_RTNL,
13072         },
13073         {
13074                 .cmd = NL80211_CMD_GET_POWER_SAVE,
13075                 .doit = nl80211_get_power_save,
13076                 .policy = nl80211_policy,
13077                 /* can be retrieved by unprivileged users */
13078                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13079                                   NL80211_FLAG_NEED_RTNL,
13080         },
13081         {
13082                 .cmd = NL80211_CMD_SET_CQM,
13083                 .doit = nl80211_set_cqm,
13084                 .policy = nl80211_policy,
13085                 .flags = GENL_UNS_ADMIN_PERM,
13086                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13087                                   NL80211_FLAG_NEED_RTNL,
13088         },
13089         {
13090                 .cmd = NL80211_CMD_SET_CHANNEL,
13091                 .doit = nl80211_set_channel,
13092                 .policy = nl80211_policy,
13093                 .flags = GENL_UNS_ADMIN_PERM,
13094                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13095                                   NL80211_FLAG_NEED_RTNL,
13096         },
13097         {
13098                 .cmd = NL80211_CMD_SET_WDS_PEER,
13099                 .doit = nl80211_set_wds_peer,
13100                 .policy = nl80211_policy,
13101                 .flags = GENL_UNS_ADMIN_PERM,
13102                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13103                                   NL80211_FLAG_NEED_RTNL,
13104         },
13105         {
13106                 .cmd = NL80211_CMD_JOIN_MESH,
13107                 .doit = nl80211_join_mesh,
13108                 .policy = nl80211_policy,
13109                 .flags = GENL_UNS_ADMIN_PERM,
13110                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13111                                   NL80211_FLAG_NEED_RTNL,
13112         },
13113         {
13114                 .cmd = NL80211_CMD_LEAVE_MESH,
13115                 .doit = nl80211_leave_mesh,
13116                 .policy = nl80211_policy,
13117                 .flags = GENL_UNS_ADMIN_PERM,
13118                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13119                                   NL80211_FLAG_NEED_RTNL,
13120         },
13121         {
13122                 .cmd = NL80211_CMD_JOIN_OCB,
13123                 .doit = nl80211_join_ocb,
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_LEAVE_OCB,
13131                 .doit = nl80211_leave_ocb,
13132                 .policy = nl80211_policy,
13133                 .flags = GENL_UNS_ADMIN_PERM,
13134                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13135                                   NL80211_FLAG_NEED_RTNL,
13136         },
13137 #ifdef CONFIG_PM
13138         {
13139                 .cmd = NL80211_CMD_GET_WOWLAN,
13140                 .doit = nl80211_get_wowlan,
13141                 .policy = nl80211_policy,
13142                 /* can be retrieved by unprivileged users */
13143                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13144                                   NL80211_FLAG_NEED_RTNL,
13145         },
13146         {
13147                 .cmd = NL80211_CMD_SET_WOWLAN,
13148                 .doit = nl80211_set_wowlan,
13149                 .policy = nl80211_policy,
13150                 .flags = GENL_UNS_ADMIN_PERM,
13151                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13152                                   NL80211_FLAG_NEED_RTNL,
13153         },
13154 #endif
13155         {
13156                 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
13157                 .doit = nl80211_set_rekey_data,
13158                 .policy = nl80211_policy,
13159                 .flags = GENL_UNS_ADMIN_PERM,
13160                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13161                                   NL80211_FLAG_NEED_RTNL |
13162                                   NL80211_FLAG_CLEAR_SKB,
13163         },
13164         {
13165                 .cmd = NL80211_CMD_TDLS_MGMT,
13166                 .doit = nl80211_tdls_mgmt,
13167                 .policy = nl80211_policy,
13168                 .flags = GENL_UNS_ADMIN_PERM,
13169                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13170                                   NL80211_FLAG_NEED_RTNL,
13171         },
13172         {
13173                 .cmd = NL80211_CMD_TDLS_OPER,
13174                 .doit = nl80211_tdls_oper,
13175                 .policy = nl80211_policy,
13176                 .flags = GENL_UNS_ADMIN_PERM,
13177                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13178                                   NL80211_FLAG_NEED_RTNL,
13179         },
13180         {
13181                 .cmd = NL80211_CMD_UNEXPECTED_FRAME,
13182                 .doit = nl80211_register_unexpected_frame,
13183                 .policy = nl80211_policy,
13184                 .flags = GENL_UNS_ADMIN_PERM,
13185                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13186                                   NL80211_FLAG_NEED_RTNL,
13187         },
13188         {
13189                 .cmd = NL80211_CMD_PROBE_CLIENT,
13190                 .doit = nl80211_probe_client,
13191                 .policy = nl80211_policy,
13192                 .flags = GENL_UNS_ADMIN_PERM,
13193                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13194                                   NL80211_FLAG_NEED_RTNL,
13195         },
13196         {
13197                 .cmd = NL80211_CMD_REGISTER_BEACONS,
13198                 .doit = nl80211_register_beacons,
13199                 .policy = nl80211_policy,
13200                 .flags = GENL_UNS_ADMIN_PERM,
13201                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13202                                   NL80211_FLAG_NEED_RTNL,
13203         },
13204         {
13205                 .cmd = NL80211_CMD_SET_NOACK_MAP,
13206                 .doit = nl80211_set_noack_map,
13207                 .policy = nl80211_policy,
13208                 .flags = GENL_UNS_ADMIN_PERM,
13209                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13210                                   NL80211_FLAG_NEED_RTNL,
13211         },
13212         {
13213                 .cmd = NL80211_CMD_START_P2P_DEVICE,
13214                 .doit = nl80211_start_p2p_device,
13215                 .policy = nl80211_policy,
13216                 .flags = GENL_UNS_ADMIN_PERM,
13217                 .internal_flags = NL80211_FLAG_NEED_WDEV |
13218                                   NL80211_FLAG_NEED_RTNL,
13219         },
13220         {
13221                 .cmd = NL80211_CMD_STOP_P2P_DEVICE,
13222                 .doit = nl80211_stop_p2p_device,
13223                 .policy = nl80211_policy,
13224                 .flags = GENL_UNS_ADMIN_PERM,
13225                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13226                                   NL80211_FLAG_NEED_RTNL,
13227         },
13228         {
13229                 .cmd = NL80211_CMD_START_NAN,
13230                 .doit = nl80211_start_nan,
13231                 .policy = nl80211_policy,
13232                 .flags = GENL_ADMIN_PERM,
13233                 .internal_flags = NL80211_FLAG_NEED_WDEV |
13234                                   NL80211_FLAG_NEED_RTNL,
13235         },
13236         {
13237                 .cmd = NL80211_CMD_STOP_NAN,
13238                 .doit = nl80211_stop_nan,
13239                 .policy = nl80211_policy,
13240                 .flags = GENL_ADMIN_PERM,
13241                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13242                                   NL80211_FLAG_NEED_RTNL,
13243         },
13244         {
13245                 .cmd = NL80211_CMD_ADD_NAN_FUNCTION,
13246                 .doit = nl80211_nan_add_func,
13247                 .policy = nl80211_policy,
13248                 .flags = GENL_ADMIN_PERM,
13249                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13250                                   NL80211_FLAG_NEED_RTNL,
13251         },
13252         {
13253                 .cmd = NL80211_CMD_DEL_NAN_FUNCTION,
13254                 .doit = nl80211_nan_del_func,
13255                 .policy = nl80211_policy,
13256                 .flags = GENL_ADMIN_PERM,
13257                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13258                                   NL80211_FLAG_NEED_RTNL,
13259         },
13260         {
13261                 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG,
13262                 .doit = nl80211_nan_change_config,
13263                 .policy = nl80211_policy,
13264                 .flags = GENL_ADMIN_PERM,
13265                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13266                                   NL80211_FLAG_NEED_RTNL,
13267         },
13268         {
13269                 .cmd = NL80211_CMD_SET_MCAST_RATE,
13270                 .doit = nl80211_set_mcast_rate,
13271                 .policy = nl80211_policy,
13272                 .flags = GENL_UNS_ADMIN_PERM,
13273                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13274                                   NL80211_FLAG_NEED_RTNL,
13275         },
13276         {
13277                 .cmd = NL80211_CMD_SET_MAC_ACL,
13278                 .doit = nl80211_set_mac_acl,
13279                 .policy = nl80211_policy,
13280                 .flags = GENL_UNS_ADMIN_PERM,
13281                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13282                                   NL80211_FLAG_NEED_RTNL,
13283         },
13284         {
13285                 .cmd = NL80211_CMD_RADAR_DETECT,
13286                 .doit = nl80211_start_radar_detection,
13287                 .policy = nl80211_policy,
13288                 .flags = GENL_UNS_ADMIN_PERM,
13289                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13290                                   NL80211_FLAG_NEED_RTNL,
13291         },
13292         {
13293                 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
13294                 .doit = nl80211_get_protocol_features,
13295                 .policy = nl80211_policy,
13296         },
13297         {
13298                 .cmd = NL80211_CMD_UPDATE_FT_IES,
13299                 .doit = nl80211_update_ft_ies,
13300                 .policy = nl80211_policy,
13301                 .flags = GENL_UNS_ADMIN_PERM,
13302                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13303                                   NL80211_FLAG_NEED_RTNL,
13304         },
13305         {
13306                 .cmd = NL80211_CMD_CRIT_PROTOCOL_START,
13307                 .doit = nl80211_crit_protocol_start,
13308                 .policy = nl80211_policy,
13309                 .flags = GENL_UNS_ADMIN_PERM,
13310                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13311                                   NL80211_FLAG_NEED_RTNL,
13312         },
13313         {
13314                 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
13315                 .doit = nl80211_crit_protocol_stop,
13316                 .policy = nl80211_policy,
13317                 .flags = GENL_UNS_ADMIN_PERM,
13318                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
13319                                   NL80211_FLAG_NEED_RTNL,
13320         },
13321         {
13322                 .cmd = NL80211_CMD_GET_COALESCE,
13323                 .doit = nl80211_get_coalesce,
13324                 .policy = nl80211_policy,
13325                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13326                                   NL80211_FLAG_NEED_RTNL,
13327         },
13328         {
13329                 .cmd = NL80211_CMD_SET_COALESCE,
13330                 .doit = nl80211_set_coalesce,
13331                 .policy = nl80211_policy,
13332                 .flags = GENL_UNS_ADMIN_PERM,
13333                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13334                                   NL80211_FLAG_NEED_RTNL,
13335         },
13336         {
13337                 .cmd = NL80211_CMD_CHANNEL_SWITCH,
13338                 .doit = nl80211_channel_switch,
13339                 .policy = nl80211_policy,
13340                 .flags = GENL_UNS_ADMIN_PERM,
13341                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13342                                   NL80211_FLAG_NEED_RTNL,
13343         },
13344         {
13345                 .cmd = NL80211_CMD_VENDOR,
13346                 .doit = nl80211_vendor_cmd,
13347                 .dumpit = nl80211_vendor_cmd_dump,
13348                 .policy = nl80211_policy,
13349                 .flags = GENL_UNS_ADMIN_PERM,
13350                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
13351                                   NL80211_FLAG_NEED_RTNL,
13352         },
13353         {
13354                 .cmd = NL80211_CMD_SET_QOS_MAP,
13355                 .doit = nl80211_set_qos_map,
13356                 .policy = nl80211_policy,
13357                 .flags = GENL_UNS_ADMIN_PERM,
13358                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13359                                   NL80211_FLAG_NEED_RTNL,
13360         },
13361         {
13362                 .cmd = NL80211_CMD_ADD_TX_TS,
13363                 .doit = nl80211_add_tx_ts,
13364                 .policy = nl80211_policy,
13365                 .flags = GENL_UNS_ADMIN_PERM,
13366                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13367                                   NL80211_FLAG_NEED_RTNL,
13368         },
13369         {
13370                 .cmd = NL80211_CMD_DEL_TX_TS,
13371                 .doit = nl80211_del_tx_ts,
13372                 .policy = nl80211_policy,
13373                 .flags = GENL_UNS_ADMIN_PERM,
13374                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13375                                   NL80211_FLAG_NEED_RTNL,
13376         },
13377         {
13378                 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH,
13379                 .doit = nl80211_tdls_channel_switch,
13380                 .policy = nl80211_policy,
13381                 .flags = GENL_UNS_ADMIN_PERM,
13382                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13383                                   NL80211_FLAG_NEED_RTNL,
13384         },
13385         {
13386                 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
13387                 .doit = nl80211_tdls_cancel_channel_switch,
13388                 .policy = nl80211_policy,
13389                 .flags = GENL_UNS_ADMIN_PERM,
13390                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13391                                   NL80211_FLAG_NEED_RTNL,
13392         },
13393         {
13394                 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST,
13395                 .doit = nl80211_set_multicast_to_unicast,
13396                 .policy = nl80211_policy,
13397                 .flags = GENL_UNS_ADMIN_PERM,
13398                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
13399                                   NL80211_FLAG_NEED_RTNL,
13400         },
13401         {
13402                 .cmd = NL80211_CMD_SET_PMK,
13403                 .doit = nl80211_set_pmk,
13404                 .policy = nl80211_policy,
13405                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13406                                   NL80211_FLAG_NEED_RTNL,
13407         },
13408         {
13409                 .cmd = NL80211_CMD_DEL_PMK,
13410                 .doit = nl80211_del_pmk,
13411                 .policy = nl80211_policy,
13412                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13413                                   NL80211_FLAG_NEED_RTNL,
13414         },
13415         {
13416                 .cmd = NL80211_CMD_EXTERNAL_AUTH,
13417                 .doit = nl80211_external_auth,
13418                 .policy = nl80211_policy,
13419                 .flags = GENL_ADMIN_PERM,
13420                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13421                                   NL80211_FLAG_NEED_RTNL,
13422         },
13423
13424 };
13425
13426 static struct genl_family nl80211_fam __ro_after_init = {
13427         .name = NL80211_GENL_NAME,      /* have users key off the name instead */
13428         .hdrsize = 0,                   /* no private header */
13429         .version = 1,                   /* no particular meaning now */
13430         .maxattr = NL80211_ATTR_MAX,
13431         .netnsok = true,
13432         .pre_doit = nl80211_pre_doit,
13433         .post_doit = nl80211_post_doit,
13434         .module = THIS_MODULE,
13435         .ops = nl80211_ops,
13436         .n_ops = ARRAY_SIZE(nl80211_ops),
13437         .mcgrps = nl80211_mcgrps,
13438         .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps),
13439 };
13440
13441 /* notification functions */
13442
13443 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
13444                           enum nl80211_commands cmd)
13445 {
13446         struct sk_buff *msg;
13447         struct nl80211_dump_wiphy_state state = {};
13448
13449         WARN_ON(cmd != NL80211_CMD_NEW_WIPHY &&
13450                 cmd != NL80211_CMD_DEL_WIPHY);
13451
13452         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13453         if (!msg)
13454                 return;
13455
13456         if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) {
13457                 nlmsg_free(msg);
13458                 return;
13459         }
13460
13461         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13462                                 NL80211_MCGRP_CONFIG, GFP_KERNEL);
13463 }
13464
13465 void nl80211_notify_iface(struct cfg80211_registered_device *rdev,
13466                                 struct wireless_dev *wdev,
13467                                 enum nl80211_commands cmd)
13468 {
13469         struct sk_buff *msg;
13470
13471         WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE &&
13472                 cmd != NL80211_CMD_DEL_INTERFACE);
13473
13474         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13475         if (!msg)
13476                 return;
13477
13478         if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev,
13479                                cmd == NL80211_CMD_DEL_INTERFACE) < 0) {
13480                 nlmsg_free(msg);
13481                 return;
13482         }
13483
13484         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13485                                 NL80211_MCGRP_CONFIG, GFP_KERNEL);
13486 }
13487
13488 static int nl80211_add_scan_req(struct sk_buff *msg,
13489                                 struct cfg80211_registered_device *rdev)
13490 {
13491         struct cfg80211_scan_request *req = rdev->scan_req;
13492         struct nlattr *nest;
13493         int i;
13494
13495         if (WARN_ON(!req))
13496                 return 0;
13497
13498         nest = nla_nest_start(msg, NL80211_ATTR_SCAN_SSIDS);
13499         if (!nest)
13500                 goto nla_put_failure;
13501         for (i = 0; i < req->n_ssids; i++) {
13502                 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid))
13503                         goto nla_put_failure;
13504         }
13505         nla_nest_end(msg, nest);
13506
13507         nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
13508         if (!nest)
13509                 goto nla_put_failure;
13510         for (i = 0; i < req->n_channels; i++) {
13511                 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
13512                         goto nla_put_failure;
13513         }
13514         nla_nest_end(msg, nest);
13515
13516         if (req->ie &&
13517             nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie))
13518                 goto nla_put_failure;
13519
13520         if (req->flags &&
13521             nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags))
13522                 goto nla_put_failure;
13523
13524         if (req->info.scan_start_tsf &&
13525             (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF,
13526                                req->info.scan_start_tsf, NL80211_BSS_PAD) ||
13527              nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN,
13528                      req->info.tsf_bssid)))
13529                 goto nla_put_failure;
13530
13531         return 0;
13532  nla_put_failure:
13533         return -ENOBUFS;
13534 }
13535
13536 static int nl80211_prep_scan_msg(struct sk_buff *msg,
13537                                  struct cfg80211_registered_device *rdev,
13538                                  struct wireless_dev *wdev,
13539                                  u32 portid, u32 seq, int flags,
13540                                  u32 cmd)
13541 {
13542         void *hdr;
13543
13544         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
13545         if (!hdr)
13546                 return -1;
13547
13548         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13549             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
13550                                          wdev->netdev->ifindex)) ||
13551             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
13552                               NL80211_ATTR_PAD))
13553                 goto nla_put_failure;
13554
13555         /* ignore errors and send incomplete event anyway */
13556         nl80211_add_scan_req(msg, rdev);
13557
13558         genlmsg_end(msg, hdr);
13559         return 0;
13560
13561  nla_put_failure:
13562         genlmsg_cancel(msg, hdr);
13563         return -EMSGSIZE;
13564 }
13565
13566 static int
13567 nl80211_prep_sched_scan_msg(struct sk_buff *msg,
13568                             struct cfg80211_sched_scan_request *req, u32 cmd)
13569 {
13570         void *hdr;
13571
13572         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
13573         if (!hdr)
13574                 return -1;
13575
13576         if (nla_put_u32(msg, NL80211_ATTR_WIPHY,
13577                         wiphy_to_rdev(req->wiphy)->wiphy_idx) ||
13578             nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) ||
13579             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid,
13580                               NL80211_ATTR_PAD))
13581                 goto nla_put_failure;
13582
13583         genlmsg_end(msg, hdr);
13584         return 0;
13585
13586  nla_put_failure:
13587         genlmsg_cancel(msg, hdr);
13588         return -EMSGSIZE;
13589 }
13590
13591 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
13592                              struct wireless_dev *wdev)
13593 {
13594         struct sk_buff *msg;
13595
13596         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13597         if (!msg)
13598                 return;
13599
13600         if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
13601                                   NL80211_CMD_TRIGGER_SCAN) < 0) {
13602                 nlmsg_free(msg);
13603                 return;
13604         }
13605
13606         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13607                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
13608 }
13609
13610 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
13611                                        struct wireless_dev *wdev, bool aborted)
13612 {
13613         struct sk_buff *msg;
13614
13615         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13616         if (!msg)
13617                 return NULL;
13618
13619         if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
13620                                   aborted ? NL80211_CMD_SCAN_ABORTED :
13621                                             NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
13622                 nlmsg_free(msg);
13623                 return NULL;
13624         }
13625
13626         return msg;
13627 }
13628
13629 /* send message created by nl80211_build_scan_msg() */
13630 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev,
13631                            struct sk_buff *msg)
13632 {
13633         if (!msg)
13634                 return;
13635
13636         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13637                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
13638 }
13639
13640 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd)
13641 {
13642         struct sk_buff *msg;
13643
13644         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13645         if (!msg)
13646                 return;
13647
13648         if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) {
13649                 nlmsg_free(msg);
13650                 return;
13651         }
13652
13653         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0,
13654                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
13655 }
13656
13657 static bool nl80211_reg_change_event_fill(struct sk_buff *msg,
13658                                           struct regulatory_request *request)
13659 {
13660         /* Userspace can always count this one always being set */
13661         if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator))
13662                 goto nla_put_failure;
13663
13664         if (request->alpha2[0] == '0' && request->alpha2[1] == '0') {
13665                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
13666                                NL80211_REGDOM_TYPE_WORLD))
13667                         goto nla_put_failure;
13668         } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') {
13669                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
13670                                NL80211_REGDOM_TYPE_CUSTOM_WORLD))
13671                         goto nla_put_failure;
13672         } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
13673                    request->intersect) {
13674                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
13675                                NL80211_REGDOM_TYPE_INTERSECTION))
13676                         goto nla_put_failure;
13677         } else {
13678                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
13679                                NL80211_REGDOM_TYPE_COUNTRY) ||
13680                     nla_put_string(msg, NL80211_ATTR_REG_ALPHA2,
13681                                    request->alpha2))
13682                         goto nla_put_failure;
13683         }
13684
13685         if (request->wiphy_idx != WIPHY_IDX_INVALID) {
13686                 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx);
13687
13688                 if (wiphy &&
13689                     nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx))
13690                         goto nla_put_failure;
13691
13692                 if (wiphy &&
13693                     wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
13694                     nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
13695                         goto nla_put_failure;
13696         }
13697
13698         return true;
13699
13700 nla_put_failure:
13701         return false;
13702 }
13703
13704 /*
13705  * This can happen on global regulatory changes or device specific settings
13706  * based on custom regulatory domains.
13707  */
13708 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id,
13709                                      struct regulatory_request *request)
13710 {
13711         struct sk_buff *msg;
13712         void *hdr;
13713
13714         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13715         if (!msg)
13716                 return;
13717
13718         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id);
13719         if (!hdr) {
13720                 nlmsg_free(msg);
13721                 return;
13722         }
13723
13724         if (nl80211_reg_change_event_fill(msg, request) == false)
13725                 goto nla_put_failure;
13726
13727         genlmsg_end(msg, hdr);
13728
13729         rcu_read_lock();
13730         genlmsg_multicast_allns(&nl80211_fam, msg, 0,
13731                                 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
13732         rcu_read_unlock();
13733
13734         return;
13735
13736 nla_put_failure:
13737         nlmsg_free(msg);
13738 }
13739
13740 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
13741                                     struct net_device *netdev,
13742                                     const u8 *buf, size_t len,
13743                                     enum nl80211_commands cmd, gfp_t gfp,
13744                                     int uapsd_queues)
13745 {
13746         struct sk_buff *msg;
13747         void *hdr;
13748
13749         msg = nlmsg_new(100 + len, gfp);
13750         if (!msg)
13751                 return;
13752
13753         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
13754         if (!hdr) {
13755                 nlmsg_free(msg);
13756                 return;
13757         }
13758
13759         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13760             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13761             nla_put(msg, NL80211_ATTR_FRAME, len, buf))
13762                 goto nla_put_failure;
13763
13764         if (uapsd_queues >= 0) {
13765                 struct nlattr *nla_wmm =
13766                         nla_nest_start(msg, NL80211_ATTR_STA_WME);
13767                 if (!nla_wmm)
13768                         goto nla_put_failure;
13769
13770                 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES,
13771                                uapsd_queues))
13772                         goto nla_put_failure;
13773
13774                 nla_nest_end(msg, nla_wmm);
13775         }
13776
13777         genlmsg_end(msg, hdr);
13778
13779         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13780                                 NL80211_MCGRP_MLME, gfp);
13781         return;
13782
13783  nla_put_failure:
13784         nlmsg_free(msg);
13785 }
13786
13787 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
13788                           struct net_device *netdev, const u8 *buf,
13789                           size_t len, gfp_t gfp)
13790 {
13791         nl80211_send_mlme_event(rdev, netdev, buf, len,
13792                                 NL80211_CMD_AUTHENTICATE, gfp, -1);
13793 }
13794
13795 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
13796                            struct net_device *netdev, const u8 *buf,
13797                            size_t len, gfp_t gfp, int uapsd_queues)
13798 {
13799         nl80211_send_mlme_event(rdev, netdev, buf, len,
13800                                 NL80211_CMD_ASSOCIATE, gfp, uapsd_queues);
13801 }
13802
13803 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
13804                          struct net_device *netdev, const u8 *buf,
13805                          size_t len, gfp_t gfp)
13806 {
13807         nl80211_send_mlme_event(rdev, netdev, buf, len,
13808                                 NL80211_CMD_DEAUTHENTICATE, gfp, -1);
13809 }
13810
13811 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
13812                            struct net_device *netdev, const u8 *buf,
13813                            size_t len, gfp_t gfp)
13814 {
13815         nl80211_send_mlme_event(rdev, netdev, buf, len,
13816                                 NL80211_CMD_DISASSOCIATE, gfp, -1);
13817 }
13818
13819 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
13820                                   size_t len)
13821 {
13822         struct wireless_dev *wdev = dev->ieee80211_ptr;
13823         struct wiphy *wiphy = wdev->wiphy;
13824         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
13825         const struct ieee80211_mgmt *mgmt = (void *)buf;
13826         u32 cmd;
13827
13828         if (WARN_ON(len < 2))
13829                 return;
13830
13831         if (ieee80211_is_deauth(mgmt->frame_control))
13832                 cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE;
13833         else
13834                 cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
13835
13836         trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
13837         nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1);
13838 }
13839 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
13840
13841 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
13842                                       struct net_device *netdev, int cmd,
13843                                       const u8 *addr, gfp_t gfp)
13844 {
13845         struct sk_buff *msg;
13846         void *hdr;
13847
13848         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
13849         if (!msg)
13850                 return;
13851
13852         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
13853         if (!hdr) {
13854                 nlmsg_free(msg);
13855                 return;
13856         }
13857
13858         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13859             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13860             nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
13861             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
13862                 goto nla_put_failure;
13863
13864         genlmsg_end(msg, hdr);
13865
13866         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13867                                 NL80211_MCGRP_MLME, gfp);
13868         return;
13869
13870  nla_put_failure:
13871         nlmsg_free(msg);
13872 }
13873
13874 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
13875                                struct net_device *netdev, const u8 *addr,
13876                                gfp_t gfp)
13877 {
13878         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
13879                                   addr, gfp);
13880 }
13881
13882 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
13883                                 struct net_device *netdev, const u8 *addr,
13884                                 gfp_t gfp)
13885 {
13886         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
13887                                   addr, gfp);
13888 }
13889
13890 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
13891                                  struct net_device *netdev,
13892                                  struct cfg80211_connect_resp_params *cr,
13893                                  gfp_t gfp)
13894 {
13895         struct sk_buff *msg;
13896         void *hdr;
13897
13898         msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len +
13899                         cr->fils_kek_len + cr->pmk_len +
13900                         (cr->pmkid ? WLAN_PMKID_LEN : 0), gfp);
13901         if (!msg)
13902                 return;
13903
13904         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
13905         if (!hdr) {
13906                 nlmsg_free(msg);
13907                 return;
13908         }
13909
13910         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13911             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13912             (cr->bssid &&
13913              nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) ||
13914             nla_put_u16(msg, NL80211_ATTR_STATUS_CODE,
13915                         cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE :
13916                         cr->status) ||
13917             (cr->status < 0 &&
13918              (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
13919               nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON,
13920                           cr->timeout_reason))) ||
13921             (cr->req_ie &&
13922              nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) ||
13923             (cr->resp_ie &&
13924              nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len,
13925                      cr->resp_ie)) ||
13926             (cr->update_erp_next_seq_num &&
13927              nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
13928                          cr->fils_erp_next_seq_num)) ||
13929             (cr->status == WLAN_STATUS_SUCCESS &&
13930              ((cr->fils_kek &&
13931                nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils_kek_len,
13932                        cr->fils_kek)) ||
13933               (cr->pmk &&
13934                nla_put(msg, NL80211_ATTR_PMK, cr->pmk_len, cr->pmk)) ||
13935               (cr->pmkid &&
13936                nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->pmkid)))))
13937                 goto nla_put_failure;
13938
13939         genlmsg_end(msg, hdr);
13940
13941         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13942                                 NL80211_MCGRP_MLME, gfp);
13943         return;
13944
13945  nla_put_failure:
13946         nlmsg_free(msg);
13947 }
13948
13949 void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
13950                          struct net_device *netdev,
13951                          struct cfg80211_roam_info *info, gfp_t gfp)
13952 {
13953         struct sk_buff *msg;
13954         void *hdr;
13955         const u8 *bssid = info->bss ? info->bss->bssid : info->bssid;
13956
13957         msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len, gfp);
13958         if (!msg)
13959                 return;
13960
13961         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
13962         if (!hdr) {
13963                 nlmsg_free(msg);
13964                 return;
13965         }
13966
13967         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
13968             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
13969             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) ||
13970             (info->req_ie &&
13971              nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len,
13972                      info->req_ie)) ||
13973             (info->resp_ie &&
13974              nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len,
13975                      info->resp_ie)))
13976                 goto nla_put_failure;
13977
13978         genlmsg_end(msg, hdr);
13979
13980         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
13981                                 NL80211_MCGRP_MLME, gfp);
13982         return;
13983
13984  nla_put_failure:
13985         nlmsg_free(msg);
13986 }
13987
13988 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
13989                                   struct net_device *netdev, const u8 *bssid)
13990 {
13991         struct sk_buff *msg;
13992         void *hdr;
13993
13994         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
13995         if (!msg)
13996                 return;
13997
13998         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED);
13999         if (!hdr) {
14000                 nlmsg_free(msg);
14001                 return;
14002         }
14003
14004         if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
14005                 goto nla_put_failure;
14006
14007         genlmsg_end(msg, hdr);
14008
14009         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14010                                 NL80211_MCGRP_MLME, GFP_KERNEL);
14011         return;
14012
14013  nla_put_failure:
14014         nlmsg_free(msg);
14015 }
14016
14017 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
14018                                struct net_device *netdev, u16 reason,
14019                                const u8 *ie, size_t ie_len, bool from_ap)
14020 {
14021         struct sk_buff *msg;
14022         void *hdr;
14023
14024         msg = nlmsg_new(100 + ie_len, GFP_KERNEL);
14025         if (!msg)
14026                 return;
14027
14028         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
14029         if (!hdr) {
14030                 nlmsg_free(msg);
14031                 return;
14032         }
14033
14034         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14035             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
14036             (reason &&
14037              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) ||
14038             (from_ap &&
14039              nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) ||
14040             (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie)))
14041                 goto nla_put_failure;
14042
14043         genlmsg_end(msg, hdr);
14044
14045         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14046                                 NL80211_MCGRP_MLME, GFP_KERNEL);
14047         return;
14048
14049  nla_put_failure:
14050         nlmsg_free(msg);
14051 }
14052
14053 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
14054                              struct net_device *netdev, const u8 *bssid,
14055                              gfp_t gfp)
14056 {
14057         struct sk_buff *msg;
14058         void *hdr;
14059
14060         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14061         if (!msg)
14062                 return;
14063
14064         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
14065         if (!hdr) {
14066                 nlmsg_free(msg);
14067                 return;
14068         }
14069
14070         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14071             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
14072             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
14073                 goto nla_put_failure;
14074
14075         genlmsg_end(msg, hdr);
14076
14077         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14078                                 NL80211_MCGRP_MLME, gfp);
14079         return;
14080
14081  nla_put_failure:
14082         nlmsg_free(msg);
14083 }
14084
14085 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
14086                                         const u8* ie, u8 ie_len, gfp_t gfp)
14087 {
14088         struct wireless_dev *wdev = dev->ieee80211_ptr;
14089         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14090         struct sk_buff *msg;
14091         void *hdr;
14092
14093         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
14094                 return;
14095
14096         trace_cfg80211_notify_new_peer_candidate(dev, addr);
14097
14098         msg = nlmsg_new(100 + ie_len, gfp);
14099         if (!msg)
14100                 return;
14101
14102         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
14103         if (!hdr) {
14104                 nlmsg_free(msg);
14105                 return;
14106         }
14107
14108         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14109             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
14110             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
14111             (ie_len && ie &&
14112              nla_put(msg, NL80211_ATTR_IE, ie_len , ie)))
14113                 goto nla_put_failure;
14114
14115         genlmsg_end(msg, hdr);
14116
14117         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14118                                 NL80211_MCGRP_MLME, gfp);
14119         return;
14120
14121  nla_put_failure:
14122         nlmsg_free(msg);
14123 }
14124 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
14125
14126 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
14127                                  struct net_device *netdev, const u8 *addr,
14128                                  enum nl80211_key_type key_type, int key_id,
14129                                  const u8 *tsc, gfp_t gfp)
14130 {
14131         struct sk_buff *msg;
14132         void *hdr;
14133
14134         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14135         if (!msg)
14136                 return;
14137
14138         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
14139         if (!hdr) {
14140                 nlmsg_free(msg);
14141                 return;
14142         }
14143
14144         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14145             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
14146             (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) ||
14147             nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) ||
14148             (key_id != -1 &&
14149              nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) ||
14150             (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc)))
14151                 goto nla_put_failure;
14152
14153         genlmsg_end(msg, hdr);
14154
14155         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14156                                 NL80211_MCGRP_MLME, gfp);
14157         return;
14158
14159  nla_put_failure:
14160         nlmsg_free(msg);
14161 }
14162
14163 void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
14164                                     struct ieee80211_channel *channel_before,
14165                                     struct ieee80211_channel *channel_after)
14166 {
14167         struct sk_buff *msg;
14168         void *hdr;
14169         struct nlattr *nl_freq;
14170
14171         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
14172         if (!msg)
14173                 return;
14174
14175         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
14176         if (!hdr) {
14177                 nlmsg_free(msg);
14178                 return;
14179         }
14180
14181         /*
14182          * Since we are applying the beacon hint to a wiphy we know its
14183          * wiphy_idx is valid
14184          */
14185         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
14186                 goto nla_put_failure;
14187
14188         /* Before */
14189         nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_BEFORE);
14190         if (!nl_freq)
14191                 goto nla_put_failure;
14192         if (nl80211_msg_put_channel(msg, channel_before, false))
14193                 goto nla_put_failure;
14194         nla_nest_end(msg, nl_freq);
14195
14196         /* After */
14197         nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_AFTER);
14198         if (!nl_freq)
14199                 goto nla_put_failure;
14200         if (nl80211_msg_put_channel(msg, channel_after, false))
14201                 goto nla_put_failure;
14202         nla_nest_end(msg, nl_freq);
14203
14204         genlmsg_end(msg, hdr);
14205
14206         rcu_read_lock();
14207         genlmsg_multicast_allns(&nl80211_fam, msg, 0,
14208                                 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
14209         rcu_read_unlock();
14210
14211         return;
14212
14213 nla_put_failure:
14214         nlmsg_free(msg);
14215 }
14216
14217 static void nl80211_send_remain_on_chan_event(
14218         int cmd, struct cfg80211_registered_device *rdev,
14219         struct wireless_dev *wdev, u64 cookie,
14220         struct ieee80211_channel *chan,
14221         unsigned int duration, gfp_t gfp)
14222 {
14223         struct sk_buff *msg;
14224         void *hdr;
14225
14226         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14227         if (!msg)
14228                 return;
14229
14230         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
14231         if (!hdr) {
14232                 nlmsg_free(msg);
14233                 return;
14234         }
14235
14236         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14237             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
14238                                          wdev->netdev->ifindex)) ||
14239             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14240                               NL80211_ATTR_PAD) ||
14241             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) ||
14242             nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
14243                         NL80211_CHAN_NO_HT) ||
14244             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
14245                               NL80211_ATTR_PAD))
14246                 goto nla_put_failure;
14247
14248         if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL &&
14249             nla_put_u32(msg, NL80211_ATTR_DURATION, duration))
14250                 goto nla_put_failure;
14251
14252         genlmsg_end(msg, hdr);
14253
14254         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14255                                 NL80211_MCGRP_MLME, gfp);
14256         return;
14257
14258  nla_put_failure:
14259         nlmsg_free(msg);
14260 }
14261
14262 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
14263                                struct ieee80211_channel *chan,
14264                                unsigned int duration, gfp_t gfp)
14265 {
14266         struct wiphy *wiphy = wdev->wiphy;
14267         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14268
14269         trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
14270         nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
14271                                           rdev, wdev, cookie, chan,
14272                                           duration, gfp);
14273 }
14274 EXPORT_SYMBOL(cfg80211_ready_on_channel);
14275
14276 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
14277                                         struct ieee80211_channel *chan,
14278                                         gfp_t gfp)
14279 {
14280         struct wiphy *wiphy = wdev->wiphy;
14281         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14282
14283         trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
14284         nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
14285                                           rdev, wdev, cookie, chan, 0, gfp);
14286 }
14287 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
14288
14289 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
14290                       struct station_info *sinfo, gfp_t gfp)
14291 {
14292         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
14293         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14294         struct sk_buff *msg;
14295
14296         trace_cfg80211_new_sta(dev, mac_addr, sinfo);
14297
14298         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14299         if (!msg)
14300                 return;
14301
14302         if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0,
14303                                  rdev, dev, mac_addr, sinfo) < 0) {
14304                 nlmsg_free(msg);
14305                 return;
14306         }
14307
14308         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14309                                 NL80211_MCGRP_MLME, gfp);
14310 }
14311 EXPORT_SYMBOL(cfg80211_new_sta);
14312
14313 void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
14314                             struct station_info *sinfo, gfp_t gfp)
14315 {
14316         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
14317         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14318         struct sk_buff *msg;
14319         struct station_info empty_sinfo = {};
14320
14321         if (!sinfo)
14322                 sinfo = &empty_sinfo;
14323
14324         trace_cfg80211_del_sta(dev, mac_addr);
14325
14326         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14327         if (!msg)
14328                 return;
14329
14330         if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0,
14331                                  rdev, dev, mac_addr, sinfo) < 0) {
14332                 nlmsg_free(msg);
14333                 return;
14334         }
14335
14336         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14337                                 NL80211_MCGRP_MLME, gfp);
14338 }
14339 EXPORT_SYMBOL(cfg80211_del_sta_sinfo);
14340
14341 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
14342                           enum nl80211_connect_failed_reason reason,
14343                           gfp_t gfp)
14344 {
14345         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
14346         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14347         struct sk_buff *msg;
14348         void *hdr;
14349
14350         msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
14351         if (!msg)
14352                 return;
14353
14354         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
14355         if (!hdr) {
14356                 nlmsg_free(msg);
14357                 return;
14358         }
14359
14360         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
14361             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
14362             nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
14363                 goto nla_put_failure;
14364
14365         genlmsg_end(msg, hdr);
14366
14367         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14368                                 NL80211_MCGRP_MLME, gfp);
14369         return;
14370
14371  nla_put_failure:
14372         nlmsg_free(msg);
14373 }
14374 EXPORT_SYMBOL(cfg80211_conn_failed);
14375
14376 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
14377                                        const u8 *addr, gfp_t gfp)
14378 {
14379         struct wireless_dev *wdev = dev->ieee80211_ptr;
14380         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14381         struct sk_buff *msg;
14382         void *hdr;
14383         u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid);
14384
14385         if (!nlportid)
14386                 return false;
14387
14388         msg = nlmsg_new(100, gfp);
14389         if (!msg)
14390                 return true;
14391
14392         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
14393         if (!hdr) {
14394                 nlmsg_free(msg);
14395                 return true;
14396         }
14397
14398         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14399             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
14400             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
14401                 goto nla_put_failure;
14402
14403         genlmsg_end(msg, hdr);
14404         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
14405         return true;
14406
14407  nla_put_failure:
14408         nlmsg_free(msg);
14409         return true;
14410 }
14411
14412 bool cfg80211_rx_spurious_frame(struct net_device *dev,
14413                                 const u8 *addr, gfp_t gfp)
14414 {
14415         struct wireless_dev *wdev = dev->ieee80211_ptr;
14416         bool ret;
14417
14418         trace_cfg80211_rx_spurious_frame(dev, addr);
14419
14420         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
14421                     wdev->iftype != NL80211_IFTYPE_P2P_GO)) {
14422                 trace_cfg80211_return_bool(false);
14423                 return false;
14424         }
14425         ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME,
14426                                          addr, gfp);
14427         trace_cfg80211_return_bool(ret);
14428         return ret;
14429 }
14430 EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
14431
14432 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
14433                                         const u8 *addr, gfp_t gfp)
14434 {
14435         struct wireless_dev *wdev = dev->ieee80211_ptr;
14436         bool ret;
14437
14438         trace_cfg80211_rx_unexpected_4addr_frame(dev, addr);
14439
14440         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
14441                     wdev->iftype != NL80211_IFTYPE_P2P_GO &&
14442                     wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
14443                 trace_cfg80211_return_bool(false);
14444                 return false;
14445         }
14446         ret = __nl80211_unexpected_frame(dev,
14447                                          NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
14448                                          addr, gfp);
14449         trace_cfg80211_return_bool(ret);
14450         return ret;
14451 }
14452 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
14453
14454 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
14455                       struct wireless_dev *wdev, u32 nlportid,
14456                       int freq, int sig_dbm,
14457                       const u8 *buf, size_t len, u32 flags, gfp_t gfp)
14458 {
14459         struct net_device *netdev = wdev->netdev;
14460         struct sk_buff *msg;
14461         void *hdr;
14462
14463         msg = nlmsg_new(100 + len, gfp);
14464         if (!msg)
14465                 return -ENOMEM;
14466
14467         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
14468         if (!hdr) {
14469                 nlmsg_free(msg);
14470                 return -ENOMEM;
14471         }
14472
14473         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14474             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
14475                                         netdev->ifindex)) ||
14476             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14477                               NL80211_ATTR_PAD) ||
14478             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
14479             (sig_dbm &&
14480              nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
14481             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
14482             (flags &&
14483              nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags)))
14484                 goto nla_put_failure;
14485
14486         genlmsg_end(msg, hdr);
14487
14488         return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
14489
14490  nla_put_failure:
14491         nlmsg_free(msg);
14492         return -ENOBUFS;
14493 }
14494
14495 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
14496                              const u8 *buf, size_t len, bool ack, gfp_t gfp)
14497 {
14498         struct wiphy *wiphy = wdev->wiphy;
14499         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14500         struct net_device *netdev = wdev->netdev;
14501         struct sk_buff *msg;
14502         void *hdr;
14503
14504         trace_cfg80211_mgmt_tx_status(wdev, cookie, ack);
14505
14506         msg = nlmsg_new(100 + len, gfp);
14507         if (!msg)
14508                 return;
14509
14510         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS);
14511         if (!hdr) {
14512                 nlmsg_free(msg);
14513                 return;
14514         }
14515
14516         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14517             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
14518                                    netdev->ifindex)) ||
14519             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14520                               NL80211_ATTR_PAD) ||
14521             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
14522             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
14523                               NL80211_ATTR_PAD) ||
14524             (ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
14525                 goto nla_put_failure;
14526
14527         genlmsg_end(msg, hdr);
14528
14529         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14530                                 NL80211_MCGRP_MLME, gfp);
14531         return;
14532
14533  nla_put_failure:
14534         nlmsg_free(msg);
14535 }
14536 EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
14537
14538 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev,
14539                                             const char *mac, gfp_t gfp)
14540 {
14541         struct wireless_dev *wdev = dev->ieee80211_ptr;
14542         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14543         struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14544         void **cb;
14545
14546         if (!msg)
14547                 return NULL;
14548
14549         cb = (void **)msg->cb;
14550
14551         cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
14552         if (!cb[0]) {
14553                 nlmsg_free(msg);
14554                 return NULL;
14555         }
14556
14557         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14558             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
14559                 goto nla_put_failure;
14560
14561         if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
14562                 goto nla_put_failure;
14563
14564         cb[1] = nla_nest_start(msg, NL80211_ATTR_CQM);
14565         if (!cb[1])
14566                 goto nla_put_failure;
14567
14568         cb[2] = rdev;
14569
14570         return msg;
14571  nla_put_failure:
14572         nlmsg_free(msg);
14573         return NULL;
14574 }
14575
14576 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp)
14577 {
14578         void **cb = (void **)msg->cb;
14579         struct cfg80211_registered_device *rdev = cb[2];
14580
14581         nla_nest_end(msg, cb[1]);
14582         genlmsg_end(msg, cb[0]);
14583
14584         memset(msg->cb, 0, sizeof(msg->cb));
14585
14586         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14587                                 NL80211_MCGRP_MLME, gfp);
14588 }
14589
14590 void cfg80211_cqm_rssi_notify(struct net_device *dev,
14591                               enum nl80211_cqm_rssi_threshold_event rssi_event,
14592                               s32 rssi_level, gfp_t gfp)
14593 {
14594         struct sk_buff *msg;
14595         struct wireless_dev *wdev = dev->ieee80211_ptr;
14596         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14597
14598         trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level);
14599
14600         if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
14601                     rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
14602                 return;
14603
14604         if (wdev->cqm_config) {
14605                 wdev->cqm_config->last_rssi_event_value = rssi_level;
14606
14607                 cfg80211_cqm_rssi_update(rdev, dev);
14608
14609                 if (rssi_level == 0)
14610                         rssi_level = wdev->cqm_config->last_rssi_event_value;
14611         }
14612
14613         msg = cfg80211_prepare_cqm(dev, NULL, gfp);
14614         if (!msg)
14615                 return;
14616
14617         if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
14618                         rssi_event))
14619                 goto nla_put_failure;
14620
14621         if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL,
14622                                       rssi_level))
14623                 goto nla_put_failure;
14624
14625         cfg80211_send_cqm(msg, gfp);
14626
14627         return;
14628
14629  nla_put_failure:
14630         nlmsg_free(msg);
14631 }
14632 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
14633
14634 void cfg80211_cqm_txe_notify(struct net_device *dev,
14635                              const u8 *peer, u32 num_packets,
14636                              u32 rate, u32 intvl, gfp_t gfp)
14637 {
14638         struct sk_buff *msg;
14639
14640         msg = cfg80211_prepare_cqm(dev, peer, gfp);
14641         if (!msg)
14642                 return;
14643
14644         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets))
14645                 goto nla_put_failure;
14646
14647         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate))
14648                 goto nla_put_failure;
14649
14650         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl))
14651                 goto nla_put_failure;
14652
14653         cfg80211_send_cqm(msg, gfp);
14654         return;
14655
14656  nla_put_failure:
14657         nlmsg_free(msg);
14658 }
14659 EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
14660
14661 void cfg80211_cqm_pktloss_notify(struct net_device *dev,
14662                                  const u8 *peer, u32 num_packets, gfp_t gfp)
14663 {
14664         struct sk_buff *msg;
14665
14666         trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
14667
14668         msg = cfg80211_prepare_cqm(dev, peer, gfp);
14669         if (!msg)
14670                 return;
14671
14672         if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets))
14673                 goto nla_put_failure;
14674
14675         cfg80211_send_cqm(msg, gfp);
14676         return;
14677
14678  nla_put_failure:
14679         nlmsg_free(msg);
14680 }
14681 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
14682
14683 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp)
14684 {
14685         struct sk_buff *msg;
14686
14687         msg = cfg80211_prepare_cqm(dev, NULL, gfp);
14688         if (!msg)
14689                 return;
14690
14691         if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT))
14692                 goto nla_put_failure;
14693
14694         cfg80211_send_cqm(msg, gfp);
14695         return;
14696
14697  nla_put_failure:
14698         nlmsg_free(msg);
14699 }
14700 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify);
14701
14702 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
14703                                      struct net_device *netdev, const u8 *bssid,
14704                                      const u8 *replay_ctr, gfp_t gfp)
14705 {
14706         struct sk_buff *msg;
14707         struct nlattr *rekey_attr;
14708         void *hdr;
14709
14710         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14711         if (!msg)
14712                 return;
14713
14714         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD);
14715         if (!hdr) {
14716                 nlmsg_free(msg);
14717                 return;
14718         }
14719
14720         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14721             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
14722             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
14723                 goto nla_put_failure;
14724
14725         rekey_attr = nla_nest_start(msg, NL80211_ATTR_REKEY_DATA);
14726         if (!rekey_attr)
14727                 goto nla_put_failure;
14728
14729         if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR,
14730                     NL80211_REPLAY_CTR_LEN, replay_ctr))
14731                 goto nla_put_failure;
14732
14733         nla_nest_end(msg, rekey_attr);
14734
14735         genlmsg_end(msg, hdr);
14736
14737         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14738                                 NL80211_MCGRP_MLME, gfp);
14739         return;
14740
14741  nla_put_failure:
14742         nlmsg_free(msg);
14743 }
14744
14745 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
14746                                const u8 *replay_ctr, gfp_t gfp)
14747 {
14748         struct wireless_dev *wdev = dev->ieee80211_ptr;
14749         struct wiphy *wiphy = wdev->wiphy;
14750         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14751
14752         trace_cfg80211_gtk_rekey_notify(dev, bssid);
14753         nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
14754 }
14755 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
14756
14757 static void
14758 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
14759                                struct net_device *netdev, int index,
14760                                const u8 *bssid, bool preauth, gfp_t gfp)
14761 {
14762         struct sk_buff *msg;
14763         struct nlattr *attr;
14764         void *hdr;
14765
14766         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14767         if (!msg)
14768                 return;
14769
14770         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE);
14771         if (!hdr) {
14772                 nlmsg_free(msg);
14773                 return;
14774         }
14775
14776         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
14777             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
14778                 goto nla_put_failure;
14779
14780         attr = nla_nest_start(msg, NL80211_ATTR_PMKSA_CANDIDATE);
14781         if (!attr)
14782                 goto nla_put_failure;
14783
14784         if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) ||
14785             nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) ||
14786             (preauth &&
14787              nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH)))
14788                 goto nla_put_failure;
14789
14790         nla_nest_end(msg, attr);
14791
14792         genlmsg_end(msg, hdr);
14793
14794         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14795                                 NL80211_MCGRP_MLME, gfp);
14796         return;
14797
14798  nla_put_failure:
14799         nlmsg_free(msg);
14800 }
14801
14802 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
14803                                      const u8 *bssid, bool preauth, gfp_t gfp)
14804 {
14805         struct wireless_dev *wdev = dev->ieee80211_ptr;
14806         struct wiphy *wiphy = wdev->wiphy;
14807         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14808
14809         trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
14810         nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
14811 }
14812 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
14813
14814 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
14815                                      struct net_device *netdev,
14816                                      struct cfg80211_chan_def *chandef,
14817                                      gfp_t gfp,
14818                                      enum nl80211_commands notif,
14819                                      u8 count)
14820 {
14821         struct sk_buff *msg;
14822         void *hdr;
14823
14824         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14825         if (!msg)
14826                 return;
14827
14828         hdr = nl80211hdr_put(msg, 0, 0, 0, notif);
14829         if (!hdr) {
14830                 nlmsg_free(msg);
14831                 return;
14832         }
14833
14834         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
14835                 goto nla_put_failure;
14836
14837         if (nl80211_send_chandef(msg, chandef))
14838                 goto nla_put_failure;
14839
14840         if ((notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) &&
14841             (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)))
14842                         goto nla_put_failure;
14843
14844         genlmsg_end(msg, hdr);
14845
14846         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14847                                 NL80211_MCGRP_MLME, gfp);
14848         return;
14849
14850  nla_put_failure:
14851         nlmsg_free(msg);
14852 }
14853
14854 void cfg80211_ch_switch_notify(struct net_device *dev,
14855                                struct cfg80211_chan_def *chandef)
14856 {
14857         struct wireless_dev *wdev = dev->ieee80211_ptr;
14858         struct wiphy *wiphy = wdev->wiphy;
14859         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14860
14861         ASSERT_WDEV_LOCK(wdev);
14862
14863         trace_cfg80211_ch_switch_notify(dev, chandef);
14864
14865         wdev->chandef = *chandef;
14866         wdev->preset_chandef = *chandef;
14867         nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
14868                                  NL80211_CMD_CH_SWITCH_NOTIFY, 0);
14869 }
14870 EXPORT_SYMBOL(cfg80211_ch_switch_notify);
14871
14872 void cfg80211_ch_switch_started_notify(struct net_device *dev,
14873                                        struct cfg80211_chan_def *chandef,
14874                                        u8 count)
14875 {
14876         struct wireless_dev *wdev = dev->ieee80211_ptr;
14877         struct wiphy *wiphy = wdev->wiphy;
14878         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
14879
14880         trace_cfg80211_ch_switch_started_notify(dev, chandef);
14881
14882         nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
14883                                  NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, count);
14884 }
14885 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
14886
14887 void
14888 nl80211_radar_notify(struct cfg80211_registered_device *rdev,
14889                      const struct cfg80211_chan_def *chandef,
14890                      enum nl80211_radar_event event,
14891                      struct net_device *netdev, gfp_t gfp)
14892 {
14893         struct sk_buff *msg;
14894         void *hdr;
14895
14896         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14897         if (!msg)
14898                 return;
14899
14900         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT);
14901         if (!hdr) {
14902                 nlmsg_free(msg);
14903                 return;
14904         }
14905
14906         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
14907                 goto nla_put_failure;
14908
14909         /* NOP and radar events don't need a netdev parameter */
14910         if (netdev) {
14911                 struct wireless_dev *wdev = netdev->ieee80211_ptr;
14912
14913                 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
14914                     nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
14915                                       NL80211_ATTR_PAD))
14916                         goto nla_put_failure;
14917         }
14918
14919         if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
14920                 goto nla_put_failure;
14921
14922         if (nl80211_send_chandef(msg, chandef))
14923                 goto nla_put_failure;
14924
14925         genlmsg_end(msg, hdr);
14926
14927         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14928                                 NL80211_MCGRP_MLME, gfp);
14929         return;
14930
14931  nla_put_failure:
14932         nlmsg_free(msg);
14933 }
14934
14935 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac,
14936                                        struct sta_opmode_info *sta_opmode,
14937                                        gfp_t gfp)
14938 {
14939         struct sk_buff *msg;
14940         struct wireless_dev *wdev = dev->ieee80211_ptr;
14941         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14942         void *hdr;
14943
14944         if (WARN_ON(!mac))
14945                 return;
14946
14947         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
14948         if (!msg)
14949                 return;
14950
14951         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED);
14952         if (!hdr) {
14953                 nlmsg_free(msg);
14954                 return;
14955         }
14956
14957         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
14958                 goto nla_put_failure;
14959
14960         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
14961                 goto nla_put_failure;
14962
14963         if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
14964                 goto nla_put_failure;
14965
14966         if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) &&
14967             nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode))
14968                 goto nla_put_failure;
14969
14970         if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) &&
14971             nla_put_u8(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw))
14972                 goto nla_put_failure;
14973
14974         if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) &&
14975             nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss))
14976                 goto nla_put_failure;
14977
14978         genlmsg_end(msg, hdr);
14979
14980         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
14981                                 NL80211_MCGRP_MLME, gfp);
14982
14983         return;
14984
14985 nla_put_failure:
14986         nlmsg_free(msg);
14987 }
14988 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify);
14989
14990 void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
14991                            u64 cookie, bool acked, s32 ack_signal,
14992                            bool is_valid_ack_signal, gfp_t gfp)
14993 {
14994         struct wireless_dev *wdev = dev->ieee80211_ptr;
14995         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
14996         struct sk_buff *msg;
14997         void *hdr;
14998
14999         trace_cfg80211_probe_status(dev, addr, cookie, acked);
15000
15001         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15002
15003         if (!msg)
15004                 return;
15005
15006         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT);
15007         if (!hdr) {
15008                 nlmsg_free(msg);
15009                 return;
15010         }
15011
15012         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15013             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
15014             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
15015             nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
15016                               NL80211_ATTR_PAD) ||
15017             (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) ||
15018             (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL,
15019                                                 ack_signal)))
15020                 goto nla_put_failure;
15021
15022         genlmsg_end(msg, hdr);
15023
15024         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15025                                 NL80211_MCGRP_MLME, gfp);
15026         return;
15027
15028  nla_put_failure:
15029         nlmsg_free(msg);
15030 }
15031 EXPORT_SYMBOL(cfg80211_probe_status);
15032
15033 void cfg80211_report_obss_beacon(struct wiphy *wiphy,
15034                                  const u8 *frame, size_t len,
15035                                  int freq, int sig_dbm)
15036 {
15037         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15038         struct sk_buff *msg;
15039         void *hdr;
15040         struct cfg80211_beacon_registration *reg;
15041
15042         trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm);
15043
15044         spin_lock_bh(&rdev->beacon_registrations_lock);
15045         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
15046                 msg = nlmsg_new(len + 100, GFP_ATOMIC);
15047                 if (!msg) {
15048                         spin_unlock_bh(&rdev->beacon_registrations_lock);
15049                         return;
15050                 }
15051
15052                 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
15053                 if (!hdr)
15054                         goto nla_put_failure;
15055
15056                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15057                     (freq &&
15058                      nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq)) ||
15059                     (sig_dbm &&
15060                      nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
15061                     nla_put(msg, NL80211_ATTR_FRAME, len, frame))
15062                         goto nla_put_failure;
15063
15064                 genlmsg_end(msg, hdr);
15065
15066                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid);
15067         }
15068         spin_unlock_bh(&rdev->beacon_registrations_lock);
15069         return;
15070
15071  nla_put_failure:
15072         spin_unlock_bh(&rdev->beacon_registrations_lock);
15073         nlmsg_free(msg);
15074 }
15075 EXPORT_SYMBOL(cfg80211_report_obss_beacon);
15076
15077 #ifdef CONFIG_PM
15078 static int cfg80211_net_detect_results(struct sk_buff *msg,
15079                                        struct cfg80211_wowlan_wakeup *wakeup)
15080 {
15081         struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect;
15082         struct nlattr *nl_results, *nl_match, *nl_freqs;
15083         int i, j;
15084
15085         nl_results = nla_nest_start(
15086                 msg, NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS);
15087         if (!nl_results)
15088                 return -EMSGSIZE;
15089
15090         for (i = 0; i < nd->n_matches; i++) {
15091                 struct cfg80211_wowlan_nd_match *match = nd->matches[i];
15092
15093                 nl_match = nla_nest_start(msg, i);
15094                 if (!nl_match)
15095                         break;
15096
15097                 /* The SSID attribute is optional in nl80211, but for
15098                  * simplicity reasons it's always present in the
15099                  * cfg80211 structure.  If a driver can't pass the
15100                  * SSID, that needs to be changed.  A zero length SSID
15101                  * is still a valid SSID (wildcard), so it cannot be
15102                  * used for this purpose.
15103                  */
15104                 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len,
15105                             match->ssid.ssid)) {
15106                         nla_nest_cancel(msg, nl_match);
15107                         goto out;
15108                 }
15109
15110                 if (match->n_channels) {
15111                         nl_freqs = nla_nest_start(
15112                                 msg, NL80211_ATTR_SCAN_FREQUENCIES);
15113                         if (!nl_freqs) {
15114                                 nla_nest_cancel(msg, nl_match);
15115                                 goto out;
15116                         }
15117
15118                         for (j = 0; j < match->n_channels; j++) {
15119                                 if (nla_put_u32(msg, j, match->channels[j])) {
15120                                         nla_nest_cancel(msg, nl_freqs);
15121                                         nla_nest_cancel(msg, nl_match);
15122                                         goto out;
15123                                 }
15124                         }
15125
15126                         nla_nest_end(msg, nl_freqs);
15127                 }
15128
15129                 nla_nest_end(msg, nl_match);
15130         }
15131
15132 out:
15133         nla_nest_end(msg, nl_results);
15134         return 0;
15135 }
15136
15137 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
15138                                    struct cfg80211_wowlan_wakeup *wakeup,
15139                                    gfp_t gfp)
15140 {
15141         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
15142         struct sk_buff *msg;
15143         void *hdr;
15144         int size = 200;
15145
15146         trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup);
15147
15148         if (wakeup)
15149                 size += wakeup->packet_present_len;
15150
15151         msg = nlmsg_new(size, gfp);
15152         if (!msg)
15153                 return;
15154
15155         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN);
15156         if (!hdr)
15157                 goto free_msg;
15158
15159         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15160             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
15161                               NL80211_ATTR_PAD))
15162                 goto free_msg;
15163
15164         if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
15165                                         wdev->netdev->ifindex))
15166                 goto free_msg;
15167
15168         if (wakeup) {
15169                 struct nlattr *reasons;
15170
15171                 reasons = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
15172                 if (!reasons)
15173                         goto free_msg;
15174
15175                 if (wakeup->disconnect &&
15176                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT))
15177                         goto free_msg;
15178                 if (wakeup->magic_pkt &&
15179                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT))
15180                         goto free_msg;
15181                 if (wakeup->gtk_rekey_failure &&
15182                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE))
15183                         goto free_msg;
15184                 if (wakeup->eap_identity_req &&
15185                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST))
15186                         goto free_msg;
15187                 if (wakeup->four_way_handshake &&
15188                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE))
15189                         goto free_msg;
15190                 if (wakeup->rfkill_release &&
15191                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))
15192                         goto free_msg;
15193
15194                 if (wakeup->pattern_idx >= 0 &&
15195                     nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
15196                                 wakeup->pattern_idx))
15197                         goto free_msg;
15198
15199                 if (wakeup->tcp_match &&
15200                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH))
15201                         goto free_msg;
15202
15203                 if (wakeup->tcp_connlost &&
15204                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST))
15205                         goto free_msg;
15206
15207                 if (wakeup->tcp_nomoretokens &&
15208                     nla_put_flag(msg,
15209                                  NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS))
15210                         goto free_msg;
15211
15212                 if (wakeup->packet) {
15213                         u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211;
15214                         u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN;
15215
15216                         if (!wakeup->packet_80211) {
15217                                 pkt_attr =
15218                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023;
15219                                 len_attr =
15220                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN;
15221                         }
15222
15223                         if (wakeup->packet_len &&
15224                             nla_put_u32(msg, len_attr, wakeup->packet_len))
15225                                 goto free_msg;
15226
15227                         if (nla_put(msg, pkt_attr, wakeup->packet_present_len,
15228                                     wakeup->packet))
15229                                 goto free_msg;
15230                 }
15231
15232                 if (wakeup->net_detect &&
15233                     cfg80211_net_detect_results(msg, wakeup))
15234                                 goto free_msg;
15235
15236                 nla_nest_end(msg, reasons);
15237         }
15238
15239         genlmsg_end(msg, hdr);
15240
15241         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15242                                 NL80211_MCGRP_MLME, gfp);
15243         return;
15244
15245  free_msg:
15246         nlmsg_free(msg);
15247 }
15248 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup);
15249 #endif
15250
15251 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
15252                                 enum nl80211_tdls_operation oper,
15253                                 u16 reason_code, gfp_t gfp)
15254 {
15255         struct wireless_dev *wdev = dev->ieee80211_ptr;
15256         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
15257         struct sk_buff *msg;
15258         void *hdr;
15259
15260         trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper,
15261                                          reason_code);
15262
15263         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15264         if (!msg)
15265                 return;
15266
15267         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER);
15268         if (!hdr) {
15269                 nlmsg_free(msg);
15270                 return;
15271         }
15272
15273         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15274             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
15275             nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) ||
15276             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) ||
15277             (reason_code > 0 &&
15278              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code)))
15279                 goto nla_put_failure;
15280
15281         genlmsg_end(msg, hdr);
15282
15283         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15284                                 NL80211_MCGRP_MLME, gfp);
15285         return;
15286
15287  nla_put_failure:
15288         nlmsg_free(msg);
15289 }
15290 EXPORT_SYMBOL(cfg80211_tdls_oper_request);
15291
15292 static int nl80211_netlink_notify(struct notifier_block * nb,
15293                                   unsigned long state,
15294                                   void *_notify)
15295 {
15296         struct netlink_notify *notify = _notify;
15297         struct cfg80211_registered_device *rdev;
15298         struct wireless_dev *wdev;
15299         struct cfg80211_beacon_registration *reg, *tmp;
15300
15301         if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC)
15302                 return NOTIFY_DONE;
15303
15304         rcu_read_lock();
15305
15306         list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
15307                 struct cfg80211_sched_scan_request *sched_scan_req;
15308
15309                 list_for_each_entry_rcu(sched_scan_req,
15310                                         &rdev->sched_scan_req_list,
15311                                         list) {
15312                         if (sched_scan_req->owner_nlportid == notify->portid) {
15313                                 sched_scan_req->nl_owner_dead = true;
15314                                 schedule_work(&rdev->sched_scan_stop_wk);
15315                         }
15316                 }
15317
15318                 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) {
15319                         cfg80211_mlme_unregister_socket(wdev, notify->portid);
15320
15321                         if (wdev->owner_nlportid == notify->portid) {
15322                                 wdev->nl_owner_dead = true;
15323                                 schedule_work(&rdev->destroy_work);
15324                         } else if (wdev->conn_owner_nlportid == notify->portid) {
15325                                 schedule_work(&wdev->disconnect_wk);
15326                         }
15327                 }
15328
15329                 spin_lock_bh(&rdev->beacon_registrations_lock);
15330                 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations,
15331                                          list) {
15332                         if (reg->nlportid == notify->portid) {
15333                                 list_del(&reg->list);
15334                                 kfree(reg);
15335                                 break;
15336                         }
15337                 }
15338                 spin_unlock_bh(&rdev->beacon_registrations_lock);
15339         }
15340
15341         rcu_read_unlock();
15342
15343         /*
15344          * It is possible that the user space process that is controlling the
15345          * indoor setting disappeared, so notify the regulatory core.
15346          */
15347         regulatory_netlink_notify(notify->portid);
15348         return NOTIFY_OK;
15349 }
15350
15351 static struct notifier_block nl80211_netlink_notifier = {
15352         .notifier_call = nl80211_netlink_notify,
15353 };
15354
15355 void cfg80211_ft_event(struct net_device *netdev,
15356                        struct cfg80211_ft_event_params *ft_event)
15357 {
15358         struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
15359         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15360         struct sk_buff *msg;
15361         void *hdr;
15362
15363         trace_cfg80211_ft_event(wiphy, netdev, ft_event);
15364
15365         if (!ft_event->target_ap)
15366                 return;
15367
15368         msg = nlmsg_new(100 + ft_event->ric_ies_len, GFP_KERNEL);
15369         if (!msg)
15370                 return;
15371
15372         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT);
15373         if (!hdr)
15374                 goto out;
15375
15376         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15377             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
15378             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap))
15379                 goto out;
15380
15381         if (ft_event->ies &&
15382             nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies))
15383                 goto out;
15384         if (ft_event->ric_ies &&
15385             nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len,
15386                     ft_event->ric_ies))
15387                 goto out;
15388
15389         genlmsg_end(msg, hdr);
15390
15391         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
15392                                 NL80211_MCGRP_MLME, GFP_KERNEL);
15393         return;
15394  out:
15395         nlmsg_free(msg);
15396 }
15397 EXPORT_SYMBOL(cfg80211_ft_event);
15398
15399 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp)
15400 {
15401         struct cfg80211_registered_device *rdev;
15402         struct sk_buff *msg;
15403         void *hdr;
15404         u32 nlportid;
15405
15406         rdev = wiphy_to_rdev(wdev->wiphy);
15407         if (!rdev->crit_proto_nlportid)
15408                 return;
15409
15410         nlportid = rdev->crit_proto_nlportid;
15411         rdev->crit_proto_nlportid = 0;
15412
15413         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15414         if (!msg)
15415                 return;
15416
15417         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP);
15418         if (!hdr)
15419                 goto nla_put_failure;
15420
15421         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15422             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
15423                               NL80211_ATTR_PAD))
15424                 goto nla_put_failure;
15425
15426         genlmsg_end(msg, hdr);
15427
15428         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
15429         return;
15430
15431  nla_put_failure:
15432         nlmsg_free(msg);
15433 }
15434 EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
15435
15436 void nl80211_send_ap_stopped(struct wireless_dev *wdev)
15437 {
15438         struct wiphy *wiphy = wdev->wiphy;
15439         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
15440         struct sk_buff *msg;
15441         void *hdr;
15442
15443         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
15444         if (!msg)
15445                 return;
15446
15447         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP);
15448         if (!hdr)
15449                 goto out;
15450
15451         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15452             nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) ||
15453             nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
15454                               NL80211_ATTR_PAD))
15455                 goto out;
15456
15457         genlmsg_end(msg, hdr);
15458
15459         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
15460                                 NL80211_MCGRP_MLME, GFP_KERNEL);
15461         return;
15462  out:
15463         nlmsg_free(msg);
15464 }
15465
15466 int cfg80211_external_auth_request(struct net_device *dev,
15467                                    struct cfg80211_external_auth_params *params,
15468                                    gfp_t gfp)
15469 {
15470         struct wireless_dev *wdev = dev->ieee80211_ptr;
15471         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
15472         struct sk_buff *msg;
15473         void *hdr;
15474
15475         if (!wdev->conn_owner_nlportid)
15476                 return -EINVAL;
15477
15478         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
15479         if (!msg)
15480                 return -ENOMEM;
15481
15482         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH);
15483         if (!hdr)
15484                 goto nla_put_failure;
15485
15486         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
15487             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
15488             nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) ||
15489             nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION,
15490                         params->action) ||
15491             nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) ||
15492             nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len,
15493                     params->ssid.ssid))
15494                 goto nla_put_failure;
15495
15496         genlmsg_end(msg, hdr);
15497         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
15498                         wdev->conn_owner_nlportid);
15499         return 0;
15500
15501  nla_put_failure:
15502         nlmsg_free(msg);
15503         return -ENOBUFS;
15504 }
15505 EXPORT_SYMBOL(cfg80211_external_auth_request);
15506
15507 /* initialisation/exit functions */
15508
15509 int __init nl80211_init(void)
15510 {
15511         int err;
15512
15513         err = genl_register_family(&nl80211_fam);
15514         if (err)
15515                 return err;
15516
15517         err = netlink_register_notifier(&nl80211_netlink_notifier);
15518         if (err)
15519                 goto err_out;
15520
15521         return 0;
15522  err_out:
15523         genl_unregister_family(&nl80211_fam);
15524         return err;
15525 }
15526
15527 void nl80211_exit(void)
15528 {
15529         netlink_unregister_notifier(&nl80211_netlink_notifier);
15530         genl_unregister_family(&nl80211_fam);
15531 }