]> Pileus Git - ~andy/linux/blob - net/wireless/nl80211.c
nl80211: support vendor-specific events
[~andy/linux] / net / wireless / nl80211.c
1 /*
2  * This is the new netlink-based wireless configuration interface.
3  *
4  * Copyright 2006-2010  Johannes Berg <johannes@sipsolutions.net>
5  */
6
7 #include <linux/if.h>
8 #include <linux/module.h>
9 #include <linux/err.h>
10 #include <linux/slab.h>
11 #include <linux/list.h>
12 #include <linux/if_ether.h>
13 #include <linux/ieee80211.h>
14 #include <linux/nl80211.h>
15 #include <linux/rtnetlink.h>
16 #include <linux/netlink.h>
17 #include <linux/etherdevice.h>
18 #include <net/net_namespace.h>
19 #include <net/genetlink.h>
20 #include <net/cfg80211.h>
21 #include <net/sock.h>
22 #include <net/inet_connection_sock.h>
23 #include "core.h"
24 #include "nl80211.h"
25 #include "reg.h"
26 #include "rdev-ops.h"
27
28 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
29                                    struct genl_info *info,
30                                    struct cfg80211_crypto_settings *settings,
31                                    int cipher_limit);
32
33 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
34                             struct genl_info *info);
35 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
36                               struct genl_info *info);
37
38 /* the netlink family */
39 static struct genl_family nl80211_fam = {
40         .id = GENL_ID_GENERATE,         /* don't bother with a hardcoded ID */
41         .name = NL80211_GENL_NAME,      /* have users key off the name instead */
42         .hdrsize = 0,                   /* no private header */
43         .version = 1,                   /* no particular meaning now */
44         .maxattr = NL80211_ATTR_MAX,
45         .netnsok = true,
46         .pre_doit = nl80211_pre_doit,
47         .post_doit = nl80211_post_doit,
48 };
49
50 /* multicast groups */
51 enum nl80211_multicast_groups {
52         NL80211_MCGRP_CONFIG,
53         NL80211_MCGRP_SCAN,
54         NL80211_MCGRP_REGULATORY,
55         NL80211_MCGRP_MLME,
56         NL80211_MCGRP_VENDOR,
57         NL80211_MCGRP_TESTMODE /* keep last - ifdef! */
58 };
59
60 static const struct genl_multicast_group nl80211_mcgrps[] = {
61         [NL80211_MCGRP_CONFIG] = { .name = "config", },
62         [NL80211_MCGRP_SCAN] = { .name = "scan", },
63         [NL80211_MCGRP_REGULATORY] = { .name = "regulatory", },
64         [NL80211_MCGRP_MLME] = { .name = "mlme", },
65         [NL80211_MCGRP_VENDOR] = { .name = "vendor", },
66 #ifdef CONFIG_NL80211_TESTMODE
67         [NL80211_MCGRP_TESTMODE] = { .name = "testmode", }
68 #endif
69 };
70
71 /* returns ERR_PTR values */
72 static struct wireless_dev *
73 __cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs)
74 {
75         struct cfg80211_registered_device *rdev;
76         struct wireless_dev *result = NULL;
77         bool have_ifidx = attrs[NL80211_ATTR_IFINDEX];
78         bool have_wdev_id = attrs[NL80211_ATTR_WDEV];
79         u64 wdev_id;
80         int wiphy_idx = -1;
81         int ifidx = -1;
82
83         ASSERT_RTNL();
84
85         if (!have_ifidx && !have_wdev_id)
86                 return ERR_PTR(-EINVAL);
87
88         if (have_ifidx)
89                 ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
90         if (have_wdev_id) {
91                 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
92                 wiphy_idx = wdev_id >> 32;
93         }
94
95         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
96                 struct wireless_dev *wdev;
97
98                 if (wiphy_net(&rdev->wiphy) != netns)
99                         continue;
100
101                 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx)
102                         continue;
103
104                 list_for_each_entry(wdev, &rdev->wdev_list, list) {
105                         if (have_ifidx && wdev->netdev &&
106                             wdev->netdev->ifindex == ifidx) {
107                                 result = wdev;
108                                 break;
109                         }
110                         if (have_wdev_id && wdev->identifier == (u32)wdev_id) {
111                                 result = wdev;
112                                 break;
113                         }
114                 }
115
116                 if (result)
117                         break;
118         }
119
120         if (result)
121                 return result;
122         return ERR_PTR(-ENODEV);
123 }
124
125 static struct cfg80211_registered_device *
126 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs)
127 {
128         struct cfg80211_registered_device *rdev = NULL, *tmp;
129         struct net_device *netdev;
130
131         ASSERT_RTNL();
132
133         if (!attrs[NL80211_ATTR_WIPHY] &&
134             !attrs[NL80211_ATTR_IFINDEX] &&
135             !attrs[NL80211_ATTR_WDEV])
136                 return ERR_PTR(-EINVAL);
137
138         if (attrs[NL80211_ATTR_WIPHY])
139                 rdev = cfg80211_rdev_by_wiphy_idx(
140                                 nla_get_u32(attrs[NL80211_ATTR_WIPHY]));
141
142         if (attrs[NL80211_ATTR_WDEV]) {
143                 u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
144                 struct wireless_dev *wdev;
145                 bool found = false;
146
147                 tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32);
148                 if (tmp) {
149                         /* make sure wdev exists */
150                         list_for_each_entry(wdev, &tmp->wdev_list, list) {
151                                 if (wdev->identifier != (u32)wdev_id)
152                                         continue;
153                                 found = true;
154                                 break;
155                         }
156
157                         if (!found)
158                                 tmp = NULL;
159
160                         if (rdev && tmp != rdev)
161                                 return ERR_PTR(-EINVAL);
162                         rdev = tmp;
163                 }
164         }
165
166         if (attrs[NL80211_ATTR_IFINDEX]) {
167                 int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
168                 netdev = dev_get_by_index(netns, ifindex);
169                 if (netdev) {
170                         if (netdev->ieee80211_ptr)
171                                 tmp = wiphy_to_dev(
172                                                 netdev->ieee80211_ptr->wiphy);
173                         else
174                                 tmp = NULL;
175
176                         dev_put(netdev);
177
178                         /* not wireless device -- return error */
179                         if (!tmp)
180                                 return ERR_PTR(-EINVAL);
181
182                         /* mismatch -- return error */
183                         if (rdev && tmp != rdev)
184                                 return ERR_PTR(-EINVAL);
185
186                         rdev = tmp;
187                 }
188         }
189
190         if (!rdev)
191                 return ERR_PTR(-ENODEV);
192
193         if (netns != wiphy_net(&rdev->wiphy))
194                 return ERR_PTR(-ENODEV);
195
196         return rdev;
197 }
198
199 /*
200  * This function returns a pointer to the driver
201  * that the genl_info item that is passed refers to.
202  *
203  * The result of this can be a PTR_ERR and hence must
204  * be checked with IS_ERR() for errors.
205  */
206 static struct cfg80211_registered_device *
207 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info)
208 {
209         return __cfg80211_rdev_from_attrs(netns, info->attrs);
210 }
211
212 /* policy for the attributes */
213 static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
214         [NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
215         [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
216                                       .len = 20-1 },
217         [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED },
218
219         [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 },
220         [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 },
221         [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 },
222         [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 },
223         [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 },
224
225         [NL80211_ATTR_WIPHY_RETRY_SHORT] = { .type = NLA_U8 },
226         [NL80211_ATTR_WIPHY_RETRY_LONG] = { .type = NLA_U8 },
227         [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 },
228         [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 },
229         [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 },
230
231         [NL80211_ATTR_IFTYPE] = { .type = NLA_U32 },
232         [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
233         [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
234
235         [NL80211_ATTR_MAC] = { .len = ETH_ALEN },
236         [NL80211_ATTR_PREV_BSSID] = { .len = ETH_ALEN },
237
238         [NL80211_ATTR_KEY] = { .type = NLA_NESTED, },
239         [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
240                                     .len = WLAN_MAX_KEY_LEN },
241         [NL80211_ATTR_KEY_IDX] = { .type = NLA_U8 },
242         [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 },
243         [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG },
244         [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
245         [NL80211_ATTR_KEY_TYPE] = { .type = NLA_U32 },
246
247         [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 },
248         [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 },
249         [NL80211_ATTR_BEACON_HEAD] = { .type = NLA_BINARY,
250                                        .len = IEEE80211_MAX_DATA_LEN },
251         [NL80211_ATTR_BEACON_TAIL] = { .type = NLA_BINARY,
252                                        .len = IEEE80211_MAX_DATA_LEN },
253         [NL80211_ATTR_STA_AID] = { .type = NLA_U16 },
254         [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED },
255         [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 },
256         [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY,
257                                                .len = NL80211_MAX_SUPP_RATES },
258         [NL80211_ATTR_STA_PLINK_ACTION] = { .type = NLA_U8 },
259         [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 },
260         [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
261         [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
262                                    .len = IEEE80211_MAX_MESH_ID_LEN },
263         [NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 },
264
265         [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 },
266         [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
267
268         [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
269         [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
270         [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
271         [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY,
272                                            .len = NL80211_MAX_SUPP_RATES },
273         [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 },
274
275         [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED },
276         [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG },
277
278         [NL80211_ATTR_HT_CAPABILITY] = { .len = NL80211_HT_CAPABILITY_LEN },
279
280         [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
281         [NL80211_ATTR_IE] = { .type = NLA_BINARY,
282                               .len = IEEE80211_MAX_DATA_LEN },
283         [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
284         [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
285
286         [NL80211_ATTR_SSID] = { .type = NLA_BINARY,
287                                 .len = IEEE80211_MAX_SSID_LEN },
288         [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
289         [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
290         [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
291         [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
292         [NL80211_ATTR_USE_MFP] = { .type = NLA_U32 },
293         [NL80211_ATTR_STA_FLAGS2] = {
294                 .len = sizeof(struct nl80211_sta_flag_update),
295         },
296         [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
297         [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 },
298         [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG },
299         [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG },
300         [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 },
301         [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 },
302         [NL80211_ATTR_PID] = { .type = NLA_U32 },
303         [NL80211_ATTR_4ADDR] = { .type = NLA_U8 },
304         [NL80211_ATTR_PMKID] = { .type = NLA_BINARY,
305                                  .len = WLAN_PMKID_LEN },
306         [NL80211_ATTR_DURATION] = { .type = NLA_U32 },
307         [NL80211_ATTR_COOKIE] = { .type = NLA_U64 },
308         [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED },
309         [NL80211_ATTR_FRAME] = { .type = NLA_BINARY,
310                                  .len = IEEE80211_MAX_DATA_LEN },
311         [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, },
312         [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 },
313         [NL80211_ATTR_CQM] = { .type = NLA_NESTED, },
314         [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG },
315         [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 },
316         [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
317         [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
318         [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
319         [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 },
320         [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 },
321         [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 },
322         [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG },
323         [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
324         [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED },
325         [NL80211_ATTR_STA_PLINK_STATE] = { .type = NLA_U8 },
326         [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 },
327         [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED },
328         [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED },
329         [NL80211_ATTR_HIDDEN_SSID] = { .type = NLA_U32 },
330         [NL80211_ATTR_IE_PROBE_RESP] = { .type = NLA_BINARY,
331                                          .len = IEEE80211_MAX_DATA_LEN },
332         [NL80211_ATTR_IE_ASSOC_RESP] = { .type = NLA_BINARY,
333                                          .len = IEEE80211_MAX_DATA_LEN },
334         [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG },
335         [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED },
336         [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG },
337         [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 },
338         [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 },
339         [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 },
340         [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG },
341         [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG },
342         [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
343         [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
344                                       .len = IEEE80211_MAX_DATA_LEN },
345         [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 },
346         [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG },
347         [NL80211_ATTR_HT_CAPABILITY_MASK] = {
348                 .len = NL80211_HT_CAPABILITY_LEN
349         },
350         [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 },
351         [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 },
352         [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 },
353         [NL80211_ATTR_WDEV] = { .type = NLA_U64 },
354         [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 },
355         [NL80211_ATTR_SAE_DATA] = { .type = NLA_BINARY, },
356         [NL80211_ATTR_VHT_CAPABILITY] = { .len = NL80211_VHT_CAPABILITY_LEN },
357         [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
358         [NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 },
359         [NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 },
360         [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 },
361         [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
362         [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
363         [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, },
364         [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, },
365         [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG },
366         [NL80211_ATTR_VHT_CAPABILITY_MASK] = {
367                 .len = NL80211_VHT_CAPABILITY_LEN,
368         },
369         [NL80211_ATTR_MDID] = { .type = NLA_U16 },
370         [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
371                                   .len = IEEE80211_MAX_DATA_LEN },
372         [NL80211_ATTR_PEER_AID] = { .type = NLA_U16 },
373         [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 },
374         [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG },
375         [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
376         [NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_U16 },
377         [NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_U16 },
378         [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY },
379         [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY },
380         [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG },
381         [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 },
382         [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 },
383         [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 },
384         [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
385 };
386
387 /* policy for the key attributes */
388 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
389         [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
390         [NL80211_KEY_IDX] = { .type = NLA_U8 },
391         [NL80211_KEY_CIPHER] = { .type = NLA_U32 },
392         [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
393         [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG },
394         [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG },
395         [NL80211_KEY_TYPE] = { .type = NLA_U32 },
396         [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
397 };
398
399 /* policy for the key default flags */
400 static const struct nla_policy
401 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = {
402         [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG },
403         [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG },
404 };
405
406 /* policy for WoWLAN attributes */
407 static const struct nla_policy
408 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = {
409         [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG },
410         [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG },
411         [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG },
412         [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED },
413         [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG },
414         [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG },
415         [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG },
416         [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG },
417         [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED },
418 };
419
420 static const struct nla_policy
421 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = {
422         [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 },
423         [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 },
424         [NL80211_WOWLAN_TCP_DST_MAC] = { .len = ETH_ALEN },
425         [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 },
426         [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 },
427         [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = { .len = 1 },
428         [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = {
429                 .len = sizeof(struct nl80211_wowlan_tcp_data_seq)
430         },
431         [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = {
432                 .len = sizeof(struct nl80211_wowlan_tcp_data_token)
433         },
434         [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 },
435         [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = { .len = 1 },
436         [NL80211_WOWLAN_TCP_WAKE_MASK] = { .len = 1 },
437 };
438
439 /* policy for coalesce rule attributes */
440 static const struct nla_policy
441 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = {
442         [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 },
443         [NL80211_ATTR_COALESCE_RULE_CONDITION] = { .type = NLA_U32 },
444         [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED },
445 };
446
447 /* policy for GTK rekey offload attributes */
448 static const struct nla_policy
449 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
450         [NL80211_REKEY_DATA_KEK] = { .len = NL80211_KEK_LEN },
451         [NL80211_REKEY_DATA_KCK] = { .len = NL80211_KCK_LEN },
452         [NL80211_REKEY_DATA_REPLAY_CTR] = { .len = NL80211_REPLAY_CTR_LEN },
453 };
454
455 static const struct nla_policy
456 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = {
457         [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY,
458                                                  .len = IEEE80211_MAX_SSID_LEN },
459         [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 },
460 };
461
462 static int nl80211_prepare_wdev_dump(struct sk_buff *skb,
463                                      struct netlink_callback *cb,
464                                      struct cfg80211_registered_device **rdev,
465                                      struct wireless_dev **wdev)
466 {
467         int err;
468
469         rtnl_lock();
470
471         if (!cb->args[0]) {
472                 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
473                                   nl80211_fam.attrbuf, nl80211_fam.maxattr,
474                                   nl80211_policy);
475                 if (err)
476                         goto out_unlock;
477
478                 *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk),
479                                                    nl80211_fam.attrbuf);
480                 if (IS_ERR(*wdev)) {
481                         err = PTR_ERR(*wdev);
482                         goto out_unlock;
483                 }
484                 *rdev = wiphy_to_dev((*wdev)->wiphy);
485                 /* 0 is the first index - add 1 to parse only once */
486                 cb->args[0] = (*rdev)->wiphy_idx + 1;
487                 cb->args[1] = (*wdev)->identifier;
488         } else {
489                 /* subtract the 1 again here */
490                 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
491                 struct wireless_dev *tmp;
492
493                 if (!wiphy) {
494                         err = -ENODEV;
495                         goto out_unlock;
496                 }
497                 *rdev = wiphy_to_dev(wiphy);
498                 *wdev = NULL;
499
500                 list_for_each_entry(tmp, &(*rdev)->wdev_list, list) {
501                         if (tmp->identifier == cb->args[1]) {
502                                 *wdev = tmp;
503                                 break;
504                         }
505                 }
506
507                 if (!*wdev) {
508                         err = -ENODEV;
509                         goto out_unlock;
510                 }
511         }
512
513         return 0;
514  out_unlock:
515         rtnl_unlock();
516         return err;
517 }
518
519 static void nl80211_finish_wdev_dump(struct cfg80211_registered_device *rdev)
520 {
521         rtnl_unlock();
522 }
523
524 /* IE validation */
525 static bool is_valid_ie_attr(const struct nlattr *attr)
526 {
527         const u8 *pos;
528         int len;
529
530         if (!attr)
531                 return true;
532
533         pos = nla_data(attr);
534         len = nla_len(attr);
535
536         while (len) {
537                 u8 elemlen;
538
539                 if (len < 2)
540                         return false;
541                 len -= 2;
542
543                 elemlen = pos[1];
544                 if (elemlen > len)
545                         return false;
546
547                 len -= elemlen;
548                 pos += 2 + elemlen;
549         }
550
551         return true;
552 }
553
554 /* message building helper */
555 static inline void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
556                                    int flags, u8 cmd)
557 {
558         /* since there is no private header just add the generic one */
559         return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd);
560 }
561
562 static int nl80211_msg_put_channel(struct sk_buff *msg,
563                                    struct ieee80211_channel *chan,
564                                    bool large)
565 {
566         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ,
567                         chan->center_freq))
568                 goto nla_put_failure;
569
570         if ((chan->flags & IEEE80211_CHAN_DISABLED) &&
571             nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED))
572                 goto nla_put_failure;
573         if (chan->flags & IEEE80211_CHAN_NO_IR) {
574                 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR))
575                         goto nla_put_failure;
576                 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS))
577                         goto nla_put_failure;
578         }
579         if (chan->flags & IEEE80211_CHAN_RADAR) {
580                 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
581                         goto nla_put_failure;
582                 if (large) {
583                         u32 time;
584
585                         time = elapsed_jiffies_msecs(chan->dfs_state_entered);
586
587                         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE,
588                                         chan->dfs_state))
589                                 goto nla_put_failure;
590                         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME,
591                                         time))
592                                 goto nla_put_failure;
593                 }
594         }
595
596         if (large) {
597                 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
598                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
599                         goto nla_put_failure;
600                 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) &&
601                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS))
602                         goto nla_put_failure;
603                 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) &&
604                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ))
605                         goto nla_put_failure;
606                 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) &&
607                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ))
608                         goto nla_put_failure;
609         }
610
611         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
612                         DBM_TO_MBM(chan->max_power)))
613                 goto nla_put_failure;
614
615         return 0;
616
617  nla_put_failure:
618         return -ENOBUFS;
619 }
620
621 /* netlink command implementations */
622
623 struct key_parse {
624         struct key_params p;
625         int idx;
626         int type;
627         bool def, defmgmt;
628         bool def_uni, def_multi;
629 };
630
631 static int nl80211_parse_key_new(struct nlattr *key, struct key_parse *k)
632 {
633         struct nlattr *tb[NL80211_KEY_MAX + 1];
634         int err = nla_parse_nested(tb, NL80211_KEY_MAX, key,
635                                    nl80211_key_policy);
636         if (err)
637                 return err;
638
639         k->def = !!tb[NL80211_KEY_DEFAULT];
640         k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT];
641
642         if (k->def) {
643                 k->def_uni = true;
644                 k->def_multi = true;
645         }
646         if (k->defmgmt)
647                 k->def_multi = true;
648
649         if (tb[NL80211_KEY_IDX])
650                 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]);
651
652         if (tb[NL80211_KEY_DATA]) {
653                 k->p.key = nla_data(tb[NL80211_KEY_DATA]);
654                 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]);
655         }
656
657         if (tb[NL80211_KEY_SEQ]) {
658                 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]);
659                 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]);
660         }
661
662         if (tb[NL80211_KEY_CIPHER])
663                 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]);
664
665         if (tb[NL80211_KEY_TYPE]) {
666                 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]);
667                 if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
668                         return -EINVAL;
669         }
670
671         if (tb[NL80211_KEY_DEFAULT_TYPES]) {
672                 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
673                 err = nla_parse_nested(kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
674                                        tb[NL80211_KEY_DEFAULT_TYPES],
675                                        nl80211_key_default_policy);
676                 if (err)
677                         return err;
678
679                 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
680                 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
681         }
682
683         return 0;
684 }
685
686 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
687 {
688         if (info->attrs[NL80211_ATTR_KEY_DATA]) {
689                 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
690                 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
691         }
692
693         if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
694                 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
695                 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
696         }
697
698         if (info->attrs[NL80211_ATTR_KEY_IDX])
699                 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
700
701         if (info->attrs[NL80211_ATTR_KEY_CIPHER])
702                 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
703
704         k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
705         k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
706
707         if (k->def) {
708                 k->def_uni = true;
709                 k->def_multi = true;
710         }
711         if (k->defmgmt)
712                 k->def_multi = true;
713
714         if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
715                 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
716                 if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
717                         return -EINVAL;
718         }
719
720         if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
721                 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
722                 int err = nla_parse_nested(
723                                 kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
724                                 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
725                                 nl80211_key_default_policy);
726                 if (err)
727                         return err;
728
729                 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
730                 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
731         }
732
733         return 0;
734 }
735
736 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
737 {
738         int err;
739
740         memset(k, 0, sizeof(*k));
741         k->idx = -1;
742         k->type = -1;
743
744         if (info->attrs[NL80211_ATTR_KEY])
745                 err = nl80211_parse_key_new(info->attrs[NL80211_ATTR_KEY], k);
746         else
747                 err = nl80211_parse_key_old(info, k);
748
749         if (err)
750                 return err;
751
752         if (k->def && k->defmgmt)
753                 return -EINVAL;
754
755         if (k->defmgmt) {
756                 if (k->def_uni || !k->def_multi)
757                         return -EINVAL;
758         }
759
760         if (k->idx != -1) {
761                 if (k->defmgmt) {
762                         if (k->idx < 4 || k->idx > 5)
763                                 return -EINVAL;
764                 } else if (k->def) {
765                         if (k->idx < 0 || k->idx > 3)
766                                 return -EINVAL;
767                 } else {
768                         if (k->idx < 0 || k->idx > 5)
769                                 return -EINVAL;
770                 }
771         }
772
773         return 0;
774 }
775
776 static struct cfg80211_cached_keys *
777 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
778                        struct nlattr *keys, bool *no_ht)
779 {
780         struct key_parse parse;
781         struct nlattr *key;
782         struct cfg80211_cached_keys *result;
783         int rem, err, def = 0;
784
785         result = kzalloc(sizeof(*result), GFP_KERNEL);
786         if (!result)
787                 return ERR_PTR(-ENOMEM);
788
789         result->def = -1;
790         result->defmgmt = -1;
791
792         nla_for_each_nested(key, keys, rem) {
793                 memset(&parse, 0, sizeof(parse));
794                 parse.idx = -1;
795
796                 err = nl80211_parse_key_new(key, &parse);
797                 if (err)
798                         goto error;
799                 err = -EINVAL;
800                 if (!parse.p.key)
801                         goto error;
802                 if (parse.idx < 0 || parse.idx > 4)
803                         goto error;
804                 if (parse.def) {
805                         if (def)
806                                 goto error;
807                         def = 1;
808                         result->def = parse.idx;
809                         if (!parse.def_uni || !parse.def_multi)
810                                 goto error;
811                 } else if (parse.defmgmt)
812                         goto error;
813                 err = cfg80211_validate_key_settings(rdev, &parse.p,
814                                                      parse.idx, false, NULL);
815                 if (err)
816                         goto error;
817                 result->params[parse.idx].cipher = parse.p.cipher;
818                 result->params[parse.idx].key_len = parse.p.key_len;
819                 result->params[parse.idx].key = result->data[parse.idx];
820                 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len);
821
822                 if (parse.p.cipher == WLAN_CIPHER_SUITE_WEP40 ||
823                     parse.p.cipher == WLAN_CIPHER_SUITE_WEP104) {
824                         if (no_ht)
825                                 *no_ht = true;
826                 }
827         }
828
829         return result;
830  error:
831         kfree(result);
832         return ERR_PTR(err);
833 }
834
835 static int nl80211_key_allowed(struct wireless_dev *wdev)
836 {
837         ASSERT_WDEV_LOCK(wdev);
838
839         switch (wdev->iftype) {
840         case NL80211_IFTYPE_AP:
841         case NL80211_IFTYPE_AP_VLAN:
842         case NL80211_IFTYPE_P2P_GO:
843         case NL80211_IFTYPE_MESH_POINT:
844                 break;
845         case NL80211_IFTYPE_ADHOC:
846         case NL80211_IFTYPE_STATION:
847         case NL80211_IFTYPE_P2P_CLIENT:
848                 if (!wdev->current_bss)
849                         return -ENOLINK;
850                 break;
851         default:
852                 return -EINVAL;
853         }
854
855         return 0;
856 }
857
858 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
859 {
860         struct nlattr *nl_modes = nla_nest_start(msg, attr);
861         int i;
862
863         if (!nl_modes)
864                 goto nla_put_failure;
865
866         i = 0;
867         while (ifmodes) {
868                 if ((ifmodes & 1) && nla_put_flag(msg, i))
869                         goto nla_put_failure;
870                 ifmodes >>= 1;
871                 i++;
872         }
873
874         nla_nest_end(msg, nl_modes);
875         return 0;
876
877 nla_put_failure:
878         return -ENOBUFS;
879 }
880
881 static int nl80211_put_iface_combinations(struct wiphy *wiphy,
882                                           struct sk_buff *msg,
883                                           bool large)
884 {
885         struct nlattr *nl_combis;
886         int i, j;
887
888         nl_combis = nla_nest_start(msg,
889                                 NL80211_ATTR_INTERFACE_COMBINATIONS);
890         if (!nl_combis)
891                 goto nla_put_failure;
892
893         for (i = 0; i < wiphy->n_iface_combinations; i++) {
894                 const struct ieee80211_iface_combination *c;
895                 struct nlattr *nl_combi, *nl_limits;
896
897                 c = &wiphy->iface_combinations[i];
898
899                 nl_combi = nla_nest_start(msg, i + 1);
900                 if (!nl_combi)
901                         goto nla_put_failure;
902
903                 nl_limits = nla_nest_start(msg, NL80211_IFACE_COMB_LIMITS);
904                 if (!nl_limits)
905                         goto nla_put_failure;
906
907                 for (j = 0; j < c->n_limits; j++) {
908                         struct nlattr *nl_limit;
909
910                         nl_limit = nla_nest_start(msg, j + 1);
911                         if (!nl_limit)
912                                 goto nla_put_failure;
913                         if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX,
914                                         c->limits[j].max))
915                                 goto nla_put_failure;
916                         if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
917                                                 c->limits[j].types))
918                                 goto nla_put_failure;
919                         nla_nest_end(msg, nl_limit);
920                 }
921
922                 nla_nest_end(msg, nl_limits);
923
924                 if (c->beacon_int_infra_match &&
925                     nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
926                         goto nla_put_failure;
927                 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
928                                 c->num_different_channels) ||
929                     nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
930                                 c->max_interfaces))
931                         goto nla_put_failure;
932                 if (large &&
933                     nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
934                                 c->radar_detect_widths))
935                         goto nla_put_failure;
936
937                 nla_nest_end(msg, nl_combi);
938         }
939
940         nla_nest_end(msg, nl_combis);
941
942         return 0;
943 nla_put_failure:
944         return -ENOBUFS;
945 }
946
947 #ifdef CONFIG_PM
948 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev,
949                                         struct sk_buff *msg)
950 {
951         const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp;
952         struct nlattr *nl_tcp;
953
954         if (!tcp)
955                 return 0;
956
957         nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
958         if (!nl_tcp)
959                 return -ENOBUFS;
960
961         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
962                         tcp->data_payload_max))
963                 return -ENOBUFS;
964
965         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
966                         tcp->data_payload_max))
967                 return -ENOBUFS;
968
969         if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ))
970                 return -ENOBUFS;
971
972         if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
973                                 sizeof(*tcp->tok), tcp->tok))
974                 return -ENOBUFS;
975
976         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
977                         tcp->data_interval_max))
978                 return -ENOBUFS;
979
980         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
981                         tcp->wake_payload_max))
982                 return -ENOBUFS;
983
984         nla_nest_end(msg, nl_tcp);
985         return 0;
986 }
987
988 static int nl80211_send_wowlan(struct sk_buff *msg,
989                                struct cfg80211_registered_device *dev,
990                                bool large)
991 {
992         struct nlattr *nl_wowlan;
993
994         if (!dev->wiphy.wowlan)
995                 return 0;
996
997         nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED);
998         if (!nl_wowlan)
999                 return -ENOBUFS;
1000
1001         if (((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) &&
1002              nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
1003             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) &&
1004              nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
1005             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) &&
1006              nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
1007             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) &&
1008              nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) ||
1009             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
1010              nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
1011             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) &&
1012              nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
1013             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) &&
1014              nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
1015             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) &&
1016              nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
1017                 return -ENOBUFS;
1018
1019         if (dev->wiphy.wowlan->n_patterns) {
1020                 struct nl80211_pattern_support pat = {
1021                         .max_patterns = dev->wiphy.wowlan->n_patterns,
1022                         .min_pattern_len = dev->wiphy.wowlan->pattern_min_len,
1023                         .max_pattern_len = dev->wiphy.wowlan->pattern_max_len,
1024                         .max_pkt_offset = dev->wiphy.wowlan->max_pkt_offset,
1025                 };
1026
1027                 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
1028                             sizeof(pat), &pat))
1029                         return -ENOBUFS;
1030         }
1031
1032         if (large && nl80211_send_wowlan_tcp_caps(dev, msg))
1033                 return -ENOBUFS;
1034
1035         nla_nest_end(msg, nl_wowlan);
1036
1037         return 0;
1038 }
1039 #endif
1040
1041 static int nl80211_send_coalesce(struct sk_buff *msg,
1042                                  struct cfg80211_registered_device *dev)
1043 {
1044         struct nl80211_coalesce_rule_support rule;
1045
1046         if (!dev->wiphy.coalesce)
1047                 return 0;
1048
1049         rule.max_rules = dev->wiphy.coalesce->n_rules;
1050         rule.max_delay = dev->wiphy.coalesce->max_delay;
1051         rule.pat.max_patterns = dev->wiphy.coalesce->n_patterns;
1052         rule.pat.min_pattern_len = dev->wiphy.coalesce->pattern_min_len;
1053         rule.pat.max_pattern_len = dev->wiphy.coalesce->pattern_max_len;
1054         rule.pat.max_pkt_offset = dev->wiphy.coalesce->max_pkt_offset;
1055
1056         if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule))
1057                 return -ENOBUFS;
1058
1059         return 0;
1060 }
1061
1062 static int nl80211_send_band_rateinfo(struct sk_buff *msg,
1063                                       struct ieee80211_supported_band *sband)
1064 {
1065         struct nlattr *nl_rates, *nl_rate;
1066         struct ieee80211_rate *rate;
1067         int i;
1068
1069         /* add HT info */
1070         if (sband->ht_cap.ht_supported &&
1071             (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET,
1072                      sizeof(sband->ht_cap.mcs),
1073                      &sband->ht_cap.mcs) ||
1074              nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA,
1075                          sband->ht_cap.cap) ||
1076              nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
1077                         sband->ht_cap.ampdu_factor) ||
1078              nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
1079                         sband->ht_cap.ampdu_density)))
1080                 return -ENOBUFS;
1081
1082         /* add VHT info */
1083         if (sband->vht_cap.vht_supported &&
1084             (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET,
1085                      sizeof(sband->vht_cap.vht_mcs),
1086                      &sband->vht_cap.vht_mcs) ||
1087              nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA,
1088                          sband->vht_cap.cap)))
1089                 return -ENOBUFS;
1090
1091         /* add bitrates */
1092         nl_rates = nla_nest_start(msg, NL80211_BAND_ATTR_RATES);
1093         if (!nl_rates)
1094                 return -ENOBUFS;
1095
1096         for (i = 0; i < sband->n_bitrates; i++) {
1097                 nl_rate = nla_nest_start(msg, i);
1098                 if (!nl_rate)
1099                         return -ENOBUFS;
1100
1101                 rate = &sband->bitrates[i];
1102                 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE,
1103                                 rate->bitrate))
1104                         return -ENOBUFS;
1105                 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) &&
1106                     nla_put_flag(msg,
1107                                  NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE))
1108                         return -ENOBUFS;
1109
1110                 nla_nest_end(msg, nl_rate);
1111         }
1112
1113         nla_nest_end(msg, nl_rates);
1114
1115         return 0;
1116 }
1117
1118 static int
1119 nl80211_send_mgmt_stypes(struct sk_buff *msg,
1120                          const struct ieee80211_txrx_stypes *mgmt_stypes)
1121 {
1122         u16 stypes;
1123         struct nlattr *nl_ftypes, *nl_ifs;
1124         enum nl80211_iftype ift;
1125         int i;
1126
1127         if (!mgmt_stypes)
1128                 return 0;
1129
1130         nl_ifs = nla_nest_start(msg, NL80211_ATTR_TX_FRAME_TYPES);
1131         if (!nl_ifs)
1132                 return -ENOBUFS;
1133
1134         for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1135                 nl_ftypes = nla_nest_start(msg, ift);
1136                 if (!nl_ftypes)
1137                         return -ENOBUFS;
1138                 i = 0;
1139                 stypes = mgmt_stypes[ift].tx;
1140                 while (stypes) {
1141                         if ((stypes & 1) &&
1142                             nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1143                                         (i << 4) | IEEE80211_FTYPE_MGMT))
1144                                 return -ENOBUFS;
1145                         stypes >>= 1;
1146                         i++;
1147                 }
1148                 nla_nest_end(msg, nl_ftypes);
1149         }
1150
1151         nla_nest_end(msg, nl_ifs);
1152
1153         nl_ifs = nla_nest_start(msg, NL80211_ATTR_RX_FRAME_TYPES);
1154         if (!nl_ifs)
1155                 return -ENOBUFS;
1156
1157         for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1158                 nl_ftypes = nla_nest_start(msg, ift);
1159                 if (!nl_ftypes)
1160                         return -ENOBUFS;
1161                 i = 0;
1162                 stypes = mgmt_stypes[ift].rx;
1163                 while (stypes) {
1164                         if ((stypes & 1) &&
1165                             nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1166                                         (i << 4) | IEEE80211_FTYPE_MGMT))
1167                                 return -ENOBUFS;
1168                         stypes >>= 1;
1169                         i++;
1170                 }
1171                 nla_nest_end(msg, nl_ftypes);
1172         }
1173         nla_nest_end(msg, nl_ifs);
1174
1175         return 0;
1176 }
1177
1178 struct nl80211_dump_wiphy_state {
1179         s64 filter_wiphy;
1180         long start;
1181         long split_start, band_start, chan_start;
1182         bool split;
1183 };
1184
1185 static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
1186                               struct sk_buff *msg, u32 portid, u32 seq,
1187                               int flags, struct nl80211_dump_wiphy_state *state)
1188 {
1189         void *hdr;
1190         struct nlattr *nl_bands, *nl_band;
1191         struct nlattr *nl_freqs, *nl_freq;
1192         struct nlattr *nl_cmds;
1193         enum ieee80211_band band;
1194         struct ieee80211_channel *chan;
1195         int i;
1196         const struct ieee80211_txrx_stypes *mgmt_stypes =
1197                                 dev->wiphy.mgmt_stypes;
1198         u32 features;
1199
1200         hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_WIPHY);
1201         if (!hdr)
1202                 return -ENOBUFS;
1203
1204         if (WARN_ON(!state))
1205                 return -EINVAL;
1206
1207         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, dev->wiphy_idx) ||
1208             nla_put_string(msg, NL80211_ATTR_WIPHY_NAME,
1209                            wiphy_name(&dev->wiphy)) ||
1210             nla_put_u32(msg, NL80211_ATTR_GENERATION,
1211                         cfg80211_rdev_list_generation))
1212                 goto nla_put_failure;
1213
1214         switch (state->split_start) {
1215         case 0:
1216                 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
1217                                dev->wiphy.retry_short) ||
1218                     nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
1219                                dev->wiphy.retry_long) ||
1220                     nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
1221                                 dev->wiphy.frag_threshold) ||
1222                     nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
1223                                 dev->wiphy.rts_threshold) ||
1224                     nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS,
1225                                dev->wiphy.coverage_class) ||
1226                     nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
1227                                dev->wiphy.max_scan_ssids) ||
1228                     nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
1229                                dev->wiphy.max_sched_scan_ssids) ||
1230                     nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
1231                                 dev->wiphy.max_scan_ie_len) ||
1232                     nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
1233                                 dev->wiphy.max_sched_scan_ie_len) ||
1234                     nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS,
1235                                dev->wiphy.max_match_sets))
1236                         goto nla_put_failure;
1237
1238                 if ((dev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) &&
1239                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN))
1240                         goto nla_put_failure;
1241                 if ((dev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
1242                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH))
1243                         goto nla_put_failure;
1244                 if ((dev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) &&
1245                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD))
1246                         goto nla_put_failure;
1247                 if ((dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) &&
1248                     nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT))
1249                         goto nla_put_failure;
1250                 if ((dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) &&
1251                     nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT))
1252                         goto nla_put_failure;
1253                 if ((dev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) &&
1254                     nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP))
1255                         goto nla_put_failure;
1256                 state->split_start++;
1257                 if (state->split)
1258                         break;
1259         case 1:
1260                 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES,
1261                             sizeof(u32) * dev->wiphy.n_cipher_suites,
1262                             dev->wiphy.cipher_suites))
1263                         goto nla_put_failure;
1264
1265                 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS,
1266                                dev->wiphy.max_num_pmkids))
1267                         goto nla_put_failure;
1268
1269                 if ((dev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
1270                     nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE))
1271                         goto nla_put_failure;
1272
1273                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
1274                                 dev->wiphy.available_antennas_tx) ||
1275                     nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
1276                                 dev->wiphy.available_antennas_rx))
1277                         goto nla_put_failure;
1278
1279                 if ((dev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) &&
1280                     nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD,
1281                                 dev->wiphy.probe_resp_offload))
1282                         goto nla_put_failure;
1283
1284                 if ((dev->wiphy.available_antennas_tx ||
1285                      dev->wiphy.available_antennas_rx) &&
1286                     dev->ops->get_antenna) {
1287                         u32 tx_ant = 0, rx_ant = 0;
1288                         int res;
1289                         res = rdev_get_antenna(dev, &tx_ant, &rx_ant);
1290                         if (!res) {
1291                                 if (nla_put_u32(msg,
1292                                                 NL80211_ATTR_WIPHY_ANTENNA_TX,
1293                                                 tx_ant) ||
1294                                     nla_put_u32(msg,
1295                                                 NL80211_ATTR_WIPHY_ANTENNA_RX,
1296                                                 rx_ant))
1297                                         goto nla_put_failure;
1298                         }
1299                 }
1300
1301                 state->split_start++;
1302                 if (state->split)
1303                         break;
1304         case 2:
1305                 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
1306                                         dev->wiphy.interface_modes))
1307                                 goto nla_put_failure;
1308                 state->split_start++;
1309                 if (state->split)
1310                         break;
1311         case 3:
1312                 nl_bands = nla_nest_start(msg, NL80211_ATTR_WIPHY_BANDS);
1313                 if (!nl_bands)
1314                         goto nla_put_failure;
1315
1316                 for (band = state->band_start;
1317                      band < IEEE80211_NUM_BANDS; band++) {
1318                         struct ieee80211_supported_band *sband;
1319
1320                         sband = dev->wiphy.bands[band];
1321
1322                         if (!sband)
1323                                 continue;
1324
1325                         nl_band = nla_nest_start(msg, band);
1326                         if (!nl_band)
1327                                 goto nla_put_failure;
1328
1329                         switch (state->chan_start) {
1330                         case 0:
1331                                 if (nl80211_send_band_rateinfo(msg, sband))
1332                                         goto nla_put_failure;
1333                                 state->chan_start++;
1334                                 if (state->split)
1335                                         break;
1336                         default:
1337                                 /* add frequencies */
1338                                 nl_freqs = nla_nest_start(
1339                                         msg, NL80211_BAND_ATTR_FREQS);
1340                                 if (!nl_freqs)
1341                                         goto nla_put_failure;
1342
1343                                 for (i = state->chan_start - 1;
1344                                      i < sband->n_channels;
1345                                      i++) {
1346                                         nl_freq = nla_nest_start(msg, i);
1347                                         if (!nl_freq)
1348                                                 goto nla_put_failure;
1349
1350                                         chan = &sband->channels[i];
1351
1352                                         if (nl80211_msg_put_channel(
1353                                                         msg, chan,
1354                                                         state->split))
1355                                                 goto nla_put_failure;
1356
1357                                         nla_nest_end(msg, nl_freq);
1358                                         if (state->split)
1359                                                 break;
1360                                 }
1361                                 if (i < sband->n_channels)
1362                                         state->chan_start = i + 2;
1363                                 else
1364                                         state->chan_start = 0;
1365                                 nla_nest_end(msg, nl_freqs);
1366                         }
1367
1368                         nla_nest_end(msg, nl_band);
1369
1370                         if (state->split) {
1371                                 /* start again here */
1372                                 if (state->chan_start)
1373                                         band--;
1374                                 break;
1375                         }
1376                 }
1377                 nla_nest_end(msg, nl_bands);
1378
1379                 if (band < IEEE80211_NUM_BANDS)
1380                         state->band_start = band + 1;
1381                 else
1382                         state->band_start = 0;
1383
1384                 /* if bands & channels are done, continue outside */
1385                 if (state->band_start == 0 && state->chan_start == 0)
1386                         state->split_start++;
1387                 if (state->split)
1388                         break;
1389         case 4:
1390                 nl_cmds = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_COMMANDS);
1391                 if (!nl_cmds)
1392                         goto nla_put_failure;
1393
1394                 i = 0;
1395 #define CMD(op, n)                                                      \
1396                  do {                                                   \
1397                         if (dev->ops->op) {                             \
1398                                 i++;                                    \
1399                                 if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \
1400                                         goto nla_put_failure;           \
1401                         }                                               \
1402                 } while (0)
1403
1404                 CMD(add_virtual_intf, NEW_INTERFACE);
1405                 CMD(change_virtual_intf, SET_INTERFACE);
1406                 CMD(add_key, NEW_KEY);
1407                 CMD(start_ap, START_AP);
1408                 CMD(add_station, NEW_STATION);
1409                 CMD(add_mpath, NEW_MPATH);
1410                 CMD(update_mesh_config, SET_MESH_CONFIG);
1411                 CMD(change_bss, SET_BSS);
1412                 CMD(auth, AUTHENTICATE);
1413                 CMD(assoc, ASSOCIATE);
1414                 CMD(deauth, DEAUTHENTICATE);
1415                 CMD(disassoc, DISASSOCIATE);
1416                 CMD(join_ibss, JOIN_IBSS);
1417                 CMD(join_mesh, JOIN_MESH);
1418                 CMD(set_pmksa, SET_PMKSA);
1419                 CMD(del_pmksa, DEL_PMKSA);
1420                 CMD(flush_pmksa, FLUSH_PMKSA);
1421                 if (dev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)
1422                         CMD(remain_on_channel, REMAIN_ON_CHANNEL);
1423                 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
1424                 CMD(mgmt_tx, FRAME);
1425                 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL);
1426                 if (dev->wiphy.flags & WIPHY_FLAG_NETNS_OK) {
1427                         i++;
1428                         if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS))
1429                                 goto nla_put_failure;
1430                 }
1431                 if (dev->ops->set_monitor_channel || dev->ops->start_ap ||
1432                     dev->ops->join_mesh) {
1433                         i++;
1434                         if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL))
1435                                 goto nla_put_failure;
1436                 }
1437                 CMD(set_wds_peer, SET_WDS_PEER);
1438                 if (dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) {
1439                         CMD(tdls_mgmt, TDLS_MGMT);
1440                         CMD(tdls_oper, TDLS_OPER);
1441                 }
1442                 if (dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN)
1443                         CMD(sched_scan_start, START_SCHED_SCAN);
1444                 CMD(probe_client, PROBE_CLIENT);
1445                 CMD(set_noack_map, SET_NOACK_MAP);
1446                 if (dev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) {
1447                         i++;
1448                         if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS))
1449                                 goto nla_put_failure;
1450                 }
1451                 CMD(start_p2p_device, START_P2P_DEVICE);
1452                 CMD(set_mcast_rate, SET_MCAST_RATE);
1453                 if (state->split) {
1454                         CMD(crit_proto_start, CRIT_PROTOCOL_START);
1455                         CMD(crit_proto_stop, CRIT_PROTOCOL_STOP);
1456                         if (dev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)
1457                                 CMD(channel_switch, CHANNEL_SWITCH);
1458                 }
1459
1460 #ifdef CONFIG_NL80211_TESTMODE
1461                 CMD(testmode_cmd, TESTMODE);
1462 #endif
1463
1464 #undef CMD
1465
1466                 if (dev->ops->connect || dev->ops->auth) {
1467                         i++;
1468                         if (nla_put_u32(msg, i, NL80211_CMD_CONNECT))
1469                                 goto nla_put_failure;
1470                 }
1471
1472                 if (dev->ops->disconnect || dev->ops->deauth) {
1473                         i++;
1474                         if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT))
1475                                 goto nla_put_failure;
1476                 }
1477
1478                 nla_nest_end(msg, nl_cmds);
1479                 state->split_start++;
1480                 if (state->split)
1481                         break;
1482         case 5:
1483                 if (dev->ops->remain_on_channel &&
1484                     (dev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) &&
1485                     nla_put_u32(msg,
1486                                 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
1487                                 dev->wiphy.max_remain_on_channel_duration))
1488                         goto nla_put_failure;
1489
1490                 if ((dev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) &&
1491                     nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK))
1492                         goto nla_put_failure;
1493
1494                 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes))
1495                         goto nla_put_failure;
1496                 state->split_start++;
1497                 if (state->split)
1498                         break;
1499         case 6:
1500 #ifdef CONFIG_PM
1501                 if (nl80211_send_wowlan(msg, dev, state->split))
1502                         goto nla_put_failure;
1503                 state->split_start++;
1504                 if (state->split)
1505                         break;
1506 #else
1507                 state->split_start++;
1508 #endif
1509         case 7:
1510                 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
1511                                         dev->wiphy.software_iftypes))
1512                         goto nla_put_failure;
1513
1514                 if (nl80211_put_iface_combinations(&dev->wiphy, msg,
1515                                                    state->split))
1516                         goto nla_put_failure;
1517
1518                 state->split_start++;
1519                 if (state->split)
1520                         break;
1521         case 8:
1522                 if ((dev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) &&
1523                     nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME,
1524                                 dev->wiphy.ap_sme_capa))
1525                         goto nla_put_failure;
1526
1527                 features = dev->wiphy.features;
1528                 /*
1529                  * We can only add the per-channel limit information if the
1530                  * dump is split, otherwise it makes it too big. Therefore
1531                  * only advertise it in that case.
1532                  */
1533                 if (state->split)
1534                         features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS;
1535                 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features))
1536                         goto nla_put_failure;
1537
1538                 if (dev->wiphy.ht_capa_mod_mask &&
1539                     nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK,
1540                             sizeof(*dev->wiphy.ht_capa_mod_mask),
1541                             dev->wiphy.ht_capa_mod_mask))
1542                         goto nla_put_failure;
1543
1544                 if (dev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME &&
1545                     dev->wiphy.max_acl_mac_addrs &&
1546                     nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX,
1547                                 dev->wiphy.max_acl_mac_addrs))
1548                         goto nla_put_failure;
1549
1550                 /*
1551                  * Any information below this point is only available to
1552                  * applications that can deal with it being split. This
1553                  * helps ensure that newly added capabilities don't break
1554                  * older tools by overrunning their buffers.
1555                  *
1556                  * We still increment split_start so that in the split
1557                  * case we'll continue with more data in the next round,
1558                  * but break unconditionally so unsplit data stops here.
1559                  */
1560                 state->split_start++;
1561                 break;
1562         case 9:
1563                 if (dev->wiphy.extended_capabilities &&
1564                     (nla_put(msg, NL80211_ATTR_EXT_CAPA,
1565                              dev->wiphy.extended_capabilities_len,
1566                              dev->wiphy.extended_capabilities) ||
1567                      nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
1568                              dev->wiphy.extended_capabilities_len,
1569                              dev->wiphy.extended_capabilities_mask)))
1570                         goto nla_put_failure;
1571
1572                 if (dev->wiphy.vht_capa_mod_mask &&
1573                     nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK,
1574                             sizeof(*dev->wiphy.vht_capa_mod_mask),
1575                             dev->wiphy.vht_capa_mod_mask))
1576                         goto nla_put_failure;
1577
1578                 state->split_start++;
1579                 break;
1580         case 10:
1581                 if (nl80211_send_coalesce(msg, dev))
1582                         goto nla_put_failure;
1583
1584                 if ((dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) &&
1585                     (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) ||
1586                      nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ)))
1587                         goto nla_put_failure;
1588                 state->split_start++;
1589                 break;
1590         case 11:
1591                 if (dev->wiphy.n_vendor_commands) {
1592                         const struct nl80211_vendor_cmd_info *info;
1593                         struct nlattr *nested;
1594
1595                         nested = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA);
1596                         if (!nested)
1597                                 goto nla_put_failure;
1598
1599                         for (i = 0; i < dev->wiphy.n_vendor_commands; i++) {
1600                                 info = &dev->wiphy.vendor_commands[i].info;
1601                                 if (nla_put(msg, i + 1, sizeof(*info), info))
1602                                         goto nla_put_failure;
1603                         }
1604                         nla_nest_end(msg, nested);
1605                 }
1606
1607                 if (dev->wiphy.n_vendor_events) {
1608                         const struct nl80211_vendor_cmd_info *info;
1609                         struct nlattr *nested;
1610
1611                         nested = nla_nest_start(msg,
1612                                                 NL80211_ATTR_VENDOR_EVENTS);
1613                         if (!nested)
1614                                 goto nla_put_failure;
1615
1616                         for (i = 0; i < dev->wiphy.n_vendor_events; i++) {
1617                                 info = &dev->wiphy.vendor_events[i];
1618                                 if (nla_put(msg, i + 1, sizeof(*info), info))
1619                                         goto nla_put_failure;
1620                         }
1621                         nla_nest_end(msg, nested);
1622                 }
1623
1624                 /* done */
1625                 state->split_start = 0;
1626                 break;
1627         }
1628         return genlmsg_end(msg, hdr);
1629
1630  nla_put_failure:
1631         genlmsg_cancel(msg, hdr);
1632         return -EMSGSIZE;
1633 }
1634
1635 static int nl80211_dump_wiphy_parse(struct sk_buff *skb,
1636                                     struct netlink_callback *cb,
1637                                     struct nl80211_dump_wiphy_state *state)
1638 {
1639         struct nlattr **tb = nl80211_fam.attrbuf;
1640         int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
1641                               tb, nl80211_fam.maxattr, nl80211_policy);
1642         /* ignore parse errors for backward compatibility */
1643         if (ret)
1644                 return 0;
1645
1646         state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP];
1647         if (tb[NL80211_ATTR_WIPHY])
1648                 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
1649         if (tb[NL80211_ATTR_WDEV])
1650                 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32;
1651         if (tb[NL80211_ATTR_IFINDEX]) {
1652                 struct net_device *netdev;
1653                 struct cfg80211_registered_device *rdev;
1654                 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
1655
1656                 netdev = dev_get_by_index(sock_net(skb->sk), ifidx);
1657                 if (!netdev)
1658                         return -ENODEV;
1659                 if (netdev->ieee80211_ptr) {
1660                         rdev = wiphy_to_dev(
1661                                 netdev->ieee80211_ptr->wiphy);
1662                         state->filter_wiphy = rdev->wiphy_idx;
1663                 }
1664                 dev_put(netdev);
1665         }
1666
1667         return 0;
1668 }
1669
1670 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
1671 {
1672         int idx = 0, ret;
1673         struct nl80211_dump_wiphy_state *state = (void *)cb->args[0];
1674         struct cfg80211_registered_device *dev;
1675
1676         rtnl_lock();
1677         if (!state) {
1678                 state = kzalloc(sizeof(*state), GFP_KERNEL);
1679                 if (!state) {
1680                         rtnl_unlock();
1681                         return -ENOMEM;
1682                 }
1683                 state->filter_wiphy = -1;
1684                 ret = nl80211_dump_wiphy_parse(skb, cb, state);
1685                 if (ret) {
1686                         kfree(state);
1687                         rtnl_unlock();
1688                         return ret;
1689                 }
1690                 cb->args[0] = (long)state;
1691         }
1692
1693         list_for_each_entry(dev, &cfg80211_rdev_list, list) {
1694                 if (!net_eq(wiphy_net(&dev->wiphy), sock_net(skb->sk)))
1695                         continue;
1696                 if (++idx <= state->start)
1697                         continue;
1698                 if (state->filter_wiphy != -1 &&
1699                     state->filter_wiphy != dev->wiphy_idx)
1700                         continue;
1701                 /* attempt to fit multiple wiphy data chunks into the skb */
1702                 do {
1703                         ret = nl80211_send_wiphy(dev, skb,
1704                                                  NETLINK_CB(cb->skb).portid,
1705                                                  cb->nlh->nlmsg_seq,
1706                                                  NLM_F_MULTI, state);
1707                         if (ret < 0) {
1708                                 /*
1709                                  * If sending the wiphy data didn't fit (ENOBUFS
1710                                  * or EMSGSIZE returned), this SKB is still
1711                                  * empty (so it's not too big because another
1712                                  * wiphy dataset is already in the skb) and
1713                                  * we've not tried to adjust the dump allocation
1714                                  * yet ... then adjust the alloc size to be
1715                                  * bigger, and return 1 but with the empty skb.
1716                                  * This results in an empty message being RX'ed
1717                                  * in userspace, but that is ignored.
1718                                  *
1719                                  * We can then retry with the larger buffer.
1720                                  */
1721                                 if ((ret == -ENOBUFS || ret == -EMSGSIZE) &&
1722                                     !skb->len &&
1723                                     cb->min_dump_alloc < 4096) {
1724                                         cb->min_dump_alloc = 4096;
1725                                         rtnl_unlock();
1726                                         return 1;
1727                                 }
1728                                 idx--;
1729                                 break;
1730                         }
1731                 } while (state->split_start > 0);
1732                 break;
1733         }
1734         rtnl_unlock();
1735
1736         state->start = idx;
1737
1738         return skb->len;
1739 }
1740
1741 static int nl80211_dump_wiphy_done(struct netlink_callback *cb)
1742 {
1743         kfree((void *)cb->args[0]);
1744         return 0;
1745 }
1746
1747 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
1748 {
1749         struct sk_buff *msg;
1750         struct cfg80211_registered_device *dev = info->user_ptr[0];
1751         struct nl80211_dump_wiphy_state state = {};
1752
1753         msg = nlmsg_new(4096, GFP_KERNEL);
1754         if (!msg)
1755                 return -ENOMEM;
1756
1757         if (nl80211_send_wiphy(dev, msg, info->snd_portid, info->snd_seq, 0,
1758                                &state) < 0) {
1759                 nlmsg_free(msg);
1760                 return -ENOBUFS;
1761         }
1762
1763         return genlmsg_reply(msg, info);
1764 }
1765
1766 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
1767         [NL80211_TXQ_ATTR_QUEUE]                = { .type = NLA_U8 },
1768         [NL80211_TXQ_ATTR_TXOP]                 = { .type = NLA_U16 },
1769         [NL80211_TXQ_ATTR_CWMIN]                = { .type = NLA_U16 },
1770         [NL80211_TXQ_ATTR_CWMAX]                = { .type = NLA_U16 },
1771         [NL80211_TXQ_ATTR_AIFS]                 = { .type = NLA_U8 },
1772 };
1773
1774 static int parse_txq_params(struct nlattr *tb[],
1775                             struct ieee80211_txq_params *txq_params)
1776 {
1777         if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] ||
1778             !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
1779             !tb[NL80211_TXQ_ATTR_AIFS])
1780                 return -EINVAL;
1781
1782         txq_params->ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]);
1783         txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
1784         txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
1785         txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
1786         txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
1787
1788         if (txq_params->ac >= NL80211_NUM_ACS)
1789                 return -EINVAL;
1790
1791         return 0;
1792 }
1793
1794 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
1795 {
1796         /*
1797          * You can only set the channel explicitly for WDS interfaces,
1798          * all others have their channel managed via their respective
1799          * "establish a connection" command (connect, join, ...)
1800          *
1801          * For AP/GO and mesh mode, the channel can be set with the
1802          * channel userspace API, but is only stored and passed to the
1803          * low-level driver when the AP starts or the mesh is joined.
1804          * This is for backward compatibility, userspace can also give
1805          * the channel in the start-ap or join-mesh commands instead.
1806          *
1807          * Monitors are special as they are normally slaved to
1808          * whatever else is going on, so they have their own special
1809          * operation to set the monitor channel if possible.
1810          */
1811         return !wdev ||
1812                 wdev->iftype == NL80211_IFTYPE_AP ||
1813                 wdev->iftype == NL80211_IFTYPE_MESH_POINT ||
1814                 wdev->iftype == NL80211_IFTYPE_MONITOR ||
1815                 wdev->iftype == NL80211_IFTYPE_P2P_GO;
1816 }
1817
1818 static int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
1819                                  struct genl_info *info,
1820                                  struct cfg80211_chan_def *chandef)
1821 {
1822         u32 control_freq;
1823
1824         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
1825                 return -EINVAL;
1826
1827         control_freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
1828
1829         chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq);
1830         chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
1831         chandef->center_freq1 = control_freq;
1832         chandef->center_freq2 = 0;
1833
1834         /* Primary channel not allowed */
1835         if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED)
1836                 return -EINVAL;
1837
1838         if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
1839                 enum nl80211_channel_type chantype;
1840
1841                 chantype = nla_get_u32(
1842                                 info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
1843
1844                 switch (chantype) {
1845                 case NL80211_CHAN_NO_HT:
1846                 case NL80211_CHAN_HT20:
1847                 case NL80211_CHAN_HT40PLUS:
1848                 case NL80211_CHAN_HT40MINUS:
1849                         cfg80211_chandef_create(chandef, chandef->chan,
1850                                                 chantype);
1851                         break;
1852                 default:
1853                         return -EINVAL;
1854                 }
1855         } else if (info->attrs[NL80211_ATTR_CHANNEL_WIDTH]) {
1856                 chandef->width =
1857                         nla_get_u32(info->attrs[NL80211_ATTR_CHANNEL_WIDTH]);
1858                 if (info->attrs[NL80211_ATTR_CENTER_FREQ1])
1859                         chandef->center_freq1 =
1860                                 nla_get_u32(
1861                                         info->attrs[NL80211_ATTR_CENTER_FREQ1]);
1862                 if (info->attrs[NL80211_ATTR_CENTER_FREQ2])
1863                         chandef->center_freq2 =
1864                                 nla_get_u32(
1865                                         info->attrs[NL80211_ATTR_CENTER_FREQ2]);
1866         }
1867
1868         if (!cfg80211_chandef_valid(chandef))
1869                 return -EINVAL;
1870
1871         if (!cfg80211_chandef_usable(&rdev->wiphy, chandef,
1872                                      IEEE80211_CHAN_DISABLED))
1873                 return -EINVAL;
1874
1875         if ((chandef->width == NL80211_CHAN_WIDTH_5 ||
1876              chandef->width == NL80211_CHAN_WIDTH_10) &&
1877             !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ))
1878                 return -EINVAL;
1879
1880         return 0;
1881 }
1882
1883 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
1884                                  struct wireless_dev *wdev,
1885                                  struct genl_info *info)
1886 {
1887         struct cfg80211_chan_def chandef;
1888         int result;
1889         enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR;
1890
1891         if (wdev)
1892                 iftype = wdev->iftype;
1893
1894         if (!nl80211_can_set_dev_channel(wdev))
1895                 return -EOPNOTSUPP;
1896
1897         result = nl80211_parse_chandef(rdev, info, &chandef);
1898         if (result)
1899                 return result;
1900
1901         switch (iftype) {
1902         case NL80211_IFTYPE_AP:
1903         case NL80211_IFTYPE_P2P_GO:
1904                 if (wdev->beacon_interval) {
1905                         result = -EBUSY;
1906                         break;
1907                 }
1908                 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &chandef)) {
1909                         result = -EINVAL;
1910                         break;
1911                 }
1912                 wdev->preset_chandef = chandef;
1913                 result = 0;
1914                 break;
1915         case NL80211_IFTYPE_MESH_POINT:
1916                 result = cfg80211_set_mesh_channel(rdev, wdev, &chandef);
1917                 break;
1918         case NL80211_IFTYPE_MONITOR:
1919                 result = cfg80211_set_monitor_channel(rdev, &chandef);
1920                 break;
1921         default:
1922                 result = -EINVAL;
1923         }
1924
1925         return result;
1926 }
1927
1928 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
1929 {
1930         struct cfg80211_registered_device *rdev = info->user_ptr[0];
1931         struct net_device *netdev = info->user_ptr[1];
1932
1933         return __nl80211_set_channel(rdev, netdev->ieee80211_ptr, info);
1934 }
1935
1936 static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info)
1937 {
1938         struct cfg80211_registered_device *rdev = info->user_ptr[0];
1939         struct net_device *dev = info->user_ptr[1];
1940         struct wireless_dev *wdev = dev->ieee80211_ptr;
1941         const u8 *bssid;
1942
1943         if (!info->attrs[NL80211_ATTR_MAC])
1944                 return -EINVAL;
1945
1946         if (netif_running(dev))
1947                 return -EBUSY;
1948
1949         if (!rdev->ops->set_wds_peer)
1950                 return -EOPNOTSUPP;
1951
1952         if (wdev->iftype != NL80211_IFTYPE_WDS)
1953                 return -EOPNOTSUPP;
1954
1955         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
1956         return rdev_set_wds_peer(rdev, dev, bssid);
1957 }
1958
1959
1960 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
1961 {
1962         struct cfg80211_registered_device *rdev;
1963         struct net_device *netdev = NULL;
1964         struct wireless_dev *wdev;
1965         int result = 0, rem_txq_params = 0;
1966         struct nlattr *nl_txq_params;
1967         u32 changed;
1968         u8 retry_short = 0, retry_long = 0;
1969         u32 frag_threshold = 0, rts_threshold = 0;
1970         u8 coverage_class = 0;
1971
1972         ASSERT_RTNL();
1973
1974         /*
1975          * Try to find the wiphy and netdev. Normally this
1976          * function shouldn't need the netdev, but this is
1977          * done for backward compatibility -- previously
1978          * setting the channel was done per wiphy, but now
1979          * it is per netdev. Previous userland like hostapd
1980          * also passed a netdev to set_wiphy, so that it is
1981          * possible to let that go to the right netdev!
1982          */
1983
1984         if (info->attrs[NL80211_ATTR_IFINDEX]) {
1985                 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
1986
1987                 netdev = dev_get_by_index(genl_info_net(info), ifindex);
1988                 if (netdev && netdev->ieee80211_ptr)
1989                         rdev = wiphy_to_dev(netdev->ieee80211_ptr->wiphy);
1990                 else
1991                         netdev = NULL;
1992         }
1993
1994         if (!netdev) {
1995                 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info),
1996                                                   info->attrs);
1997                 if (IS_ERR(rdev))
1998                         return PTR_ERR(rdev);
1999                 wdev = NULL;
2000                 netdev = NULL;
2001                 result = 0;
2002         } else
2003                 wdev = netdev->ieee80211_ptr;
2004
2005         /*
2006          * end workaround code, by now the rdev is available
2007          * and locked, and wdev may or may not be NULL.
2008          */
2009
2010         if (info->attrs[NL80211_ATTR_WIPHY_NAME])
2011                 result = cfg80211_dev_rename(
2012                         rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
2013
2014         if (result)
2015                 goto bad_res;
2016
2017         if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
2018                 struct ieee80211_txq_params txq_params;
2019                 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
2020
2021                 if (!rdev->ops->set_txq_params) {
2022                         result = -EOPNOTSUPP;
2023                         goto bad_res;
2024                 }
2025
2026                 if (!netdev) {
2027                         result = -EINVAL;
2028                         goto bad_res;
2029                 }
2030
2031                 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
2032                     netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
2033                         result = -EINVAL;
2034                         goto bad_res;
2035                 }
2036
2037                 if (!netif_running(netdev)) {
2038                         result = -ENETDOWN;
2039                         goto bad_res;
2040                 }
2041
2042                 nla_for_each_nested(nl_txq_params,
2043                                     info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
2044                                     rem_txq_params) {
2045                         nla_parse(tb, NL80211_TXQ_ATTR_MAX,
2046                                   nla_data(nl_txq_params),
2047                                   nla_len(nl_txq_params),
2048                                   txq_params_policy);
2049                         result = parse_txq_params(tb, &txq_params);
2050                         if (result)
2051                                 goto bad_res;
2052
2053                         result = rdev_set_txq_params(rdev, netdev,
2054                                                      &txq_params);
2055                         if (result)
2056                                 goto bad_res;
2057                 }
2058         }
2059
2060         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
2061                 result = __nl80211_set_channel(rdev,
2062                                 nl80211_can_set_dev_channel(wdev) ? wdev : NULL,
2063                                 info);
2064                 if (result)
2065                         goto bad_res;
2066         }
2067
2068         if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
2069                 struct wireless_dev *txp_wdev = wdev;
2070                 enum nl80211_tx_power_setting type;
2071                 int idx, mbm = 0;
2072
2073                 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER))
2074                         txp_wdev = NULL;
2075
2076                 if (!rdev->ops->set_tx_power) {
2077                         result = -EOPNOTSUPP;
2078                         goto bad_res;
2079                 }
2080
2081                 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
2082                 type = nla_get_u32(info->attrs[idx]);
2083
2084                 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
2085                     (type != NL80211_TX_POWER_AUTOMATIC)) {
2086                         result = -EINVAL;
2087                         goto bad_res;
2088                 }
2089
2090                 if (type != NL80211_TX_POWER_AUTOMATIC) {
2091                         idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
2092                         mbm = nla_get_u32(info->attrs[idx]);
2093                 }
2094
2095                 result = rdev_set_tx_power(rdev, txp_wdev, type, mbm);
2096                 if (result)
2097                         goto bad_res;
2098         }
2099
2100         if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
2101             info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
2102                 u32 tx_ant, rx_ant;
2103                 if ((!rdev->wiphy.available_antennas_tx &&
2104                      !rdev->wiphy.available_antennas_rx) ||
2105                     !rdev->ops->set_antenna) {
2106                         result = -EOPNOTSUPP;
2107                         goto bad_res;
2108                 }
2109
2110                 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
2111                 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
2112
2113                 /* reject antenna configurations which don't match the
2114                  * available antenna masks, except for the "all" mask */
2115                 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
2116                     (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) {
2117                         result = -EINVAL;
2118                         goto bad_res;
2119                 }
2120
2121                 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
2122                 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
2123
2124                 result = rdev_set_antenna(rdev, tx_ant, rx_ant);
2125                 if (result)
2126                         goto bad_res;
2127         }
2128
2129         changed = 0;
2130
2131         if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
2132                 retry_short = nla_get_u8(
2133                         info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
2134                 if (retry_short == 0) {
2135                         result = -EINVAL;
2136                         goto bad_res;
2137                 }
2138                 changed |= WIPHY_PARAM_RETRY_SHORT;
2139         }
2140
2141         if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
2142                 retry_long = nla_get_u8(
2143                         info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
2144                 if (retry_long == 0) {
2145                         result = -EINVAL;
2146                         goto bad_res;
2147                 }
2148                 changed |= WIPHY_PARAM_RETRY_LONG;
2149         }
2150
2151         if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
2152                 frag_threshold = nla_get_u32(
2153                         info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
2154                 if (frag_threshold < 256) {
2155                         result = -EINVAL;
2156                         goto bad_res;
2157                 }
2158                 if (frag_threshold != (u32) -1) {
2159                         /*
2160                          * Fragments (apart from the last one) are required to
2161                          * have even length. Make the fragmentation code
2162                          * simpler by stripping LSB should someone try to use
2163                          * odd threshold value.
2164                          */
2165                         frag_threshold &= ~0x1;
2166                 }
2167                 changed |= WIPHY_PARAM_FRAG_THRESHOLD;
2168         }
2169
2170         if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
2171                 rts_threshold = nla_get_u32(
2172                         info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
2173                 changed |= WIPHY_PARAM_RTS_THRESHOLD;
2174         }
2175
2176         if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
2177                 coverage_class = nla_get_u8(
2178                         info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
2179                 changed |= WIPHY_PARAM_COVERAGE_CLASS;
2180         }
2181
2182         if (changed) {
2183                 u8 old_retry_short, old_retry_long;
2184                 u32 old_frag_threshold, old_rts_threshold;
2185                 u8 old_coverage_class;
2186
2187                 if (!rdev->ops->set_wiphy_params) {
2188                         result = -EOPNOTSUPP;
2189                         goto bad_res;
2190                 }
2191
2192                 old_retry_short = rdev->wiphy.retry_short;
2193                 old_retry_long = rdev->wiphy.retry_long;
2194                 old_frag_threshold = rdev->wiphy.frag_threshold;
2195                 old_rts_threshold = rdev->wiphy.rts_threshold;
2196                 old_coverage_class = rdev->wiphy.coverage_class;
2197
2198                 if (changed & WIPHY_PARAM_RETRY_SHORT)
2199                         rdev->wiphy.retry_short = retry_short;
2200                 if (changed & WIPHY_PARAM_RETRY_LONG)
2201                         rdev->wiphy.retry_long = retry_long;
2202                 if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
2203                         rdev->wiphy.frag_threshold = frag_threshold;
2204                 if (changed & WIPHY_PARAM_RTS_THRESHOLD)
2205                         rdev->wiphy.rts_threshold = rts_threshold;
2206                 if (changed & WIPHY_PARAM_COVERAGE_CLASS)
2207                         rdev->wiphy.coverage_class = coverage_class;
2208
2209                 result = rdev_set_wiphy_params(rdev, changed);
2210                 if (result) {
2211                         rdev->wiphy.retry_short = old_retry_short;
2212                         rdev->wiphy.retry_long = old_retry_long;
2213                         rdev->wiphy.frag_threshold = old_frag_threshold;
2214                         rdev->wiphy.rts_threshold = old_rts_threshold;
2215                         rdev->wiphy.coverage_class = old_coverage_class;
2216                 }
2217         }
2218
2219  bad_res:
2220         if (netdev)
2221                 dev_put(netdev);
2222         return result;
2223 }
2224
2225 static inline u64 wdev_id(struct wireless_dev *wdev)
2226 {
2227         return (u64)wdev->identifier |
2228                ((u64)wiphy_to_dev(wdev->wiphy)->wiphy_idx << 32);
2229 }
2230
2231 static int nl80211_send_chandef(struct sk_buff *msg,
2232                                 const struct cfg80211_chan_def *chandef)
2233 {
2234         WARN_ON(!cfg80211_chandef_valid(chandef));
2235
2236         if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ,
2237                         chandef->chan->center_freq))
2238                 return -ENOBUFS;
2239         switch (chandef->width) {
2240         case NL80211_CHAN_WIDTH_20_NOHT:
2241         case NL80211_CHAN_WIDTH_20:
2242         case NL80211_CHAN_WIDTH_40:
2243                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
2244                                 cfg80211_get_chandef_type(chandef)))
2245                         return -ENOBUFS;
2246                 break;
2247         default:
2248                 break;
2249         }
2250         if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width))
2251                 return -ENOBUFS;
2252         if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1))
2253                 return -ENOBUFS;
2254         if (chandef->center_freq2 &&
2255             nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2))
2256                 return -ENOBUFS;
2257         return 0;
2258 }
2259
2260 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags,
2261                               struct cfg80211_registered_device *rdev,
2262                               struct wireless_dev *wdev)
2263 {
2264         struct net_device *dev = wdev->netdev;
2265         void *hdr;
2266
2267         hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_INTERFACE);
2268         if (!hdr)
2269                 return -1;
2270
2271         if (dev &&
2272             (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
2273              nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name)))
2274                 goto nla_put_failure;
2275
2276         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
2277             nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) ||
2278             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
2279             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) ||
2280             nla_put_u32(msg, NL80211_ATTR_GENERATION,
2281                         rdev->devlist_generation ^
2282                         (cfg80211_rdev_list_generation << 2)))
2283                 goto nla_put_failure;
2284
2285         if (rdev->ops->get_channel) {
2286                 int ret;
2287                 struct cfg80211_chan_def chandef;
2288
2289                 ret = rdev_get_channel(rdev, wdev, &chandef);
2290                 if (ret == 0) {
2291                         if (nl80211_send_chandef(msg, &chandef))
2292                                 goto nla_put_failure;
2293                 }
2294         }
2295
2296         if (wdev->ssid_len) {
2297                 if (nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid))
2298                         goto nla_put_failure;
2299         }
2300
2301         return genlmsg_end(msg, hdr);
2302
2303  nla_put_failure:
2304         genlmsg_cancel(msg, hdr);
2305         return -EMSGSIZE;
2306 }
2307
2308 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
2309 {
2310         int wp_idx = 0;
2311         int if_idx = 0;
2312         int wp_start = cb->args[0];
2313         int if_start = cb->args[1];
2314         struct cfg80211_registered_device *rdev;
2315         struct wireless_dev *wdev;
2316
2317         rtnl_lock();
2318         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
2319                 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
2320                         continue;
2321                 if (wp_idx < wp_start) {
2322                         wp_idx++;
2323                         continue;
2324                 }
2325                 if_idx = 0;
2326
2327                 list_for_each_entry(wdev, &rdev->wdev_list, list) {
2328                         if (if_idx < if_start) {
2329                                 if_idx++;
2330                                 continue;
2331                         }
2332                         if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid,
2333                                                cb->nlh->nlmsg_seq, NLM_F_MULTI,
2334                                                rdev, wdev) < 0) {
2335                                 goto out;
2336                         }
2337                         if_idx++;
2338                 }
2339
2340                 wp_idx++;
2341         }
2342  out:
2343         rtnl_unlock();
2344
2345         cb->args[0] = wp_idx;
2346         cb->args[1] = if_idx;
2347
2348         return skb->len;
2349 }
2350
2351 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
2352 {
2353         struct sk_buff *msg;
2354         struct cfg80211_registered_device *dev = info->user_ptr[0];
2355         struct wireless_dev *wdev = info->user_ptr[1];
2356
2357         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2358         if (!msg)
2359                 return -ENOMEM;
2360
2361         if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
2362                                dev, wdev) < 0) {
2363                 nlmsg_free(msg);
2364                 return -ENOBUFS;
2365         }
2366
2367         return genlmsg_reply(msg, info);
2368 }
2369
2370 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = {
2371         [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG },
2372         [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG },
2373         [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG },
2374         [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
2375         [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
2376         [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG },
2377 };
2378
2379 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
2380 {
2381         struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1];
2382         int flag;
2383
2384         *mntrflags = 0;
2385
2386         if (!nla)
2387                 return -EINVAL;
2388
2389         if (nla_parse_nested(flags, NL80211_MNTR_FLAG_MAX,
2390                              nla, mntr_flags_policy))
2391                 return -EINVAL;
2392
2393         for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
2394                 if (flags[flag])
2395                         *mntrflags |= (1<<flag);
2396
2397         return 0;
2398 }
2399
2400 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev,
2401                                struct net_device *netdev, u8 use_4addr,
2402                                enum nl80211_iftype iftype)
2403 {
2404         if (!use_4addr) {
2405                 if (netdev && (netdev->priv_flags & IFF_BRIDGE_PORT))
2406                         return -EBUSY;
2407                 return 0;
2408         }
2409
2410         switch (iftype) {
2411         case NL80211_IFTYPE_AP_VLAN:
2412                 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP)
2413                         return 0;
2414                 break;
2415         case NL80211_IFTYPE_STATION:
2416                 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION)
2417                         return 0;
2418                 break;
2419         default:
2420                 break;
2421         }
2422
2423         return -EOPNOTSUPP;
2424 }
2425
2426 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
2427 {
2428         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2429         struct vif_params params;
2430         int err;
2431         enum nl80211_iftype otype, ntype;
2432         struct net_device *dev = info->user_ptr[1];
2433         u32 _flags, *flags = NULL;
2434         bool change = false;
2435
2436         memset(&params, 0, sizeof(params));
2437
2438         otype = ntype = dev->ieee80211_ptr->iftype;
2439
2440         if (info->attrs[NL80211_ATTR_IFTYPE]) {
2441                 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
2442                 if (otype != ntype)
2443                         change = true;
2444                 if (ntype > NL80211_IFTYPE_MAX)
2445                         return -EINVAL;
2446         }
2447
2448         if (info->attrs[NL80211_ATTR_MESH_ID]) {
2449                 struct wireless_dev *wdev = dev->ieee80211_ptr;
2450
2451                 if (ntype != NL80211_IFTYPE_MESH_POINT)
2452                         return -EINVAL;
2453                 if (netif_running(dev))
2454                         return -EBUSY;
2455
2456                 wdev_lock(wdev);
2457                 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
2458                              IEEE80211_MAX_MESH_ID_LEN);
2459                 wdev->mesh_id_up_len =
2460                         nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
2461                 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
2462                        wdev->mesh_id_up_len);
2463                 wdev_unlock(wdev);
2464         }
2465
2466         if (info->attrs[NL80211_ATTR_4ADDR]) {
2467                 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
2468                 change = true;
2469                 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype);
2470                 if (err)
2471                         return err;
2472         } else {
2473                 params.use_4addr = -1;
2474         }
2475
2476         if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
2477                 if (ntype != NL80211_IFTYPE_MONITOR)
2478                         return -EINVAL;
2479                 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
2480                                           &_flags);
2481                 if (err)
2482                         return err;
2483
2484                 flags = &_flags;
2485                 change = true;
2486         }
2487
2488         if (flags && (*flags & MONITOR_FLAG_ACTIVE) &&
2489             !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
2490                 return -EOPNOTSUPP;
2491
2492         if (change)
2493                 err = cfg80211_change_iface(rdev, dev, ntype, flags, &params);
2494         else
2495                 err = 0;
2496
2497         if (!err && params.use_4addr != -1)
2498                 dev->ieee80211_ptr->use_4addr = params.use_4addr;
2499
2500         return err;
2501 }
2502
2503 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
2504 {
2505         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2506         struct vif_params params;
2507         struct wireless_dev *wdev;
2508         struct sk_buff *msg;
2509         int err;
2510         enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
2511         u32 flags;
2512
2513         memset(&params, 0, sizeof(params));
2514
2515         if (!info->attrs[NL80211_ATTR_IFNAME])
2516                 return -EINVAL;
2517
2518         if (info->attrs[NL80211_ATTR_IFTYPE]) {
2519                 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
2520                 if (type > NL80211_IFTYPE_MAX)
2521                         return -EINVAL;
2522         }
2523
2524         if (!rdev->ops->add_virtual_intf ||
2525             !(rdev->wiphy.interface_modes & (1 << type)))
2526                 return -EOPNOTSUPP;
2527
2528         if (type == NL80211_IFTYPE_P2P_DEVICE && info->attrs[NL80211_ATTR_MAC]) {
2529                 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC],
2530                            ETH_ALEN);
2531                 if (!is_valid_ether_addr(params.macaddr))
2532                         return -EADDRNOTAVAIL;
2533         }
2534
2535         if (info->attrs[NL80211_ATTR_4ADDR]) {
2536                 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
2537                 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type);
2538                 if (err)
2539                         return err;
2540         }
2541
2542         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2543         if (!msg)
2544                 return -ENOMEM;
2545
2546         err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ?
2547                                   info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL,
2548                                   &flags);
2549
2550         if (!err && (flags & MONITOR_FLAG_ACTIVE) &&
2551             !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
2552                 return -EOPNOTSUPP;
2553
2554         wdev = rdev_add_virtual_intf(rdev,
2555                                 nla_data(info->attrs[NL80211_ATTR_IFNAME]),
2556                                 type, err ? NULL : &flags, &params);
2557         if (IS_ERR(wdev)) {
2558                 nlmsg_free(msg);
2559                 return PTR_ERR(wdev);
2560         }
2561
2562         switch (type) {
2563         case NL80211_IFTYPE_MESH_POINT:
2564                 if (!info->attrs[NL80211_ATTR_MESH_ID])
2565                         break;
2566                 wdev_lock(wdev);
2567                 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
2568                              IEEE80211_MAX_MESH_ID_LEN);
2569                 wdev->mesh_id_up_len =
2570                         nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
2571                 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
2572                        wdev->mesh_id_up_len);
2573                 wdev_unlock(wdev);
2574                 break;
2575         case NL80211_IFTYPE_P2P_DEVICE:
2576                 /*
2577                  * P2P Device doesn't have a netdev, so doesn't go
2578                  * through the netdev notifier and must be added here
2579                  */
2580                 mutex_init(&wdev->mtx);
2581                 INIT_LIST_HEAD(&wdev->event_list);
2582                 spin_lock_init(&wdev->event_lock);
2583                 INIT_LIST_HEAD(&wdev->mgmt_registrations);
2584                 spin_lock_init(&wdev->mgmt_registrations_lock);
2585
2586                 wdev->identifier = ++rdev->wdev_id;
2587                 list_add_rcu(&wdev->list, &rdev->wdev_list);
2588                 rdev->devlist_generation++;
2589                 break;
2590         default:
2591                 break;
2592         }
2593
2594         if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
2595                                rdev, wdev) < 0) {
2596                 nlmsg_free(msg);
2597                 return -ENOBUFS;
2598         }
2599
2600         return genlmsg_reply(msg, info);
2601 }
2602
2603 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
2604 {
2605         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2606         struct wireless_dev *wdev = info->user_ptr[1];
2607
2608         if (!rdev->ops->del_virtual_intf)
2609                 return -EOPNOTSUPP;
2610
2611         /*
2612          * If we remove a wireless device without a netdev then clear
2613          * user_ptr[1] so that nl80211_post_doit won't dereference it
2614          * to check if it needs to do dev_put(). Otherwise it crashes
2615          * since the wdev has been freed, unlike with a netdev where
2616          * we need the dev_put() for the netdev to really be freed.
2617          */
2618         if (!wdev->netdev)
2619                 info->user_ptr[1] = NULL;
2620
2621         return rdev_del_virtual_intf(rdev, wdev);
2622 }
2623
2624 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info)
2625 {
2626         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2627         struct net_device *dev = info->user_ptr[1];
2628         u16 noack_map;
2629
2630         if (!info->attrs[NL80211_ATTR_NOACK_MAP])
2631                 return -EINVAL;
2632
2633         if (!rdev->ops->set_noack_map)
2634                 return -EOPNOTSUPP;
2635
2636         noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]);
2637
2638         return rdev_set_noack_map(rdev, dev, noack_map);
2639 }
2640
2641 struct get_key_cookie {
2642         struct sk_buff *msg;
2643         int error;
2644         int idx;
2645 };
2646
2647 static void get_key_callback(void *c, struct key_params *params)
2648 {
2649         struct nlattr *key;
2650         struct get_key_cookie *cookie = c;
2651
2652         if ((params->key &&
2653              nla_put(cookie->msg, NL80211_ATTR_KEY_DATA,
2654                      params->key_len, params->key)) ||
2655             (params->seq &&
2656              nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ,
2657                      params->seq_len, params->seq)) ||
2658             (params->cipher &&
2659              nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER,
2660                          params->cipher)))
2661                 goto nla_put_failure;
2662
2663         key = nla_nest_start(cookie->msg, NL80211_ATTR_KEY);
2664         if (!key)
2665                 goto nla_put_failure;
2666
2667         if ((params->key &&
2668              nla_put(cookie->msg, NL80211_KEY_DATA,
2669                      params->key_len, params->key)) ||
2670             (params->seq &&
2671              nla_put(cookie->msg, NL80211_KEY_SEQ,
2672                      params->seq_len, params->seq)) ||
2673             (params->cipher &&
2674              nla_put_u32(cookie->msg, NL80211_KEY_CIPHER,
2675                          params->cipher)))
2676                 goto nla_put_failure;
2677
2678         if (nla_put_u8(cookie->msg, NL80211_ATTR_KEY_IDX, cookie->idx))
2679                 goto nla_put_failure;
2680
2681         nla_nest_end(cookie->msg, key);
2682
2683         return;
2684  nla_put_failure:
2685         cookie->error = 1;
2686 }
2687
2688 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
2689 {
2690         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2691         int err;
2692         struct net_device *dev = info->user_ptr[1];
2693         u8 key_idx = 0;
2694         const u8 *mac_addr = NULL;
2695         bool pairwise;
2696         struct get_key_cookie cookie = {
2697                 .error = 0,
2698         };
2699         void *hdr;
2700         struct sk_buff *msg;
2701
2702         if (info->attrs[NL80211_ATTR_KEY_IDX])
2703                 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
2704
2705         if (key_idx > 5)
2706                 return -EINVAL;
2707
2708         if (info->attrs[NL80211_ATTR_MAC])
2709                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
2710
2711         pairwise = !!mac_addr;
2712         if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
2713                 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
2714                 if (kt >= NUM_NL80211_KEYTYPES)
2715                         return -EINVAL;
2716                 if (kt != NL80211_KEYTYPE_GROUP &&
2717                     kt != NL80211_KEYTYPE_PAIRWISE)
2718                         return -EINVAL;
2719                 pairwise = kt == NL80211_KEYTYPE_PAIRWISE;
2720         }
2721
2722         if (!rdev->ops->get_key)
2723                 return -EOPNOTSUPP;
2724
2725         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2726         if (!msg)
2727                 return -ENOMEM;
2728
2729         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
2730                              NL80211_CMD_NEW_KEY);
2731         if (!hdr)
2732                 goto nla_put_failure;
2733
2734         cookie.msg = msg;
2735         cookie.idx = key_idx;
2736
2737         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
2738             nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx))
2739                 goto nla_put_failure;
2740         if (mac_addr &&
2741             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
2742                 goto nla_put_failure;
2743
2744         if (pairwise && mac_addr &&
2745             !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
2746                 return -ENOENT;
2747
2748         err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie,
2749                            get_key_callback);
2750
2751         if (err)
2752                 goto free_msg;
2753
2754         if (cookie.error)
2755                 goto nla_put_failure;
2756
2757         genlmsg_end(msg, hdr);
2758         return genlmsg_reply(msg, info);
2759
2760  nla_put_failure:
2761         err = -ENOBUFS;
2762  free_msg:
2763         nlmsg_free(msg);
2764         return err;
2765 }
2766
2767 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
2768 {
2769         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2770         struct key_parse key;
2771         int err;
2772         struct net_device *dev = info->user_ptr[1];
2773
2774         err = nl80211_parse_key(info, &key);
2775         if (err)
2776                 return err;
2777
2778         if (key.idx < 0)
2779                 return -EINVAL;
2780
2781         /* only support setting default key */
2782         if (!key.def && !key.defmgmt)
2783                 return -EINVAL;
2784
2785         wdev_lock(dev->ieee80211_ptr);
2786
2787         if (key.def) {
2788                 if (!rdev->ops->set_default_key) {
2789                         err = -EOPNOTSUPP;
2790                         goto out;
2791                 }
2792
2793                 err = nl80211_key_allowed(dev->ieee80211_ptr);
2794                 if (err)
2795                         goto out;
2796
2797                 err = rdev_set_default_key(rdev, dev, key.idx,
2798                                                  key.def_uni, key.def_multi);
2799
2800                 if (err)
2801                         goto out;
2802
2803 #ifdef CONFIG_CFG80211_WEXT
2804                 dev->ieee80211_ptr->wext.default_key = key.idx;
2805 #endif
2806         } else {
2807                 if (key.def_uni || !key.def_multi) {
2808                         err = -EINVAL;
2809                         goto out;
2810                 }
2811
2812                 if (!rdev->ops->set_default_mgmt_key) {
2813                         err = -EOPNOTSUPP;
2814                         goto out;
2815                 }
2816
2817                 err = nl80211_key_allowed(dev->ieee80211_ptr);
2818                 if (err)
2819                         goto out;
2820
2821                 err = rdev_set_default_mgmt_key(rdev, dev, key.idx);
2822                 if (err)
2823                         goto out;
2824
2825 #ifdef CONFIG_CFG80211_WEXT
2826                 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx;
2827 #endif
2828         }
2829
2830  out:
2831         wdev_unlock(dev->ieee80211_ptr);
2832
2833         return err;
2834 }
2835
2836 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
2837 {
2838         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2839         int err;
2840         struct net_device *dev = info->user_ptr[1];
2841         struct key_parse key;
2842         const u8 *mac_addr = NULL;
2843
2844         err = nl80211_parse_key(info, &key);
2845         if (err)
2846                 return err;
2847
2848         if (!key.p.key)
2849                 return -EINVAL;
2850
2851         if (info->attrs[NL80211_ATTR_MAC])
2852                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
2853
2854         if (key.type == -1) {
2855                 if (mac_addr)
2856                         key.type = NL80211_KEYTYPE_PAIRWISE;
2857                 else
2858                         key.type = NL80211_KEYTYPE_GROUP;
2859         }
2860
2861         /* for now */
2862         if (key.type != NL80211_KEYTYPE_PAIRWISE &&
2863             key.type != NL80211_KEYTYPE_GROUP)
2864                 return -EINVAL;
2865
2866         if (!rdev->ops->add_key)
2867                 return -EOPNOTSUPP;
2868
2869         if (cfg80211_validate_key_settings(rdev, &key.p, key.idx,
2870                                            key.type == NL80211_KEYTYPE_PAIRWISE,
2871                                            mac_addr))
2872                 return -EINVAL;
2873
2874         wdev_lock(dev->ieee80211_ptr);
2875         err = nl80211_key_allowed(dev->ieee80211_ptr);
2876         if (!err)
2877                 err = rdev_add_key(rdev, dev, key.idx,
2878                                    key.type == NL80211_KEYTYPE_PAIRWISE,
2879                                     mac_addr, &key.p);
2880         wdev_unlock(dev->ieee80211_ptr);
2881
2882         return err;
2883 }
2884
2885 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
2886 {
2887         struct cfg80211_registered_device *rdev = info->user_ptr[0];
2888         int err;
2889         struct net_device *dev = info->user_ptr[1];
2890         u8 *mac_addr = NULL;
2891         struct key_parse key;
2892
2893         err = nl80211_parse_key(info, &key);
2894         if (err)
2895                 return err;
2896
2897         if (info->attrs[NL80211_ATTR_MAC])
2898                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
2899
2900         if (key.type == -1) {
2901                 if (mac_addr)
2902                         key.type = NL80211_KEYTYPE_PAIRWISE;
2903                 else
2904                         key.type = NL80211_KEYTYPE_GROUP;
2905         }
2906
2907         /* for now */
2908         if (key.type != NL80211_KEYTYPE_PAIRWISE &&
2909             key.type != NL80211_KEYTYPE_GROUP)
2910                 return -EINVAL;
2911
2912         if (!rdev->ops->del_key)
2913                 return -EOPNOTSUPP;
2914
2915         wdev_lock(dev->ieee80211_ptr);
2916         err = nl80211_key_allowed(dev->ieee80211_ptr);
2917
2918         if (key.type == NL80211_KEYTYPE_PAIRWISE && mac_addr &&
2919             !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
2920                 err = -ENOENT;
2921
2922         if (!err)
2923                 err = rdev_del_key(rdev, dev, key.idx,
2924                                    key.type == NL80211_KEYTYPE_PAIRWISE,
2925                                    mac_addr);
2926
2927 #ifdef CONFIG_CFG80211_WEXT
2928         if (!err) {
2929                 if (key.idx == dev->ieee80211_ptr->wext.default_key)
2930                         dev->ieee80211_ptr->wext.default_key = -1;
2931                 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key)
2932                         dev->ieee80211_ptr->wext.default_mgmt_key = -1;
2933         }
2934 #endif
2935         wdev_unlock(dev->ieee80211_ptr);
2936
2937         return err;
2938 }
2939
2940 /* This function returns an error or the number of nested attributes */
2941 static int validate_acl_mac_addrs(struct nlattr *nl_attr)
2942 {
2943         struct nlattr *attr;
2944         int n_entries = 0, tmp;
2945
2946         nla_for_each_nested(attr, nl_attr, tmp) {
2947                 if (nla_len(attr) != ETH_ALEN)
2948                         return -EINVAL;
2949
2950                 n_entries++;
2951         }
2952
2953         return n_entries;
2954 }
2955
2956 /*
2957  * This function parses ACL information and allocates memory for ACL data.
2958  * On successful return, the calling function is responsible to free the
2959  * ACL buffer returned by this function.
2960  */
2961 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy,
2962                                                 struct genl_info *info)
2963 {
2964         enum nl80211_acl_policy acl_policy;
2965         struct nlattr *attr;
2966         struct cfg80211_acl_data *acl;
2967         int i = 0, n_entries, tmp;
2968
2969         if (!wiphy->max_acl_mac_addrs)
2970                 return ERR_PTR(-EOPNOTSUPP);
2971
2972         if (!info->attrs[NL80211_ATTR_ACL_POLICY])
2973                 return ERR_PTR(-EINVAL);
2974
2975         acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]);
2976         if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED &&
2977             acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED)
2978                 return ERR_PTR(-EINVAL);
2979
2980         if (!info->attrs[NL80211_ATTR_MAC_ADDRS])
2981                 return ERR_PTR(-EINVAL);
2982
2983         n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]);
2984         if (n_entries < 0)
2985                 return ERR_PTR(n_entries);
2986
2987         if (n_entries > wiphy->max_acl_mac_addrs)
2988                 return ERR_PTR(-ENOTSUPP);
2989
2990         acl = kzalloc(sizeof(*acl) + (sizeof(struct mac_address) * n_entries),
2991                       GFP_KERNEL);
2992         if (!acl)
2993                 return ERR_PTR(-ENOMEM);
2994
2995         nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) {
2996                 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN);
2997                 i++;
2998         }
2999
3000         acl->n_acl_entries = n_entries;
3001         acl->acl_policy = acl_policy;
3002
3003         return acl;
3004 }
3005
3006 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info)
3007 {
3008         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3009         struct net_device *dev = info->user_ptr[1];
3010         struct cfg80211_acl_data *acl;
3011         int err;
3012
3013         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3014             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3015                 return -EOPNOTSUPP;
3016
3017         if (!dev->ieee80211_ptr->beacon_interval)
3018                 return -EINVAL;
3019
3020         acl = parse_acl_data(&rdev->wiphy, info);
3021         if (IS_ERR(acl))
3022                 return PTR_ERR(acl);
3023
3024         err = rdev_set_mac_acl(rdev, dev, acl);
3025
3026         kfree(acl);
3027
3028         return err;
3029 }
3030
3031 static int nl80211_parse_beacon(struct nlattr *attrs[],
3032                                 struct cfg80211_beacon_data *bcn)
3033 {
3034         bool haveinfo = false;
3035
3036         if (!is_valid_ie_attr(attrs[NL80211_ATTR_BEACON_TAIL]) ||
3037             !is_valid_ie_attr(attrs[NL80211_ATTR_IE]) ||
3038             !is_valid_ie_attr(attrs[NL80211_ATTR_IE_PROBE_RESP]) ||
3039             !is_valid_ie_attr(attrs[NL80211_ATTR_IE_ASSOC_RESP]))
3040                 return -EINVAL;
3041
3042         memset(bcn, 0, sizeof(*bcn));
3043
3044         if (attrs[NL80211_ATTR_BEACON_HEAD]) {
3045                 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]);
3046                 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]);
3047                 if (!bcn->head_len)
3048                         return -EINVAL;
3049                 haveinfo = true;
3050         }
3051
3052         if (attrs[NL80211_ATTR_BEACON_TAIL]) {
3053                 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]);
3054                 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]);
3055                 haveinfo = true;
3056         }
3057
3058         if (!haveinfo)
3059                 return -EINVAL;
3060
3061         if (attrs[NL80211_ATTR_IE]) {
3062                 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]);
3063                 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]);
3064         }
3065
3066         if (attrs[NL80211_ATTR_IE_PROBE_RESP]) {
3067                 bcn->proberesp_ies =
3068                         nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]);
3069                 bcn->proberesp_ies_len =
3070                         nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]);
3071         }
3072
3073         if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) {
3074                 bcn->assocresp_ies =
3075                         nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
3076                 bcn->assocresp_ies_len =
3077                         nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
3078         }
3079
3080         if (attrs[NL80211_ATTR_PROBE_RESP]) {
3081                 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]);
3082                 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]);
3083         }
3084
3085         return 0;
3086 }
3087
3088 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
3089                                    struct cfg80211_ap_settings *params)
3090 {
3091         struct wireless_dev *wdev;
3092         bool ret = false;
3093
3094         list_for_each_entry(wdev, &rdev->wdev_list, list) {
3095                 if (wdev->iftype != NL80211_IFTYPE_AP &&
3096                     wdev->iftype != NL80211_IFTYPE_P2P_GO)
3097                         continue;
3098
3099                 if (!wdev->preset_chandef.chan)
3100                         continue;
3101
3102                 params->chandef = wdev->preset_chandef;
3103                 ret = true;
3104                 break;
3105         }
3106
3107         return ret;
3108 }
3109
3110 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
3111                                     enum nl80211_auth_type auth_type,
3112                                     enum nl80211_commands cmd)
3113 {
3114         if (auth_type > NL80211_AUTHTYPE_MAX)
3115                 return false;
3116
3117         switch (cmd) {
3118         case NL80211_CMD_AUTHENTICATE:
3119                 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
3120                     auth_type == NL80211_AUTHTYPE_SAE)
3121                         return false;
3122                 return true;
3123         case NL80211_CMD_CONNECT:
3124         case NL80211_CMD_START_AP:
3125                 /* SAE not supported yet */
3126                 if (auth_type == NL80211_AUTHTYPE_SAE)
3127                         return false;
3128                 return true;
3129         default:
3130                 return false;
3131         }
3132 }
3133
3134 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
3135 {
3136         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3137         struct net_device *dev = info->user_ptr[1];
3138         struct wireless_dev *wdev = dev->ieee80211_ptr;
3139         struct cfg80211_ap_settings params;
3140         int err;
3141         u8 radar_detect_width = 0;
3142
3143         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3144             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3145                 return -EOPNOTSUPP;
3146
3147         if (!rdev->ops->start_ap)
3148                 return -EOPNOTSUPP;
3149
3150         if (wdev->beacon_interval)
3151                 return -EALREADY;
3152
3153         memset(&params, 0, sizeof(params));
3154
3155         /* these are required for START_AP */
3156         if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
3157             !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
3158             !info->attrs[NL80211_ATTR_BEACON_HEAD])
3159                 return -EINVAL;
3160
3161         err = nl80211_parse_beacon(info->attrs, &params.beacon);
3162         if (err)
3163                 return err;
3164
3165         params.beacon_interval =
3166                 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
3167         params.dtim_period =
3168                 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
3169
3170         err = cfg80211_validate_beacon_int(rdev, params.beacon_interval);
3171         if (err)
3172                 return err;
3173
3174         /*
3175          * In theory, some of these attributes should be required here
3176          * but since they were not used when the command was originally
3177          * added, keep them optional for old user space programs to let
3178          * them continue to work with drivers that do not need the
3179          * additional information -- drivers must check!
3180          */
3181         if (info->attrs[NL80211_ATTR_SSID]) {
3182                 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
3183                 params.ssid_len =
3184                         nla_len(info->attrs[NL80211_ATTR_SSID]);
3185                 if (params.ssid_len == 0 ||
3186                     params.ssid_len > IEEE80211_MAX_SSID_LEN)
3187                         return -EINVAL;
3188         }
3189
3190         if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) {
3191                 params.hidden_ssid = nla_get_u32(
3192                         info->attrs[NL80211_ATTR_HIDDEN_SSID]);
3193                 if (params.hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE &&
3194                     params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_LEN &&
3195                     params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_CONTENTS)
3196                         return -EINVAL;
3197         }
3198
3199         params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
3200
3201         if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
3202                 params.auth_type = nla_get_u32(
3203                         info->attrs[NL80211_ATTR_AUTH_TYPE]);
3204                 if (!nl80211_valid_auth_type(rdev, params.auth_type,
3205                                              NL80211_CMD_START_AP))
3206                         return -EINVAL;
3207         } else
3208                 params.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
3209
3210         err = nl80211_crypto_settings(rdev, info, &params.crypto,
3211                                       NL80211_MAX_NR_CIPHER_SUITES);
3212         if (err)
3213                 return err;
3214
3215         if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) {
3216                 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER))
3217                         return -EOPNOTSUPP;
3218                 params.inactivity_timeout = nla_get_u16(
3219                         info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]);
3220         }
3221
3222         if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
3223                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3224                         return -EINVAL;
3225                 params.p2p_ctwindow =
3226                         nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
3227                 if (params.p2p_ctwindow > 127)
3228                         return -EINVAL;
3229                 if (params.p2p_ctwindow != 0 &&
3230                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
3231                         return -EINVAL;
3232         }
3233
3234         if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
3235                 u8 tmp;
3236
3237                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3238                         return -EINVAL;
3239                 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
3240                 if (tmp > 1)
3241                         return -EINVAL;
3242                 params.p2p_opp_ps = tmp;
3243                 if (params.p2p_opp_ps != 0 &&
3244                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
3245                         return -EINVAL;
3246         }
3247
3248         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
3249                 err = nl80211_parse_chandef(rdev, info, &params.chandef);
3250                 if (err)
3251                         return err;
3252         } else if (wdev->preset_chandef.chan) {
3253                 params.chandef = wdev->preset_chandef;
3254         } else if (!nl80211_get_ap_channel(rdev, &params))
3255                 return -EINVAL;
3256
3257         if (!cfg80211_reg_can_beacon(&rdev->wiphy, &params.chandef))
3258                 return -EINVAL;
3259
3260         err = cfg80211_chandef_dfs_required(wdev->wiphy, &params.chandef);
3261         if (err < 0)
3262                 return err;
3263         if (err) {
3264                 radar_detect_width = BIT(params.chandef.width);
3265                 params.radar_required = true;
3266         }
3267
3268         err = cfg80211_can_use_iftype_chan(rdev, wdev, wdev->iftype,
3269                                            params.chandef.chan,
3270                                            CHAN_MODE_SHARED,
3271                                            radar_detect_width);
3272         if (err)
3273                 return err;
3274
3275         if (info->attrs[NL80211_ATTR_ACL_POLICY]) {
3276                 params.acl = parse_acl_data(&rdev->wiphy, info);
3277                 if (IS_ERR(params.acl))
3278                         return PTR_ERR(params.acl);
3279         }
3280
3281         wdev_lock(wdev);
3282         err = rdev_start_ap(rdev, dev, &params);
3283         if (!err) {
3284                 wdev->preset_chandef = params.chandef;
3285                 wdev->beacon_interval = params.beacon_interval;
3286                 wdev->channel = params.chandef.chan;
3287                 wdev->ssid_len = params.ssid_len;
3288                 memcpy(wdev->ssid, params.ssid, wdev->ssid_len);
3289         }
3290         wdev_unlock(wdev);
3291
3292         kfree(params.acl);
3293
3294         return err;
3295 }
3296
3297 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
3298 {
3299         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3300         struct net_device *dev = info->user_ptr[1];
3301         struct wireless_dev *wdev = dev->ieee80211_ptr;
3302         struct cfg80211_beacon_data params;
3303         int err;
3304
3305         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3306             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
3307                 return -EOPNOTSUPP;
3308
3309         if (!rdev->ops->change_beacon)
3310                 return -EOPNOTSUPP;
3311
3312         if (!wdev->beacon_interval)
3313                 return -EINVAL;
3314
3315         err = nl80211_parse_beacon(info->attrs, &params);
3316         if (err)
3317                 return err;
3318
3319         wdev_lock(wdev);
3320         err = rdev_change_beacon(rdev, dev, &params);
3321         wdev_unlock(wdev);
3322
3323         return err;
3324 }
3325
3326 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info)
3327 {
3328         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3329         struct net_device *dev = info->user_ptr[1];
3330
3331         return cfg80211_stop_ap(rdev, dev);
3332 }
3333
3334 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
3335         [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG },
3336         [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
3337         [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
3338         [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
3339         [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG },
3340         [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG },
3341 };
3342
3343 static int parse_station_flags(struct genl_info *info,
3344                                enum nl80211_iftype iftype,
3345                                struct station_parameters *params)
3346 {
3347         struct nlattr *flags[NL80211_STA_FLAG_MAX + 1];
3348         struct nlattr *nla;
3349         int flag;
3350
3351         /*
3352          * Try parsing the new attribute first so userspace
3353          * can specify both for older kernels.
3354          */
3355         nla = info->attrs[NL80211_ATTR_STA_FLAGS2];
3356         if (nla) {
3357                 struct nl80211_sta_flag_update *sta_flags;
3358
3359                 sta_flags = nla_data(nla);
3360                 params->sta_flags_mask = sta_flags->mask;
3361                 params->sta_flags_set = sta_flags->set;
3362                 params->sta_flags_set &= params->sta_flags_mask;
3363                 if ((params->sta_flags_mask |
3364                      params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID))
3365                         return -EINVAL;
3366                 return 0;
3367         }
3368
3369         /* if present, parse the old attribute */
3370
3371         nla = info->attrs[NL80211_ATTR_STA_FLAGS];
3372         if (!nla)
3373                 return 0;
3374
3375         if (nla_parse_nested(flags, NL80211_STA_FLAG_MAX,
3376                              nla, sta_flags_policy))
3377                 return -EINVAL;
3378
3379         /*
3380          * Only allow certain flags for interface types so that
3381          * other attributes are silently ignored. Remember that
3382          * this is backward compatibility code with old userspace
3383          * and shouldn't be hit in other cases anyway.
3384          */
3385         switch (iftype) {
3386         case NL80211_IFTYPE_AP:
3387         case NL80211_IFTYPE_AP_VLAN:
3388         case NL80211_IFTYPE_P2P_GO:
3389                 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
3390                                          BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
3391                                          BIT(NL80211_STA_FLAG_WME) |
3392                                          BIT(NL80211_STA_FLAG_MFP);
3393                 break;
3394         case NL80211_IFTYPE_P2P_CLIENT:
3395         case NL80211_IFTYPE_STATION:
3396                 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
3397                                          BIT(NL80211_STA_FLAG_TDLS_PEER);
3398                 break;
3399         case NL80211_IFTYPE_MESH_POINT:
3400                 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
3401                                          BIT(NL80211_STA_FLAG_MFP) |
3402                                          BIT(NL80211_STA_FLAG_AUTHORIZED);
3403         default:
3404                 return -EINVAL;
3405         }
3406
3407         for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) {
3408                 if (flags[flag]) {
3409                         params->sta_flags_set |= (1<<flag);
3410
3411                         /* no longer support new API additions in old API */
3412                         if (flag > NL80211_STA_FLAG_MAX_OLD_API)
3413                                 return -EINVAL;
3414                 }
3415         }
3416
3417         return 0;
3418 }
3419
3420 static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info,
3421                                  int attr)
3422 {
3423         struct nlattr *rate;
3424         u32 bitrate;
3425         u16 bitrate_compat;
3426
3427         rate = nla_nest_start(msg, attr);
3428         if (!rate)
3429                 return false;
3430
3431         /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
3432         bitrate = cfg80211_calculate_bitrate(info);
3433         /* report 16-bit bitrate only if we can */
3434         bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0;
3435         if (bitrate > 0 &&
3436             nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate))
3437                 return false;
3438         if (bitrate_compat > 0 &&
3439             nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat))
3440                 return false;
3441
3442         if (info->flags & RATE_INFO_FLAGS_MCS) {
3443                 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs))
3444                         return false;
3445                 if (info->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH &&
3446                     nla_put_flag(msg, NL80211_RATE_INFO_40_MHZ_WIDTH))
3447                         return false;
3448                 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
3449                     nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
3450                         return false;
3451         } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) {
3452                 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs))
3453                         return false;
3454                 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss))
3455                         return false;
3456                 if (info->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH &&
3457                     nla_put_flag(msg, NL80211_RATE_INFO_40_MHZ_WIDTH))
3458                         return false;
3459                 if (info->flags & RATE_INFO_FLAGS_80_MHZ_WIDTH &&
3460                     nla_put_flag(msg, NL80211_RATE_INFO_80_MHZ_WIDTH))
3461                         return false;
3462                 if (info->flags & RATE_INFO_FLAGS_80P80_MHZ_WIDTH &&
3463                     nla_put_flag(msg, NL80211_RATE_INFO_80P80_MHZ_WIDTH))
3464                         return false;
3465                 if (info->flags & RATE_INFO_FLAGS_160_MHZ_WIDTH &&
3466                     nla_put_flag(msg, NL80211_RATE_INFO_160_MHZ_WIDTH))
3467                         return false;
3468                 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
3469                     nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
3470                         return false;
3471         }
3472
3473         nla_nest_end(msg, rate);
3474         return true;
3475 }
3476
3477 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal,
3478                                int id)
3479 {
3480         void *attr;
3481         int i = 0;
3482
3483         if (!mask)
3484                 return true;
3485
3486         attr = nla_nest_start(msg, id);
3487         if (!attr)
3488                 return false;
3489
3490         for (i = 0; i < IEEE80211_MAX_CHAINS; i++) {
3491                 if (!(mask & BIT(i)))
3492                         continue;
3493
3494                 if (nla_put_u8(msg, i, signal[i]))
3495                         return false;
3496         }
3497
3498         nla_nest_end(msg, attr);
3499
3500         return true;
3501 }
3502
3503 static int nl80211_send_station(struct sk_buff *msg, u32 portid, u32 seq,
3504                                 int flags,
3505                                 struct cfg80211_registered_device *rdev,
3506                                 struct net_device *dev,
3507                                 const u8 *mac_addr, struct station_info *sinfo)
3508 {
3509         void *hdr;
3510         struct nlattr *sinfoattr, *bss_param;
3511
3512         hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_STATION);
3513         if (!hdr)
3514                 return -1;
3515
3516         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
3517             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
3518             nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation))
3519                 goto nla_put_failure;
3520
3521         sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO);
3522         if (!sinfoattr)
3523                 goto nla_put_failure;
3524         if ((sinfo->filled & STATION_INFO_CONNECTED_TIME) &&
3525             nla_put_u32(msg, NL80211_STA_INFO_CONNECTED_TIME,
3526                         sinfo->connected_time))
3527                 goto nla_put_failure;
3528         if ((sinfo->filled & STATION_INFO_INACTIVE_TIME) &&
3529             nla_put_u32(msg, NL80211_STA_INFO_INACTIVE_TIME,
3530                         sinfo->inactive_time))
3531                 goto nla_put_failure;
3532         if ((sinfo->filled & (STATION_INFO_RX_BYTES |
3533                               STATION_INFO_RX_BYTES64)) &&
3534             nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES,
3535                         (u32)sinfo->rx_bytes))
3536                 goto nla_put_failure;
3537         if ((sinfo->filled & (STATION_INFO_TX_BYTES |
3538                               STATION_INFO_TX_BYTES64)) &&
3539             nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES,
3540                         (u32)sinfo->tx_bytes))
3541                 goto nla_put_failure;
3542         if ((sinfo->filled & STATION_INFO_RX_BYTES64) &&
3543             nla_put_u64(msg, NL80211_STA_INFO_RX_BYTES64,
3544                         sinfo->rx_bytes))
3545                 goto nla_put_failure;
3546         if ((sinfo->filled & STATION_INFO_TX_BYTES64) &&
3547             nla_put_u64(msg, NL80211_STA_INFO_TX_BYTES64,
3548                         sinfo->tx_bytes))
3549                 goto nla_put_failure;
3550         if ((sinfo->filled & STATION_INFO_LLID) &&
3551             nla_put_u16(msg, NL80211_STA_INFO_LLID, sinfo->llid))
3552                 goto nla_put_failure;
3553         if ((sinfo->filled & STATION_INFO_PLID) &&
3554             nla_put_u16(msg, NL80211_STA_INFO_PLID, sinfo->plid))
3555                 goto nla_put_failure;
3556         if ((sinfo->filled & STATION_INFO_PLINK_STATE) &&
3557             nla_put_u8(msg, NL80211_STA_INFO_PLINK_STATE,
3558                        sinfo->plink_state))
3559                 goto nla_put_failure;
3560         switch (rdev->wiphy.signal_type) {
3561         case CFG80211_SIGNAL_TYPE_MBM:
3562                 if ((sinfo->filled & STATION_INFO_SIGNAL) &&
3563                     nla_put_u8(msg, NL80211_STA_INFO_SIGNAL,
3564                                sinfo->signal))
3565                         goto nla_put_failure;
3566                 if ((sinfo->filled & STATION_INFO_SIGNAL_AVG) &&
3567                     nla_put_u8(msg, NL80211_STA_INFO_SIGNAL_AVG,
3568                                sinfo->signal_avg))
3569                         goto nla_put_failure;
3570                 break;
3571         default:
3572                 break;
3573         }
3574         if (sinfo->filled & STATION_INFO_CHAIN_SIGNAL) {
3575                 if (!nl80211_put_signal(msg, sinfo->chains,
3576                                         sinfo->chain_signal,
3577                                         NL80211_STA_INFO_CHAIN_SIGNAL))
3578                         goto nla_put_failure;
3579         }
3580         if (sinfo->filled & STATION_INFO_CHAIN_SIGNAL_AVG) {
3581                 if (!nl80211_put_signal(msg, sinfo->chains,
3582                                         sinfo->chain_signal_avg,
3583                                         NL80211_STA_INFO_CHAIN_SIGNAL_AVG))
3584                         goto nla_put_failure;
3585         }
3586         if (sinfo->filled & STATION_INFO_TX_BITRATE) {
3587                 if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
3588                                           NL80211_STA_INFO_TX_BITRATE))
3589                         goto nla_put_failure;
3590         }
3591         if (sinfo->filled & STATION_INFO_RX_BITRATE) {
3592                 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate,
3593                                           NL80211_STA_INFO_RX_BITRATE))
3594                         goto nla_put_failure;
3595         }
3596         if ((sinfo->filled & STATION_INFO_RX_PACKETS) &&
3597             nla_put_u32(msg, NL80211_STA_INFO_RX_PACKETS,
3598                         sinfo->rx_packets))
3599                 goto nla_put_failure;
3600         if ((sinfo->filled & STATION_INFO_TX_PACKETS) &&
3601             nla_put_u32(msg, NL80211_STA_INFO_TX_PACKETS,
3602                         sinfo->tx_packets))
3603                 goto nla_put_failure;
3604         if ((sinfo->filled & STATION_INFO_TX_RETRIES) &&
3605             nla_put_u32(msg, NL80211_STA_INFO_TX_RETRIES,
3606                         sinfo->tx_retries))
3607                 goto nla_put_failure;
3608         if ((sinfo->filled & STATION_INFO_TX_FAILED) &&
3609             nla_put_u32(msg, NL80211_STA_INFO_TX_FAILED,
3610                         sinfo->tx_failed))
3611                 goto nla_put_failure;
3612         if ((sinfo->filled & STATION_INFO_BEACON_LOSS_COUNT) &&
3613             nla_put_u32(msg, NL80211_STA_INFO_BEACON_LOSS,
3614                         sinfo->beacon_loss_count))
3615                 goto nla_put_failure;
3616         if ((sinfo->filled & STATION_INFO_LOCAL_PM) &&
3617             nla_put_u32(msg, NL80211_STA_INFO_LOCAL_PM,
3618                         sinfo->local_pm))
3619                 goto nla_put_failure;
3620         if ((sinfo->filled & STATION_INFO_PEER_PM) &&
3621             nla_put_u32(msg, NL80211_STA_INFO_PEER_PM,
3622                         sinfo->peer_pm))
3623                 goto nla_put_failure;
3624         if ((sinfo->filled & STATION_INFO_NONPEER_PM) &&
3625             nla_put_u32(msg, NL80211_STA_INFO_NONPEER_PM,
3626                         sinfo->nonpeer_pm))
3627                 goto nla_put_failure;
3628         if (sinfo->filled & STATION_INFO_BSS_PARAM) {
3629                 bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM);
3630                 if (!bss_param)
3631                         goto nla_put_failure;
3632
3633                 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) &&
3634                      nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) ||
3635                     ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) &&
3636                      nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) ||
3637                     ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) &&
3638                      nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) ||
3639                     nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD,
3640                                sinfo->bss_param.dtim_period) ||
3641                     nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL,
3642                                 sinfo->bss_param.beacon_interval))
3643                         goto nla_put_failure;
3644
3645                 nla_nest_end(msg, bss_param);
3646         }
3647         if ((sinfo->filled & STATION_INFO_STA_FLAGS) &&
3648             nla_put(msg, NL80211_STA_INFO_STA_FLAGS,
3649                     sizeof(struct nl80211_sta_flag_update),
3650                     &sinfo->sta_flags))
3651                 goto nla_put_failure;
3652         if ((sinfo->filled & STATION_INFO_T_OFFSET) &&
3653                 nla_put_u64(msg, NL80211_STA_INFO_T_OFFSET,
3654                             sinfo->t_offset))
3655                 goto nla_put_failure;
3656         nla_nest_end(msg, sinfoattr);
3657
3658         if ((sinfo->filled & STATION_INFO_ASSOC_REQ_IES) &&
3659             nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len,
3660                     sinfo->assoc_req_ies))
3661                 goto nla_put_failure;
3662
3663         return genlmsg_end(msg, hdr);
3664
3665  nla_put_failure:
3666         genlmsg_cancel(msg, hdr);
3667         return -EMSGSIZE;
3668 }
3669
3670 static int nl80211_dump_station(struct sk_buff *skb,
3671                                 struct netlink_callback *cb)
3672 {
3673         struct station_info sinfo;
3674         struct cfg80211_registered_device *dev;
3675         struct wireless_dev *wdev;
3676         u8 mac_addr[ETH_ALEN];
3677         int sta_idx = cb->args[2];
3678         int err;
3679
3680         err = nl80211_prepare_wdev_dump(skb, cb, &dev, &wdev);
3681         if (err)
3682                 return err;
3683
3684         if (!wdev->netdev) {
3685                 err = -EINVAL;
3686                 goto out_err;
3687         }
3688
3689         if (!dev->ops->dump_station) {
3690                 err = -EOPNOTSUPP;
3691                 goto out_err;
3692         }
3693
3694         while (1) {
3695                 memset(&sinfo, 0, sizeof(sinfo));
3696                 err = rdev_dump_station(dev, wdev->netdev, sta_idx,
3697                                         mac_addr, &sinfo);
3698                 if (err == -ENOENT)
3699                         break;
3700                 if (err)
3701                         goto out_err;
3702
3703                 if (nl80211_send_station(skb,
3704                                 NETLINK_CB(cb->skb).portid,
3705                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
3706                                 dev, wdev->netdev, mac_addr,
3707                                 &sinfo) < 0)
3708                         goto out;
3709
3710                 sta_idx++;
3711         }
3712
3713
3714  out:
3715         cb->args[2] = sta_idx;
3716         err = skb->len;
3717  out_err:
3718         nl80211_finish_wdev_dump(dev);
3719
3720         return err;
3721 }
3722
3723 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
3724 {
3725         struct cfg80211_registered_device *rdev = info->user_ptr[0];
3726         struct net_device *dev = info->user_ptr[1];
3727         struct station_info sinfo;
3728         struct sk_buff *msg;
3729         u8 *mac_addr = NULL;
3730         int err;
3731
3732         memset(&sinfo, 0, sizeof(sinfo));
3733
3734         if (!info->attrs[NL80211_ATTR_MAC])
3735                 return -EINVAL;
3736
3737         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
3738
3739         if (!rdev->ops->get_station)
3740                 return -EOPNOTSUPP;
3741
3742         err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
3743         if (err)
3744                 return err;
3745
3746         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
3747         if (!msg)
3748                 return -ENOMEM;
3749
3750         if (nl80211_send_station(msg, info->snd_portid, info->snd_seq, 0,
3751                                  rdev, dev, mac_addr, &sinfo) < 0) {
3752                 nlmsg_free(msg);
3753                 return -ENOBUFS;
3754         }
3755
3756         return genlmsg_reply(msg, info);
3757 }
3758
3759 int cfg80211_check_station_change(struct wiphy *wiphy,
3760                                   struct station_parameters *params,
3761                                   enum cfg80211_station_type statype)
3762 {
3763         if (params->listen_interval != -1)
3764                 return -EINVAL;
3765         if (params->aid)
3766                 return -EINVAL;
3767
3768         /* When you run into this, adjust the code below for the new flag */
3769         BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
3770
3771         switch (statype) {
3772         case CFG80211_STA_MESH_PEER_KERNEL:
3773         case CFG80211_STA_MESH_PEER_USER:
3774                 /*
3775                  * No ignoring the TDLS flag here -- the userspace mesh
3776                  * code doesn't have the bug of including TDLS in the
3777                  * mask everywhere.
3778                  */
3779                 if (params->sta_flags_mask &
3780                                 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
3781                                   BIT(NL80211_STA_FLAG_MFP) |
3782                                   BIT(NL80211_STA_FLAG_AUTHORIZED)))
3783                         return -EINVAL;
3784                 break;
3785         case CFG80211_STA_TDLS_PEER_SETUP:
3786         case CFG80211_STA_TDLS_PEER_ACTIVE:
3787                 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
3788                         return -EINVAL;
3789                 /* ignore since it can't change */
3790                 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
3791                 break;
3792         default:
3793                 /* disallow mesh-specific things */
3794                 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION)
3795                         return -EINVAL;
3796                 if (params->local_pm)
3797                         return -EINVAL;
3798                 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
3799                         return -EINVAL;
3800         }
3801
3802         if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
3803             statype != CFG80211_STA_TDLS_PEER_ACTIVE) {
3804                 /* TDLS can't be set, ... */
3805                 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
3806                         return -EINVAL;
3807                 /*
3808                  * ... but don't bother the driver with it. This works around
3809                  * a hostapd/wpa_supplicant issue -- it always includes the
3810                  * TLDS_PEER flag in the mask even for AP mode.
3811                  */
3812                 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
3813         }
3814
3815         if (statype != CFG80211_STA_TDLS_PEER_SETUP) {
3816                 /* reject other things that can't change */
3817                 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD)
3818                         return -EINVAL;
3819                 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY)
3820                         return -EINVAL;
3821                 if (params->supported_rates)
3822                         return -EINVAL;
3823                 if (params->ext_capab || params->ht_capa || params->vht_capa)
3824                         return -EINVAL;
3825         }
3826
3827         if (statype != CFG80211_STA_AP_CLIENT) {
3828                 if (params->vlan)
3829                         return -EINVAL;
3830         }
3831
3832         switch (statype) {
3833         case CFG80211_STA_AP_MLME_CLIENT:
3834                 /* Use this only for authorizing/unauthorizing a station */
3835                 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)))
3836                         return -EOPNOTSUPP;
3837                 break;
3838         case CFG80211_STA_AP_CLIENT:
3839                 /* accept only the listed bits */
3840                 if (params->sta_flags_mask &
3841                                 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
3842                                   BIT(NL80211_STA_FLAG_AUTHENTICATED) |
3843                                   BIT(NL80211_STA_FLAG_ASSOCIATED) |
3844                                   BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
3845                                   BIT(NL80211_STA_FLAG_WME) |
3846                                   BIT(NL80211_STA_FLAG_MFP)))
3847                         return -EINVAL;
3848
3849                 /* but authenticated/associated only if driver handles it */
3850                 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
3851                     params->sta_flags_mask &
3852                                 (BIT(NL80211_STA_FLAG_AUTHENTICATED) |
3853                                  BIT(NL80211_STA_FLAG_ASSOCIATED)))
3854                         return -EINVAL;
3855                 break;
3856         case CFG80211_STA_IBSS:
3857         case CFG80211_STA_AP_STA:
3858                 /* reject any changes other than AUTHORIZED */
3859                 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
3860                         return -EINVAL;
3861                 break;
3862         case CFG80211_STA_TDLS_PEER_SETUP:
3863                 /* reject any changes other than AUTHORIZED or WME */
3864                 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
3865                                                BIT(NL80211_STA_FLAG_WME)))
3866                         return -EINVAL;
3867                 /* force (at least) rates when authorizing */
3868                 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) &&
3869                     !params->supported_rates)
3870                         return -EINVAL;
3871                 break;
3872         case CFG80211_STA_TDLS_PEER_ACTIVE:
3873                 /* reject any changes */
3874                 return -EINVAL;
3875         case CFG80211_STA_MESH_PEER_KERNEL:
3876                 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
3877                         return -EINVAL;
3878                 break;
3879         case CFG80211_STA_MESH_PEER_USER:
3880                 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION)
3881                         return -EINVAL;
3882                 break;
3883         }
3884
3885         return 0;
3886 }
3887 EXPORT_SYMBOL(cfg80211_check_station_change);
3888
3889 /*
3890  * Get vlan interface making sure it is running and on the right wiphy.
3891  */
3892 static struct net_device *get_vlan(struct genl_info *info,
3893                                    struct cfg80211_registered_device *rdev)
3894 {
3895         struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN];
3896         struct net_device *v;
3897         int ret;
3898
3899         if (!vlanattr)
3900                 return NULL;
3901
3902         v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr));
3903         if (!v)
3904                 return ERR_PTR(-ENODEV);
3905
3906         if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) {
3907                 ret = -EINVAL;
3908                 goto error;
3909         }
3910
3911         if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
3912             v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
3913             v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
3914                 ret = -EINVAL;
3915                 goto error;
3916         }
3917
3918         if (!netif_running(v)) {
3919                 ret = -ENETDOWN;
3920                 goto error;
3921         }
3922
3923         return v;
3924  error:
3925         dev_put(v);
3926         return ERR_PTR(ret);
3927 }
3928
3929 static struct nla_policy
3930 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] __read_mostly = {
3931         [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 },
3932         [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 },
3933 };
3934
3935 static int nl80211_parse_sta_wme(struct genl_info *info,
3936                                  struct station_parameters *params)
3937 {
3938         struct nlattr *tb[NL80211_STA_WME_MAX + 1];
3939         struct nlattr *nla;
3940         int err;
3941
3942         /* parse WME attributes if present */
3943         if (!info->attrs[NL80211_ATTR_STA_WME])
3944                 return 0;
3945
3946         nla = info->attrs[NL80211_ATTR_STA_WME];
3947         err = nla_parse_nested(tb, NL80211_STA_WME_MAX, nla,
3948                                nl80211_sta_wme_policy);
3949         if (err)
3950                 return err;
3951
3952         if (tb[NL80211_STA_WME_UAPSD_QUEUES])
3953                 params->uapsd_queues = nla_get_u8(
3954                         tb[NL80211_STA_WME_UAPSD_QUEUES]);
3955         if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK)
3956                 return -EINVAL;
3957
3958         if (tb[NL80211_STA_WME_MAX_SP])
3959                 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]);
3960
3961         if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK)
3962                 return -EINVAL;
3963
3964         params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD;
3965
3966         return 0;
3967 }
3968
3969 static int nl80211_parse_sta_channel_info(struct genl_info *info,
3970                                       struct station_parameters *params)
3971 {
3972         if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
3973                 params->supported_channels =
3974                      nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
3975                 params->supported_channels_len =
3976                      nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
3977                 /*
3978                  * Need to include at least one (first channel, number of
3979                  * channels) tuple for each subband, and must have proper
3980                  * tuples for the rest of the data as well.
3981                  */
3982                 if (params->supported_channels_len < 2)
3983                         return -EINVAL;
3984                 if (params->supported_channels_len % 2)
3985                         return -EINVAL;
3986         }
3987
3988         if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
3989                 params->supported_oper_classes =
3990                  nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
3991                 params->supported_oper_classes_len =
3992                   nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
3993                 /*
3994                  * The value of the Length field of the Supported Operating
3995                  * Classes element is between 2 and 253.
3996                  */
3997                 if (params->supported_oper_classes_len < 2 ||
3998                     params->supported_oper_classes_len > 253)
3999                         return -EINVAL;
4000         }
4001         return 0;
4002 }
4003
4004 static int nl80211_set_station_tdls(struct genl_info *info,
4005                                     struct station_parameters *params)
4006 {
4007         int err;
4008         /* Dummy STA entry gets updated once the peer capabilities are known */
4009         if (info->attrs[NL80211_ATTR_PEER_AID])
4010                 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
4011         if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
4012                 params->ht_capa =
4013                         nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
4014         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
4015                 params->vht_capa =
4016                         nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
4017
4018         err = nl80211_parse_sta_channel_info(info, params);
4019         if (err)
4020                 return err;
4021
4022         return nl80211_parse_sta_wme(info, params);
4023 }
4024
4025 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
4026 {
4027         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4028         struct net_device *dev = info->user_ptr[1];
4029         struct station_parameters params;
4030         u8 *mac_addr;
4031         int err;
4032
4033         memset(&params, 0, sizeof(params));
4034
4035         params.listen_interval = -1;
4036
4037         if (!rdev->ops->change_station)
4038                 return -EOPNOTSUPP;
4039
4040         if (info->attrs[NL80211_ATTR_STA_AID])
4041                 return -EINVAL;
4042
4043         if (!info->attrs[NL80211_ATTR_MAC])
4044                 return -EINVAL;
4045
4046         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4047
4048         if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
4049                 params.supported_rates =
4050                         nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
4051                 params.supported_rates_len =
4052                         nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
4053         }
4054
4055         if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
4056                 params.capability =
4057                         nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
4058                 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
4059         }
4060
4061         if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
4062                 params.ext_capab =
4063                         nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
4064                 params.ext_capab_len =
4065                         nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
4066         }
4067
4068         if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
4069                 return -EINVAL;
4070
4071         if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
4072                 return -EINVAL;
4073
4074         if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) {
4075                 params.plink_action =
4076                         nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
4077                 if (params.plink_action >= NUM_NL80211_PLINK_ACTIONS)
4078                         return -EINVAL;
4079         }
4080
4081         if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) {
4082                 params.plink_state =
4083                         nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]);
4084                 if (params.plink_state >= NUM_NL80211_PLINK_STATES)
4085                         return -EINVAL;
4086                 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE;
4087         }
4088
4089         if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) {
4090                 enum nl80211_mesh_power_mode pm = nla_get_u32(
4091                         info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]);
4092
4093                 if (pm <= NL80211_MESH_POWER_UNKNOWN ||
4094                     pm > NL80211_MESH_POWER_MAX)
4095                         return -EINVAL;
4096
4097                 params.local_pm = pm;
4098         }
4099
4100         /* Include parameters for TDLS peer (will check later) */
4101         err = nl80211_set_station_tdls(info, &params);
4102         if (err)
4103                 return err;
4104
4105         params.vlan = get_vlan(info, rdev);
4106         if (IS_ERR(params.vlan))
4107                 return PTR_ERR(params.vlan);
4108
4109         switch (dev->ieee80211_ptr->iftype) {
4110         case NL80211_IFTYPE_AP:
4111         case NL80211_IFTYPE_AP_VLAN:
4112         case NL80211_IFTYPE_P2P_GO:
4113         case NL80211_IFTYPE_P2P_CLIENT:
4114         case NL80211_IFTYPE_STATION:
4115         case NL80211_IFTYPE_ADHOC:
4116         case NL80211_IFTYPE_MESH_POINT:
4117                 break;
4118         default:
4119                 err = -EOPNOTSUPP;
4120                 goto out_put_vlan;
4121         }
4122
4123         /* driver will call cfg80211_check_station_change() */
4124         err = rdev_change_station(rdev, dev, mac_addr, &params);
4125
4126  out_put_vlan:
4127         if (params.vlan)
4128                 dev_put(params.vlan);
4129
4130         return err;
4131 }
4132
4133 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
4134 {
4135         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4136         int err;
4137         struct net_device *dev = info->user_ptr[1];
4138         struct station_parameters params;
4139         u8 *mac_addr = NULL;
4140
4141         memset(&params, 0, sizeof(params));
4142
4143         if (!rdev->ops->add_station)
4144                 return -EOPNOTSUPP;
4145
4146         if (!info->attrs[NL80211_ATTR_MAC])
4147                 return -EINVAL;
4148
4149         if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
4150                 return -EINVAL;
4151
4152         if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
4153                 return -EINVAL;
4154
4155         if (!info->attrs[NL80211_ATTR_STA_AID] &&
4156             !info->attrs[NL80211_ATTR_PEER_AID])
4157                 return -EINVAL;
4158
4159         mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4160         params.supported_rates =
4161                 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
4162         params.supported_rates_len =
4163                 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
4164         params.listen_interval =
4165                 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
4166
4167         if (info->attrs[NL80211_ATTR_PEER_AID])
4168                 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
4169         else
4170                 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
4171         if (!params.aid || params.aid > IEEE80211_MAX_AID)
4172                 return -EINVAL;
4173
4174         if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
4175                 params.capability =
4176                         nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
4177                 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
4178         }
4179
4180         if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
4181                 params.ext_capab =
4182                         nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
4183                 params.ext_capab_len =
4184                         nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
4185         }
4186
4187         if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
4188                 params.ht_capa =
4189                         nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
4190
4191         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
4192                 params.vht_capa =
4193                         nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
4194
4195         if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
4196                 params.opmode_notif_used = true;
4197                 params.opmode_notif =
4198                         nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
4199         }
4200
4201         if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) {
4202                 params.plink_action =
4203                         nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
4204                 if (params.plink_action >= NUM_NL80211_PLINK_ACTIONS)
4205                         return -EINVAL;
4206         }
4207
4208         err = nl80211_parse_sta_channel_info(info, &params);
4209         if (err)
4210                 return err;
4211
4212         err = nl80211_parse_sta_wme(info, &params);
4213         if (err)
4214                 return err;
4215
4216         if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
4217                 return -EINVAL;
4218
4219         /* When you run into this, adjust the code below for the new flag */
4220         BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
4221
4222         switch (dev->ieee80211_ptr->iftype) {
4223         case NL80211_IFTYPE_AP:
4224         case NL80211_IFTYPE_AP_VLAN:
4225         case NL80211_IFTYPE_P2P_GO:
4226                 /* ignore WME attributes if iface/sta is not capable */
4227                 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) ||
4228                     !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME)))
4229                         params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
4230
4231                 /* TDLS peers cannot be added */
4232                 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
4233                     info->attrs[NL80211_ATTR_PEER_AID])
4234                         return -EINVAL;
4235                 /* but don't bother the driver with it */
4236                 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
4237
4238                 /* allow authenticated/associated only if driver handles it */
4239                 if (!(rdev->wiphy.features &
4240                                 NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
4241                     params.sta_flags_mask &
4242                                 (BIT(NL80211_STA_FLAG_AUTHENTICATED) |
4243                                  BIT(NL80211_STA_FLAG_ASSOCIATED)))
4244                         return -EINVAL;
4245
4246                 /* must be last in here for error handling */
4247                 params.vlan = get_vlan(info, rdev);
4248                 if (IS_ERR(params.vlan))
4249                         return PTR_ERR(params.vlan);
4250                 break;
4251         case NL80211_IFTYPE_MESH_POINT:
4252                 /* ignore uAPSD data */
4253                 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
4254
4255                 /* associated is disallowed */
4256                 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED))
4257                         return -EINVAL;
4258                 /* TDLS peers cannot be added */
4259                 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
4260                     info->attrs[NL80211_ATTR_PEER_AID])
4261                         return -EINVAL;
4262                 break;
4263         case NL80211_IFTYPE_STATION:
4264         case NL80211_IFTYPE_P2P_CLIENT:
4265                 /* ignore uAPSD data */
4266                 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
4267
4268                 /* these are disallowed */
4269                 if (params.sta_flags_mask &
4270                                 (BIT(NL80211_STA_FLAG_ASSOCIATED) |
4271                                  BIT(NL80211_STA_FLAG_AUTHENTICATED)))
4272                         return -EINVAL;
4273                 /* Only TDLS peers can be added */
4274                 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
4275                         return -EINVAL;
4276                 /* Can only add if TDLS ... */
4277                 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS))
4278                         return -EOPNOTSUPP;
4279                 /* ... with external setup is supported */
4280                 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP))
4281                         return -EOPNOTSUPP;
4282                 /*
4283                  * Older wpa_supplicant versions always mark the TDLS peer
4284                  * as authorized, but it shouldn't yet be.
4285                  */
4286                 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED);
4287                 break;
4288         default:
4289                 return -EOPNOTSUPP;
4290         }
4291
4292         /* be aware of params.vlan when changing code here */
4293
4294         err = rdev_add_station(rdev, dev, mac_addr, &params);
4295
4296         if (params.vlan)
4297                 dev_put(params.vlan);
4298         return err;
4299 }
4300
4301 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
4302 {
4303         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4304         struct net_device *dev = info->user_ptr[1];
4305         u8 *mac_addr = NULL;
4306
4307         if (info->attrs[NL80211_ATTR_MAC])
4308                 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4309
4310         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
4311             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
4312             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
4313             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4314                 return -EINVAL;
4315
4316         if (!rdev->ops->del_station)
4317                 return -EOPNOTSUPP;
4318
4319         return rdev_del_station(rdev, dev, mac_addr);
4320 }
4321
4322 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq,
4323                                 int flags, struct net_device *dev,
4324                                 u8 *dst, u8 *next_hop,
4325                                 struct mpath_info *pinfo)
4326 {
4327         void *hdr;
4328         struct nlattr *pinfoattr;
4329
4330         hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_STATION);
4331         if (!hdr)
4332                 return -1;
4333
4334         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
4335             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) ||
4336             nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) ||
4337             nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation))
4338                 goto nla_put_failure;
4339
4340         pinfoattr = nla_nest_start(msg, NL80211_ATTR_MPATH_INFO);
4341         if (!pinfoattr)
4342                 goto nla_put_failure;
4343         if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) &&
4344             nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN,
4345                         pinfo->frame_qlen))
4346                 goto nla_put_failure;
4347         if (((pinfo->filled & MPATH_INFO_SN) &&
4348              nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) ||
4349             ((pinfo->filled & MPATH_INFO_METRIC) &&
4350              nla_put_u32(msg, NL80211_MPATH_INFO_METRIC,
4351                          pinfo->metric)) ||
4352             ((pinfo->filled & MPATH_INFO_EXPTIME) &&
4353              nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME,
4354                          pinfo->exptime)) ||
4355             ((pinfo->filled & MPATH_INFO_FLAGS) &&
4356              nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS,
4357                         pinfo->flags)) ||
4358             ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) &&
4359              nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
4360                          pinfo->discovery_timeout)) ||
4361             ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) &&
4362              nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES,
4363                         pinfo->discovery_retries)))
4364                 goto nla_put_failure;
4365
4366         nla_nest_end(msg, pinfoattr);
4367
4368         return genlmsg_end(msg, hdr);
4369
4370  nla_put_failure:
4371         genlmsg_cancel(msg, hdr);
4372         return -EMSGSIZE;
4373 }
4374
4375 static int nl80211_dump_mpath(struct sk_buff *skb,
4376                               struct netlink_callback *cb)
4377 {
4378         struct mpath_info pinfo;
4379         struct cfg80211_registered_device *dev;
4380         struct wireless_dev *wdev;
4381         u8 dst[ETH_ALEN];
4382         u8 next_hop[ETH_ALEN];
4383         int path_idx = cb->args[2];
4384         int err;
4385
4386         err = nl80211_prepare_wdev_dump(skb, cb, &dev, &wdev);
4387         if (err)
4388                 return err;
4389
4390         if (!dev->ops->dump_mpath) {
4391                 err = -EOPNOTSUPP;
4392                 goto out_err;
4393         }
4394
4395         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
4396                 err = -EOPNOTSUPP;
4397                 goto out_err;
4398         }
4399
4400         while (1) {
4401                 err = rdev_dump_mpath(dev, wdev->netdev, path_idx, dst,
4402                                       next_hop, &pinfo);
4403                 if (err == -ENOENT)
4404                         break;
4405                 if (err)
4406                         goto out_err;
4407
4408                 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
4409                                        cb->nlh->nlmsg_seq, NLM_F_MULTI,
4410                                        wdev->netdev, dst, next_hop,
4411                                        &pinfo) < 0)
4412                         goto out;
4413
4414                 path_idx++;
4415         }
4416
4417
4418  out:
4419         cb->args[2] = path_idx;
4420         err = skb->len;
4421  out_err:
4422         nl80211_finish_wdev_dump(dev);
4423         return err;
4424 }
4425
4426 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
4427 {
4428         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4429         int err;
4430         struct net_device *dev = info->user_ptr[1];
4431         struct mpath_info pinfo;
4432         struct sk_buff *msg;
4433         u8 *dst = NULL;
4434         u8 next_hop[ETH_ALEN];
4435
4436         memset(&pinfo, 0, sizeof(pinfo));
4437
4438         if (!info->attrs[NL80211_ATTR_MAC])
4439                 return -EINVAL;
4440
4441         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
4442
4443         if (!rdev->ops->get_mpath)
4444                 return -EOPNOTSUPP;
4445
4446         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
4447                 return -EOPNOTSUPP;
4448
4449         err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo);
4450         if (err)
4451                 return err;
4452
4453         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
4454         if (!msg)
4455                 return -ENOMEM;
4456
4457         if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
4458                                  dev, dst, next_hop, &pinfo) < 0) {
4459                 nlmsg_free(msg);
4460                 return -ENOBUFS;
4461         }
4462
4463         return genlmsg_reply(msg, info);
4464 }
4465
4466 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
4467 {
4468         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4469         struct net_device *dev = info->user_ptr[1];
4470         u8 *dst = NULL;
4471         u8 *next_hop = NULL;
4472
4473         if (!info->attrs[NL80211_ATTR_MAC])
4474                 return -EINVAL;
4475
4476         if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
4477                 return -EINVAL;
4478
4479         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
4480         next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
4481
4482         if (!rdev->ops->change_mpath)
4483                 return -EOPNOTSUPP;
4484
4485         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
4486                 return -EOPNOTSUPP;
4487
4488         return rdev_change_mpath(rdev, dev, dst, next_hop);
4489 }
4490
4491 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
4492 {
4493         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4494         struct net_device *dev = info->user_ptr[1];
4495         u8 *dst = NULL;
4496         u8 *next_hop = NULL;
4497
4498         if (!info->attrs[NL80211_ATTR_MAC])
4499                 return -EINVAL;
4500
4501         if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
4502                 return -EINVAL;
4503
4504         dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
4505         next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
4506
4507         if (!rdev->ops->add_mpath)
4508                 return -EOPNOTSUPP;
4509
4510         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
4511                 return -EOPNOTSUPP;
4512
4513         return rdev_add_mpath(rdev, dev, dst, next_hop);
4514 }
4515
4516 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
4517 {
4518         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4519         struct net_device *dev = info->user_ptr[1];
4520         u8 *dst = NULL;
4521
4522         if (info->attrs[NL80211_ATTR_MAC])
4523                 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
4524
4525         if (!rdev->ops->del_mpath)
4526                 return -EOPNOTSUPP;
4527
4528         return rdev_del_mpath(rdev, dev, dst);
4529 }
4530
4531 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
4532 {
4533         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4534         struct net_device *dev = info->user_ptr[1];
4535         struct wireless_dev *wdev = dev->ieee80211_ptr;
4536         struct bss_parameters params;
4537         int err;
4538
4539         memset(&params, 0, sizeof(params));
4540         /* default to not changing parameters */
4541         params.use_cts_prot = -1;
4542         params.use_short_preamble = -1;
4543         params.use_short_slot_time = -1;
4544         params.ap_isolate = -1;
4545         params.ht_opmode = -1;
4546         params.p2p_ctwindow = -1;
4547         params.p2p_opp_ps = -1;
4548
4549         if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
4550                 params.use_cts_prot =
4551                     nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
4552         if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE])
4553                 params.use_short_preamble =
4554                     nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
4555         if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME])
4556                 params.use_short_slot_time =
4557                     nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
4558         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
4559                 params.basic_rates =
4560                         nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
4561                 params.basic_rates_len =
4562                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
4563         }
4564         if (info->attrs[NL80211_ATTR_AP_ISOLATE])
4565                 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]);
4566         if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE])
4567                 params.ht_opmode =
4568                         nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]);
4569
4570         if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
4571                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4572                         return -EINVAL;
4573                 params.p2p_ctwindow =
4574                         nla_get_s8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
4575                 if (params.p2p_ctwindow < 0)
4576                         return -EINVAL;
4577                 if (params.p2p_ctwindow != 0 &&
4578                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
4579                         return -EINVAL;
4580         }
4581
4582         if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
4583                 u8 tmp;
4584
4585                 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4586                         return -EINVAL;
4587                 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
4588                 if (tmp > 1)
4589                         return -EINVAL;
4590                 params.p2p_opp_ps = tmp;
4591                 if (params.p2p_opp_ps &&
4592                     !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
4593                         return -EINVAL;
4594         }
4595
4596         if (!rdev->ops->change_bss)
4597                 return -EOPNOTSUPP;
4598
4599         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
4600             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
4601                 return -EOPNOTSUPP;
4602
4603         wdev_lock(wdev);
4604         err = rdev_change_bss(rdev, dev, &params);
4605         wdev_unlock(wdev);
4606
4607         return err;
4608 }
4609
4610 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
4611         [NL80211_ATTR_REG_RULE_FLAGS]           = { .type = NLA_U32 },
4612         [NL80211_ATTR_FREQ_RANGE_START]         = { .type = NLA_U32 },
4613         [NL80211_ATTR_FREQ_RANGE_END]           = { .type = NLA_U32 },
4614         [NL80211_ATTR_FREQ_RANGE_MAX_BW]        = { .type = NLA_U32 },
4615         [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]  = { .type = NLA_U32 },
4616         [NL80211_ATTR_POWER_RULE_MAX_EIRP]      = { .type = NLA_U32 },
4617 };
4618
4619 static int parse_reg_rule(struct nlattr *tb[],
4620         struct ieee80211_reg_rule *reg_rule)
4621 {
4622         struct ieee80211_freq_range *freq_range = &reg_rule->freq_range;
4623         struct ieee80211_power_rule *power_rule = &reg_rule->power_rule;
4624
4625         if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
4626                 return -EINVAL;
4627         if (!tb[NL80211_ATTR_FREQ_RANGE_START])
4628                 return -EINVAL;
4629         if (!tb[NL80211_ATTR_FREQ_RANGE_END])
4630                 return -EINVAL;
4631         if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
4632                 return -EINVAL;
4633         if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
4634                 return -EINVAL;
4635
4636         reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
4637
4638         freq_range->start_freq_khz =
4639                 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
4640         freq_range->end_freq_khz =
4641                 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
4642         freq_range->max_bandwidth_khz =
4643                 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
4644
4645         power_rule->max_eirp =
4646                 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
4647
4648         if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
4649                 power_rule->max_antenna_gain =
4650                         nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
4651
4652         return 0;
4653 }
4654
4655 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
4656 {
4657         int r;
4658         char *data = NULL;
4659         enum nl80211_user_reg_hint_type user_reg_hint_type;
4660
4661         /*
4662          * You should only get this when cfg80211 hasn't yet initialized
4663          * completely when built-in to the kernel right between the time
4664          * window between nl80211_init() and regulatory_init(), if that is
4665          * even possible.
4666          */
4667         if (unlikely(!rcu_access_pointer(cfg80211_regdomain)))
4668                 return -EINPROGRESS;
4669
4670         if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
4671                 return -EINVAL;
4672
4673         data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
4674
4675         if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE])
4676                 user_reg_hint_type =
4677                   nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]);
4678         else
4679                 user_reg_hint_type = NL80211_USER_REG_HINT_USER;
4680
4681         switch (user_reg_hint_type) {
4682         case NL80211_USER_REG_HINT_USER:
4683         case NL80211_USER_REG_HINT_CELL_BASE:
4684                 break;
4685         default:
4686                 return -EINVAL;
4687         }
4688
4689         r = regulatory_hint_user(data, user_reg_hint_type);
4690
4691         return r;
4692 }
4693
4694 static int nl80211_get_mesh_config(struct sk_buff *skb,
4695                                    struct genl_info *info)
4696 {
4697         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4698         struct net_device *dev = info->user_ptr[1];
4699         struct wireless_dev *wdev = dev->ieee80211_ptr;
4700         struct mesh_config cur_params;
4701         int err = 0;
4702         void *hdr;
4703         struct nlattr *pinfoattr;
4704         struct sk_buff *msg;
4705
4706         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
4707                 return -EOPNOTSUPP;
4708
4709         if (!rdev->ops->get_mesh_config)
4710                 return -EOPNOTSUPP;
4711
4712         wdev_lock(wdev);
4713         /* If not connected, get default parameters */
4714         if (!wdev->mesh_id_len)
4715                 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params));
4716         else
4717                 err = rdev_get_mesh_config(rdev, dev, &cur_params);
4718         wdev_unlock(wdev);
4719
4720         if (err)
4721                 return err;
4722
4723         /* Draw up a netlink message to send back */
4724         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
4725         if (!msg)
4726                 return -ENOMEM;
4727         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
4728                              NL80211_CMD_GET_MESH_CONFIG);
4729         if (!hdr)
4730                 goto out;
4731         pinfoattr = nla_nest_start(msg, NL80211_ATTR_MESH_CONFIG);
4732         if (!pinfoattr)
4733                 goto nla_put_failure;
4734         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
4735             nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT,
4736                         cur_params.dot11MeshRetryTimeout) ||
4737             nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT,
4738                         cur_params.dot11MeshConfirmTimeout) ||
4739             nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT,
4740                         cur_params.dot11MeshHoldingTimeout) ||
4741             nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
4742                         cur_params.dot11MeshMaxPeerLinks) ||
4743             nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES,
4744                        cur_params.dot11MeshMaxRetries) ||
4745             nla_put_u8(msg, NL80211_MESHCONF_TTL,
4746                        cur_params.dot11MeshTTL) ||
4747             nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL,
4748                        cur_params.element_ttl) ||
4749             nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
4750                        cur_params.auto_open_plinks) ||
4751             nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
4752                         cur_params.dot11MeshNbrOffsetMaxNeighbor) ||
4753             nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
4754                        cur_params.dot11MeshHWMPmaxPREQretries) ||
4755             nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME,
4756                         cur_params.path_refresh_time) ||
4757             nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
4758                         cur_params.min_discovery_timeout) ||
4759             nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
4760                         cur_params.dot11MeshHWMPactivePathTimeout) ||
4761             nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
4762                         cur_params.dot11MeshHWMPpreqMinInterval) ||
4763             nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
4764                         cur_params.dot11MeshHWMPperrMinInterval) ||
4765             nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
4766                         cur_params.dot11MeshHWMPnetDiameterTraversalTime) ||
4767             nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE,
4768                        cur_params.dot11MeshHWMPRootMode) ||
4769             nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
4770                         cur_params.dot11MeshHWMPRannInterval) ||
4771             nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
4772                        cur_params.dot11MeshGateAnnouncementProtocol) ||
4773             nla_put_u8(msg, NL80211_MESHCONF_FORWARDING,
4774                        cur_params.dot11MeshForwarding) ||
4775             nla_put_u32(msg, NL80211_MESHCONF_RSSI_THRESHOLD,
4776                         cur_params.rssi_threshold) ||
4777             nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE,
4778                         cur_params.ht_opmode) ||
4779             nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
4780                         cur_params.dot11MeshHWMPactivePathToRootTimeout) ||
4781             nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
4782                         cur_params.dot11MeshHWMProotInterval) ||
4783             nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
4784                         cur_params.dot11MeshHWMPconfirmationInterval) ||
4785             nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE,
4786                         cur_params.power_mode) ||
4787             nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW,
4788                         cur_params.dot11MeshAwakeWindowDuration) ||
4789             nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT,
4790                         cur_params.plink_timeout))
4791                 goto nla_put_failure;
4792         nla_nest_end(msg, pinfoattr);
4793         genlmsg_end(msg, hdr);
4794         return genlmsg_reply(msg, info);
4795
4796  nla_put_failure:
4797         genlmsg_cancel(msg, hdr);
4798  out:
4799         nlmsg_free(msg);
4800         return -ENOBUFS;
4801 }
4802
4803 static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = {
4804         [NL80211_MESHCONF_RETRY_TIMEOUT] = { .type = NLA_U16 },
4805         [NL80211_MESHCONF_CONFIRM_TIMEOUT] = { .type = NLA_U16 },
4806         [NL80211_MESHCONF_HOLDING_TIMEOUT] = { .type = NLA_U16 },
4807         [NL80211_MESHCONF_MAX_PEER_LINKS] = { .type = NLA_U16 },
4808         [NL80211_MESHCONF_MAX_RETRIES] = { .type = NLA_U8 },
4809         [NL80211_MESHCONF_TTL] = { .type = NLA_U8 },
4810         [NL80211_MESHCONF_ELEMENT_TTL] = { .type = NLA_U8 },
4811         [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = { .type = NLA_U8 },
4812         [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = { .type = NLA_U32 },
4813         [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 },
4814         [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 },
4815         [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = { .type = NLA_U16 },
4816         [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
4817         [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = { .type = NLA_U16 },
4818         [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = { .type = NLA_U16 },
4819         [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = { .type = NLA_U16 },
4820         [NL80211_MESHCONF_HWMP_ROOTMODE] = { .type = NLA_U8 },
4821         [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = { .type = NLA_U16 },
4822         [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = { .type = NLA_U8 },
4823         [NL80211_MESHCONF_FORWARDING] = { .type = NLA_U8 },
4824         [NL80211_MESHCONF_RSSI_THRESHOLD] = { .type = NLA_U32 },
4825         [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 },
4826         [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 },
4827         [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = { .type = NLA_U16 },
4828         [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = { .type = NLA_U16 },
4829         [NL80211_MESHCONF_POWER_MODE] = { .type = NLA_U32 },
4830         [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 },
4831         [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 },
4832 };
4833
4834 static const struct nla_policy
4835         nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
4836         [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 },
4837         [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
4838         [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
4839         [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
4840         [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 },
4841         [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG },
4842         [NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY,
4843                                     .len = IEEE80211_MAX_DATA_LEN },
4844         [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG },
4845 };
4846
4847 static int nl80211_parse_mesh_config(struct genl_info *info,
4848                                      struct mesh_config *cfg,
4849                                      u32 *mask_out)
4850 {
4851         struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1];
4852         u32 mask = 0;
4853
4854 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, min, max, mask, attr, fn) \
4855 do {                                                                        \
4856         if (tb[attr]) {                                                     \
4857                 if (fn(tb[attr]) < min || fn(tb[attr]) > max)               \
4858                         return -EINVAL;                                     \
4859                 cfg->param = fn(tb[attr]);                                  \
4860                 mask |= (1 << (attr - 1));                                  \
4861         }                                                                   \
4862 } while (0)
4863
4864
4865         if (!info->attrs[NL80211_ATTR_MESH_CONFIG])
4866                 return -EINVAL;
4867         if (nla_parse_nested(tb, NL80211_MESHCONF_ATTR_MAX,
4868                              info->attrs[NL80211_ATTR_MESH_CONFIG],
4869                              nl80211_meshconf_params_policy))
4870                 return -EINVAL;
4871
4872         /* This makes sure that there aren't more than 32 mesh config
4873          * parameters (otherwise our bitfield scheme would not work.) */
4874         BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
4875
4876         /* Fill in the params struct */
4877         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, 1, 255,
4878                                   mask, NL80211_MESHCONF_RETRY_TIMEOUT,
4879                                   nla_get_u16);
4880         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, 1, 255,
4881                                   mask, NL80211_MESHCONF_CONFIRM_TIMEOUT,
4882                                   nla_get_u16);
4883         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, 1, 255,
4884                                   mask, NL80211_MESHCONF_HOLDING_TIMEOUT,
4885                                   nla_get_u16);
4886         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, 0, 255,
4887                                   mask, NL80211_MESHCONF_MAX_PEER_LINKS,
4888                                   nla_get_u16);
4889         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, 0, 16,
4890                                   mask, NL80211_MESHCONF_MAX_RETRIES,
4891                                   nla_get_u8);
4892         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, 1, 255,
4893                                   mask, NL80211_MESHCONF_TTL, nla_get_u8);
4894         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, 1, 255,
4895                                   mask, NL80211_MESHCONF_ELEMENT_TTL,
4896                                   nla_get_u8);
4897         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, 0, 1,
4898                                   mask, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
4899                                   nla_get_u8);
4900         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor,
4901                                   1, 255, mask,
4902                                   NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
4903                                   nla_get_u32);
4904         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, 0, 255,
4905                                   mask, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
4906                                   nla_get_u8);
4907         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, 1, 65535,
4908                                   mask, NL80211_MESHCONF_PATH_REFRESH_TIME,
4909                                   nla_get_u32);
4910         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, 1, 65535,
4911                                   mask, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
4912                                   nla_get_u16);
4913         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout,
4914                                   1, 65535, mask,
4915                                   NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
4916                                   nla_get_u32);
4917         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval,
4918                                   1, 65535, mask,
4919                                   NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
4920                                   nla_get_u16);
4921         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval,
4922                                   1, 65535, mask,
4923                                   NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
4924                                   nla_get_u16);
4925         FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
4926                                   dot11MeshHWMPnetDiameterTraversalTime,
4927                                   1, 65535, mask,
4928                                   NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
4929                                   nla_get_u16);
4930         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, 0, 4,
4931                                   mask, NL80211_MESHCONF_HWMP_ROOTMODE,
4932                                   nla_get_u8);
4933         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, 1, 65535,
4934                                   mask, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
4935                                   nla_get_u16);
4936         FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
4937                                   dot11MeshGateAnnouncementProtocol, 0, 1,
4938                                   mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
4939                                   nla_get_u8);
4940         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, 0, 1,
4941                                   mask, NL80211_MESHCONF_FORWARDING,
4942                                   nla_get_u8);
4943         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, -255, 0,
4944                                   mask, NL80211_MESHCONF_RSSI_THRESHOLD,
4945                                   nla_get_s32);
4946         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, ht_opmode, 0, 16,
4947                                   mask, NL80211_MESHCONF_HT_OPMODE,
4948                                   nla_get_u16);
4949         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathToRootTimeout,
4950                                   1, 65535, mask,
4951                                   NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
4952                                   nla_get_u32);
4953         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, 1, 65535,
4954                                   mask, NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
4955                                   nla_get_u16);
4956         FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
4957                                   dot11MeshHWMPconfirmationInterval,
4958                                   1, 65535, mask,
4959                                   NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
4960                                   nla_get_u16);
4961         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode,
4962                                   NL80211_MESH_POWER_ACTIVE,
4963                                   NL80211_MESH_POWER_MAX,
4964                                   mask, NL80211_MESHCONF_POWER_MODE,
4965                                   nla_get_u32);
4966         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration,
4967                                   0, 65535, mask,
4968                                   NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16);
4969         FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, 1, 0xffffffff,
4970                                   mask, NL80211_MESHCONF_PLINK_TIMEOUT,
4971                                   nla_get_u32);
4972         if (mask_out)
4973                 *mask_out = mask;
4974
4975         return 0;
4976
4977 #undef FILL_IN_MESH_PARAM_IF_SET
4978 }
4979
4980 static int nl80211_parse_mesh_setup(struct genl_info *info,
4981                                      struct mesh_setup *setup)
4982 {
4983         struct cfg80211_registered_device *rdev = info->user_ptr[0];
4984         struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1];
4985
4986         if (!info->attrs[NL80211_ATTR_MESH_SETUP])
4987                 return -EINVAL;
4988         if (nla_parse_nested(tb, NL80211_MESH_SETUP_ATTR_MAX,
4989                              info->attrs[NL80211_ATTR_MESH_SETUP],
4990                              nl80211_mesh_setup_params_policy))
4991                 return -EINVAL;
4992
4993         if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])
4994                 setup->sync_method =
4995                 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ?
4996                  IEEE80211_SYNC_METHOD_VENDOR :
4997                  IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET;
4998
4999         if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])
5000                 setup->path_sel_proto =
5001                 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ?
5002                  IEEE80211_PATH_PROTOCOL_VENDOR :
5003                  IEEE80211_PATH_PROTOCOL_HWMP;
5004
5005         if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])
5006                 setup->path_metric =
5007                 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ?
5008                  IEEE80211_PATH_METRIC_VENDOR :
5009                  IEEE80211_PATH_METRIC_AIRTIME;
5010
5011
5012         if (tb[NL80211_MESH_SETUP_IE]) {
5013                 struct nlattr *ieattr =
5014                         tb[NL80211_MESH_SETUP_IE];
5015                 if (!is_valid_ie_attr(ieattr))
5016                         return -EINVAL;
5017                 setup->ie = nla_data(ieattr);
5018                 setup->ie_len = nla_len(ieattr);
5019         }
5020         if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] &&
5021             !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM))
5022                 return -EINVAL;
5023         setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]);
5024         setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]);
5025         setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]);
5026         if (setup->is_secure)
5027                 setup->user_mpm = true;
5028
5029         if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) {
5030                 if (!setup->user_mpm)
5031                         return -EINVAL;
5032                 setup->auth_id =
5033                         nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]);
5034         }
5035
5036         return 0;
5037 }
5038
5039 static int nl80211_update_mesh_config(struct sk_buff *skb,
5040                                       struct genl_info *info)
5041 {
5042         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5043         struct net_device *dev = info->user_ptr[1];
5044         struct wireless_dev *wdev = dev->ieee80211_ptr;
5045         struct mesh_config cfg;
5046         u32 mask;
5047         int err;
5048
5049         if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
5050                 return -EOPNOTSUPP;
5051
5052         if (!rdev->ops->update_mesh_config)
5053                 return -EOPNOTSUPP;
5054
5055         err = nl80211_parse_mesh_config(info, &cfg, &mask);
5056         if (err)
5057                 return err;
5058
5059         wdev_lock(wdev);
5060         if (!wdev->mesh_id_len)
5061                 err = -ENOLINK;
5062
5063         if (!err)
5064                 err = rdev_update_mesh_config(rdev, dev, mask, &cfg);
5065
5066         wdev_unlock(wdev);
5067
5068         return err;
5069 }
5070
5071 static int nl80211_get_reg(struct sk_buff *skb, struct genl_info *info)
5072 {
5073         const struct ieee80211_regdomain *regdom;
5074         struct sk_buff *msg;
5075         void *hdr = NULL;
5076         struct nlattr *nl_reg_rules;
5077         unsigned int i;
5078
5079         if (!cfg80211_regdomain)
5080                 return -EINVAL;
5081
5082         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
5083         if (!msg)
5084                 return -ENOBUFS;
5085
5086         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
5087                              NL80211_CMD_GET_REG);
5088         if (!hdr)
5089                 goto put_failure;
5090
5091         if (reg_last_request_cell_base() &&
5092             nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
5093                         NL80211_USER_REG_HINT_CELL_BASE))
5094                 goto nla_put_failure;
5095
5096         rcu_read_lock();
5097         regdom = rcu_dereference(cfg80211_regdomain);
5098
5099         if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) ||
5100             (regdom->dfs_region &&
5101              nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region)))
5102                 goto nla_put_failure_rcu;
5103
5104         nl_reg_rules = nla_nest_start(msg, NL80211_ATTR_REG_RULES);
5105         if (!nl_reg_rules)
5106                 goto nla_put_failure_rcu;
5107
5108         for (i = 0; i < regdom->n_reg_rules; i++) {
5109                 struct nlattr *nl_reg_rule;
5110                 const struct ieee80211_reg_rule *reg_rule;
5111                 const struct ieee80211_freq_range *freq_range;
5112                 const struct ieee80211_power_rule *power_rule;
5113
5114                 reg_rule = &regdom->reg_rules[i];
5115                 freq_range = &reg_rule->freq_range;
5116                 power_rule = &reg_rule->power_rule;
5117
5118                 nl_reg_rule = nla_nest_start(msg, i);
5119                 if (!nl_reg_rule)
5120                         goto nla_put_failure_rcu;
5121
5122                 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS,
5123                                 reg_rule->flags) ||
5124                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START,
5125                                 freq_range->start_freq_khz) ||
5126                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END,
5127                                 freq_range->end_freq_khz) ||
5128                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW,
5129                                 freq_range->max_bandwidth_khz) ||
5130                     nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
5131                                 power_rule->max_antenna_gain) ||
5132                     nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP,
5133                                 power_rule->max_eirp))
5134                         goto nla_put_failure_rcu;
5135
5136                 nla_nest_end(msg, nl_reg_rule);
5137         }
5138         rcu_read_unlock();
5139
5140         nla_nest_end(msg, nl_reg_rules);
5141
5142         genlmsg_end(msg, hdr);
5143         return genlmsg_reply(msg, info);
5144
5145 nla_put_failure_rcu:
5146         rcu_read_unlock();
5147 nla_put_failure:
5148         genlmsg_cancel(msg, hdr);
5149 put_failure:
5150         nlmsg_free(msg);
5151         return -EMSGSIZE;
5152 }
5153
5154 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
5155 {
5156         struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
5157         struct nlattr *nl_reg_rule;
5158         char *alpha2 = NULL;
5159         int rem_reg_rules = 0, r = 0;
5160         u32 num_rules = 0, rule_idx = 0, size_of_regd;
5161         enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET;
5162         struct ieee80211_regdomain *rd = NULL;
5163
5164         if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
5165                 return -EINVAL;
5166
5167         if (!info->attrs[NL80211_ATTR_REG_RULES])
5168                 return -EINVAL;
5169
5170         alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
5171
5172         if (info->attrs[NL80211_ATTR_DFS_REGION])
5173                 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]);
5174
5175         nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
5176                             rem_reg_rules) {
5177                 num_rules++;
5178                 if (num_rules > NL80211_MAX_SUPP_REG_RULES)
5179                         return -EINVAL;
5180         }
5181
5182         if (!reg_is_valid_request(alpha2))
5183                 return -EINVAL;
5184
5185         size_of_regd = sizeof(struct ieee80211_regdomain) +
5186                        num_rules * sizeof(struct ieee80211_reg_rule);
5187
5188         rd = kzalloc(size_of_regd, GFP_KERNEL);
5189         if (!rd)
5190                 return -ENOMEM;
5191
5192         rd->n_reg_rules = num_rules;
5193         rd->alpha2[0] = alpha2[0];
5194         rd->alpha2[1] = alpha2[1];
5195
5196         /*
5197          * Disable DFS master mode if the DFS region was
5198          * not supported or known on this kernel.
5199          */
5200         if (reg_supported_dfs_region(dfs_region))
5201                 rd->dfs_region = dfs_region;
5202
5203         nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
5204                             rem_reg_rules) {
5205                 nla_parse(tb, NL80211_REG_RULE_ATTR_MAX,
5206                           nla_data(nl_reg_rule), nla_len(nl_reg_rule),
5207                           reg_rule_policy);
5208                 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
5209                 if (r)
5210                         goto bad_reg;
5211
5212                 rule_idx++;
5213
5214                 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) {
5215                         r = -EINVAL;
5216                         goto bad_reg;
5217                 }
5218         }
5219
5220         r = set_regdom(rd);
5221         /* set_regdom took ownership */
5222         rd = NULL;
5223
5224  bad_reg:
5225         kfree(rd);
5226         return r;
5227 }
5228
5229 static int validate_scan_freqs(struct nlattr *freqs)
5230 {
5231         struct nlattr *attr1, *attr2;
5232         int n_channels = 0, tmp1, tmp2;
5233
5234         nla_for_each_nested(attr1, freqs, tmp1) {
5235                 n_channels++;
5236                 /*
5237                  * Some hardware has a limited channel list for
5238                  * scanning, and it is pretty much nonsensical
5239                  * to scan for a channel twice, so disallow that
5240                  * and don't require drivers to check that the
5241                  * channel list they get isn't longer than what
5242                  * they can scan, as long as they can scan all
5243                  * the channels they registered at once.
5244                  */
5245                 nla_for_each_nested(attr2, freqs, tmp2)
5246                         if (attr1 != attr2 &&
5247                             nla_get_u32(attr1) == nla_get_u32(attr2))
5248                                 return 0;
5249         }
5250
5251         return n_channels;
5252 }
5253
5254 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
5255 {
5256         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5257         struct wireless_dev *wdev = info->user_ptr[1];
5258         struct cfg80211_scan_request *request;
5259         struct nlattr *attr;
5260         struct wiphy *wiphy;
5261         int err, tmp, n_ssids = 0, n_channels, i;
5262         size_t ie_len;
5263
5264         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
5265                 return -EINVAL;
5266
5267         wiphy = &rdev->wiphy;
5268
5269         if (!rdev->ops->scan)
5270                 return -EOPNOTSUPP;
5271
5272         if (rdev->scan_req) {
5273                 err = -EBUSY;
5274                 goto unlock;
5275         }
5276
5277         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
5278                 n_channels = validate_scan_freqs(
5279                                 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
5280                 if (!n_channels) {
5281                         err = -EINVAL;
5282                         goto unlock;
5283                 }
5284         } else {
5285                 enum ieee80211_band band;
5286                 n_channels = 0;
5287
5288                 for (band = 0; band < IEEE80211_NUM_BANDS; band++)
5289                         if (wiphy->bands[band])
5290                                 n_channels += wiphy->bands[band]->n_channels;
5291         }
5292
5293         if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
5294                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
5295                         n_ssids++;
5296
5297         if (n_ssids > wiphy->max_scan_ssids) {
5298                 err = -EINVAL;
5299                 goto unlock;
5300         }
5301
5302         if (info->attrs[NL80211_ATTR_IE])
5303                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
5304         else
5305                 ie_len = 0;
5306
5307         if (ie_len > wiphy->max_scan_ie_len) {
5308                 err = -EINVAL;
5309                 goto unlock;
5310         }
5311
5312         request = kzalloc(sizeof(*request)
5313                         + sizeof(*request->ssids) * n_ssids
5314                         + sizeof(*request->channels) * n_channels
5315                         + ie_len, GFP_KERNEL);
5316         if (!request) {
5317                 err = -ENOMEM;
5318                 goto unlock;
5319         }
5320
5321         if (n_ssids)
5322                 request->ssids = (void *)&request->channels[n_channels];
5323         request->n_ssids = n_ssids;
5324         if (ie_len) {
5325                 if (request->ssids)
5326                         request->ie = (void *)(request->ssids + n_ssids);
5327                 else
5328                         request->ie = (void *)(request->channels + n_channels);
5329         }
5330
5331         i = 0;
5332         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
5333                 /* user specified, bail out if channel not found */
5334                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) {
5335                         struct ieee80211_channel *chan;
5336
5337                         chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
5338
5339                         if (!chan) {
5340                                 err = -EINVAL;
5341                                 goto out_free;
5342                         }
5343
5344                         /* ignore disabled channels */
5345                         if (chan->flags & IEEE80211_CHAN_DISABLED)
5346                                 continue;
5347
5348                         request->channels[i] = chan;
5349                         i++;
5350                 }
5351         } else {
5352                 enum ieee80211_band band;
5353
5354                 /* all channels */
5355                 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
5356                         int j;
5357                         if (!wiphy->bands[band])
5358                                 continue;
5359                         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
5360                                 struct ieee80211_channel *chan;
5361
5362                                 chan = &wiphy->bands[band]->channels[j];
5363
5364                                 if (chan->flags & IEEE80211_CHAN_DISABLED)
5365                                         continue;
5366
5367                                 request->channels[i] = chan;
5368                                 i++;
5369                         }
5370                 }
5371         }
5372
5373         if (!i) {
5374                 err = -EINVAL;
5375                 goto out_free;
5376         }
5377
5378         request->n_channels = i;
5379
5380         i = 0;
5381         if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) {
5382                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
5383                         if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
5384                                 err = -EINVAL;
5385                                 goto out_free;
5386                         }
5387                         request->ssids[i].ssid_len = nla_len(attr);
5388                         memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
5389                         i++;
5390                 }
5391         }
5392
5393         if (info->attrs[NL80211_ATTR_IE]) {
5394                 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
5395                 memcpy((void *)request->ie,
5396                        nla_data(info->attrs[NL80211_ATTR_IE]),
5397                        request->ie_len);
5398         }
5399
5400         for (i = 0; i < IEEE80211_NUM_BANDS; i++)
5401                 if (wiphy->bands[i])
5402                         request->rates[i] =
5403                                 (1 << wiphy->bands[i]->n_bitrates) - 1;
5404
5405         if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) {
5406                 nla_for_each_nested(attr,
5407                                     info->attrs[NL80211_ATTR_SCAN_SUPP_RATES],
5408                                     tmp) {
5409                         enum ieee80211_band band = nla_type(attr);
5410
5411                         if (band < 0 || band >= IEEE80211_NUM_BANDS) {
5412                                 err = -EINVAL;
5413                                 goto out_free;
5414                         }
5415
5416                         if (!wiphy->bands[band])
5417                                 continue;
5418
5419                         err = ieee80211_get_ratemask(wiphy->bands[band],
5420                                                      nla_data(attr),
5421                                                      nla_len(attr),
5422                                                      &request->rates[band]);
5423                         if (err)
5424                                 goto out_free;
5425                 }
5426         }
5427
5428         if (info->attrs[NL80211_ATTR_SCAN_FLAGS]) {
5429                 request->flags = nla_get_u32(
5430                         info->attrs[NL80211_ATTR_SCAN_FLAGS]);
5431                 if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
5432                     !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) {
5433                         err = -EOPNOTSUPP;
5434                         goto out_free;
5435                 }
5436         }
5437
5438         request->no_cck =
5439                 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
5440
5441         request->wdev = wdev;
5442         request->wiphy = &rdev->wiphy;
5443         request->scan_start = jiffies;
5444
5445         rdev->scan_req = request;
5446         err = rdev_scan(rdev, request);
5447
5448         if (!err) {
5449                 nl80211_send_scan_start(rdev, wdev);
5450                 if (wdev->netdev)
5451                         dev_hold(wdev->netdev);
5452         } else {
5453  out_free:
5454                 rdev->scan_req = NULL;
5455                 kfree(request);
5456         }
5457
5458  unlock:
5459         return err;
5460 }
5461
5462 static int nl80211_start_sched_scan(struct sk_buff *skb,
5463                                     struct genl_info *info)
5464 {
5465         struct cfg80211_sched_scan_request *request;
5466         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5467         struct net_device *dev = info->user_ptr[1];
5468         struct nlattr *attr;
5469         struct wiphy *wiphy;
5470         int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i;
5471         u32 interval;
5472         enum ieee80211_band band;
5473         size_t ie_len;
5474         struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1];
5475
5476         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) ||
5477             !rdev->ops->sched_scan_start)
5478                 return -EOPNOTSUPP;
5479
5480         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
5481                 return -EINVAL;
5482
5483         if (!info->attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
5484                 return -EINVAL;
5485
5486         interval = nla_get_u32(info->attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]);
5487         if (interval == 0)
5488                 return -EINVAL;
5489
5490         wiphy = &rdev->wiphy;
5491
5492         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
5493                 n_channels = validate_scan_freqs(
5494                                 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
5495                 if (!n_channels)
5496                         return -EINVAL;
5497         } else {
5498                 n_channels = 0;
5499
5500                 for (band = 0; band < IEEE80211_NUM_BANDS; band++)
5501                         if (wiphy->bands[band])
5502                                 n_channels += wiphy->bands[band]->n_channels;
5503         }
5504
5505         if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
5506                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS],
5507                                     tmp)
5508                         n_ssids++;
5509
5510         if (n_ssids > wiphy->max_sched_scan_ssids)
5511                 return -EINVAL;
5512
5513         if (info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH])
5514                 nla_for_each_nested(attr,
5515                                     info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
5516                                     tmp)
5517                         n_match_sets++;
5518
5519         if (n_match_sets > wiphy->max_match_sets)
5520                 return -EINVAL;
5521
5522         if (info->attrs[NL80211_ATTR_IE])
5523                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
5524         else
5525                 ie_len = 0;
5526
5527         if (ie_len > wiphy->max_sched_scan_ie_len)
5528                 return -EINVAL;
5529
5530         if (rdev->sched_scan_req) {
5531                 err = -EINPROGRESS;
5532                 goto out;
5533         }
5534
5535         request = kzalloc(sizeof(*request)
5536                         + sizeof(*request->ssids) * n_ssids
5537                         + sizeof(*request->match_sets) * n_match_sets
5538                         + sizeof(*request->channels) * n_channels
5539                         + ie_len, GFP_KERNEL);
5540         if (!request) {
5541                 err = -ENOMEM;
5542                 goto out;
5543         }
5544
5545         if (n_ssids)
5546                 request->ssids = (void *)&request->channels[n_channels];
5547         request->n_ssids = n_ssids;
5548         if (ie_len) {
5549                 if (request->ssids)
5550                         request->ie = (void *)(request->ssids + n_ssids);
5551                 else
5552                         request->ie = (void *)(request->channels + n_channels);
5553         }
5554
5555         if (n_match_sets) {
5556                 if (request->ie)
5557                         request->match_sets = (void *)(request->ie + ie_len);
5558                 else if (request->ssids)
5559                         request->match_sets =
5560                                 (void *)(request->ssids + n_ssids);
5561                 else
5562                         request->match_sets =
5563                                 (void *)(request->channels + n_channels);
5564         }
5565         request->n_match_sets = n_match_sets;
5566
5567         i = 0;
5568         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
5569                 /* user specified, bail out if channel not found */
5570                 nla_for_each_nested(attr,
5571                                     info->attrs[NL80211_ATTR_SCAN_FREQUENCIES],
5572                                     tmp) {
5573                         struct ieee80211_channel *chan;
5574
5575                         chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
5576
5577                         if (!chan) {
5578                                 err = -EINVAL;
5579                                 goto out_free;
5580                         }
5581
5582                         /* ignore disabled channels */
5583                         if (chan->flags & IEEE80211_CHAN_DISABLED)
5584                                 continue;
5585
5586                         request->channels[i] = chan;
5587                         i++;
5588                 }
5589         } else {
5590                 /* all channels */
5591                 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
5592                         int j;
5593                         if (!wiphy->bands[band])
5594                                 continue;
5595                         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
5596                                 struct ieee80211_channel *chan;
5597
5598                                 chan = &wiphy->bands[band]->channels[j];
5599
5600                                 if (chan->flags & IEEE80211_CHAN_DISABLED)
5601                                         continue;
5602
5603                                 request->channels[i] = chan;
5604                                 i++;
5605                         }
5606                 }
5607         }
5608
5609         if (!i) {
5610                 err = -EINVAL;
5611                 goto out_free;
5612         }
5613
5614         request->n_channels = i;
5615
5616         i = 0;
5617         if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) {
5618                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS],
5619                                     tmp) {
5620                         if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
5621                                 err = -EINVAL;
5622                                 goto out_free;
5623                         }
5624                         request->ssids[i].ssid_len = nla_len(attr);
5625                         memcpy(request->ssids[i].ssid, nla_data(attr),
5626                                nla_len(attr));
5627                         i++;
5628                 }
5629         }
5630
5631         i = 0;
5632         if (info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
5633                 nla_for_each_nested(attr,
5634                                     info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
5635                                     tmp) {
5636                         struct nlattr *ssid, *rssi;
5637
5638                         nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
5639                                   nla_data(attr), nla_len(attr),
5640                                   nl80211_match_policy);
5641                         ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
5642                         if (ssid) {
5643                                 if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) {
5644                                         err = -EINVAL;
5645                                         goto out_free;
5646                                 }
5647                                 memcpy(request->match_sets[i].ssid.ssid,
5648                                        nla_data(ssid), nla_len(ssid));
5649                                 request->match_sets[i].ssid.ssid_len =
5650                                         nla_len(ssid);
5651                         }
5652                         rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
5653                         if (rssi)
5654                                 request->rssi_thold = nla_get_u32(rssi);
5655                         else
5656                                 request->rssi_thold =
5657                                                    NL80211_SCAN_RSSI_THOLD_OFF;
5658                         i++;
5659                 }
5660         }
5661
5662         if (info->attrs[NL80211_ATTR_IE]) {
5663                 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
5664                 memcpy((void *)request->ie,
5665                        nla_data(info->attrs[NL80211_ATTR_IE]),
5666                        request->ie_len);
5667         }
5668
5669         if (info->attrs[NL80211_ATTR_SCAN_FLAGS]) {
5670                 request->flags = nla_get_u32(
5671                         info->attrs[NL80211_ATTR_SCAN_FLAGS]);
5672                 if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
5673                     !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) {
5674                         err = -EOPNOTSUPP;
5675                         goto out_free;
5676                 }
5677         }
5678
5679         request->dev = dev;
5680         request->wiphy = &rdev->wiphy;
5681         request->interval = interval;
5682         request->scan_start = jiffies;
5683
5684         err = rdev_sched_scan_start(rdev, dev, request);
5685         if (!err) {
5686                 rdev->sched_scan_req = request;
5687                 nl80211_send_sched_scan(rdev, dev,
5688                                         NL80211_CMD_START_SCHED_SCAN);
5689                 goto out;
5690         }
5691
5692 out_free:
5693         kfree(request);
5694 out:
5695         return err;
5696 }
5697
5698 static int nl80211_stop_sched_scan(struct sk_buff *skb,
5699                                    struct genl_info *info)
5700 {
5701         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5702
5703         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) ||
5704             !rdev->ops->sched_scan_stop)
5705                 return -EOPNOTSUPP;
5706
5707         return __cfg80211_stop_sched_scan(rdev, false);
5708 }
5709
5710 static int nl80211_start_radar_detection(struct sk_buff *skb,
5711                                          struct genl_info *info)
5712 {
5713         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5714         struct net_device *dev = info->user_ptr[1];
5715         struct wireless_dev *wdev = dev->ieee80211_ptr;
5716         struct cfg80211_chan_def chandef;
5717         enum nl80211_dfs_regions dfs_region;
5718         int err;
5719
5720         dfs_region = reg_get_dfs_region(wdev->wiphy);
5721         if (dfs_region == NL80211_DFS_UNSET)
5722                 return -EINVAL;
5723
5724         err = nl80211_parse_chandef(rdev, info, &chandef);
5725         if (err)
5726                 return err;
5727
5728         if (netif_carrier_ok(dev))
5729                 return -EBUSY;
5730
5731         if (wdev->cac_started)
5732                 return -EBUSY;
5733
5734         err = cfg80211_chandef_dfs_required(wdev->wiphy, &chandef);
5735         if (err < 0)
5736                 return err;
5737
5738         if (err == 0)
5739                 return -EINVAL;
5740
5741         if (!cfg80211_chandef_dfs_usable(wdev->wiphy, &chandef))
5742                 return -EINVAL;
5743
5744         if (!rdev->ops->start_radar_detection)
5745                 return -EOPNOTSUPP;
5746
5747         err = cfg80211_can_use_iftype_chan(rdev, wdev, wdev->iftype,
5748                                            chandef.chan, CHAN_MODE_SHARED,
5749                                            BIT(chandef.width));
5750         if (err)
5751                 return err;
5752
5753         err = rdev->ops->start_radar_detection(&rdev->wiphy, dev, &chandef);
5754         if (!err) {
5755                 wdev->channel = chandef.chan;
5756                 wdev->cac_started = true;
5757                 wdev->cac_start_time = jiffies;
5758         }
5759         return err;
5760 }
5761
5762 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
5763 {
5764         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5765         struct net_device *dev = info->user_ptr[1];
5766         struct wireless_dev *wdev = dev->ieee80211_ptr;
5767         struct cfg80211_csa_settings params;
5768         /* csa_attrs is defined static to avoid waste of stack size - this
5769          * function is called under RTNL lock, so this should not be a problem.
5770          */
5771         static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1];
5772         u8 radar_detect_width = 0;
5773         int err;
5774         bool need_new_beacon = false;
5775
5776         if (!rdev->ops->channel_switch ||
5777             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
5778                 return -EOPNOTSUPP;
5779
5780         switch (dev->ieee80211_ptr->iftype) {
5781         case NL80211_IFTYPE_AP:
5782         case NL80211_IFTYPE_P2P_GO:
5783                 need_new_beacon = true;
5784
5785                 /* useless if AP is not running */
5786                 if (!wdev->beacon_interval)
5787                         return -EINVAL;
5788                 break;
5789         case NL80211_IFTYPE_ADHOC:
5790         case NL80211_IFTYPE_MESH_POINT:
5791                 break;
5792         default:
5793                 return -EOPNOTSUPP;
5794         }
5795
5796         memset(&params, 0, sizeof(params));
5797
5798         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
5799             !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT])
5800                 return -EINVAL;
5801
5802         /* only important for AP, IBSS and mesh create IEs internally */
5803         if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES])
5804                 return -EINVAL;
5805
5806         params.count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]);
5807
5808         if (!need_new_beacon)
5809                 goto skip_beacons;
5810
5811         err = nl80211_parse_beacon(info->attrs, &params.beacon_after);
5812         if (err)
5813                 return err;
5814
5815         err = nla_parse_nested(csa_attrs, NL80211_ATTR_MAX,
5816                                info->attrs[NL80211_ATTR_CSA_IES],
5817                                nl80211_policy);
5818         if (err)
5819                 return err;
5820
5821         err = nl80211_parse_beacon(csa_attrs, &params.beacon_csa);
5822         if (err)
5823                 return err;
5824
5825         if (!csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON])
5826                 return -EINVAL;
5827
5828         params.counter_offset_beacon =
5829                 nla_get_u16(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]);
5830         if (params.counter_offset_beacon >= params.beacon_csa.tail_len)
5831                 return -EINVAL;
5832
5833         /* sanity check - counters should be the same */
5834         if (params.beacon_csa.tail[params.counter_offset_beacon] !=
5835             params.count)
5836                 return -EINVAL;
5837
5838         if (csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]) {
5839                 params.counter_offset_presp =
5840                         nla_get_u16(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]);
5841                 if (params.counter_offset_presp >=
5842                     params.beacon_csa.probe_resp_len)
5843                         return -EINVAL;
5844
5845                 if (params.beacon_csa.probe_resp[params.counter_offset_presp] !=
5846                     params.count)
5847                         return -EINVAL;
5848         }
5849
5850 skip_beacons:
5851         err = nl80211_parse_chandef(rdev, info, &params.chandef);
5852         if (err)
5853                 return err;
5854
5855         if (!cfg80211_reg_can_beacon(&rdev->wiphy, &params.chandef))
5856                 return -EINVAL;
5857
5858         if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP ||
5859             dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO ||
5860             dev->ieee80211_ptr->iftype == NL80211_IFTYPE_ADHOC) {
5861                 err = cfg80211_chandef_dfs_required(wdev->wiphy,
5862                                                     &params.chandef);
5863                 if (err < 0) {
5864                         return err;
5865                 } else if (err) {
5866                         radar_detect_width = BIT(params.chandef.width);
5867                         params.radar_required = true;
5868                 }
5869         }
5870
5871         err = cfg80211_can_use_iftype_chan(rdev, wdev, wdev->iftype,
5872                                            params.chandef.chan,
5873                                            CHAN_MODE_SHARED,
5874                                            radar_detect_width);
5875         if (err)
5876                 return err;
5877
5878         if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
5879                 params.block_tx = true;
5880
5881         wdev_lock(wdev);
5882         err = rdev_channel_switch(rdev, dev, &params);
5883         wdev_unlock(wdev);
5884
5885         return err;
5886 }
5887
5888 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
5889                             u32 seq, int flags,
5890                             struct cfg80211_registered_device *rdev,
5891                             struct wireless_dev *wdev,
5892                             struct cfg80211_internal_bss *intbss)
5893 {
5894         struct cfg80211_bss *res = &intbss->pub;
5895         const struct cfg80211_bss_ies *ies;
5896         void *hdr;
5897         struct nlattr *bss;
5898         bool tsf = false;
5899
5900         ASSERT_WDEV_LOCK(wdev);
5901
5902         hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
5903                              NL80211_CMD_NEW_SCAN_RESULTS);
5904         if (!hdr)
5905                 return -1;
5906
5907         genl_dump_check_consistent(cb, hdr, &nl80211_fam);
5908
5909         if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation))
5910                 goto nla_put_failure;
5911         if (wdev->netdev &&
5912             nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex))
5913                 goto nla_put_failure;
5914         if (nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
5915                 goto nla_put_failure;
5916
5917         bss = nla_nest_start(msg, NL80211_ATTR_BSS);
5918         if (!bss)
5919                 goto nla_put_failure;
5920         if ((!is_zero_ether_addr(res->bssid) &&
5921              nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid)))
5922                 goto nla_put_failure;
5923
5924         rcu_read_lock();
5925         ies = rcu_dereference(res->ies);
5926         if (ies) {
5927                 if (nla_put_u64(msg, NL80211_BSS_TSF, ies->tsf))
5928                         goto fail_unlock_rcu;
5929                 tsf = true;
5930                 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS,
5931                                         ies->len, ies->data))
5932                         goto fail_unlock_rcu;
5933         }
5934         ies = rcu_dereference(res->beacon_ies);
5935         if (ies) {
5936                 if (!tsf && nla_put_u64(msg, NL80211_BSS_TSF, ies->tsf))
5937                         goto fail_unlock_rcu;
5938                 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES,
5939                                         ies->len, ies->data))
5940                         goto fail_unlock_rcu;
5941         }
5942         rcu_read_unlock();
5943
5944         if (res->beacon_interval &&
5945             nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval))
5946                 goto nla_put_failure;
5947         if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) ||
5948             nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) ||
5949             nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) ||
5950             nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO,
5951                         jiffies_to_msecs(jiffies - intbss->ts)))
5952                 goto nla_put_failure;
5953
5954         switch (rdev->wiphy.signal_type) {
5955         case CFG80211_SIGNAL_TYPE_MBM:
5956                 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal))
5957                         goto nla_put_failure;
5958                 break;
5959         case CFG80211_SIGNAL_TYPE_UNSPEC:
5960                 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal))
5961                         goto nla_put_failure;
5962                 break;
5963         default:
5964                 break;
5965         }
5966
5967         switch (wdev->iftype) {
5968         case NL80211_IFTYPE_P2P_CLIENT:
5969         case NL80211_IFTYPE_STATION:
5970                 if (intbss == wdev->current_bss &&
5971                     nla_put_u32(msg, NL80211_BSS_STATUS,
5972                                 NL80211_BSS_STATUS_ASSOCIATED))
5973                         goto nla_put_failure;
5974                 break;
5975         case NL80211_IFTYPE_ADHOC:
5976                 if (intbss == wdev->current_bss &&
5977                     nla_put_u32(msg, NL80211_BSS_STATUS,
5978                                 NL80211_BSS_STATUS_IBSS_JOINED))
5979                         goto nla_put_failure;
5980                 break;
5981         default:
5982                 break;
5983         }
5984
5985         nla_nest_end(msg, bss);
5986
5987         return genlmsg_end(msg, hdr);
5988
5989  fail_unlock_rcu:
5990         rcu_read_unlock();
5991  nla_put_failure:
5992         genlmsg_cancel(msg, hdr);
5993         return -EMSGSIZE;
5994 }
5995
5996 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb)
5997 {
5998         struct cfg80211_registered_device *rdev;
5999         struct cfg80211_internal_bss *scan;
6000         struct wireless_dev *wdev;
6001         int start = cb->args[2], idx = 0;
6002         int err;
6003
6004         err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
6005         if (err)
6006                 return err;
6007
6008         wdev_lock(wdev);
6009         spin_lock_bh(&rdev->bss_lock);
6010         cfg80211_bss_expire(rdev);
6011
6012         cb->seq = rdev->bss_generation;
6013
6014         list_for_each_entry(scan, &rdev->bss_list, list) {
6015                 if (++idx <= start)
6016                         continue;
6017                 if (nl80211_send_bss(skb, cb,
6018                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
6019                                 rdev, wdev, scan) < 0) {
6020                         idx--;
6021                         break;
6022                 }
6023         }
6024
6025         spin_unlock_bh(&rdev->bss_lock);
6026         wdev_unlock(wdev);
6027
6028         cb->args[2] = idx;
6029         nl80211_finish_wdev_dump(rdev);
6030
6031         return skb->len;
6032 }
6033
6034 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq,
6035                                 int flags, struct net_device *dev,
6036                                 struct survey_info *survey)
6037 {
6038         void *hdr;
6039         struct nlattr *infoattr;
6040
6041         hdr = nl80211hdr_put(msg, portid, seq, flags,
6042                              NL80211_CMD_NEW_SURVEY_RESULTS);
6043         if (!hdr)
6044                 return -ENOMEM;
6045
6046         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
6047                 goto nla_put_failure;
6048
6049         infoattr = nla_nest_start(msg, NL80211_ATTR_SURVEY_INFO);
6050         if (!infoattr)
6051                 goto nla_put_failure;
6052
6053         if (nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY,
6054                         survey->channel->center_freq))
6055                 goto nla_put_failure;
6056
6057         if ((survey->filled & SURVEY_INFO_NOISE_DBM) &&
6058             nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise))
6059                 goto nla_put_failure;
6060         if ((survey->filled & SURVEY_INFO_IN_USE) &&
6061             nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE))
6062                 goto nla_put_failure;
6063         if ((survey->filled & SURVEY_INFO_CHANNEL_TIME) &&
6064             nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME,
6065                         survey->channel_time))
6066                 goto nla_put_failure;
6067         if ((survey->filled & SURVEY_INFO_CHANNEL_TIME_BUSY) &&
6068             nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY,
6069                         survey->channel_time_busy))
6070                 goto nla_put_failure;
6071         if ((survey->filled & SURVEY_INFO_CHANNEL_TIME_EXT_BUSY) &&
6072             nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY,
6073                         survey->channel_time_ext_busy))
6074                 goto nla_put_failure;
6075         if ((survey->filled & SURVEY_INFO_CHANNEL_TIME_RX) &&
6076             nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_RX,
6077                         survey->channel_time_rx))
6078                 goto nla_put_failure;
6079         if ((survey->filled & SURVEY_INFO_CHANNEL_TIME_TX) &&
6080             nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_TX,
6081                         survey->channel_time_tx))
6082                 goto nla_put_failure;
6083
6084         nla_nest_end(msg, infoattr);
6085
6086         return genlmsg_end(msg, hdr);
6087
6088  nla_put_failure:
6089         genlmsg_cancel(msg, hdr);
6090         return -EMSGSIZE;
6091 }
6092
6093 static int nl80211_dump_survey(struct sk_buff *skb,
6094                         struct netlink_callback *cb)
6095 {
6096         struct survey_info survey;
6097         struct cfg80211_registered_device *dev;
6098         struct wireless_dev *wdev;
6099         int survey_idx = cb->args[2];
6100         int res;
6101
6102         res = nl80211_prepare_wdev_dump(skb, cb, &dev, &wdev);
6103         if (res)
6104                 return res;
6105
6106         if (!wdev->netdev) {
6107                 res = -EINVAL;
6108                 goto out_err;
6109         }
6110
6111         if (!dev->ops->dump_survey) {
6112                 res = -EOPNOTSUPP;
6113                 goto out_err;
6114         }
6115
6116         while (1) {
6117                 struct ieee80211_channel *chan;
6118
6119                 res = rdev_dump_survey(dev, wdev->netdev, survey_idx, &survey);
6120                 if (res == -ENOENT)
6121                         break;
6122                 if (res)
6123                         goto out_err;
6124
6125                 /* Survey without a channel doesn't make sense */
6126                 if (!survey.channel) {
6127                         res = -EINVAL;
6128                         goto out;
6129                 }
6130
6131                 chan = ieee80211_get_channel(&dev->wiphy,
6132                                              survey.channel->center_freq);
6133                 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) {
6134                         survey_idx++;
6135                         continue;
6136                 }
6137
6138                 if (nl80211_send_survey(skb,
6139                                 NETLINK_CB(cb->skb).portid,
6140                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
6141                                 wdev->netdev, &survey) < 0)
6142                         goto out;
6143                 survey_idx++;
6144         }
6145
6146  out:
6147         cb->args[2] = survey_idx;
6148         res = skb->len;
6149  out_err:
6150         nl80211_finish_wdev_dump(dev);
6151         return res;
6152 }
6153
6154 static bool nl80211_valid_wpa_versions(u32 wpa_versions)
6155 {
6156         return !(wpa_versions & ~(NL80211_WPA_VERSION_1 |
6157                                   NL80211_WPA_VERSION_2));
6158 }
6159
6160 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
6161 {
6162         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6163         struct net_device *dev = info->user_ptr[1];
6164         struct ieee80211_channel *chan;
6165         const u8 *bssid, *ssid, *ie = NULL, *sae_data = NULL;
6166         int err, ssid_len, ie_len = 0, sae_data_len = 0;
6167         enum nl80211_auth_type auth_type;
6168         struct key_parse key;
6169         bool local_state_change;
6170
6171         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6172                 return -EINVAL;
6173
6174         if (!info->attrs[NL80211_ATTR_MAC])
6175                 return -EINVAL;
6176
6177         if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
6178                 return -EINVAL;
6179
6180         if (!info->attrs[NL80211_ATTR_SSID])
6181                 return -EINVAL;
6182
6183         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
6184                 return -EINVAL;
6185
6186         err = nl80211_parse_key(info, &key);
6187         if (err)
6188                 return err;
6189
6190         if (key.idx >= 0) {
6191                 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP)
6192                         return -EINVAL;
6193                 if (!key.p.key || !key.p.key_len)
6194                         return -EINVAL;
6195                 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 ||
6196                      key.p.key_len != WLAN_KEY_LEN_WEP40) &&
6197                     (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 ||
6198                      key.p.key_len != WLAN_KEY_LEN_WEP104))
6199                         return -EINVAL;
6200                 if (key.idx > 4)
6201                         return -EINVAL;
6202         } else {
6203                 key.p.key_len = 0;
6204                 key.p.key = NULL;
6205         }
6206
6207         if (key.idx >= 0) {
6208                 int i;
6209                 bool ok = false;
6210                 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) {
6211                         if (key.p.cipher == rdev->wiphy.cipher_suites[i]) {
6212                                 ok = true;
6213                                 break;
6214                         }
6215                 }
6216                 if (!ok)
6217                         return -EINVAL;
6218         }
6219
6220         if (!rdev->ops->auth)
6221                 return -EOPNOTSUPP;
6222
6223         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
6224             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
6225                 return -EOPNOTSUPP;
6226
6227         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
6228         chan = ieee80211_get_channel(&rdev->wiphy,
6229                 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
6230         if (!chan || (chan->flags & IEEE80211_CHAN_DISABLED))
6231                 return -EINVAL;
6232
6233         ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
6234         ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
6235
6236         if (info->attrs[NL80211_ATTR_IE]) {
6237                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
6238                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6239         }
6240
6241         auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
6242         if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE))
6243                 return -EINVAL;
6244
6245         if (auth_type == NL80211_AUTHTYPE_SAE &&
6246             !info->attrs[NL80211_ATTR_SAE_DATA])
6247                 return -EINVAL;
6248
6249         if (info->attrs[NL80211_ATTR_SAE_DATA]) {
6250                 if (auth_type != NL80211_AUTHTYPE_SAE)
6251                         return -EINVAL;
6252                 sae_data = nla_data(info->attrs[NL80211_ATTR_SAE_DATA]);
6253                 sae_data_len = nla_len(info->attrs[NL80211_ATTR_SAE_DATA]);
6254                 /* need to include at least Auth Transaction and Status Code */
6255                 if (sae_data_len < 4)
6256                         return -EINVAL;
6257         }
6258
6259         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
6260
6261         /*
6262          * Since we no longer track auth state, ignore
6263          * requests to only change local state.
6264          */
6265         if (local_state_change)
6266                 return 0;
6267
6268         wdev_lock(dev->ieee80211_ptr);
6269         err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
6270                                  ssid, ssid_len, ie, ie_len,
6271                                  key.p.key, key.p.key_len, key.idx,
6272                                  sae_data, sae_data_len);
6273         wdev_unlock(dev->ieee80211_ptr);
6274         return err;
6275 }
6276
6277 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
6278                                    struct genl_info *info,
6279                                    struct cfg80211_crypto_settings *settings,
6280                                    int cipher_limit)
6281 {
6282         memset(settings, 0, sizeof(*settings));
6283
6284         settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
6285
6286         if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
6287                 u16 proto;
6288                 proto = nla_get_u16(
6289                         info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
6290                 settings->control_port_ethertype = cpu_to_be16(proto);
6291                 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
6292                     proto != ETH_P_PAE)
6293                         return -EINVAL;
6294                 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT])
6295                         settings->control_port_no_encrypt = true;
6296         } else
6297                 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE);
6298
6299         if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
6300                 void *data;
6301                 int len, i;
6302
6303                 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
6304                 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
6305                 settings->n_ciphers_pairwise = len / sizeof(u32);
6306
6307                 if (len % sizeof(u32))
6308                         return -EINVAL;
6309
6310                 if (settings->n_ciphers_pairwise > cipher_limit)
6311                         return -EINVAL;
6312
6313                 memcpy(settings->ciphers_pairwise, data, len);
6314
6315                 for (i = 0; i < settings->n_ciphers_pairwise; i++)
6316                         if (!cfg80211_supported_cipher_suite(
6317                                         &rdev->wiphy,
6318                                         settings->ciphers_pairwise[i]))
6319                                 return -EINVAL;
6320         }
6321
6322         if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
6323                 settings->cipher_group =
6324                         nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
6325                 if (!cfg80211_supported_cipher_suite(&rdev->wiphy,
6326                                                      settings->cipher_group))
6327                         return -EINVAL;
6328         }
6329
6330         if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) {
6331                 settings->wpa_versions =
6332                         nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
6333                 if (!nl80211_valid_wpa_versions(settings->wpa_versions))
6334                         return -EINVAL;
6335         }
6336
6337         if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
6338                 void *data;
6339                 int len;
6340
6341                 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
6342                 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
6343                 settings->n_akm_suites = len / sizeof(u32);
6344
6345                 if (len % sizeof(u32))
6346                         return -EINVAL;
6347
6348                 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
6349                         return -EINVAL;
6350
6351                 memcpy(settings->akm_suites, data, len);
6352         }
6353
6354         return 0;
6355 }
6356
6357 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
6358 {
6359         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6360         struct net_device *dev = info->user_ptr[1];
6361         struct ieee80211_channel *chan;
6362         struct cfg80211_assoc_request req = {};
6363         const u8 *bssid, *ssid;
6364         int err, ssid_len = 0;
6365
6366         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6367                 return -EINVAL;
6368
6369         if (!info->attrs[NL80211_ATTR_MAC] ||
6370             !info->attrs[NL80211_ATTR_SSID] ||
6371             !info->attrs[NL80211_ATTR_WIPHY_FREQ])
6372                 return -EINVAL;
6373
6374         if (!rdev->ops->assoc)
6375                 return -EOPNOTSUPP;
6376
6377         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
6378             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
6379                 return -EOPNOTSUPP;
6380
6381         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
6382
6383         chan = ieee80211_get_channel(&rdev->wiphy,
6384                 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
6385         if (!chan || (chan->flags & IEEE80211_CHAN_DISABLED))
6386                 return -EINVAL;
6387
6388         ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
6389         ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
6390
6391         if (info->attrs[NL80211_ATTR_IE]) {
6392                 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
6393                 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6394         }
6395
6396         if (info->attrs[NL80211_ATTR_USE_MFP]) {
6397                 enum nl80211_mfp mfp =
6398                         nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
6399                 if (mfp == NL80211_MFP_REQUIRED)
6400                         req.use_mfp = true;
6401                 else if (mfp != NL80211_MFP_NO)
6402                         return -EINVAL;
6403         }
6404
6405         if (info->attrs[NL80211_ATTR_PREV_BSSID])
6406                 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
6407
6408         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
6409                 req.flags |= ASSOC_REQ_DISABLE_HT;
6410
6411         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
6412                 memcpy(&req.ht_capa_mask,
6413                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
6414                        sizeof(req.ht_capa_mask));
6415
6416         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
6417                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
6418                         return -EINVAL;
6419                 memcpy(&req.ht_capa,
6420                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
6421                        sizeof(req.ht_capa));
6422         }
6423
6424         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
6425                 req.flags |= ASSOC_REQ_DISABLE_VHT;
6426
6427         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
6428                 memcpy(&req.vht_capa_mask,
6429                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
6430                        sizeof(req.vht_capa_mask));
6431
6432         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
6433                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
6434                         return -EINVAL;
6435                 memcpy(&req.vht_capa,
6436                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
6437                        sizeof(req.vht_capa));
6438         }
6439
6440         err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
6441         if (!err) {
6442                 wdev_lock(dev->ieee80211_ptr);
6443                 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid,
6444                                           ssid, ssid_len, &req);
6445                 wdev_unlock(dev->ieee80211_ptr);
6446         }
6447
6448         return err;
6449 }
6450
6451 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
6452 {
6453         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6454         struct net_device *dev = info->user_ptr[1];
6455         const u8 *ie = NULL, *bssid;
6456         int ie_len = 0, err;
6457         u16 reason_code;
6458         bool local_state_change;
6459
6460         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6461                 return -EINVAL;
6462
6463         if (!info->attrs[NL80211_ATTR_MAC])
6464                 return -EINVAL;
6465
6466         if (!info->attrs[NL80211_ATTR_REASON_CODE])
6467                 return -EINVAL;
6468
6469         if (!rdev->ops->deauth)
6470                 return -EOPNOTSUPP;
6471
6472         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
6473             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
6474                 return -EOPNOTSUPP;
6475
6476         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
6477
6478         reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
6479         if (reason_code == 0) {
6480                 /* Reason Code 0 is reserved */
6481                 return -EINVAL;
6482         }
6483
6484         if (info->attrs[NL80211_ATTR_IE]) {
6485                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
6486                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6487         }
6488
6489         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
6490
6491         wdev_lock(dev->ieee80211_ptr);
6492         err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code,
6493                                    local_state_change);
6494         wdev_unlock(dev->ieee80211_ptr);
6495         return err;
6496 }
6497
6498 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
6499 {
6500         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6501         struct net_device *dev = info->user_ptr[1];
6502         const u8 *ie = NULL, *bssid;
6503         int ie_len = 0, err;
6504         u16 reason_code;
6505         bool local_state_change;
6506
6507         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6508                 return -EINVAL;
6509
6510         if (!info->attrs[NL80211_ATTR_MAC])
6511                 return -EINVAL;
6512
6513         if (!info->attrs[NL80211_ATTR_REASON_CODE])
6514                 return -EINVAL;
6515
6516         if (!rdev->ops->disassoc)
6517                 return -EOPNOTSUPP;
6518
6519         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
6520             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
6521                 return -EOPNOTSUPP;
6522
6523         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
6524
6525         reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
6526         if (reason_code == 0) {
6527                 /* Reason Code 0 is reserved */
6528                 return -EINVAL;
6529         }
6530
6531         if (info->attrs[NL80211_ATTR_IE]) {
6532                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
6533                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6534         }
6535
6536         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
6537
6538         wdev_lock(dev->ieee80211_ptr);
6539         err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code,
6540                                      local_state_change);
6541         wdev_unlock(dev->ieee80211_ptr);
6542         return err;
6543 }
6544
6545 static bool
6546 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev,
6547                          int mcast_rate[IEEE80211_NUM_BANDS],
6548                          int rateval)
6549 {
6550         struct wiphy *wiphy = &rdev->wiphy;
6551         bool found = false;
6552         int band, i;
6553
6554         for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
6555                 struct ieee80211_supported_band *sband;
6556
6557                 sband = wiphy->bands[band];
6558                 if (!sband)
6559                         continue;
6560
6561                 for (i = 0; i < sband->n_bitrates; i++) {
6562                         if (sband->bitrates[i].bitrate == rateval) {
6563                                 mcast_rate[band] = i + 1;
6564                                 found = true;
6565                                 break;
6566                         }
6567                 }
6568         }
6569
6570         return found;
6571 }
6572
6573 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
6574 {
6575         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6576         struct net_device *dev = info->user_ptr[1];
6577         struct cfg80211_ibss_params ibss;
6578         struct wiphy *wiphy;
6579         struct cfg80211_cached_keys *connkeys = NULL;
6580         int err;
6581
6582         memset(&ibss, 0, sizeof(ibss));
6583
6584         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6585                 return -EINVAL;
6586
6587         if (!info->attrs[NL80211_ATTR_SSID] ||
6588             !nla_len(info->attrs[NL80211_ATTR_SSID]))
6589                 return -EINVAL;
6590
6591         ibss.beacon_interval = 100;
6592
6593         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
6594                 ibss.beacon_interval =
6595                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
6596                 if (ibss.beacon_interval < 1 || ibss.beacon_interval > 10000)
6597                         return -EINVAL;
6598         }
6599
6600         if (!rdev->ops->join_ibss)
6601                 return -EOPNOTSUPP;
6602
6603         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
6604                 return -EOPNOTSUPP;
6605
6606         wiphy = &rdev->wiphy;
6607
6608         if (info->attrs[NL80211_ATTR_MAC]) {
6609                 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
6610
6611                 if (!is_valid_ether_addr(ibss.bssid))
6612                         return -EINVAL;
6613         }
6614         ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
6615         ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
6616
6617         if (info->attrs[NL80211_ATTR_IE]) {
6618                 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
6619                 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6620         }
6621
6622         err = nl80211_parse_chandef(rdev, info, &ibss.chandef);
6623         if (err)
6624                 return err;
6625
6626         if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef))
6627                 return -EINVAL;
6628
6629         switch (ibss.chandef.width) {
6630         case NL80211_CHAN_WIDTH_5:
6631         case NL80211_CHAN_WIDTH_10:
6632         case NL80211_CHAN_WIDTH_20_NOHT:
6633                 break;
6634         case NL80211_CHAN_WIDTH_20:
6635         case NL80211_CHAN_WIDTH_40:
6636                 if (rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)
6637                         break;
6638         default:
6639                 return -EINVAL;
6640         }
6641
6642         ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
6643         ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
6644
6645         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
6646                 u8 *rates =
6647                         nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
6648                 int n_rates =
6649                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
6650                 struct ieee80211_supported_band *sband =
6651                         wiphy->bands[ibss.chandef.chan->band];
6652
6653                 err = ieee80211_get_ratemask(sband, rates, n_rates,
6654                                              &ibss.basic_rates);
6655                 if (err)
6656                         return err;
6657         }
6658
6659         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
6660                 memcpy(&ibss.ht_capa_mask,
6661                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
6662                        sizeof(ibss.ht_capa_mask));
6663
6664         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
6665                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
6666                         return -EINVAL;
6667                 memcpy(&ibss.ht_capa,
6668                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
6669                        sizeof(ibss.ht_capa));
6670         }
6671
6672         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
6673             !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate,
6674                         nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
6675                 return -EINVAL;
6676
6677         if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
6678                 bool no_ht = false;
6679
6680                 connkeys = nl80211_parse_connkeys(rdev,
6681                                           info->attrs[NL80211_ATTR_KEYS],
6682                                           &no_ht);
6683                 if (IS_ERR(connkeys))
6684                         return PTR_ERR(connkeys);
6685
6686                 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) &&
6687                     no_ht) {
6688                         kfree(connkeys);
6689                         return -EINVAL;
6690                 }
6691         }
6692
6693         ibss.control_port =
6694                 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]);
6695
6696         ibss.userspace_handles_dfs =
6697                 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
6698
6699         err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
6700         if (err)
6701                 kfree(connkeys);
6702         return err;
6703 }
6704
6705 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
6706 {
6707         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6708         struct net_device *dev = info->user_ptr[1];
6709
6710         if (!rdev->ops->leave_ibss)
6711                 return -EOPNOTSUPP;
6712
6713         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
6714                 return -EOPNOTSUPP;
6715
6716         return cfg80211_leave_ibss(rdev, dev, false);
6717 }
6718
6719 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info)
6720 {
6721         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6722         struct net_device *dev = info->user_ptr[1];
6723         int mcast_rate[IEEE80211_NUM_BANDS];
6724         u32 nla_rate;
6725         int err;
6726
6727         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
6728             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
6729                 return -EOPNOTSUPP;
6730
6731         if (!rdev->ops->set_mcast_rate)
6732                 return -EOPNOTSUPP;
6733
6734         memset(mcast_rate, 0, sizeof(mcast_rate));
6735
6736         if (!info->attrs[NL80211_ATTR_MCAST_RATE])
6737                 return -EINVAL;
6738
6739         nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
6740         if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate))
6741                 return -EINVAL;
6742
6743         err = rdev->ops->set_mcast_rate(&rdev->wiphy, dev, mcast_rate);
6744
6745         return err;
6746 }
6747
6748 static struct sk_buff *
6749 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
6750                             int approxlen, u32 portid, u32 seq,
6751                             enum nl80211_commands cmd,
6752                             enum nl80211_attrs attr,
6753                             const struct nl80211_vendor_cmd_info *info,
6754                             gfp_t gfp)
6755 {
6756         struct sk_buff *skb;
6757         void *hdr;
6758         struct nlattr *data;
6759
6760         skb = nlmsg_new(approxlen + 100, gfp);
6761         if (!skb)
6762                 return NULL;
6763
6764         hdr = nl80211hdr_put(skb, portid, seq, 0, cmd);
6765         if (!hdr) {
6766                 kfree_skb(skb);
6767                 return NULL;
6768         }
6769
6770         if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
6771                 goto nla_put_failure;
6772
6773         if (info) {
6774                 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID,
6775                                 info->vendor_id))
6776                         goto nla_put_failure;
6777                 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD,
6778                                 info->subcmd))
6779                         goto nla_put_failure;
6780         }
6781
6782         data = nla_nest_start(skb, attr);
6783
6784         ((void **)skb->cb)[0] = rdev;
6785         ((void **)skb->cb)[1] = hdr;
6786         ((void **)skb->cb)[2] = data;
6787
6788         return skb;
6789
6790  nla_put_failure:
6791         kfree_skb(skb);
6792         return NULL;
6793 }
6794
6795 #ifdef CONFIG_NL80211_TESTMODE
6796 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
6797 {
6798         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6799         struct wireless_dev *wdev =
6800                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
6801         int err;
6802
6803         if (!rdev->ops->testmode_cmd)
6804                 return -EOPNOTSUPP;
6805
6806         if (IS_ERR(wdev)) {
6807                 err = PTR_ERR(wdev);
6808                 if (err != -EINVAL)
6809                         return err;
6810                 wdev = NULL;
6811         } else if (wdev->wiphy != &rdev->wiphy) {
6812                 return -EINVAL;
6813         }
6814
6815         if (!info->attrs[NL80211_ATTR_TESTDATA])
6816                 return -EINVAL;
6817
6818         rdev->cur_cmd_info = info;
6819         err = rdev_testmode_cmd(rdev, wdev,
6820                                 nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
6821                                 nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
6822         rdev->cur_cmd_info = NULL;
6823
6824         return err;
6825 }
6826
6827 static int nl80211_testmode_dump(struct sk_buff *skb,
6828                                  struct netlink_callback *cb)
6829 {
6830         struct cfg80211_registered_device *rdev;
6831         int err;
6832         long phy_idx;
6833         void *data = NULL;
6834         int data_len = 0;
6835
6836         rtnl_lock();
6837
6838         if (cb->args[0]) {
6839                 /*
6840                  * 0 is a valid index, but not valid for args[0],
6841                  * so we need to offset by 1.
6842                  */
6843                 phy_idx = cb->args[0] - 1;
6844         } else {
6845                 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
6846                                   nl80211_fam.attrbuf, nl80211_fam.maxattr,
6847                                   nl80211_policy);
6848                 if (err)
6849                         goto out_err;
6850
6851                 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk),
6852                                                   nl80211_fam.attrbuf);
6853                 if (IS_ERR(rdev)) {
6854                         err = PTR_ERR(rdev);
6855                         goto out_err;
6856                 }
6857                 phy_idx = rdev->wiphy_idx;
6858                 rdev = NULL;
6859
6860                 if (nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA])
6861                         cb->args[1] =
6862                                 (long)nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA];
6863         }
6864
6865         if (cb->args[1]) {
6866                 data = nla_data((void *)cb->args[1]);
6867                 data_len = nla_len((void *)cb->args[1]);
6868         }
6869
6870         rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
6871         if (!rdev) {
6872                 err = -ENOENT;
6873                 goto out_err;
6874         }
6875
6876         if (!rdev->ops->testmode_dump) {
6877                 err = -EOPNOTSUPP;
6878                 goto out_err;
6879         }
6880
6881         while (1) {
6882                 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
6883                                            cb->nlh->nlmsg_seq, NLM_F_MULTI,
6884                                            NL80211_CMD_TESTMODE);
6885                 struct nlattr *tmdata;
6886
6887                 if (!hdr)
6888                         break;
6889
6890                 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) {
6891                         genlmsg_cancel(skb, hdr);
6892                         break;
6893                 }
6894
6895                 tmdata = nla_nest_start(skb, NL80211_ATTR_TESTDATA);
6896                 if (!tmdata) {
6897                         genlmsg_cancel(skb, hdr);
6898                         break;
6899                 }
6900                 err = rdev_testmode_dump(rdev, skb, cb, data, data_len);
6901                 nla_nest_end(skb, tmdata);
6902
6903                 if (err == -ENOBUFS || err == -ENOENT) {
6904                         genlmsg_cancel(skb, hdr);
6905                         break;
6906                 } else if (err) {
6907                         genlmsg_cancel(skb, hdr);
6908                         goto out_err;
6909                 }
6910
6911                 genlmsg_end(skb, hdr);
6912         }
6913
6914         err = skb->len;
6915         /* see above */
6916         cb->args[0] = phy_idx + 1;
6917  out_err:
6918         rtnl_unlock();
6919         return err;
6920 }
6921
6922 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
6923                                            enum nl80211_commands cmd,
6924                                            enum nl80211_attrs attr,
6925                                            int vendor_event_idx,
6926                                            int approxlen, gfp_t gfp)
6927 {
6928         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
6929         const struct nl80211_vendor_cmd_info *info;
6930
6931         switch (cmd) {
6932         case NL80211_CMD_TESTMODE:
6933                 if (WARN_ON(vendor_event_idx != -1))
6934                         return NULL;
6935                 info = NULL;
6936                 break;
6937         case NL80211_CMD_VENDOR:
6938                 if (WARN_ON(vendor_event_idx < 0 ||
6939                             vendor_event_idx >= wiphy->n_vendor_events))
6940                         return NULL;
6941                 info = &wiphy->vendor_events[vendor_event_idx];
6942                 break;
6943         default:
6944                 WARN_ON(1);
6945                 return NULL;
6946         }
6947
6948         return __cfg80211_alloc_vendor_skb(rdev, approxlen, 0, 0,
6949                                            cmd, attr, info, gfp);
6950 }
6951 EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
6952
6953 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
6954 {
6955         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
6956         void *hdr = ((void **)skb->cb)[1];
6957         struct nlattr *data = ((void **)skb->cb)[2];
6958         enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
6959
6960         nla_nest_end(skb, data);
6961         genlmsg_end(skb, hdr);
6962
6963         if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
6964                 mcgrp = NL80211_MCGRP_VENDOR;
6965
6966         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0,
6967                                 mcgrp, gfp);
6968 }
6969 EXPORT_SYMBOL(__cfg80211_send_event_skb);
6970 #endif
6971
6972 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
6973 {
6974         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6975         struct net_device *dev = info->user_ptr[1];
6976         struct cfg80211_connect_params connect;
6977         struct wiphy *wiphy;
6978         struct cfg80211_cached_keys *connkeys = NULL;
6979         int err;
6980
6981         memset(&connect, 0, sizeof(connect));
6982
6983         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6984                 return -EINVAL;
6985
6986         if (!info->attrs[NL80211_ATTR_SSID] ||
6987             !nla_len(info->attrs[NL80211_ATTR_SSID]))
6988                 return -EINVAL;
6989
6990         if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
6991                 connect.auth_type =
6992                         nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
6993                 if (!nl80211_valid_auth_type(rdev, connect.auth_type,
6994                                              NL80211_CMD_CONNECT))
6995                         return -EINVAL;
6996         } else
6997                 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
6998
6999         connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
7000
7001         err = nl80211_crypto_settings(rdev, info, &connect.crypto,
7002                                       NL80211_MAX_NR_CIPHER_SUITES);
7003         if (err)
7004                 return err;
7005
7006         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
7007             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
7008                 return -EOPNOTSUPP;
7009
7010         wiphy = &rdev->wiphy;
7011
7012         connect.bg_scan_period = -1;
7013         if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] &&
7014                 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) {
7015                 connect.bg_scan_period =
7016                         nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]);
7017         }
7018
7019         if (info->attrs[NL80211_ATTR_MAC])
7020                 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
7021         connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
7022         connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
7023
7024         if (info->attrs[NL80211_ATTR_IE]) {
7025                 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
7026                 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
7027         }
7028
7029         if (info->attrs[NL80211_ATTR_USE_MFP]) {
7030                 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
7031                 if (connect.mfp != NL80211_MFP_REQUIRED &&
7032                     connect.mfp != NL80211_MFP_NO)
7033                         return -EINVAL;
7034         } else {
7035                 connect.mfp = NL80211_MFP_NO;
7036         }
7037
7038         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
7039                 connect.channel =
7040                         ieee80211_get_channel(wiphy,
7041                             nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
7042                 if (!connect.channel ||
7043                     connect.channel->flags & IEEE80211_CHAN_DISABLED)
7044                         return -EINVAL;
7045         }
7046
7047         if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
7048                 connkeys = nl80211_parse_connkeys(rdev,
7049                                           info->attrs[NL80211_ATTR_KEYS], NULL);
7050                 if (IS_ERR(connkeys))
7051                         return PTR_ERR(connkeys);
7052         }
7053
7054         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
7055                 connect.flags |= ASSOC_REQ_DISABLE_HT;
7056
7057         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
7058                 memcpy(&connect.ht_capa_mask,
7059                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
7060                        sizeof(connect.ht_capa_mask));
7061
7062         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
7063                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
7064                         kfree(connkeys);
7065                         return -EINVAL;
7066                 }
7067                 memcpy(&connect.ht_capa,
7068                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
7069                        sizeof(connect.ht_capa));
7070         }
7071
7072         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
7073                 connect.flags |= ASSOC_REQ_DISABLE_VHT;
7074
7075         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
7076                 memcpy(&connect.vht_capa_mask,
7077                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
7078                        sizeof(connect.vht_capa_mask));
7079
7080         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
7081                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
7082                         kfree(connkeys);
7083                         return -EINVAL;
7084                 }
7085                 memcpy(&connect.vht_capa,
7086                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
7087                        sizeof(connect.vht_capa));
7088         }
7089
7090         wdev_lock(dev->ieee80211_ptr);
7091         err = cfg80211_connect(rdev, dev, &connect, connkeys, NULL);
7092         wdev_unlock(dev->ieee80211_ptr);
7093         if (err)
7094                 kfree(connkeys);
7095         return err;
7096 }
7097
7098 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
7099 {
7100         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7101         struct net_device *dev = info->user_ptr[1];
7102         u16 reason;
7103         int ret;
7104
7105         if (!info->attrs[NL80211_ATTR_REASON_CODE])
7106                 reason = WLAN_REASON_DEAUTH_LEAVING;
7107         else
7108                 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
7109
7110         if (reason == 0)
7111                 return -EINVAL;
7112
7113         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
7114             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
7115                 return -EOPNOTSUPP;
7116
7117         wdev_lock(dev->ieee80211_ptr);
7118         ret = cfg80211_disconnect(rdev, dev, reason, true);
7119         wdev_unlock(dev->ieee80211_ptr);
7120         return ret;
7121 }
7122
7123 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
7124 {
7125         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7126         struct net *net;
7127         int err;
7128         u32 pid;
7129
7130         if (!info->attrs[NL80211_ATTR_PID])
7131                 return -EINVAL;
7132
7133         pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
7134
7135         net = get_net_ns_by_pid(pid);
7136         if (IS_ERR(net))
7137                 return PTR_ERR(net);
7138
7139         err = 0;
7140
7141         /* check if anything to do */
7142         if (!net_eq(wiphy_net(&rdev->wiphy), net))
7143                 err = cfg80211_switch_netns(rdev, net);
7144
7145         put_net(net);
7146         return err;
7147 }
7148
7149 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
7150 {
7151         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7152         int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev,
7153                         struct cfg80211_pmksa *pmksa) = NULL;
7154         struct net_device *dev = info->user_ptr[1];
7155         struct cfg80211_pmksa pmksa;
7156
7157         memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
7158
7159         if (!info->attrs[NL80211_ATTR_MAC])
7160                 return -EINVAL;
7161
7162         if (!info->attrs[NL80211_ATTR_PMKID])
7163                 return -EINVAL;
7164
7165         pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
7166         pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
7167
7168         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
7169             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
7170                 return -EOPNOTSUPP;
7171
7172         switch (info->genlhdr->cmd) {
7173         case NL80211_CMD_SET_PMKSA:
7174                 rdev_ops = rdev->ops->set_pmksa;
7175                 break;
7176         case NL80211_CMD_DEL_PMKSA:
7177                 rdev_ops = rdev->ops->del_pmksa;
7178                 break;
7179         default:
7180                 WARN_ON(1);
7181                 break;
7182         }
7183
7184         if (!rdev_ops)
7185                 return -EOPNOTSUPP;
7186
7187         return rdev_ops(&rdev->wiphy, dev, &pmksa);
7188 }
7189
7190 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
7191 {
7192         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7193         struct net_device *dev = info->user_ptr[1];
7194
7195         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
7196             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
7197                 return -EOPNOTSUPP;
7198
7199         if (!rdev->ops->flush_pmksa)
7200                 return -EOPNOTSUPP;
7201
7202         return rdev_flush_pmksa(rdev, dev);
7203 }
7204
7205 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
7206 {
7207         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7208         struct net_device *dev = info->user_ptr[1];
7209         u8 action_code, dialog_token;
7210         u16 status_code;
7211         u8 *peer;
7212
7213         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
7214             !rdev->ops->tdls_mgmt)
7215                 return -EOPNOTSUPP;
7216
7217         if (!info->attrs[NL80211_ATTR_TDLS_ACTION] ||
7218             !info->attrs[NL80211_ATTR_STATUS_CODE] ||
7219             !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] ||
7220             !info->attrs[NL80211_ATTR_IE] ||
7221             !info->attrs[NL80211_ATTR_MAC])
7222                 return -EINVAL;
7223
7224         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
7225         action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
7226         status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
7227         dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
7228
7229         return rdev_tdls_mgmt(rdev, dev, peer, action_code,
7230                               dialog_token, status_code,
7231                               nla_data(info->attrs[NL80211_ATTR_IE]),
7232                               nla_len(info->attrs[NL80211_ATTR_IE]));
7233 }
7234
7235 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info)
7236 {
7237         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7238         struct net_device *dev = info->user_ptr[1];
7239         enum nl80211_tdls_operation operation;
7240         u8 *peer;
7241
7242         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
7243             !rdev->ops->tdls_oper)
7244                 return -EOPNOTSUPP;
7245
7246         if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] ||
7247             !info->attrs[NL80211_ATTR_MAC])
7248                 return -EINVAL;
7249
7250         operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]);
7251         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
7252
7253         return rdev_tdls_oper(rdev, dev, peer, operation);
7254 }
7255
7256 static int nl80211_remain_on_channel(struct sk_buff *skb,
7257                                      struct genl_info *info)
7258 {
7259         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7260         struct wireless_dev *wdev = info->user_ptr[1];
7261         struct cfg80211_chan_def chandef;
7262         struct sk_buff *msg;
7263         void *hdr;
7264         u64 cookie;
7265         u32 duration;
7266         int err;
7267
7268         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
7269             !info->attrs[NL80211_ATTR_DURATION])
7270                 return -EINVAL;
7271
7272         duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
7273
7274         if (!rdev->ops->remain_on_channel ||
7275             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL))
7276                 return -EOPNOTSUPP;
7277
7278         /*
7279          * We should be on that channel for at least a minimum amount of
7280          * time (10ms) but no longer than the driver supports.
7281          */
7282         if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
7283             duration > rdev->wiphy.max_remain_on_channel_duration)
7284                 return -EINVAL;
7285
7286         err = nl80211_parse_chandef(rdev, info, &chandef);
7287         if (err)
7288                 return err;
7289
7290         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7291         if (!msg)
7292                 return -ENOMEM;
7293
7294         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
7295                              NL80211_CMD_REMAIN_ON_CHANNEL);
7296         if (!hdr) {
7297                 err = -ENOBUFS;
7298                 goto free_msg;
7299         }
7300
7301         err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
7302                                      duration, &cookie);
7303
7304         if (err)
7305                 goto free_msg;
7306
7307         if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
7308                 goto nla_put_failure;
7309
7310         genlmsg_end(msg, hdr);
7311
7312         return genlmsg_reply(msg, info);
7313
7314  nla_put_failure:
7315         err = -ENOBUFS;
7316  free_msg:
7317         nlmsg_free(msg);
7318         return err;
7319 }
7320
7321 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
7322                                             struct genl_info *info)
7323 {
7324         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7325         struct wireless_dev *wdev = info->user_ptr[1];
7326         u64 cookie;
7327
7328         if (!info->attrs[NL80211_ATTR_COOKIE])
7329                 return -EINVAL;
7330
7331         if (!rdev->ops->cancel_remain_on_channel)
7332                 return -EOPNOTSUPP;
7333
7334         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
7335
7336         return rdev_cancel_remain_on_channel(rdev, wdev, cookie);
7337 }
7338
7339 static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
7340                            u8 *rates, u8 rates_len)
7341 {
7342         u8 i;
7343         u32 mask = 0;
7344
7345         for (i = 0; i < rates_len; i++) {
7346                 int rate = (rates[i] & 0x7f) * 5;
7347                 int ridx;
7348                 for (ridx = 0; ridx < sband->n_bitrates; ridx++) {
7349                         struct ieee80211_rate *srate =
7350                                 &sband->bitrates[ridx];
7351                         if (rate == srate->bitrate) {
7352                                 mask |= 1 << ridx;
7353                                 break;
7354                         }
7355                 }
7356                 if (ridx == sband->n_bitrates)
7357                         return 0; /* rate not found */
7358         }
7359
7360         return mask;
7361 }
7362
7363 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband,
7364                                u8 *rates, u8 rates_len,
7365                                u8 mcs[IEEE80211_HT_MCS_MASK_LEN])
7366 {
7367         u8 i;
7368
7369         memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN);
7370
7371         for (i = 0; i < rates_len; i++) {
7372                 int ridx, rbit;
7373
7374                 ridx = rates[i] / 8;
7375                 rbit = BIT(rates[i] % 8);
7376
7377                 /* check validity */
7378                 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN))
7379                         return false;
7380
7381                 /* check availability */
7382                 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit)
7383                         mcs[ridx] |= rbit;
7384                 else
7385                         return false;
7386         }
7387
7388         return true;
7389 }
7390
7391 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map)
7392 {
7393         u16 mcs_mask = 0;
7394
7395         switch (vht_mcs_map) {
7396         case IEEE80211_VHT_MCS_NOT_SUPPORTED:
7397                 break;
7398         case IEEE80211_VHT_MCS_SUPPORT_0_7:
7399                 mcs_mask = 0x00FF;
7400                 break;
7401         case IEEE80211_VHT_MCS_SUPPORT_0_8:
7402                 mcs_mask = 0x01FF;
7403                 break;
7404         case IEEE80211_VHT_MCS_SUPPORT_0_9:
7405                 mcs_mask = 0x03FF;
7406                 break;
7407         default:
7408                 break;
7409         }
7410
7411         return mcs_mask;
7412 }
7413
7414 static void vht_build_mcs_mask(u16 vht_mcs_map,
7415                                u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
7416 {
7417         u8 nss;
7418
7419         for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
7420                 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03);
7421                 vht_mcs_map >>= 2;
7422         }
7423 }
7424
7425 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband,
7426                              struct nl80211_txrate_vht *txrate,
7427                              u16 mcs[NL80211_VHT_NSS_MAX])
7428 {
7429         u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
7430         u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {};
7431         u8 i;
7432
7433         if (!sband->vht_cap.vht_supported)
7434                 return false;
7435
7436         memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX);
7437
7438         /* Build vht_mcs_mask from VHT capabilities */
7439         vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask);
7440
7441         for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
7442                 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
7443                         mcs[i] = txrate->mcs[i];
7444                 else
7445                         return false;
7446         }
7447
7448         return true;
7449 }
7450
7451 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
7452         [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY,
7453                                     .len = NL80211_MAX_SUPP_RATES },
7454         [NL80211_TXRATE_HT] = { .type = NLA_BINARY,
7455                                 .len = NL80211_MAX_SUPP_HT_RATES },
7456         [NL80211_TXRATE_VHT] = { .len = sizeof(struct nl80211_txrate_vht)},
7457 };
7458
7459 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
7460                                        struct genl_info *info)
7461 {
7462         struct nlattr *tb[NL80211_TXRATE_MAX + 1];
7463         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7464         struct cfg80211_bitrate_mask mask;
7465         int rem, i;
7466         struct net_device *dev = info->user_ptr[1];
7467         struct nlattr *tx_rates;
7468         struct ieee80211_supported_band *sband;
7469         u16 vht_tx_mcs_map;
7470
7471         if (!rdev->ops->set_bitrate_mask)
7472                 return -EOPNOTSUPP;
7473
7474         memset(&mask, 0, sizeof(mask));
7475         /* Default to all rates enabled */
7476         for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
7477                 sband = rdev->wiphy.bands[i];
7478
7479                 if (!sband)
7480                         continue;
7481
7482                 mask.control[i].legacy = (1 << sband->n_bitrates) - 1;
7483                 memcpy(mask.control[i].ht_mcs,
7484                        sband->ht_cap.mcs.rx_mask,
7485                        sizeof(mask.control[i].ht_mcs));
7486
7487                 if (!sband->vht_cap.vht_supported)
7488                         continue;
7489
7490                 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
7491                 vht_build_mcs_mask(vht_tx_mcs_map, mask.control[i].vht_mcs);
7492         }
7493
7494         /* if no rates are given set it back to the defaults */
7495         if (!info->attrs[NL80211_ATTR_TX_RATES])
7496                 goto out;
7497
7498         /*
7499          * The nested attribute uses enum nl80211_band as the index. This maps
7500          * directly to the enum ieee80211_band values used in cfg80211.
7501          */
7502         BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
7503         nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem)
7504         {
7505                 enum ieee80211_band band = nla_type(tx_rates);
7506                 if (band < 0 || band >= IEEE80211_NUM_BANDS)
7507                         return -EINVAL;
7508                 sband = rdev->wiphy.bands[band];
7509                 if (sband == NULL)
7510                         return -EINVAL;
7511                 nla_parse(tb, NL80211_TXRATE_MAX, nla_data(tx_rates),
7512                           nla_len(tx_rates), nl80211_txattr_policy);
7513                 if (tb[NL80211_TXRATE_LEGACY]) {
7514                         mask.control[band].legacy = rateset_to_mask(
7515                                 sband,
7516                                 nla_data(tb[NL80211_TXRATE_LEGACY]),
7517                                 nla_len(tb[NL80211_TXRATE_LEGACY]));
7518                         if ((mask.control[band].legacy == 0) &&
7519                             nla_len(tb[NL80211_TXRATE_LEGACY]))
7520                                 return -EINVAL;
7521                 }
7522                 if (tb[NL80211_TXRATE_HT]) {
7523                         if (!ht_rateset_to_mask(
7524                                         sband,
7525                                         nla_data(tb[NL80211_TXRATE_HT]),
7526                                         nla_len(tb[NL80211_TXRATE_HT]),
7527                                         mask.control[band].ht_mcs))
7528                                 return -EINVAL;
7529                 }
7530                 if (tb[NL80211_TXRATE_VHT]) {
7531                         if (!vht_set_mcs_mask(
7532                                         sband,
7533                                         nla_data(tb[NL80211_TXRATE_VHT]),
7534                                         mask.control[band].vht_mcs))
7535                                 return -EINVAL;
7536                 }
7537
7538                 if (mask.control[band].legacy == 0) {
7539                         /* don't allow empty legacy rates if HT or VHT
7540                          * are not even supported.
7541                          */
7542                         if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported ||
7543                               rdev->wiphy.bands[band]->vht_cap.vht_supported))
7544                                 return -EINVAL;
7545
7546                         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
7547                                 if (mask.control[band].ht_mcs[i])
7548                                         goto out;
7549
7550                         for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
7551                                 if (mask.control[band].vht_mcs[i])
7552                                         goto out;
7553
7554                         /* legacy and mcs rates may not be both empty */
7555                         return -EINVAL;
7556                 }
7557         }
7558
7559 out:
7560         return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
7561 }
7562
7563 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
7564 {
7565         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7566         struct wireless_dev *wdev = info->user_ptr[1];
7567         u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
7568
7569         if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
7570                 return -EINVAL;
7571
7572         if (info->attrs[NL80211_ATTR_FRAME_TYPE])
7573                 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
7574
7575         switch (wdev->iftype) {
7576         case NL80211_IFTYPE_STATION:
7577         case NL80211_IFTYPE_ADHOC:
7578         case NL80211_IFTYPE_P2P_CLIENT:
7579         case NL80211_IFTYPE_AP:
7580         case NL80211_IFTYPE_AP_VLAN:
7581         case NL80211_IFTYPE_MESH_POINT:
7582         case NL80211_IFTYPE_P2P_GO:
7583         case NL80211_IFTYPE_P2P_DEVICE:
7584                 break;
7585         default:
7586                 return -EOPNOTSUPP;
7587         }
7588
7589         /* not much point in registering if we can't reply */
7590         if (!rdev->ops->mgmt_tx)
7591                 return -EOPNOTSUPP;
7592
7593         return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type,
7594                         nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
7595                         nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]));
7596 }
7597
7598 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
7599 {
7600         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7601         struct wireless_dev *wdev = info->user_ptr[1];
7602         struct cfg80211_chan_def chandef;
7603         int err;
7604         void *hdr = NULL;
7605         u64 cookie;
7606         struct sk_buff *msg = NULL;
7607         struct cfg80211_mgmt_tx_params params = {
7608                 .dont_wait_for_ack =
7609                         info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK],
7610         };
7611
7612         if (!info->attrs[NL80211_ATTR_FRAME])
7613                 return -EINVAL;
7614
7615         if (!rdev->ops->mgmt_tx)
7616                 return -EOPNOTSUPP;
7617
7618         switch (wdev->iftype) {
7619         case NL80211_IFTYPE_P2P_DEVICE:
7620                 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
7621                         return -EINVAL;
7622         case NL80211_IFTYPE_STATION:
7623         case NL80211_IFTYPE_ADHOC:
7624         case NL80211_IFTYPE_P2P_CLIENT:
7625         case NL80211_IFTYPE_AP:
7626         case NL80211_IFTYPE_AP_VLAN:
7627         case NL80211_IFTYPE_MESH_POINT:
7628         case NL80211_IFTYPE_P2P_GO:
7629                 break;
7630         default:
7631                 return -EOPNOTSUPP;
7632         }
7633
7634         if (info->attrs[NL80211_ATTR_DURATION]) {
7635                 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
7636                         return -EINVAL;
7637                 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
7638
7639                 /*
7640                  * We should wait on the channel for at least a minimum amount
7641                  * of time (10ms) but no longer than the driver supports.
7642                  */
7643                 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
7644                     params.wait > rdev->wiphy.max_remain_on_channel_duration)
7645                         return -EINVAL;
7646
7647         }
7648
7649         params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
7650
7651         if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
7652                 return -EINVAL;
7653
7654         params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
7655
7656         /* get the channel if any has been specified, otherwise pass NULL to
7657          * the driver. The latter will use the current one
7658          */
7659         chandef.chan = NULL;
7660         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
7661                 err = nl80211_parse_chandef(rdev, info, &chandef);
7662                 if (err)
7663                         return err;
7664         }
7665
7666         if (!chandef.chan && params.offchan)
7667                 return -EINVAL;
7668
7669         if (!params.dont_wait_for_ack) {
7670                 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7671                 if (!msg)
7672                         return -ENOMEM;
7673
7674                 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
7675                                      NL80211_CMD_FRAME);
7676                 if (!hdr) {
7677                         err = -ENOBUFS;
7678                         goto free_msg;
7679                 }
7680         }
7681
7682         params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
7683         params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
7684         params.chan = chandef.chan;
7685         err = cfg80211_mlme_mgmt_tx(rdev, wdev, &params, &cookie);
7686         if (err)
7687                 goto free_msg;
7688
7689         if (msg) {
7690                 if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
7691                         goto nla_put_failure;
7692
7693                 genlmsg_end(msg, hdr);
7694                 return genlmsg_reply(msg, info);
7695         }
7696
7697         return 0;
7698
7699  nla_put_failure:
7700         err = -ENOBUFS;
7701  free_msg:
7702         nlmsg_free(msg);
7703         return err;
7704 }
7705
7706 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
7707 {
7708         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7709         struct wireless_dev *wdev = info->user_ptr[1];
7710         u64 cookie;
7711
7712         if (!info->attrs[NL80211_ATTR_COOKIE])
7713                 return -EINVAL;
7714
7715         if (!rdev->ops->mgmt_tx_cancel_wait)
7716                 return -EOPNOTSUPP;
7717
7718         switch (wdev->iftype) {
7719         case NL80211_IFTYPE_STATION:
7720         case NL80211_IFTYPE_ADHOC:
7721         case NL80211_IFTYPE_P2P_CLIENT:
7722         case NL80211_IFTYPE_AP:
7723         case NL80211_IFTYPE_AP_VLAN:
7724         case NL80211_IFTYPE_P2P_GO:
7725         case NL80211_IFTYPE_P2P_DEVICE:
7726                 break;
7727         default:
7728                 return -EOPNOTSUPP;
7729         }
7730
7731         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
7732
7733         return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie);
7734 }
7735
7736 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
7737 {
7738         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7739         struct wireless_dev *wdev;
7740         struct net_device *dev = info->user_ptr[1];
7741         u8 ps_state;
7742         bool state;
7743         int err;
7744
7745         if (!info->attrs[NL80211_ATTR_PS_STATE])
7746                 return -EINVAL;
7747
7748         ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
7749
7750         if (ps_state != NL80211_PS_DISABLED && ps_state != NL80211_PS_ENABLED)
7751                 return -EINVAL;
7752
7753         wdev = dev->ieee80211_ptr;
7754
7755         if (!rdev->ops->set_power_mgmt)
7756                 return -EOPNOTSUPP;
7757
7758         state = (ps_state == NL80211_PS_ENABLED) ? true : false;
7759
7760         if (state == wdev->ps)
7761                 return 0;
7762
7763         err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout);
7764         if (!err)
7765                 wdev->ps = state;
7766         return err;
7767 }
7768
7769 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
7770 {
7771         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7772         enum nl80211_ps_state ps_state;
7773         struct wireless_dev *wdev;
7774         struct net_device *dev = info->user_ptr[1];
7775         struct sk_buff *msg;
7776         void *hdr;
7777         int err;
7778
7779         wdev = dev->ieee80211_ptr;
7780
7781         if (!rdev->ops->set_power_mgmt)
7782                 return -EOPNOTSUPP;
7783
7784         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7785         if (!msg)
7786                 return -ENOMEM;
7787
7788         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
7789                              NL80211_CMD_GET_POWER_SAVE);
7790         if (!hdr) {
7791                 err = -ENOBUFS;
7792                 goto free_msg;
7793         }
7794
7795         if (wdev->ps)
7796                 ps_state = NL80211_PS_ENABLED;
7797         else
7798                 ps_state = NL80211_PS_DISABLED;
7799
7800         if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state))
7801                 goto nla_put_failure;
7802
7803         genlmsg_end(msg, hdr);
7804         return genlmsg_reply(msg, info);
7805
7806  nla_put_failure:
7807         err = -ENOBUFS;
7808  free_msg:
7809         nlmsg_free(msg);
7810         return err;
7811 }
7812
7813 static struct nla_policy
7814 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] __read_mostly = {
7815         [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_U32 },
7816         [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 },
7817         [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
7818         [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
7819         [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
7820         [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
7821 };
7822
7823 static int nl80211_set_cqm_txe(struct genl_info *info,
7824                                u32 rate, u32 pkts, u32 intvl)
7825 {
7826         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7827         struct net_device *dev = info->user_ptr[1];
7828         struct wireless_dev *wdev = dev->ieee80211_ptr;
7829
7830         if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL)
7831                 return -EINVAL;
7832
7833         if (!rdev->ops->set_cqm_txe_config)
7834                 return -EOPNOTSUPP;
7835
7836         if (wdev->iftype != NL80211_IFTYPE_STATION &&
7837             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
7838                 return -EOPNOTSUPP;
7839
7840         return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl);
7841 }
7842
7843 static int nl80211_set_cqm_rssi(struct genl_info *info,
7844                                 s32 threshold, u32 hysteresis)
7845 {
7846         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7847         struct net_device *dev = info->user_ptr[1];
7848         struct wireless_dev *wdev = dev->ieee80211_ptr;
7849
7850         if (threshold > 0)
7851                 return -EINVAL;
7852
7853         /* disabling - hysteresis should also be zero then */
7854         if (threshold == 0)
7855                 hysteresis = 0;
7856
7857         if (!rdev->ops->set_cqm_rssi_config)
7858                 return -EOPNOTSUPP;
7859
7860         if (wdev->iftype != NL80211_IFTYPE_STATION &&
7861             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
7862                 return -EOPNOTSUPP;
7863
7864         return rdev_set_cqm_rssi_config(rdev, dev, threshold, hysteresis);
7865 }
7866
7867 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
7868 {
7869         struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1];
7870         struct nlattr *cqm;
7871         int err;
7872
7873         cqm = info->attrs[NL80211_ATTR_CQM];
7874         if (!cqm)
7875                 return -EINVAL;
7876
7877         err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm,
7878                                nl80211_attr_cqm_policy);
7879         if (err)
7880                 return err;
7881
7882         if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
7883             attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
7884                 s32 threshold = nla_get_s32(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
7885                 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
7886
7887                 return nl80211_set_cqm_rssi(info, threshold, hysteresis);
7888         }
7889
7890         if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
7891             attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
7892             attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
7893                 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
7894                 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
7895                 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
7896
7897                 return nl80211_set_cqm_txe(info, rate, pkts, intvl);
7898         }
7899
7900         return -EINVAL;
7901 }
7902
7903 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
7904 {
7905         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7906         struct net_device *dev = info->user_ptr[1];
7907         struct mesh_config cfg;
7908         struct mesh_setup setup;
7909         int err;
7910
7911         /* start with default */
7912         memcpy(&cfg, &default_mesh_config, sizeof(cfg));
7913         memcpy(&setup, &default_mesh_setup, sizeof(setup));
7914
7915         if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
7916                 /* and parse parameters if given */
7917                 err = nl80211_parse_mesh_config(info, &cfg, NULL);
7918                 if (err)
7919                         return err;
7920         }
7921
7922         if (!info->attrs[NL80211_ATTR_MESH_ID] ||
7923             !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
7924                 return -EINVAL;
7925
7926         setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
7927         setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
7928
7929         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
7930             !nl80211_parse_mcast_rate(rdev, setup.mcast_rate,
7931                             nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
7932                         return -EINVAL;
7933
7934         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
7935                 setup.beacon_interval =
7936                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
7937                 if (setup.beacon_interval < 10 ||
7938                     setup.beacon_interval > 10000)
7939                         return -EINVAL;
7940         }
7941
7942         if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
7943                 setup.dtim_period =
7944                         nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
7945                 if (setup.dtim_period < 1 || setup.dtim_period > 100)
7946                         return -EINVAL;
7947         }
7948
7949         if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
7950                 /* parse additional setup parameters if given */
7951                 err = nl80211_parse_mesh_setup(info, &setup);
7952                 if (err)
7953                         return err;
7954         }
7955
7956         if (setup.user_mpm)
7957                 cfg.auto_open_plinks = false;
7958
7959         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
7960                 err = nl80211_parse_chandef(rdev, info, &setup.chandef);
7961                 if (err)
7962                         return err;
7963         } else {
7964                 /* cfg80211_join_mesh() will sort it out */
7965                 setup.chandef.chan = NULL;
7966         }
7967
7968         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
7969                 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
7970                 int n_rates =
7971                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
7972                 struct ieee80211_supported_band *sband;
7973
7974                 if (!setup.chandef.chan)
7975                         return -EINVAL;
7976
7977                 sband = rdev->wiphy.bands[setup.chandef.chan->band];
7978
7979                 err = ieee80211_get_ratemask(sband, rates, n_rates,
7980                                              &setup.basic_rates);
7981                 if (err)
7982                         return err;
7983         }
7984
7985         return cfg80211_join_mesh(rdev, dev, &setup, &cfg);
7986 }
7987
7988 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
7989 {
7990         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7991         struct net_device *dev = info->user_ptr[1];
7992
7993         return cfg80211_leave_mesh(rdev, dev);
7994 }
7995
7996 #ifdef CONFIG_PM
7997 static int nl80211_send_wowlan_patterns(struct sk_buff *msg,
7998                                         struct cfg80211_registered_device *rdev)
7999 {
8000         struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config;
8001         struct nlattr *nl_pats, *nl_pat;
8002         int i, pat_len;
8003
8004         if (!wowlan->n_patterns)
8005                 return 0;
8006
8007         nl_pats = nla_nest_start(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN);
8008         if (!nl_pats)
8009                 return -ENOBUFS;
8010
8011         for (i = 0; i < wowlan->n_patterns; i++) {
8012                 nl_pat = nla_nest_start(msg, i + 1);
8013                 if (!nl_pat)
8014                         return -ENOBUFS;
8015                 pat_len = wowlan->patterns[i].pattern_len;
8016                 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8),
8017                             wowlan->patterns[i].mask) ||
8018                     nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
8019                             wowlan->patterns[i].pattern) ||
8020                     nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
8021                                 wowlan->patterns[i].pkt_offset))
8022                         return -ENOBUFS;
8023                 nla_nest_end(msg, nl_pat);
8024         }
8025         nla_nest_end(msg, nl_pats);
8026
8027         return 0;
8028 }
8029
8030 static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
8031                                    struct cfg80211_wowlan_tcp *tcp)
8032 {
8033         struct nlattr *nl_tcp;
8034
8035         if (!tcp)
8036                 return 0;
8037
8038         nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
8039         if (!nl_tcp)
8040                 return -ENOBUFS;
8041
8042         if (nla_put_be32(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) ||
8043             nla_put_be32(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) ||
8044             nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) ||
8045             nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) ||
8046             nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) ||
8047             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
8048                     tcp->payload_len, tcp->payload) ||
8049             nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
8050                         tcp->data_interval) ||
8051             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
8052                     tcp->wake_len, tcp->wake_data) ||
8053             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK,
8054                     DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask))
8055                 return -ENOBUFS;
8056
8057         if (tcp->payload_seq.len &&
8058             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
8059                     sizeof(tcp->payload_seq), &tcp->payload_seq))
8060                 return -ENOBUFS;
8061
8062         if (tcp->payload_tok.len &&
8063             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
8064                     sizeof(tcp->payload_tok) + tcp->tokens_size,
8065                     &tcp->payload_tok))
8066                 return -ENOBUFS;
8067
8068         nla_nest_end(msg, nl_tcp);
8069
8070         return 0;
8071 }
8072
8073 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
8074 {
8075         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8076         struct sk_buff *msg;
8077         void *hdr;
8078         u32 size = NLMSG_DEFAULT_SIZE;
8079
8080         if (!rdev->wiphy.wowlan)
8081                 return -EOPNOTSUPP;
8082
8083         if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) {
8084                 /* adjust size to have room for all the data */
8085                 size += rdev->wiphy.wowlan_config->tcp->tokens_size +
8086                         rdev->wiphy.wowlan_config->tcp->payload_len +
8087                         rdev->wiphy.wowlan_config->tcp->wake_len +
8088                         rdev->wiphy.wowlan_config->tcp->wake_len / 8;
8089         }
8090
8091         msg = nlmsg_new(size, GFP_KERNEL);
8092         if (!msg)
8093                 return -ENOMEM;
8094
8095         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8096                              NL80211_CMD_GET_WOWLAN);
8097         if (!hdr)
8098                 goto nla_put_failure;
8099
8100         if (rdev->wiphy.wowlan_config) {
8101                 struct nlattr *nl_wowlan;
8102
8103                 nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
8104                 if (!nl_wowlan)
8105                         goto nla_put_failure;
8106
8107                 if ((rdev->wiphy.wowlan_config->any &&
8108                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
8109                     (rdev->wiphy.wowlan_config->disconnect &&
8110                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
8111                     (rdev->wiphy.wowlan_config->magic_pkt &&
8112                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
8113                     (rdev->wiphy.wowlan_config->gtk_rekey_failure &&
8114                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
8115                     (rdev->wiphy.wowlan_config->eap_identity_req &&
8116                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
8117                     (rdev->wiphy.wowlan_config->four_way_handshake &&
8118                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
8119                     (rdev->wiphy.wowlan_config->rfkill_release &&
8120                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
8121                         goto nla_put_failure;
8122
8123                 if (nl80211_send_wowlan_patterns(msg, rdev))
8124                         goto nla_put_failure;
8125
8126                 if (nl80211_send_wowlan_tcp(msg,
8127                                             rdev->wiphy.wowlan_config->tcp))
8128                         goto nla_put_failure;
8129
8130                 nla_nest_end(msg, nl_wowlan);
8131         }
8132
8133         genlmsg_end(msg, hdr);
8134         return genlmsg_reply(msg, info);
8135
8136 nla_put_failure:
8137         nlmsg_free(msg);
8138         return -ENOBUFS;
8139 }
8140
8141 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev,
8142                                     struct nlattr *attr,
8143                                     struct cfg80211_wowlan *trig)
8144 {
8145         struct nlattr *tb[NUM_NL80211_WOWLAN_TCP];
8146         struct cfg80211_wowlan_tcp *cfg;
8147         struct nl80211_wowlan_tcp_data_token *tok = NULL;
8148         struct nl80211_wowlan_tcp_data_seq *seq = NULL;
8149         u32 size;
8150         u32 data_size, wake_size, tokens_size = 0, wake_mask_size;
8151         int err, port;
8152
8153         if (!rdev->wiphy.wowlan->tcp)
8154                 return -EINVAL;
8155
8156         err = nla_parse(tb, MAX_NL80211_WOWLAN_TCP,
8157                         nla_data(attr), nla_len(attr),
8158                         nl80211_wowlan_tcp_policy);
8159         if (err)
8160                 return err;
8161
8162         if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] ||
8163             !tb[NL80211_WOWLAN_TCP_DST_IPV4] ||
8164             !tb[NL80211_WOWLAN_TCP_DST_MAC] ||
8165             !tb[NL80211_WOWLAN_TCP_DST_PORT] ||
8166             !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] ||
8167             !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] ||
8168             !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] ||
8169             !tb[NL80211_WOWLAN_TCP_WAKE_MASK])
8170                 return -EINVAL;
8171
8172         data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]);
8173         if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max)
8174                 return -EINVAL;
8175
8176         if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) >
8177                         rdev->wiphy.wowlan->tcp->data_interval_max ||
8178             nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0)
8179                 return -EINVAL;
8180
8181         wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]);
8182         if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max)
8183                 return -EINVAL;
8184
8185         wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]);
8186         if (wake_mask_size != DIV_ROUND_UP(wake_size, 8))
8187                 return -EINVAL;
8188
8189         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) {
8190                 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
8191
8192                 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
8193                 tokens_size = tokln - sizeof(*tok);
8194
8195                 if (!tok->len || tokens_size % tok->len)
8196                         return -EINVAL;
8197                 if (!rdev->wiphy.wowlan->tcp->tok)
8198                         return -EINVAL;
8199                 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len)
8200                         return -EINVAL;
8201                 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len)
8202                         return -EINVAL;
8203                 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize)
8204                         return -EINVAL;
8205                 if (tok->offset + tok->len > data_size)
8206                         return -EINVAL;
8207         }
8208
8209         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) {
8210                 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]);
8211                 if (!rdev->wiphy.wowlan->tcp->seq)
8212                         return -EINVAL;
8213                 if (seq->len == 0 || seq->len > 4)
8214                         return -EINVAL;
8215                 if (seq->len + seq->offset > data_size)
8216                         return -EINVAL;
8217         }
8218
8219         size = sizeof(*cfg);
8220         size += data_size;
8221         size += wake_size + wake_mask_size;
8222         size += tokens_size;
8223
8224         cfg = kzalloc(size, GFP_KERNEL);
8225         if (!cfg)
8226                 return -ENOMEM;
8227         cfg->src = nla_get_be32(tb[NL80211_WOWLAN_TCP_SRC_IPV4]);
8228         cfg->dst = nla_get_be32(tb[NL80211_WOWLAN_TCP_DST_IPV4]);
8229         memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]),
8230                ETH_ALEN);
8231         if (tb[NL80211_WOWLAN_TCP_SRC_PORT])
8232                 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]);
8233         else
8234                 port = 0;
8235 #ifdef CONFIG_INET
8236         /* allocate a socket and port for it and use it */
8237         err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM,
8238                             IPPROTO_TCP, &cfg->sock, 1);
8239         if (err) {
8240                 kfree(cfg);
8241                 return err;
8242         }
8243         if (inet_csk_get_port(cfg->sock->sk, port)) {
8244                 sock_release(cfg->sock);
8245                 kfree(cfg);
8246                 return -EADDRINUSE;
8247         }
8248         cfg->src_port = inet_sk(cfg->sock->sk)->inet_num;
8249 #else
8250         if (!port) {
8251                 kfree(cfg);
8252                 return -EINVAL;
8253         }
8254         cfg->src_port = port;
8255 #endif
8256
8257         cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]);
8258         cfg->payload_len = data_size;
8259         cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size;
8260         memcpy((void *)cfg->payload,
8261                nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]),
8262                data_size);
8263         if (seq)
8264                 cfg->payload_seq = *seq;
8265         cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]);
8266         cfg->wake_len = wake_size;
8267         cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size;
8268         memcpy((void *)cfg->wake_data,
8269                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]),
8270                wake_size);
8271         cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size +
8272                          data_size + wake_size;
8273         memcpy((void *)cfg->wake_mask,
8274                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]),
8275                wake_mask_size);
8276         if (tok) {
8277                 cfg->tokens_size = tokens_size;
8278                 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size);
8279         }
8280
8281         trig->tcp = cfg;
8282
8283         return 0;
8284 }
8285
8286 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
8287 {
8288         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8289         struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG];
8290         struct cfg80211_wowlan new_triggers = {};
8291         struct cfg80211_wowlan *ntrig;
8292         const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan;
8293         int err, i;
8294         bool prev_enabled = rdev->wiphy.wowlan_config;
8295
8296         if (!wowlan)
8297                 return -EOPNOTSUPP;
8298
8299         if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) {
8300                 cfg80211_rdev_free_wowlan(rdev);
8301                 rdev->wiphy.wowlan_config = NULL;
8302                 goto set_wakeup;
8303         }
8304
8305         err = nla_parse(tb, MAX_NL80211_WOWLAN_TRIG,
8306                         nla_data(info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]),
8307                         nla_len(info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]),
8308                         nl80211_wowlan_policy);
8309         if (err)
8310                 return err;
8311
8312         if (tb[NL80211_WOWLAN_TRIG_ANY]) {
8313                 if (!(wowlan->flags & WIPHY_WOWLAN_ANY))
8314                         return -EINVAL;
8315                 new_triggers.any = true;
8316         }
8317
8318         if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) {
8319                 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT))
8320                         return -EINVAL;
8321                 new_triggers.disconnect = true;
8322         }
8323
8324         if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) {
8325                 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT))
8326                         return -EINVAL;
8327                 new_triggers.magic_pkt = true;
8328         }
8329
8330         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED])
8331                 return -EINVAL;
8332
8333         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) {
8334                 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE))
8335                         return -EINVAL;
8336                 new_triggers.gtk_rekey_failure = true;
8337         }
8338
8339         if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) {
8340                 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ))
8341                         return -EINVAL;
8342                 new_triggers.eap_identity_req = true;
8343         }
8344
8345         if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) {
8346                 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE))
8347                         return -EINVAL;
8348                 new_triggers.four_way_handshake = true;
8349         }
8350
8351         if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) {
8352                 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE))
8353                         return -EINVAL;
8354                 new_triggers.rfkill_release = true;
8355         }
8356
8357         if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) {
8358                 struct nlattr *pat;
8359                 int n_patterns = 0;
8360                 int rem, pat_len, mask_len, pkt_offset;
8361                 struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
8362
8363                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
8364                                     rem)
8365                         n_patterns++;
8366                 if (n_patterns > wowlan->n_patterns)
8367                         return -EINVAL;
8368
8369                 new_triggers.patterns = kcalloc(n_patterns,
8370                                                 sizeof(new_triggers.patterns[0]),
8371                                                 GFP_KERNEL);
8372                 if (!new_triggers.patterns)
8373                         return -ENOMEM;
8374
8375                 new_triggers.n_patterns = n_patterns;
8376                 i = 0;
8377
8378                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
8379                                     rem) {
8380                         nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat),
8381                                   nla_len(pat), NULL);
8382                         err = -EINVAL;
8383                         if (!pat_tb[NL80211_PKTPAT_MASK] ||
8384                             !pat_tb[NL80211_PKTPAT_PATTERN])
8385                                 goto error;
8386                         pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
8387                         mask_len = DIV_ROUND_UP(pat_len, 8);
8388                         if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
8389                                 goto error;
8390                         if (pat_len > wowlan->pattern_max_len ||
8391                             pat_len < wowlan->pattern_min_len)
8392                                 goto error;
8393
8394                         if (!pat_tb[NL80211_PKTPAT_OFFSET])
8395                                 pkt_offset = 0;
8396                         else
8397                                 pkt_offset = nla_get_u32(
8398                                         pat_tb[NL80211_PKTPAT_OFFSET]);
8399                         if (pkt_offset > wowlan->max_pkt_offset)
8400                                 goto error;
8401                         new_triggers.patterns[i].pkt_offset = pkt_offset;
8402
8403                         new_triggers.patterns[i].mask =
8404                                 kmalloc(mask_len + pat_len, GFP_KERNEL);
8405                         if (!new_triggers.patterns[i].mask) {
8406                                 err = -ENOMEM;
8407                                 goto error;
8408                         }
8409                         new_triggers.patterns[i].pattern =
8410                                 new_triggers.patterns[i].mask + mask_len;
8411                         memcpy(new_triggers.patterns[i].mask,
8412                                nla_data(pat_tb[NL80211_PKTPAT_MASK]),
8413                                mask_len);
8414                         new_triggers.patterns[i].pattern_len = pat_len;
8415                         memcpy(new_triggers.patterns[i].pattern,
8416                                nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
8417                                pat_len);
8418                         i++;
8419                 }
8420         }
8421
8422         if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) {
8423                 err = nl80211_parse_wowlan_tcp(
8424                         rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION],
8425                         &new_triggers);
8426                 if (err)
8427                         goto error;
8428         }
8429
8430         ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL);
8431         if (!ntrig) {
8432                 err = -ENOMEM;
8433                 goto error;
8434         }
8435         cfg80211_rdev_free_wowlan(rdev);
8436         rdev->wiphy.wowlan_config = ntrig;
8437
8438  set_wakeup:
8439         if (rdev->ops->set_wakeup &&
8440             prev_enabled != !!rdev->wiphy.wowlan_config)
8441                 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config);
8442
8443         return 0;
8444  error:
8445         for (i = 0; i < new_triggers.n_patterns; i++)
8446                 kfree(new_triggers.patterns[i].mask);
8447         kfree(new_triggers.patterns);
8448         if (new_triggers.tcp && new_triggers.tcp->sock)
8449                 sock_release(new_triggers.tcp->sock);
8450         kfree(new_triggers.tcp);
8451         return err;
8452 }
8453 #endif
8454
8455 static int nl80211_send_coalesce_rules(struct sk_buff *msg,
8456                                        struct cfg80211_registered_device *rdev)
8457 {
8458         struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules;
8459         int i, j, pat_len;
8460         struct cfg80211_coalesce_rules *rule;
8461
8462         if (!rdev->coalesce->n_rules)
8463                 return 0;
8464
8465         nl_rules = nla_nest_start(msg, NL80211_ATTR_COALESCE_RULE);
8466         if (!nl_rules)
8467                 return -ENOBUFS;
8468
8469         for (i = 0; i < rdev->coalesce->n_rules; i++) {
8470                 nl_rule = nla_nest_start(msg, i + 1);
8471                 if (!nl_rule)
8472                         return -ENOBUFS;
8473
8474                 rule = &rdev->coalesce->rules[i];
8475                 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY,
8476                                 rule->delay))
8477                         return -ENOBUFS;
8478
8479                 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION,
8480                                 rule->condition))
8481                         return -ENOBUFS;
8482
8483                 nl_pats = nla_nest_start(msg,
8484                                 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN);
8485                 if (!nl_pats)
8486                         return -ENOBUFS;
8487
8488                 for (j = 0; j < rule->n_patterns; j++) {
8489                         nl_pat = nla_nest_start(msg, j + 1);
8490                         if (!nl_pat)
8491                                 return -ENOBUFS;
8492                         pat_len = rule->patterns[j].pattern_len;
8493                         if (nla_put(msg, NL80211_PKTPAT_MASK,
8494                                     DIV_ROUND_UP(pat_len, 8),
8495                                     rule->patterns[j].mask) ||
8496                             nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
8497                                     rule->patterns[j].pattern) ||
8498                             nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
8499                                         rule->patterns[j].pkt_offset))
8500                                 return -ENOBUFS;
8501                         nla_nest_end(msg, nl_pat);
8502                 }
8503                 nla_nest_end(msg, nl_pats);
8504                 nla_nest_end(msg, nl_rule);
8505         }
8506         nla_nest_end(msg, nl_rules);
8507
8508         return 0;
8509 }
8510
8511 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info)
8512 {
8513         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8514         struct sk_buff *msg;
8515         void *hdr;
8516
8517         if (!rdev->wiphy.coalesce)
8518                 return -EOPNOTSUPP;
8519
8520         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
8521         if (!msg)
8522                 return -ENOMEM;
8523
8524         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8525                              NL80211_CMD_GET_COALESCE);
8526         if (!hdr)
8527                 goto nla_put_failure;
8528
8529         if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev))
8530                 goto nla_put_failure;
8531
8532         genlmsg_end(msg, hdr);
8533         return genlmsg_reply(msg, info);
8534
8535 nla_put_failure:
8536         nlmsg_free(msg);
8537         return -ENOBUFS;
8538 }
8539
8540 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev)
8541 {
8542         struct cfg80211_coalesce *coalesce = rdev->coalesce;
8543         int i, j;
8544         struct cfg80211_coalesce_rules *rule;
8545
8546         if (!coalesce)
8547                 return;
8548
8549         for (i = 0; i < coalesce->n_rules; i++) {
8550                 rule = &coalesce->rules[i];
8551                 for (j = 0; j < rule->n_patterns; j++)
8552                         kfree(rule->patterns[j].mask);
8553                 kfree(rule->patterns);
8554         }
8555         kfree(coalesce->rules);
8556         kfree(coalesce);
8557         rdev->coalesce = NULL;
8558 }
8559
8560 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,
8561                                        struct nlattr *rule,
8562                                        struct cfg80211_coalesce_rules *new_rule)
8563 {
8564         int err, i;
8565         const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
8566         struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat;
8567         int rem, pat_len, mask_len, pkt_offset, n_patterns = 0;
8568         struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
8569
8570         err = nla_parse(tb, NL80211_ATTR_COALESCE_RULE_MAX, nla_data(rule),
8571                         nla_len(rule), nl80211_coalesce_policy);
8572         if (err)
8573                 return err;
8574
8575         if (tb[NL80211_ATTR_COALESCE_RULE_DELAY])
8576                 new_rule->delay =
8577                         nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]);
8578         if (new_rule->delay > coalesce->max_delay)
8579                 return -EINVAL;
8580
8581         if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION])
8582                 new_rule->condition =
8583                         nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]);
8584         if (new_rule->condition != NL80211_COALESCE_CONDITION_MATCH &&
8585             new_rule->condition != NL80211_COALESCE_CONDITION_NO_MATCH)
8586                 return -EINVAL;
8587
8588         if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN])
8589                 return -EINVAL;
8590
8591         nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
8592                             rem)
8593                 n_patterns++;
8594         if (n_patterns > coalesce->n_patterns)
8595                 return -EINVAL;
8596
8597         new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]),
8598                                      GFP_KERNEL);
8599         if (!new_rule->patterns)
8600                 return -ENOMEM;
8601
8602         new_rule->n_patterns = n_patterns;
8603         i = 0;
8604
8605         nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
8606                             rem) {
8607                 nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat),
8608                           nla_len(pat), NULL);
8609                 if (!pat_tb[NL80211_PKTPAT_MASK] ||
8610                     !pat_tb[NL80211_PKTPAT_PATTERN])
8611                         return -EINVAL;
8612                 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
8613                 mask_len = DIV_ROUND_UP(pat_len, 8);
8614                 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
8615                         return -EINVAL;
8616                 if (pat_len > coalesce->pattern_max_len ||
8617                     pat_len < coalesce->pattern_min_len)
8618                         return -EINVAL;
8619
8620                 if (!pat_tb[NL80211_PKTPAT_OFFSET])
8621                         pkt_offset = 0;
8622                 else
8623                         pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]);
8624                 if (pkt_offset > coalesce->max_pkt_offset)
8625                         return -EINVAL;
8626                 new_rule->patterns[i].pkt_offset = pkt_offset;
8627
8628                 new_rule->patterns[i].mask =
8629                         kmalloc(mask_len + pat_len, GFP_KERNEL);
8630                 if (!new_rule->patterns[i].mask)
8631                         return -ENOMEM;
8632                 new_rule->patterns[i].pattern =
8633                         new_rule->patterns[i].mask + mask_len;
8634                 memcpy(new_rule->patterns[i].mask,
8635                        nla_data(pat_tb[NL80211_PKTPAT_MASK]), mask_len);
8636                 new_rule->patterns[i].pattern_len = pat_len;
8637                 memcpy(new_rule->patterns[i].pattern,
8638                        nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), pat_len);
8639                 i++;
8640         }
8641
8642         return 0;
8643 }
8644
8645 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info)
8646 {
8647         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8648         const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
8649         struct cfg80211_coalesce new_coalesce = {};
8650         struct cfg80211_coalesce *n_coalesce;
8651         int err, rem_rule, n_rules = 0, i, j;
8652         struct nlattr *rule;
8653         struct cfg80211_coalesce_rules *tmp_rule;
8654
8655         if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce)
8656                 return -EOPNOTSUPP;
8657
8658         if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) {
8659                 cfg80211_rdev_free_coalesce(rdev);
8660                 rdev->ops->set_coalesce(&rdev->wiphy, NULL);
8661                 return 0;
8662         }
8663
8664         nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
8665                             rem_rule)
8666                 n_rules++;
8667         if (n_rules > coalesce->n_rules)
8668                 return -EINVAL;
8669
8670         new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]),
8671                                      GFP_KERNEL);
8672         if (!new_coalesce.rules)
8673                 return -ENOMEM;
8674
8675         new_coalesce.n_rules = n_rules;
8676         i = 0;
8677
8678         nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
8679                             rem_rule) {
8680                 err = nl80211_parse_coalesce_rule(rdev, rule,
8681                                                   &new_coalesce.rules[i]);
8682                 if (err)
8683                         goto error;
8684
8685                 i++;
8686         }
8687
8688         err = rdev->ops->set_coalesce(&rdev->wiphy, &new_coalesce);
8689         if (err)
8690                 goto error;
8691
8692         n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL);
8693         if (!n_coalesce) {
8694                 err = -ENOMEM;
8695                 goto error;
8696         }
8697         cfg80211_rdev_free_coalesce(rdev);
8698         rdev->coalesce = n_coalesce;
8699
8700         return 0;
8701 error:
8702         for (i = 0; i < new_coalesce.n_rules; i++) {
8703                 tmp_rule = &new_coalesce.rules[i];
8704                 for (j = 0; j < tmp_rule->n_patterns; j++)
8705                         kfree(tmp_rule->patterns[j].mask);
8706                 kfree(tmp_rule->patterns);
8707         }
8708         kfree(new_coalesce.rules);
8709
8710         return err;
8711 }
8712
8713 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
8714 {
8715         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8716         struct net_device *dev = info->user_ptr[1];
8717         struct wireless_dev *wdev = dev->ieee80211_ptr;
8718         struct nlattr *tb[NUM_NL80211_REKEY_DATA];
8719         struct cfg80211_gtk_rekey_data rekey_data;
8720         int err;
8721
8722         if (!info->attrs[NL80211_ATTR_REKEY_DATA])
8723                 return -EINVAL;
8724
8725         err = nla_parse(tb, MAX_NL80211_REKEY_DATA,
8726                         nla_data(info->attrs[NL80211_ATTR_REKEY_DATA]),
8727                         nla_len(info->attrs[NL80211_ATTR_REKEY_DATA]),
8728                         nl80211_rekey_policy);
8729         if (err)
8730                 return err;
8731
8732         if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN)
8733                 return -ERANGE;
8734         if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN)
8735                 return -ERANGE;
8736         if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN)
8737                 return -ERANGE;
8738
8739         memcpy(rekey_data.kek, nla_data(tb[NL80211_REKEY_DATA_KEK]),
8740                NL80211_KEK_LEN);
8741         memcpy(rekey_data.kck, nla_data(tb[NL80211_REKEY_DATA_KCK]),
8742                NL80211_KCK_LEN);
8743         memcpy(rekey_data.replay_ctr,
8744                nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]),
8745                NL80211_REPLAY_CTR_LEN);
8746
8747         wdev_lock(wdev);
8748         if (!wdev->current_bss) {
8749                 err = -ENOTCONN;
8750                 goto out;
8751         }
8752
8753         if (!rdev->ops->set_rekey_data) {
8754                 err = -EOPNOTSUPP;
8755                 goto out;
8756         }
8757
8758         err = rdev_set_rekey_data(rdev, dev, &rekey_data);
8759  out:
8760         wdev_unlock(wdev);
8761         return err;
8762 }
8763
8764 static int nl80211_register_unexpected_frame(struct sk_buff *skb,
8765                                              struct genl_info *info)
8766 {
8767         struct net_device *dev = info->user_ptr[1];
8768         struct wireless_dev *wdev = dev->ieee80211_ptr;
8769
8770         if (wdev->iftype != NL80211_IFTYPE_AP &&
8771             wdev->iftype != NL80211_IFTYPE_P2P_GO)
8772                 return -EINVAL;
8773
8774         if (wdev->ap_unexpected_nlportid)
8775                 return -EBUSY;
8776
8777         wdev->ap_unexpected_nlportid = info->snd_portid;
8778         return 0;
8779 }
8780
8781 static int nl80211_probe_client(struct sk_buff *skb,
8782                                 struct genl_info *info)
8783 {
8784         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8785         struct net_device *dev = info->user_ptr[1];
8786         struct wireless_dev *wdev = dev->ieee80211_ptr;
8787         struct sk_buff *msg;
8788         void *hdr;
8789         const u8 *addr;
8790         u64 cookie;
8791         int err;
8792
8793         if (wdev->iftype != NL80211_IFTYPE_AP &&
8794             wdev->iftype != NL80211_IFTYPE_P2P_GO)
8795                 return -EOPNOTSUPP;
8796
8797         if (!info->attrs[NL80211_ATTR_MAC])
8798                 return -EINVAL;
8799
8800         if (!rdev->ops->probe_client)
8801                 return -EOPNOTSUPP;
8802
8803         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
8804         if (!msg)
8805                 return -ENOMEM;
8806
8807         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8808                              NL80211_CMD_PROBE_CLIENT);
8809         if (!hdr) {
8810                 err = -ENOBUFS;
8811                 goto free_msg;
8812         }
8813
8814         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
8815
8816         err = rdev_probe_client(rdev, dev, addr, &cookie);
8817         if (err)
8818                 goto free_msg;
8819
8820         if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
8821                 goto nla_put_failure;
8822
8823         genlmsg_end(msg, hdr);
8824
8825         return genlmsg_reply(msg, info);
8826
8827  nla_put_failure:
8828         err = -ENOBUFS;
8829  free_msg:
8830         nlmsg_free(msg);
8831         return err;
8832 }
8833
8834 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info)
8835 {
8836         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8837         struct cfg80211_beacon_registration *reg, *nreg;
8838         int rv;
8839
8840         if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS))
8841                 return -EOPNOTSUPP;
8842
8843         nreg = kzalloc(sizeof(*nreg), GFP_KERNEL);
8844         if (!nreg)
8845                 return -ENOMEM;
8846
8847         /* First, check if already registered. */
8848         spin_lock_bh(&rdev->beacon_registrations_lock);
8849         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
8850                 if (reg->nlportid == info->snd_portid) {
8851                         rv = -EALREADY;
8852                         goto out_err;
8853                 }
8854         }
8855         /* Add it to the list */
8856         nreg->nlportid = info->snd_portid;
8857         list_add(&nreg->list, &rdev->beacon_registrations);
8858
8859         spin_unlock_bh(&rdev->beacon_registrations_lock);
8860
8861         return 0;
8862 out_err:
8863         spin_unlock_bh(&rdev->beacon_registrations_lock);
8864         kfree(nreg);
8865         return rv;
8866 }
8867
8868 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
8869 {
8870         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8871         struct wireless_dev *wdev = info->user_ptr[1];
8872         int err;
8873
8874         if (!rdev->ops->start_p2p_device)
8875                 return -EOPNOTSUPP;
8876
8877         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
8878                 return -EOPNOTSUPP;
8879
8880         if (wdev->p2p_started)
8881                 return 0;
8882
8883         err = cfg80211_can_add_interface(rdev, wdev->iftype);
8884         if (err)
8885                 return err;
8886
8887         err = rdev_start_p2p_device(rdev, wdev);
8888         if (err)
8889                 return err;
8890
8891         wdev->p2p_started = true;
8892         rdev->opencount++;
8893
8894         return 0;
8895 }
8896
8897 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info)
8898 {
8899         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8900         struct wireless_dev *wdev = info->user_ptr[1];
8901
8902         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
8903                 return -EOPNOTSUPP;
8904
8905         if (!rdev->ops->stop_p2p_device)
8906                 return -EOPNOTSUPP;
8907
8908         cfg80211_stop_p2p_device(rdev, wdev);
8909
8910         return 0;
8911 }
8912
8913 static int nl80211_get_protocol_features(struct sk_buff *skb,
8914                                          struct genl_info *info)
8915 {
8916         void *hdr;
8917         struct sk_buff *msg;
8918
8919         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
8920         if (!msg)
8921                 return -ENOMEM;
8922
8923         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8924                              NL80211_CMD_GET_PROTOCOL_FEATURES);
8925         if (!hdr)
8926                 goto nla_put_failure;
8927
8928         if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES,
8929                         NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP))
8930                 goto nla_put_failure;
8931
8932         genlmsg_end(msg, hdr);
8933         return genlmsg_reply(msg, info);
8934
8935  nla_put_failure:
8936         kfree_skb(msg);
8937         return -ENOBUFS;
8938 }
8939
8940 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info)
8941 {
8942         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8943         struct cfg80211_update_ft_ies_params ft_params;
8944         struct net_device *dev = info->user_ptr[1];
8945
8946         if (!rdev->ops->update_ft_ies)
8947                 return -EOPNOTSUPP;
8948
8949         if (!info->attrs[NL80211_ATTR_MDID] ||
8950             !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
8951                 return -EINVAL;
8952
8953         memset(&ft_params, 0, sizeof(ft_params));
8954         ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]);
8955         ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
8956         ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
8957
8958         return rdev_update_ft_ies(rdev, dev, &ft_params);
8959 }
8960
8961 static int nl80211_crit_protocol_start(struct sk_buff *skb,
8962                                        struct genl_info *info)
8963 {
8964         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8965         struct wireless_dev *wdev = info->user_ptr[1];
8966         enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC;
8967         u16 duration;
8968         int ret;
8969
8970         if (!rdev->ops->crit_proto_start)
8971                 return -EOPNOTSUPP;
8972
8973         if (WARN_ON(!rdev->ops->crit_proto_stop))
8974                 return -EINVAL;
8975
8976         if (rdev->crit_proto_nlportid)
8977                 return -EBUSY;
8978
8979         /* determine protocol if provided */
8980         if (info->attrs[NL80211_ATTR_CRIT_PROT_ID])
8981                 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]);
8982
8983         if (proto >= NUM_NL80211_CRIT_PROTO)
8984                 return -EINVAL;
8985
8986         /* timeout must be provided */
8987         if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION])
8988                 return -EINVAL;
8989
8990         duration =
8991                 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
8992
8993         if (duration > NL80211_CRIT_PROTO_MAX_DURATION)
8994                 return -ERANGE;
8995
8996         ret = rdev_crit_proto_start(rdev, wdev, proto, duration);
8997         if (!ret)
8998                 rdev->crit_proto_nlportid = info->snd_portid;
8999
9000         return ret;
9001 }
9002
9003 static int nl80211_crit_protocol_stop(struct sk_buff *skb,
9004                                       struct genl_info *info)
9005 {
9006         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9007         struct wireless_dev *wdev = info->user_ptr[1];
9008
9009         if (!rdev->ops->crit_proto_stop)
9010                 return -EOPNOTSUPP;
9011
9012         if (rdev->crit_proto_nlportid) {
9013                 rdev->crit_proto_nlportid = 0;
9014                 rdev_crit_proto_stop(rdev, wdev);
9015         }
9016         return 0;
9017 }
9018
9019 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
9020 {
9021         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9022         struct wireless_dev *wdev =
9023                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
9024         int i, err;
9025         u32 vid, subcmd;
9026
9027         if (!rdev->wiphy.vendor_commands)
9028                 return -EOPNOTSUPP;
9029
9030         if (IS_ERR(wdev)) {
9031                 err = PTR_ERR(wdev);
9032                 if (err != -EINVAL)
9033                         return err;
9034                 wdev = NULL;
9035         } else if (wdev->wiphy != &rdev->wiphy) {
9036                 return -EINVAL;
9037         }
9038
9039         if (!info->attrs[NL80211_ATTR_VENDOR_ID] ||
9040             !info->attrs[NL80211_ATTR_VENDOR_SUBCMD])
9041                 return -EINVAL;
9042
9043         vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]);
9044         subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]);
9045         for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
9046                 const struct wiphy_vendor_command *vcmd;
9047                 void *data = NULL;
9048                 int len = 0;
9049
9050                 vcmd = &rdev->wiphy.vendor_commands[i];
9051
9052                 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
9053                         continue;
9054
9055                 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
9056                                    WIPHY_VENDOR_CMD_NEED_NETDEV)) {
9057                         if (!wdev)
9058                                 return -EINVAL;
9059                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
9060                             !wdev->netdev)
9061                                 return -EINVAL;
9062
9063                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
9064                                 if (wdev->netdev &&
9065                                     !netif_running(wdev->netdev))
9066                                         return -ENETDOWN;
9067                                 if (!wdev->netdev && !wdev->p2p_started)
9068                                         return -ENETDOWN;
9069                         }
9070                 } else {
9071                         wdev = NULL;
9072                 }
9073
9074                 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
9075                         data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
9076                         len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
9077                 }
9078
9079                 rdev->cur_cmd_info = info;
9080                 err = rdev->wiphy.vendor_commands[i].doit(&rdev->wiphy, wdev,
9081                                                           data, len);
9082                 rdev->cur_cmd_info = NULL;
9083                 return err;
9084         }
9085
9086         return -EOPNOTSUPP;
9087 }
9088
9089 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
9090                                            enum nl80211_commands cmd,
9091                                            enum nl80211_attrs attr,
9092                                            int approxlen)
9093 {
9094         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9095
9096         if (WARN_ON(!rdev->cur_cmd_info))
9097                 return NULL;
9098
9099         return __cfg80211_alloc_vendor_skb(rdev, approxlen,
9100                                            rdev->cur_cmd_info->snd_portid,
9101                                            rdev->cur_cmd_info->snd_seq,
9102                                            cmd, attr, NULL, GFP_KERNEL);
9103 }
9104 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb);
9105
9106 int cfg80211_vendor_cmd_reply(struct sk_buff *skb)
9107 {
9108         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
9109         void *hdr = ((void **)skb->cb)[1];
9110         struct nlattr *data = ((void **)skb->cb)[2];
9111
9112         if (WARN_ON(!rdev->cur_cmd_info)) {
9113                 kfree_skb(skb);
9114                 return -EINVAL;
9115         }
9116
9117         nla_nest_end(skb, data);
9118         genlmsg_end(skb, hdr);
9119         return genlmsg_reply(skb, rdev->cur_cmd_info);
9120 }
9121 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply);
9122
9123
9124 #define NL80211_FLAG_NEED_WIPHY         0x01
9125 #define NL80211_FLAG_NEED_NETDEV        0x02
9126 #define NL80211_FLAG_NEED_RTNL          0x04
9127 #define NL80211_FLAG_CHECK_NETDEV_UP    0x08
9128 #define NL80211_FLAG_NEED_NETDEV_UP     (NL80211_FLAG_NEED_NETDEV |\
9129                                          NL80211_FLAG_CHECK_NETDEV_UP)
9130 #define NL80211_FLAG_NEED_WDEV          0x10
9131 /* If a netdev is associated, it must be UP, P2P must be started */
9132 #define NL80211_FLAG_NEED_WDEV_UP       (NL80211_FLAG_NEED_WDEV |\
9133                                          NL80211_FLAG_CHECK_NETDEV_UP)
9134
9135 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
9136                             struct genl_info *info)
9137 {
9138         struct cfg80211_registered_device *rdev;
9139         struct wireless_dev *wdev;
9140         struct net_device *dev;
9141         bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL;
9142
9143         if (rtnl)
9144                 rtnl_lock();
9145
9146         if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) {
9147                 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
9148                 if (IS_ERR(rdev)) {
9149                         if (rtnl)
9150                                 rtnl_unlock();
9151                         return PTR_ERR(rdev);
9152                 }
9153                 info->user_ptr[0] = rdev;
9154         } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV ||
9155                    ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
9156                 ASSERT_RTNL();
9157
9158                 wdev = __cfg80211_wdev_from_attrs(genl_info_net(info),
9159                                                   info->attrs);
9160                 if (IS_ERR(wdev)) {
9161                         if (rtnl)
9162                                 rtnl_unlock();
9163                         return PTR_ERR(wdev);
9164                 }
9165
9166                 dev = wdev->netdev;
9167                 rdev = wiphy_to_dev(wdev->wiphy);
9168
9169                 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) {
9170                         if (!dev) {
9171                                 if (rtnl)
9172                                         rtnl_unlock();
9173                                 return -EINVAL;
9174                         }
9175
9176                         info->user_ptr[1] = dev;
9177                 } else {
9178                         info->user_ptr[1] = wdev;
9179                 }
9180
9181                 if (dev) {
9182                         if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
9183                             !netif_running(dev)) {
9184                                 if (rtnl)
9185                                         rtnl_unlock();
9186                                 return -ENETDOWN;
9187                         }
9188
9189                         dev_hold(dev);
9190                 } else if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP) {
9191                         if (!wdev->p2p_started) {
9192                                 if (rtnl)
9193                                         rtnl_unlock();
9194                                 return -ENETDOWN;
9195                         }
9196                 }
9197
9198                 info->user_ptr[0] = rdev;
9199         }
9200
9201         return 0;
9202 }
9203
9204 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
9205                               struct genl_info *info)
9206 {
9207         if (info->user_ptr[1]) {
9208                 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
9209                         struct wireless_dev *wdev = info->user_ptr[1];
9210
9211                         if (wdev->netdev)
9212                                 dev_put(wdev->netdev);
9213                 } else {
9214                         dev_put(info->user_ptr[1]);
9215                 }
9216         }
9217         if (ops->internal_flags & NL80211_FLAG_NEED_RTNL)
9218                 rtnl_unlock();
9219 }
9220
9221 static const struct genl_ops nl80211_ops[] = {
9222         {
9223                 .cmd = NL80211_CMD_GET_WIPHY,
9224                 .doit = nl80211_get_wiphy,
9225                 .dumpit = nl80211_dump_wiphy,
9226                 .done = nl80211_dump_wiphy_done,
9227                 .policy = nl80211_policy,
9228                 /* can be retrieved by unprivileged users */
9229                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9230                                   NL80211_FLAG_NEED_RTNL,
9231         },
9232         {
9233                 .cmd = NL80211_CMD_SET_WIPHY,
9234                 .doit = nl80211_set_wiphy,
9235                 .policy = nl80211_policy,
9236                 .flags = GENL_ADMIN_PERM,
9237                 .internal_flags = NL80211_FLAG_NEED_RTNL,
9238         },
9239         {
9240                 .cmd = NL80211_CMD_GET_INTERFACE,
9241                 .doit = nl80211_get_interface,
9242                 .dumpit = nl80211_dump_interface,
9243                 .policy = nl80211_policy,
9244                 /* can be retrieved by unprivileged users */
9245                 .internal_flags = NL80211_FLAG_NEED_WDEV |
9246                                   NL80211_FLAG_NEED_RTNL,
9247         },
9248         {
9249                 .cmd = NL80211_CMD_SET_INTERFACE,
9250                 .doit = nl80211_set_interface,
9251                 .policy = nl80211_policy,
9252                 .flags = GENL_ADMIN_PERM,
9253                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9254                                   NL80211_FLAG_NEED_RTNL,
9255         },
9256         {
9257                 .cmd = NL80211_CMD_NEW_INTERFACE,
9258                 .doit = nl80211_new_interface,
9259                 .policy = nl80211_policy,
9260                 .flags = GENL_ADMIN_PERM,
9261                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9262                                   NL80211_FLAG_NEED_RTNL,
9263         },
9264         {
9265                 .cmd = NL80211_CMD_DEL_INTERFACE,
9266                 .doit = nl80211_del_interface,
9267                 .policy = nl80211_policy,
9268                 .flags = GENL_ADMIN_PERM,
9269                 .internal_flags = NL80211_FLAG_NEED_WDEV |
9270                                   NL80211_FLAG_NEED_RTNL,
9271         },
9272         {
9273                 .cmd = NL80211_CMD_GET_KEY,
9274                 .doit = nl80211_get_key,
9275                 .policy = nl80211_policy,
9276                 .flags = GENL_ADMIN_PERM,
9277                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9278                                   NL80211_FLAG_NEED_RTNL,
9279         },
9280         {
9281                 .cmd = NL80211_CMD_SET_KEY,
9282                 .doit = nl80211_set_key,
9283                 .policy = nl80211_policy,
9284                 .flags = GENL_ADMIN_PERM,
9285                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9286                                   NL80211_FLAG_NEED_RTNL,
9287         },
9288         {
9289                 .cmd = NL80211_CMD_NEW_KEY,
9290                 .doit = nl80211_new_key,
9291                 .policy = nl80211_policy,
9292                 .flags = GENL_ADMIN_PERM,
9293                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9294                                   NL80211_FLAG_NEED_RTNL,
9295         },
9296         {
9297                 .cmd = NL80211_CMD_DEL_KEY,
9298                 .doit = nl80211_del_key,
9299                 .policy = nl80211_policy,
9300                 .flags = GENL_ADMIN_PERM,
9301                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9302                                   NL80211_FLAG_NEED_RTNL,
9303         },
9304         {
9305                 .cmd = NL80211_CMD_SET_BEACON,
9306                 .policy = nl80211_policy,
9307                 .flags = GENL_ADMIN_PERM,
9308                 .doit = nl80211_set_beacon,
9309                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9310                                   NL80211_FLAG_NEED_RTNL,
9311         },
9312         {
9313                 .cmd = NL80211_CMD_START_AP,
9314                 .policy = nl80211_policy,
9315                 .flags = GENL_ADMIN_PERM,
9316                 .doit = nl80211_start_ap,
9317                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9318                                   NL80211_FLAG_NEED_RTNL,
9319         },
9320         {
9321                 .cmd = NL80211_CMD_STOP_AP,
9322                 .policy = nl80211_policy,
9323                 .flags = GENL_ADMIN_PERM,
9324                 .doit = nl80211_stop_ap,
9325                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9326                                   NL80211_FLAG_NEED_RTNL,
9327         },
9328         {
9329                 .cmd = NL80211_CMD_GET_STATION,
9330                 .doit = nl80211_get_station,
9331                 .dumpit = nl80211_dump_station,
9332                 .policy = nl80211_policy,
9333                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9334                                   NL80211_FLAG_NEED_RTNL,
9335         },
9336         {
9337                 .cmd = NL80211_CMD_SET_STATION,
9338                 .doit = nl80211_set_station,
9339                 .policy = nl80211_policy,
9340                 .flags = GENL_ADMIN_PERM,
9341                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9342                                   NL80211_FLAG_NEED_RTNL,
9343         },
9344         {
9345                 .cmd = NL80211_CMD_NEW_STATION,
9346                 .doit = nl80211_new_station,
9347                 .policy = nl80211_policy,
9348                 .flags = GENL_ADMIN_PERM,
9349                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9350                                   NL80211_FLAG_NEED_RTNL,
9351         },
9352         {
9353                 .cmd = NL80211_CMD_DEL_STATION,
9354                 .doit = nl80211_del_station,
9355                 .policy = nl80211_policy,
9356                 .flags = GENL_ADMIN_PERM,
9357                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9358                                   NL80211_FLAG_NEED_RTNL,
9359         },
9360         {
9361                 .cmd = NL80211_CMD_GET_MPATH,
9362                 .doit = nl80211_get_mpath,
9363                 .dumpit = nl80211_dump_mpath,
9364                 .policy = nl80211_policy,
9365                 .flags = GENL_ADMIN_PERM,
9366                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9367                                   NL80211_FLAG_NEED_RTNL,
9368         },
9369         {
9370                 .cmd = NL80211_CMD_SET_MPATH,
9371                 .doit = nl80211_set_mpath,
9372                 .policy = nl80211_policy,
9373                 .flags = GENL_ADMIN_PERM,
9374                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9375                                   NL80211_FLAG_NEED_RTNL,
9376         },
9377         {
9378                 .cmd = NL80211_CMD_NEW_MPATH,
9379                 .doit = nl80211_new_mpath,
9380                 .policy = nl80211_policy,
9381                 .flags = GENL_ADMIN_PERM,
9382                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9383                                   NL80211_FLAG_NEED_RTNL,
9384         },
9385         {
9386                 .cmd = NL80211_CMD_DEL_MPATH,
9387                 .doit = nl80211_del_mpath,
9388                 .policy = nl80211_policy,
9389                 .flags = GENL_ADMIN_PERM,
9390                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9391                                   NL80211_FLAG_NEED_RTNL,
9392         },
9393         {
9394                 .cmd = NL80211_CMD_SET_BSS,
9395                 .doit = nl80211_set_bss,
9396                 .policy = nl80211_policy,
9397                 .flags = GENL_ADMIN_PERM,
9398                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9399                                   NL80211_FLAG_NEED_RTNL,
9400         },
9401         {
9402                 .cmd = NL80211_CMD_GET_REG,
9403                 .doit = nl80211_get_reg,
9404                 .policy = nl80211_policy,
9405                 .internal_flags = NL80211_FLAG_NEED_RTNL,
9406                 /* can be retrieved by unprivileged users */
9407         },
9408         {
9409                 .cmd = NL80211_CMD_SET_REG,
9410                 .doit = nl80211_set_reg,
9411                 .policy = nl80211_policy,
9412                 .flags = GENL_ADMIN_PERM,
9413                 .internal_flags = NL80211_FLAG_NEED_RTNL,
9414         },
9415         {
9416                 .cmd = NL80211_CMD_REQ_SET_REG,
9417                 .doit = nl80211_req_set_reg,
9418                 .policy = nl80211_policy,
9419                 .flags = GENL_ADMIN_PERM,
9420         },
9421         {
9422                 .cmd = NL80211_CMD_GET_MESH_CONFIG,
9423                 .doit = nl80211_get_mesh_config,
9424                 .policy = nl80211_policy,
9425                 /* can be retrieved by unprivileged users */
9426                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9427                                   NL80211_FLAG_NEED_RTNL,
9428         },
9429         {
9430                 .cmd = NL80211_CMD_SET_MESH_CONFIG,
9431                 .doit = nl80211_update_mesh_config,
9432                 .policy = nl80211_policy,
9433                 .flags = GENL_ADMIN_PERM,
9434                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9435                                   NL80211_FLAG_NEED_RTNL,
9436         },
9437         {
9438                 .cmd = NL80211_CMD_TRIGGER_SCAN,
9439                 .doit = nl80211_trigger_scan,
9440                 .policy = nl80211_policy,
9441                 .flags = GENL_ADMIN_PERM,
9442                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9443                                   NL80211_FLAG_NEED_RTNL,
9444         },
9445         {
9446                 .cmd = NL80211_CMD_GET_SCAN,
9447                 .policy = nl80211_policy,
9448                 .dumpit = nl80211_dump_scan,
9449         },
9450         {
9451                 .cmd = NL80211_CMD_START_SCHED_SCAN,
9452                 .doit = nl80211_start_sched_scan,
9453                 .policy = nl80211_policy,
9454                 .flags = GENL_ADMIN_PERM,
9455                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9456                                   NL80211_FLAG_NEED_RTNL,
9457         },
9458         {
9459                 .cmd = NL80211_CMD_STOP_SCHED_SCAN,
9460                 .doit = nl80211_stop_sched_scan,
9461                 .policy = nl80211_policy,
9462                 .flags = GENL_ADMIN_PERM,
9463                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9464                                   NL80211_FLAG_NEED_RTNL,
9465         },
9466         {
9467                 .cmd = NL80211_CMD_AUTHENTICATE,
9468                 .doit = nl80211_authenticate,
9469                 .policy = nl80211_policy,
9470                 .flags = GENL_ADMIN_PERM,
9471                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9472                                   NL80211_FLAG_NEED_RTNL,
9473         },
9474         {
9475                 .cmd = NL80211_CMD_ASSOCIATE,
9476                 .doit = nl80211_associate,
9477                 .policy = nl80211_policy,
9478                 .flags = GENL_ADMIN_PERM,
9479                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9480                                   NL80211_FLAG_NEED_RTNL,
9481         },
9482         {
9483                 .cmd = NL80211_CMD_DEAUTHENTICATE,
9484                 .doit = nl80211_deauthenticate,
9485                 .policy = nl80211_policy,
9486                 .flags = GENL_ADMIN_PERM,
9487                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9488                                   NL80211_FLAG_NEED_RTNL,
9489         },
9490         {
9491                 .cmd = NL80211_CMD_DISASSOCIATE,
9492                 .doit = nl80211_disassociate,
9493                 .policy = nl80211_policy,
9494                 .flags = GENL_ADMIN_PERM,
9495                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9496                                   NL80211_FLAG_NEED_RTNL,
9497         },
9498         {
9499                 .cmd = NL80211_CMD_JOIN_IBSS,
9500                 .doit = nl80211_join_ibss,
9501                 .policy = nl80211_policy,
9502                 .flags = GENL_ADMIN_PERM,
9503                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9504                                   NL80211_FLAG_NEED_RTNL,
9505         },
9506         {
9507                 .cmd = NL80211_CMD_LEAVE_IBSS,
9508                 .doit = nl80211_leave_ibss,
9509                 .policy = nl80211_policy,
9510                 .flags = GENL_ADMIN_PERM,
9511                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9512                                   NL80211_FLAG_NEED_RTNL,
9513         },
9514 #ifdef CONFIG_NL80211_TESTMODE
9515         {
9516                 .cmd = NL80211_CMD_TESTMODE,
9517                 .doit = nl80211_testmode_do,
9518                 .dumpit = nl80211_testmode_dump,
9519                 .policy = nl80211_policy,
9520                 .flags = GENL_ADMIN_PERM,
9521                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9522                                   NL80211_FLAG_NEED_RTNL,
9523         },
9524 #endif
9525         {
9526                 .cmd = NL80211_CMD_CONNECT,
9527                 .doit = nl80211_connect,
9528                 .policy = nl80211_policy,
9529                 .flags = GENL_ADMIN_PERM,
9530                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9531                                   NL80211_FLAG_NEED_RTNL,
9532         },
9533         {
9534                 .cmd = NL80211_CMD_DISCONNECT,
9535                 .doit = nl80211_disconnect,
9536                 .policy = nl80211_policy,
9537                 .flags = GENL_ADMIN_PERM,
9538                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9539                                   NL80211_FLAG_NEED_RTNL,
9540         },
9541         {
9542                 .cmd = NL80211_CMD_SET_WIPHY_NETNS,
9543                 .doit = nl80211_wiphy_netns,
9544                 .policy = nl80211_policy,
9545                 .flags = GENL_ADMIN_PERM,
9546                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9547                                   NL80211_FLAG_NEED_RTNL,
9548         },
9549         {
9550                 .cmd = NL80211_CMD_GET_SURVEY,
9551                 .policy = nl80211_policy,
9552                 .dumpit = nl80211_dump_survey,
9553         },
9554         {
9555                 .cmd = NL80211_CMD_SET_PMKSA,
9556                 .doit = nl80211_setdel_pmksa,
9557                 .policy = nl80211_policy,
9558                 .flags = GENL_ADMIN_PERM,
9559                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9560                                   NL80211_FLAG_NEED_RTNL,
9561         },
9562         {
9563                 .cmd = NL80211_CMD_DEL_PMKSA,
9564                 .doit = nl80211_setdel_pmksa,
9565                 .policy = nl80211_policy,
9566                 .flags = GENL_ADMIN_PERM,
9567                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9568                                   NL80211_FLAG_NEED_RTNL,
9569         },
9570         {
9571                 .cmd = NL80211_CMD_FLUSH_PMKSA,
9572                 .doit = nl80211_flush_pmksa,
9573                 .policy = nl80211_policy,
9574                 .flags = GENL_ADMIN_PERM,
9575                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9576                                   NL80211_FLAG_NEED_RTNL,
9577         },
9578         {
9579                 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
9580                 .doit = nl80211_remain_on_channel,
9581                 .policy = nl80211_policy,
9582                 .flags = GENL_ADMIN_PERM,
9583                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9584                                   NL80211_FLAG_NEED_RTNL,
9585         },
9586         {
9587                 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
9588                 .doit = nl80211_cancel_remain_on_channel,
9589                 .policy = nl80211_policy,
9590                 .flags = GENL_ADMIN_PERM,
9591                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9592                                   NL80211_FLAG_NEED_RTNL,
9593         },
9594         {
9595                 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
9596                 .doit = nl80211_set_tx_bitrate_mask,
9597                 .policy = nl80211_policy,
9598                 .flags = GENL_ADMIN_PERM,
9599                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9600                                   NL80211_FLAG_NEED_RTNL,
9601         },
9602         {
9603                 .cmd = NL80211_CMD_REGISTER_FRAME,
9604                 .doit = nl80211_register_mgmt,
9605                 .policy = nl80211_policy,
9606                 .flags = GENL_ADMIN_PERM,
9607                 .internal_flags = NL80211_FLAG_NEED_WDEV |
9608                                   NL80211_FLAG_NEED_RTNL,
9609         },
9610         {
9611                 .cmd = NL80211_CMD_FRAME,
9612                 .doit = nl80211_tx_mgmt,
9613                 .policy = nl80211_policy,
9614                 .flags = GENL_ADMIN_PERM,
9615                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9616                                   NL80211_FLAG_NEED_RTNL,
9617         },
9618         {
9619                 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
9620                 .doit = nl80211_tx_mgmt_cancel_wait,
9621                 .policy = nl80211_policy,
9622                 .flags = GENL_ADMIN_PERM,
9623                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9624                                   NL80211_FLAG_NEED_RTNL,
9625         },
9626         {
9627                 .cmd = NL80211_CMD_SET_POWER_SAVE,
9628                 .doit = nl80211_set_power_save,
9629                 .policy = nl80211_policy,
9630                 .flags = GENL_ADMIN_PERM,
9631                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9632                                   NL80211_FLAG_NEED_RTNL,
9633         },
9634         {
9635                 .cmd = NL80211_CMD_GET_POWER_SAVE,
9636                 .doit = nl80211_get_power_save,
9637                 .policy = nl80211_policy,
9638                 /* can be retrieved by unprivileged users */
9639                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9640                                   NL80211_FLAG_NEED_RTNL,
9641         },
9642         {
9643                 .cmd = NL80211_CMD_SET_CQM,
9644                 .doit = nl80211_set_cqm,
9645                 .policy = nl80211_policy,
9646                 .flags = GENL_ADMIN_PERM,
9647                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9648                                   NL80211_FLAG_NEED_RTNL,
9649         },
9650         {
9651                 .cmd = NL80211_CMD_SET_CHANNEL,
9652                 .doit = nl80211_set_channel,
9653                 .policy = nl80211_policy,
9654                 .flags = GENL_ADMIN_PERM,
9655                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9656                                   NL80211_FLAG_NEED_RTNL,
9657         },
9658         {
9659                 .cmd = NL80211_CMD_SET_WDS_PEER,
9660                 .doit = nl80211_set_wds_peer,
9661                 .policy = nl80211_policy,
9662                 .flags = GENL_ADMIN_PERM,
9663                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9664                                   NL80211_FLAG_NEED_RTNL,
9665         },
9666         {
9667                 .cmd = NL80211_CMD_JOIN_MESH,
9668                 .doit = nl80211_join_mesh,
9669                 .policy = nl80211_policy,
9670                 .flags = GENL_ADMIN_PERM,
9671                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9672                                   NL80211_FLAG_NEED_RTNL,
9673         },
9674         {
9675                 .cmd = NL80211_CMD_LEAVE_MESH,
9676                 .doit = nl80211_leave_mesh,
9677                 .policy = nl80211_policy,
9678                 .flags = GENL_ADMIN_PERM,
9679                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9680                                   NL80211_FLAG_NEED_RTNL,
9681         },
9682 #ifdef CONFIG_PM
9683         {
9684                 .cmd = NL80211_CMD_GET_WOWLAN,
9685                 .doit = nl80211_get_wowlan,
9686                 .policy = nl80211_policy,
9687                 /* can be retrieved by unprivileged users */
9688                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9689                                   NL80211_FLAG_NEED_RTNL,
9690         },
9691         {
9692                 .cmd = NL80211_CMD_SET_WOWLAN,
9693                 .doit = nl80211_set_wowlan,
9694                 .policy = nl80211_policy,
9695                 .flags = GENL_ADMIN_PERM,
9696                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9697                                   NL80211_FLAG_NEED_RTNL,
9698         },
9699 #endif
9700         {
9701                 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
9702                 .doit = nl80211_set_rekey_data,
9703                 .policy = nl80211_policy,
9704                 .flags = GENL_ADMIN_PERM,
9705                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9706                                   NL80211_FLAG_NEED_RTNL,
9707         },
9708         {
9709                 .cmd = NL80211_CMD_TDLS_MGMT,
9710                 .doit = nl80211_tdls_mgmt,
9711                 .policy = nl80211_policy,
9712                 .flags = GENL_ADMIN_PERM,
9713                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9714                                   NL80211_FLAG_NEED_RTNL,
9715         },
9716         {
9717                 .cmd = NL80211_CMD_TDLS_OPER,
9718                 .doit = nl80211_tdls_oper,
9719                 .policy = nl80211_policy,
9720                 .flags = GENL_ADMIN_PERM,
9721                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9722                                   NL80211_FLAG_NEED_RTNL,
9723         },
9724         {
9725                 .cmd = NL80211_CMD_UNEXPECTED_FRAME,
9726                 .doit = nl80211_register_unexpected_frame,
9727                 .policy = nl80211_policy,
9728                 .flags = GENL_ADMIN_PERM,
9729                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9730                                   NL80211_FLAG_NEED_RTNL,
9731         },
9732         {
9733                 .cmd = NL80211_CMD_PROBE_CLIENT,
9734                 .doit = nl80211_probe_client,
9735                 .policy = nl80211_policy,
9736                 .flags = GENL_ADMIN_PERM,
9737                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9738                                   NL80211_FLAG_NEED_RTNL,
9739         },
9740         {
9741                 .cmd = NL80211_CMD_REGISTER_BEACONS,
9742                 .doit = nl80211_register_beacons,
9743                 .policy = nl80211_policy,
9744                 .flags = GENL_ADMIN_PERM,
9745                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9746                                   NL80211_FLAG_NEED_RTNL,
9747         },
9748         {
9749                 .cmd = NL80211_CMD_SET_NOACK_MAP,
9750                 .doit = nl80211_set_noack_map,
9751                 .policy = nl80211_policy,
9752                 .flags = GENL_ADMIN_PERM,
9753                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9754                                   NL80211_FLAG_NEED_RTNL,
9755         },
9756         {
9757                 .cmd = NL80211_CMD_START_P2P_DEVICE,
9758                 .doit = nl80211_start_p2p_device,
9759                 .policy = nl80211_policy,
9760                 .flags = GENL_ADMIN_PERM,
9761                 .internal_flags = NL80211_FLAG_NEED_WDEV |
9762                                   NL80211_FLAG_NEED_RTNL,
9763         },
9764         {
9765                 .cmd = NL80211_CMD_STOP_P2P_DEVICE,
9766                 .doit = nl80211_stop_p2p_device,
9767                 .policy = nl80211_policy,
9768                 .flags = GENL_ADMIN_PERM,
9769                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9770                                   NL80211_FLAG_NEED_RTNL,
9771         },
9772         {
9773                 .cmd = NL80211_CMD_SET_MCAST_RATE,
9774                 .doit = nl80211_set_mcast_rate,
9775                 .policy = nl80211_policy,
9776                 .flags = GENL_ADMIN_PERM,
9777                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9778                                   NL80211_FLAG_NEED_RTNL,
9779         },
9780         {
9781                 .cmd = NL80211_CMD_SET_MAC_ACL,
9782                 .doit = nl80211_set_mac_acl,
9783                 .policy = nl80211_policy,
9784                 .flags = GENL_ADMIN_PERM,
9785                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9786                                   NL80211_FLAG_NEED_RTNL,
9787         },
9788         {
9789                 .cmd = NL80211_CMD_RADAR_DETECT,
9790                 .doit = nl80211_start_radar_detection,
9791                 .policy = nl80211_policy,
9792                 .flags = GENL_ADMIN_PERM,
9793                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9794                                   NL80211_FLAG_NEED_RTNL,
9795         },
9796         {
9797                 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
9798                 .doit = nl80211_get_protocol_features,
9799                 .policy = nl80211_policy,
9800         },
9801         {
9802                 .cmd = NL80211_CMD_UPDATE_FT_IES,
9803                 .doit = nl80211_update_ft_ies,
9804                 .policy = nl80211_policy,
9805                 .flags = GENL_ADMIN_PERM,
9806                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9807                                   NL80211_FLAG_NEED_RTNL,
9808         },
9809         {
9810                 .cmd = NL80211_CMD_CRIT_PROTOCOL_START,
9811                 .doit = nl80211_crit_protocol_start,
9812                 .policy = nl80211_policy,
9813                 .flags = GENL_ADMIN_PERM,
9814                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9815                                   NL80211_FLAG_NEED_RTNL,
9816         },
9817         {
9818                 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
9819                 .doit = nl80211_crit_protocol_stop,
9820                 .policy = nl80211_policy,
9821                 .flags = GENL_ADMIN_PERM,
9822                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9823                                   NL80211_FLAG_NEED_RTNL,
9824         },
9825         {
9826                 .cmd = NL80211_CMD_GET_COALESCE,
9827                 .doit = nl80211_get_coalesce,
9828                 .policy = nl80211_policy,
9829                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9830                                   NL80211_FLAG_NEED_RTNL,
9831         },
9832         {
9833                 .cmd = NL80211_CMD_SET_COALESCE,
9834                 .doit = nl80211_set_coalesce,
9835                 .policy = nl80211_policy,
9836                 .flags = GENL_ADMIN_PERM,
9837                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9838                                   NL80211_FLAG_NEED_RTNL,
9839         },
9840         {
9841                 .cmd = NL80211_CMD_CHANNEL_SWITCH,
9842                 .doit = nl80211_channel_switch,
9843                 .policy = nl80211_policy,
9844                 .flags = GENL_ADMIN_PERM,
9845                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9846                                   NL80211_FLAG_NEED_RTNL,
9847         },
9848         {
9849                 .cmd = NL80211_CMD_VENDOR,
9850                 .doit = nl80211_vendor_cmd,
9851                 .policy = nl80211_policy,
9852                 .flags = GENL_ADMIN_PERM,
9853                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9854                                   NL80211_FLAG_NEED_RTNL,
9855         },
9856 };
9857
9858 /* notification functions */
9859
9860 void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev)
9861 {
9862         struct sk_buff *msg;
9863         struct nl80211_dump_wiphy_state state = {};
9864
9865         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9866         if (!msg)
9867                 return;
9868
9869         if (nl80211_send_wiphy(rdev, msg, 0, 0, 0, &state) < 0) {
9870                 nlmsg_free(msg);
9871                 return;
9872         }
9873
9874         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
9875                                 NL80211_MCGRP_CONFIG, GFP_KERNEL);
9876 }
9877
9878 static int nl80211_add_scan_req(struct sk_buff *msg,
9879                                 struct cfg80211_registered_device *rdev)
9880 {
9881         struct cfg80211_scan_request *req = rdev->scan_req;
9882         struct nlattr *nest;
9883         int i;
9884
9885         if (WARN_ON(!req))
9886                 return 0;
9887
9888         nest = nla_nest_start(msg, NL80211_ATTR_SCAN_SSIDS);
9889         if (!nest)
9890                 goto nla_put_failure;
9891         for (i = 0; i < req->n_ssids; i++) {
9892                 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid))
9893                         goto nla_put_failure;
9894         }
9895         nla_nest_end(msg, nest);
9896
9897         nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
9898         if (!nest)
9899                 goto nla_put_failure;
9900         for (i = 0; i < req->n_channels; i++) {
9901                 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
9902                         goto nla_put_failure;
9903         }
9904         nla_nest_end(msg, nest);
9905
9906         if (req->ie &&
9907             nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie))
9908                 goto nla_put_failure;
9909
9910         if (req->flags &&
9911             nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags))
9912                 goto nla_put_failure;
9913
9914         return 0;
9915  nla_put_failure:
9916         return -ENOBUFS;
9917 }
9918
9919 static int nl80211_send_scan_msg(struct sk_buff *msg,
9920                                  struct cfg80211_registered_device *rdev,
9921                                  struct wireless_dev *wdev,
9922                                  u32 portid, u32 seq, int flags,
9923                                  u32 cmd)
9924 {
9925         void *hdr;
9926
9927         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
9928         if (!hdr)
9929                 return -1;
9930
9931         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9932             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
9933                                          wdev->netdev->ifindex)) ||
9934             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
9935                 goto nla_put_failure;
9936
9937         /* ignore errors and send incomplete event anyway */
9938         nl80211_add_scan_req(msg, rdev);
9939
9940         return genlmsg_end(msg, hdr);
9941
9942  nla_put_failure:
9943         genlmsg_cancel(msg, hdr);
9944         return -EMSGSIZE;
9945 }
9946
9947 static int
9948 nl80211_send_sched_scan_msg(struct sk_buff *msg,
9949                             struct cfg80211_registered_device *rdev,
9950                             struct net_device *netdev,
9951                             u32 portid, u32 seq, int flags, u32 cmd)
9952 {
9953         void *hdr;
9954
9955         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
9956         if (!hdr)
9957                 return -1;
9958
9959         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9960             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
9961                 goto nla_put_failure;
9962
9963         return genlmsg_end(msg, hdr);
9964
9965  nla_put_failure:
9966         genlmsg_cancel(msg, hdr);
9967         return -EMSGSIZE;
9968 }
9969
9970 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
9971                              struct wireless_dev *wdev)
9972 {
9973         struct sk_buff *msg;
9974
9975         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9976         if (!msg)
9977                 return;
9978
9979         if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
9980                                   NL80211_CMD_TRIGGER_SCAN) < 0) {
9981                 nlmsg_free(msg);
9982                 return;
9983         }
9984
9985         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
9986                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
9987 }
9988
9989 void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
9990                             struct wireless_dev *wdev)
9991 {
9992         struct sk_buff *msg;
9993
9994         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9995         if (!msg)
9996                 return;
9997
9998         if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
9999                                   NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
10000                 nlmsg_free(msg);
10001                 return;
10002         }
10003
10004         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10005                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
10006 }
10007
10008 void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
10009                                struct wireless_dev *wdev)
10010 {
10011         struct sk_buff *msg;
10012
10013         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10014         if (!msg)
10015                 return;
10016
10017         if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
10018                                   NL80211_CMD_SCAN_ABORTED) < 0) {
10019                 nlmsg_free(msg);
10020                 return;
10021         }
10022
10023         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10024                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
10025 }
10026
10027 void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev,
10028                                      struct net_device *netdev)
10029 {
10030         struct sk_buff *msg;
10031
10032         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10033         if (!msg)
10034                 return;
10035
10036         if (nl80211_send_sched_scan_msg(msg, rdev, netdev, 0, 0, 0,
10037                                         NL80211_CMD_SCHED_SCAN_RESULTS) < 0) {
10038                 nlmsg_free(msg);
10039                 return;
10040         }
10041
10042         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10043                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
10044 }
10045
10046 void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
10047                              struct net_device *netdev, u32 cmd)
10048 {
10049         struct sk_buff *msg;
10050
10051         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10052         if (!msg)
10053                 return;
10054
10055         if (nl80211_send_sched_scan_msg(msg, rdev, netdev, 0, 0, 0, cmd) < 0) {
10056                 nlmsg_free(msg);
10057                 return;
10058         }
10059
10060         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10061                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
10062 }
10063
10064 /*
10065  * This can happen on global regulatory changes or device specific settings
10066  * based on custom world regulatory domains.
10067  */
10068 void nl80211_send_reg_change_event(struct regulatory_request *request)
10069 {
10070         struct sk_buff *msg;
10071         void *hdr;
10072
10073         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10074         if (!msg)
10075                 return;
10076
10077         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_CHANGE);
10078         if (!hdr) {
10079                 nlmsg_free(msg);
10080                 return;
10081         }
10082
10083         /* Userspace can always count this one always being set */
10084         if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator))
10085                 goto nla_put_failure;
10086
10087         if (request->alpha2[0] == '0' && request->alpha2[1] == '0') {
10088                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
10089                                NL80211_REGDOM_TYPE_WORLD))
10090                         goto nla_put_failure;
10091         } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') {
10092                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
10093                                NL80211_REGDOM_TYPE_CUSTOM_WORLD))
10094                         goto nla_put_failure;
10095         } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
10096                    request->intersect) {
10097                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
10098                                NL80211_REGDOM_TYPE_INTERSECTION))
10099                         goto nla_put_failure;
10100         } else {
10101                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
10102                                NL80211_REGDOM_TYPE_COUNTRY) ||
10103                     nla_put_string(msg, NL80211_ATTR_REG_ALPHA2,
10104                                    request->alpha2))
10105                         goto nla_put_failure;
10106         }
10107
10108         if (request->wiphy_idx != WIPHY_IDX_INVALID &&
10109             nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx))
10110                 goto nla_put_failure;
10111
10112         genlmsg_end(msg, hdr);
10113
10114         rcu_read_lock();
10115         genlmsg_multicast_allns(&nl80211_fam, msg, 0,
10116                                 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
10117         rcu_read_unlock();
10118
10119         return;
10120
10121 nla_put_failure:
10122         genlmsg_cancel(msg, hdr);
10123         nlmsg_free(msg);
10124 }
10125
10126 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
10127                                     struct net_device *netdev,
10128                                     const u8 *buf, size_t len,
10129                                     enum nl80211_commands cmd, gfp_t gfp)
10130 {
10131         struct sk_buff *msg;
10132         void *hdr;
10133
10134         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10135         if (!msg)
10136                 return;
10137
10138         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
10139         if (!hdr) {
10140                 nlmsg_free(msg);
10141                 return;
10142         }
10143
10144         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10145             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10146             nla_put(msg, NL80211_ATTR_FRAME, len, buf))
10147                 goto nla_put_failure;
10148
10149         genlmsg_end(msg, hdr);
10150
10151         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10152                                 NL80211_MCGRP_MLME, gfp);
10153         return;
10154
10155  nla_put_failure:
10156         genlmsg_cancel(msg, hdr);
10157         nlmsg_free(msg);
10158 }
10159
10160 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
10161                           struct net_device *netdev, const u8 *buf,
10162                           size_t len, gfp_t gfp)
10163 {
10164         nl80211_send_mlme_event(rdev, netdev, buf, len,
10165                                 NL80211_CMD_AUTHENTICATE, gfp);
10166 }
10167
10168 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
10169                            struct net_device *netdev, const u8 *buf,
10170                            size_t len, gfp_t gfp)
10171 {
10172         nl80211_send_mlme_event(rdev, netdev, buf, len,
10173                                 NL80211_CMD_ASSOCIATE, gfp);
10174 }
10175
10176 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
10177                          struct net_device *netdev, const u8 *buf,
10178                          size_t len, gfp_t gfp)
10179 {
10180         nl80211_send_mlme_event(rdev, netdev, buf, len,
10181                                 NL80211_CMD_DEAUTHENTICATE, gfp);
10182 }
10183
10184 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
10185                            struct net_device *netdev, const u8 *buf,
10186                            size_t len, gfp_t gfp)
10187 {
10188         nl80211_send_mlme_event(rdev, netdev, buf, len,
10189                                 NL80211_CMD_DISASSOCIATE, gfp);
10190 }
10191
10192 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
10193                                   size_t len)
10194 {
10195         struct wireless_dev *wdev = dev->ieee80211_ptr;
10196         struct wiphy *wiphy = wdev->wiphy;
10197         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10198         const struct ieee80211_mgmt *mgmt = (void *)buf;
10199         u32 cmd;
10200
10201         if (WARN_ON(len < 2))
10202                 return;
10203
10204         if (ieee80211_is_deauth(mgmt->frame_control))
10205                 cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE;
10206         else
10207                 cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
10208
10209         trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
10210         nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC);
10211 }
10212 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
10213
10214 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
10215                                       struct net_device *netdev, int cmd,
10216                                       const u8 *addr, gfp_t gfp)
10217 {
10218         struct sk_buff *msg;
10219         void *hdr;
10220
10221         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10222         if (!msg)
10223                 return;
10224
10225         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
10226         if (!hdr) {
10227                 nlmsg_free(msg);
10228                 return;
10229         }
10230
10231         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10232             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10233             nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
10234             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
10235                 goto nla_put_failure;
10236
10237         genlmsg_end(msg, hdr);
10238
10239         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10240                                 NL80211_MCGRP_MLME, gfp);
10241         return;
10242
10243  nla_put_failure:
10244         genlmsg_cancel(msg, hdr);
10245         nlmsg_free(msg);
10246 }
10247
10248 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
10249                                struct net_device *netdev, const u8 *addr,
10250                                gfp_t gfp)
10251 {
10252         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
10253                                   addr, gfp);
10254 }
10255
10256 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
10257                                 struct net_device *netdev, const u8 *addr,
10258                                 gfp_t gfp)
10259 {
10260         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
10261                                   addr, gfp);
10262 }
10263
10264 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
10265                                  struct net_device *netdev, const u8 *bssid,
10266                                  const u8 *req_ie, size_t req_ie_len,
10267                                  const u8 *resp_ie, size_t resp_ie_len,
10268                                  u16 status, gfp_t gfp)
10269 {
10270         struct sk_buff *msg;
10271         void *hdr;
10272
10273         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10274         if (!msg)
10275                 return;
10276
10277         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
10278         if (!hdr) {
10279                 nlmsg_free(msg);
10280                 return;
10281         }
10282
10283         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10284             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10285             (bssid && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) ||
10286             nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, status) ||
10287             (req_ie &&
10288              nla_put(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie)) ||
10289             (resp_ie &&
10290              nla_put(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie)))
10291                 goto nla_put_failure;
10292
10293         genlmsg_end(msg, hdr);
10294
10295         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10296                                 NL80211_MCGRP_MLME, gfp);
10297         return;
10298
10299  nla_put_failure:
10300         genlmsg_cancel(msg, hdr);
10301         nlmsg_free(msg);
10302
10303 }
10304
10305 void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
10306                          struct net_device *netdev, const u8 *bssid,
10307                          const u8 *req_ie, size_t req_ie_len,
10308                          const u8 *resp_ie, size_t resp_ie_len, gfp_t gfp)
10309 {
10310         struct sk_buff *msg;
10311         void *hdr;
10312
10313         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10314         if (!msg)
10315                 return;
10316
10317         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
10318         if (!hdr) {
10319                 nlmsg_free(msg);
10320                 return;
10321         }
10322
10323         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10324             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10325             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) ||
10326             (req_ie &&
10327              nla_put(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie)) ||
10328             (resp_ie &&
10329              nla_put(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie)))
10330                 goto nla_put_failure;
10331
10332         genlmsg_end(msg, hdr);
10333
10334         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10335                                 NL80211_MCGRP_MLME, gfp);
10336         return;
10337
10338  nla_put_failure:
10339         genlmsg_cancel(msg, hdr);
10340         nlmsg_free(msg);
10341
10342 }
10343
10344 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
10345                                struct net_device *netdev, u16 reason,
10346                                const u8 *ie, size_t ie_len, bool from_ap)
10347 {
10348         struct sk_buff *msg;
10349         void *hdr;
10350
10351         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10352         if (!msg)
10353                 return;
10354
10355         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
10356         if (!hdr) {
10357                 nlmsg_free(msg);
10358                 return;
10359         }
10360
10361         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10362             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10363             (from_ap && reason &&
10364              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) ||
10365             (from_ap &&
10366              nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) ||
10367             (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie)))
10368                 goto nla_put_failure;
10369
10370         genlmsg_end(msg, hdr);
10371
10372         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10373                                 NL80211_MCGRP_MLME, GFP_KERNEL);
10374         return;
10375
10376  nla_put_failure:
10377         genlmsg_cancel(msg, hdr);
10378         nlmsg_free(msg);
10379
10380 }
10381
10382 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
10383                              struct net_device *netdev, const u8 *bssid,
10384                              gfp_t gfp)
10385 {
10386         struct sk_buff *msg;
10387         void *hdr;
10388
10389         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10390         if (!msg)
10391                 return;
10392
10393         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
10394         if (!hdr) {
10395                 nlmsg_free(msg);
10396                 return;
10397         }
10398
10399         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10400             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10401             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
10402                 goto nla_put_failure;
10403
10404         genlmsg_end(msg, hdr);
10405
10406         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10407                                 NL80211_MCGRP_MLME, gfp);
10408         return;
10409
10410  nla_put_failure:
10411         genlmsg_cancel(msg, hdr);
10412         nlmsg_free(msg);
10413 }
10414
10415 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
10416                                         const u8* ie, u8 ie_len, gfp_t gfp)
10417 {
10418         struct wireless_dev *wdev = dev->ieee80211_ptr;
10419         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
10420         struct sk_buff *msg;
10421         void *hdr;
10422
10423         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
10424                 return;
10425
10426         trace_cfg80211_notify_new_peer_candidate(dev, addr);
10427
10428         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10429         if (!msg)
10430                 return;
10431
10432         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
10433         if (!hdr) {
10434                 nlmsg_free(msg);
10435                 return;
10436         }
10437
10438         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10439             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10440             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
10441             (ie_len && ie &&
10442              nla_put(msg, NL80211_ATTR_IE, ie_len , ie)))
10443                 goto nla_put_failure;
10444
10445         genlmsg_end(msg, hdr);
10446
10447         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10448                                 NL80211_MCGRP_MLME, gfp);
10449         return;
10450
10451  nla_put_failure:
10452         genlmsg_cancel(msg, hdr);
10453         nlmsg_free(msg);
10454 }
10455 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
10456
10457 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
10458                                  struct net_device *netdev, const u8 *addr,
10459                                  enum nl80211_key_type key_type, int key_id,
10460                                  const u8 *tsc, gfp_t gfp)
10461 {
10462         struct sk_buff *msg;
10463         void *hdr;
10464
10465         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10466         if (!msg)
10467                 return;
10468
10469         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
10470         if (!hdr) {
10471                 nlmsg_free(msg);
10472                 return;
10473         }
10474
10475         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10476             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10477             (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) ||
10478             nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) ||
10479             (key_id != -1 &&
10480              nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) ||
10481             (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc)))
10482                 goto nla_put_failure;
10483
10484         genlmsg_end(msg, hdr);
10485
10486         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10487                                 NL80211_MCGRP_MLME, gfp);
10488         return;
10489
10490  nla_put_failure:
10491         genlmsg_cancel(msg, hdr);
10492         nlmsg_free(msg);
10493 }
10494
10495 void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
10496                                     struct ieee80211_channel *channel_before,
10497                                     struct ieee80211_channel *channel_after)
10498 {
10499         struct sk_buff *msg;
10500         void *hdr;
10501         struct nlattr *nl_freq;
10502
10503         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
10504         if (!msg)
10505                 return;
10506
10507         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
10508         if (!hdr) {
10509                 nlmsg_free(msg);
10510                 return;
10511         }
10512
10513         /*
10514          * Since we are applying the beacon hint to a wiphy we know its
10515          * wiphy_idx is valid
10516          */
10517         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
10518                 goto nla_put_failure;
10519
10520         /* Before */
10521         nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_BEFORE);
10522         if (!nl_freq)
10523                 goto nla_put_failure;
10524         if (nl80211_msg_put_channel(msg, channel_before, false))
10525                 goto nla_put_failure;
10526         nla_nest_end(msg, nl_freq);
10527
10528         /* After */
10529         nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_AFTER);
10530         if (!nl_freq)
10531                 goto nla_put_failure;
10532         if (nl80211_msg_put_channel(msg, channel_after, false))
10533                 goto nla_put_failure;
10534         nla_nest_end(msg, nl_freq);
10535
10536         genlmsg_end(msg, hdr);
10537
10538         rcu_read_lock();
10539         genlmsg_multicast_allns(&nl80211_fam, msg, 0,
10540                                 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
10541         rcu_read_unlock();
10542
10543         return;
10544
10545 nla_put_failure:
10546         genlmsg_cancel(msg, hdr);
10547         nlmsg_free(msg);
10548 }
10549
10550 static void nl80211_send_remain_on_chan_event(
10551         int cmd, struct cfg80211_registered_device *rdev,
10552         struct wireless_dev *wdev, u64 cookie,
10553         struct ieee80211_channel *chan,
10554         unsigned int duration, gfp_t gfp)
10555 {
10556         struct sk_buff *msg;
10557         void *hdr;
10558
10559         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10560         if (!msg)
10561                 return;
10562
10563         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
10564         if (!hdr) {
10565                 nlmsg_free(msg);
10566                 return;
10567         }
10568
10569         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10570             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
10571                                          wdev->netdev->ifindex)) ||
10572             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
10573             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) ||
10574             nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
10575                         NL80211_CHAN_NO_HT) ||
10576             nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
10577                 goto nla_put_failure;
10578
10579         if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL &&
10580             nla_put_u32(msg, NL80211_ATTR_DURATION, duration))
10581                 goto nla_put_failure;
10582
10583         genlmsg_end(msg, hdr);
10584
10585         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10586                                 NL80211_MCGRP_MLME, gfp);
10587         return;
10588
10589  nla_put_failure:
10590         genlmsg_cancel(msg, hdr);
10591         nlmsg_free(msg);
10592 }
10593
10594 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
10595                                struct ieee80211_channel *chan,
10596                                unsigned int duration, gfp_t gfp)
10597 {
10598         struct wiphy *wiphy = wdev->wiphy;
10599         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10600
10601         trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
10602         nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
10603                                           rdev, wdev, cookie, chan,
10604                                           duration, gfp);
10605 }
10606 EXPORT_SYMBOL(cfg80211_ready_on_channel);
10607
10608 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
10609                                         struct ieee80211_channel *chan,
10610                                         gfp_t gfp)
10611 {
10612         struct wiphy *wiphy = wdev->wiphy;
10613         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10614
10615         trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
10616         nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
10617                                           rdev, wdev, cookie, chan, 0, gfp);
10618 }
10619 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
10620
10621 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
10622                       struct station_info *sinfo, gfp_t gfp)
10623 {
10624         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
10625         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10626         struct sk_buff *msg;
10627
10628         trace_cfg80211_new_sta(dev, mac_addr, sinfo);
10629
10630         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10631         if (!msg)
10632                 return;
10633
10634         if (nl80211_send_station(msg, 0, 0, 0,
10635                                  rdev, dev, mac_addr, sinfo) < 0) {
10636                 nlmsg_free(msg);
10637                 return;
10638         }
10639
10640         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10641                                 NL80211_MCGRP_MLME, gfp);
10642 }
10643 EXPORT_SYMBOL(cfg80211_new_sta);
10644
10645 void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp)
10646 {
10647         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
10648         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10649         struct sk_buff *msg;
10650         void *hdr;
10651
10652         trace_cfg80211_del_sta(dev, mac_addr);
10653
10654         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10655         if (!msg)
10656                 return;
10657
10658         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_STATION);
10659         if (!hdr) {
10660                 nlmsg_free(msg);
10661                 return;
10662         }
10663
10664         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10665             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
10666                 goto nla_put_failure;
10667
10668         genlmsg_end(msg, hdr);
10669
10670         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10671                                 NL80211_MCGRP_MLME, gfp);
10672         return;
10673
10674  nla_put_failure:
10675         genlmsg_cancel(msg, hdr);
10676         nlmsg_free(msg);
10677 }
10678 EXPORT_SYMBOL(cfg80211_del_sta);
10679
10680 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
10681                           enum nl80211_connect_failed_reason reason,
10682                           gfp_t gfp)
10683 {
10684         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
10685         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10686         struct sk_buff *msg;
10687         void *hdr;
10688
10689         msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
10690         if (!msg)
10691                 return;
10692
10693         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
10694         if (!hdr) {
10695                 nlmsg_free(msg);
10696                 return;
10697         }
10698
10699         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10700             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
10701             nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
10702                 goto nla_put_failure;
10703
10704         genlmsg_end(msg, hdr);
10705
10706         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10707                                 NL80211_MCGRP_MLME, gfp);
10708         return;
10709
10710  nla_put_failure:
10711         genlmsg_cancel(msg, hdr);
10712         nlmsg_free(msg);
10713 }
10714 EXPORT_SYMBOL(cfg80211_conn_failed);
10715
10716 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
10717                                        const u8 *addr, gfp_t gfp)
10718 {
10719         struct wireless_dev *wdev = dev->ieee80211_ptr;
10720         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
10721         struct sk_buff *msg;
10722         void *hdr;
10723         u32 nlportid = ACCESS_ONCE(wdev->ap_unexpected_nlportid);
10724
10725         if (!nlportid)
10726                 return false;
10727
10728         msg = nlmsg_new(100, gfp);
10729         if (!msg)
10730                 return true;
10731
10732         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
10733         if (!hdr) {
10734                 nlmsg_free(msg);
10735                 return true;
10736         }
10737
10738         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10739             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10740             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
10741                 goto nla_put_failure;
10742
10743         genlmsg_end(msg, hdr);
10744         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
10745         return true;
10746
10747  nla_put_failure:
10748         genlmsg_cancel(msg, hdr);
10749         nlmsg_free(msg);
10750         return true;
10751 }
10752
10753 bool cfg80211_rx_spurious_frame(struct net_device *dev,
10754                                 const u8 *addr, gfp_t gfp)
10755 {
10756         struct wireless_dev *wdev = dev->ieee80211_ptr;
10757         bool ret;
10758
10759         trace_cfg80211_rx_spurious_frame(dev, addr);
10760
10761         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
10762                     wdev->iftype != NL80211_IFTYPE_P2P_GO)) {
10763                 trace_cfg80211_return_bool(false);
10764                 return false;
10765         }
10766         ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME,
10767                                          addr, gfp);
10768         trace_cfg80211_return_bool(ret);
10769         return ret;
10770 }
10771 EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
10772
10773 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
10774                                         const u8 *addr, gfp_t gfp)
10775 {
10776         struct wireless_dev *wdev = dev->ieee80211_ptr;
10777         bool ret;
10778
10779         trace_cfg80211_rx_unexpected_4addr_frame(dev, addr);
10780
10781         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
10782                     wdev->iftype != NL80211_IFTYPE_P2P_GO &&
10783                     wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
10784                 trace_cfg80211_return_bool(false);
10785                 return false;
10786         }
10787         ret = __nl80211_unexpected_frame(dev,
10788                                          NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
10789                                          addr, gfp);
10790         trace_cfg80211_return_bool(ret);
10791         return ret;
10792 }
10793 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
10794
10795 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
10796                       struct wireless_dev *wdev, u32 nlportid,
10797                       int freq, int sig_dbm,
10798                       const u8 *buf, size_t len, u32 flags, gfp_t gfp)
10799 {
10800         struct net_device *netdev = wdev->netdev;
10801         struct sk_buff *msg;
10802         void *hdr;
10803
10804         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10805         if (!msg)
10806                 return -ENOMEM;
10807
10808         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
10809         if (!hdr) {
10810                 nlmsg_free(msg);
10811                 return -ENOMEM;
10812         }
10813
10814         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10815             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
10816                                         netdev->ifindex)) ||
10817             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
10818             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
10819             (sig_dbm &&
10820              nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
10821             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
10822             (flags &&
10823              nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags)))
10824                 goto nla_put_failure;
10825
10826         genlmsg_end(msg, hdr);
10827
10828         return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
10829
10830  nla_put_failure:
10831         genlmsg_cancel(msg, hdr);
10832         nlmsg_free(msg);
10833         return -ENOBUFS;
10834 }
10835
10836 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
10837                              const u8 *buf, size_t len, bool ack, gfp_t gfp)
10838 {
10839         struct wiphy *wiphy = wdev->wiphy;
10840         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10841         struct net_device *netdev = wdev->netdev;
10842         struct sk_buff *msg;
10843         void *hdr;
10844
10845         trace_cfg80211_mgmt_tx_status(wdev, cookie, ack);
10846
10847         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10848         if (!msg)
10849                 return;
10850
10851         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS);
10852         if (!hdr) {
10853                 nlmsg_free(msg);
10854                 return;
10855         }
10856
10857         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10858             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
10859                                    netdev->ifindex)) ||
10860             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
10861             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
10862             nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) ||
10863             (ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
10864                 goto nla_put_failure;
10865
10866         genlmsg_end(msg, hdr);
10867
10868         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10869                                 NL80211_MCGRP_MLME, gfp);
10870         return;
10871
10872  nla_put_failure:
10873         genlmsg_cancel(msg, hdr);
10874         nlmsg_free(msg);
10875 }
10876 EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
10877
10878 void cfg80211_cqm_rssi_notify(struct net_device *dev,
10879                               enum nl80211_cqm_rssi_threshold_event rssi_event,
10880                               gfp_t gfp)
10881 {
10882         struct wireless_dev *wdev = dev->ieee80211_ptr;
10883         struct wiphy *wiphy = wdev->wiphy;
10884         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10885         struct sk_buff *msg;
10886         struct nlattr *pinfoattr;
10887         void *hdr;
10888
10889         trace_cfg80211_cqm_rssi_notify(dev, rssi_event);
10890
10891         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10892         if (!msg)
10893                 return;
10894
10895         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
10896         if (!hdr) {
10897                 nlmsg_free(msg);
10898                 return;
10899         }
10900
10901         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10902             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
10903                 goto nla_put_failure;
10904
10905         pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM);
10906         if (!pinfoattr)
10907                 goto nla_put_failure;
10908
10909         if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
10910                         rssi_event))
10911                 goto nla_put_failure;
10912
10913         nla_nest_end(msg, pinfoattr);
10914
10915         genlmsg_end(msg, hdr);
10916
10917         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10918                                 NL80211_MCGRP_MLME, gfp);
10919         return;
10920
10921  nla_put_failure:
10922         genlmsg_cancel(msg, hdr);
10923         nlmsg_free(msg);
10924 }
10925 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
10926
10927 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
10928                                      struct net_device *netdev, const u8 *bssid,
10929                                      const u8 *replay_ctr, gfp_t gfp)
10930 {
10931         struct sk_buff *msg;
10932         struct nlattr *rekey_attr;
10933         void *hdr;
10934
10935         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10936         if (!msg)
10937                 return;
10938
10939         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD);
10940         if (!hdr) {
10941                 nlmsg_free(msg);
10942                 return;
10943         }
10944
10945         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10946             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10947             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
10948                 goto nla_put_failure;
10949
10950         rekey_attr = nla_nest_start(msg, NL80211_ATTR_REKEY_DATA);
10951         if (!rekey_attr)
10952                 goto nla_put_failure;
10953
10954         if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR,
10955                     NL80211_REPLAY_CTR_LEN, replay_ctr))
10956                 goto nla_put_failure;
10957
10958         nla_nest_end(msg, rekey_attr);
10959
10960         genlmsg_end(msg, hdr);
10961
10962         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10963                                 NL80211_MCGRP_MLME, gfp);
10964         return;
10965
10966  nla_put_failure:
10967         genlmsg_cancel(msg, hdr);
10968         nlmsg_free(msg);
10969 }
10970
10971 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
10972                                const u8 *replay_ctr, gfp_t gfp)
10973 {
10974         struct wireless_dev *wdev = dev->ieee80211_ptr;
10975         struct wiphy *wiphy = wdev->wiphy;
10976         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10977
10978         trace_cfg80211_gtk_rekey_notify(dev, bssid);
10979         nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
10980 }
10981 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
10982
10983 static void
10984 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
10985                                struct net_device *netdev, int index,
10986                                const u8 *bssid, bool preauth, gfp_t gfp)
10987 {
10988         struct sk_buff *msg;
10989         struct nlattr *attr;
10990         void *hdr;
10991
10992         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10993         if (!msg)
10994                 return;
10995
10996         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE);
10997         if (!hdr) {
10998                 nlmsg_free(msg);
10999                 return;
11000         }
11001
11002         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11003             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
11004                 goto nla_put_failure;
11005
11006         attr = nla_nest_start(msg, NL80211_ATTR_PMKSA_CANDIDATE);
11007         if (!attr)
11008                 goto nla_put_failure;
11009
11010         if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) ||
11011             nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) ||
11012             (preauth &&
11013              nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH)))
11014                 goto nla_put_failure;
11015
11016         nla_nest_end(msg, attr);
11017
11018         genlmsg_end(msg, hdr);
11019
11020         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11021                                 NL80211_MCGRP_MLME, gfp);
11022         return;
11023
11024  nla_put_failure:
11025         genlmsg_cancel(msg, hdr);
11026         nlmsg_free(msg);
11027 }
11028
11029 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
11030                                      const u8 *bssid, bool preauth, gfp_t gfp)
11031 {
11032         struct wireless_dev *wdev = dev->ieee80211_ptr;
11033         struct wiphy *wiphy = wdev->wiphy;
11034         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11035
11036         trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
11037         nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
11038 }
11039 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
11040
11041 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
11042                                      struct net_device *netdev,
11043                                      struct cfg80211_chan_def *chandef,
11044                                      gfp_t gfp)
11045 {
11046         struct sk_buff *msg;
11047         void *hdr;
11048
11049         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11050         if (!msg)
11051                 return;
11052
11053         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CH_SWITCH_NOTIFY);
11054         if (!hdr) {
11055                 nlmsg_free(msg);
11056                 return;
11057         }
11058
11059         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
11060                 goto nla_put_failure;
11061
11062         if (nl80211_send_chandef(msg, chandef))
11063                 goto nla_put_failure;
11064
11065         genlmsg_end(msg, hdr);
11066
11067         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11068                                 NL80211_MCGRP_MLME, gfp);
11069         return;
11070
11071  nla_put_failure:
11072         genlmsg_cancel(msg, hdr);
11073         nlmsg_free(msg);
11074 }
11075
11076 void cfg80211_ch_switch_notify(struct net_device *dev,
11077                                struct cfg80211_chan_def *chandef)
11078 {
11079         struct wireless_dev *wdev = dev->ieee80211_ptr;
11080         struct wiphy *wiphy = wdev->wiphy;
11081         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11082
11083         ASSERT_WDEV_LOCK(wdev);
11084
11085         trace_cfg80211_ch_switch_notify(dev, chandef);
11086
11087         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
11088                     wdev->iftype != NL80211_IFTYPE_P2P_GO &&
11089                     wdev->iftype != NL80211_IFTYPE_ADHOC &&
11090                     wdev->iftype != NL80211_IFTYPE_MESH_POINT))
11091                 return;
11092
11093         wdev->channel = chandef->chan;
11094         nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL);
11095 }
11096 EXPORT_SYMBOL(cfg80211_ch_switch_notify);
11097
11098 void cfg80211_cqm_txe_notify(struct net_device *dev,
11099                              const u8 *peer, u32 num_packets,
11100                              u32 rate, u32 intvl, gfp_t gfp)
11101 {
11102         struct wireless_dev *wdev = dev->ieee80211_ptr;
11103         struct wiphy *wiphy = wdev->wiphy;
11104         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11105         struct sk_buff *msg;
11106         struct nlattr *pinfoattr;
11107         void *hdr;
11108
11109         msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
11110         if (!msg)
11111                 return;
11112
11113         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
11114         if (!hdr) {
11115                 nlmsg_free(msg);
11116                 return;
11117         }
11118
11119         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11120             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
11121             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer))
11122                 goto nla_put_failure;
11123
11124         pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM);
11125         if (!pinfoattr)
11126                 goto nla_put_failure;
11127
11128         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets))
11129                 goto nla_put_failure;
11130
11131         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate))
11132                 goto nla_put_failure;
11133
11134         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl))
11135                 goto nla_put_failure;
11136
11137         nla_nest_end(msg, pinfoattr);
11138
11139         genlmsg_end(msg, hdr);
11140
11141         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11142                                 NL80211_MCGRP_MLME, gfp);
11143         return;
11144
11145  nla_put_failure:
11146         genlmsg_cancel(msg, hdr);
11147         nlmsg_free(msg);
11148 }
11149 EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
11150
11151 void
11152 nl80211_radar_notify(struct cfg80211_registered_device *rdev,
11153                      const struct cfg80211_chan_def *chandef,
11154                      enum nl80211_radar_event event,
11155                      struct net_device *netdev, gfp_t gfp)
11156 {
11157         struct sk_buff *msg;
11158         void *hdr;
11159
11160         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11161         if (!msg)
11162                 return;
11163
11164         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT);
11165         if (!hdr) {
11166                 nlmsg_free(msg);
11167                 return;
11168         }
11169
11170         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
11171                 goto nla_put_failure;
11172
11173         /* NOP and radar events don't need a netdev parameter */
11174         if (netdev) {
11175                 struct wireless_dev *wdev = netdev->ieee80211_ptr;
11176
11177                 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
11178                     nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
11179                         goto nla_put_failure;
11180         }
11181
11182         if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
11183                 goto nla_put_failure;
11184
11185         if (nl80211_send_chandef(msg, chandef))
11186                 goto nla_put_failure;
11187
11188         genlmsg_end(msg, hdr);
11189
11190         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11191                                 NL80211_MCGRP_MLME, gfp);
11192         return;
11193
11194  nla_put_failure:
11195         genlmsg_cancel(msg, hdr);
11196         nlmsg_free(msg);
11197 }
11198
11199 void cfg80211_cqm_pktloss_notify(struct net_device *dev,
11200                                  const u8 *peer, u32 num_packets, gfp_t gfp)
11201 {
11202         struct wireless_dev *wdev = dev->ieee80211_ptr;
11203         struct wiphy *wiphy = wdev->wiphy;
11204         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11205         struct sk_buff *msg;
11206         struct nlattr *pinfoattr;
11207         void *hdr;
11208
11209         trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
11210
11211         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11212         if (!msg)
11213                 return;
11214
11215         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
11216         if (!hdr) {
11217                 nlmsg_free(msg);
11218                 return;
11219         }
11220
11221         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11222             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
11223             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer))
11224                 goto nla_put_failure;
11225
11226         pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM);
11227         if (!pinfoattr)
11228                 goto nla_put_failure;
11229
11230         if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets))
11231                 goto nla_put_failure;
11232
11233         nla_nest_end(msg, pinfoattr);
11234
11235         genlmsg_end(msg, hdr);
11236
11237         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11238                                 NL80211_MCGRP_MLME, gfp);
11239         return;
11240
11241  nla_put_failure:
11242         genlmsg_cancel(msg, hdr);
11243         nlmsg_free(msg);
11244 }
11245 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
11246
11247 void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
11248                            u64 cookie, bool acked, gfp_t gfp)
11249 {
11250         struct wireless_dev *wdev = dev->ieee80211_ptr;
11251         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
11252         struct sk_buff *msg;
11253         void *hdr;
11254
11255         trace_cfg80211_probe_status(dev, addr, cookie, acked);
11256
11257         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11258
11259         if (!msg)
11260                 return;
11261
11262         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT);
11263         if (!hdr) {
11264                 nlmsg_free(msg);
11265                 return;
11266         }
11267
11268         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11269             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
11270             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
11271             nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) ||
11272             (acked && nla_put_flag(msg, NL80211_ATTR_ACK)))
11273                 goto nla_put_failure;
11274
11275         genlmsg_end(msg, hdr);
11276
11277         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11278                                 NL80211_MCGRP_MLME, gfp);
11279         return;
11280
11281  nla_put_failure:
11282         genlmsg_cancel(msg, hdr);
11283         nlmsg_free(msg);
11284 }
11285 EXPORT_SYMBOL(cfg80211_probe_status);
11286
11287 void cfg80211_report_obss_beacon(struct wiphy *wiphy,
11288                                  const u8 *frame, size_t len,
11289                                  int freq, int sig_dbm)
11290 {
11291         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11292         struct sk_buff *msg;
11293         void *hdr;
11294         struct cfg80211_beacon_registration *reg;
11295
11296         trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm);
11297
11298         spin_lock_bh(&rdev->beacon_registrations_lock);
11299         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
11300                 msg = nlmsg_new(len + 100, GFP_ATOMIC);
11301                 if (!msg) {
11302                         spin_unlock_bh(&rdev->beacon_registrations_lock);
11303                         return;
11304                 }
11305
11306                 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
11307                 if (!hdr)
11308                         goto nla_put_failure;
11309
11310                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11311                     (freq &&
11312                      nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq)) ||
11313                     (sig_dbm &&
11314                      nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
11315                     nla_put(msg, NL80211_ATTR_FRAME, len, frame))
11316                         goto nla_put_failure;
11317
11318                 genlmsg_end(msg, hdr);
11319
11320                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid);
11321         }
11322         spin_unlock_bh(&rdev->beacon_registrations_lock);
11323         return;
11324
11325  nla_put_failure:
11326         spin_unlock_bh(&rdev->beacon_registrations_lock);
11327         if (hdr)
11328                 genlmsg_cancel(msg, hdr);
11329         nlmsg_free(msg);
11330 }
11331 EXPORT_SYMBOL(cfg80211_report_obss_beacon);
11332
11333 #ifdef CONFIG_PM
11334 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
11335                                    struct cfg80211_wowlan_wakeup *wakeup,
11336                                    gfp_t gfp)
11337 {
11338         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
11339         struct sk_buff *msg;
11340         void *hdr;
11341         int size = 200;
11342
11343         trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup);
11344
11345         if (wakeup)
11346                 size += wakeup->packet_present_len;
11347
11348         msg = nlmsg_new(size, gfp);
11349         if (!msg)
11350                 return;
11351
11352         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN);
11353         if (!hdr)
11354                 goto free_msg;
11355
11356         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11357             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
11358                 goto free_msg;
11359
11360         if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
11361                                         wdev->netdev->ifindex))
11362                 goto free_msg;
11363
11364         if (wakeup) {
11365                 struct nlattr *reasons;
11366
11367                 reasons = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
11368                 if (!reasons)
11369                         goto free_msg;
11370
11371                 if (wakeup->disconnect &&
11372                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT))
11373                         goto free_msg;
11374                 if (wakeup->magic_pkt &&
11375                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT))
11376                         goto free_msg;
11377                 if (wakeup->gtk_rekey_failure &&
11378                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE))
11379                         goto free_msg;
11380                 if (wakeup->eap_identity_req &&
11381                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST))
11382                         goto free_msg;
11383                 if (wakeup->four_way_handshake &&
11384                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE))
11385                         goto free_msg;
11386                 if (wakeup->rfkill_release &&
11387                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))
11388                         goto free_msg;
11389
11390                 if (wakeup->pattern_idx >= 0 &&
11391                     nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
11392                                 wakeup->pattern_idx))
11393                         goto free_msg;
11394
11395                 if (wakeup->tcp_match &&
11396                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH))
11397                         goto free_msg;
11398
11399                 if (wakeup->tcp_connlost &&
11400                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST))
11401                         goto free_msg;
11402
11403                 if (wakeup->tcp_nomoretokens &&
11404                     nla_put_flag(msg,
11405                                  NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS))
11406                         goto free_msg;
11407
11408                 if (wakeup->packet) {
11409                         u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211;
11410                         u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN;
11411
11412                         if (!wakeup->packet_80211) {
11413                                 pkt_attr =
11414                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023;
11415                                 len_attr =
11416                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN;
11417                         }
11418
11419                         if (wakeup->packet_len &&
11420                             nla_put_u32(msg, len_attr, wakeup->packet_len))
11421                                 goto free_msg;
11422
11423                         if (nla_put(msg, pkt_attr, wakeup->packet_present_len,
11424                                     wakeup->packet))
11425                                 goto free_msg;
11426                 }
11427
11428                 nla_nest_end(msg, reasons);
11429         }
11430
11431         genlmsg_end(msg, hdr);
11432
11433         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11434                                 NL80211_MCGRP_MLME, gfp);
11435         return;
11436
11437  free_msg:
11438         nlmsg_free(msg);
11439 }
11440 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup);
11441 #endif
11442
11443 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
11444                                 enum nl80211_tdls_operation oper,
11445                                 u16 reason_code, gfp_t gfp)
11446 {
11447         struct wireless_dev *wdev = dev->ieee80211_ptr;
11448         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
11449         struct sk_buff *msg;
11450         void *hdr;
11451
11452         trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper,
11453                                          reason_code);
11454
11455         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11456         if (!msg)
11457                 return;
11458
11459         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER);
11460         if (!hdr) {
11461                 nlmsg_free(msg);
11462                 return;
11463         }
11464
11465         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11466             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
11467             nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) ||
11468             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) ||
11469             (reason_code > 0 &&
11470              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code)))
11471                 goto nla_put_failure;
11472
11473         genlmsg_end(msg, hdr);
11474
11475         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11476                                 NL80211_MCGRP_MLME, gfp);
11477         return;
11478
11479  nla_put_failure:
11480         genlmsg_cancel(msg, hdr);
11481         nlmsg_free(msg);
11482 }
11483 EXPORT_SYMBOL(cfg80211_tdls_oper_request);
11484
11485 static int nl80211_netlink_notify(struct notifier_block * nb,
11486                                   unsigned long state,
11487                                   void *_notify)
11488 {
11489         struct netlink_notify *notify = _notify;
11490         struct cfg80211_registered_device *rdev;
11491         struct wireless_dev *wdev;
11492         struct cfg80211_beacon_registration *reg, *tmp;
11493
11494         if (state != NETLINK_URELEASE)
11495                 return NOTIFY_DONE;
11496
11497         rcu_read_lock();
11498
11499         list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
11500                 list_for_each_entry_rcu(wdev, &rdev->wdev_list, list)
11501                         cfg80211_mlme_unregister_socket(wdev, notify->portid);
11502
11503                 spin_lock_bh(&rdev->beacon_registrations_lock);
11504                 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations,
11505                                          list) {
11506                         if (reg->nlportid == notify->portid) {
11507                                 list_del(&reg->list);
11508                                 kfree(reg);
11509                                 break;
11510                         }
11511                 }
11512                 spin_unlock_bh(&rdev->beacon_registrations_lock);
11513         }
11514
11515         rcu_read_unlock();
11516
11517         return NOTIFY_DONE;
11518 }
11519
11520 static struct notifier_block nl80211_netlink_notifier = {
11521         .notifier_call = nl80211_netlink_notify,
11522 };
11523
11524 void cfg80211_ft_event(struct net_device *netdev,
11525                        struct cfg80211_ft_event_params *ft_event)
11526 {
11527         struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
11528         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11529         struct sk_buff *msg;
11530         void *hdr;
11531
11532         trace_cfg80211_ft_event(wiphy, netdev, ft_event);
11533
11534         if (!ft_event->target_ap)
11535                 return;
11536
11537         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11538         if (!msg)
11539                 return;
11540
11541         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT);
11542         if (!hdr)
11543                 goto out;
11544
11545         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11546             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
11547             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap))
11548                 goto out;
11549
11550         if (ft_event->ies &&
11551             nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies))
11552                 goto out;
11553         if (ft_event->ric_ies &&
11554             nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len,
11555                     ft_event->ric_ies))
11556                 goto out;
11557
11558         genlmsg_end(msg, hdr);
11559
11560         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11561                                 NL80211_MCGRP_MLME, GFP_KERNEL);
11562         return;
11563  out:
11564         nlmsg_free(msg);
11565 }
11566 EXPORT_SYMBOL(cfg80211_ft_event);
11567
11568 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp)
11569 {
11570         struct cfg80211_registered_device *rdev;
11571         struct sk_buff *msg;
11572         void *hdr;
11573         u32 nlportid;
11574
11575         rdev = wiphy_to_dev(wdev->wiphy);
11576         if (!rdev->crit_proto_nlportid)
11577                 return;
11578
11579         nlportid = rdev->crit_proto_nlportid;
11580         rdev->crit_proto_nlportid = 0;
11581
11582         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11583         if (!msg)
11584                 return;
11585
11586         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP);
11587         if (!hdr)
11588                 goto nla_put_failure;
11589
11590         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11591             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
11592                 goto nla_put_failure;
11593
11594         genlmsg_end(msg, hdr);
11595
11596         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
11597         return;
11598
11599  nla_put_failure:
11600         if (hdr)
11601                 genlmsg_cancel(msg, hdr);
11602         nlmsg_free(msg);
11603
11604 }
11605 EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
11606
11607 /* initialisation/exit functions */
11608
11609 int nl80211_init(void)
11610 {
11611         int err;
11612
11613         err = genl_register_family_with_ops_groups(&nl80211_fam, nl80211_ops,
11614                                                    nl80211_mcgrps);
11615         if (err)
11616                 return err;
11617
11618         err = netlink_register_notifier(&nl80211_netlink_notifier);
11619         if (err)
11620                 goto err_out;
11621
11622         return 0;
11623  err_out:
11624         genl_unregister_family(&nl80211_fam);
11625         return err;
11626 }
11627
11628 void nl80211_exit(void)
11629 {
11630         netlink_unregister_notifier(&nl80211_netlink_notifier);
11631         genl_unregister_family(&nl80211_fam);
11632 }