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