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