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