net/mlx4: Adapt code for N-Port VF
[firefly-linux-kernel-4.4.55.git] / net / wireless / nl80211.c
1 /*
2  * This is the new netlink-based wireless configuration interface.
3  *
4  * Copyright 2006-2010  Johannes Berg <johannes@sipsolutions.net>
5  */
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                         /* not wireless device -- return error */
177                         if (!tmp)
178                                 return ERR_PTR(-EINVAL);
179
180                         /* mismatch -- return error */
181                         if (rdev && tmp != rdev)
182                                 return ERR_PTR(-EINVAL);
183
184                         rdev = tmp;
185                 }
186         }
187
188         if (!rdev)
189                 return ERR_PTR(-ENODEV);
190
191         if (netns != wiphy_net(&rdev->wiphy))
192                 return ERR_PTR(-ENODEV);
193
194         return rdev;
195 }
196
197 /*
198  * This function returns a pointer to the driver
199  * that the genl_info item that is passed refers to.
200  *
201  * The result of this can be a PTR_ERR and hence must
202  * be checked with IS_ERR() for errors.
203  */
204 static struct cfg80211_registered_device *
205 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info)
206 {
207         return __cfg80211_rdev_from_attrs(netns, info->attrs);
208 }
209
210 /* policy for the attributes */
211 static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
212         [NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
213         [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
214                                       .len = 20-1 },
215         [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED },
216
217         [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 },
218         [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 },
219         [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 },
220         [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 },
221         [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 },
222
223         [NL80211_ATTR_WIPHY_RETRY_SHORT] = { .type = NLA_U8 },
224         [NL80211_ATTR_WIPHY_RETRY_LONG] = { .type = NLA_U8 },
225         [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 },
226         [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 },
227         [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 },
228
229         [NL80211_ATTR_IFTYPE] = { .type = NLA_U32 },
230         [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
231         [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
232
233         [NL80211_ATTR_MAC] = { .len = ETH_ALEN },
234         [NL80211_ATTR_PREV_BSSID] = { .len = ETH_ALEN },
235
236         [NL80211_ATTR_KEY] = { .type = NLA_NESTED, },
237         [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
238                                     .len = WLAN_MAX_KEY_LEN },
239         [NL80211_ATTR_KEY_IDX] = { .type = NLA_U8 },
240         [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 },
241         [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG },
242         [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
243         [NL80211_ATTR_KEY_TYPE] = { .type = NLA_U32 },
244
245         [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 },
246         [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 },
247         [NL80211_ATTR_BEACON_HEAD] = { .type = NLA_BINARY,
248                                        .len = IEEE80211_MAX_DATA_LEN },
249         [NL80211_ATTR_BEACON_TAIL] = { .type = NLA_BINARY,
250                                        .len = IEEE80211_MAX_DATA_LEN },
251         [NL80211_ATTR_STA_AID] = { .type = NLA_U16 },
252         [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED },
253         [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 },
254         [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY,
255                                                .len = NL80211_MAX_SUPP_RATES },
256         [NL80211_ATTR_STA_PLINK_ACTION] = { .type = NLA_U8 },
257         [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 },
258         [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
259         [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
260                                    .len = IEEE80211_MAX_MESH_ID_LEN },
261         [NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 },
262
263         [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 },
264         [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
265
266         [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
267         [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
268         [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
269         [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY,
270                                            .len = NL80211_MAX_SUPP_RATES },
271         [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 },
272
273         [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED },
274         [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG },
275
276         [NL80211_ATTR_HT_CAPABILITY] = { .len = NL80211_HT_CAPABILITY_LEN },
277
278         [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
279         [NL80211_ATTR_IE] = { .type = NLA_BINARY,
280                               .len = IEEE80211_MAX_DATA_LEN },
281         [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
282         [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
283
284         [NL80211_ATTR_SSID] = { .type = NLA_BINARY,
285                                 .len = IEEE80211_MAX_SSID_LEN },
286         [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
287         [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
288         [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
289         [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
290         [NL80211_ATTR_USE_MFP] = { .type = NLA_U32 },
291         [NL80211_ATTR_STA_FLAGS2] = {
292                 .len = sizeof(struct nl80211_sta_flag_update),
293         },
294         [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
295         [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 },
296         [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG },
297         [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG },
298         [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 },
299         [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 },
300         [NL80211_ATTR_PID] = { .type = NLA_U32 },
301         [NL80211_ATTR_4ADDR] = { .type = NLA_U8 },
302         [NL80211_ATTR_PMKID] = { .type = NLA_BINARY,
303                                  .len = WLAN_PMKID_LEN },
304         [NL80211_ATTR_DURATION] = { .type = NLA_U32 },
305         [NL80211_ATTR_COOKIE] = { .type = NLA_U64 },
306         [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED },
307         [NL80211_ATTR_FRAME] = { .type = NLA_BINARY,
308                                  .len = IEEE80211_MAX_DATA_LEN },
309         [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, },
310         [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 },
311         [NL80211_ATTR_CQM] = { .type = NLA_NESTED, },
312         [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG },
313         [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 },
314         [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
315         [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
316         [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
317         [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 },
318         [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 },
319         [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 },
320         [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG },
321         [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
322         [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED },
323         [NL80211_ATTR_STA_PLINK_STATE] = { .type = NLA_U8 },
324         [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 },
325         [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED },
326         [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED },
327         [NL80211_ATTR_HIDDEN_SSID] = { .type = NLA_U32 },
328         [NL80211_ATTR_IE_PROBE_RESP] = { .type = NLA_BINARY,
329                                          .len = IEEE80211_MAX_DATA_LEN },
330         [NL80211_ATTR_IE_ASSOC_RESP] = { .type = NLA_BINARY,
331                                          .len = IEEE80211_MAX_DATA_LEN },
332         [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG },
333         [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED },
334         [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG },
335         [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 },
336         [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 },
337         [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 },
338         [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG },
339         [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG },
340         [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
341         [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
342                                       .len = IEEE80211_MAX_DATA_LEN },
343         [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 },
344         [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG },
345         [NL80211_ATTR_HT_CAPABILITY_MASK] = {
346                 .len = NL80211_HT_CAPABILITY_LEN
347         },
348         [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 },
349         [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 },
350         [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 },
351         [NL80211_ATTR_WDEV] = { .type = NLA_U64 },
352         [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 },
353         [NL80211_ATTR_SAE_DATA] = { .type = NLA_BINARY, },
354         [NL80211_ATTR_VHT_CAPABILITY] = { .len = NL80211_VHT_CAPABILITY_LEN },
355         [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
356         [NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 },
357         [NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 },
358         [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 },
359         [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
360         [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
361         [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, },
362         [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, },
363         [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG },
364         [NL80211_ATTR_VHT_CAPABILITY_MASK] = {
365                 .len = NL80211_VHT_CAPABILITY_LEN,
366         },
367         [NL80211_ATTR_MDID] = { .type = NLA_U16 },
368         [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
369                                   .len = IEEE80211_MAX_DATA_LEN },
370         [NL80211_ATTR_PEER_AID] = { .type = NLA_U16 },
371         [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 },
372         [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG },
373         [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
374         [NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_U16 },
375         [NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_U16 },
376         [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY },
377         [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY },
378         [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG },
379         [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 },
380         [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 },
381         [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 },
382         [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
383         [NL80211_ATTR_QOS_MAP] = { .type = NLA_BINARY,
384                                    .len = IEEE80211_QOS_MAP_LEN_MAX },
385         [NL80211_ATTR_MAC_HINT] = { .len = ETH_ALEN },
386         [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 },
387         [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 },
388 };
389
390 /* policy for the key attributes */
391 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
392         [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
393         [NL80211_KEY_IDX] = { .type = NLA_U8 },
394         [NL80211_KEY_CIPHER] = { .type = NLA_U32 },
395         [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
396         [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG },
397         [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG },
398         [NL80211_KEY_TYPE] = { .type = NLA_U32 },
399         [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
400 };
401
402 /* policy for the key default flags */
403 static const struct nla_policy
404 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = {
405         [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG },
406         [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG },
407 };
408
409 /* policy for WoWLAN attributes */
410 static const struct nla_policy
411 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = {
412         [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG },
413         [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG },
414         [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG },
415         [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED },
416         [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG },
417         [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG },
418         [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG },
419         [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG },
420         [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED },
421 };
422
423 static const struct nla_policy
424 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = {
425         [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 },
426         [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 },
427         [NL80211_WOWLAN_TCP_DST_MAC] = { .len = ETH_ALEN },
428         [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 },
429         [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 },
430         [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = { .len = 1 },
431         [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = {
432                 .len = sizeof(struct nl80211_wowlan_tcp_data_seq)
433         },
434         [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = {
435                 .len = sizeof(struct nl80211_wowlan_tcp_data_token)
436         },
437         [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 },
438         [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = { .len = 1 },
439         [NL80211_WOWLAN_TCP_WAKE_MASK] = { .len = 1 },
440 };
441
442 /* policy for coalesce rule attributes */
443 static const struct nla_policy
444 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = {
445         [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 },
446         [NL80211_ATTR_COALESCE_RULE_CONDITION] = { .type = NLA_U32 },
447         [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED },
448 };
449
450 /* policy for GTK rekey offload attributes */
451 static const struct nla_policy
452 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
453         [NL80211_REKEY_DATA_KEK] = { .len = NL80211_KEK_LEN },
454         [NL80211_REKEY_DATA_KCK] = { .len = NL80211_KCK_LEN },
455         [NL80211_REKEY_DATA_REPLAY_CTR] = { .len = NL80211_REPLAY_CTR_LEN },
456 };
457
458 static const struct nla_policy
459 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = {
460         [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY,
461                                                  .len = IEEE80211_MAX_SSID_LEN },
462         [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 },
463 };
464
465 static int nl80211_prepare_wdev_dump(struct sk_buff *skb,
466                                      struct netlink_callback *cb,
467                                      struct cfg80211_registered_device **rdev,
468                                      struct wireless_dev **wdev)
469 {
470         int err;
471
472         rtnl_lock();
473
474         if (!cb->args[0]) {
475                 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
476                                   nl80211_fam.attrbuf, nl80211_fam.maxattr,
477                                   nl80211_policy);
478                 if (err)
479                         goto out_unlock;
480
481                 *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk),
482                                                    nl80211_fam.attrbuf);
483                 if (IS_ERR(*wdev)) {
484                         err = PTR_ERR(*wdev);
485                         goto out_unlock;
486                 }
487                 *rdev = wiphy_to_dev((*wdev)->wiphy);
488                 /* 0 is the first index - add 1 to parse only once */
489                 cb->args[0] = (*rdev)->wiphy_idx + 1;
490                 cb->args[1] = (*wdev)->identifier;
491         } else {
492                 /* subtract the 1 again here */
493                 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
494                 struct wireless_dev *tmp;
495
496                 if (!wiphy) {
497                         err = -ENODEV;
498                         goto out_unlock;
499                 }
500                 *rdev = wiphy_to_dev(wiphy);
501                 *wdev = NULL;
502
503                 list_for_each_entry(tmp, &(*rdev)->wdev_list, list) {
504                         if (tmp->identifier == cb->args[1]) {
505                                 *wdev = tmp;
506                                 break;
507                         }
508                 }
509
510                 if (!*wdev) {
511                         err = -ENODEV;
512                         goto out_unlock;
513                 }
514         }
515
516         return 0;
517  out_unlock:
518         rtnl_unlock();
519         return err;
520 }
521
522 static void nl80211_finish_wdev_dump(struct cfg80211_registered_device *rdev)
523 {
524         rtnl_unlock();
525 }
526
527 /* IE validation */
528 static bool is_valid_ie_attr(const struct nlattr *attr)
529 {
530         const u8 *pos;
531         int len;
532
533         if (!attr)
534                 return true;
535
536         pos = nla_data(attr);
537         len = nla_len(attr);
538
539         while (len) {
540                 u8 elemlen;
541
542                 if (len < 2)
543                         return false;
544                 len -= 2;
545
546                 elemlen = pos[1];
547                 if (elemlen > len)
548                         return false;
549
550                 len -= elemlen;
551                 pos += 2 + elemlen;
552         }
553
554         return true;
555 }
556
557 /* message building helper */
558 static inline void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
559                                    int flags, u8 cmd)
560 {
561         /* since there is no private header just add the generic one */
562         return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd);
563 }
564
565 static int nl80211_msg_put_channel(struct sk_buff *msg,
566                                    struct ieee80211_channel *chan,
567                                    bool large)
568 {
569         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ,
570                         chan->center_freq))
571                 goto nla_put_failure;
572
573         if ((chan->flags & IEEE80211_CHAN_DISABLED) &&
574             nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED))
575                 goto nla_put_failure;
576         if (chan->flags & IEEE80211_CHAN_NO_IR) {
577                 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR))
578                         goto nla_put_failure;
579                 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS))
580                         goto nla_put_failure;
581         }
582         if (chan->flags & IEEE80211_CHAN_RADAR) {
583                 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
584                         goto nla_put_failure;
585                 if (large) {
586                         u32 time;
587
588                         time = elapsed_jiffies_msecs(chan->dfs_state_entered);
589
590                         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE,
591                                         chan->dfs_state))
592                                 goto nla_put_failure;
593                         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME,
594                                         time))
595                                 goto nla_put_failure;
596                 }
597         }
598
599         if (large) {
600                 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
601                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
602                         goto nla_put_failure;
603                 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) &&
604                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS))
605                         goto nla_put_failure;
606                 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) &&
607                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ))
608                         goto nla_put_failure;
609                 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) &&
610                     nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ))
611                         goto nla_put_failure;
612         }
613
614         if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
615                         DBM_TO_MBM(chan->max_power)))
616                 goto nla_put_failure;
617
618         return 0;
619
620  nla_put_failure:
621         return -ENOBUFS;
622 }
623
624 /* netlink command implementations */
625
626 struct key_parse {
627         struct key_params p;
628         int idx;
629         int type;
630         bool def, defmgmt;
631         bool def_uni, def_multi;
632 };
633
634 static int nl80211_parse_key_new(struct nlattr *key, struct key_parse *k)
635 {
636         struct nlattr *tb[NL80211_KEY_MAX + 1];
637         int err = nla_parse_nested(tb, NL80211_KEY_MAX, key,
638                                    nl80211_key_policy);
639         if (err)
640                 return err;
641
642         k->def = !!tb[NL80211_KEY_DEFAULT];
643         k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT];
644
645         if (k->def) {
646                 k->def_uni = true;
647                 k->def_multi = true;
648         }
649         if (k->defmgmt)
650                 k->def_multi = true;
651
652         if (tb[NL80211_KEY_IDX])
653                 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]);
654
655         if (tb[NL80211_KEY_DATA]) {
656                 k->p.key = nla_data(tb[NL80211_KEY_DATA]);
657                 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]);
658         }
659
660         if (tb[NL80211_KEY_SEQ]) {
661                 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]);
662                 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]);
663         }
664
665         if (tb[NL80211_KEY_CIPHER])
666                 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]);
667
668         if (tb[NL80211_KEY_TYPE]) {
669                 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]);
670                 if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
671                         return -EINVAL;
672         }
673
674         if (tb[NL80211_KEY_DEFAULT_TYPES]) {
675                 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
676                 err = nla_parse_nested(kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
677                                        tb[NL80211_KEY_DEFAULT_TYPES],
678                                        nl80211_key_default_policy);
679                 if (err)
680                         return err;
681
682                 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
683                 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
684         }
685
686         return 0;
687 }
688
689 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
690 {
691         if (info->attrs[NL80211_ATTR_KEY_DATA]) {
692                 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
693                 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
694         }
695
696         if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
697                 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
698                 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
699         }
700
701         if (info->attrs[NL80211_ATTR_KEY_IDX])
702                 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
703
704         if (info->attrs[NL80211_ATTR_KEY_CIPHER])
705                 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
706
707         k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
708         k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
709
710         if (k->def) {
711                 k->def_uni = true;
712                 k->def_multi = true;
713         }
714         if (k->defmgmt)
715                 k->def_multi = true;
716
717         if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
718                 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
719                 if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
720                         return -EINVAL;
721         }
722
723         if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
724                 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
725                 int err = nla_parse_nested(
726                                 kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
727                                 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
728                                 nl80211_key_default_policy);
729                 if (err)
730                         return err;
731
732                 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
733                 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
734         }
735
736         return 0;
737 }
738
739 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
740 {
741         int err;
742
743         memset(k, 0, sizeof(*k));
744         k->idx = -1;
745         k->type = -1;
746
747         if (info->attrs[NL80211_ATTR_KEY])
748                 err = nl80211_parse_key_new(info->attrs[NL80211_ATTR_KEY], k);
749         else
750                 err = nl80211_parse_key_old(info, k);
751
752         if (err)
753                 return err;
754
755         if (k->def && k->defmgmt)
756                 return -EINVAL;
757
758         if (k->defmgmt) {
759                 if (k->def_uni || !k->def_multi)
760                         return -EINVAL;
761         }
762
763         if (k->idx != -1) {
764                 if (k->defmgmt) {
765                         if (k->idx < 4 || k->idx > 5)
766                                 return -EINVAL;
767                 } else if (k->def) {
768                         if (k->idx < 0 || k->idx > 3)
769                                 return -EINVAL;
770                 } else {
771                         if (k->idx < 0 || k->idx > 5)
772                                 return -EINVAL;
773                 }
774         }
775
776         return 0;
777 }
778
779 static struct cfg80211_cached_keys *
780 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
781                        struct nlattr *keys, bool *no_ht)
782 {
783         struct key_parse parse;
784         struct nlattr *key;
785         struct cfg80211_cached_keys *result;
786         int rem, err, def = 0;
787
788         result = kzalloc(sizeof(*result), GFP_KERNEL);
789         if (!result)
790                 return ERR_PTR(-ENOMEM);
791
792         result->def = -1;
793         result->defmgmt = -1;
794
795         nla_for_each_nested(key, keys, rem) {
796                 memset(&parse, 0, sizeof(parse));
797                 parse.idx = -1;
798
799                 err = nl80211_parse_key_new(key, &parse);
800                 if (err)
801                         goto error;
802                 err = -EINVAL;
803                 if (!parse.p.key)
804                         goto error;
805                 if (parse.idx < 0 || parse.idx > 4)
806                         goto error;
807                 if (parse.def) {
808                         if (def)
809                                 goto error;
810                         def = 1;
811                         result->def = parse.idx;
812                         if (!parse.def_uni || !parse.def_multi)
813                                 goto error;
814                 } else if (parse.defmgmt)
815                         goto error;
816                 err = cfg80211_validate_key_settings(rdev, &parse.p,
817                                                      parse.idx, false, NULL);
818                 if (err)
819                         goto error;
820                 result->params[parse.idx].cipher = parse.p.cipher;
821                 result->params[parse.idx].key_len = parse.p.key_len;
822                 result->params[parse.idx].key = result->data[parse.idx];
823                 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len);
824
825                 if (parse.p.cipher == WLAN_CIPHER_SUITE_WEP40 ||
826                     parse.p.cipher == WLAN_CIPHER_SUITE_WEP104) {
827                         if (no_ht)
828                                 *no_ht = true;
829                 }
830         }
831
832         return result;
833  error:
834         kfree(result);
835         return ERR_PTR(err);
836 }
837
838 static int nl80211_key_allowed(struct wireless_dev *wdev)
839 {
840         ASSERT_WDEV_LOCK(wdev);
841
842         switch (wdev->iftype) {
843         case NL80211_IFTYPE_AP:
844         case NL80211_IFTYPE_AP_VLAN:
845         case NL80211_IFTYPE_P2P_GO:
846         case NL80211_IFTYPE_MESH_POINT:
847                 break;
848         case NL80211_IFTYPE_ADHOC:
849         case NL80211_IFTYPE_STATION:
850         case NL80211_IFTYPE_P2P_CLIENT:
851                 if (!wdev->current_bss)
852                         return -ENOLINK;
853                 break;
854         default:
855                 return -EINVAL;
856         }
857
858         return 0;
859 }
860
861 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy,
862                                                         struct nlattr *tb)
863 {
864         struct ieee80211_channel *chan;
865
866         if (tb == NULL)
867                 return NULL;
868         chan = ieee80211_get_channel(wiphy, nla_get_u32(tb));
869         if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
870                 return NULL;
871         return chan;
872 }
873
874 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
875 {
876         struct nlattr *nl_modes = nla_nest_start(msg, attr);
877         int i;
878
879         if (!nl_modes)
880                 goto nla_put_failure;
881
882         i = 0;
883         while (ifmodes) {
884                 if ((ifmodes & 1) && nla_put_flag(msg, i))
885                         goto nla_put_failure;
886                 ifmodes >>= 1;
887                 i++;
888         }
889
890         nla_nest_end(msg, nl_modes);
891         return 0;
892
893 nla_put_failure:
894         return -ENOBUFS;
895 }
896
897 static int nl80211_put_iface_combinations(struct wiphy *wiphy,
898                                           struct sk_buff *msg,
899                                           bool large)
900 {
901         struct nlattr *nl_combis;
902         int i, j;
903
904         nl_combis = nla_nest_start(msg,
905                                 NL80211_ATTR_INTERFACE_COMBINATIONS);
906         if (!nl_combis)
907                 goto nla_put_failure;
908
909         for (i = 0; i < wiphy->n_iface_combinations; i++) {
910                 const struct ieee80211_iface_combination *c;
911                 struct nlattr *nl_combi, *nl_limits;
912
913                 c = &wiphy->iface_combinations[i];
914
915                 nl_combi = nla_nest_start(msg, i + 1);
916                 if (!nl_combi)
917                         goto nla_put_failure;
918
919                 nl_limits = nla_nest_start(msg, NL80211_IFACE_COMB_LIMITS);
920                 if (!nl_limits)
921                         goto nla_put_failure;
922
923                 for (j = 0; j < c->n_limits; j++) {
924                         struct nlattr *nl_limit;
925
926                         nl_limit = nla_nest_start(msg, j + 1);
927                         if (!nl_limit)
928                                 goto nla_put_failure;
929                         if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX,
930                                         c->limits[j].max))
931                                 goto nla_put_failure;
932                         if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
933                                                 c->limits[j].types))
934                                 goto nla_put_failure;
935                         nla_nest_end(msg, nl_limit);
936                 }
937
938                 nla_nest_end(msg, nl_limits);
939
940                 if (c->beacon_int_infra_match &&
941                     nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
942                         goto nla_put_failure;
943                 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
944                                 c->num_different_channels) ||
945                     nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
946                                 c->max_interfaces))
947                         goto nla_put_failure;
948                 if (large &&
949                     nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
950                                 c->radar_detect_widths))
951                         goto nla_put_failure;
952
953                 nla_nest_end(msg, nl_combi);
954         }
955
956         nla_nest_end(msg, nl_combis);
957
958         return 0;
959 nla_put_failure:
960         return -ENOBUFS;
961 }
962
963 #ifdef CONFIG_PM
964 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev,
965                                         struct sk_buff *msg)
966 {
967         const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp;
968         struct nlattr *nl_tcp;
969
970         if (!tcp)
971                 return 0;
972
973         nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
974         if (!nl_tcp)
975                 return -ENOBUFS;
976
977         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
978                         tcp->data_payload_max))
979                 return -ENOBUFS;
980
981         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
982                         tcp->data_payload_max))
983                 return -ENOBUFS;
984
985         if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ))
986                 return -ENOBUFS;
987
988         if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
989                                 sizeof(*tcp->tok), tcp->tok))
990                 return -ENOBUFS;
991
992         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
993                         tcp->data_interval_max))
994                 return -ENOBUFS;
995
996         if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
997                         tcp->wake_payload_max))
998                 return -ENOBUFS;
999
1000         nla_nest_end(msg, nl_tcp);
1001         return 0;
1002 }
1003
1004 static int nl80211_send_wowlan(struct sk_buff *msg,
1005                                struct cfg80211_registered_device *dev,
1006                                bool large)
1007 {
1008         struct nlattr *nl_wowlan;
1009
1010         if (!dev->wiphy.wowlan)
1011                 return 0;
1012
1013         nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED);
1014         if (!nl_wowlan)
1015                 return -ENOBUFS;
1016
1017         if (((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) &&
1018              nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
1019             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) &&
1020              nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
1021             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) &&
1022              nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
1023             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) &&
1024              nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) ||
1025             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
1026              nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
1027             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) &&
1028              nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
1029             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) &&
1030              nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
1031             ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) &&
1032              nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
1033                 return -ENOBUFS;
1034
1035         if (dev->wiphy.wowlan->n_patterns) {
1036                 struct nl80211_pattern_support pat = {
1037                         .max_patterns = dev->wiphy.wowlan->n_patterns,
1038                         .min_pattern_len = dev->wiphy.wowlan->pattern_min_len,
1039                         .max_pattern_len = dev->wiphy.wowlan->pattern_max_len,
1040                         .max_pkt_offset = dev->wiphy.wowlan->max_pkt_offset,
1041                 };
1042
1043                 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
1044                             sizeof(pat), &pat))
1045                         return -ENOBUFS;
1046         }
1047
1048         if (large && nl80211_send_wowlan_tcp_caps(dev, msg))
1049                 return -ENOBUFS;
1050
1051         nla_nest_end(msg, nl_wowlan);
1052
1053         return 0;
1054 }
1055 #endif
1056
1057 static int nl80211_send_coalesce(struct sk_buff *msg,
1058                                  struct cfg80211_registered_device *dev)
1059 {
1060         struct nl80211_coalesce_rule_support rule;
1061
1062         if (!dev->wiphy.coalesce)
1063                 return 0;
1064
1065         rule.max_rules = dev->wiphy.coalesce->n_rules;
1066         rule.max_delay = dev->wiphy.coalesce->max_delay;
1067         rule.pat.max_patterns = dev->wiphy.coalesce->n_patterns;
1068         rule.pat.min_pattern_len = dev->wiphy.coalesce->pattern_min_len;
1069         rule.pat.max_pattern_len = dev->wiphy.coalesce->pattern_max_len;
1070         rule.pat.max_pkt_offset = dev->wiphy.coalesce->max_pkt_offset;
1071
1072         if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule))
1073                 return -ENOBUFS;
1074
1075         return 0;
1076 }
1077
1078 static int nl80211_send_band_rateinfo(struct sk_buff *msg,
1079                                       struct ieee80211_supported_band *sband)
1080 {
1081         struct nlattr *nl_rates, *nl_rate;
1082         struct ieee80211_rate *rate;
1083         int i;
1084
1085         /* add HT info */
1086         if (sband->ht_cap.ht_supported &&
1087             (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET,
1088                      sizeof(sband->ht_cap.mcs),
1089                      &sband->ht_cap.mcs) ||
1090              nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA,
1091                          sband->ht_cap.cap) ||
1092              nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
1093                         sband->ht_cap.ampdu_factor) ||
1094              nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
1095                         sband->ht_cap.ampdu_density)))
1096                 return -ENOBUFS;
1097
1098         /* add VHT info */
1099         if (sband->vht_cap.vht_supported &&
1100             (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET,
1101                      sizeof(sband->vht_cap.vht_mcs),
1102                      &sband->vht_cap.vht_mcs) ||
1103              nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA,
1104                          sband->vht_cap.cap)))
1105                 return -ENOBUFS;
1106
1107         /* add bitrates */
1108         nl_rates = nla_nest_start(msg, NL80211_BAND_ATTR_RATES);
1109         if (!nl_rates)
1110                 return -ENOBUFS;
1111
1112         for (i = 0; i < sband->n_bitrates; i++) {
1113                 nl_rate = nla_nest_start(msg, i);
1114                 if (!nl_rate)
1115                         return -ENOBUFS;
1116
1117                 rate = &sband->bitrates[i];
1118                 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE,
1119                                 rate->bitrate))
1120                         return -ENOBUFS;
1121                 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) &&
1122                     nla_put_flag(msg,
1123                                  NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE))
1124                         return -ENOBUFS;
1125
1126                 nla_nest_end(msg, nl_rate);
1127         }
1128
1129         nla_nest_end(msg, nl_rates);
1130
1131         return 0;
1132 }
1133
1134 static int
1135 nl80211_send_mgmt_stypes(struct sk_buff *msg,
1136                          const struct ieee80211_txrx_stypes *mgmt_stypes)
1137 {
1138         u16 stypes;
1139         struct nlattr *nl_ftypes, *nl_ifs;
1140         enum nl80211_iftype ift;
1141         int i;
1142
1143         if (!mgmt_stypes)
1144                 return 0;
1145
1146         nl_ifs = nla_nest_start(msg, NL80211_ATTR_TX_FRAME_TYPES);
1147         if (!nl_ifs)
1148                 return -ENOBUFS;
1149
1150         for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1151                 nl_ftypes = nla_nest_start(msg, ift);
1152                 if (!nl_ftypes)
1153                         return -ENOBUFS;
1154                 i = 0;
1155                 stypes = mgmt_stypes[ift].tx;
1156                 while (stypes) {
1157                         if ((stypes & 1) &&
1158                             nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1159                                         (i << 4) | IEEE80211_FTYPE_MGMT))
1160                                 return -ENOBUFS;
1161                         stypes >>= 1;
1162                         i++;
1163                 }
1164                 nla_nest_end(msg, nl_ftypes);
1165         }
1166
1167         nla_nest_end(msg, nl_ifs);
1168
1169         nl_ifs = nla_nest_start(msg, NL80211_ATTR_RX_FRAME_TYPES);
1170         if (!nl_ifs)
1171                 return -ENOBUFS;
1172
1173         for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
1174                 nl_ftypes = nla_nest_start(msg, ift);
1175                 if (!nl_ftypes)
1176                         return -ENOBUFS;
1177                 i = 0;
1178                 stypes = mgmt_stypes[ift].rx;
1179                 while (stypes) {
1180                         if ((stypes & 1) &&
1181                             nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
1182                                         (i << 4) | IEEE80211_FTYPE_MGMT))
1183                                 return -ENOBUFS;
1184                         stypes >>= 1;
1185                         i++;
1186                 }
1187                 nla_nest_end(msg, nl_ftypes);
1188         }
1189         nla_nest_end(msg, nl_ifs);
1190
1191         return 0;
1192 }
1193
1194 struct nl80211_dump_wiphy_state {
1195         s64 filter_wiphy;
1196         long start;
1197         long split_start, band_start, chan_start;
1198         bool split;
1199 };
1200
1201 static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
1202                               struct sk_buff *msg, u32 portid, u32 seq,
1203                               int flags, struct nl80211_dump_wiphy_state *state)
1204 {
1205         void *hdr;
1206         struct nlattr *nl_bands, *nl_band;
1207         struct nlattr *nl_freqs, *nl_freq;
1208         struct nlattr *nl_cmds;
1209         enum ieee80211_band band;
1210         struct ieee80211_channel *chan;
1211         int i;
1212         const struct ieee80211_txrx_stypes *mgmt_stypes =
1213                                 dev->wiphy.mgmt_stypes;
1214         u32 features;
1215
1216         hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_WIPHY);
1217         if (!hdr)
1218                 return -ENOBUFS;
1219
1220         if (WARN_ON(!state))
1221                 return -EINVAL;
1222
1223         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, dev->wiphy_idx) ||
1224             nla_put_string(msg, NL80211_ATTR_WIPHY_NAME,
1225                            wiphy_name(&dev->wiphy)) ||
1226             nla_put_u32(msg, NL80211_ATTR_GENERATION,
1227                         cfg80211_rdev_list_generation))
1228                 goto nla_put_failure;
1229
1230         switch (state->split_start) {
1231         case 0:
1232                 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
1233                                dev->wiphy.retry_short) ||
1234                     nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
1235                                dev->wiphy.retry_long) ||
1236                     nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
1237                                 dev->wiphy.frag_threshold) ||
1238                     nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
1239                                 dev->wiphy.rts_threshold) ||
1240                     nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS,
1241                                dev->wiphy.coverage_class) ||
1242                     nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
1243                                dev->wiphy.max_scan_ssids) ||
1244                     nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
1245                                dev->wiphy.max_sched_scan_ssids) ||
1246                     nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
1247                                 dev->wiphy.max_scan_ie_len) ||
1248                     nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
1249                                 dev->wiphy.max_sched_scan_ie_len) ||
1250                     nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS,
1251                                dev->wiphy.max_match_sets))
1252                         goto nla_put_failure;
1253
1254                 if ((dev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) &&
1255                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN))
1256                         goto nla_put_failure;
1257                 if ((dev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
1258                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH))
1259                         goto nla_put_failure;
1260                 if ((dev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) &&
1261                     nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD))
1262                         goto nla_put_failure;
1263                 if ((dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) &&
1264                     nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT))
1265                         goto nla_put_failure;
1266                 if ((dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) &&
1267                     nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT))
1268                         goto nla_put_failure;
1269                 if ((dev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) &&
1270                     nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP))
1271                         goto nla_put_failure;
1272                 state->split_start++;
1273                 if (state->split)
1274                         break;
1275         case 1:
1276                 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES,
1277                             sizeof(u32) * dev->wiphy.n_cipher_suites,
1278                             dev->wiphy.cipher_suites))
1279                         goto nla_put_failure;
1280
1281                 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS,
1282                                dev->wiphy.max_num_pmkids))
1283                         goto nla_put_failure;
1284
1285                 if ((dev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
1286                     nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE))
1287                         goto nla_put_failure;
1288
1289                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
1290                                 dev->wiphy.available_antennas_tx) ||
1291                     nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
1292                                 dev->wiphy.available_antennas_rx))
1293                         goto nla_put_failure;
1294
1295                 if ((dev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) &&
1296                     nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD,
1297                                 dev->wiphy.probe_resp_offload))
1298                         goto nla_put_failure;
1299
1300                 if ((dev->wiphy.available_antennas_tx ||
1301                      dev->wiphy.available_antennas_rx) &&
1302                     dev->ops->get_antenna) {
1303                         u32 tx_ant = 0, rx_ant = 0;
1304                         int res;
1305                         res = rdev_get_antenna(dev, &tx_ant, &rx_ant);
1306                         if (!res) {
1307                                 if (nla_put_u32(msg,
1308                                                 NL80211_ATTR_WIPHY_ANTENNA_TX,
1309                                                 tx_ant) ||
1310                                     nla_put_u32(msg,
1311                                                 NL80211_ATTR_WIPHY_ANTENNA_RX,
1312                                                 rx_ant))
1313                                         goto nla_put_failure;
1314                         }
1315                 }
1316
1317                 state->split_start++;
1318                 if (state->split)
1319                         break;
1320         case 2:
1321                 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
1322                                         dev->wiphy.interface_modes))
1323                                 goto nla_put_failure;
1324                 state->split_start++;
1325                 if (state->split)
1326                         break;
1327         case 3:
1328                 nl_bands = nla_nest_start(msg, NL80211_ATTR_WIPHY_BANDS);
1329                 if (!nl_bands)
1330                         goto nla_put_failure;
1331
1332                 for (band = state->band_start;
1333                      band < IEEE80211_NUM_BANDS; band++) {
1334                         struct ieee80211_supported_band *sband;
1335
1336                         sband = dev->wiphy.bands[band];
1337
1338                         if (!sband)
1339                                 continue;
1340
1341                         nl_band = nla_nest_start(msg, band);
1342                         if (!nl_band)
1343                                 goto nla_put_failure;
1344
1345                         switch (state->chan_start) {
1346                         case 0:
1347                                 if (nl80211_send_band_rateinfo(msg, sband))
1348                                         goto nla_put_failure;
1349                                 state->chan_start++;
1350                                 if (state->split)
1351                                         break;
1352                         default:
1353                                 /* add frequencies */
1354                                 nl_freqs = nla_nest_start(
1355                                         msg, NL80211_BAND_ATTR_FREQS);
1356                                 if (!nl_freqs)
1357                                         goto nla_put_failure;
1358
1359                                 for (i = state->chan_start - 1;
1360                                      i < sband->n_channels;
1361                                      i++) {
1362                                         nl_freq = nla_nest_start(msg, i);
1363                                         if (!nl_freq)
1364                                                 goto nla_put_failure;
1365
1366                                         chan = &sband->channels[i];
1367
1368                                         if (nl80211_msg_put_channel(
1369                                                         msg, chan,
1370                                                         state->split))
1371                                                 goto nla_put_failure;
1372
1373                                         nla_nest_end(msg, nl_freq);
1374                                         if (state->split)
1375                                                 break;
1376                                 }
1377                                 if (i < sband->n_channels)
1378                                         state->chan_start = i + 2;
1379                                 else
1380                                         state->chan_start = 0;
1381                                 nla_nest_end(msg, nl_freqs);
1382                         }
1383
1384                         nla_nest_end(msg, nl_band);
1385
1386                         if (state->split) {
1387                                 /* start again here */
1388                                 if (state->chan_start)
1389                                         band--;
1390                                 break;
1391                         }
1392                 }
1393                 nla_nest_end(msg, nl_bands);
1394
1395                 if (band < IEEE80211_NUM_BANDS)
1396                         state->band_start = band + 1;
1397                 else
1398                         state->band_start = 0;
1399
1400                 /* if bands & channels are done, continue outside */
1401                 if (state->band_start == 0 && state->chan_start == 0)
1402                         state->split_start++;
1403                 if (state->split)
1404                         break;
1405         case 4:
1406                 nl_cmds = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_COMMANDS);
1407                 if (!nl_cmds)
1408                         goto nla_put_failure;
1409
1410                 i = 0;
1411 #define CMD(op, n)                                                      \
1412                  do {                                                   \
1413                         if (dev->ops->op) {                             \
1414                                 i++;                                    \
1415                                 if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \
1416                                         goto nla_put_failure;           \
1417                         }                                               \
1418                 } while (0)
1419
1420                 CMD(add_virtual_intf, NEW_INTERFACE);
1421                 CMD(change_virtual_intf, SET_INTERFACE);
1422                 CMD(add_key, NEW_KEY);
1423                 CMD(start_ap, START_AP);
1424                 CMD(add_station, NEW_STATION);
1425                 CMD(add_mpath, NEW_MPATH);
1426                 CMD(update_mesh_config, SET_MESH_CONFIG);
1427                 CMD(change_bss, SET_BSS);
1428                 CMD(auth, AUTHENTICATE);
1429                 CMD(assoc, ASSOCIATE);
1430                 CMD(deauth, DEAUTHENTICATE);
1431                 CMD(disassoc, DISASSOCIATE);
1432                 CMD(join_ibss, JOIN_IBSS);
1433                 CMD(join_mesh, JOIN_MESH);
1434                 CMD(set_pmksa, SET_PMKSA);
1435                 CMD(del_pmksa, DEL_PMKSA);
1436                 CMD(flush_pmksa, FLUSH_PMKSA);
1437                 if (dev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)
1438                         CMD(remain_on_channel, REMAIN_ON_CHANNEL);
1439                 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
1440                 CMD(mgmt_tx, FRAME);
1441                 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL);
1442                 if (dev->wiphy.flags & WIPHY_FLAG_NETNS_OK) {
1443                         i++;
1444                         if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS))
1445                                 goto nla_put_failure;
1446                 }
1447                 if (dev->ops->set_monitor_channel || dev->ops->start_ap ||
1448                     dev->ops->join_mesh) {
1449                         i++;
1450                         if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL))
1451                                 goto nla_put_failure;
1452                 }
1453                 CMD(set_wds_peer, SET_WDS_PEER);
1454                 if (dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) {
1455                         CMD(tdls_mgmt, TDLS_MGMT);
1456                         CMD(tdls_oper, TDLS_OPER);
1457                 }
1458                 if (dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN)
1459                         CMD(sched_scan_start, START_SCHED_SCAN);
1460                 CMD(probe_client, PROBE_CLIENT);
1461                 CMD(set_noack_map, SET_NOACK_MAP);
1462                 if (dev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) {
1463                         i++;
1464                         if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS))
1465                                 goto nla_put_failure;
1466                 }
1467                 CMD(start_p2p_device, START_P2P_DEVICE);
1468                 CMD(set_mcast_rate, SET_MCAST_RATE);
1469                 if (state->split) {
1470                         CMD(crit_proto_start, CRIT_PROTOCOL_START);
1471                         CMD(crit_proto_stop, CRIT_PROTOCOL_STOP);
1472                         if (dev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)
1473                                 CMD(channel_switch, CHANNEL_SWITCH);
1474                 }
1475                 CMD(set_qos_map, SET_QOS_MAP);
1476
1477 #ifdef CONFIG_NL80211_TESTMODE
1478                 CMD(testmode_cmd, TESTMODE);
1479 #endif
1480
1481 #undef CMD
1482
1483                 if (dev->ops->connect || dev->ops->auth) {
1484                         i++;
1485                         if (nla_put_u32(msg, i, NL80211_CMD_CONNECT))
1486                                 goto nla_put_failure;
1487                 }
1488
1489                 if (dev->ops->disconnect || dev->ops->deauth) {
1490                         i++;
1491                         if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT))
1492                                 goto nla_put_failure;
1493                 }
1494
1495                 nla_nest_end(msg, nl_cmds);
1496                 state->split_start++;
1497                 if (state->split)
1498                         break;
1499         case 5:
1500                 if (dev->ops->remain_on_channel &&
1501                     (dev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) &&
1502                     nla_put_u32(msg,
1503                                 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
1504                                 dev->wiphy.max_remain_on_channel_duration))
1505                         goto nla_put_failure;
1506
1507                 if ((dev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) &&
1508                     nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK))
1509                         goto nla_put_failure;
1510
1511                 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes))
1512                         goto nla_put_failure;
1513                 state->split_start++;
1514                 if (state->split)
1515                         break;
1516         case 6:
1517 #ifdef CONFIG_PM
1518                 if (nl80211_send_wowlan(msg, dev, state->split))
1519                         goto nla_put_failure;
1520                 state->split_start++;
1521                 if (state->split)
1522                         break;
1523 #else
1524                 state->split_start++;
1525 #endif
1526         case 7:
1527                 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
1528                                         dev->wiphy.software_iftypes))
1529                         goto nla_put_failure;
1530
1531                 if (nl80211_put_iface_combinations(&dev->wiphy, msg,
1532                                                    state->split))
1533                         goto nla_put_failure;
1534
1535                 state->split_start++;
1536                 if (state->split)
1537                         break;
1538         case 8:
1539                 if ((dev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) &&
1540                     nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME,
1541                                 dev->wiphy.ap_sme_capa))
1542                         goto nla_put_failure;
1543
1544                 features = dev->wiphy.features;
1545                 /*
1546                  * We can only add the per-channel limit information if the
1547                  * dump is split, otherwise it makes it too big. Therefore
1548                  * only advertise it in that case.
1549                  */
1550                 if (state->split)
1551                         features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS;
1552                 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features))
1553                         goto nla_put_failure;
1554
1555                 if (dev->wiphy.ht_capa_mod_mask &&
1556                     nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK,
1557                             sizeof(*dev->wiphy.ht_capa_mod_mask),
1558                             dev->wiphy.ht_capa_mod_mask))
1559                         goto nla_put_failure;
1560
1561                 if (dev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME &&
1562                     dev->wiphy.max_acl_mac_addrs &&
1563                     nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX,
1564                                 dev->wiphy.max_acl_mac_addrs))
1565                         goto nla_put_failure;
1566
1567                 /*
1568                  * Any information below this point is only available to
1569                  * applications that can deal with it being split. This
1570                  * helps ensure that newly added capabilities don't break
1571                  * older tools by overrunning their buffers.
1572                  *
1573                  * We still increment split_start so that in the split
1574                  * case we'll continue with more data in the next round,
1575                  * but break unconditionally so unsplit data stops here.
1576                  */
1577                 state->split_start++;
1578                 break;
1579         case 9:
1580                 if (dev->wiphy.extended_capabilities &&
1581                     (nla_put(msg, NL80211_ATTR_EXT_CAPA,
1582                              dev->wiphy.extended_capabilities_len,
1583                              dev->wiphy.extended_capabilities) ||
1584                      nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
1585                              dev->wiphy.extended_capabilities_len,
1586                              dev->wiphy.extended_capabilities_mask)))
1587                         goto nla_put_failure;
1588
1589                 if (dev->wiphy.vht_capa_mod_mask &&
1590                     nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK,
1591                             sizeof(*dev->wiphy.vht_capa_mod_mask),
1592                             dev->wiphy.vht_capa_mod_mask))
1593                         goto nla_put_failure;
1594
1595                 state->split_start++;
1596                 break;
1597         case 10:
1598                 if (nl80211_send_coalesce(msg, dev))
1599                         goto nla_put_failure;
1600
1601                 if ((dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) &&
1602                     (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) ||
1603                      nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ)))
1604                         goto nla_put_failure;
1605
1606                 if (dev->wiphy.max_ap_assoc_sta &&
1607                     nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA,
1608                                 dev->wiphy.max_ap_assoc_sta))
1609                         goto nla_put_failure;
1610
1611                 state->split_start++;
1612                 break;
1613         case 11:
1614                 if (dev->wiphy.n_vendor_commands) {
1615                         const struct nl80211_vendor_cmd_info *info;
1616                         struct nlattr *nested;
1617
1618                         nested = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA);
1619                         if (!nested)
1620                                 goto nla_put_failure;
1621
1622                         for (i = 0; i < dev->wiphy.n_vendor_commands; i++) {
1623                                 info = &dev->wiphy.vendor_commands[i].info;
1624                                 if (nla_put(msg, i + 1, sizeof(*info), info))
1625                                         goto nla_put_failure;
1626                         }
1627                         nla_nest_end(msg, nested);
1628                 }
1629
1630                 if (dev->wiphy.n_vendor_events) {
1631                         const struct nl80211_vendor_cmd_info *info;
1632                         struct nlattr *nested;
1633
1634                         nested = nla_nest_start(msg,
1635                                                 NL80211_ATTR_VENDOR_EVENTS);
1636                         if (!nested)
1637                                 goto nla_put_failure;
1638
1639                         for (i = 0; i < dev->wiphy.n_vendor_events; i++) {
1640                                 info = &dev->wiphy.vendor_events[i];
1641                                 if (nla_put(msg, i + 1, sizeof(*info), info))
1642                                         goto nla_put_failure;
1643                         }
1644                         nla_nest_end(msg, nested);
1645                 }
1646
1647                 /* done */
1648                 state->split_start = 0;
1649                 break;
1650         }
1651         return genlmsg_end(msg, hdr);
1652
1653  nla_put_failure:
1654         genlmsg_cancel(msg, hdr);
1655         return -EMSGSIZE;
1656 }
1657
1658 static int nl80211_dump_wiphy_parse(struct sk_buff *skb,
1659                                     struct netlink_callback *cb,
1660                                     struct nl80211_dump_wiphy_state *state)
1661 {
1662         struct nlattr **tb = nl80211_fam.attrbuf;
1663         int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
1664                               tb, nl80211_fam.maxattr, nl80211_policy);
1665         /* ignore parse errors for backward compatibility */
1666         if (ret)
1667                 return 0;
1668
1669         state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP];
1670         if (tb[NL80211_ATTR_WIPHY])
1671                 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
1672         if (tb[NL80211_ATTR_WDEV])
1673                 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32;
1674         if (tb[NL80211_ATTR_IFINDEX]) {
1675                 struct net_device *netdev;
1676                 struct cfg80211_registered_device *rdev;
1677                 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
1678
1679                 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx);
1680                 if (!netdev)
1681                         return -ENODEV;
1682                 if (netdev->ieee80211_ptr) {
1683                         rdev = wiphy_to_dev(
1684                                 netdev->ieee80211_ptr->wiphy);
1685                         state->filter_wiphy = rdev->wiphy_idx;
1686                 }
1687         }
1688
1689         return 0;
1690 }
1691
1692 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
1693 {
1694         int idx = 0, ret;
1695         struct nl80211_dump_wiphy_state *state = (void *)cb->args[0];
1696         struct cfg80211_registered_device *dev;
1697
1698         rtnl_lock();
1699         if (!state) {
1700                 state = kzalloc(sizeof(*state), GFP_KERNEL);
1701                 if (!state) {
1702                         rtnl_unlock();
1703                         return -ENOMEM;
1704                 }
1705                 state->filter_wiphy = -1;
1706                 ret = nl80211_dump_wiphy_parse(skb, cb, state);
1707                 if (ret) {
1708                         kfree(state);
1709                         rtnl_unlock();
1710                         return ret;
1711                 }
1712                 cb->args[0] = (long)state;
1713         }
1714
1715         list_for_each_entry(dev, &cfg80211_rdev_list, list) {
1716                 if (!net_eq(wiphy_net(&dev->wiphy), sock_net(skb->sk)))
1717                         continue;
1718                 if (++idx <= state->start)
1719                         continue;
1720                 if (state->filter_wiphy != -1 &&
1721                     state->filter_wiphy != dev->wiphy_idx)
1722                         continue;
1723                 /* attempt to fit multiple wiphy data chunks into the skb */
1724                 do {
1725                         ret = nl80211_send_wiphy(dev, skb,
1726                                                  NETLINK_CB(cb->skb).portid,
1727                                                  cb->nlh->nlmsg_seq,
1728                                                  NLM_F_MULTI, state);
1729                         if (ret < 0) {
1730                                 /*
1731                                  * If sending the wiphy data didn't fit (ENOBUFS
1732                                  * or EMSGSIZE returned), this SKB is still
1733                                  * empty (so it's not too big because another
1734                                  * wiphy dataset is already in the skb) and
1735                                  * we've not tried to adjust the dump allocation
1736                                  * yet ... then adjust the alloc size to be
1737                                  * bigger, and return 1 but with the empty skb.
1738                                  * This results in an empty message being RX'ed
1739                                  * in userspace, but that is ignored.
1740                                  *
1741                                  * We can then retry with the larger buffer.
1742                                  */
1743                                 if ((ret == -ENOBUFS || ret == -EMSGSIZE) &&
1744                                     !skb->len && !state->split &&
1745                                     cb->min_dump_alloc < 4096) {
1746                                         cb->min_dump_alloc = 4096;
1747                                         state->split_start = 0;
1748                                         rtnl_unlock();
1749                                         return 1;
1750                                 }
1751                                 idx--;
1752                                 break;
1753                         }
1754                 } while (state->split_start > 0);
1755                 break;
1756         }
1757         rtnl_unlock();
1758
1759         state->start = idx;
1760
1761         return skb->len;
1762 }
1763
1764 static int nl80211_dump_wiphy_done(struct netlink_callback *cb)
1765 {
1766         kfree((void *)cb->args[0]);
1767         return 0;
1768 }
1769
1770 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
1771 {
1772         struct sk_buff *msg;
1773         struct cfg80211_registered_device *dev = info->user_ptr[0];
1774         struct nl80211_dump_wiphy_state state = {};
1775
1776         msg = nlmsg_new(4096, GFP_KERNEL);
1777         if (!msg)
1778                 return -ENOMEM;
1779
1780         if (nl80211_send_wiphy(dev, msg, info->snd_portid, info->snd_seq, 0,
1781                                &state) < 0) {
1782                 nlmsg_free(msg);
1783                 return -ENOBUFS;
1784         }
1785
1786         return genlmsg_reply(msg, info);
1787 }
1788
1789 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
1790         [NL80211_TXQ_ATTR_QUEUE]                = { .type = NLA_U8 },
1791         [NL80211_TXQ_ATTR_TXOP]                 = { .type = NLA_U16 },
1792         [NL80211_TXQ_ATTR_CWMIN]                = { .type = NLA_U16 },
1793         [NL80211_TXQ_ATTR_CWMAX]                = { .type = NLA_U16 },
1794         [NL80211_TXQ_ATTR_AIFS]                 = { .type = NLA_U8 },
1795 };
1796
1797 static int parse_txq_params(struct nlattr *tb[],
1798                             struct ieee80211_txq_params *txq_params)
1799 {
1800         if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] ||
1801             !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
1802             !tb[NL80211_TXQ_ATTR_AIFS])
1803                 return -EINVAL;
1804
1805         txq_params->ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]);
1806         txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
1807         txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
1808         txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
1809         txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
1810
1811         if (txq_params->ac >= NL80211_NUM_ACS)
1812                 return -EINVAL;
1813
1814         return 0;
1815 }
1816
1817 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
1818 {
1819         /*
1820          * You can only set the channel explicitly for WDS interfaces,
1821          * all others have their channel managed via their respective
1822          * "establish a connection" command (connect, join, ...)
1823          *
1824          * For AP/GO and mesh mode, the channel can be set with the
1825          * channel userspace API, but is only stored and passed to the
1826          * low-level driver when the AP starts or the mesh is joined.
1827          * This is for backward compatibility, userspace can also give
1828          * the channel in the start-ap or join-mesh commands instead.
1829          *
1830          * Monitors are special as they are normally slaved to
1831          * whatever else is going on, so they have their own special
1832          * operation to set the monitor channel if possible.
1833          */
1834         return !wdev ||
1835                 wdev->iftype == NL80211_IFTYPE_AP ||
1836                 wdev->iftype == NL80211_IFTYPE_MESH_POINT ||
1837                 wdev->iftype == NL80211_IFTYPE_MONITOR ||
1838                 wdev->iftype == NL80211_IFTYPE_P2P_GO;
1839 }
1840
1841 static int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
1842                                  struct genl_info *info,
1843                                  struct cfg80211_chan_def *chandef)
1844 {
1845         u32 control_freq;
1846
1847         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
1848                 return -EINVAL;
1849
1850         control_freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
1851
1852         chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq);
1853         chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
1854         chandef->center_freq1 = control_freq;
1855         chandef->center_freq2 = 0;
1856
1857         /* Primary channel not allowed */
1858         if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED)
1859                 return -EINVAL;
1860
1861         if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
1862                 enum nl80211_channel_type chantype;
1863
1864                 chantype = nla_get_u32(
1865                                 info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
1866
1867                 switch (chantype) {
1868                 case NL80211_CHAN_NO_HT:
1869                 case NL80211_CHAN_HT20:
1870                 case NL80211_CHAN_HT40PLUS:
1871                 case NL80211_CHAN_HT40MINUS:
1872                         cfg80211_chandef_create(chandef, chandef->chan,
1873                                                 chantype);
1874                         break;
1875                 default:
1876                         return -EINVAL;
1877                 }
1878         } else if (info->attrs[NL80211_ATTR_CHANNEL_WIDTH]) {
1879                 chandef->width =
1880                         nla_get_u32(info->attrs[NL80211_ATTR_CHANNEL_WIDTH]);
1881                 if (info->attrs[NL80211_ATTR_CENTER_FREQ1])
1882                         chandef->center_freq1 =
1883                                 nla_get_u32(
1884                                         info->attrs[NL80211_ATTR_CENTER_FREQ1]);
1885                 if (info->attrs[NL80211_ATTR_CENTER_FREQ2])
1886                         chandef->center_freq2 =
1887                                 nla_get_u32(
1888                                         info->attrs[NL80211_ATTR_CENTER_FREQ2]);
1889         }
1890
1891         if (!cfg80211_chandef_valid(chandef))
1892                 return -EINVAL;
1893
1894         if (!cfg80211_chandef_usable(&rdev->wiphy, chandef,
1895                                      IEEE80211_CHAN_DISABLED))
1896                 return -EINVAL;
1897
1898         if ((chandef->width == NL80211_CHAN_WIDTH_5 ||
1899              chandef->width == NL80211_CHAN_WIDTH_10) &&
1900             !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ))
1901                 return -EINVAL;
1902
1903         return 0;
1904 }
1905
1906 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
1907                                  struct wireless_dev *wdev,
1908                                  struct genl_info *info)
1909 {
1910         struct cfg80211_chan_def chandef;
1911         int result;
1912         enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR;
1913
1914         if (wdev)
1915                 iftype = wdev->iftype;
1916
1917         if (!nl80211_can_set_dev_channel(wdev))
1918                 return -EOPNOTSUPP;
1919
1920         result = nl80211_parse_chandef(rdev, info, &chandef);
1921         if (result)
1922                 return result;
1923
1924         switch (iftype) {
1925         case NL80211_IFTYPE_AP:
1926         case NL80211_IFTYPE_P2P_GO:
1927                 if (wdev->beacon_interval) {
1928                         result = -EBUSY;
1929                         break;
1930                 }
1931                 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &chandef)) {
1932                         result = -EINVAL;
1933                         break;
1934                 }
1935                 wdev->preset_chandef = chandef;
1936                 result = 0;
1937                 break;
1938         case NL80211_IFTYPE_MESH_POINT:
1939                 result = cfg80211_set_mesh_channel(rdev, wdev, &chandef);
1940                 break;
1941         case NL80211_IFTYPE_MONITOR:
1942                 result = cfg80211_set_monitor_channel(rdev, &chandef);
1943                 break;
1944         default:
1945                 result = -EINVAL;
1946         }
1947
1948         return result;
1949 }
1950
1951 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
1952 {
1953         struct cfg80211_registered_device *rdev = info->user_ptr[0];
1954         struct net_device *netdev = info->user_ptr[1];
1955
1956         return __nl80211_set_channel(rdev, netdev->ieee80211_ptr, info);
1957 }
1958
1959 static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info)
1960 {
1961         struct cfg80211_registered_device *rdev = info->user_ptr[0];
1962         struct net_device *dev = info->user_ptr[1];
1963         struct wireless_dev *wdev = dev->ieee80211_ptr;
1964         const u8 *bssid;
1965
1966         if (!info->attrs[NL80211_ATTR_MAC])
1967                 return -EINVAL;
1968
1969         if (netif_running(dev))
1970                 return -EBUSY;
1971
1972         if (!rdev->ops->set_wds_peer)
1973                 return -EOPNOTSUPP;
1974
1975         if (wdev->iftype != NL80211_IFTYPE_WDS)
1976                 return -EOPNOTSUPP;
1977
1978         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
1979         return rdev_set_wds_peer(rdev, dev, bssid);
1980 }
1981
1982
1983 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
1984 {
1985         struct cfg80211_registered_device *rdev;
1986         struct net_device *netdev = NULL;
1987         struct wireless_dev *wdev;
1988         int result = 0, rem_txq_params = 0;
1989         struct nlattr *nl_txq_params;
1990         u32 changed;
1991         u8 retry_short = 0, retry_long = 0;
1992         u32 frag_threshold = 0, rts_threshold = 0;
1993         u8 coverage_class = 0;
1994
1995         ASSERT_RTNL();
1996
1997         /*
1998          * Try to find the wiphy and netdev. Normally this
1999          * function shouldn't need the netdev, but this is
2000          * done for backward compatibility -- previously
2001          * setting the channel was done per wiphy, but now
2002          * it is per netdev. Previous userland like hostapd
2003          * also passed a netdev to set_wiphy, so that it is
2004          * possible to let that go to the right netdev!
2005          */
2006
2007         if (info->attrs[NL80211_ATTR_IFINDEX]) {
2008                 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
2009
2010                 netdev = __dev_get_by_index(genl_info_net(info), ifindex);
2011                 if (netdev && netdev->ieee80211_ptr)
2012                         rdev = wiphy_to_dev(netdev->ieee80211_ptr->wiphy);
2013                 else
2014                         netdev = NULL;
2015         }
2016
2017         if (!netdev) {
2018                 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info),
2019                                                   info->attrs);
2020                 if (IS_ERR(rdev))
2021                         return PTR_ERR(rdev);
2022                 wdev = NULL;
2023                 netdev = NULL;
2024                 result = 0;
2025         } else
2026                 wdev = netdev->ieee80211_ptr;
2027
2028         /*
2029          * end workaround code, by now the rdev is available
2030          * and locked, and wdev may or may not be NULL.
2031          */
2032
2033         if (info->attrs[NL80211_ATTR_WIPHY_NAME])
2034                 result = cfg80211_dev_rename(
2035                         rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
2036
2037         if (result)
2038                 return result;
2039
2040         if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
2041                 struct ieee80211_txq_params txq_params;
2042                 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
2043
2044                 if (!rdev->ops->set_txq_params)
2045                         return -EOPNOTSUPP;
2046
2047                 if (!netdev)
2048                         return -EINVAL;
2049
2050                 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
2051                     netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
2052                         return -EINVAL;
2053
2054                 if (!netif_running(netdev))
2055                         return -ENETDOWN;
2056
2057                 nla_for_each_nested(nl_txq_params,
2058                                     info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
2059                                     rem_txq_params) {
2060                         result = nla_parse(tb, NL80211_TXQ_ATTR_MAX,
2061                                            nla_data(nl_txq_params),
2062                                            nla_len(nl_txq_params),
2063                                            txq_params_policy);
2064                         if (result)
2065                                 return result;
2066                         result = parse_txq_params(tb, &txq_params);
2067                         if (result)
2068                                 return result;
2069
2070                         result = rdev_set_txq_params(rdev, netdev,
2071                                                      &txq_params);
2072                         if (result)
2073                                 return result;
2074                 }
2075         }
2076
2077         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
2078                 result = __nl80211_set_channel(rdev,
2079                                 nl80211_can_set_dev_channel(wdev) ? wdev : NULL,
2080                                 info);
2081                 if (result)
2082                         return result;
2083         }
2084
2085         if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
2086                 struct wireless_dev *txp_wdev = wdev;
2087                 enum nl80211_tx_power_setting type;
2088                 int idx, mbm = 0;
2089
2090                 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER))
2091                         txp_wdev = NULL;
2092
2093                 if (!rdev->ops->set_tx_power)
2094                         return -EOPNOTSUPP;
2095
2096                 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
2097                 type = nla_get_u32(info->attrs[idx]);
2098
2099                 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
2100                     (type != NL80211_TX_POWER_AUTOMATIC))
2101                         return -EINVAL;
2102
2103                 if (type != NL80211_TX_POWER_AUTOMATIC) {
2104                         idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
2105                         mbm = nla_get_u32(info->attrs[idx]);
2106                 }
2107
2108                 result = rdev_set_tx_power(rdev, txp_wdev, type, mbm);
2109                 if (result)
2110                         return result;
2111         }
2112
2113         if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
2114             info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
2115                 u32 tx_ant, rx_ant;
2116                 if ((!rdev->wiphy.available_antennas_tx &&
2117                      !rdev->wiphy.available_antennas_rx) ||
2118                     !rdev->ops->set_antenna)
2119                         return -EOPNOTSUPP;
2120
2121                 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
2122                 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
2123
2124                 /* reject antenna configurations which don't match the
2125                  * available antenna masks, except for the "all" mask */
2126                 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
2127                     (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx)))
2128                         return -EINVAL;
2129
2130                 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
2131                 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
2132
2133                 result = rdev_set_antenna(rdev, tx_ant, rx_ant);
2134                 if (result)
2135                         return result;
2136         }
2137
2138         changed = 0;
2139
2140         if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
2141                 retry_short = nla_get_u8(
2142                         info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
2143                 if (retry_short == 0)
2144                         return -EINVAL;
2145
2146                 changed |= WIPHY_PARAM_RETRY_SHORT;
2147         }
2148
2149         if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
2150                 retry_long = nla_get_u8(
2151                         info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
2152                 if (retry_long == 0)
2153                         return -EINVAL;
2154
2155                 changed |= WIPHY_PARAM_RETRY_LONG;
2156         }
2157
2158         if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
2159                 frag_threshold = nla_get_u32(
2160                         info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
2161                 if (frag_threshold < 256)
2162                         return -EINVAL;
2163
2164                 if (frag_threshold != (u32) -1) {
2165                         /*
2166                          * Fragments (apart from the last one) are required to
2167                          * have even length. Make the fragmentation code
2168                          * simpler by stripping LSB should someone try to use
2169                          * odd threshold value.
2170                          */
2171                         frag_threshold &= ~0x1;
2172                 }
2173                 changed |= WIPHY_PARAM_FRAG_THRESHOLD;
2174         }
2175
2176         if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
2177                 rts_threshold = nla_get_u32(
2178                         info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
2179                 changed |= WIPHY_PARAM_RTS_THRESHOLD;
2180         }
2181
2182         if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
2183                 coverage_class = nla_get_u8(
2184                         info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
2185                 changed |= WIPHY_PARAM_COVERAGE_CLASS;
2186         }
2187
2188         if (changed) {
2189                 u8 old_retry_short, old_retry_long;
2190                 u32 old_frag_threshold, old_rts_threshold;
2191                 u8 old_coverage_class;
2192
2193                 if (!rdev->ops->set_wiphy_params)
2194                         return -EOPNOTSUPP;
2195
2196                 old_retry_short = rdev->wiphy.retry_short;
2197                 old_retry_long = rdev->wiphy.retry_long;
2198                 old_frag_threshold = rdev->wiphy.frag_threshold;
2199                 old_rts_threshold = rdev->wiphy.rts_threshold;
2200                 old_coverage_class = rdev->wiphy.coverage_class;
2201
2202                 if (changed & WIPHY_PARAM_RETRY_SHORT)
2203                         rdev->wiphy.retry_short = retry_short;
2204                 if (changed & WIPHY_PARAM_RETRY_LONG)
2205                         rdev->wiphy.retry_long = retry_long;
2206                 if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
2207                         rdev->wiphy.frag_threshold = frag_threshold;
2208                 if (changed & WIPHY_PARAM_RTS_THRESHOLD)
2209                         rdev->wiphy.rts_threshold = rts_threshold;
2210                 if (changed & WIPHY_PARAM_COVERAGE_CLASS)
2211                         rdev->wiphy.coverage_class = coverage_class;
2212
2213                 result = rdev_set_wiphy_params(rdev, changed);
2214                 if (result) {
2215                         rdev->wiphy.retry_short = old_retry_short;
2216                         rdev->wiphy.retry_long = old_retry_long;
2217                         rdev->wiphy.frag_threshold = old_frag_threshold;
2218                         rdev->wiphy.rts_threshold = old_rts_threshold;
2219                         rdev->wiphy.coverage_class = old_coverage_class;
2220                 }
2221         }
2222         return 0;
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->chandef = params.chandef;
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 const struct nla_policy
3930 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = {
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                 unsigned int max_bandwidth_khz;
5114
5115                 reg_rule = &regdom->reg_rules[i];
5116                 freq_range = &reg_rule->freq_range;
5117                 power_rule = &reg_rule->power_rule;
5118
5119                 nl_reg_rule = nla_nest_start(msg, i);
5120                 if (!nl_reg_rule)
5121                         goto nla_put_failure_rcu;
5122
5123                 max_bandwidth_khz = freq_range->max_bandwidth_khz;
5124                 if (!max_bandwidth_khz)
5125                         max_bandwidth_khz = reg_get_max_bandwidth(regdom,
5126                                                                   reg_rule);
5127
5128                 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS,
5129                                 reg_rule->flags) ||
5130                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START,
5131                                 freq_range->start_freq_khz) ||
5132                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END,
5133                                 freq_range->end_freq_khz) ||
5134                     nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW,
5135                                 max_bandwidth_khz) ||
5136                     nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
5137                                 power_rule->max_antenna_gain) ||
5138                     nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP,
5139                                 power_rule->max_eirp))
5140                         goto nla_put_failure_rcu;
5141
5142                 nla_nest_end(msg, nl_reg_rule);
5143         }
5144         rcu_read_unlock();
5145
5146         nla_nest_end(msg, nl_reg_rules);
5147
5148         genlmsg_end(msg, hdr);
5149         return genlmsg_reply(msg, info);
5150
5151 nla_put_failure_rcu:
5152         rcu_read_unlock();
5153 nla_put_failure:
5154         genlmsg_cancel(msg, hdr);
5155 put_failure:
5156         nlmsg_free(msg);
5157         return -EMSGSIZE;
5158 }
5159
5160 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
5161 {
5162         struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
5163         struct nlattr *nl_reg_rule;
5164         char *alpha2 = NULL;
5165         int rem_reg_rules = 0, r = 0;
5166         u32 num_rules = 0, rule_idx = 0, size_of_regd;
5167         enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET;
5168         struct ieee80211_regdomain *rd = NULL;
5169
5170         if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
5171                 return -EINVAL;
5172
5173         if (!info->attrs[NL80211_ATTR_REG_RULES])
5174                 return -EINVAL;
5175
5176         alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
5177
5178         if (info->attrs[NL80211_ATTR_DFS_REGION])
5179                 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]);
5180
5181         nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
5182                             rem_reg_rules) {
5183                 num_rules++;
5184                 if (num_rules > NL80211_MAX_SUPP_REG_RULES)
5185                         return -EINVAL;
5186         }
5187
5188         if (!reg_is_valid_request(alpha2))
5189                 return -EINVAL;
5190
5191         size_of_regd = sizeof(struct ieee80211_regdomain) +
5192                        num_rules * sizeof(struct ieee80211_reg_rule);
5193
5194         rd = kzalloc(size_of_regd, GFP_KERNEL);
5195         if (!rd)
5196                 return -ENOMEM;
5197
5198         rd->n_reg_rules = num_rules;
5199         rd->alpha2[0] = alpha2[0];
5200         rd->alpha2[1] = alpha2[1];
5201
5202         /*
5203          * Disable DFS master mode if the DFS region was
5204          * not supported or known on this kernel.
5205          */
5206         if (reg_supported_dfs_region(dfs_region))
5207                 rd->dfs_region = dfs_region;
5208
5209         nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
5210                             rem_reg_rules) {
5211                 r = nla_parse(tb, NL80211_REG_RULE_ATTR_MAX,
5212                               nla_data(nl_reg_rule), nla_len(nl_reg_rule),
5213                               reg_rule_policy);
5214                 if (r)
5215                         goto bad_reg;
5216                 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
5217                 if (r)
5218                         goto bad_reg;
5219
5220                 rule_idx++;
5221
5222                 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) {
5223                         r = -EINVAL;
5224                         goto bad_reg;
5225                 }
5226         }
5227
5228         r = set_regdom(rd);
5229         /* set_regdom took ownership */
5230         rd = NULL;
5231
5232  bad_reg:
5233         kfree(rd);
5234         return r;
5235 }
5236
5237 static int validate_scan_freqs(struct nlattr *freqs)
5238 {
5239         struct nlattr *attr1, *attr2;
5240         int n_channels = 0, tmp1, tmp2;
5241
5242         nla_for_each_nested(attr1, freqs, tmp1) {
5243                 n_channels++;
5244                 /*
5245                  * Some hardware has a limited channel list for
5246                  * scanning, and it is pretty much nonsensical
5247                  * to scan for a channel twice, so disallow that
5248                  * and don't require drivers to check that the
5249                  * channel list they get isn't longer than what
5250                  * they can scan, as long as they can scan all
5251                  * the channels they registered at once.
5252                  */
5253                 nla_for_each_nested(attr2, freqs, tmp2)
5254                         if (attr1 != attr2 &&
5255                             nla_get_u32(attr1) == nla_get_u32(attr2))
5256                                 return 0;
5257         }
5258
5259         return n_channels;
5260 }
5261
5262 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
5263 {
5264         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5265         struct wireless_dev *wdev = info->user_ptr[1];
5266         struct cfg80211_scan_request *request;
5267         struct nlattr *attr;
5268         struct wiphy *wiphy;
5269         int err, tmp, n_ssids = 0, n_channels, i;
5270         size_t ie_len;
5271
5272         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
5273                 return -EINVAL;
5274
5275         wiphy = &rdev->wiphy;
5276
5277         if (!rdev->ops->scan)
5278                 return -EOPNOTSUPP;
5279
5280         if (rdev->scan_req || rdev->scan_msg) {
5281                 err = -EBUSY;
5282                 goto unlock;
5283         }
5284
5285         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
5286                 n_channels = validate_scan_freqs(
5287                                 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
5288                 if (!n_channels) {
5289                         err = -EINVAL;
5290                         goto unlock;
5291                 }
5292         } else {
5293                 n_channels = ieee80211_get_num_supported_channels(wiphy);
5294         }
5295
5296         if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
5297                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
5298                         n_ssids++;
5299
5300         if (n_ssids > wiphy->max_scan_ssids) {
5301                 err = -EINVAL;
5302                 goto unlock;
5303         }
5304
5305         if (info->attrs[NL80211_ATTR_IE])
5306                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
5307         else
5308                 ie_len = 0;
5309
5310         if (ie_len > wiphy->max_scan_ie_len) {
5311                 err = -EINVAL;
5312                 goto unlock;
5313         }
5314
5315         request = kzalloc(sizeof(*request)
5316                         + sizeof(*request->ssids) * n_ssids
5317                         + sizeof(*request->channels) * n_channels
5318                         + ie_len, GFP_KERNEL);
5319         if (!request) {
5320                 err = -ENOMEM;
5321                 goto unlock;
5322         }
5323
5324         if (n_ssids)
5325                 request->ssids = (void *)&request->channels[n_channels];
5326         request->n_ssids = n_ssids;
5327         if (ie_len) {
5328                 if (request->ssids)
5329                         request->ie = (void *)(request->ssids + n_ssids);
5330                 else
5331                         request->ie = (void *)(request->channels + n_channels);
5332         }
5333
5334         i = 0;
5335         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
5336                 /* user specified, bail out if channel not found */
5337                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) {
5338                         struct ieee80211_channel *chan;
5339
5340                         chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
5341
5342                         if (!chan) {
5343                                 err = -EINVAL;
5344                                 goto out_free;
5345                         }
5346
5347                         /* ignore disabled channels */
5348                         if (chan->flags & IEEE80211_CHAN_DISABLED)
5349                                 continue;
5350
5351                         request->channels[i] = chan;
5352                         i++;
5353                 }
5354         } else {
5355                 enum ieee80211_band band;
5356
5357                 /* all channels */
5358                 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
5359                         int j;
5360                         if (!wiphy->bands[band])
5361                                 continue;
5362                         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
5363                                 struct ieee80211_channel *chan;
5364
5365                                 chan = &wiphy->bands[band]->channels[j];
5366
5367                                 if (chan->flags & IEEE80211_CHAN_DISABLED)
5368                                         continue;
5369
5370                                 request->channels[i] = chan;
5371                                 i++;
5372                         }
5373                 }
5374         }
5375
5376         if (!i) {
5377                 err = -EINVAL;
5378                 goto out_free;
5379         }
5380
5381         request->n_channels = i;
5382
5383         i = 0;
5384         if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) {
5385                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
5386                         if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
5387                                 err = -EINVAL;
5388                                 goto out_free;
5389                         }
5390                         request->ssids[i].ssid_len = nla_len(attr);
5391                         memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
5392                         i++;
5393                 }
5394         }
5395
5396         if (info->attrs[NL80211_ATTR_IE]) {
5397                 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
5398                 memcpy((void *)request->ie,
5399                        nla_data(info->attrs[NL80211_ATTR_IE]),
5400                        request->ie_len);
5401         }
5402
5403         for (i = 0; i < IEEE80211_NUM_BANDS; i++)
5404                 if (wiphy->bands[i])
5405                         request->rates[i] =
5406                                 (1 << wiphy->bands[i]->n_bitrates) - 1;
5407
5408         if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) {
5409                 nla_for_each_nested(attr,
5410                                     info->attrs[NL80211_ATTR_SCAN_SUPP_RATES],
5411                                     tmp) {
5412                         enum ieee80211_band band = nla_type(attr);
5413
5414                         if (band < 0 || band >= IEEE80211_NUM_BANDS) {
5415                                 err = -EINVAL;
5416                                 goto out_free;
5417                         }
5418
5419                         if (!wiphy->bands[band])
5420                                 continue;
5421
5422                         err = ieee80211_get_ratemask(wiphy->bands[band],
5423                                                      nla_data(attr),
5424                                                      nla_len(attr),
5425                                                      &request->rates[band]);
5426                         if (err)
5427                                 goto out_free;
5428                 }
5429         }
5430
5431         if (info->attrs[NL80211_ATTR_SCAN_FLAGS]) {
5432                 request->flags = nla_get_u32(
5433                         info->attrs[NL80211_ATTR_SCAN_FLAGS]);
5434                 if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
5435                     !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) {
5436                         err = -EOPNOTSUPP;
5437                         goto out_free;
5438                 }
5439         }
5440
5441         request->no_cck =
5442                 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
5443
5444         request->wdev = wdev;
5445         request->wiphy = &rdev->wiphy;
5446         request->scan_start = jiffies;
5447
5448         rdev->scan_req = request;
5449         err = rdev_scan(rdev, request);
5450
5451         if (!err) {
5452                 nl80211_send_scan_start(rdev, wdev);
5453                 if (wdev->netdev)
5454                         dev_hold(wdev->netdev);
5455         } else {
5456  out_free:
5457                 rdev->scan_req = NULL;
5458                 kfree(request);
5459         }
5460
5461  unlock:
5462         return err;
5463 }
5464
5465 static int nl80211_start_sched_scan(struct sk_buff *skb,
5466                                     struct genl_info *info)
5467 {
5468         struct cfg80211_sched_scan_request *request;
5469         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5470         struct net_device *dev = info->user_ptr[1];
5471         struct nlattr *attr;
5472         struct wiphy *wiphy;
5473         int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i;
5474         u32 interval;
5475         enum ieee80211_band band;
5476         size_t ie_len;
5477         struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1];
5478         s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF;
5479
5480         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) ||
5481             !rdev->ops->sched_scan_start)
5482                 return -EOPNOTSUPP;
5483
5484         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
5485                 return -EINVAL;
5486
5487         if (!info->attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
5488                 return -EINVAL;
5489
5490         interval = nla_get_u32(info->attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]);
5491         if (interval == 0)
5492                 return -EINVAL;
5493
5494         wiphy = &rdev->wiphy;
5495
5496         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
5497                 n_channels = validate_scan_freqs(
5498                                 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
5499                 if (!n_channels)
5500                         return -EINVAL;
5501         } else {
5502                 n_channels = ieee80211_get_num_supported_channels(wiphy);
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         /*
5514          * First, count the number of 'real' matchsets. Due to an issue with
5515          * the old implementation, matchsets containing only the RSSI attribute
5516          * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default'
5517          * RSSI for all matchsets, rather than their own matchset for reporting
5518          * all APs with a strong RSSI. This is needed to be compatible with
5519          * older userspace that treated a matchset with only the RSSI as the
5520          * global RSSI for all other matchsets - if there are other matchsets.
5521          */
5522         if (info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
5523                 nla_for_each_nested(attr,
5524                                     info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
5525                                     tmp) {
5526                         struct nlattr *rssi;
5527
5528                         err = nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
5529                                         nla_data(attr), nla_len(attr),
5530                                         nl80211_match_policy);
5531                         if (err)
5532                                 return err;
5533                         /* add other standalone attributes here */
5534                         if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]) {
5535                                 n_match_sets++;
5536                                 continue;
5537                         }
5538                         rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
5539                         if (rssi)
5540                                 default_match_rssi = nla_get_s32(rssi);
5541                 }
5542         }
5543
5544         /* However, if there's no other matchset, add the RSSI one */
5545         if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
5546                 n_match_sets = 1;
5547
5548         if (n_match_sets > wiphy->max_match_sets)
5549                 return -EINVAL;
5550
5551         if (info->attrs[NL80211_ATTR_IE])
5552                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
5553         else
5554                 ie_len = 0;
5555
5556         if (ie_len > wiphy->max_sched_scan_ie_len)
5557                 return -EINVAL;
5558
5559         if (rdev->sched_scan_req) {
5560                 err = -EINPROGRESS;
5561                 goto out;
5562         }
5563
5564         request = kzalloc(sizeof(*request)
5565                         + sizeof(*request->ssids) * n_ssids
5566                         + sizeof(*request->match_sets) * n_match_sets
5567                         + sizeof(*request->channels) * n_channels
5568                         + ie_len, GFP_KERNEL);
5569         if (!request) {
5570                 err = -ENOMEM;
5571                 goto out;
5572         }
5573
5574         if (n_ssids)
5575                 request->ssids = (void *)&request->channels[n_channels];
5576         request->n_ssids = n_ssids;
5577         if (ie_len) {
5578                 if (request->ssids)
5579                         request->ie = (void *)(request->ssids + n_ssids);
5580                 else
5581                         request->ie = (void *)(request->channels + n_channels);
5582         }
5583
5584         if (n_match_sets) {
5585                 if (request->ie)
5586                         request->match_sets = (void *)(request->ie + ie_len);
5587                 else if (request->ssids)
5588                         request->match_sets =
5589                                 (void *)(request->ssids + n_ssids);
5590                 else
5591                         request->match_sets =
5592                                 (void *)(request->channels + n_channels);
5593         }
5594         request->n_match_sets = n_match_sets;
5595
5596         i = 0;
5597         if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
5598                 /* user specified, bail out if channel not found */
5599                 nla_for_each_nested(attr,
5600                                     info->attrs[NL80211_ATTR_SCAN_FREQUENCIES],
5601                                     tmp) {
5602                         struct ieee80211_channel *chan;
5603
5604                         chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
5605
5606                         if (!chan) {
5607                                 err = -EINVAL;
5608                                 goto out_free;
5609                         }
5610
5611                         /* ignore disabled channels */
5612                         if (chan->flags & IEEE80211_CHAN_DISABLED)
5613                                 continue;
5614
5615                         request->channels[i] = chan;
5616                         i++;
5617                 }
5618         } else {
5619                 /* all channels */
5620                 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
5621                         int j;
5622                         if (!wiphy->bands[band])
5623                                 continue;
5624                         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
5625                                 struct ieee80211_channel *chan;
5626
5627                                 chan = &wiphy->bands[band]->channels[j];
5628
5629                                 if (chan->flags & IEEE80211_CHAN_DISABLED)
5630                                         continue;
5631
5632                                 request->channels[i] = chan;
5633                                 i++;
5634                         }
5635                 }
5636         }
5637
5638         if (!i) {
5639                 err = -EINVAL;
5640                 goto out_free;
5641         }
5642
5643         request->n_channels = i;
5644
5645         i = 0;
5646         if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) {
5647                 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS],
5648                                     tmp) {
5649                         if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
5650                                 err = -EINVAL;
5651                                 goto out_free;
5652                         }
5653                         request->ssids[i].ssid_len = nla_len(attr);
5654                         memcpy(request->ssids[i].ssid, nla_data(attr),
5655                                nla_len(attr));
5656                         i++;
5657                 }
5658         }
5659
5660         i = 0;
5661         if (info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
5662                 nla_for_each_nested(attr,
5663                                     info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
5664                                     tmp) {
5665                         struct nlattr *ssid, *rssi;
5666
5667                         err = nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
5668                                         nla_data(attr), nla_len(attr),
5669                                         nl80211_match_policy);
5670                         if (err)
5671                                 goto out_free;
5672                         ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
5673                         if (ssid) {
5674                                 if (WARN_ON(i >= n_match_sets)) {
5675                                         /* this indicates a programming error,
5676                                          * the loop above should have verified
5677                                          * things properly
5678                                          */
5679                                         err = -EINVAL;
5680                                         goto out_free;
5681                                 }
5682
5683                                 if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) {
5684                                         err = -EINVAL;
5685                                         goto out_free;
5686                                 }
5687                                 memcpy(request->match_sets[i].ssid.ssid,
5688                                        nla_data(ssid), nla_len(ssid));
5689                                 request->match_sets[i].ssid.ssid_len =
5690                                         nla_len(ssid);
5691                                 /* special attribute - old implemenation w/a */
5692                                 request->match_sets[i].rssi_thold =
5693                                         default_match_rssi;
5694                                 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
5695                                 if (rssi)
5696                                         request->match_sets[i].rssi_thold =
5697                                                 nla_get_s32(rssi);
5698                         }
5699                         i++;
5700                 }
5701
5702                 /* there was no other matchset, so the RSSI one is alone */
5703                 if (i == 0)
5704                         request->match_sets[0].rssi_thold = default_match_rssi;
5705
5706                 request->min_rssi_thold = INT_MAX;
5707                 for (i = 0; i < n_match_sets; i++)
5708                         request->min_rssi_thold =
5709                                 min(request->match_sets[i].rssi_thold,
5710                                     request->min_rssi_thold);
5711         } else {
5712                 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF;
5713         }
5714
5715         if (ie_len) {
5716                 request->ie_len = ie_len;
5717                 memcpy((void *)request->ie,
5718                        nla_data(info->attrs[NL80211_ATTR_IE]),
5719                        request->ie_len);
5720         }
5721
5722         if (info->attrs[NL80211_ATTR_SCAN_FLAGS]) {
5723                 request->flags = nla_get_u32(
5724                         info->attrs[NL80211_ATTR_SCAN_FLAGS]);
5725                 if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
5726                     !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) {
5727                         err = -EOPNOTSUPP;
5728                         goto out_free;
5729                 }
5730         }
5731
5732         request->dev = dev;
5733         request->wiphy = &rdev->wiphy;
5734         request->interval = interval;
5735         request->scan_start = jiffies;
5736
5737         err = rdev_sched_scan_start(rdev, dev, request);
5738         if (!err) {
5739                 rdev->sched_scan_req = request;
5740                 nl80211_send_sched_scan(rdev, dev,
5741                                         NL80211_CMD_START_SCHED_SCAN);
5742                 goto out;
5743         }
5744
5745 out_free:
5746         kfree(request);
5747 out:
5748         return err;
5749 }
5750
5751 static int nl80211_stop_sched_scan(struct sk_buff *skb,
5752                                    struct genl_info *info)
5753 {
5754         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5755
5756         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) ||
5757             !rdev->ops->sched_scan_stop)
5758                 return -EOPNOTSUPP;
5759
5760         return __cfg80211_stop_sched_scan(rdev, false);
5761 }
5762
5763 static int nl80211_start_radar_detection(struct sk_buff *skb,
5764                                          struct genl_info *info)
5765 {
5766         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5767         struct net_device *dev = info->user_ptr[1];
5768         struct wireless_dev *wdev = dev->ieee80211_ptr;
5769         struct cfg80211_chan_def chandef;
5770         enum nl80211_dfs_regions dfs_region;
5771         int err;
5772
5773         dfs_region = reg_get_dfs_region(wdev->wiphy);
5774         if (dfs_region == NL80211_DFS_UNSET)
5775                 return -EINVAL;
5776
5777         err = nl80211_parse_chandef(rdev, info, &chandef);
5778         if (err)
5779                 return err;
5780
5781         if (netif_carrier_ok(dev))
5782                 return -EBUSY;
5783
5784         if (wdev->cac_started)
5785                 return -EBUSY;
5786
5787         err = cfg80211_chandef_dfs_required(wdev->wiphy, &chandef);
5788         if (err < 0)
5789                 return err;
5790
5791         if (err == 0)
5792                 return -EINVAL;
5793
5794         if (!cfg80211_chandef_dfs_usable(wdev->wiphy, &chandef))
5795                 return -EINVAL;
5796
5797         if (!rdev->ops->start_radar_detection)
5798                 return -EOPNOTSUPP;
5799
5800         err = cfg80211_can_use_iftype_chan(rdev, wdev, wdev->iftype,
5801                                            chandef.chan, CHAN_MODE_SHARED,
5802                                            BIT(chandef.width));
5803         if (err)
5804                 return err;
5805
5806         err = rdev->ops->start_radar_detection(&rdev->wiphy, dev, &chandef);
5807         if (!err) {
5808                 wdev->chandef = chandef;
5809                 wdev->cac_started = true;
5810                 wdev->cac_start_time = jiffies;
5811         }
5812         return err;
5813 }
5814
5815 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
5816 {
5817         struct cfg80211_registered_device *rdev = info->user_ptr[0];
5818         struct net_device *dev = info->user_ptr[1];
5819         struct wireless_dev *wdev = dev->ieee80211_ptr;
5820         struct cfg80211_csa_settings params;
5821         /* csa_attrs is defined static to avoid waste of stack size - this
5822          * function is called under RTNL lock, so this should not be a problem.
5823          */
5824         static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1];
5825         u8 radar_detect_width = 0;
5826         int err;
5827         bool need_new_beacon = false;
5828
5829         if (!rdev->ops->channel_switch ||
5830             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
5831                 return -EOPNOTSUPP;
5832
5833         switch (dev->ieee80211_ptr->iftype) {
5834         case NL80211_IFTYPE_AP:
5835         case NL80211_IFTYPE_P2P_GO:
5836                 need_new_beacon = true;
5837
5838                 /* useless if AP is not running */
5839                 if (!wdev->beacon_interval)
5840                         return -ENOTCONN;
5841                 break;
5842         case NL80211_IFTYPE_ADHOC:
5843                 if (!wdev->ssid_len)
5844                         return -ENOTCONN;
5845                 break;
5846         case NL80211_IFTYPE_MESH_POINT:
5847                 if (!wdev->mesh_id_len)
5848                         return -ENOTCONN;
5849                 break;
5850         default:
5851                 return -EOPNOTSUPP;
5852         }
5853
5854         memset(&params, 0, sizeof(params));
5855
5856         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
5857             !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT])
5858                 return -EINVAL;
5859
5860         /* only important for AP, IBSS and mesh create IEs internally */
5861         if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES])
5862                 return -EINVAL;
5863
5864         params.count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]);
5865
5866         if (!need_new_beacon)
5867                 goto skip_beacons;
5868
5869         err = nl80211_parse_beacon(info->attrs, &params.beacon_after);
5870         if (err)
5871                 return err;
5872
5873         err = nla_parse_nested(csa_attrs, NL80211_ATTR_MAX,
5874                                info->attrs[NL80211_ATTR_CSA_IES],
5875                                nl80211_policy);
5876         if (err)
5877                 return err;
5878
5879         err = nl80211_parse_beacon(csa_attrs, &params.beacon_csa);
5880         if (err)
5881                 return err;
5882
5883         if (!csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON])
5884                 return -EINVAL;
5885
5886         params.counter_offset_beacon =
5887                 nla_get_u16(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]);
5888         if (params.counter_offset_beacon >= params.beacon_csa.tail_len)
5889                 return -EINVAL;
5890
5891         /* sanity check - counters should be the same */
5892         if (params.beacon_csa.tail[params.counter_offset_beacon] !=
5893             params.count)
5894                 return -EINVAL;
5895
5896         if (csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]) {
5897                 params.counter_offset_presp =
5898                         nla_get_u16(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]);
5899                 if (params.counter_offset_presp >=
5900                     params.beacon_csa.probe_resp_len)
5901                         return -EINVAL;
5902
5903                 if (params.beacon_csa.probe_resp[params.counter_offset_presp] !=
5904                     params.count)
5905                         return -EINVAL;
5906         }
5907
5908 skip_beacons:
5909         err = nl80211_parse_chandef(rdev, info, &params.chandef);
5910         if (err)
5911                 return err;
5912
5913         if (!cfg80211_reg_can_beacon(&rdev->wiphy, &params.chandef))
5914                 return -EINVAL;
5915
5916         switch (dev->ieee80211_ptr->iftype) {
5917         case NL80211_IFTYPE_AP:
5918         case NL80211_IFTYPE_P2P_GO:
5919         case NL80211_IFTYPE_ADHOC:
5920         case NL80211_IFTYPE_MESH_POINT:
5921                 err = cfg80211_chandef_dfs_required(wdev->wiphy,
5922                                                     &params.chandef);
5923                 if (err < 0)
5924                         return err;
5925                 if (err) {
5926                         radar_detect_width = BIT(params.chandef.width);
5927                         params.radar_required = true;
5928                 }
5929                 break;
5930         default:
5931                 break;
5932         }
5933
5934         err = cfg80211_can_use_iftype_chan(rdev, wdev, wdev->iftype,
5935                                            params.chandef.chan,
5936                                            CHAN_MODE_SHARED,
5937                                            radar_detect_width);
5938         if (err)
5939                 return err;
5940
5941         if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
5942                 params.block_tx = true;
5943
5944         wdev_lock(wdev);
5945         err = rdev_channel_switch(rdev, dev, &params);
5946         wdev_unlock(wdev);
5947
5948         return err;
5949 }
5950
5951 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
5952                             u32 seq, int flags,
5953                             struct cfg80211_registered_device *rdev,
5954                             struct wireless_dev *wdev,
5955                             struct cfg80211_internal_bss *intbss)
5956 {
5957         struct cfg80211_bss *res = &intbss->pub;
5958         const struct cfg80211_bss_ies *ies;
5959         void *hdr;
5960         struct nlattr *bss;
5961         bool tsf = false;
5962
5963         ASSERT_WDEV_LOCK(wdev);
5964
5965         hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
5966                              NL80211_CMD_NEW_SCAN_RESULTS);
5967         if (!hdr)
5968                 return -1;
5969
5970         genl_dump_check_consistent(cb, hdr, &nl80211_fam);
5971
5972         if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation))
5973                 goto nla_put_failure;
5974         if (wdev->netdev &&
5975             nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex))
5976                 goto nla_put_failure;
5977         if (nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
5978                 goto nla_put_failure;
5979
5980         bss = nla_nest_start(msg, NL80211_ATTR_BSS);
5981         if (!bss)
5982                 goto nla_put_failure;
5983         if ((!is_zero_ether_addr(res->bssid) &&
5984              nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid)))
5985                 goto nla_put_failure;
5986
5987         rcu_read_lock();
5988         ies = rcu_dereference(res->ies);
5989         if (ies) {
5990                 if (nla_put_u64(msg, NL80211_BSS_TSF, ies->tsf))
5991                         goto fail_unlock_rcu;
5992                 tsf = true;
5993                 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS,
5994                                         ies->len, ies->data))
5995                         goto fail_unlock_rcu;
5996         }
5997         ies = rcu_dereference(res->beacon_ies);
5998         if (ies) {
5999                 if (!tsf && nla_put_u64(msg, NL80211_BSS_TSF, ies->tsf))
6000                         goto fail_unlock_rcu;
6001                 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES,
6002                                         ies->len, ies->data))
6003                         goto fail_unlock_rcu;
6004         }
6005         rcu_read_unlock();
6006
6007         if (res->beacon_interval &&
6008             nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval))
6009                 goto nla_put_failure;
6010         if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) ||
6011             nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) ||
6012             nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) ||
6013             nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO,
6014                         jiffies_to_msecs(jiffies - intbss->ts)))
6015                 goto nla_put_failure;
6016
6017         switch (rdev->wiphy.signal_type) {
6018         case CFG80211_SIGNAL_TYPE_MBM:
6019                 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal))
6020                         goto nla_put_failure;
6021                 break;
6022         case CFG80211_SIGNAL_TYPE_UNSPEC:
6023                 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal))
6024                         goto nla_put_failure;
6025                 break;
6026         default:
6027                 break;
6028         }
6029
6030         switch (wdev->iftype) {
6031         case NL80211_IFTYPE_P2P_CLIENT:
6032         case NL80211_IFTYPE_STATION:
6033                 if (intbss == wdev->current_bss &&
6034                     nla_put_u32(msg, NL80211_BSS_STATUS,
6035                                 NL80211_BSS_STATUS_ASSOCIATED))
6036                         goto nla_put_failure;
6037                 break;
6038         case NL80211_IFTYPE_ADHOC:
6039                 if (intbss == wdev->current_bss &&
6040                     nla_put_u32(msg, NL80211_BSS_STATUS,
6041                                 NL80211_BSS_STATUS_IBSS_JOINED))
6042                         goto nla_put_failure;
6043                 break;
6044         default:
6045                 break;
6046         }
6047
6048         nla_nest_end(msg, bss);
6049
6050         return genlmsg_end(msg, hdr);
6051
6052  fail_unlock_rcu:
6053         rcu_read_unlock();
6054  nla_put_failure:
6055         genlmsg_cancel(msg, hdr);
6056         return -EMSGSIZE;
6057 }
6058
6059 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb)
6060 {
6061         struct cfg80211_registered_device *rdev;
6062         struct cfg80211_internal_bss *scan;
6063         struct wireless_dev *wdev;
6064         int start = cb->args[2], idx = 0;
6065         int err;
6066
6067         err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev);
6068         if (err)
6069                 return err;
6070
6071         wdev_lock(wdev);
6072         spin_lock_bh(&rdev->bss_lock);
6073         cfg80211_bss_expire(rdev);
6074
6075         cb->seq = rdev->bss_generation;
6076
6077         list_for_each_entry(scan, &rdev->bss_list, list) {
6078                 if (++idx <= start)
6079                         continue;
6080                 if (nl80211_send_bss(skb, cb,
6081                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
6082                                 rdev, wdev, scan) < 0) {
6083                         idx--;
6084                         break;
6085                 }
6086         }
6087
6088         spin_unlock_bh(&rdev->bss_lock);
6089         wdev_unlock(wdev);
6090
6091         cb->args[2] = idx;
6092         nl80211_finish_wdev_dump(rdev);
6093
6094         return skb->len;
6095 }
6096
6097 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq,
6098                                 int flags, struct net_device *dev,
6099                                 struct survey_info *survey)
6100 {
6101         void *hdr;
6102         struct nlattr *infoattr;
6103
6104         hdr = nl80211hdr_put(msg, portid, seq, flags,
6105                              NL80211_CMD_NEW_SURVEY_RESULTS);
6106         if (!hdr)
6107                 return -ENOMEM;
6108
6109         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
6110                 goto nla_put_failure;
6111
6112         infoattr = nla_nest_start(msg, NL80211_ATTR_SURVEY_INFO);
6113         if (!infoattr)
6114                 goto nla_put_failure;
6115
6116         if (nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY,
6117                         survey->channel->center_freq))
6118                 goto nla_put_failure;
6119
6120         if ((survey->filled & SURVEY_INFO_NOISE_DBM) &&
6121             nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise))
6122                 goto nla_put_failure;
6123         if ((survey->filled & SURVEY_INFO_IN_USE) &&
6124             nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE))
6125                 goto nla_put_failure;
6126         if ((survey->filled & SURVEY_INFO_CHANNEL_TIME) &&
6127             nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME,
6128                         survey->channel_time))
6129                 goto nla_put_failure;
6130         if ((survey->filled & SURVEY_INFO_CHANNEL_TIME_BUSY) &&
6131             nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY,
6132                         survey->channel_time_busy))
6133                 goto nla_put_failure;
6134         if ((survey->filled & SURVEY_INFO_CHANNEL_TIME_EXT_BUSY) &&
6135             nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY,
6136                         survey->channel_time_ext_busy))
6137                 goto nla_put_failure;
6138         if ((survey->filled & SURVEY_INFO_CHANNEL_TIME_RX) &&
6139             nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_RX,
6140                         survey->channel_time_rx))
6141                 goto nla_put_failure;
6142         if ((survey->filled & SURVEY_INFO_CHANNEL_TIME_TX) &&
6143             nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_TX,
6144                         survey->channel_time_tx))
6145                 goto nla_put_failure;
6146
6147         nla_nest_end(msg, infoattr);
6148
6149         return genlmsg_end(msg, hdr);
6150
6151  nla_put_failure:
6152         genlmsg_cancel(msg, hdr);
6153         return -EMSGSIZE;
6154 }
6155
6156 static int nl80211_dump_survey(struct sk_buff *skb,
6157                         struct netlink_callback *cb)
6158 {
6159         struct survey_info survey;
6160         struct cfg80211_registered_device *dev;
6161         struct wireless_dev *wdev;
6162         int survey_idx = cb->args[2];
6163         int res;
6164
6165         res = nl80211_prepare_wdev_dump(skb, cb, &dev, &wdev);
6166         if (res)
6167                 return res;
6168
6169         if (!wdev->netdev) {
6170                 res = -EINVAL;
6171                 goto out_err;
6172         }
6173
6174         if (!dev->ops->dump_survey) {
6175                 res = -EOPNOTSUPP;
6176                 goto out_err;
6177         }
6178
6179         while (1) {
6180                 struct ieee80211_channel *chan;
6181
6182                 res = rdev_dump_survey(dev, wdev->netdev, survey_idx, &survey);
6183                 if (res == -ENOENT)
6184                         break;
6185                 if (res)
6186                         goto out_err;
6187
6188                 /* Survey without a channel doesn't make sense */
6189                 if (!survey.channel) {
6190                         res = -EINVAL;
6191                         goto out;
6192                 }
6193
6194                 chan = ieee80211_get_channel(&dev->wiphy,
6195                                              survey.channel->center_freq);
6196                 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) {
6197                         survey_idx++;
6198                         continue;
6199                 }
6200
6201                 if (nl80211_send_survey(skb,
6202                                 NETLINK_CB(cb->skb).portid,
6203                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
6204                                 wdev->netdev, &survey) < 0)
6205                         goto out;
6206                 survey_idx++;
6207         }
6208
6209  out:
6210         cb->args[2] = survey_idx;
6211         res = skb->len;
6212  out_err:
6213         nl80211_finish_wdev_dump(dev);
6214         return res;
6215 }
6216
6217 static bool nl80211_valid_wpa_versions(u32 wpa_versions)
6218 {
6219         return !(wpa_versions & ~(NL80211_WPA_VERSION_1 |
6220                                   NL80211_WPA_VERSION_2));
6221 }
6222
6223 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
6224 {
6225         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6226         struct net_device *dev = info->user_ptr[1];
6227         struct ieee80211_channel *chan;
6228         const u8 *bssid, *ssid, *ie = NULL, *sae_data = NULL;
6229         int err, ssid_len, ie_len = 0, sae_data_len = 0;
6230         enum nl80211_auth_type auth_type;
6231         struct key_parse key;
6232         bool local_state_change;
6233
6234         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6235                 return -EINVAL;
6236
6237         if (!info->attrs[NL80211_ATTR_MAC])
6238                 return -EINVAL;
6239
6240         if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
6241                 return -EINVAL;
6242
6243         if (!info->attrs[NL80211_ATTR_SSID])
6244                 return -EINVAL;
6245
6246         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
6247                 return -EINVAL;
6248
6249         err = nl80211_parse_key(info, &key);
6250         if (err)
6251                 return err;
6252
6253         if (key.idx >= 0) {
6254                 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP)
6255                         return -EINVAL;
6256                 if (!key.p.key || !key.p.key_len)
6257                         return -EINVAL;
6258                 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 ||
6259                      key.p.key_len != WLAN_KEY_LEN_WEP40) &&
6260                     (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 ||
6261                      key.p.key_len != WLAN_KEY_LEN_WEP104))
6262                         return -EINVAL;
6263                 if (key.idx > 4)
6264                         return -EINVAL;
6265         } else {
6266                 key.p.key_len = 0;
6267                 key.p.key = NULL;
6268         }
6269
6270         if (key.idx >= 0) {
6271                 int i;
6272                 bool ok = false;
6273                 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) {
6274                         if (key.p.cipher == rdev->wiphy.cipher_suites[i]) {
6275                                 ok = true;
6276                                 break;
6277                         }
6278                 }
6279                 if (!ok)
6280                         return -EINVAL;
6281         }
6282
6283         if (!rdev->ops->auth)
6284                 return -EOPNOTSUPP;
6285
6286         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
6287             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
6288                 return -EOPNOTSUPP;
6289
6290         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
6291         chan = nl80211_get_valid_chan(&rdev->wiphy,
6292                                       info->attrs[NL80211_ATTR_WIPHY_FREQ]);
6293         if (!chan)
6294                 return -EINVAL;
6295
6296         ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
6297         ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
6298
6299         if (info->attrs[NL80211_ATTR_IE]) {
6300                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
6301                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6302         }
6303
6304         auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
6305         if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE))
6306                 return -EINVAL;
6307
6308         if (auth_type == NL80211_AUTHTYPE_SAE &&
6309             !info->attrs[NL80211_ATTR_SAE_DATA])
6310                 return -EINVAL;
6311
6312         if (info->attrs[NL80211_ATTR_SAE_DATA]) {
6313                 if (auth_type != NL80211_AUTHTYPE_SAE)
6314                         return -EINVAL;
6315                 sae_data = nla_data(info->attrs[NL80211_ATTR_SAE_DATA]);
6316                 sae_data_len = nla_len(info->attrs[NL80211_ATTR_SAE_DATA]);
6317                 /* need to include at least Auth Transaction and Status Code */
6318                 if (sae_data_len < 4)
6319                         return -EINVAL;
6320         }
6321
6322         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
6323
6324         /*
6325          * Since we no longer track auth state, ignore
6326          * requests to only change local state.
6327          */
6328         if (local_state_change)
6329                 return 0;
6330
6331         wdev_lock(dev->ieee80211_ptr);
6332         err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
6333                                  ssid, ssid_len, ie, ie_len,
6334                                  key.p.key, key.p.key_len, key.idx,
6335                                  sae_data, sae_data_len);
6336         wdev_unlock(dev->ieee80211_ptr);
6337         return err;
6338 }
6339
6340 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
6341                                    struct genl_info *info,
6342                                    struct cfg80211_crypto_settings *settings,
6343                                    int cipher_limit)
6344 {
6345         memset(settings, 0, sizeof(*settings));
6346
6347         settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
6348
6349         if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
6350                 u16 proto;
6351                 proto = nla_get_u16(
6352                         info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
6353                 settings->control_port_ethertype = cpu_to_be16(proto);
6354                 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
6355                     proto != ETH_P_PAE)
6356                         return -EINVAL;
6357                 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT])
6358                         settings->control_port_no_encrypt = true;
6359         } else
6360                 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE);
6361
6362         if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
6363                 void *data;
6364                 int len, i;
6365
6366                 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
6367                 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
6368                 settings->n_ciphers_pairwise = len / sizeof(u32);
6369
6370                 if (len % sizeof(u32))
6371                         return -EINVAL;
6372
6373                 if (settings->n_ciphers_pairwise > cipher_limit)
6374                         return -EINVAL;
6375
6376                 memcpy(settings->ciphers_pairwise, data, len);
6377
6378                 for (i = 0; i < settings->n_ciphers_pairwise; i++)
6379                         if (!cfg80211_supported_cipher_suite(
6380                                         &rdev->wiphy,
6381                                         settings->ciphers_pairwise[i]))
6382                                 return -EINVAL;
6383         }
6384
6385         if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
6386                 settings->cipher_group =
6387                         nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
6388                 if (!cfg80211_supported_cipher_suite(&rdev->wiphy,
6389                                                      settings->cipher_group))
6390                         return -EINVAL;
6391         }
6392
6393         if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) {
6394                 settings->wpa_versions =
6395                         nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
6396                 if (!nl80211_valid_wpa_versions(settings->wpa_versions))
6397                         return -EINVAL;
6398         }
6399
6400         if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
6401                 void *data;
6402                 int len;
6403
6404                 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
6405                 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
6406                 settings->n_akm_suites = len / sizeof(u32);
6407
6408                 if (len % sizeof(u32))
6409                         return -EINVAL;
6410
6411                 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
6412                         return -EINVAL;
6413
6414                 memcpy(settings->akm_suites, data, len);
6415         }
6416
6417         return 0;
6418 }
6419
6420 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
6421 {
6422         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6423         struct net_device *dev = info->user_ptr[1];
6424         struct ieee80211_channel *chan;
6425         struct cfg80211_assoc_request req = {};
6426         const u8 *bssid, *ssid;
6427         int err, ssid_len = 0;
6428
6429         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6430                 return -EINVAL;
6431
6432         if (!info->attrs[NL80211_ATTR_MAC] ||
6433             !info->attrs[NL80211_ATTR_SSID] ||
6434             !info->attrs[NL80211_ATTR_WIPHY_FREQ])
6435                 return -EINVAL;
6436
6437         if (!rdev->ops->assoc)
6438                 return -EOPNOTSUPP;
6439
6440         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
6441             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
6442                 return -EOPNOTSUPP;
6443
6444         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
6445
6446         chan = nl80211_get_valid_chan(&rdev->wiphy,
6447                                       info->attrs[NL80211_ATTR_WIPHY_FREQ]);
6448         if (!chan)
6449                 return -EINVAL;
6450
6451         ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
6452         ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
6453
6454         if (info->attrs[NL80211_ATTR_IE]) {
6455                 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
6456                 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6457         }
6458
6459         if (info->attrs[NL80211_ATTR_USE_MFP]) {
6460                 enum nl80211_mfp mfp =
6461                         nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
6462                 if (mfp == NL80211_MFP_REQUIRED)
6463                         req.use_mfp = true;
6464                 else if (mfp != NL80211_MFP_NO)
6465                         return -EINVAL;
6466         }
6467
6468         if (info->attrs[NL80211_ATTR_PREV_BSSID])
6469                 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
6470
6471         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
6472                 req.flags |= ASSOC_REQ_DISABLE_HT;
6473
6474         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
6475                 memcpy(&req.ht_capa_mask,
6476                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
6477                        sizeof(req.ht_capa_mask));
6478
6479         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
6480                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
6481                         return -EINVAL;
6482                 memcpy(&req.ht_capa,
6483                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
6484                        sizeof(req.ht_capa));
6485         }
6486
6487         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
6488                 req.flags |= ASSOC_REQ_DISABLE_VHT;
6489
6490         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
6491                 memcpy(&req.vht_capa_mask,
6492                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
6493                        sizeof(req.vht_capa_mask));
6494
6495         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
6496                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
6497                         return -EINVAL;
6498                 memcpy(&req.vht_capa,
6499                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
6500                        sizeof(req.vht_capa));
6501         }
6502
6503         err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
6504         if (!err) {
6505                 wdev_lock(dev->ieee80211_ptr);
6506                 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid,
6507                                           ssid, ssid_len, &req);
6508                 wdev_unlock(dev->ieee80211_ptr);
6509         }
6510
6511         return err;
6512 }
6513
6514 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
6515 {
6516         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6517         struct net_device *dev = info->user_ptr[1];
6518         const u8 *ie = NULL, *bssid;
6519         int ie_len = 0, err;
6520         u16 reason_code;
6521         bool local_state_change;
6522
6523         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6524                 return -EINVAL;
6525
6526         if (!info->attrs[NL80211_ATTR_MAC])
6527                 return -EINVAL;
6528
6529         if (!info->attrs[NL80211_ATTR_REASON_CODE])
6530                 return -EINVAL;
6531
6532         if (!rdev->ops->deauth)
6533                 return -EOPNOTSUPP;
6534
6535         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
6536             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
6537                 return -EOPNOTSUPP;
6538
6539         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
6540
6541         reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
6542         if (reason_code == 0) {
6543                 /* Reason Code 0 is reserved */
6544                 return -EINVAL;
6545         }
6546
6547         if (info->attrs[NL80211_ATTR_IE]) {
6548                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
6549                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6550         }
6551
6552         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
6553
6554         wdev_lock(dev->ieee80211_ptr);
6555         err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code,
6556                                    local_state_change);
6557         wdev_unlock(dev->ieee80211_ptr);
6558         return err;
6559 }
6560
6561 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
6562 {
6563         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6564         struct net_device *dev = info->user_ptr[1];
6565         const u8 *ie = NULL, *bssid;
6566         int ie_len = 0, err;
6567         u16 reason_code;
6568         bool local_state_change;
6569
6570         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6571                 return -EINVAL;
6572
6573         if (!info->attrs[NL80211_ATTR_MAC])
6574                 return -EINVAL;
6575
6576         if (!info->attrs[NL80211_ATTR_REASON_CODE])
6577                 return -EINVAL;
6578
6579         if (!rdev->ops->disassoc)
6580                 return -EOPNOTSUPP;
6581
6582         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
6583             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
6584                 return -EOPNOTSUPP;
6585
6586         bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
6587
6588         reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
6589         if (reason_code == 0) {
6590                 /* Reason Code 0 is reserved */
6591                 return -EINVAL;
6592         }
6593
6594         if (info->attrs[NL80211_ATTR_IE]) {
6595                 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
6596                 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6597         }
6598
6599         local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
6600
6601         wdev_lock(dev->ieee80211_ptr);
6602         err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code,
6603                                      local_state_change);
6604         wdev_unlock(dev->ieee80211_ptr);
6605         return err;
6606 }
6607
6608 static bool
6609 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev,
6610                          int mcast_rate[IEEE80211_NUM_BANDS],
6611                          int rateval)
6612 {
6613         struct wiphy *wiphy = &rdev->wiphy;
6614         bool found = false;
6615         int band, i;
6616
6617         for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
6618                 struct ieee80211_supported_band *sband;
6619
6620                 sband = wiphy->bands[band];
6621                 if (!sband)
6622                         continue;
6623
6624                 for (i = 0; i < sband->n_bitrates; i++) {
6625                         if (sband->bitrates[i].bitrate == rateval) {
6626                                 mcast_rate[band] = i + 1;
6627                                 found = true;
6628                                 break;
6629                         }
6630                 }
6631         }
6632
6633         return found;
6634 }
6635
6636 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
6637 {
6638         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6639         struct net_device *dev = info->user_ptr[1];
6640         struct cfg80211_ibss_params ibss;
6641         struct wiphy *wiphy;
6642         struct cfg80211_cached_keys *connkeys = NULL;
6643         int err;
6644
6645         memset(&ibss, 0, sizeof(ibss));
6646
6647         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
6648                 return -EINVAL;
6649
6650         if (!info->attrs[NL80211_ATTR_SSID] ||
6651             !nla_len(info->attrs[NL80211_ATTR_SSID]))
6652                 return -EINVAL;
6653
6654         ibss.beacon_interval = 100;
6655
6656         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
6657                 ibss.beacon_interval =
6658                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
6659                 if (ibss.beacon_interval < 1 || ibss.beacon_interval > 10000)
6660                         return -EINVAL;
6661         }
6662
6663         if (!rdev->ops->join_ibss)
6664                 return -EOPNOTSUPP;
6665
6666         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
6667                 return -EOPNOTSUPP;
6668
6669         wiphy = &rdev->wiphy;
6670
6671         if (info->attrs[NL80211_ATTR_MAC]) {
6672                 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
6673
6674                 if (!is_valid_ether_addr(ibss.bssid))
6675                         return -EINVAL;
6676         }
6677         ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
6678         ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
6679
6680         if (info->attrs[NL80211_ATTR_IE]) {
6681                 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
6682                 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
6683         }
6684
6685         err = nl80211_parse_chandef(rdev, info, &ibss.chandef);
6686         if (err)
6687                 return err;
6688
6689         if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef))
6690                 return -EINVAL;
6691
6692         switch (ibss.chandef.width) {
6693         case NL80211_CHAN_WIDTH_5:
6694         case NL80211_CHAN_WIDTH_10:
6695         case NL80211_CHAN_WIDTH_20_NOHT:
6696                 break;
6697         case NL80211_CHAN_WIDTH_20:
6698         case NL80211_CHAN_WIDTH_40:
6699                 if (rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)
6700                         break;
6701         default:
6702                 return -EINVAL;
6703         }
6704
6705         ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
6706         ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
6707
6708         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
6709                 u8 *rates =
6710                         nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
6711                 int n_rates =
6712                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
6713                 struct ieee80211_supported_band *sband =
6714                         wiphy->bands[ibss.chandef.chan->band];
6715
6716                 err = ieee80211_get_ratemask(sband, rates, n_rates,
6717                                              &ibss.basic_rates);
6718                 if (err)
6719                         return err;
6720         }
6721
6722         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
6723                 memcpy(&ibss.ht_capa_mask,
6724                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
6725                        sizeof(ibss.ht_capa_mask));
6726
6727         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
6728                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
6729                         return -EINVAL;
6730                 memcpy(&ibss.ht_capa,
6731                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
6732                        sizeof(ibss.ht_capa));
6733         }
6734
6735         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
6736             !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate,
6737                         nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
6738                 return -EINVAL;
6739
6740         if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
6741                 bool no_ht = false;
6742
6743                 connkeys = nl80211_parse_connkeys(rdev,
6744                                           info->attrs[NL80211_ATTR_KEYS],
6745                                           &no_ht);
6746                 if (IS_ERR(connkeys))
6747                         return PTR_ERR(connkeys);
6748
6749                 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) &&
6750                     no_ht) {
6751                         kfree(connkeys);
6752                         return -EINVAL;
6753                 }
6754         }
6755
6756         ibss.control_port =
6757                 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]);
6758
6759         ibss.userspace_handles_dfs =
6760                 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
6761
6762         err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
6763         if (err)
6764                 kfree(connkeys);
6765         return err;
6766 }
6767
6768 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
6769 {
6770         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6771         struct net_device *dev = info->user_ptr[1];
6772
6773         if (!rdev->ops->leave_ibss)
6774                 return -EOPNOTSUPP;
6775
6776         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
6777                 return -EOPNOTSUPP;
6778
6779         return cfg80211_leave_ibss(rdev, dev, false);
6780 }
6781
6782 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info)
6783 {
6784         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6785         struct net_device *dev = info->user_ptr[1];
6786         int mcast_rate[IEEE80211_NUM_BANDS];
6787         u32 nla_rate;
6788         int err;
6789
6790         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
6791             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
6792                 return -EOPNOTSUPP;
6793
6794         if (!rdev->ops->set_mcast_rate)
6795                 return -EOPNOTSUPP;
6796
6797         memset(mcast_rate, 0, sizeof(mcast_rate));
6798
6799         if (!info->attrs[NL80211_ATTR_MCAST_RATE])
6800                 return -EINVAL;
6801
6802         nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
6803         if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate))
6804                 return -EINVAL;
6805
6806         err = rdev->ops->set_mcast_rate(&rdev->wiphy, dev, mcast_rate);
6807
6808         return err;
6809 }
6810
6811 static struct sk_buff *
6812 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
6813                             int approxlen, u32 portid, u32 seq,
6814                             enum nl80211_commands cmd,
6815                             enum nl80211_attrs attr,
6816                             const struct nl80211_vendor_cmd_info *info,
6817                             gfp_t gfp)
6818 {
6819         struct sk_buff *skb;
6820         void *hdr;
6821         struct nlattr *data;
6822
6823         skb = nlmsg_new(approxlen + 100, gfp);
6824         if (!skb)
6825                 return NULL;
6826
6827         hdr = nl80211hdr_put(skb, portid, seq, 0, cmd);
6828         if (!hdr) {
6829                 kfree_skb(skb);
6830                 return NULL;
6831         }
6832
6833         if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
6834                 goto nla_put_failure;
6835
6836         if (info) {
6837                 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID,
6838                                 info->vendor_id))
6839                         goto nla_put_failure;
6840                 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD,
6841                                 info->subcmd))
6842                         goto nla_put_failure;
6843         }
6844
6845         data = nla_nest_start(skb, attr);
6846
6847         ((void **)skb->cb)[0] = rdev;
6848         ((void **)skb->cb)[1] = hdr;
6849         ((void **)skb->cb)[2] = data;
6850
6851         return skb;
6852
6853  nla_put_failure:
6854         kfree_skb(skb);
6855         return NULL;
6856 }
6857
6858 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
6859                                            enum nl80211_commands cmd,
6860                                            enum nl80211_attrs attr,
6861                                            int vendor_event_idx,
6862                                            int approxlen, gfp_t gfp)
6863 {
6864         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
6865         const struct nl80211_vendor_cmd_info *info;
6866
6867         switch (cmd) {
6868         case NL80211_CMD_TESTMODE:
6869                 if (WARN_ON(vendor_event_idx != -1))
6870                         return NULL;
6871                 info = NULL;
6872                 break;
6873         case NL80211_CMD_VENDOR:
6874                 if (WARN_ON(vendor_event_idx < 0 ||
6875                             vendor_event_idx >= wiphy->n_vendor_events))
6876                         return NULL;
6877                 info = &wiphy->vendor_events[vendor_event_idx];
6878                 break;
6879         default:
6880                 WARN_ON(1);
6881                 return NULL;
6882         }
6883
6884         return __cfg80211_alloc_vendor_skb(rdev, approxlen, 0, 0,
6885                                            cmd, attr, info, gfp);
6886 }
6887 EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
6888
6889 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
6890 {
6891         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
6892         void *hdr = ((void **)skb->cb)[1];
6893         struct nlattr *data = ((void **)skb->cb)[2];
6894         enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
6895
6896         nla_nest_end(skb, data);
6897         genlmsg_end(skb, hdr);
6898
6899         if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
6900                 mcgrp = NL80211_MCGRP_VENDOR;
6901
6902         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0,
6903                                 mcgrp, gfp);
6904 }
6905 EXPORT_SYMBOL(__cfg80211_send_event_skb);
6906
6907 #ifdef CONFIG_NL80211_TESTMODE
6908 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
6909 {
6910         struct cfg80211_registered_device *rdev = info->user_ptr[0];
6911         struct wireless_dev *wdev =
6912                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
6913         int err;
6914
6915         if (!rdev->ops->testmode_cmd)
6916                 return -EOPNOTSUPP;
6917
6918         if (IS_ERR(wdev)) {
6919                 err = PTR_ERR(wdev);
6920                 if (err != -EINVAL)
6921                         return err;
6922                 wdev = NULL;
6923         } else if (wdev->wiphy != &rdev->wiphy) {
6924                 return -EINVAL;
6925         }
6926
6927         if (!info->attrs[NL80211_ATTR_TESTDATA])
6928                 return -EINVAL;
6929
6930         rdev->cur_cmd_info = info;
6931         err = rdev_testmode_cmd(rdev, wdev,
6932                                 nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
6933                                 nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
6934         rdev->cur_cmd_info = NULL;
6935
6936         return err;
6937 }
6938
6939 static int nl80211_testmode_dump(struct sk_buff *skb,
6940                                  struct netlink_callback *cb)
6941 {
6942         struct cfg80211_registered_device *rdev;
6943         int err;
6944         long phy_idx;
6945         void *data = NULL;
6946         int data_len = 0;
6947
6948         rtnl_lock();
6949
6950         if (cb->args[0]) {
6951                 /*
6952                  * 0 is a valid index, but not valid for args[0],
6953                  * so we need to offset by 1.
6954                  */
6955                 phy_idx = cb->args[0] - 1;
6956         } else {
6957                 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
6958                                   nl80211_fam.attrbuf, nl80211_fam.maxattr,
6959                                   nl80211_policy);
6960                 if (err)
6961                         goto out_err;
6962
6963                 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk),
6964                                                   nl80211_fam.attrbuf);
6965                 if (IS_ERR(rdev)) {
6966                         err = PTR_ERR(rdev);
6967                         goto out_err;
6968                 }
6969                 phy_idx = rdev->wiphy_idx;
6970                 rdev = NULL;
6971
6972                 if (nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA])
6973                         cb->args[1] =
6974                                 (long)nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA];
6975         }
6976
6977         if (cb->args[1]) {
6978                 data = nla_data((void *)cb->args[1]);
6979                 data_len = nla_len((void *)cb->args[1]);
6980         }
6981
6982         rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
6983         if (!rdev) {
6984                 err = -ENOENT;
6985                 goto out_err;
6986         }
6987
6988         if (!rdev->ops->testmode_dump) {
6989                 err = -EOPNOTSUPP;
6990                 goto out_err;
6991         }
6992
6993         while (1) {
6994                 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
6995                                            cb->nlh->nlmsg_seq, NLM_F_MULTI,
6996                                            NL80211_CMD_TESTMODE);
6997                 struct nlattr *tmdata;
6998
6999                 if (!hdr)
7000                         break;
7001
7002                 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) {
7003                         genlmsg_cancel(skb, hdr);
7004                         break;
7005                 }
7006
7007                 tmdata = nla_nest_start(skb, NL80211_ATTR_TESTDATA);
7008                 if (!tmdata) {
7009                         genlmsg_cancel(skb, hdr);
7010                         break;
7011                 }
7012                 err = rdev_testmode_dump(rdev, skb, cb, data, data_len);
7013                 nla_nest_end(skb, tmdata);
7014
7015                 if (err == -ENOBUFS || err == -ENOENT) {
7016                         genlmsg_cancel(skb, hdr);
7017                         break;
7018                 } else if (err) {
7019                         genlmsg_cancel(skb, hdr);
7020                         goto out_err;
7021                 }
7022
7023                 genlmsg_end(skb, hdr);
7024         }
7025
7026         err = skb->len;
7027         /* see above */
7028         cb->args[0] = phy_idx + 1;
7029  out_err:
7030         rtnl_unlock();
7031         return err;
7032 }
7033 #endif
7034
7035 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
7036 {
7037         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7038         struct net_device *dev = info->user_ptr[1];
7039         struct cfg80211_connect_params connect;
7040         struct wiphy *wiphy;
7041         struct cfg80211_cached_keys *connkeys = NULL;
7042         int err;
7043
7044         memset(&connect, 0, sizeof(connect));
7045
7046         if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
7047                 return -EINVAL;
7048
7049         if (!info->attrs[NL80211_ATTR_SSID] ||
7050             !nla_len(info->attrs[NL80211_ATTR_SSID]))
7051                 return -EINVAL;
7052
7053         if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
7054                 connect.auth_type =
7055                         nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
7056                 if (!nl80211_valid_auth_type(rdev, connect.auth_type,
7057                                              NL80211_CMD_CONNECT))
7058                         return -EINVAL;
7059         } else
7060                 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
7061
7062         connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
7063
7064         err = nl80211_crypto_settings(rdev, info, &connect.crypto,
7065                                       NL80211_MAX_NR_CIPHER_SUITES);
7066         if (err)
7067                 return err;
7068
7069         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
7070             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
7071                 return -EOPNOTSUPP;
7072
7073         wiphy = &rdev->wiphy;
7074
7075         connect.bg_scan_period = -1;
7076         if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] &&
7077                 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) {
7078                 connect.bg_scan_period =
7079                         nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]);
7080         }
7081
7082         if (info->attrs[NL80211_ATTR_MAC])
7083                 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
7084         else if (info->attrs[NL80211_ATTR_MAC_HINT])
7085                 connect.bssid_hint =
7086                         nla_data(info->attrs[NL80211_ATTR_MAC_HINT]);
7087         connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
7088         connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
7089
7090         if (info->attrs[NL80211_ATTR_IE]) {
7091                 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
7092                 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
7093         }
7094
7095         if (info->attrs[NL80211_ATTR_USE_MFP]) {
7096                 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
7097                 if (connect.mfp != NL80211_MFP_REQUIRED &&
7098                     connect.mfp != NL80211_MFP_NO)
7099                         return -EINVAL;
7100         } else {
7101                 connect.mfp = NL80211_MFP_NO;
7102         }
7103
7104         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
7105                 connect.channel = nl80211_get_valid_chan(
7106                         wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ]);
7107                 if (!connect.channel)
7108                         return -EINVAL;
7109         } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) {
7110                 connect.channel_hint = nl80211_get_valid_chan(
7111                         wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]);
7112                 if (!connect.channel_hint)
7113                         return -EINVAL;
7114         }
7115
7116         if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
7117                 connkeys = nl80211_parse_connkeys(rdev,
7118                                           info->attrs[NL80211_ATTR_KEYS], NULL);
7119                 if (IS_ERR(connkeys))
7120                         return PTR_ERR(connkeys);
7121         }
7122
7123         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
7124                 connect.flags |= ASSOC_REQ_DISABLE_HT;
7125
7126         if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
7127                 memcpy(&connect.ht_capa_mask,
7128                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
7129                        sizeof(connect.ht_capa_mask));
7130
7131         if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
7132                 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
7133                         kfree(connkeys);
7134                         return -EINVAL;
7135                 }
7136                 memcpy(&connect.ht_capa,
7137                        nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
7138                        sizeof(connect.ht_capa));
7139         }
7140
7141         if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
7142                 connect.flags |= ASSOC_REQ_DISABLE_VHT;
7143
7144         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
7145                 memcpy(&connect.vht_capa_mask,
7146                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
7147                        sizeof(connect.vht_capa_mask));
7148
7149         if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
7150                 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
7151                         kfree(connkeys);
7152                         return -EINVAL;
7153                 }
7154                 memcpy(&connect.vht_capa,
7155                        nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
7156                        sizeof(connect.vht_capa));
7157         }
7158
7159         wdev_lock(dev->ieee80211_ptr);
7160         err = cfg80211_connect(rdev, dev, &connect, connkeys, NULL);
7161         wdev_unlock(dev->ieee80211_ptr);
7162         if (err)
7163                 kfree(connkeys);
7164         return err;
7165 }
7166
7167 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
7168 {
7169         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7170         struct net_device *dev = info->user_ptr[1];
7171         u16 reason;
7172         int ret;
7173
7174         if (!info->attrs[NL80211_ATTR_REASON_CODE])
7175                 reason = WLAN_REASON_DEAUTH_LEAVING;
7176         else
7177                 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
7178
7179         if (reason == 0)
7180                 return -EINVAL;
7181
7182         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
7183             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
7184                 return -EOPNOTSUPP;
7185
7186         wdev_lock(dev->ieee80211_ptr);
7187         ret = cfg80211_disconnect(rdev, dev, reason, true);
7188         wdev_unlock(dev->ieee80211_ptr);
7189         return ret;
7190 }
7191
7192 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
7193 {
7194         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7195         struct net *net;
7196         int err;
7197         u32 pid;
7198
7199         if (!info->attrs[NL80211_ATTR_PID])
7200                 return -EINVAL;
7201
7202         pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
7203
7204         net = get_net_ns_by_pid(pid);
7205         if (IS_ERR(net))
7206                 return PTR_ERR(net);
7207
7208         err = 0;
7209
7210         /* check if anything to do */
7211         if (!net_eq(wiphy_net(&rdev->wiphy), net))
7212                 err = cfg80211_switch_netns(rdev, net);
7213
7214         put_net(net);
7215         return err;
7216 }
7217
7218 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
7219 {
7220         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7221         int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev,
7222                         struct cfg80211_pmksa *pmksa) = NULL;
7223         struct net_device *dev = info->user_ptr[1];
7224         struct cfg80211_pmksa pmksa;
7225
7226         memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
7227
7228         if (!info->attrs[NL80211_ATTR_MAC])
7229                 return -EINVAL;
7230
7231         if (!info->attrs[NL80211_ATTR_PMKID])
7232                 return -EINVAL;
7233
7234         pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
7235         pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
7236
7237         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
7238             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
7239                 return -EOPNOTSUPP;
7240
7241         switch (info->genlhdr->cmd) {
7242         case NL80211_CMD_SET_PMKSA:
7243                 rdev_ops = rdev->ops->set_pmksa;
7244                 break;
7245         case NL80211_CMD_DEL_PMKSA:
7246                 rdev_ops = rdev->ops->del_pmksa;
7247                 break;
7248         default:
7249                 WARN_ON(1);
7250                 break;
7251         }
7252
7253         if (!rdev_ops)
7254                 return -EOPNOTSUPP;
7255
7256         return rdev_ops(&rdev->wiphy, dev, &pmksa);
7257 }
7258
7259 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
7260 {
7261         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7262         struct net_device *dev = info->user_ptr[1];
7263
7264         if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
7265             dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
7266                 return -EOPNOTSUPP;
7267
7268         if (!rdev->ops->flush_pmksa)
7269                 return -EOPNOTSUPP;
7270
7271         return rdev_flush_pmksa(rdev, dev);
7272 }
7273
7274 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
7275 {
7276         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7277         struct net_device *dev = info->user_ptr[1];
7278         u8 action_code, dialog_token;
7279         u32 peer_capability = 0;
7280         u16 status_code;
7281         u8 *peer;
7282
7283         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
7284             !rdev->ops->tdls_mgmt)
7285                 return -EOPNOTSUPP;
7286
7287         if (!info->attrs[NL80211_ATTR_TDLS_ACTION] ||
7288             !info->attrs[NL80211_ATTR_STATUS_CODE] ||
7289             !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] ||
7290             !info->attrs[NL80211_ATTR_IE] ||
7291             !info->attrs[NL80211_ATTR_MAC])
7292                 return -EINVAL;
7293
7294         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
7295         action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
7296         status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
7297         dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
7298         if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
7299                 peer_capability =
7300                         nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
7301
7302         return rdev_tdls_mgmt(rdev, dev, peer, action_code,
7303                               dialog_token, status_code, peer_capability,
7304                               nla_data(info->attrs[NL80211_ATTR_IE]),
7305                               nla_len(info->attrs[NL80211_ATTR_IE]));
7306 }
7307
7308 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info)
7309 {
7310         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7311         struct net_device *dev = info->user_ptr[1];
7312         enum nl80211_tdls_operation operation;
7313         u8 *peer;
7314
7315         if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
7316             !rdev->ops->tdls_oper)
7317                 return -EOPNOTSUPP;
7318
7319         if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] ||
7320             !info->attrs[NL80211_ATTR_MAC])
7321                 return -EINVAL;
7322
7323         operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]);
7324         peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
7325
7326         return rdev_tdls_oper(rdev, dev, peer, operation);
7327 }
7328
7329 static int nl80211_remain_on_channel(struct sk_buff *skb,
7330                                      struct genl_info *info)
7331 {
7332         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7333         struct wireless_dev *wdev = info->user_ptr[1];
7334         struct cfg80211_chan_def chandef;
7335         struct sk_buff *msg;
7336         void *hdr;
7337         u64 cookie;
7338         u32 duration;
7339         int err;
7340
7341         if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
7342             !info->attrs[NL80211_ATTR_DURATION])
7343                 return -EINVAL;
7344
7345         duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
7346
7347         if (!rdev->ops->remain_on_channel ||
7348             !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL))
7349                 return -EOPNOTSUPP;
7350
7351         /*
7352          * We should be on that channel for at least a minimum amount of
7353          * time (10ms) but no longer than the driver supports.
7354          */
7355         if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
7356             duration > rdev->wiphy.max_remain_on_channel_duration)
7357                 return -EINVAL;
7358
7359         err = nl80211_parse_chandef(rdev, info, &chandef);
7360         if (err)
7361                 return err;
7362
7363         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7364         if (!msg)
7365                 return -ENOMEM;
7366
7367         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
7368                              NL80211_CMD_REMAIN_ON_CHANNEL);
7369         if (!hdr) {
7370                 err = -ENOBUFS;
7371                 goto free_msg;
7372         }
7373
7374         err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
7375                                      duration, &cookie);
7376
7377         if (err)
7378                 goto free_msg;
7379
7380         if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
7381                 goto nla_put_failure;
7382
7383         genlmsg_end(msg, hdr);
7384
7385         return genlmsg_reply(msg, info);
7386
7387  nla_put_failure:
7388         err = -ENOBUFS;
7389  free_msg:
7390         nlmsg_free(msg);
7391         return err;
7392 }
7393
7394 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
7395                                             struct genl_info *info)
7396 {
7397         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7398         struct wireless_dev *wdev = info->user_ptr[1];
7399         u64 cookie;
7400
7401         if (!info->attrs[NL80211_ATTR_COOKIE])
7402                 return -EINVAL;
7403
7404         if (!rdev->ops->cancel_remain_on_channel)
7405                 return -EOPNOTSUPP;
7406
7407         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
7408
7409         return rdev_cancel_remain_on_channel(rdev, wdev, cookie);
7410 }
7411
7412 static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
7413                            u8 *rates, u8 rates_len)
7414 {
7415         u8 i;
7416         u32 mask = 0;
7417
7418         for (i = 0; i < rates_len; i++) {
7419                 int rate = (rates[i] & 0x7f) * 5;
7420                 int ridx;
7421                 for (ridx = 0; ridx < sband->n_bitrates; ridx++) {
7422                         struct ieee80211_rate *srate =
7423                                 &sband->bitrates[ridx];
7424                         if (rate == srate->bitrate) {
7425                                 mask |= 1 << ridx;
7426                                 break;
7427                         }
7428                 }
7429                 if (ridx == sband->n_bitrates)
7430                         return 0; /* rate not found */
7431         }
7432
7433         return mask;
7434 }
7435
7436 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband,
7437                                u8 *rates, u8 rates_len,
7438                                u8 mcs[IEEE80211_HT_MCS_MASK_LEN])
7439 {
7440         u8 i;
7441
7442         memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN);
7443
7444         for (i = 0; i < rates_len; i++) {
7445                 int ridx, rbit;
7446
7447                 ridx = rates[i] / 8;
7448                 rbit = BIT(rates[i] % 8);
7449
7450                 /* check validity */
7451                 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN))
7452                         return false;
7453
7454                 /* check availability */
7455                 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit)
7456                         mcs[ridx] |= rbit;
7457                 else
7458                         return false;
7459         }
7460
7461         return true;
7462 }
7463
7464 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map)
7465 {
7466         u16 mcs_mask = 0;
7467
7468         switch (vht_mcs_map) {
7469         case IEEE80211_VHT_MCS_NOT_SUPPORTED:
7470                 break;
7471         case IEEE80211_VHT_MCS_SUPPORT_0_7:
7472                 mcs_mask = 0x00FF;
7473                 break;
7474         case IEEE80211_VHT_MCS_SUPPORT_0_8:
7475                 mcs_mask = 0x01FF;
7476                 break;
7477         case IEEE80211_VHT_MCS_SUPPORT_0_9:
7478                 mcs_mask = 0x03FF;
7479                 break;
7480         default:
7481                 break;
7482         }
7483
7484         return mcs_mask;
7485 }
7486
7487 static void vht_build_mcs_mask(u16 vht_mcs_map,
7488                                u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
7489 {
7490         u8 nss;
7491
7492         for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
7493                 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03);
7494                 vht_mcs_map >>= 2;
7495         }
7496 }
7497
7498 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband,
7499                              struct nl80211_txrate_vht *txrate,
7500                              u16 mcs[NL80211_VHT_NSS_MAX])
7501 {
7502         u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
7503         u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {};
7504         u8 i;
7505
7506         if (!sband->vht_cap.vht_supported)
7507                 return false;
7508
7509         memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX);
7510
7511         /* Build vht_mcs_mask from VHT capabilities */
7512         vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask);
7513
7514         for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
7515                 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
7516                         mcs[i] = txrate->mcs[i];
7517                 else
7518                         return false;
7519         }
7520
7521         return true;
7522 }
7523
7524 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
7525         [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY,
7526                                     .len = NL80211_MAX_SUPP_RATES },
7527         [NL80211_TXRATE_HT] = { .type = NLA_BINARY,
7528                                 .len = NL80211_MAX_SUPP_HT_RATES },
7529         [NL80211_TXRATE_VHT] = { .len = sizeof(struct nl80211_txrate_vht)},
7530         [NL80211_TXRATE_GI] = { .type = NLA_U8 },
7531 };
7532
7533 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
7534                                        struct genl_info *info)
7535 {
7536         struct nlattr *tb[NL80211_TXRATE_MAX + 1];
7537         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7538         struct cfg80211_bitrate_mask mask;
7539         int rem, i;
7540         struct net_device *dev = info->user_ptr[1];
7541         struct nlattr *tx_rates;
7542         struct ieee80211_supported_band *sband;
7543         u16 vht_tx_mcs_map;
7544
7545         if (!rdev->ops->set_bitrate_mask)
7546                 return -EOPNOTSUPP;
7547
7548         memset(&mask, 0, sizeof(mask));
7549         /* Default to all rates enabled */
7550         for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
7551                 sband = rdev->wiphy.bands[i];
7552
7553                 if (!sband)
7554                         continue;
7555
7556                 mask.control[i].legacy = (1 << sband->n_bitrates) - 1;
7557                 memcpy(mask.control[i].ht_mcs,
7558                        sband->ht_cap.mcs.rx_mask,
7559                        sizeof(mask.control[i].ht_mcs));
7560
7561                 if (!sband->vht_cap.vht_supported)
7562                         continue;
7563
7564                 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
7565                 vht_build_mcs_mask(vht_tx_mcs_map, mask.control[i].vht_mcs);
7566         }
7567
7568         /* if no rates are given set it back to the defaults */
7569         if (!info->attrs[NL80211_ATTR_TX_RATES])
7570                 goto out;
7571
7572         /*
7573          * The nested attribute uses enum nl80211_band as the index. This maps
7574          * directly to the enum ieee80211_band values used in cfg80211.
7575          */
7576         BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
7577         nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem) {
7578                 enum ieee80211_band band = nla_type(tx_rates);
7579                 int err;
7580
7581                 if (band < 0 || band >= IEEE80211_NUM_BANDS)
7582                         return -EINVAL;
7583                 sband = rdev->wiphy.bands[band];
7584                 if (sband == NULL)
7585                         return -EINVAL;
7586                 err = nla_parse(tb, NL80211_TXRATE_MAX, nla_data(tx_rates),
7587                                 nla_len(tx_rates), nl80211_txattr_policy);
7588                 if (err)
7589                         return err;
7590                 if (tb[NL80211_TXRATE_LEGACY]) {
7591                         mask.control[band].legacy = rateset_to_mask(
7592                                 sband,
7593                                 nla_data(tb[NL80211_TXRATE_LEGACY]),
7594                                 nla_len(tb[NL80211_TXRATE_LEGACY]));
7595                         if ((mask.control[band].legacy == 0) &&
7596                             nla_len(tb[NL80211_TXRATE_LEGACY]))
7597                                 return -EINVAL;
7598                 }
7599                 if (tb[NL80211_TXRATE_HT]) {
7600                         if (!ht_rateset_to_mask(
7601                                         sband,
7602                                         nla_data(tb[NL80211_TXRATE_HT]),
7603                                         nla_len(tb[NL80211_TXRATE_HT]),
7604                                         mask.control[band].ht_mcs))
7605                                 return -EINVAL;
7606                 }
7607                 if (tb[NL80211_TXRATE_VHT]) {
7608                         if (!vht_set_mcs_mask(
7609                                         sband,
7610                                         nla_data(tb[NL80211_TXRATE_VHT]),
7611                                         mask.control[band].vht_mcs))
7612                                 return -EINVAL;
7613                 }
7614                 if (tb[NL80211_TXRATE_GI]) {
7615                         mask.control[band].gi =
7616                                 nla_get_u8(tb[NL80211_TXRATE_GI]);
7617                         if (mask.control[band].gi > NL80211_TXRATE_FORCE_LGI)
7618                                 return -EINVAL;
7619                 }
7620
7621                 if (mask.control[band].legacy == 0) {
7622                         /* don't allow empty legacy rates if HT or VHT
7623                          * are not even supported.
7624                          */
7625                         if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported ||
7626                               rdev->wiphy.bands[band]->vht_cap.vht_supported))
7627                                 return -EINVAL;
7628
7629                         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
7630                                 if (mask.control[band].ht_mcs[i])
7631                                         goto out;
7632
7633                         for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
7634                                 if (mask.control[band].vht_mcs[i])
7635                                         goto out;
7636
7637                         /* legacy and mcs rates may not be both empty */
7638                         return -EINVAL;
7639                 }
7640         }
7641
7642 out:
7643         return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
7644 }
7645
7646 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
7647 {
7648         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7649         struct wireless_dev *wdev = info->user_ptr[1];
7650         u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
7651
7652         if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
7653                 return -EINVAL;
7654
7655         if (info->attrs[NL80211_ATTR_FRAME_TYPE])
7656                 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
7657
7658         switch (wdev->iftype) {
7659         case NL80211_IFTYPE_STATION:
7660         case NL80211_IFTYPE_ADHOC:
7661         case NL80211_IFTYPE_P2P_CLIENT:
7662         case NL80211_IFTYPE_AP:
7663         case NL80211_IFTYPE_AP_VLAN:
7664         case NL80211_IFTYPE_MESH_POINT:
7665         case NL80211_IFTYPE_P2P_GO:
7666         case NL80211_IFTYPE_P2P_DEVICE:
7667                 break;
7668         default:
7669                 return -EOPNOTSUPP;
7670         }
7671
7672         /* not much point in registering if we can't reply */
7673         if (!rdev->ops->mgmt_tx)
7674                 return -EOPNOTSUPP;
7675
7676         return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type,
7677                         nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
7678                         nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]));
7679 }
7680
7681 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
7682 {
7683         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7684         struct wireless_dev *wdev = info->user_ptr[1];
7685         struct cfg80211_chan_def chandef;
7686         int err;
7687         void *hdr = NULL;
7688         u64 cookie;
7689         struct sk_buff *msg = NULL;
7690         struct cfg80211_mgmt_tx_params params = {
7691                 .dont_wait_for_ack =
7692                         info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK],
7693         };
7694
7695         if (!info->attrs[NL80211_ATTR_FRAME])
7696                 return -EINVAL;
7697
7698         if (!rdev->ops->mgmt_tx)
7699                 return -EOPNOTSUPP;
7700
7701         switch (wdev->iftype) {
7702         case NL80211_IFTYPE_P2P_DEVICE:
7703                 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
7704                         return -EINVAL;
7705         case NL80211_IFTYPE_STATION:
7706         case NL80211_IFTYPE_ADHOC:
7707         case NL80211_IFTYPE_P2P_CLIENT:
7708         case NL80211_IFTYPE_AP:
7709         case NL80211_IFTYPE_AP_VLAN:
7710         case NL80211_IFTYPE_MESH_POINT:
7711         case NL80211_IFTYPE_P2P_GO:
7712                 break;
7713         default:
7714                 return -EOPNOTSUPP;
7715         }
7716
7717         if (info->attrs[NL80211_ATTR_DURATION]) {
7718                 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
7719                         return -EINVAL;
7720                 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
7721
7722                 /*
7723                  * We should wait on the channel for at least a minimum amount
7724                  * of time (10ms) but no longer than the driver supports.
7725                  */
7726                 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
7727                     params.wait > rdev->wiphy.max_remain_on_channel_duration)
7728                         return -EINVAL;
7729
7730         }
7731
7732         params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
7733
7734         if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
7735                 return -EINVAL;
7736
7737         params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
7738
7739         /* get the channel if any has been specified, otherwise pass NULL to
7740          * the driver. The latter will use the current one
7741          */
7742         chandef.chan = NULL;
7743         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
7744                 err = nl80211_parse_chandef(rdev, info, &chandef);
7745                 if (err)
7746                         return err;
7747         }
7748
7749         if (!chandef.chan && params.offchan)
7750                 return -EINVAL;
7751
7752         if (!params.dont_wait_for_ack) {
7753                 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7754                 if (!msg)
7755                         return -ENOMEM;
7756
7757                 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
7758                                      NL80211_CMD_FRAME);
7759                 if (!hdr) {
7760                         err = -ENOBUFS;
7761                         goto free_msg;
7762                 }
7763         }
7764
7765         params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
7766         params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
7767         params.chan = chandef.chan;
7768         err = cfg80211_mlme_mgmt_tx(rdev, wdev, &params, &cookie);
7769         if (err)
7770                 goto free_msg;
7771
7772         if (msg) {
7773                 if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
7774                         goto nla_put_failure;
7775
7776                 genlmsg_end(msg, hdr);
7777                 return genlmsg_reply(msg, info);
7778         }
7779
7780         return 0;
7781
7782  nla_put_failure:
7783         err = -ENOBUFS;
7784  free_msg:
7785         nlmsg_free(msg);
7786         return err;
7787 }
7788
7789 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
7790 {
7791         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7792         struct wireless_dev *wdev = info->user_ptr[1];
7793         u64 cookie;
7794
7795         if (!info->attrs[NL80211_ATTR_COOKIE])
7796                 return -EINVAL;
7797
7798         if (!rdev->ops->mgmt_tx_cancel_wait)
7799                 return -EOPNOTSUPP;
7800
7801         switch (wdev->iftype) {
7802         case NL80211_IFTYPE_STATION:
7803         case NL80211_IFTYPE_ADHOC:
7804         case NL80211_IFTYPE_P2P_CLIENT:
7805         case NL80211_IFTYPE_AP:
7806         case NL80211_IFTYPE_AP_VLAN:
7807         case NL80211_IFTYPE_P2P_GO:
7808         case NL80211_IFTYPE_P2P_DEVICE:
7809                 break;
7810         default:
7811                 return -EOPNOTSUPP;
7812         }
7813
7814         cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
7815
7816         return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie);
7817 }
7818
7819 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
7820 {
7821         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7822         struct wireless_dev *wdev;
7823         struct net_device *dev = info->user_ptr[1];
7824         u8 ps_state;
7825         bool state;
7826         int err;
7827
7828         if (!info->attrs[NL80211_ATTR_PS_STATE])
7829                 return -EINVAL;
7830
7831         ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
7832
7833         if (ps_state != NL80211_PS_DISABLED && ps_state != NL80211_PS_ENABLED)
7834                 return -EINVAL;
7835
7836         wdev = dev->ieee80211_ptr;
7837
7838         if (!rdev->ops->set_power_mgmt)
7839                 return -EOPNOTSUPP;
7840
7841         state = (ps_state == NL80211_PS_ENABLED) ? true : false;
7842
7843         if (state == wdev->ps)
7844                 return 0;
7845
7846         err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout);
7847         if (!err)
7848                 wdev->ps = state;
7849         return err;
7850 }
7851
7852 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
7853 {
7854         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7855         enum nl80211_ps_state ps_state;
7856         struct wireless_dev *wdev;
7857         struct net_device *dev = info->user_ptr[1];
7858         struct sk_buff *msg;
7859         void *hdr;
7860         int err;
7861
7862         wdev = dev->ieee80211_ptr;
7863
7864         if (!rdev->ops->set_power_mgmt)
7865                 return -EOPNOTSUPP;
7866
7867         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
7868         if (!msg)
7869                 return -ENOMEM;
7870
7871         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
7872                              NL80211_CMD_GET_POWER_SAVE);
7873         if (!hdr) {
7874                 err = -ENOBUFS;
7875                 goto free_msg;
7876         }
7877
7878         if (wdev->ps)
7879                 ps_state = NL80211_PS_ENABLED;
7880         else
7881                 ps_state = NL80211_PS_DISABLED;
7882
7883         if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state))
7884                 goto nla_put_failure;
7885
7886         genlmsg_end(msg, hdr);
7887         return genlmsg_reply(msg, info);
7888
7889  nla_put_failure:
7890         err = -ENOBUFS;
7891  free_msg:
7892         nlmsg_free(msg);
7893         return err;
7894 }
7895
7896 static const struct nla_policy
7897 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
7898         [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_U32 },
7899         [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 },
7900         [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
7901         [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
7902         [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
7903         [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
7904 };
7905
7906 static int nl80211_set_cqm_txe(struct genl_info *info,
7907                                u32 rate, u32 pkts, u32 intvl)
7908 {
7909         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7910         struct net_device *dev = info->user_ptr[1];
7911         struct wireless_dev *wdev = dev->ieee80211_ptr;
7912
7913         if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL)
7914                 return -EINVAL;
7915
7916         if (!rdev->ops->set_cqm_txe_config)
7917                 return -EOPNOTSUPP;
7918
7919         if (wdev->iftype != NL80211_IFTYPE_STATION &&
7920             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
7921                 return -EOPNOTSUPP;
7922
7923         return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl);
7924 }
7925
7926 static int nl80211_set_cqm_rssi(struct genl_info *info,
7927                                 s32 threshold, u32 hysteresis)
7928 {
7929         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7930         struct net_device *dev = info->user_ptr[1];
7931         struct wireless_dev *wdev = dev->ieee80211_ptr;
7932
7933         if (threshold > 0)
7934                 return -EINVAL;
7935
7936         /* disabling - hysteresis should also be zero then */
7937         if (threshold == 0)
7938                 hysteresis = 0;
7939
7940         if (!rdev->ops->set_cqm_rssi_config)
7941                 return -EOPNOTSUPP;
7942
7943         if (wdev->iftype != NL80211_IFTYPE_STATION &&
7944             wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
7945                 return -EOPNOTSUPP;
7946
7947         return rdev_set_cqm_rssi_config(rdev, dev, threshold, hysteresis);
7948 }
7949
7950 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
7951 {
7952         struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1];
7953         struct nlattr *cqm;
7954         int err;
7955
7956         cqm = info->attrs[NL80211_ATTR_CQM];
7957         if (!cqm)
7958                 return -EINVAL;
7959
7960         err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm,
7961                                nl80211_attr_cqm_policy);
7962         if (err)
7963                 return err;
7964
7965         if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
7966             attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
7967                 s32 threshold = nla_get_s32(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
7968                 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
7969
7970                 return nl80211_set_cqm_rssi(info, threshold, hysteresis);
7971         }
7972
7973         if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
7974             attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
7975             attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
7976                 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
7977                 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
7978                 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
7979
7980                 return nl80211_set_cqm_txe(info, rate, pkts, intvl);
7981         }
7982
7983         return -EINVAL;
7984 }
7985
7986 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
7987 {
7988         struct cfg80211_registered_device *rdev = info->user_ptr[0];
7989         struct net_device *dev = info->user_ptr[1];
7990         struct mesh_config cfg;
7991         struct mesh_setup setup;
7992         int err;
7993
7994         /* start with default */
7995         memcpy(&cfg, &default_mesh_config, sizeof(cfg));
7996         memcpy(&setup, &default_mesh_setup, sizeof(setup));
7997
7998         if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
7999                 /* and parse parameters if given */
8000                 err = nl80211_parse_mesh_config(info, &cfg, NULL);
8001                 if (err)
8002                         return err;
8003         }
8004
8005         if (!info->attrs[NL80211_ATTR_MESH_ID] ||
8006             !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
8007                 return -EINVAL;
8008
8009         setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
8010         setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
8011
8012         if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
8013             !nl80211_parse_mcast_rate(rdev, setup.mcast_rate,
8014                             nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
8015                         return -EINVAL;
8016
8017         if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
8018                 setup.beacon_interval =
8019                         nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
8020                 if (setup.beacon_interval < 10 ||
8021                     setup.beacon_interval > 10000)
8022                         return -EINVAL;
8023         }
8024
8025         if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
8026                 setup.dtim_period =
8027                         nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
8028                 if (setup.dtim_period < 1 || setup.dtim_period > 100)
8029                         return -EINVAL;
8030         }
8031
8032         if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
8033                 /* parse additional setup parameters if given */
8034                 err = nl80211_parse_mesh_setup(info, &setup);
8035                 if (err)
8036                         return err;
8037         }
8038
8039         if (setup.user_mpm)
8040                 cfg.auto_open_plinks = false;
8041
8042         if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
8043                 err = nl80211_parse_chandef(rdev, info, &setup.chandef);
8044                 if (err)
8045                         return err;
8046         } else {
8047                 /* cfg80211_join_mesh() will sort it out */
8048                 setup.chandef.chan = NULL;
8049         }
8050
8051         if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
8052                 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
8053                 int n_rates =
8054                         nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
8055                 struct ieee80211_supported_band *sband;
8056
8057                 if (!setup.chandef.chan)
8058                         return -EINVAL;
8059
8060                 sband = rdev->wiphy.bands[setup.chandef.chan->band];
8061
8062                 err = ieee80211_get_ratemask(sband, rates, n_rates,
8063                                              &setup.basic_rates);
8064                 if (err)
8065                         return err;
8066         }
8067
8068         return cfg80211_join_mesh(rdev, dev, &setup, &cfg);
8069 }
8070
8071 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
8072 {
8073         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8074         struct net_device *dev = info->user_ptr[1];
8075
8076         return cfg80211_leave_mesh(rdev, dev);
8077 }
8078
8079 #ifdef CONFIG_PM
8080 static int nl80211_send_wowlan_patterns(struct sk_buff *msg,
8081                                         struct cfg80211_registered_device *rdev)
8082 {
8083         struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config;
8084         struct nlattr *nl_pats, *nl_pat;
8085         int i, pat_len;
8086
8087         if (!wowlan->n_patterns)
8088                 return 0;
8089
8090         nl_pats = nla_nest_start(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN);
8091         if (!nl_pats)
8092                 return -ENOBUFS;
8093
8094         for (i = 0; i < wowlan->n_patterns; i++) {
8095                 nl_pat = nla_nest_start(msg, i + 1);
8096                 if (!nl_pat)
8097                         return -ENOBUFS;
8098                 pat_len = wowlan->patterns[i].pattern_len;
8099                 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8),
8100                             wowlan->patterns[i].mask) ||
8101                     nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
8102                             wowlan->patterns[i].pattern) ||
8103                     nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
8104                                 wowlan->patterns[i].pkt_offset))
8105                         return -ENOBUFS;
8106                 nla_nest_end(msg, nl_pat);
8107         }
8108         nla_nest_end(msg, nl_pats);
8109
8110         return 0;
8111 }
8112
8113 static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
8114                                    struct cfg80211_wowlan_tcp *tcp)
8115 {
8116         struct nlattr *nl_tcp;
8117
8118         if (!tcp)
8119                 return 0;
8120
8121         nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
8122         if (!nl_tcp)
8123                 return -ENOBUFS;
8124
8125         if (nla_put_be32(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) ||
8126             nla_put_be32(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) ||
8127             nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) ||
8128             nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) ||
8129             nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) ||
8130             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
8131                     tcp->payload_len, tcp->payload) ||
8132             nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
8133                         tcp->data_interval) ||
8134             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
8135                     tcp->wake_len, tcp->wake_data) ||
8136             nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK,
8137                     DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask))
8138                 return -ENOBUFS;
8139
8140         if (tcp->payload_seq.len &&
8141             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
8142                     sizeof(tcp->payload_seq), &tcp->payload_seq))
8143                 return -ENOBUFS;
8144
8145         if (tcp->payload_tok.len &&
8146             nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
8147                     sizeof(tcp->payload_tok) + tcp->tokens_size,
8148                     &tcp->payload_tok))
8149                 return -ENOBUFS;
8150
8151         nla_nest_end(msg, nl_tcp);
8152
8153         return 0;
8154 }
8155
8156 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
8157 {
8158         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8159         struct sk_buff *msg;
8160         void *hdr;
8161         u32 size = NLMSG_DEFAULT_SIZE;
8162
8163         if (!rdev->wiphy.wowlan)
8164                 return -EOPNOTSUPP;
8165
8166         if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) {
8167                 /* adjust size to have room for all the data */
8168                 size += rdev->wiphy.wowlan_config->tcp->tokens_size +
8169                         rdev->wiphy.wowlan_config->tcp->payload_len +
8170                         rdev->wiphy.wowlan_config->tcp->wake_len +
8171                         rdev->wiphy.wowlan_config->tcp->wake_len / 8;
8172         }
8173
8174         msg = nlmsg_new(size, GFP_KERNEL);
8175         if (!msg)
8176                 return -ENOMEM;
8177
8178         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8179                              NL80211_CMD_GET_WOWLAN);
8180         if (!hdr)
8181                 goto nla_put_failure;
8182
8183         if (rdev->wiphy.wowlan_config) {
8184                 struct nlattr *nl_wowlan;
8185
8186                 nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
8187                 if (!nl_wowlan)
8188                         goto nla_put_failure;
8189
8190                 if ((rdev->wiphy.wowlan_config->any &&
8191                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
8192                     (rdev->wiphy.wowlan_config->disconnect &&
8193                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
8194                     (rdev->wiphy.wowlan_config->magic_pkt &&
8195                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
8196                     (rdev->wiphy.wowlan_config->gtk_rekey_failure &&
8197                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
8198                     (rdev->wiphy.wowlan_config->eap_identity_req &&
8199                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
8200                     (rdev->wiphy.wowlan_config->four_way_handshake &&
8201                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
8202                     (rdev->wiphy.wowlan_config->rfkill_release &&
8203                      nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
8204                         goto nla_put_failure;
8205
8206                 if (nl80211_send_wowlan_patterns(msg, rdev))
8207                         goto nla_put_failure;
8208
8209                 if (nl80211_send_wowlan_tcp(msg,
8210                                             rdev->wiphy.wowlan_config->tcp))
8211                         goto nla_put_failure;
8212
8213                 nla_nest_end(msg, nl_wowlan);
8214         }
8215
8216         genlmsg_end(msg, hdr);
8217         return genlmsg_reply(msg, info);
8218
8219 nla_put_failure:
8220         nlmsg_free(msg);
8221         return -ENOBUFS;
8222 }
8223
8224 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev,
8225                                     struct nlattr *attr,
8226                                     struct cfg80211_wowlan *trig)
8227 {
8228         struct nlattr *tb[NUM_NL80211_WOWLAN_TCP];
8229         struct cfg80211_wowlan_tcp *cfg;
8230         struct nl80211_wowlan_tcp_data_token *tok = NULL;
8231         struct nl80211_wowlan_tcp_data_seq *seq = NULL;
8232         u32 size;
8233         u32 data_size, wake_size, tokens_size = 0, wake_mask_size;
8234         int err, port;
8235
8236         if (!rdev->wiphy.wowlan->tcp)
8237                 return -EINVAL;
8238
8239         err = nla_parse(tb, MAX_NL80211_WOWLAN_TCP,
8240                         nla_data(attr), nla_len(attr),
8241                         nl80211_wowlan_tcp_policy);
8242         if (err)
8243                 return err;
8244
8245         if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] ||
8246             !tb[NL80211_WOWLAN_TCP_DST_IPV4] ||
8247             !tb[NL80211_WOWLAN_TCP_DST_MAC] ||
8248             !tb[NL80211_WOWLAN_TCP_DST_PORT] ||
8249             !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] ||
8250             !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] ||
8251             !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] ||
8252             !tb[NL80211_WOWLAN_TCP_WAKE_MASK])
8253                 return -EINVAL;
8254
8255         data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]);
8256         if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max)
8257                 return -EINVAL;
8258
8259         if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) >
8260                         rdev->wiphy.wowlan->tcp->data_interval_max ||
8261             nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0)
8262                 return -EINVAL;
8263
8264         wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]);
8265         if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max)
8266                 return -EINVAL;
8267
8268         wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]);
8269         if (wake_mask_size != DIV_ROUND_UP(wake_size, 8))
8270                 return -EINVAL;
8271
8272         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) {
8273                 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
8274
8275                 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
8276                 tokens_size = tokln - sizeof(*tok);
8277
8278                 if (!tok->len || tokens_size % tok->len)
8279                         return -EINVAL;
8280                 if (!rdev->wiphy.wowlan->tcp->tok)
8281                         return -EINVAL;
8282                 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len)
8283                         return -EINVAL;
8284                 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len)
8285                         return -EINVAL;
8286                 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize)
8287                         return -EINVAL;
8288                 if (tok->offset + tok->len > data_size)
8289                         return -EINVAL;
8290         }
8291
8292         if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) {
8293                 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]);
8294                 if (!rdev->wiphy.wowlan->tcp->seq)
8295                         return -EINVAL;
8296                 if (seq->len == 0 || seq->len > 4)
8297                         return -EINVAL;
8298                 if (seq->len + seq->offset > data_size)
8299                         return -EINVAL;
8300         }
8301
8302         size = sizeof(*cfg);
8303         size += data_size;
8304         size += wake_size + wake_mask_size;
8305         size += tokens_size;
8306
8307         cfg = kzalloc(size, GFP_KERNEL);
8308         if (!cfg)
8309                 return -ENOMEM;
8310         cfg->src = nla_get_be32(tb[NL80211_WOWLAN_TCP_SRC_IPV4]);
8311         cfg->dst = nla_get_be32(tb[NL80211_WOWLAN_TCP_DST_IPV4]);
8312         memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]),
8313                ETH_ALEN);
8314         if (tb[NL80211_WOWLAN_TCP_SRC_PORT])
8315                 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]);
8316         else
8317                 port = 0;
8318 #ifdef CONFIG_INET
8319         /* allocate a socket and port for it and use it */
8320         err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM,
8321                             IPPROTO_TCP, &cfg->sock, 1);
8322         if (err) {
8323                 kfree(cfg);
8324                 return err;
8325         }
8326         if (inet_csk_get_port(cfg->sock->sk, port)) {
8327                 sock_release(cfg->sock);
8328                 kfree(cfg);
8329                 return -EADDRINUSE;
8330         }
8331         cfg->src_port = inet_sk(cfg->sock->sk)->inet_num;
8332 #else
8333         if (!port) {
8334                 kfree(cfg);
8335                 return -EINVAL;
8336         }
8337         cfg->src_port = port;
8338 #endif
8339
8340         cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]);
8341         cfg->payload_len = data_size;
8342         cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size;
8343         memcpy((void *)cfg->payload,
8344                nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]),
8345                data_size);
8346         if (seq)
8347                 cfg->payload_seq = *seq;
8348         cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]);
8349         cfg->wake_len = wake_size;
8350         cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size;
8351         memcpy((void *)cfg->wake_data,
8352                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]),
8353                wake_size);
8354         cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size +
8355                          data_size + wake_size;
8356         memcpy((void *)cfg->wake_mask,
8357                nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]),
8358                wake_mask_size);
8359         if (tok) {
8360                 cfg->tokens_size = tokens_size;
8361                 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size);
8362         }
8363
8364         trig->tcp = cfg;
8365
8366         return 0;
8367 }
8368
8369 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
8370 {
8371         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8372         struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG];
8373         struct cfg80211_wowlan new_triggers = {};
8374         struct cfg80211_wowlan *ntrig;
8375         const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan;
8376         int err, i;
8377         bool prev_enabled = rdev->wiphy.wowlan_config;
8378
8379         if (!wowlan)
8380                 return -EOPNOTSUPP;
8381
8382         if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) {
8383                 cfg80211_rdev_free_wowlan(rdev);
8384                 rdev->wiphy.wowlan_config = NULL;
8385                 goto set_wakeup;
8386         }
8387
8388         err = nla_parse(tb, MAX_NL80211_WOWLAN_TRIG,
8389                         nla_data(info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]),
8390                         nla_len(info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]),
8391                         nl80211_wowlan_policy);
8392         if (err)
8393                 return err;
8394
8395         if (tb[NL80211_WOWLAN_TRIG_ANY]) {
8396                 if (!(wowlan->flags & WIPHY_WOWLAN_ANY))
8397                         return -EINVAL;
8398                 new_triggers.any = true;
8399         }
8400
8401         if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) {
8402                 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT))
8403                         return -EINVAL;
8404                 new_triggers.disconnect = true;
8405         }
8406
8407         if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) {
8408                 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT))
8409                         return -EINVAL;
8410                 new_triggers.magic_pkt = true;
8411         }
8412
8413         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED])
8414                 return -EINVAL;
8415
8416         if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) {
8417                 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE))
8418                         return -EINVAL;
8419                 new_triggers.gtk_rekey_failure = true;
8420         }
8421
8422         if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) {
8423                 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ))
8424                         return -EINVAL;
8425                 new_triggers.eap_identity_req = true;
8426         }
8427
8428         if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) {
8429                 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE))
8430                         return -EINVAL;
8431                 new_triggers.four_way_handshake = true;
8432         }
8433
8434         if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) {
8435                 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE))
8436                         return -EINVAL;
8437                 new_triggers.rfkill_release = true;
8438         }
8439
8440         if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) {
8441                 struct nlattr *pat;
8442                 int n_patterns = 0;
8443                 int rem, pat_len, mask_len, pkt_offset;
8444                 struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
8445
8446                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
8447                                     rem)
8448                         n_patterns++;
8449                 if (n_patterns > wowlan->n_patterns)
8450                         return -EINVAL;
8451
8452                 new_triggers.patterns = kcalloc(n_patterns,
8453                                                 sizeof(new_triggers.patterns[0]),
8454                                                 GFP_KERNEL);
8455                 if (!new_triggers.patterns)
8456                         return -ENOMEM;
8457
8458                 new_triggers.n_patterns = n_patterns;
8459                 i = 0;
8460
8461                 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
8462                                     rem) {
8463                         nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat),
8464                                   nla_len(pat), NULL);
8465                         err = -EINVAL;
8466                         if (!pat_tb[NL80211_PKTPAT_MASK] ||
8467                             !pat_tb[NL80211_PKTPAT_PATTERN])
8468                                 goto error;
8469                         pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
8470                         mask_len = DIV_ROUND_UP(pat_len, 8);
8471                         if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
8472                                 goto error;
8473                         if (pat_len > wowlan->pattern_max_len ||
8474                             pat_len < wowlan->pattern_min_len)
8475                                 goto error;
8476
8477                         if (!pat_tb[NL80211_PKTPAT_OFFSET])
8478                                 pkt_offset = 0;
8479                         else
8480                                 pkt_offset = nla_get_u32(
8481                                         pat_tb[NL80211_PKTPAT_OFFSET]);
8482                         if (pkt_offset > wowlan->max_pkt_offset)
8483                                 goto error;
8484                         new_triggers.patterns[i].pkt_offset = pkt_offset;
8485
8486                         new_triggers.patterns[i].mask =
8487                                 kmalloc(mask_len + pat_len, GFP_KERNEL);
8488                         if (!new_triggers.patterns[i].mask) {
8489                                 err = -ENOMEM;
8490                                 goto error;
8491                         }
8492                         new_triggers.patterns[i].pattern =
8493                                 new_triggers.patterns[i].mask + mask_len;
8494                         memcpy(new_triggers.patterns[i].mask,
8495                                nla_data(pat_tb[NL80211_PKTPAT_MASK]),
8496                                mask_len);
8497                         new_triggers.patterns[i].pattern_len = pat_len;
8498                         memcpy(new_triggers.patterns[i].pattern,
8499                                nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
8500                                pat_len);
8501                         i++;
8502                 }
8503         }
8504
8505         if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) {
8506                 err = nl80211_parse_wowlan_tcp(
8507                         rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION],
8508                         &new_triggers);
8509                 if (err)
8510                         goto error;
8511         }
8512
8513         ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL);
8514         if (!ntrig) {
8515                 err = -ENOMEM;
8516                 goto error;
8517         }
8518         cfg80211_rdev_free_wowlan(rdev);
8519         rdev->wiphy.wowlan_config = ntrig;
8520
8521  set_wakeup:
8522         if (rdev->ops->set_wakeup &&
8523             prev_enabled != !!rdev->wiphy.wowlan_config)
8524                 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config);
8525
8526         return 0;
8527  error:
8528         for (i = 0; i < new_triggers.n_patterns; i++)
8529                 kfree(new_triggers.patterns[i].mask);
8530         kfree(new_triggers.patterns);
8531         if (new_triggers.tcp && new_triggers.tcp->sock)
8532                 sock_release(new_triggers.tcp->sock);
8533         kfree(new_triggers.tcp);
8534         return err;
8535 }
8536 #endif
8537
8538 static int nl80211_send_coalesce_rules(struct sk_buff *msg,
8539                                        struct cfg80211_registered_device *rdev)
8540 {
8541         struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules;
8542         int i, j, pat_len;
8543         struct cfg80211_coalesce_rules *rule;
8544
8545         if (!rdev->coalesce->n_rules)
8546                 return 0;
8547
8548         nl_rules = nla_nest_start(msg, NL80211_ATTR_COALESCE_RULE);
8549         if (!nl_rules)
8550                 return -ENOBUFS;
8551
8552         for (i = 0; i < rdev->coalesce->n_rules; i++) {
8553                 nl_rule = nla_nest_start(msg, i + 1);
8554                 if (!nl_rule)
8555                         return -ENOBUFS;
8556
8557                 rule = &rdev->coalesce->rules[i];
8558                 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY,
8559                                 rule->delay))
8560                         return -ENOBUFS;
8561
8562                 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION,
8563                                 rule->condition))
8564                         return -ENOBUFS;
8565
8566                 nl_pats = nla_nest_start(msg,
8567                                 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN);
8568                 if (!nl_pats)
8569                         return -ENOBUFS;
8570
8571                 for (j = 0; j < rule->n_patterns; j++) {
8572                         nl_pat = nla_nest_start(msg, j + 1);
8573                         if (!nl_pat)
8574                                 return -ENOBUFS;
8575                         pat_len = rule->patterns[j].pattern_len;
8576                         if (nla_put(msg, NL80211_PKTPAT_MASK,
8577                                     DIV_ROUND_UP(pat_len, 8),
8578                                     rule->patterns[j].mask) ||
8579                             nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
8580                                     rule->patterns[j].pattern) ||
8581                             nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
8582                                         rule->patterns[j].pkt_offset))
8583                                 return -ENOBUFS;
8584                         nla_nest_end(msg, nl_pat);
8585                 }
8586                 nla_nest_end(msg, nl_pats);
8587                 nla_nest_end(msg, nl_rule);
8588         }
8589         nla_nest_end(msg, nl_rules);
8590
8591         return 0;
8592 }
8593
8594 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info)
8595 {
8596         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8597         struct sk_buff *msg;
8598         void *hdr;
8599
8600         if (!rdev->wiphy.coalesce)
8601                 return -EOPNOTSUPP;
8602
8603         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
8604         if (!msg)
8605                 return -ENOMEM;
8606
8607         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8608                              NL80211_CMD_GET_COALESCE);
8609         if (!hdr)
8610                 goto nla_put_failure;
8611
8612         if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev))
8613                 goto nla_put_failure;
8614
8615         genlmsg_end(msg, hdr);
8616         return genlmsg_reply(msg, info);
8617
8618 nla_put_failure:
8619         nlmsg_free(msg);
8620         return -ENOBUFS;
8621 }
8622
8623 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev)
8624 {
8625         struct cfg80211_coalesce *coalesce = rdev->coalesce;
8626         int i, j;
8627         struct cfg80211_coalesce_rules *rule;
8628
8629         if (!coalesce)
8630                 return;
8631
8632         for (i = 0; i < coalesce->n_rules; i++) {
8633                 rule = &coalesce->rules[i];
8634                 for (j = 0; j < rule->n_patterns; j++)
8635                         kfree(rule->patterns[j].mask);
8636                 kfree(rule->patterns);
8637         }
8638         kfree(coalesce->rules);
8639         kfree(coalesce);
8640         rdev->coalesce = NULL;
8641 }
8642
8643 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,
8644                                        struct nlattr *rule,
8645                                        struct cfg80211_coalesce_rules *new_rule)
8646 {
8647         int err, i;
8648         const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
8649         struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat;
8650         int rem, pat_len, mask_len, pkt_offset, n_patterns = 0;
8651         struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
8652
8653         err = nla_parse(tb, NL80211_ATTR_COALESCE_RULE_MAX, nla_data(rule),
8654                         nla_len(rule), nl80211_coalesce_policy);
8655         if (err)
8656                 return err;
8657
8658         if (tb[NL80211_ATTR_COALESCE_RULE_DELAY])
8659                 new_rule->delay =
8660                         nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]);
8661         if (new_rule->delay > coalesce->max_delay)
8662                 return -EINVAL;
8663
8664         if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION])
8665                 new_rule->condition =
8666                         nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]);
8667         if (new_rule->condition != NL80211_COALESCE_CONDITION_MATCH &&
8668             new_rule->condition != NL80211_COALESCE_CONDITION_NO_MATCH)
8669                 return -EINVAL;
8670
8671         if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN])
8672                 return -EINVAL;
8673
8674         nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
8675                             rem)
8676                 n_patterns++;
8677         if (n_patterns > coalesce->n_patterns)
8678                 return -EINVAL;
8679
8680         new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]),
8681                                      GFP_KERNEL);
8682         if (!new_rule->patterns)
8683                 return -ENOMEM;
8684
8685         new_rule->n_patterns = n_patterns;
8686         i = 0;
8687
8688         nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
8689                             rem) {
8690                 nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat),
8691                           nla_len(pat), NULL);
8692                 if (!pat_tb[NL80211_PKTPAT_MASK] ||
8693                     !pat_tb[NL80211_PKTPAT_PATTERN])
8694                         return -EINVAL;
8695                 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
8696                 mask_len = DIV_ROUND_UP(pat_len, 8);
8697                 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
8698                         return -EINVAL;
8699                 if (pat_len > coalesce->pattern_max_len ||
8700                     pat_len < coalesce->pattern_min_len)
8701                         return -EINVAL;
8702
8703                 if (!pat_tb[NL80211_PKTPAT_OFFSET])
8704                         pkt_offset = 0;
8705                 else
8706                         pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]);
8707                 if (pkt_offset > coalesce->max_pkt_offset)
8708                         return -EINVAL;
8709                 new_rule->patterns[i].pkt_offset = pkt_offset;
8710
8711                 new_rule->patterns[i].mask =
8712                         kmalloc(mask_len + pat_len, GFP_KERNEL);
8713                 if (!new_rule->patterns[i].mask)
8714                         return -ENOMEM;
8715                 new_rule->patterns[i].pattern =
8716                         new_rule->patterns[i].mask + mask_len;
8717                 memcpy(new_rule->patterns[i].mask,
8718                        nla_data(pat_tb[NL80211_PKTPAT_MASK]), mask_len);
8719                 new_rule->patterns[i].pattern_len = pat_len;
8720                 memcpy(new_rule->patterns[i].pattern,
8721                        nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), pat_len);
8722                 i++;
8723         }
8724
8725         return 0;
8726 }
8727
8728 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info)
8729 {
8730         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8731         const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
8732         struct cfg80211_coalesce new_coalesce = {};
8733         struct cfg80211_coalesce *n_coalesce;
8734         int err, rem_rule, n_rules = 0, i, j;
8735         struct nlattr *rule;
8736         struct cfg80211_coalesce_rules *tmp_rule;
8737
8738         if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce)
8739                 return -EOPNOTSUPP;
8740
8741         if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) {
8742                 cfg80211_rdev_free_coalesce(rdev);
8743                 rdev->ops->set_coalesce(&rdev->wiphy, NULL);
8744                 return 0;
8745         }
8746
8747         nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
8748                             rem_rule)
8749                 n_rules++;
8750         if (n_rules > coalesce->n_rules)
8751                 return -EINVAL;
8752
8753         new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]),
8754                                      GFP_KERNEL);
8755         if (!new_coalesce.rules)
8756                 return -ENOMEM;
8757
8758         new_coalesce.n_rules = n_rules;
8759         i = 0;
8760
8761         nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
8762                             rem_rule) {
8763                 err = nl80211_parse_coalesce_rule(rdev, rule,
8764                                                   &new_coalesce.rules[i]);
8765                 if (err)
8766                         goto error;
8767
8768                 i++;
8769         }
8770
8771         err = rdev->ops->set_coalesce(&rdev->wiphy, &new_coalesce);
8772         if (err)
8773                 goto error;
8774
8775         n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL);
8776         if (!n_coalesce) {
8777                 err = -ENOMEM;
8778                 goto error;
8779         }
8780         cfg80211_rdev_free_coalesce(rdev);
8781         rdev->coalesce = n_coalesce;
8782
8783         return 0;
8784 error:
8785         for (i = 0; i < new_coalesce.n_rules; i++) {
8786                 tmp_rule = &new_coalesce.rules[i];
8787                 for (j = 0; j < tmp_rule->n_patterns; j++)
8788                         kfree(tmp_rule->patterns[j].mask);
8789                 kfree(tmp_rule->patterns);
8790         }
8791         kfree(new_coalesce.rules);
8792
8793         return err;
8794 }
8795
8796 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
8797 {
8798         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8799         struct net_device *dev = info->user_ptr[1];
8800         struct wireless_dev *wdev = dev->ieee80211_ptr;
8801         struct nlattr *tb[NUM_NL80211_REKEY_DATA];
8802         struct cfg80211_gtk_rekey_data rekey_data;
8803         int err;
8804
8805         if (!info->attrs[NL80211_ATTR_REKEY_DATA])
8806                 return -EINVAL;
8807
8808         err = nla_parse(tb, MAX_NL80211_REKEY_DATA,
8809                         nla_data(info->attrs[NL80211_ATTR_REKEY_DATA]),
8810                         nla_len(info->attrs[NL80211_ATTR_REKEY_DATA]),
8811                         nl80211_rekey_policy);
8812         if (err)
8813                 return err;
8814
8815         if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN)
8816                 return -ERANGE;
8817         if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN)
8818                 return -ERANGE;
8819         if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN)
8820                 return -ERANGE;
8821
8822         memcpy(rekey_data.kek, nla_data(tb[NL80211_REKEY_DATA_KEK]),
8823                NL80211_KEK_LEN);
8824         memcpy(rekey_data.kck, nla_data(tb[NL80211_REKEY_DATA_KCK]),
8825                NL80211_KCK_LEN);
8826         memcpy(rekey_data.replay_ctr,
8827                nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]),
8828                NL80211_REPLAY_CTR_LEN);
8829
8830         wdev_lock(wdev);
8831         if (!wdev->current_bss) {
8832                 err = -ENOTCONN;
8833                 goto out;
8834         }
8835
8836         if (!rdev->ops->set_rekey_data) {
8837                 err = -EOPNOTSUPP;
8838                 goto out;
8839         }
8840
8841         err = rdev_set_rekey_data(rdev, dev, &rekey_data);
8842  out:
8843         wdev_unlock(wdev);
8844         return err;
8845 }
8846
8847 static int nl80211_register_unexpected_frame(struct sk_buff *skb,
8848                                              struct genl_info *info)
8849 {
8850         struct net_device *dev = info->user_ptr[1];
8851         struct wireless_dev *wdev = dev->ieee80211_ptr;
8852
8853         if (wdev->iftype != NL80211_IFTYPE_AP &&
8854             wdev->iftype != NL80211_IFTYPE_P2P_GO)
8855                 return -EINVAL;
8856
8857         if (wdev->ap_unexpected_nlportid)
8858                 return -EBUSY;
8859
8860         wdev->ap_unexpected_nlportid = info->snd_portid;
8861         return 0;
8862 }
8863
8864 static int nl80211_probe_client(struct sk_buff *skb,
8865                                 struct genl_info *info)
8866 {
8867         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8868         struct net_device *dev = info->user_ptr[1];
8869         struct wireless_dev *wdev = dev->ieee80211_ptr;
8870         struct sk_buff *msg;
8871         void *hdr;
8872         const u8 *addr;
8873         u64 cookie;
8874         int err;
8875
8876         if (wdev->iftype != NL80211_IFTYPE_AP &&
8877             wdev->iftype != NL80211_IFTYPE_P2P_GO)
8878                 return -EOPNOTSUPP;
8879
8880         if (!info->attrs[NL80211_ATTR_MAC])
8881                 return -EINVAL;
8882
8883         if (!rdev->ops->probe_client)
8884                 return -EOPNOTSUPP;
8885
8886         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
8887         if (!msg)
8888                 return -ENOMEM;
8889
8890         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8891                              NL80211_CMD_PROBE_CLIENT);
8892         if (!hdr) {
8893                 err = -ENOBUFS;
8894                 goto free_msg;
8895         }
8896
8897         addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
8898
8899         err = rdev_probe_client(rdev, dev, addr, &cookie);
8900         if (err)
8901                 goto free_msg;
8902
8903         if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
8904                 goto nla_put_failure;
8905
8906         genlmsg_end(msg, hdr);
8907
8908         return genlmsg_reply(msg, info);
8909
8910  nla_put_failure:
8911         err = -ENOBUFS;
8912  free_msg:
8913         nlmsg_free(msg);
8914         return err;
8915 }
8916
8917 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info)
8918 {
8919         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8920         struct cfg80211_beacon_registration *reg, *nreg;
8921         int rv;
8922
8923         if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS))
8924                 return -EOPNOTSUPP;
8925
8926         nreg = kzalloc(sizeof(*nreg), GFP_KERNEL);
8927         if (!nreg)
8928                 return -ENOMEM;
8929
8930         /* First, check if already registered. */
8931         spin_lock_bh(&rdev->beacon_registrations_lock);
8932         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
8933                 if (reg->nlportid == info->snd_portid) {
8934                         rv = -EALREADY;
8935                         goto out_err;
8936                 }
8937         }
8938         /* Add it to the list */
8939         nreg->nlportid = info->snd_portid;
8940         list_add(&nreg->list, &rdev->beacon_registrations);
8941
8942         spin_unlock_bh(&rdev->beacon_registrations_lock);
8943
8944         return 0;
8945 out_err:
8946         spin_unlock_bh(&rdev->beacon_registrations_lock);
8947         kfree(nreg);
8948         return rv;
8949 }
8950
8951 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
8952 {
8953         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8954         struct wireless_dev *wdev = info->user_ptr[1];
8955         int err;
8956
8957         if (!rdev->ops->start_p2p_device)
8958                 return -EOPNOTSUPP;
8959
8960         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
8961                 return -EOPNOTSUPP;
8962
8963         if (wdev->p2p_started)
8964                 return 0;
8965
8966         err = cfg80211_can_add_interface(rdev, wdev->iftype);
8967         if (err)
8968                 return err;
8969
8970         err = rdev_start_p2p_device(rdev, wdev);
8971         if (err)
8972                 return err;
8973
8974         wdev->p2p_started = true;
8975         rdev->opencount++;
8976
8977         return 0;
8978 }
8979
8980 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info)
8981 {
8982         struct cfg80211_registered_device *rdev = info->user_ptr[0];
8983         struct wireless_dev *wdev = info->user_ptr[1];
8984
8985         if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
8986                 return -EOPNOTSUPP;
8987
8988         if (!rdev->ops->stop_p2p_device)
8989                 return -EOPNOTSUPP;
8990
8991         cfg80211_stop_p2p_device(rdev, wdev);
8992
8993         return 0;
8994 }
8995
8996 static int nl80211_get_protocol_features(struct sk_buff *skb,
8997                                          struct genl_info *info)
8998 {
8999         void *hdr;
9000         struct sk_buff *msg;
9001
9002         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
9003         if (!msg)
9004                 return -ENOMEM;
9005
9006         hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
9007                              NL80211_CMD_GET_PROTOCOL_FEATURES);
9008         if (!hdr)
9009                 goto nla_put_failure;
9010
9011         if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES,
9012                         NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP))
9013                 goto nla_put_failure;
9014
9015         genlmsg_end(msg, hdr);
9016         return genlmsg_reply(msg, info);
9017
9018  nla_put_failure:
9019         kfree_skb(msg);
9020         return -ENOBUFS;
9021 }
9022
9023 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info)
9024 {
9025         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9026         struct cfg80211_update_ft_ies_params ft_params;
9027         struct net_device *dev = info->user_ptr[1];
9028
9029         if (!rdev->ops->update_ft_ies)
9030                 return -EOPNOTSUPP;
9031
9032         if (!info->attrs[NL80211_ATTR_MDID] ||
9033             !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
9034                 return -EINVAL;
9035
9036         memset(&ft_params, 0, sizeof(ft_params));
9037         ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]);
9038         ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
9039         ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9040
9041         return rdev_update_ft_ies(rdev, dev, &ft_params);
9042 }
9043
9044 static int nl80211_crit_protocol_start(struct sk_buff *skb,
9045                                        struct genl_info *info)
9046 {
9047         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9048         struct wireless_dev *wdev = info->user_ptr[1];
9049         enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC;
9050         u16 duration;
9051         int ret;
9052
9053         if (!rdev->ops->crit_proto_start)
9054                 return -EOPNOTSUPP;
9055
9056         if (WARN_ON(!rdev->ops->crit_proto_stop))
9057                 return -EINVAL;
9058
9059         if (rdev->crit_proto_nlportid)
9060                 return -EBUSY;
9061
9062         /* determine protocol if provided */
9063         if (info->attrs[NL80211_ATTR_CRIT_PROT_ID])
9064                 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]);
9065
9066         if (proto >= NUM_NL80211_CRIT_PROTO)
9067                 return -EINVAL;
9068
9069         /* timeout must be provided */
9070         if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION])
9071                 return -EINVAL;
9072
9073         duration =
9074                 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
9075
9076         if (duration > NL80211_CRIT_PROTO_MAX_DURATION)
9077                 return -ERANGE;
9078
9079         ret = rdev_crit_proto_start(rdev, wdev, proto, duration);
9080         if (!ret)
9081                 rdev->crit_proto_nlportid = info->snd_portid;
9082
9083         return ret;
9084 }
9085
9086 static int nl80211_crit_protocol_stop(struct sk_buff *skb,
9087                                       struct genl_info *info)
9088 {
9089         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9090         struct wireless_dev *wdev = info->user_ptr[1];
9091
9092         if (!rdev->ops->crit_proto_stop)
9093                 return -EOPNOTSUPP;
9094
9095         if (rdev->crit_proto_nlportid) {
9096                 rdev->crit_proto_nlportid = 0;
9097                 rdev_crit_proto_stop(rdev, wdev);
9098         }
9099         return 0;
9100 }
9101
9102 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
9103 {
9104         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9105         struct wireless_dev *wdev =
9106                 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
9107         int i, err;
9108         u32 vid, subcmd;
9109
9110         if (!rdev->wiphy.vendor_commands)
9111                 return -EOPNOTSUPP;
9112
9113         if (IS_ERR(wdev)) {
9114                 err = PTR_ERR(wdev);
9115                 if (err != -EINVAL)
9116                         return err;
9117                 wdev = NULL;
9118         } else if (wdev->wiphy != &rdev->wiphy) {
9119                 return -EINVAL;
9120         }
9121
9122         if (!info->attrs[NL80211_ATTR_VENDOR_ID] ||
9123             !info->attrs[NL80211_ATTR_VENDOR_SUBCMD])
9124                 return -EINVAL;
9125
9126         vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]);
9127         subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]);
9128         for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
9129                 const struct wiphy_vendor_command *vcmd;
9130                 void *data = NULL;
9131                 int len = 0;
9132
9133                 vcmd = &rdev->wiphy.vendor_commands[i];
9134
9135                 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
9136                         continue;
9137
9138                 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
9139                                    WIPHY_VENDOR_CMD_NEED_NETDEV)) {
9140                         if (!wdev)
9141                                 return -EINVAL;
9142                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
9143                             !wdev->netdev)
9144                                 return -EINVAL;
9145
9146                         if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
9147                                 if (wdev->netdev &&
9148                                     !netif_running(wdev->netdev))
9149                                         return -ENETDOWN;
9150                                 if (!wdev->netdev && !wdev->p2p_started)
9151                                         return -ENETDOWN;
9152                         }
9153                 } else {
9154                         wdev = NULL;
9155                 }
9156
9157                 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
9158                         data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
9159                         len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
9160                 }
9161
9162                 rdev->cur_cmd_info = info;
9163                 err = rdev->wiphy.vendor_commands[i].doit(&rdev->wiphy, wdev,
9164                                                           data, len);
9165                 rdev->cur_cmd_info = NULL;
9166                 return err;
9167         }
9168
9169         return -EOPNOTSUPP;
9170 }
9171
9172 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
9173                                            enum nl80211_commands cmd,
9174                                            enum nl80211_attrs attr,
9175                                            int approxlen)
9176 {
9177         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9178
9179         if (WARN_ON(!rdev->cur_cmd_info))
9180                 return NULL;
9181
9182         return __cfg80211_alloc_vendor_skb(rdev, approxlen,
9183                                            rdev->cur_cmd_info->snd_portid,
9184                                            rdev->cur_cmd_info->snd_seq,
9185                                            cmd, attr, NULL, GFP_KERNEL);
9186 }
9187 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb);
9188
9189 int cfg80211_vendor_cmd_reply(struct sk_buff *skb)
9190 {
9191         struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
9192         void *hdr = ((void **)skb->cb)[1];
9193         struct nlattr *data = ((void **)skb->cb)[2];
9194
9195         if (WARN_ON(!rdev->cur_cmd_info)) {
9196                 kfree_skb(skb);
9197                 return -EINVAL;
9198         }
9199
9200         nla_nest_end(skb, data);
9201         genlmsg_end(skb, hdr);
9202         return genlmsg_reply(skb, rdev->cur_cmd_info);
9203 }
9204 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply);
9205
9206
9207 static int nl80211_set_qos_map(struct sk_buff *skb,
9208                                struct genl_info *info)
9209 {
9210         struct cfg80211_registered_device *rdev = info->user_ptr[0];
9211         struct cfg80211_qos_map *qos_map = NULL;
9212         struct net_device *dev = info->user_ptr[1];
9213         u8 *pos, len, num_des, des_len, des;
9214         int ret;
9215
9216         if (!rdev->ops->set_qos_map)
9217                 return -EOPNOTSUPP;
9218
9219         if (info->attrs[NL80211_ATTR_QOS_MAP]) {
9220                 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]);
9221                 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]);
9222
9223                 if (len % 2 || len < IEEE80211_QOS_MAP_LEN_MIN ||
9224                     len > IEEE80211_QOS_MAP_LEN_MAX)
9225                         return -EINVAL;
9226
9227                 qos_map = kzalloc(sizeof(struct cfg80211_qos_map), GFP_KERNEL);
9228                 if (!qos_map)
9229                         return -ENOMEM;
9230
9231                 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1;
9232                 if (num_des) {
9233                         des_len = num_des *
9234                                 sizeof(struct cfg80211_dscp_exception);
9235                         memcpy(qos_map->dscp_exception, pos, des_len);
9236                         qos_map->num_des = num_des;
9237                         for (des = 0; des < num_des; des++) {
9238                                 if (qos_map->dscp_exception[des].up > 7) {
9239                                         kfree(qos_map);
9240                                         return -EINVAL;
9241                                 }
9242                         }
9243                         pos += des_len;
9244                 }
9245                 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN);
9246         }
9247
9248         wdev_lock(dev->ieee80211_ptr);
9249         ret = nl80211_key_allowed(dev->ieee80211_ptr);
9250         if (!ret)
9251                 ret = rdev_set_qos_map(rdev, dev, qos_map);
9252         wdev_unlock(dev->ieee80211_ptr);
9253
9254         kfree(qos_map);
9255         return ret;
9256 }
9257
9258 #define NL80211_FLAG_NEED_WIPHY         0x01
9259 #define NL80211_FLAG_NEED_NETDEV        0x02
9260 #define NL80211_FLAG_NEED_RTNL          0x04
9261 #define NL80211_FLAG_CHECK_NETDEV_UP    0x08
9262 #define NL80211_FLAG_NEED_NETDEV_UP     (NL80211_FLAG_NEED_NETDEV |\
9263                                          NL80211_FLAG_CHECK_NETDEV_UP)
9264 #define NL80211_FLAG_NEED_WDEV          0x10
9265 /* If a netdev is associated, it must be UP, P2P must be started */
9266 #define NL80211_FLAG_NEED_WDEV_UP       (NL80211_FLAG_NEED_WDEV |\
9267                                          NL80211_FLAG_CHECK_NETDEV_UP)
9268
9269 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
9270                             struct genl_info *info)
9271 {
9272         struct cfg80211_registered_device *rdev;
9273         struct wireless_dev *wdev;
9274         struct net_device *dev;
9275         bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL;
9276
9277         if (rtnl)
9278                 rtnl_lock();
9279
9280         if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) {
9281                 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
9282                 if (IS_ERR(rdev)) {
9283                         if (rtnl)
9284                                 rtnl_unlock();
9285                         return PTR_ERR(rdev);
9286                 }
9287                 info->user_ptr[0] = rdev;
9288         } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV ||
9289                    ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
9290                 ASSERT_RTNL();
9291
9292                 wdev = __cfg80211_wdev_from_attrs(genl_info_net(info),
9293                                                   info->attrs);
9294                 if (IS_ERR(wdev)) {
9295                         if (rtnl)
9296                                 rtnl_unlock();
9297                         return PTR_ERR(wdev);
9298                 }
9299
9300                 dev = wdev->netdev;
9301                 rdev = wiphy_to_dev(wdev->wiphy);
9302
9303                 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) {
9304                         if (!dev) {
9305                                 if (rtnl)
9306                                         rtnl_unlock();
9307                                 return -EINVAL;
9308                         }
9309
9310                         info->user_ptr[1] = dev;
9311                 } else {
9312                         info->user_ptr[1] = wdev;
9313                 }
9314
9315                 if (dev) {
9316                         if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
9317                             !netif_running(dev)) {
9318                                 if (rtnl)
9319                                         rtnl_unlock();
9320                                 return -ENETDOWN;
9321                         }
9322
9323                         dev_hold(dev);
9324                 } else if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP) {
9325                         if (!wdev->p2p_started) {
9326                                 if (rtnl)
9327                                         rtnl_unlock();
9328                                 return -ENETDOWN;
9329                         }
9330                 }
9331
9332                 info->user_ptr[0] = rdev;
9333         }
9334
9335         return 0;
9336 }
9337
9338 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
9339                               struct genl_info *info)
9340 {
9341         if (info->user_ptr[1]) {
9342                 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
9343                         struct wireless_dev *wdev = info->user_ptr[1];
9344
9345                         if (wdev->netdev)
9346                                 dev_put(wdev->netdev);
9347                 } else {
9348                         dev_put(info->user_ptr[1]);
9349                 }
9350         }
9351         if (ops->internal_flags & NL80211_FLAG_NEED_RTNL)
9352                 rtnl_unlock();
9353 }
9354
9355 static const struct genl_ops nl80211_ops[] = {
9356         {
9357                 .cmd = NL80211_CMD_GET_WIPHY,
9358                 .doit = nl80211_get_wiphy,
9359                 .dumpit = nl80211_dump_wiphy,
9360                 .done = nl80211_dump_wiphy_done,
9361                 .policy = nl80211_policy,
9362                 /* can be retrieved by unprivileged users */
9363                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9364                                   NL80211_FLAG_NEED_RTNL,
9365         },
9366         {
9367                 .cmd = NL80211_CMD_SET_WIPHY,
9368                 .doit = nl80211_set_wiphy,
9369                 .policy = nl80211_policy,
9370                 .flags = GENL_ADMIN_PERM,
9371                 .internal_flags = NL80211_FLAG_NEED_RTNL,
9372         },
9373         {
9374                 .cmd = NL80211_CMD_GET_INTERFACE,
9375                 .doit = nl80211_get_interface,
9376                 .dumpit = nl80211_dump_interface,
9377                 .policy = nl80211_policy,
9378                 /* can be retrieved by unprivileged users */
9379                 .internal_flags = NL80211_FLAG_NEED_WDEV |
9380                                   NL80211_FLAG_NEED_RTNL,
9381         },
9382         {
9383                 .cmd = NL80211_CMD_SET_INTERFACE,
9384                 .doit = nl80211_set_interface,
9385                 .policy = nl80211_policy,
9386                 .flags = GENL_ADMIN_PERM,
9387                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9388                                   NL80211_FLAG_NEED_RTNL,
9389         },
9390         {
9391                 .cmd = NL80211_CMD_NEW_INTERFACE,
9392                 .doit = nl80211_new_interface,
9393                 .policy = nl80211_policy,
9394                 .flags = GENL_ADMIN_PERM,
9395                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9396                                   NL80211_FLAG_NEED_RTNL,
9397         },
9398         {
9399                 .cmd = NL80211_CMD_DEL_INTERFACE,
9400                 .doit = nl80211_del_interface,
9401                 .policy = nl80211_policy,
9402                 .flags = GENL_ADMIN_PERM,
9403                 .internal_flags = NL80211_FLAG_NEED_WDEV |
9404                                   NL80211_FLAG_NEED_RTNL,
9405         },
9406         {
9407                 .cmd = NL80211_CMD_GET_KEY,
9408                 .doit = nl80211_get_key,
9409                 .policy = nl80211_policy,
9410                 .flags = GENL_ADMIN_PERM,
9411                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9412                                   NL80211_FLAG_NEED_RTNL,
9413         },
9414         {
9415                 .cmd = NL80211_CMD_SET_KEY,
9416                 .doit = nl80211_set_key,
9417                 .policy = nl80211_policy,
9418                 .flags = GENL_ADMIN_PERM,
9419                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9420                                   NL80211_FLAG_NEED_RTNL,
9421         },
9422         {
9423                 .cmd = NL80211_CMD_NEW_KEY,
9424                 .doit = nl80211_new_key,
9425                 .policy = nl80211_policy,
9426                 .flags = GENL_ADMIN_PERM,
9427                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9428                                   NL80211_FLAG_NEED_RTNL,
9429         },
9430         {
9431                 .cmd = NL80211_CMD_DEL_KEY,
9432                 .doit = nl80211_del_key,
9433                 .policy = nl80211_policy,
9434                 .flags = GENL_ADMIN_PERM,
9435                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9436                                   NL80211_FLAG_NEED_RTNL,
9437         },
9438         {
9439                 .cmd = NL80211_CMD_SET_BEACON,
9440                 .policy = nl80211_policy,
9441                 .flags = GENL_ADMIN_PERM,
9442                 .doit = nl80211_set_beacon,
9443                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9444                                   NL80211_FLAG_NEED_RTNL,
9445         },
9446         {
9447                 .cmd = NL80211_CMD_START_AP,
9448                 .policy = nl80211_policy,
9449                 .flags = GENL_ADMIN_PERM,
9450                 .doit = nl80211_start_ap,
9451                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9452                                   NL80211_FLAG_NEED_RTNL,
9453         },
9454         {
9455                 .cmd = NL80211_CMD_STOP_AP,
9456                 .policy = nl80211_policy,
9457                 .flags = GENL_ADMIN_PERM,
9458                 .doit = nl80211_stop_ap,
9459                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9460                                   NL80211_FLAG_NEED_RTNL,
9461         },
9462         {
9463                 .cmd = NL80211_CMD_GET_STATION,
9464                 .doit = nl80211_get_station,
9465                 .dumpit = nl80211_dump_station,
9466                 .policy = nl80211_policy,
9467                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9468                                   NL80211_FLAG_NEED_RTNL,
9469         },
9470         {
9471                 .cmd = NL80211_CMD_SET_STATION,
9472                 .doit = nl80211_set_station,
9473                 .policy = nl80211_policy,
9474                 .flags = GENL_ADMIN_PERM,
9475                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9476                                   NL80211_FLAG_NEED_RTNL,
9477         },
9478         {
9479                 .cmd = NL80211_CMD_NEW_STATION,
9480                 .doit = nl80211_new_station,
9481                 .policy = nl80211_policy,
9482                 .flags = GENL_ADMIN_PERM,
9483                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9484                                   NL80211_FLAG_NEED_RTNL,
9485         },
9486         {
9487                 .cmd = NL80211_CMD_DEL_STATION,
9488                 .doit = nl80211_del_station,
9489                 .policy = nl80211_policy,
9490                 .flags = GENL_ADMIN_PERM,
9491                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9492                                   NL80211_FLAG_NEED_RTNL,
9493         },
9494         {
9495                 .cmd = NL80211_CMD_GET_MPATH,
9496                 .doit = nl80211_get_mpath,
9497                 .dumpit = nl80211_dump_mpath,
9498                 .policy = nl80211_policy,
9499                 .flags = GENL_ADMIN_PERM,
9500                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9501                                   NL80211_FLAG_NEED_RTNL,
9502         },
9503         {
9504                 .cmd = NL80211_CMD_SET_MPATH,
9505                 .doit = nl80211_set_mpath,
9506                 .policy = nl80211_policy,
9507                 .flags = GENL_ADMIN_PERM,
9508                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9509                                   NL80211_FLAG_NEED_RTNL,
9510         },
9511         {
9512                 .cmd = NL80211_CMD_NEW_MPATH,
9513                 .doit = nl80211_new_mpath,
9514                 .policy = nl80211_policy,
9515                 .flags = GENL_ADMIN_PERM,
9516                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9517                                   NL80211_FLAG_NEED_RTNL,
9518         },
9519         {
9520                 .cmd = NL80211_CMD_DEL_MPATH,
9521                 .doit = nl80211_del_mpath,
9522                 .policy = nl80211_policy,
9523                 .flags = GENL_ADMIN_PERM,
9524                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9525                                   NL80211_FLAG_NEED_RTNL,
9526         },
9527         {
9528                 .cmd = NL80211_CMD_SET_BSS,
9529                 .doit = nl80211_set_bss,
9530                 .policy = nl80211_policy,
9531                 .flags = GENL_ADMIN_PERM,
9532                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9533                                   NL80211_FLAG_NEED_RTNL,
9534         },
9535         {
9536                 .cmd = NL80211_CMD_GET_REG,
9537                 .doit = nl80211_get_reg,
9538                 .policy = nl80211_policy,
9539                 .internal_flags = NL80211_FLAG_NEED_RTNL,
9540                 /* can be retrieved by unprivileged users */
9541         },
9542         {
9543                 .cmd = NL80211_CMD_SET_REG,
9544                 .doit = nl80211_set_reg,
9545                 .policy = nl80211_policy,
9546                 .flags = GENL_ADMIN_PERM,
9547                 .internal_flags = NL80211_FLAG_NEED_RTNL,
9548         },
9549         {
9550                 .cmd = NL80211_CMD_REQ_SET_REG,
9551                 .doit = nl80211_req_set_reg,
9552                 .policy = nl80211_policy,
9553                 .flags = GENL_ADMIN_PERM,
9554         },
9555         {
9556                 .cmd = NL80211_CMD_GET_MESH_CONFIG,
9557                 .doit = nl80211_get_mesh_config,
9558                 .policy = nl80211_policy,
9559                 /* can be retrieved by unprivileged users */
9560                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9561                                   NL80211_FLAG_NEED_RTNL,
9562         },
9563         {
9564                 .cmd = NL80211_CMD_SET_MESH_CONFIG,
9565                 .doit = nl80211_update_mesh_config,
9566                 .policy = nl80211_policy,
9567                 .flags = GENL_ADMIN_PERM,
9568                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9569                                   NL80211_FLAG_NEED_RTNL,
9570         },
9571         {
9572                 .cmd = NL80211_CMD_TRIGGER_SCAN,
9573                 .doit = nl80211_trigger_scan,
9574                 .policy = nl80211_policy,
9575                 .flags = GENL_ADMIN_PERM,
9576                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9577                                   NL80211_FLAG_NEED_RTNL,
9578         },
9579         {
9580                 .cmd = NL80211_CMD_GET_SCAN,
9581                 .policy = nl80211_policy,
9582                 .dumpit = nl80211_dump_scan,
9583         },
9584         {
9585                 .cmd = NL80211_CMD_START_SCHED_SCAN,
9586                 .doit = nl80211_start_sched_scan,
9587                 .policy = nl80211_policy,
9588                 .flags = GENL_ADMIN_PERM,
9589                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9590                                   NL80211_FLAG_NEED_RTNL,
9591         },
9592         {
9593                 .cmd = NL80211_CMD_STOP_SCHED_SCAN,
9594                 .doit = nl80211_stop_sched_scan,
9595                 .policy = nl80211_policy,
9596                 .flags = GENL_ADMIN_PERM,
9597                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9598                                   NL80211_FLAG_NEED_RTNL,
9599         },
9600         {
9601                 .cmd = NL80211_CMD_AUTHENTICATE,
9602                 .doit = nl80211_authenticate,
9603                 .policy = nl80211_policy,
9604                 .flags = GENL_ADMIN_PERM,
9605                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9606                                   NL80211_FLAG_NEED_RTNL,
9607         },
9608         {
9609                 .cmd = NL80211_CMD_ASSOCIATE,
9610                 .doit = nl80211_associate,
9611                 .policy = nl80211_policy,
9612                 .flags = GENL_ADMIN_PERM,
9613                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9614                                   NL80211_FLAG_NEED_RTNL,
9615         },
9616         {
9617                 .cmd = NL80211_CMD_DEAUTHENTICATE,
9618                 .doit = nl80211_deauthenticate,
9619                 .policy = nl80211_policy,
9620                 .flags = GENL_ADMIN_PERM,
9621                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9622                                   NL80211_FLAG_NEED_RTNL,
9623         },
9624         {
9625                 .cmd = NL80211_CMD_DISASSOCIATE,
9626                 .doit = nl80211_disassociate,
9627                 .policy = nl80211_policy,
9628                 .flags = GENL_ADMIN_PERM,
9629                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9630                                   NL80211_FLAG_NEED_RTNL,
9631         },
9632         {
9633                 .cmd = NL80211_CMD_JOIN_IBSS,
9634                 .doit = nl80211_join_ibss,
9635                 .policy = nl80211_policy,
9636                 .flags = GENL_ADMIN_PERM,
9637                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9638                                   NL80211_FLAG_NEED_RTNL,
9639         },
9640         {
9641                 .cmd = NL80211_CMD_LEAVE_IBSS,
9642                 .doit = nl80211_leave_ibss,
9643                 .policy = nl80211_policy,
9644                 .flags = GENL_ADMIN_PERM,
9645                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9646                                   NL80211_FLAG_NEED_RTNL,
9647         },
9648 #ifdef CONFIG_NL80211_TESTMODE
9649         {
9650                 .cmd = NL80211_CMD_TESTMODE,
9651                 .doit = nl80211_testmode_do,
9652                 .dumpit = nl80211_testmode_dump,
9653                 .policy = nl80211_policy,
9654                 .flags = GENL_ADMIN_PERM,
9655                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9656                                   NL80211_FLAG_NEED_RTNL,
9657         },
9658 #endif
9659         {
9660                 .cmd = NL80211_CMD_CONNECT,
9661                 .doit = nl80211_connect,
9662                 .policy = nl80211_policy,
9663                 .flags = GENL_ADMIN_PERM,
9664                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9665                                   NL80211_FLAG_NEED_RTNL,
9666         },
9667         {
9668                 .cmd = NL80211_CMD_DISCONNECT,
9669                 .doit = nl80211_disconnect,
9670                 .policy = nl80211_policy,
9671                 .flags = GENL_ADMIN_PERM,
9672                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9673                                   NL80211_FLAG_NEED_RTNL,
9674         },
9675         {
9676                 .cmd = NL80211_CMD_SET_WIPHY_NETNS,
9677                 .doit = nl80211_wiphy_netns,
9678                 .policy = nl80211_policy,
9679                 .flags = GENL_ADMIN_PERM,
9680                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9681                                   NL80211_FLAG_NEED_RTNL,
9682         },
9683         {
9684                 .cmd = NL80211_CMD_GET_SURVEY,
9685                 .policy = nl80211_policy,
9686                 .dumpit = nl80211_dump_survey,
9687         },
9688         {
9689                 .cmd = NL80211_CMD_SET_PMKSA,
9690                 .doit = nl80211_setdel_pmksa,
9691                 .policy = nl80211_policy,
9692                 .flags = GENL_ADMIN_PERM,
9693                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9694                                   NL80211_FLAG_NEED_RTNL,
9695         },
9696         {
9697                 .cmd = NL80211_CMD_DEL_PMKSA,
9698                 .doit = nl80211_setdel_pmksa,
9699                 .policy = nl80211_policy,
9700                 .flags = GENL_ADMIN_PERM,
9701                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9702                                   NL80211_FLAG_NEED_RTNL,
9703         },
9704         {
9705                 .cmd = NL80211_CMD_FLUSH_PMKSA,
9706                 .doit = nl80211_flush_pmksa,
9707                 .policy = nl80211_policy,
9708                 .flags = GENL_ADMIN_PERM,
9709                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9710                                   NL80211_FLAG_NEED_RTNL,
9711         },
9712         {
9713                 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
9714                 .doit = nl80211_remain_on_channel,
9715                 .policy = nl80211_policy,
9716                 .flags = GENL_ADMIN_PERM,
9717                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9718                                   NL80211_FLAG_NEED_RTNL,
9719         },
9720         {
9721                 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
9722                 .doit = nl80211_cancel_remain_on_channel,
9723                 .policy = nl80211_policy,
9724                 .flags = GENL_ADMIN_PERM,
9725                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9726                                   NL80211_FLAG_NEED_RTNL,
9727         },
9728         {
9729                 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
9730                 .doit = nl80211_set_tx_bitrate_mask,
9731                 .policy = nl80211_policy,
9732                 .flags = GENL_ADMIN_PERM,
9733                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9734                                   NL80211_FLAG_NEED_RTNL,
9735         },
9736         {
9737                 .cmd = NL80211_CMD_REGISTER_FRAME,
9738                 .doit = nl80211_register_mgmt,
9739                 .policy = nl80211_policy,
9740                 .flags = GENL_ADMIN_PERM,
9741                 .internal_flags = NL80211_FLAG_NEED_WDEV |
9742                                   NL80211_FLAG_NEED_RTNL,
9743         },
9744         {
9745                 .cmd = NL80211_CMD_FRAME,
9746                 .doit = nl80211_tx_mgmt,
9747                 .policy = nl80211_policy,
9748                 .flags = GENL_ADMIN_PERM,
9749                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9750                                   NL80211_FLAG_NEED_RTNL,
9751         },
9752         {
9753                 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
9754                 .doit = nl80211_tx_mgmt_cancel_wait,
9755                 .policy = nl80211_policy,
9756                 .flags = GENL_ADMIN_PERM,
9757                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9758                                   NL80211_FLAG_NEED_RTNL,
9759         },
9760         {
9761                 .cmd = NL80211_CMD_SET_POWER_SAVE,
9762                 .doit = nl80211_set_power_save,
9763                 .policy = nl80211_policy,
9764                 .flags = GENL_ADMIN_PERM,
9765                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9766                                   NL80211_FLAG_NEED_RTNL,
9767         },
9768         {
9769                 .cmd = NL80211_CMD_GET_POWER_SAVE,
9770                 .doit = nl80211_get_power_save,
9771                 .policy = nl80211_policy,
9772                 /* can be retrieved by unprivileged users */
9773                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9774                                   NL80211_FLAG_NEED_RTNL,
9775         },
9776         {
9777                 .cmd = NL80211_CMD_SET_CQM,
9778                 .doit = nl80211_set_cqm,
9779                 .policy = nl80211_policy,
9780                 .flags = GENL_ADMIN_PERM,
9781                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9782                                   NL80211_FLAG_NEED_RTNL,
9783         },
9784         {
9785                 .cmd = NL80211_CMD_SET_CHANNEL,
9786                 .doit = nl80211_set_channel,
9787                 .policy = nl80211_policy,
9788                 .flags = GENL_ADMIN_PERM,
9789                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9790                                   NL80211_FLAG_NEED_RTNL,
9791         },
9792         {
9793                 .cmd = NL80211_CMD_SET_WDS_PEER,
9794                 .doit = nl80211_set_wds_peer,
9795                 .policy = nl80211_policy,
9796                 .flags = GENL_ADMIN_PERM,
9797                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9798                                   NL80211_FLAG_NEED_RTNL,
9799         },
9800         {
9801                 .cmd = NL80211_CMD_JOIN_MESH,
9802                 .doit = nl80211_join_mesh,
9803                 .policy = nl80211_policy,
9804                 .flags = GENL_ADMIN_PERM,
9805                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9806                                   NL80211_FLAG_NEED_RTNL,
9807         },
9808         {
9809                 .cmd = NL80211_CMD_LEAVE_MESH,
9810                 .doit = nl80211_leave_mesh,
9811                 .policy = nl80211_policy,
9812                 .flags = GENL_ADMIN_PERM,
9813                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9814                                   NL80211_FLAG_NEED_RTNL,
9815         },
9816 #ifdef CONFIG_PM
9817         {
9818                 .cmd = NL80211_CMD_GET_WOWLAN,
9819                 .doit = nl80211_get_wowlan,
9820                 .policy = nl80211_policy,
9821                 /* can be retrieved by unprivileged users */
9822                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9823                                   NL80211_FLAG_NEED_RTNL,
9824         },
9825         {
9826                 .cmd = NL80211_CMD_SET_WOWLAN,
9827                 .doit = nl80211_set_wowlan,
9828                 .policy = nl80211_policy,
9829                 .flags = GENL_ADMIN_PERM,
9830                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9831                                   NL80211_FLAG_NEED_RTNL,
9832         },
9833 #endif
9834         {
9835                 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
9836                 .doit = nl80211_set_rekey_data,
9837                 .policy = nl80211_policy,
9838                 .flags = GENL_ADMIN_PERM,
9839                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9840                                   NL80211_FLAG_NEED_RTNL,
9841         },
9842         {
9843                 .cmd = NL80211_CMD_TDLS_MGMT,
9844                 .doit = nl80211_tdls_mgmt,
9845                 .policy = nl80211_policy,
9846                 .flags = GENL_ADMIN_PERM,
9847                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9848                                   NL80211_FLAG_NEED_RTNL,
9849         },
9850         {
9851                 .cmd = NL80211_CMD_TDLS_OPER,
9852                 .doit = nl80211_tdls_oper,
9853                 .policy = nl80211_policy,
9854                 .flags = GENL_ADMIN_PERM,
9855                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9856                                   NL80211_FLAG_NEED_RTNL,
9857         },
9858         {
9859                 .cmd = NL80211_CMD_UNEXPECTED_FRAME,
9860                 .doit = nl80211_register_unexpected_frame,
9861                 .policy = nl80211_policy,
9862                 .flags = GENL_ADMIN_PERM,
9863                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9864                                   NL80211_FLAG_NEED_RTNL,
9865         },
9866         {
9867                 .cmd = NL80211_CMD_PROBE_CLIENT,
9868                 .doit = nl80211_probe_client,
9869                 .policy = nl80211_policy,
9870                 .flags = GENL_ADMIN_PERM,
9871                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9872                                   NL80211_FLAG_NEED_RTNL,
9873         },
9874         {
9875                 .cmd = NL80211_CMD_REGISTER_BEACONS,
9876                 .doit = nl80211_register_beacons,
9877                 .policy = nl80211_policy,
9878                 .flags = GENL_ADMIN_PERM,
9879                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9880                                   NL80211_FLAG_NEED_RTNL,
9881         },
9882         {
9883                 .cmd = NL80211_CMD_SET_NOACK_MAP,
9884                 .doit = nl80211_set_noack_map,
9885                 .policy = nl80211_policy,
9886                 .flags = GENL_ADMIN_PERM,
9887                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9888                                   NL80211_FLAG_NEED_RTNL,
9889         },
9890         {
9891                 .cmd = NL80211_CMD_START_P2P_DEVICE,
9892                 .doit = nl80211_start_p2p_device,
9893                 .policy = nl80211_policy,
9894                 .flags = GENL_ADMIN_PERM,
9895                 .internal_flags = NL80211_FLAG_NEED_WDEV |
9896                                   NL80211_FLAG_NEED_RTNL,
9897         },
9898         {
9899                 .cmd = NL80211_CMD_STOP_P2P_DEVICE,
9900                 .doit = nl80211_stop_p2p_device,
9901                 .policy = nl80211_policy,
9902                 .flags = GENL_ADMIN_PERM,
9903                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9904                                   NL80211_FLAG_NEED_RTNL,
9905         },
9906         {
9907                 .cmd = NL80211_CMD_SET_MCAST_RATE,
9908                 .doit = nl80211_set_mcast_rate,
9909                 .policy = nl80211_policy,
9910                 .flags = GENL_ADMIN_PERM,
9911                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9912                                   NL80211_FLAG_NEED_RTNL,
9913         },
9914         {
9915                 .cmd = NL80211_CMD_SET_MAC_ACL,
9916                 .doit = nl80211_set_mac_acl,
9917                 .policy = nl80211_policy,
9918                 .flags = GENL_ADMIN_PERM,
9919                 .internal_flags = NL80211_FLAG_NEED_NETDEV |
9920                                   NL80211_FLAG_NEED_RTNL,
9921         },
9922         {
9923                 .cmd = NL80211_CMD_RADAR_DETECT,
9924                 .doit = nl80211_start_radar_detection,
9925                 .policy = nl80211_policy,
9926                 .flags = GENL_ADMIN_PERM,
9927                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9928                                   NL80211_FLAG_NEED_RTNL,
9929         },
9930         {
9931                 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
9932                 .doit = nl80211_get_protocol_features,
9933                 .policy = nl80211_policy,
9934         },
9935         {
9936                 .cmd = NL80211_CMD_UPDATE_FT_IES,
9937                 .doit = nl80211_update_ft_ies,
9938                 .policy = nl80211_policy,
9939                 .flags = GENL_ADMIN_PERM,
9940                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9941                                   NL80211_FLAG_NEED_RTNL,
9942         },
9943         {
9944                 .cmd = NL80211_CMD_CRIT_PROTOCOL_START,
9945                 .doit = nl80211_crit_protocol_start,
9946                 .policy = nl80211_policy,
9947                 .flags = GENL_ADMIN_PERM,
9948                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9949                                   NL80211_FLAG_NEED_RTNL,
9950         },
9951         {
9952                 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
9953                 .doit = nl80211_crit_protocol_stop,
9954                 .policy = nl80211_policy,
9955                 .flags = GENL_ADMIN_PERM,
9956                 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
9957                                   NL80211_FLAG_NEED_RTNL,
9958         },
9959         {
9960                 .cmd = NL80211_CMD_GET_COALESCE,
9961                 .doit = nl80211_get_coalesce,
9962                 .policy = nl80211_policy,
9963                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9964                                   NL80211_FLAG_NEED_RTNL,
9965         },
9966         {
9967                 .cmd = NL80211_CMD_SET_COALESCE,
9968                 .doit = nl80211_set_coalesce,
9969                 .policy = nl80211_policy,
9970                 .flags = GENL_ADMIN_PERM,
9971                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9972                                   NL80211_FLAG_NEED_RTNL,
9973         },
9974         {
9975                 .cmd = NL80211_CMD_CHANNEL_SWITCH,
9976                 .doit = nl80211_channel_switch,
9977                 .policy = nl80211_policy,
9978                 .flags = GENL_ADMIN_PERM,
9979                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9980                                   NL80211_FLAG_NEED_RTNL,
9981         },
9982         {
9983                 .cmd = NL80211_CMD_VENDOR,
9984                 .doit = nl80211_vendor_cmd,
9985                 .policy = nl80211_policy,
9986                 .flags = GENL_ADMIN_PERM,
9987                 .internal_flags = NL80211_FLAG_NEED_WIPHY |
9988                                   NL80211_FLAG_NEED_RTNL,
9989         },
9990         {
9991                 .cmd = NL80211_CMD_SET_QOS_MAP,
9992                 .doit = nl80211_set_qos_map,
9993                 .policy = nl80211_policy,
9994                 .flags = GENL_ADMIN_PERM,
9995                 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
9996                                   NL80211_FLAG_NEED_RTNL,
9997         },
9998 };
9999
10000 /* notification functions */
10001
10002 void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev)
10003 {
10004         struct sk_buff *msg;
10005         struct nl80211_dump_wiphy_state state = {};
10006
10007         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10008         if (!msg)
10009                 return;
10010
10011         if (nl80211_send_wiphy(rdev, msg, 0, 0, 0, &state) < 0) {
10012                 nlmsg_free(msg);
10013                 return;
10014         }
10015
10016         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10017                                 NL80211_MCGRP_CONFIG, GFP_KERNEL);
10018 }
10019
10020 static int nl80211_add_scan_req(struct sk_buff *msg,
10021                                 struct cfg80211_registered_device *rdev)
10022 {
10023         struct cfg80211_scan_request *req = rdev->scan_req;
10024         struct nlattr *nest;
10025         int i;
10026
10027         if (WARN_ON(!req))
10028                 return 0;
10029
10030         nest = nla_nest_start(msg, NL80211_ATTR_SCAN_SSIDS);
10031         if (!nest)
10032                 goto nla_put_failure;
10033         for (i = 0; i < req->n_ssids; i++) {
10034                 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid))
10035                         goto nla_put_failure;
10036         }
10037         nla_nest_end(msg, nest);
10038
10039         nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
10040         if (!nest)
10041                 goto nla_put_failure;
10042         for (i = 0; i < req->n_channels; i++) {
10043                 if (nla_put_u32(msg, i, req->channels[i]->center_freq))
10044                         goto nla_put_failure;
10045         }
10046         nla_nest_end(msg, nest);
10047
10048         if (req->ie &&
10049             nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie))
10050                 goto nla_put_failure;
10051
10052         if (req->flags &&
10053             nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags))
10054                 goto nla_put_failure;
10055
10056         return 0;
10057  nla_put_failure:
10058         return -ENOBUFS;
10059 }
10060
10061 static int nl80211_send_scan_msg(struct sk_buff *msg,
10062                                  struct cfg80211_registered_device *rdev,
10063                                  struct wireless_dev *wdev,
10064                                  u32 portid, u32 seq, int flags,
10065                                  u32 cmd)
10066 {
10067         void *hdr;
10068
10069         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
10070         if (!hdr)
10071                 return -1;
10072
10073         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10074             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
10075                                          wdev->netdev->ifindex)) ||
10076             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
10077                 goto nla_put_failure;
10078
10079         /* ignore errors and send incomplete event anyway */
10080         nl80211_add_scan_req(msg, rdev);
10081
10082         return genlmsg_end(msg, hdr);
10083
10084  nla_put_failure:
10085         genlmsg_cancel(msg, hdr);
10086         return -EMSGSIZE;
10087 }
10088
10089 static int
10090 nl80211_send_sched_scan_msg(struct sk_buff *msg,
10091                             struct cfg80211_registered_device *rdev,
10092                             struct net_device *netdev,
10093                             u32 portid, u32 seq, int flags, u32 cmd)
10094 {
10095         void *hdr;
10096
10097         hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
10098         if (!hdr)
10099                 return -1;
10100
10101         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10102             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
10103                 goto nla_put_failure;
10104
10105         return genlmsg_end(msg, hdr);
10106
10107  nla_put_failure:
10108         genlmsg_cancel(msg, hdr);
10109         return -EMSGSIZE;
10110 }
10111
10112 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
10113                              struct wireless_dev *wdev)
10114 {
10115         struct sk_buff *msg;
10116
10117         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10118         if (!msg)
10119                 return;
10120
10121         if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
10122                                   NL80211_CMD_TRIGGER_SCAN) < 0) {
10123                 nlmsg_free(msg);
10124                 return;
10125         }
10126
10127         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10128                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
10129 }
10130
10131 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
10132                                        struct wireless_dev *wdev, bool aborted)
10133 {
10134         struct sk_buff *msg;
10135
10136         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10137         if (!msg)
10138                 return NULL;
10139
10140         if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
10141                                   aborted ? NL80211_CMD_SCAN_ABORTED :
10142                                             NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
10143                 nlmsg_free(msg);
10144                 return NULL;
10145         }
10146
10147         return msg;
10148 }
10149
10150 void nl80211_send_scan_result(struct cfg80211_registered_device *rdev,
10151                               struct sk_buff *msg)
10152 {
10153         if (!msg)
10154                 return;
10155
10156         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10157                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
10158 }
10159
10160 void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev,
10161                                      struct net_device *netdev)
10162 {
10163         struct sk_buff *msg;
10164
10165         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10166         if (!msg)
10167                 return;
10168
10169         if (nl80211_send_sched_scan_msg(msg, rdev, netdev, 0, 0, 0,
10170                                         NL80211_CMD_SCHED_SCAN_RESULTS) < 0) {
10171                 nlmsg_free(msg);
10172                 return;
10173         }
10174
10175         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10176                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
10177 }
10178
10179 void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
10180                              struct net_device *netdev, u32 cmd)
10181 {
10182         struct sk_buff *msg;
10183
10184         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10185         if (!msg)
10186                 return;
10187
10188         if (nl80211_send_sched_scan_msg(msg, rdev, netdev, 0, 0, 0, cmd) < 0) {
10189                 nlmsg_free(msg);
10190                 return;
10191         }
10192
10193         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10194                                 NL80211_MCGRP_SCAN, GFP_KERNEL);
10195 }
10196
10197 /*
10198  * This can happen on global regulatory changes or device specific settings
10199  * based on custom world regulatory domains.
10200  */
10201 void nl80211_send_reg_change_event(struct regulatory_request *request)
10202 {
10203         struct sk_buff *msg;
10204         void *hdr;
10205
10206         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10207         if (!msg)
10208                 return;
10209
10210         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_CHANGE);
10211         if (!hdr) {
10212                 nlmsg_free(msg);
10213                 return;
10214         }
10215
10216         /* Userspace can always count this one always being set */
10217         if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator))
10218                 goto nla_put_failure;
10219
10220         if (request->alpha2[0] == '0' && request->alpha2[1] == '0') {
10221                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
10222                                NL80211_REGDOM_TYPE_WORLD))
10223                         goto nla_put_failure;
10224         } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') {
10225                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
10226                                NL80211_REGDOM_TYPE_CUSTOM_WORLD))
10227                         goto nla_put_failure;
10228         } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
10229                    request->intersect) {
10230                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
10231                                NL80211_REGDOM_TYPE_INTERSECTION))
10232                         goto nla_put_failure;
10233         } else {
10234                 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
10235                                NL80211_REGDOM_TYPE_COUNTRY) ||
10236                     nla_put_string(msg, NL80211_ATTR_REG_ALPHA2,
10237                                    request->alpha2))
10238                         goto nla_put_failure;
10239         }
10240
10241         if (request->wiphy_idx != WIPHY_IDX_INVALID &&
10242             nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx))
10243                 goto nla_put_failure;
10244
10245         genlmsg_end(msg, hdr);
10246
10247         rcu_read_lock();
10248         genlmsg_multicast_allns(&nl80211_fam, msg, 0,
10249                                 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
10250         rcu_read_unlock();
10251
10252         return;
10253
10254 nla_put_failure:
10255         genlmsg_cancel(msg, hdr);
10256         nlmsg_free(msg);
10257 }
10258
10259 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
10260                                     struct net_device *netdev,
10261                                     const u8 *buf, size_t len,
10262                                     enum nl80211_commands cmd, gfp_t gfp)
10263 {
10264         struct sk_buff *msg;
10265         void *hdr;
10266
10267         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10268         if (!msg)
10269                 return;
10270
10271         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
10272         if (!hdr) {
10273                 nlmsg_free(msg);
10274                 return;
10275         }
10276
10277         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10278             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10279             nla_put(msg, NL80211_ATTR_FRAME, len, buf))
10280                 goto nla_put_failure;
10281
10282         genlmsg_end(msg, hdr);
10283
10284         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10285                                 NL80211_MCGRP_MLME, gfp);
10286         return;
10287
10288  nla_put_failure:
10289         genlmsg_cancel(msg, hdr);
10290         nlmsg_free(msg);
10291 }
10292
10293 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
10294                           struct net_device *netdev, const u8 *buf,
10295                           size_t len, gfp_t gfp)
10296 {
10297         nl80211_send_mlme_event(rdev, netdev, buf, len,
10298                                 NL80211_CMD_AUTHENTICATE, gfp);
10299 }
10300
10301 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
10302                            struct net_device *netdev, const u8 *buf,
10303                            size_t len, gfp_t gfp)
10304 {
10305         nl80211_send_mlme_event(rdev, netdev, buf, len,
10306                                 NL80211_CMD_ASSOCIATE, gfp);
10307 }
10308
10309 void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
10310                          struct net_device *netdev, const u8 *buf,
10311                          size_t len, gfp_t gfp)
10312 {
10313         nl80211_send_mlme_event(rdev, netdev, buf, len,
10314                                 NL80211_CMD_DEAUTHENTICATE, gfp);
10315 }
10316
10317 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
10318                            struct net_device *netdev, const u8 *buf,
10319                            size_t len, gfp_t gfp)
10320 {
10321         nl80211_send_mlme_event(rdev, netdev, buf, len,
10322                                 NL80211_CMD_DISASSOCIATE, gfp);
10323 }
10324
10325 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
10326                                   size_t len)
10327 {
10328         struct wireless_dev *wdev = dev->ieee80211_ptr;
10329         struct wiphy *wiphy = wdev->wiphy;
10330         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10331         const struct ieee80211_mgmt *mgmt = (void *)buf;
10332         u32 cmd;
10333
10334         if (WARN_ON(len < 2))
10335                 return;
10336
10337         if (ieee80211_is_deauth(mgmt->frame_control))
10338                 cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE;
10339         else
10340                 cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
10341
10342         trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
10343         nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC);
10344 }
10345 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
10346
10347 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
10348                                       struct net_device *netdev, int cmd,
10349                                       const u8 *addr, gfp_t gfp)
10350 {
10351         struct sk_buff *msg;
10352         void *hdr;
10353
10354         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10355         if (!msg)
10356                 return;
10357
10358         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
10359         if (!hdr) {
10360                 nlmsg_free(msg);
10361                 return;
10362         }
10363
10364         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10365             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10366             nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
10367             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
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);
10374         return;
10375
10376  nla_put_failure:
10377         genlmsg_cancel(msg, hdr);
10378         nlmsg_free(msg);
10379 }
10380
10381 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
10382                                struct net_device *netdev, const u8 *addr,
10383                                gfp_t gfp)
10384 {
10385         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
10386                                   addr, gfp);
10387 }
10388
10389 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
10390                                 struct net_device *netdev, const u8 *addr,
10391                                 gfp_t gfp)
10392 {
10393         nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
10394                                   addr, gfp);
10395 }
10396
10397 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
10398                                  struct net_device *netdev, const u8 *bssid,
10399                                  const u8 *req_ie, size_t req_ie_len,
10400                                  const u8 *resp_ie, size_t resp_ie_len,
10401                                  u16 status, gfp_t gfp)
10402 {
10403         struct sk_buff *msg;
10404         void *hdr;
10405
10406         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10407         if (!msg)
10408                 return;
10409
10410         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
10411         if (!hdr) {
10412                 nlmsg_free(msg);
10413                 return;
10414         }
10415
10416         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10417             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10418             (bssid && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) ||
10419             nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, status) ||
10420             (req_ie &&
10421              nla_put(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie)) ||
10422             (resp_ie &&
10423              nla_put(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie)))
10424                 goto nla_put_failure;
10425
10426         genlmsg_end(msg, hdr);
10427
10428         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10429                                 NL80211_MCGRP_MLME, gfp);
10430         return;
10431
10432  nla_put_failure:
10433         genlmsg_cancel(msg, hdr);
10434         nlmsg_free(msg);
10435
10436 }
10437
10438 void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
10439                          struct net_device *netdev, const u8 *bssid,
10440                          const u8 *req_ie, size_t req_ie_len,
10441                          const u8 *resp_ie, size_t resp_ie_len, gfp_t gfp)
10442 {
10443         struct sk_buff *msg;
10444         void *hdr;
10445
10446         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10447         if (!msg)
10448                 return;
10449
10450         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
10451         if (!hdr) {
10452                 nlmsg_free(msg);
10453                 return;
10454         }
10455
10456         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10457             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10458             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) ||
10459             (req_ie &&
10460              nla_put(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie)) ||
10461             (resp_ie &&
10462              nla_put(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie)))
10463                 goto nla_put_failure;
10464
10465         genlmsg_end(msg, hdr);
10466
10467         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10468                                 NL80211_MCGRP_MLME, gfp);
10469         return;
10470
10471  nla_put_failure:
10472         genlmsg_cancel(msg, hdr);
10473         nlmsg_free(msg);
10474
10475 }
10476
10477 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
10478                                struct net_device *netdev, u16 reason,
10479                                const u8 *ie, size_t ie_len, bool from_ap)
10480 {
10481         struct sk_buff *msg;
10482         void *hdr;
10483
10484         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10485         if (!msg)
10486                 return;
10487
10488         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
10489         if (!hdr) {
10490                 nlmsg_free(msg);
10491                 return;
10492         }
10493
10494         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10495             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10496             (from_ap && reason &&
10497              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) ||
10498             (from_ap &&
10499              nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) ||
10500             (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie)))
10501                 goto nla_put_failure;
10502
10503         genlmsg_end(msg, hdr);
10504
10505         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10506                                 NL80211_MCGRP_MLME, GFP_KERNEL);
10507         return;
10508
10509  nla_put_failure:
10510         genlmsg_cancel(msg, hdr);
10511         nlmsg_free(msg);
10512
10513 }
10514
10515 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
10516                              struct net_device *netdev, const u8 *bssid,
10517                              gfp_t gfp)
10518 {
10519         struct sk_buff *msg;
10520         void *hdr;
10521
10522         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10523         if (!msg)
10524                 return;
10525
10526         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
10527         if (!hdr) {
10528                 nlmsg_free(msg);
10529                 return;
10530         }
10531
10532         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10533             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10534             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
10535                 goto nla_put_failure;
10536
10537         genlmsg_end(msg, hdr);
10538
10539         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10540                                 NL80211_MCGRP_MLME, gfp);
10541         return;
10542
10543  nla_put_failure:
10544         genlmsg_cancel(msg, hdr);
10545         nlmsg_free(msg);
10546 }
10547
10548 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
10549                                         const u8* ie, u8 ie_len, gfp_t gfp)
10550 {
10551         struct wireless_dev *wdev = dev->ieee80211_ptr;
10552         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
10553         struct sk_buff *msg;
10554         void *hdr;
10555
10556         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
10557                 return;
10558
10559         trace_cfg80211_notify_new_peer_candidate(dev, addr);
10560
10561         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10562         if (!msg)
10563                 return;
10564
10565         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
10566         if (!hdr) {
10567                 nlmsg_free(msg);
10568                 return;
10569         }
10570
10571         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10572             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10573             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
10574             (ie_len && ie &&
10575              nla_put(msg, NL80211_ATTR_IE, ie_len , ie)))
10576                 goto nla_put_failure;
10577
10578         genlmsg_end(msg, hdr);
10579
10580         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10581                                 NL80211_MCGRP_MLME, gfp);
10582         return;
10583
10584  nla_put_failure:
10585         genlmsg_cancel(msg, hdr);
10586         nlmsg_free(msg);
10587 }
10588 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
10589
10590 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
10591                                  struct net_device *netdev, const u8 *addr,
10592                                  enum nl80211_key_type key_type, int key_id,
10593                                  const u8 *tsc, gfp_t gfp)
10594 {
10595         struct sk_buff *msg;
10596         void *hdr;
10597
10598         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10599         if (!msg)
10600                 return;
10601
10602         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
10603         if (!hdr) {
10604                 nlmsg_free(msg);
10605                 return;
10606         }
10607
10608         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10609             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
10610             (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) ||
10611             nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) ||
10612             (key_id != -1 &&
10613              nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) ||
10614             (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc)))
10615                 goto nla_put_failure;
10616
10617         genlmsg_end(msg, hdr);
10618
10619         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10620                                 NL80211_MCGRP_MLME, gfp);
10621         return;
10622
10623  nla_put_failure:
10624         genlmsg_cancel(msg, hdr);
10625         nlmsg_free(msg);
10626 }
10627
10628 void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
10629                                     struct ieee80211_channel *channel_before,
10630                                     struct ieee80211_channel *channel_after)
10631 {
10632         struct sk_buff *msg;
10633         void *hdr;
10634         struct nlattr *nl_freq;
10635
10636         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
10637         if (!msg)
10638                 return;
10639
10640         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
10641         if (!hdr) {
10642                 nlmsg_free(msg);
10643                 return;
10644         }
10645
10646         /*
10647          * Since we are applying the beacon hint to a wiphy we know its
10648          * wiphy_idx is valid
10649          */
10650         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
10651                 goto nla_put_failure;
10652
10653         /* Before */
10654         nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_BEFORE);
10655         if (!nl_freq)
10656                 goto nla_put_failure;
10657         if (nl80211_msg_put_channel(msg, channel_before, false))
10658                 goto nla_put_failure;
10659         nla_nest_end(msg, nl_freq);
10660
10661         /* After */
10662         nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_AFTER);
10663         if (!nl_freq)
10664                 goto nla_put_failure;
10665         if (nl80211_msg_put_channel(msg, channel_after, false))
10666                 goto nla_put_failure;
10667         nla_nest_end(msg, nl_freq);
10668
10669         genlmsg_end(msg, hdr);
10670
10671         rcu_read_lock();
10672         genlmsg_multicast_allns(&nl80211_fam, msg, 0,
10673                                 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
10674         rcu_read_unlock();
10675
10676         return;
10677
10678 nla_put_failure:
10679         genlmsg_cancel(msg, hdr);
10680         nlmsg_free(msg);
10681 }
10682
10683 static void nl80211_send_remain_on_chan_event(
10684         int cmd, struct cfg80211_registered_device *rdev,
10685         struct wireless_dev *wdev, u64 cookie,
10686         struct ieee80211_channel *chan,
10687         unsigned int duration, gfp_t gfp)
10688 {
10689         struct sk_buff *msg;
10690         void *hdr;
10691
10692         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10693         if (!msg)
10694                 return;
10695
10696         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
10697         if (!hdr) {
10698                 nlmsg_free(msg);
10699                 return;
10700         }
10701
10702         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10703             (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
10704                                          wdev->netdev->ifindex)) ||
10705             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
10706             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) ||
10707             nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
10708                         NL80211_CHAN_NO_HT) ||
10709             nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
10710                 goto nla_put_failure;
10711
10712         if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL &&
10713             nla_put_u32(msg, NL80211_ATTR_DURATION, duration))
10714                 goto nla_put_failure;
10715
10716         genlmsg_end(msg, hdr);
10717
10718         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10719                                 NL80211_MCGRP_MLME, gfp);
10720         return;
10721
10722  nla_put_failure:
10723         genlmsg_cancel(msg, hdr);
10724         nlmsg_free(msg);
10725 }
10726
10727 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
10728                                struct ieee80211_channel *chan,
10729                                unsigned int duration, gfp_t gfp)
10730 {
10731         struct wiphy *wiphy = wdev->wiphy;
10732         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10733
10734         trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
10735         nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
10736                                           rdev, wdev, cookie, chan,
10737                                           duration, gfp);
10738 }
10739 EXPORT_SYMBOL(cfg80211_ready_on_channel);
10740
10741 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
10742                                         struct ieee80211_channel *chan,
10743                                         gfp_t gfp)
10744 {
10745         struct wiphy *wiphy = wdev->wiphy;
10746         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10747
10748         trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
10749         nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
10750                                           rdev, wdev, cookie, chan, 0, gfp);
10751 }
10752 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
10753
10754 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
10755                       struct station_info *sinfo, gfp_t gfp)
10756 {
10757         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
10758         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10759         struct sk_buff *msg;
10760
10761         trace_cfg80211_new_sta(dev, mac_addr, sinfo);
10762
10763         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10764         if (!msg)
10765                 return;
10766
10767         if (nl80211_send_station(msg, 0, 0, 0,
10768                                  rdev, dev, mac_addr, sinfo) < 0) {
10769                 nlmsg_free(msg);
10770                 return;
10771         }
10772
10773         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10774                                 NL80211_MCGRP_MLME, gfp);
10775 }
10776 EXPORT_SYMBOL(cfg80211_new_sta);
10777
10778 void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp)
10779 {
10780         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
10781         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10782         struct sk_buff *msg;
10783         void *hdr;
10784
10785         trace_cfg80211_del_sta(dev, mac_addr);
10786
10787         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10788         if (!msg)
10789                 return;
10790
10791         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_STATION);
10792         if (!hdr) {
10793                 nlmsg_free(msg);
10794                 return;
10795         }
10796
10797         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10798             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
10799                 goto nla_put_failure;
10800
10801         genlmsg_end(msg, hdr);
10802
10803         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10804                                 NL80211_MCGRP_MLME, gfp);
10805         return;
10806
10807  nla_put_failure:
10808         genlmsg_cancel(msg, hdr);
10809         nlmsg_free(msg);
10810 }
10811 EXPORT_SYMBOL(cfg80211_del_sta);
10812
10813 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
10814                           enum nl80211_connect_failed_reason reason,
10815                           gfp_t gfp)
10816 {
10817         struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
10818         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10819         struct sk_buff *msg;
10820         void *hdr;
10821
10822         msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
10823         if (!msg)
10824                 return;
10825
10826         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
10827         if (!hdr) {
10828                 nlmsg_free(msg);
10829                 return;
10830         }
10831
10832         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10833             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
10834             nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
10835                 goto nla_put_failure;
10836
10837         genlmsg_end(msg, hdr);
10838
10839         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10840                                 NL80211_MCGRP_MLME, gfp);
10841         return;
10842
10843  nla_put_failure:
10844         genlmsg_cancel(msg, hdr);
10845         nlmsg_free(msg);
10846 }
10847 EXPORT_SYMBOL(cfg80211_conn_failed);
10848
10849 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
10850                                        const u8 *addr, gfp_t gfp)
10851 {
10852         struct wireless_dev *wdev = dev->ieee80211_ptr;
10853         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
10854         struct sk_buff *msg;
10855         void *hdr;
10856         u32 nlportid = ACCESS_ONCE(wdev->ap_unexpected_nlportid);
10857
10858         if (!nlportid)
10859                 return false;
10860
10861         msg = nlmsg_new(100, gfp);
10862         if (!msg)
10863                 return true;
10864
10865         hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
10866         if (!hdr) {
10867                 nlmsg_free(msg);
10868                 return true;
10869         }
10870
10871         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10872             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10873             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
10874                 goto nla_put_failure;
10875
10876         genlmsg_end(msg, hdr);
10877         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
10878         return true;
10879
10880  nla_put_failure:
10881         genlmsg_cancel(msg, hdr);
10882         nlmsg_free(msg);
10883         return true;
10884 }
10885
10886 bool cfg80211_rx_spurious_frame(struct net_device *dev,
10887                                 const u8 *addr, gfp_t gfp)
10888 {
10889         struct wireless_dev *wdev = dev->ieee80211_ptr;
10890         bool ret;
10891
10892         trace_cfg80211_rx_spurious_frame(dev, addr);
10893
10894         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
10895                     wdev->iftype != NL80211_IFTYPE_P2P_GO)) {
10896                 trace_cfg80211_return_bool(false);
10897                 return false;
10898         }
10899         ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME,
10900                                          addr, gfp);
10901         trace_cfg80211_return_bool(ret);
10902         return ret;
10903 }
10904 EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
10905
10906 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
10907                                         const u8 *addr, gfp_t gfp)
10908 {
10909         struct wireless_dev *wdev = dev->ieee80211_ptr;
10910         bool ret;
10911
10912         trace_cfg80211_rx_unexpected_4addr_frame(dev, addr);
10913
10914         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
10915                     wdev->iftype != NL80211_IFTYPE_P2P_GO &&
10916                     wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
10917                 trace_cfg80211_return_bool(false);
10918                 return false;
10919         }
10920         ret = __nl80211_unexpected_frame(dev,
10921                                          NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
10922                                          addr, gfp);
10923         trace_cfg80211_return_bool(ret);
10924         return ret;
10925 }
10926 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
10927
10928 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
10929                       struct wireless_dev *wdev, u32 nlportid,
10930                       int freq, int sig_dbm,
10931                       const u8 *buf, size_t len, u32 flags, gfp_t gfp)
10932 {
10933         struct net_device *netdev = wdev->netdev;
10934         struct sk_buff *msg;
10935         void *hdr;
10936
10937         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10938         if (!msg)
10939                 return -ENOMEM;
10940
10941         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
10942         if (!hdr) {
10943                 nlmsg_free(msg);
10944                 return -ENOMEM;
10945         }
10946
10947         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10948             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
10949                                         netdev->ifindex)) ||
10950             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
10951             nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
10952             (sig_dbm &&
10953              nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
10954             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
10955             (flags &&
10956              nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags)))
10957                 goto nla_put_failure;
10958
10959         genlmsg_end(msg, hdr);
10960
10961         return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
10962
10963  nla_put_failure:
10964         genlmsg_cancel(msg, hdr);
10965         nlmsg_free(msg);
10966         return -ENOBUFS;
10967 }
10968
10969 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
10970                              const u8 *buf, size_t len, bool ack, gfp_t gfp)
10971 {
10972         struct wiphy *wiphy = wdev->wiphy;
10973         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10974         struct net_device *netdev = wdev->netdev;
10975         struct sk_buff *msg;
10976         void *hdr;
10977
10978         trace_cfg80211_mgmt_tx_status(wdev, cookie, ack);
10979
10980         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10981         if (!msg)
10982                 return;
10983
10984         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS);
10985         if (!hdr) {
10986                 nlmsg_free(msg);
10987                 return;
10988         }
10989
10990         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10991             (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
10992                                    netdev->ifindex)) ||
10993             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
10994             nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
10995             nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) ||
10996             (ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
10997                 goto nla_put_failure;
10998
10999         genlmsg_end(msg, hdr);
11000
11001         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11002                                 NL80211_MCGRP_MLME, gfp);
11003         return;
11004
11005  nla_put_failure:
11006         genlmsg_cancel(msg, hdr);
11007         nlmsg_free(msg);
11008 }
11009 EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
11010
11011 void cfg80211_cqm_rssi_notify(struct net_device *dev,
11012                               enum nl80211_cqm_rssi_threshold_event rssi_event,
11013                               gfp_t gfp)
11014 {
11015         struct wireless_dev *wdev = dev->ieee80211_ptr;
11016         struct wiphy *wiphy = wdev->wiphy;
11017         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11018         struct sk_buff *msg;
11019         struct nlattr *pinfoattr;
11020         void *hdr;
11021
11022         trace_cfg80211_cqm_rssi_notify(dev, rssi_event);
11023
11024         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11025         if (!msg)
11026                 return;
11027
11028         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
11029         if (!hdr) {
11030                 nlmsg_free(msg);
11031                 return;
11032         }
11033
11034         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11035             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
11036                 goto nla_put_failure;
11037
11038         pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM);
11039         if (!pinfoattr)
11040                 goto nla_put_failure;
11041
11042         if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
11043                         rssi_event))
11044                 goto nla_put_failure;
11045
11046         nla_nest_end(msg, pinfoattr);
11047
11048         genlmsg_end(msg, hdr);
11049
11050         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11051                                 NL80211_MCGRP_MLME, gfp);
11052         return;
11053
11054  nla_put_failure:
11055         genlmsg_cancel(msg, hdr);
11056         nlmsg_free(msg);
11057 }
11058 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
11059
11060 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
11061                                      struct net_device *netdev, const u8 *bssid,
11062                                      const u8 *replay_ctr, gfp_t gfp)
11063 {
11064         struct sk_buff *msg;
11065         struct nlattr *rekey_attr;
11066         void *hdr;
11067
11068         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11069         if (!msg)
11070                 return;
11071
11072         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD);
11073         if (!hdr) {
11074                 nlmsg_free(msg);
11075                 return;
11076         }
11077
11078         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11079             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
11080             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
11081                 goto nla_put_failure;
11082
11083         rekey_attr = nla_nest_start(msg, NL80211_ATTR_REKEY_DATA);
11084         if (!rekey_attr)
11085                 goto nla_put_failure;
11086
11087         if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR,
11088                     NL80211_REPLAY_CTR_LEN, replay_ctr))
11089                 goto nla_put_failure;
11090
11091         nla_nest_end(msg, rekey_attr);
11092
11093         genlmsg_end(msg, hdr);
11094
11095         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11096                                 NL80211_MCGRP_MLME, gfp);
11097         return;
11098
11099  nla_put_failure:
11100         genlmsg_cancel(msg, hdr);
11101         nlmsg_free(msg);
11102 }
11103
11104 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
11105                                const u8 *replay_ctr, gfp_t gfp)
11106 {
11107         struct wireless_dev *wdev = dev->ieee80211_ptr;
11108         struct wiphy *wiphy = wdev->wiphy;
11109         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11110
11111         trace_cfg80211_gtk_rekey_notify(dev, bssid);
11112         nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
11113 }
11114 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
11115
11116 static void
11117 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
11118                                struct net_device *netdev, int index,
11119                                const u8 *bssid, bool preauth, gfp_t gfp)
11120 {
11121         struct sk_buff *msg;
11122         struct nlattr *attr;
11123         void *hdr;
11124
11125         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11126         if (!msg)
11127                 return;
11128
11129         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE);
11130         if (!hdr) {
11131                 nlmsg_free(msg);
11132                 return;
11133         }
11134
11135         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11136             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
11137                 goto nla_put_failure;
11138
11139         attr = nla_nest_start(msg, NL80211_ATTR_PMKSA_CANDIDATE);
11140         if (!attr)
11141                 goto nla_put_failure;
11142
11143         if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) ||
11144             nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) ||
11145             (preauth &&
11146              nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH)))
11147                 goto nla_put_failure;
11148
11149         nla_nest_end(msg, attr);
11150
11151         genlmsg_end(msg, hdr);
11152
11153         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11154                                 NL80211_MCGRP_MLME, gfp);
11155         return;
11156
11157  nla_put_failure:
11158         genlmsg_cancel(msg, hdr);
11159         nlmsg_free(msg);
11160 }
11161
11162 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
11163                                      const u8 *bssid, bool preauth, gfp_t gfp)
11164 {
11165         struct wireless_dev *wdev = dev->ieee80211_ptr;
11166         struct wiphy *wiphy = wdev->wiphy;
11167         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11168
11169         trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
11170         nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
11171 }
11172 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
11173
11174 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
11175                                      struct net_device *netdev,
11176                                      struct cfg80211_chan_def *chandef,
11177                                      gfp_t gfp)
11178 {
11179         struct sk_buff *msg;
11180         void *hdr;
11181
11182         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11183         if (!msg)
11184                 return;
11185
11186         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CH_SWITCH_NOTIFY);
11187         if (!hdr) {
11188                 nlmsg_free(msg);
11189                 return;
11190         }
11191
11192         if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
11193                 goto nla_put_failure;
11194
11195         if (nl80211_send_chandef(msg, chandef))
11196                 goto nla_put_failure;
11197
11198         genlmsg_end(msg, hdr);
11199
11200         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11201                                 NL80211_MCGRP_MLME, gfp);
11202         return;
11203
11204  nla_put_failure:
11205         genlmsg_cancel(msg, hdr);
11206         nlmsg_free(msg);
11207 }
11208
11209 void cfg80211_ch_switch_notify(struct net_device *dev,
11210                                struct cfg80211_chan_def *chandef)
11211 {
11212         struct wireless_dev *wdev = dev->ieee80211_ptr;
11213         struct wiphy *wiphy = wdev->wiphy;
11214         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11215
11216         ASSERT_WDEV_LOCK(wdev);
11217
11218         trace_cfg80211_ch_switch_notify(dev, chandef);
11219
11220         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
11221                     wdev->iftype != NL80211_IFTYPE_P2P_GO &&
11222                     wdev->iftype != NL80211_IFTYPE_ADHOC &&
11223                     wdev->iftype != NL80211_IFTYPE_MESH_POINT))
11224                 return;
11225
11226         wdev->chandef = *chandef;
11227         wdev->preset_chandef = *chandef;
11228         nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL);
11229 }
11230 EXPORT_SYMBOL(cfg80211_ch_switch_notify);
11231
11232 void cfg80211_cqm_txe_notify(struct net_device *dev,
11233                              const u8 *peer, u32 num_packets,
11234                              u32 rate, u32 intvl, gfp_t gfp)
11235 {
11236         struct wireless_dev *wdev = dev->ieee80211_ptr;
11237         struct wiphy *wiphy = wdev->wiphy;
11238         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11239         struct sk_buff *msg;
11240         struct nlattr *pinfoattr;
11241         void *hdr;
11242
11243         msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
11244         if (!msg)
11245                 return;
11246
11247         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
11248         if (!hdr) {
11249                 nlmsg_free(msg);
11250                 return;
11251         }
11252
11253         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11254             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
11255             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer))
11256                 goto nla_put_failure;
11257
11258         pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM);
11259         if (!pinfoattr)
11260                 goto nla_put_failure;
11261
11262         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets))
11263                 goto nla_put_failure;
11264
11265         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate))
11266                 goto nla_put_failure;
11267
11268         if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl))
11269                 goto nla_put_failure;
11270
11271         nla_nest_end(msg, pinfoattr);
11272
11273         genlmsg_end(msg, hdr);
11274
11275         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11276                                 NL80211_MCGRP_MLME, gfp);
11277         return;
11278
11279  nla_put_failure:
11280         genlmsg_cancel(msg, hdr);
11281         nlmsg_free(msg);
11282 }
11283 EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
11284
11285 void
11286 nl80211_radar_notify(struct cfg80211_registered_device *rdev,
11287                      const struct cfg80211_chan_def *chandef,
11288                      enum nl80211_radar_event event,
11289                      struct net_device *netdev, gfp_t gfp)
11290 {
11291         struct sk_buff *msg;
11292         void *hdr;
11293
11294         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11295         if (!msg)
11296                 return;
11297
11298         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT);
11299         if (!hdr) {
11300                 nlmsg_free(msg);
11301                 return;
11302         }
11303
11304         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
11305                 goto nla_put_failure;
11306
11307         /* NOP and radar events don't need a netdev parameter */
11308         if (netdev) {
11309                 struct wireless_dev *wdev = netdev->ieee80211_ptr;
11310
11311                 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
11312                     nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
11313                         goto nla_put_failure;
11314         }
11315
11316         if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
11317                 goto nla_put_failure;
11318
11319         if (nl80211_send_chandef(msg, chandef))
11320                 goto nla_put_failure;
11321
11322         genlmsg_end(msg, hdr);
11323
11324         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11325                                 NL80211_MCGRP_MLME, gfp);
11326         return;
11327
11328  nla_put_failure:
11329         genlmsg_cancel(msg, hdr);
11330         nlmsg_free(msg);
11331 }
11332
11333 void cfg80211_cqm_pktloss_notify(struct net_device *dev,
11334                                  const u8 *peer, u32 num_packets, gfp_t gfp)
11335 {
11336         struct wireless_dev *wdev = dev->ieee80211_ptr;
11337         struct wiphy *wiphy = wdev->wiphy;
11338         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11339         struct sk_buff *msg;
11340         struct nlattr *pinfoattr;
11341         void *hdr;
11342
11343         trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
11344
11345         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11346         if (!msg)
11347                 return;
11348
11349         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
11350         if (!hdr) {
11351                 nlmsg_free(msg);
11352                 return;
11353         }
11354
11355         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11356             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
11357             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer))
11358                 goto nla_put_failure;
11359
11360         pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM);
11361         if (!pinfoattr)
11362                 goto nla_put_failure;
11363
11364         if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets))
11365                 goto nla_put_failure;
11366
11367         nla_nest_end(msg, pinfoattr);
11368
11369         genlmsg_end(msg, hdr);
11370
11371         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11372                                 NL80211_MCGRP_MLME, gfp);
11373         return;
11374
11375  nla_put_failure:
11376         genlmsg_cancel(msg, hdr);
11377         nlmsg_free(msg);
11378 }
11379 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
11380
11381 void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
11382                            u64 cookie, bool acked, gfp_t gfp)
11383 {
11384         struct wireless_dev *wdev = dev->ieee80211_ptr;
11385         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
11386         struct sk_buff *msg;
11387         void *hdr;
11388
11389         trace_cfg80211_probe_status(dev, addr, cookie, acked);
11390
11391         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11392
11393         if (!msg)
11394                 return;
11395
11396         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT);
11397         if (!hdr) {
11398                 nlmsg_free(msg);
11399                 return;
11400         }
11401
11402         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11403             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
11404             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
11405             nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) ||
11406             (acked && nla_put_flag(msg, NL80211_ATTR_ACK)))
11407                 goto nla_put_failure;
11408
11409         genlmsg_end(msg, hdr);
11410
11411         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11412                                 NL80211_MCGRP_MLME, gfp);
11413         return;
11414
11415  nla_put_failure:
11416         genlmsg_cancel(msg, hdr);
11417         nlmsg_free(msg);
11418 }
11419 EXPORT_SYMBOL(cfg80211_probe_status);
11420
11421 void cfg80211_report_obss_beacon(struct wiphy *wiphy,
11422                                  const u8 *frame, size_t len,
11423                                  int freq, int sig_dbm)
11424 {
11425         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11426         struct sk_buff *msg;
11427         void *hdr;
11428         struct cfg80211_beacon_registration *reg;
11429
11430         trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm);
11431
11432         spin_lock_bh(&rdev->beacon_registrations_lock);
11433         list_for_each_entry(reg, &rdev->beacon_registrations, list) {
11434                 msg = nlmsg_new(len + 100, GFP_ATOMIC);
11435                 if (!msg) {
11436                         spin_unlock_bh(&rdev->beacon_registrations_lock);
11437                         return;
11438                 }
11439
11440                 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
11441                 if (!hdr)
11442                         goto nla_put_failure;
11443
11444                 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11445                     (freq &&
11446                      nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq)) ||
11447                     (sig_dbm &&
11448                      nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
11449                     nla_put(msg, NL80211_ATTR_FRAME, len, frame))
11450                         goto nla_put_failure;
11451
11452                 genlmsg_end(msg, hdr);
11453
11454                 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid);
11455         }
11456         spin_unlock_bh(&rdev->beacon_registrations_lock);
11457         return;
11458
11459  nla_put_failure:
11460         spin_unlock_bh(&rdev->beacon_registrations_lock);
11461         if (hdr)
11462                 genlmsg_cancel(msg, hdr);
11463         nlmsg_free(msg);
11464 }
11465 EXPORT_SYMBOL(cfg80211_report_obss_beacon);
11466
11467 #ifdef CONFIG_PM
11468 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
11469                                    struct cfg80211_wowlan_wakeup *wakeup,
11470                                    gfp_t gfp)
11471 {
11472         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
11473         struct sk_buff *msg;
11474         void *hdr;
11475         int size = 200;
11476
11477         trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup);
11478
11479         if (wakeup)
11480                 size += wakeup->packet_present_len;
11481
11482         msg = nlmsg_new(size, gfp);
11483         if (!msg)
11484                 return;
11485
11486         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN);
11487         if (!hdr)
11488                 goto free_msg;
11489
11490         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11491             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
11492                 goto free_msg;
11493
11494         if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
11495                                         wdev->netdev->ifindex))
11496                 goto free_msg;
11497
11498         if (wakeup) {
11499                 struct nlattr *reasons;
11500
11501                 reasons = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
11502                 if (!reasons)
11503                         goto free_msg;
11504
11505                 if (wakeup->disconnect &&
11506                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT))
11507                         goto free_msg;
11508                 if (wakeup->magic_pkt &&
11509                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT))
11510                         goto free_msg;
11511                 if (wakeup->gtk_rekey_failure &&
11512                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE))
11513                         goto free_msg;
11514                 if (wakeup->eap_identity_req &&
11515                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST))
11516                         goto free_msg;
11517                 if (wakeup->four_way_handshake &&
11518                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE))
11519                         goto free_msg;
11520                 if (wakeup->rfkill_release &&
11521                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))
11522                         goto free_msg;
11523
11524                 if (wakeup->pattern_idx >= 0 &&
11525                     nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
11526                                 wakeup->pattern_idx))
11527                         goto free_msg;
11528
11529                 if (wakeup->tcp_match &&
11530                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH))
11531                         goto free_msg;
11532
11533                 if (wakeup->tcp_connlost &&
11534                     nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST))
11535                         goto free_msg;
11536
11537                 if (wakeup->tcp_nomoretokens &&
11538                     nla_put_flag(msg,
11539                                  NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS))
11540                         goto free_msg;
11541
11542                 if (wakeup->packet) {
11543                         u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211;
11544                         u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN;
11545
11546                         if (!wakeup->packet_80211) {
11547                                 pkt_attr =
11548                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023;
11549                                 len_attr =
11550                                         NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN;
11551                         }
11552
11553                         if (wakeup->packet_len &&
11554                             nla_put_u32(msg, len_attr, wakeup->packet_len))
11555                                 goto free_msg;
11556
11557                         if (nla_put(msg, pkt_attr, wakeup->packet_present_len,
11558                                     wakeup->packet))
11559                                 goto free_msg;
11560                 }
11561
11562                 nla_nest_end(msg, reasons);
11563         }
11564
11565         genlmsg_end(msg, hdr);
11566
11567         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11568                                 NL80211_MCGRP_MLME, gfp);
11569         return;
11570
11571  free_msg:
11572         nlmsg_free(msg);
11573 }
11574 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup);
11575 #endif
11576
11577 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
11578                                 enum nl80211_tdls_operation oper,
11579                                 u16 reason_code, gfp_t gfp)
11580 {
11581         struct wireless_dev *wdev = dev->ieee80211_ptr;
11582         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
11583         struct sk_buff *msg;
11584         void *hdr;
11585
11586         trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper,
11587                                          reason_code);
11588
11589         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11590         if (!msg)
11591                 return;
11592
11593         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER);
11594         if (!hdr) {
11595                 nlmsg_free(msg);
11596                 return;
11597         }
11598
11599         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11600             nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
11601             nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) ||
11602             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) ||
11603             (reason_code > 0 &&
11604              nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code)))
11605                 goto nla_put_failure;
11606
11607         genlmsg_end(msg, hdr);
11608
11609         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11610                                 NL80211_MCGRP_MLME, gfp);
11611         return;
11612
11613  nla_put_failure:
11614         genlmsg_cancel(msg, hdr);
11615         nlmsg_free(msg);
11616 }
11617 EXPORT_SYMBOL(cfg80211_tdls_oper_request);
11618
11619 static int nl80211_netlink_notify(struct notifier_block * nb,
11620                                   unsigned long state,
11621                                   void *_notify)
11622 {
11623         struct netlink_notify *notify = _notify;
11624         struct cfg80211_registered_device *rdev;
11625         struct wireless_dev *wdev;
11626         struct cfg80211_beacon_registration *reg, *tmp;
11627
11628         if (state != NETLINK_URELEASE)
11629                 return NOTIFY_DONE;
11630
11631         rcu_read_lock();
11632
11633         list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
11634                 list_for_each_entry_rcu(wdev, &rdev->wdev_list, list)
11635                         cfg80211_mlme_unregister_socket(wdev, notify->portid);
11636
11637                 spin_lock_bh(&rdev->beacon_registrations_lock);
11638                 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations,
11639                                          list) {
11640                         if (reg->nlportid == notify->portid) {
11641                                 list_del(&reg->list);
11642                                 kfree(reg);
11643                                 break;
11644                         }
11645                 }
11646                 spin_unlock_bh(&rdev->beacon_registrations_lock);
11647         }
11648
11649         rcu_read_unlock();
11650
11651         return NOTIFY_DONE;
11652 }
11653
11654 static struct notifier_block nl80211_netlink_notifier = {
11655         .notifier_call = nl80211_netlink_notify,
11656 };
11657
11658 void cfg80211_ft_event(struct net_device *netdev,
11659                        struct cfg80211_ft_event_params *ft_event)
11660 {
11661         struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
11662         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11663         struct sk_buff *msg;
11664         void *hdr;
11665
11666         trace_cfg80211_ft_event(wiphy, netdev, ft_event);
11667
11668         if (!ft_event->target_ap)
11669                 return;
11670
11671         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11672         if (!msg)
11673                 return;
11674
11675         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT);
11676         if (!hdr)
11677                 goto out;
11678
11679         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11680             nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
11681             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap))
11682                 goto out;
11683
11684         if (ft_event->ies &&
11685             nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies))
11686                 goto out;
11687         if (ft_event->ric_ies &&
11688             nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len,
11689                     ft_event->ric_ies))
11690                 goto out;
11691
11692         genlmsg_end(msg, hdr);
11693
11694         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11695                                 NL80211_MCGRP_MLME, GFP_KERNEL);
11696         return;
11697  out:
11698         nlmsg_free(msg);
11699 }
11700 EXPORT_SYMBOL(cfg80211_ft_event);
11701
11702 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp)
11703 {
11704         struct cfg80211_registered_device *rdev;
11705         struct sk_buff *msg;
11706         void *hdr;
11707         u32 nlportid;
11708
11709         rdev = wiphy_to_dev(wdev->wiphy);
11710         if (!rdev->crit_proto_nlportid)
11711                 return;
11712
11713         nlportid = rdev->crit_proto_nlportid;
11714         rdev->crit_proto_nlportid = 0;
11715
11716         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
11717         if (!msg)
11718                 return;
11719
11720         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP);
11721         if (!hdr)
11722                 goto nla_put_failure;
11723
11724         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11725             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
11726                 goto nla_put_failure;
11727
11728         genlmsg_end(msg, hdr);
11729
11730         genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
11731         return;
11732
11733  nla_put_failure:
11734         if (hdr)
11735                 genlmsg_cancel(msg, hdr);
11736         nlmsg_free(msg);
11737
11738 }
11739 EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
11740
11741 void nl80211_send_ap_stopped(struct wireless_dev *wdev)
11742 {
11743         struct wiphy *wiphy = wdev->wiphy;
11744         struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
11745         struct sk_buff *msg;
11746         void *hdr;
11747
11748         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
11749         if (!msg)
11750                 return;
11751
11752         hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP);
11753         if (!hdr)
11754                 goto out;
11755
11756         if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11757             nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) ||
11758             nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
11759                 goto out;
11760
11761         genlmsg_end(msg, hdr);
11762
11763         genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
11764                                 NL80211_MCGRP_MLME, GFP_KERNEL);
11765         return;
11766  out:
11767         nlmsg_free(msg);
11768 }
11769
11770 /* initialisation/exit functions */
11771
11772 int nl80211_init(void)
11773 {
11774         int err;
11775
11776         err = genl_register_family_with_ops_groups(&nl80211_fam, nl80211_ops,
11777                                                    nl80211_mcgrps);
11778         if (err)
11779                 return err;
11780
11781         err = netlink_register_notifier(&nl80211_netlink_notifier);
11782         if (err)
11783                 goto err_out;
11784
11785         return 0;
11786  err_out:
11787         genl_unregister_family(&nl80211_fam);
11788         return err;
11789 }
11790
11791 void nl80211_exit(void)
11792 {
11793         netlink_unregister_notifier(&nl80211_netlink_notifier);
11794         genl_unregister_family(&nl80211_fam);
11795 }