1 // SPDX-License-Identifier: GPL-2.0
3 * cfg80211 MLME SAP interface
5 * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
6 * Copyright (c) 2015 Intel Deutschland GmbH
7 * Copyright (C) 2019-2020, 2022-2024 Intel Corporation
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/etherdevice.h>
13 #include <linux/netdevice.h>
14 #include <linux/nl80211.h>
15 #include <linux/slab.h>
16 #include <linux/wireless.h>
17 #include <net/cfg80211.h>
18 #include <net/iw_handler.h>
24 void cfg80211_rx_assoc_resp(struct net_device
*dev
,
25 const struct cfg80211_rx_assoc_resp_data
*data
)
27 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
28 struct wiphy
*wiphy
= wdev
->wiphy
;
29 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wiphy
);
30 struct ieee80211_mgmt
*mgmt
= (struct ieee80211_mgmt
*)data
->buf
;
31 struct cfg80211_connect_resp_params cr
= {
32 .timeout_reason
= NL80211_TIMEOUT_UNSPECIFIED
,
33 .req_ie
= data
->req_ies
,
34 .req_ie_len
= data
->req_ies_len
,
35 .resp_ie
= mgmt
->u
.assoc_resp
.variable
,
36 .resp_ie_len
= data
->len
-
37 offsetof(struct ieee80211_mgmt
,
38 u
.assoc_resp
.variable
),
39 .status
= le16_to_cpu(mgmt
->u
.assoc_resp
.status_code
),
40 .ap_mld_addr
= data
->ap_mld_addr
,
44 for (link_id
= 0; link_id
< ARRAY_SIZE(data
->links
); link_id
++) {
45 cr
.links
[link_id
].status
= data
->links
[link_id
].status
;
46 cr
.links
[link_id
].bss
= data
->links
[link_id
].bss
;
48 WARN_ON_ONCE(cr
.links
[link_id
].status
!= WLAN_STATUS_SUCCESS
&&
49 (!cr
.ap_mld_addr
|| !cr
.links
[link_id
].bss
));
51 if (!cr
.links
[link_id
].bss
)
53 cr
.links
[link_id
].bssid
= data
->links
[link_id
].bss
->bssid
;
54 cr
.links
[link_id
].addr
= data
->links
[link_id
].addr
;
55 /* need to have local link addresses for MLO connections */
56 WARN_ON(cr
.ap_mld_addr
&&
57 !is_valid_ether_addr(cr
.links
[link_id
].addr
));
59 BUG_ON(!cr
.links
[link_id
].bss
->channel
);
61 if (cr
.links
[link_id
].bss
->channel
->band
== NL80211_BAND_S1GHZ
) {
63 cr
.resp_ie
= (u8
*)&mgmt
->u
.s1g_assoc_resp
.variable
;
64 cr
.resp_ie_len
= data
->len
-
65 offsetof(struct ieee80211_mgmt
,
66 u
.s1g_assoc_resp
.variable
);
70 cr
.valid_links
|= BIT(link_id
);
73 trace_cfg80211_send_rx_assoc(dev
, data
);
76 * This is a bit of a hack, we don't notify userspace of
77 * a (re-)association reply if we tried to send a reassoc
78 * and got a reject -- we only try again with an assoc
79 * frame instead of reassoc.
81 if (cfg80211_sme_rx_assoc_resp(wdev
, cr
.status
)) {
82 for (link_id
= 0; link_id
< ARRAY_SIZE(data
->links
); link_id
++) {
83 struct cfg80211_bss
*bss
= data
->links
[link_id
].bss
;
88 cfg80211_unhold_bss(bss_from_pub(bss
));
89 cfg80211_put_bss(wiphy
, bss
);
94 nl80211_send_rx_assoc(rdev
, dev
, data
);
95 /* update current_bss etc., consumes the bss reference */
96 __cfg80211_connect_result(dev
, &cr
, cr
.status
== WLAN_STATUS_SUCCESS
);
98 EXPORT_SYMBOL(cfg80211_rx_assoc_resp
);
100 static void cfg80211_process_auth(struct wireless_dev
*wdev
,
101 const u8
*buf
, size_t len
)
103 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wdev
->wiphy
);
105 nl80211_send_rx_auth(rdev
, wdev
->netdev
, buf
, len
, GFP_KERNEL
);
106 cfg80211_sme_rx_auth(wdev
, buf
, len
);
109 static void cfg80211_process_deauth(struct wireless_dev
*wdev
,
110 const u8
*buf
, size_t len
,
113 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wdev
->wiphy
);
114 struct ieee80211_mgmt
*mgmt
= (struct ieee80211_mgmt
*)buf
;
115 const u8
*bssid
= mgmt
->bssid
;
116 u16 reason_code
= le16_to_cpu(mgmt
->u
.deauth
.reason_code
);
117 bool from_ap
= !ether_addr_equal(mgmt
->sa
, wdev
->netdev
->dev_addr
);
119 nl80211_send_deauth(rdev
, wdev
->netdev
, buf
, len
, reconnect
, GFP_KERNEL
);
121 if (!wdev
->connected
|| !ether_addr_equal(wdev
->u
.client
.connected_addr
, bssid
))
124 __cfg80211_disconnected(wdev
->netdev
, NULL
, 0, reason_code
, from_ap
);
125 cfg80211_sme_deauth(wdev
);
128 static void cfg80211_process_disassoc(struct wireless_dev
*wdev
,
129 const u8
*buf
, size_t len
,
132 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wdev
->wiphy
);
133 struct ieee80211_mgmt
*mgmt
= (struct ieee80211_mgmt
*)buf
;
134 const u8
*bssid
= mgmt
->bssid
;
135 u16 reason_code
= le16_to_cpu(mgmt
->u
.disassoc
.reason_code
);
136 bool from_ap
= !ether_addr_equal(mgmt
->sa
, wdev
->netdev
->dev_addr
);
138 nl80211_send_disassoc(rdev
, wdev
->netdev
, buf
, len
, reconnect
,
141 if (WARN_ON(!wdev
->connected
||
142 !ether_addr_equal(wdev
->u
.client
.connected_addr
, bssid
)))
145 __cfg80211_disconnected(wdev
->netdev
, NULL
, 0, reason_code
, from_ap
);
146 cfg80211_sme_disassoc(wdev
);
149 void cfg80211_rx_mlme_mgmt(struct net_device
*dev
, const u8
*buf
, size_t len
)
151 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
152 struct ieee80211_mgmt
*mgmt
= (void *)buf
;
154 lockdep_assert_wiphy(wdev
->wiphy
);
156 trace_cfg80211_rx_mlme_mgmt(dev
, buf
, len
);
158 if (WARN_ON(len
< 2))
161 if (ieee80211_is_auth(mgmt
->frame_control
))
162 cfg80211_process_auth(wdev
, buf
, len
);
163 else if (ieee80211_is_deauth(mgmt
->frame_control
))
164 cfg80211_process_deauth(wdev
, buf
, len
, false);
165 else if (ieee80211_is_disassoc(mgmt
->frame_control
))
166 cfg80211_process_disassoc(wdev
, buf
, len
, false);
168 EXPORT_SYMBOL(cfg80211_rx_mlme_mgmt
);
170 void cfg80211_auth_timeout(struct net_device
*dev
, const u8
*addr
)
172 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
173 struct wiphy
*wiphy
= wdev
->wiphy
;
174 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wiphy
);
176 trace_cfg80211_send_auth_timeout(dev
, addr
);
178 nl80211_send_auth_timeout(rdev
, dev
, addr
, GFP_KERNEL
);
179 cfg80211_sme_auth_timeout(wdev
);
181 EXPORT_SYMBOL(cfg80211_auth_timeout
);
183 void cfg80211_assoc_failure(struct net_device
*dev
,
184 struct cfg80211_assoc_failure
*data
)
186 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
187 struct wiphy
*wiphy
= wdev
->wiphy
;
188 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wiphy
);
189 const u8
*addr
= data
->ap_mld_addr
?: data
->bss
[0]->bssid
;
192 trace_cfg80211_send_assoc_failure(dev
, data
);
195 nl80211_send_assoc_timeout(rdev
, dev
, addr
, GFP_KERNEL
);
196 cfg80211_sme_assoc_timeout(wdev
);
198 cfg80211_sme_abandon_assoc(wdev
);
201 for (i
= 0; i
< ARRAY_SIZE(data
->bss
); i
++) {
202 struct cfg80211_bss
*bss
= data
->bss
[i
];
207 cfg80211_unhold_bss(bss_from_pub(bss
));
208 cfg80211_put_bss(wiphy
, bss
);
211 EXPORT_SYMBOL(cfg80211_assoc_failure
);
213 void cfg80211_tx_mlme_mgmt(struct net_device
*dev
, const u8
*buf
, size_t len
,
216 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
217 struct ieee80211_mgmt
*mgmt
= (void *)buf
;
219 lockdep_assert_wiphy(wdev
->wiphy
);
221 trace_cfg80211_tx_mlme_mgmt(dev
, buf
, len
, reconnect
);
223 if (WARN_ON(len
< 2))
226 if (ieee80211_is_deauth(mgmt
->frame_control
))
227 cfg80211_process_deauth(wdev
, buf
, len
, reconnect
);
229 cfg80211_process_disassoc(wdev
, buf
, len
, reconnect
);
231 EXPORT_SYMBOL(cfg80211_tx_mlme_mgmt
);
233 void cfg80211_michael_mic_failure(struct net_device
*dev
, const u8
*addr
,
234 enum nl80211_key_type key_type
, int key_id
,
235 const u8
*tsc
, gfp_t gfp
)
237 struct wiphy
*wiphy
= dev
->ieee80211_ptr
->wiphy
;
238 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wiphy
);
239 #ifdef CONFIG_CFG80211_WEXT
240 union iwreq_data wrqu
;
241 char *buf
= kmalloc(128, gfp
);
244 memset(&wrqu
, 0, sizeof(wrqu
));
246 sprintf(buf
, "MLME-MICHAELMICFAILURE."
247 "indication(keyid=%d %scast addr=%pM)",
248 key_id
, key_type
== NL80211_KEYTYPE_GROUP
249 ? "broad" : "uni", addr
);
250 wireless_send_event(dev
, IWEVCUSTOM
, &wrqu
, buf
);
255 trace_cfg80211_michael_mic_failure(dev
, addr
, key_type
, key_id
, tsc
);
256 nl80211_michael_mic_failure(rdev
, dev
, addr
, key_type
, key_id
, tsc
, gfp
);
258 EXPORT_SYMBOL(cfg80211_michael_mic_failure
);
260 /* some MLME handling for userspace SME */
261 int cfg80211_mlme_auth(struct cfg80211_registered_device
*rdev
,
262 struct net_device
*dev
,
263 struct cfg80211_auth_request
*req
)
265 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
267 lockdep_assert_wiphy(wdev
->wiphy
);
272 if (req
->link_id
>= 0 &&
273 !(wdev
->wiphy
->flags
& WIPHY_FLAG_SUPPORTS_MLO
))
276 if (req
->auth_type
== NL80211_AUTHTYPE_SHARED_KEY
) {
277 if (!req
->key
|| !req
->key_len
||
278 req
->key_idx
< 0 || req
->key_idx
> 3)
282 if (wdev
->connected
&&
283 ether_addr_equal(req
->bss
->bssid
, wdev
->u
.client
.connected_addr
))
286 if (ether_addr_equal(req
->bss
->bssid
, dev
->dev_addr
) ||
287 (req
->link_id
>= 0 &&
288 ether_addr_equal(req
->ap_mld_addr
, dev
->dev_addr
)))
291 return rdev_auth(rdev
, dev
, req
);
294 /* Do a logical ht_capa &= ht_capa_mask. */
295 void cfg80211_oper_and_ht_capa(struct ieee80211_ht_cap
*ht_capa
,
296 const struct ieee80211_ht_cap
*ht_capa_mask
)
301 memset(ht_capa
, 0, sizeof(*ht_capa
));
306 p2
= (u8
*)(ht_capa_mask
);
307 for (i
= 0; i
< sizeof(*ht_capa
); i
++)
311 /* Do a logical vht_capa &= vht_capa_mask. */
312 void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap
*vht_capa
,
313 const struct ieee80211_vht_cap
*vht_capa_mask
)
317 if (!vht_capa_mask
) {
318 memset(vht_capa
, 0, sizeof(*vht_capa
));
322 p1
= (u8
*)(vht_capa
);
323 p2
= (u8
*)(vht_capa_mask
);
324 for (i
= 0; i
< sizeof(*vht_capa
); i
++)
329 cfg80211_mlme_check_mlo_compat(const struct ieee80211_multi_link_elem
*mle_a
,
330 const struct ieee80211_multi_link_elem
*mle_b
,
331 struct netlink_ext_ack
*extack
)
333 const struct ieee80211_mle_basic_common_info
*common_a
, *common_b
;
335 common_a
= (const void *)mle_a
->variable
;
336 common_b
= (const void *)mle_b
->variable
;
338 if (memcmp(common_a
->mld_mac_addr
, common_b
->mld_mac_addr
, ETH_ALEN
)) {
339 NL_SET_ERR_MSG(extack
, "AP MLD address mismatch");
343 if (ieee80211_mle_get_eml_cap((const u8
*)mle_a
) !=
344 ieee80211_mle_get_eml_cap((const u8
*)mle_b
)) {
345 NL_SET_ERR_MSG(extack
, "link EML capabilities mismatch");
349 if (ieee80211_mle_get_mld_capa_op((const u8
*)mle_a
) !=
350 ieee80211_mle_get_mld_capa_op((const u8
*)mle_b
)) {
351 NL_SET_ERR_MSG(extack
, "link MLD capabilities/ops mismatch");
358 static int cfg80211_mlme_check_mlo(struct net_device
*dev
,
359 struct cfg80211_assoc_request
*req
,
360 struct netlink_ext_ack
*extack
)
362 const struct ieee80211_multi_link_elem
*mles
[ARRAY_SIZE(req
->links
)] = {};
365 if (req
->link_id
< 0)
368 if (!req
->links
[req
->link_id
].bss
) {
369 NL_SET_ERR_MSG(extack
, "no BSS for assoc link");
374 for (i
= 0; i
< ARRAY_SIZE(req
->links
); i
++) {
375 const struct cfg80211_bss_ies
*ies
;
376 const struct element
*ml
;
378 if (!req
->links
[i
].bss
)
381 if (ether_addr_equal(req
->links
[i
].bss
->bssid
, dev
->dev_addr
)) {
382 NL_SET_ERR_MSG(extack
, "BSSID must not be our address");
383 req
->links
[i
].error
= -EINVAL
;
387 ies
= rcu_dereference(req
->links
[i
].bss
->ies
);
388 ml
= cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_MULTI_LINK
,
389 ies
->data
, ies
->len
);
391 NL_SET_ERR_MSG(extack
, "MLO BSS w/o ML element");
392 req
->links
[i
].error
= -EINVAL
;
396 if (!ieee80211_mle_type_ok(ml
->data
+ 1,
397 IEEE80211_ML_CONTROL_TYPE_BASIC
,
399 NL_SET_ERR_MSG(extack
, "BSS with invalid ML element");
400 req
->links
[i
].error
= -EINVAL
;
404 mles
[i
] = (const void *)(ml
->data
+ 1);
406 if (ieee80211_mle_get_link_id((const u8
*)mles
[i
]) != i
) {
407 NL_SET_ERR_MSG(extack
, "link ID mismatch");
408 req
->links
[i
].error
= -EINVAL
;
413 if (WARN_ON(!mles
[req
->link_id
]))
416 for (i
= 0; i
< ARRAY_SIZE(req
->links
); i
++) {
417 if (i
== req
->link_id
|| !req
->links
[i
].bss
)
420 if (WARN_ON(!mles
[i
]))
423 if (cfg80211_mlme_check_mlo_compat(mles
[req
->link_id
], mles
[i
],
425 req
->links
[i
].error
= -EINVAL
;
437 /* Note: caller must cfg80211_put_bss() regardless of result */
438 int cfg80211_mlme_assoc(struct cfg80211_registered_device
*rdev
,
439 struct net_device
*dev
,
440 struct cfg80211_assoc_request
*req
,
441 struct netlink_ext_ack
*extack
)
443 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
446 lockdep_assert_wiphy(wdev
->wiphy
);
448 err
= cfg80211_mlme_check_mlo(dev
, req
, extack
);
452 if (wdev
->connected
&&
454 !ether_addr_equal(wdev
->u
.client
.connected_addr
, req
->prev_bssid
)))
457 if ((req
->bss
&& ether_addr_equal(req
->bss
->bssid
, dev
->dev_addr
)) ||
458 (req
->link_id
>= 0 &&
459 ether_addr_equal(req
->ap_mld_addr
, dev
->dev_addr
)))
462 cfg80211_oper_and_ht_capa(&req
->ht_capa_mask
,
463 rdev
->wiphy
.ht_capa_mod_mask
);
464 cfg80211_oper_and_vht_capa(&req
->vht_capa_mask
,
465 rdev
->wiphy
.vht_capa_mod_mask
);
467 err
= rdev_assoc(rdev
, dev
, req
);
472 cfg80211_ref_bss(&rdev
->wiphy
, req
->bss
);
473 cfg80211_hold_bss(bss_from_pub(req
->bss
));
476 for (link_id
= 0; link_id
< ARRAY_SIZE(req
->links
); link_id
++) {
477 if (!req
->links
[link_id
].bss
)
479 cfg80211_ref_bss(&rdev
->wiphy
, req
->links
[link_id
].bss
);
480 cfg80211_hold_bss(bss_from_pub(req
->links
[link_id
].bss
));
486 int cfg80211_mlme_deauth(struct cfg80211_registered_device
*rdev
,
487 struct net_device
*dev
, const u8
*bssid
,
488 const u8
*ie
, int ie_len
, u16 reason
,
489 bool local_state_change
)
491 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
492 struct cfg80211_deauth_request req
= {
494 .reason_code
= reason
,
497 .local_state_change
= local_state_change
,
500 lockdep_assert_wiphy(wdev
->wiphy
);
502 if (local_state_change
&&
504 !ether_addr_equal(wdev
->u
.client
.connected_addr
, bssid
)))
507 if (ether_addr_equal(wdev
->disconnect_bssid
, bssid
) ||
509 ether_addr_equal(wdev
->u
.client
.connected_addr
, bssid
)))
510 wdev
->conn_owner_nlportid
= 0;
512 return rdev_deauth(rdev
, dev
, &req
);
515 int cfg80211_mlme_disassoc(struct cfg80211_registered_device
*rdev
,
516 struct net_device
*dev
, const u8
*ap_addr
,
517 const u8
*ie
, int ie_len
, u16 reason
,
518 bool local_state_change
)
520 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
521 struct cfg80211_disassoc_request req
= {
522 .reason_code
= reason
,
523 .local_state_change
= local_state_change
,
530 lockdep_assert_wiphy(wdev
->wiphy
);
532 if (!wdev
->connected
)
535 if (memcmp(wdev
->u
.client
.connected_addr
, ap_addr
, ETH_ALEN
))
538 err
= rdev_disassoc(rdev
, dev
, &req
);
542 /* driver should have reported the disassoc */
543 WARN_ON(wdev
->connected
);
547 void cfg80211_mlme_down(struct cfg80211_registered_device
*rdev
,
548 struct net_device
*dev
)
550 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
553 lockdep_assert_wiphy(wdev
->wiphy
);
555 if (!rdev
->ops
->deauth
)
558 if (!wdev
->connected
)
561 memcpy(bssid
, wdev
->u
.client
.connected_addr
, ETH_ALEN
);
562 cfg80211_mlme_deauth(rdev
, dev
, bssid
, NULL
, 0,
563 WLAN_REASON_DEAUTH_LEAVING
, false);
566 struct cfg80211_mgmt_registration
{
567 struct list_head list
;
568 struct wireless_dev
*wdev
;
581 static void cfg80211_mgmt_registrations_update(struct wireless_dev
*wdev
)
583 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wdev
->wiphy
);
584 struct wireless_dev
*tmp
;
585 struct cfg80211_mgmt_registration
*reg
;
586 struct mgmt_frame_regs upd
= {};
588 lockdep_assert_held(&rdev
->wiphy
.mtx
);
590 spin_lock_bh(&rdev
->mgmt_registrations_lock
);
591 if (!wdev
->mgmt_registrations_need_update
) {
592 spin_unlock_bh(&rdev
->mgmt_registrations_lock
);
597 list_for_each_entry_rcu(tmp
, &rdev
->wiphy
.wdev_list
, list
) {
598 list_for_each_entry(reg
, &tmp
->mgmt_registrations
, list
) {
599 u32 mask
= BIT(le16_to_cpu(reg
->frame_type
) >> 4);
602 if (reg
->multicast_rx
)
605 upd
.global_stypes
|= mask
;
606 upd
.global_mcast_stypes
|= mcast_mask
;
609 upd
.interface_stypes
|= mask
;
610 upd
.interface_mcast_stypes
|= mcast_mask
;
616 wdev
->mgmt_registrations_need_update
= 0;
617 spin_unlock_bh(&rdev
->mgmt_registrations_lock
);
619 rdev_update_mgmt_frame_registrations(rdev
, wdev
, &upd
);
622 void cfg80211_mgmt_registrations_update_wk(struct work_struct
*wk
)
624 struct cfg80211_registered_device
*rdev
;
625 struct wireless_dev
*wdev
;
627 rdev
= container_of(wk
, struct cfg80211_registered_device
,
628 mgmt_registrations_update_wk
);
630 wiphy_lock(&rdev
->wiphy
);
631 list_for_each_entry(wdev
, &rdev
->wiphy
.wdev_list
, list
)
632 cfg80211_mgmt_registrations_update(wdev
);
633 wiphy_unlock(&rdev
->wiphy
);
636 int cfg80211_mlme_register_mgmt(struct wireless_dev
*wdev
, u32 snd_portid
,
637 u16 frame_type
, const u8
*match_data
,
638 int match_len
, bool multicast_rx
,
639 struct netlink_ext_ack
*extack
)
641 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wdev
->wiphy
);
642 struct cfg80211_mgmt_registration
*reg
, *nreg
;
645 bool update_multicast
= false;
647 if (!wdev
->wiphy
->mgmt_stypes
)
650 if ((frame_type
& IEEE80211_FCTL_FTYPE
) != IEEE80211_FTYPE_MGMT
) {
651 NL_SET_ERR_MSG(extack
, "frame type not management");
655 if (frame_type
& ~(IEEE80211_FCTL_FTYPE
| IEEE80211_FCTL_STYPE
)) {
656 NL_SET_ERR_MSG(extack
, "Invalid frame type");
660 mgmt_type
= (frame_type
& IEEE80211_FCTL_STYPE
) >> 4;
661 if (!(wdev
->wiphy
->mgmt_stypes
[wdev
->iftype
].rx
& BIT(mgmt_type
))) {
662 NL_SET_ERR_MSG(extack
,
663 "Registration to specific type not supported");
668 * To support Pre Association Security Negotiation (PASN), registration
669 * for authentication frames should be supported. However, as some
670 * versions of the user space daemons wrongly register to all types of
671 * authentication frames (which might result in unexpected behavior)
672 * allow such registration if the request is for a specific
673 * authentication algorithm number.
675 if (wdev
->iftype
== NL80211_IFTYPE_STATION
&&
676 (frame_type
& IEEE80211_FCTL_STYPE
) == IEEE80211_STYPE_AUTH
&&
677 !(match_data
&& match_len
>= 2)) {
678 NL_SET_ERR_MSG(extack
,
679 "Authentication algorithm number required");
683 nreg
= kzalloc(sizeof(*reg
) + match_len
, GFP_KERNEL
);
687 spin_lock_bh(&rdev
->mgmt_registrations_lock
);
689 list_for_each_entry(reg
, &wdev
->mgmt_registrations
, list
) {
690 int mlen
= min(match_len
, reg
->match_len
);
692 if (frame_type
!= le16_to_cpu(reg
->frame_type
))
695 if (memcmp(reg
->match
, match_data
, mlen
) == 0) {
696 if (reg
->multicast_rx
!= multicast_rx
) {
697 update_multicast
= true;
698 reg
->multicast_rx
= multicast_rx
;
701 NL_SET_ERR_MSG(extack
, "Match already configured");
710 if (update_multicast
) {
713 memcpy(nreg
->match
, match_data
, match_len
);
714 nreg
->match_len
= match_len
;
715 nreg
->nlportid
= snd_portid
;
716 nreg
->frame_type
= cpu_to_le16(frame_type
);
718 nreg
->multicast_rx
= multicast_rx
;
719 list_add(&nreg
->list
, &wdev
->mgmt_registrations
);
721 wdev
->mgmt_registrations_need_update
= 1;
722 spin_unlock_bh(&rdev
->mgmt_registrations_lock
);
724 cfg80211_mgmt_registrations_update(wdev
);
730 spin_unlock_bh(&rdev
->mgmt_registrations_lock
);
735 void cfg80211_mlme_unregister_socket(struct wireless_dev
*wdev
, u32 nlportid
)
737 struct wiphy
*wiphy
= wdev
->wiphy
;
738 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wiphy
);
739 struct cfg80211_mgmt_registration
*reg
, *tmp
;
741 spin_lock_bh(&rdev
->mgmt_registrations_lock
);
743 list_for_each_entry_safe(reg
, tmp
, &wdev
->mgmt_registrations
, list
) {
744 if (reg
->nlportid
!= nlportid
)
747 list_del(®
->list
);
750 wdev
->mgmt_registrations_need_update
= 1;
751 schedule_work(&rdev
->mgmt_registrations_update_wk
);
754 spin_unlock_bh(&rdev
->mgmt_registrations_lock
);
756 if (nlportid
&& rdev
->crit_proto_nlportid
== nlportid
) {
757 rdev
->crit_proto_nlportid
= 0;
758 rdev_crit_proto_stop(rdev
, wdev
);
761 if (nlportid
== wdev
->ap_unexpected_nlportid
)
762 wdev
->ap_unexpected_nlportid
= 0;
765 void cfg80211_mlme_purge_registrations(struct wireless_dev
*wdev
)
767 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wdev
->wiphy
);
768 struct cfg80211_mgmt_registration
*reg
, *tmp
;
770 spin_lock_bh(&rdev
->mgmt_registrations_lock
);
771 list_for_each_entry_safe(reg
, tmp
, &wdev
->mgmt_registrations
, list
) {
772 list_del(®
->list
);
775 wdev
->mgmt_registrations_need_update
= 1;
776 spin_unlock_bh(&rdev
->mgmt_registrations_lock
);
778 cfg80211_mgmt_registrations_update(wdev
);
781 static bool cfg80211_allowed_address(struct wireless_dev
*wdev
, const u8
*addr
)
785 for_each_valid_link(wdev
, i
) {
786 if (ether_addr_equal(addr
, wdev
->links
[i
].addr
))
790 return ether_addr_equal(addr
, wdev_address(wdev
));
793 static bool cfg80211_allowed_random_address(struct wireless_dev
*wdev
,
794 const struct ieee80211_mgmt
*mgmt
)
796 if (ieee80211_is_auth(mgmt
->frame_control
) ||
797 ieee80211_is_deauth(mgmt
->frame_control
)) {
798 /* Allow random TA to be used with authentication and
799 * deauthentication frames if the driver has indicated support.
801 if (wiphy_ext_feature_isset(
803 NL80211_EXT_FEATURE_AUTH_AND_DEAUTH_RANDOM_TA
))
805 } else if (ieee80211_is_action(mgmt
->frame_control
) &&
806 mgmt
->u
.action
.category
== WLAN_CATEGORY_PUBLIC
) {
807 /* Allow random TA to be used with Public Action frames if the
808 * driver has indicated support.
810 if (!wdev
->connected
&&
811 wiphy_ext_feature_isset(
813 NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA
))
816 if (wdev
->connected
&&
817 wiphy_ext_feature_isset(
819 NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA_CONNECTED
))
826 int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device
*rdev
,
827 struct wireless_dev
*wdev
,
828 struct cfg80211_mgmt_tx_params
*params
, u64
*cookie
)
830 const struct ieee80211_mgmt
*mgmt
;
833 lockdep_assert_wiphy(&rdev
->wiphy
);
835 if (!wdev
->wiphy
->mgmt_stypes
)
838 if (!rdev
->ops
->mgmt_tx
)
841 if (params
->len
< 24 + 1)
844 mgmt
= (const struct ieee80211_mgmt
*)params
->buf
;
846 if (!ieee80211_is_mgmt(mgmt
->frame_control
))
849 stype
= le16_to_cpu(mgmt
->frame_control
) & IEEE80211_FCTL_STYPE
;
850 if (!(wdev
->wiphy
->mgmt_stypes
[wdev
->iftype
].tx
& BIT(stype
>> 4)))
853 if (ieee80211_is_action(mgmt
->frame_control
) &&
854 mgmt
->u
.action
.category
!= WLAN_CATEGORY_PUBLIC
) {
857 switch (wdev
->iftype
) {
858 case NL80211_IFTYPE_ADHOC
:
860 * check for IBSS DA must be done by driver as
861 * cfg80211 doesn't track the stations
863 if (!wdev
->u
.ibss
.current_bss
||
864 !ether_addr_equal(wdev
->u
.ibss
.current_bss
->pub
.bssid
,
870 case NL80211_IFTYPE_STATION
:
871 case NL80211_IFTYPE_P2P_CLIENT
:
872 if (!wdev
->connected
) {
877 /* FIXME: MLD may address this differently */
879 if (!ether_addr_equal(wdev
->u
.client
.connected_addr
,
885 /* for station, check that DA is the AP */
886 if (!ether_addr_equal(wdev
->u
.client
.connected_addr
,
892 case NL80211_IFTYPE_AP
:
893 case NL80211_IFTYPE_P2P_GO
:
894 case NL80211_IFTYPE_AP_VLAN
:
895 if (!ether_addr_equal(mgmt
->bssid
, wdev_address(wdev
)) &&
896 (params
->link_id
< 0 ||
897 !ether_addr_equal(mgmt
->bssid
,
898 wdev
->links
[params
->link_id
].addr
)))
901 case NL80211_IFTYPE_MESH_POINT
:
902 if (!ether_addr_equal(mgmt
->sa
, mgmt
->bssid
)) {
907 * check for mesh DA must be done by driver as
908 * cfg80211 doesn't track the stations
911 case NL80211_IFTYPE_P2P_DEVICE
:
913 * fall through, P2P device only supports
914 * public action frames
916 case NL80211_IFTYPE_NAN
:
926 if (!cfg80211_allowed_address(wdev
, mgmt
->sa
) &&
927 !cfg80211_allowed_random_address(wdev
, mgmt
))
930 /* Transmit the management frame as requested by user space */
931 return rdev_mgmt_tx(rdev
, wdev
, params
, cookie
);
934 bool cfg80211_rx_mgmt_ext(struct wireless_dev
*wdev
,
935 struct cfg80211_rx_info
*info
)
937 struct wiphy
*wiphy
= wdev
->wiphy
;
938 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wiphy
);
939 struct cfg80211_mgmt_registration
*reg
;
940 const struct ieee80211_txrx_stypes
*stypes
=
941 &wiphy
->mgmt_stypes
[wdev
->iftype
];
942 struct ieee80211_mgmt
*mgmt
= (void *)info
->buf
;
946 __le16 ftype
= mgmt
->frame_control
&
947 cpu_to_le16(IEEE80211_FCTL_FTYPE
| IEEE80211_FCTL_STYPE
);
950 trace_cfg80211_rx_mgmt(wdev
, info
);
951 stype
= (le16_to_cpu(mgmt
->frame_control
) & IEEE80211_FCTL_STYPE
) >> 4;
953 if (!(stypes
->rx
& BIT(stype
))) {
954 trace_cfg80211_return_bool(false);
958 data
= info
->buf
+ ieee80211_hdrlen(mgmt
->frame_control
);
959 data_len
= info
->len
- ieee80211_hdrlen(mgmt
->frame_control
);
961 spin_lock_bh(&rdev
->mgmt_registrations_lock
);
963 list_for_each_entry(reg
, &wdev
->mgmt_registrations
, list
) {
964 if (reg
->frame_type
!= ftype
)
967 if (reg
->match_len
> data_len
)
970 if (memcmp(reg
->match
, data
, reg
->match_len
))
975 /* Indicate the received Action frame to user space */
976 if (nl80211_send_mgmt(rdev
, wdev
, reg
->nlportid
, info
,
984 spin_unlock_bh(&rdev
->mgmt_registrations_lock
);
986 trace_cfg80211_return_bool(result
);
989 EXPORT_SYMBOL(cfg80211_rx_mgmt_ext
);
991 void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device
*rdev
)
993 cancel_delayed_work(&rdev
->dfs_update_channels_wk
);
994 queue_delayed_work(cfg80211_wq
, &rdev
->dfs_update_channels_wk
, 0);
997 void cfg80211_dfs_channels_update_work(struct work_struct
*work
)
999 struct delayed_work
*delayed_work
= to_delayed_work(work
);
1000 struct cfg80211_registered_device
*rdev
;
1001 struct cfg80211_chan_def chandef
;
1002 struct ieee80211_supported_band
*sband
;
1003 struct ieee80211_channel
*c
;
1004 struct wiphy
*wiphy
;
1005 bool check_again
= false;
1006 unsigned long timeout
, next_time
= 0;
1007 unsigned long time_dfs_update
;
1008 enum nl80211_radar_event radar_event
;
1011 rdev
= container_of(delayed_work
, struct cfg80211_registered_device
,
1012 dfs_update_channels_wk
);
1013 wiphy
= &rdev
->wiphy
;
1016 for (bandid
= 0; bandid
< NUM_NL80211_BANDS
; bandid
++) {
1017 sband
= wiphy
->bands
[bandid
];
1021 for (i
= 0; i
< sband
->n_channels
; i
++) {
1022 c
= &sband
->channels
[i
];
1024 if (!(c
->flags
& IEEE80211_CHAN_RADAR
))
1027 if (c
->dfs_state
!= NL80211_DFS_UNAVAILABLE
&&
1028 c
->dfs_state
!= NL80211_DFS_AVAILABLE
)
1031 if (c
->dfs_state
== NL80211_DFS_UNAVAILABLE
) {
1032 time_dfs_update
= IEEE80211_DFS_MIN_NOP_TIME_MS
;
1033 radar_event
= NL80211_RADAR_NOP_FINISHED
;
1035 if (regulatory_pre_cac_allowed(wiphy
) ||
1036 cfg80211_any_wiphy_oper_chan(wiphy
, c
))
1039 time_dfs_update
= REG_PRE_CAC_EXPIRY_GRACE_MS
;
1040 radar_event
= NL80211_RADAR_PRE_CAC_EXPIRED
;
1043 timeout
= c
->dfs_state_entered
+
1044 msecs_to_jiffies(time_dfs_update
);
1046 if (time_after_eq(jiffies
, timeout
)) {
1047 c
->dfs_state
= NL80211_DFS_USABLE
;
1048 c
->dfs_state_entered
= jiffies
;
1050 cfg80211_chandef_create(&chandef
, c
,
1051 NL80211_CHAN_NO_HT
);
1053 nl80211_radar_notify(rdev
, &chandef
,
1057 regulatory_propagate_dfs_state(wiphy
, &chandef
,
1064 next_time
= timeout
- jiffies
;
1066 next_time
= min(next_time
, timeout
- jiffies
);
1072 /* reschedule if there are other channels waiting to be cleared again */
1074 queue_delayed_work(cfg80211_wq
, &rdev
->dfs_update_channels_wk
,
1079 void __cfg80211_radar_event(struct wiphy
*wiphy
,
1080 struct cfg80211_chan_def
*chandef
,
1081 bool offchan
, gfp_t gfp
)
1083 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wiphy
);
1085 trace_cfg80211_radar_event(wiphy
, chandef
, offchan
);
1087 /* only set the chandef supplied channel to unavailable, in
1088 * case the radar is detected on only one of multiple channels
1089 * spanned by the chandef.
1091 cfg80211_set_dfs_state(wiphy
, chandef
, NL80211_DFS_UNAVAILABLE
);
1094 queue_work(cfg80211_wq
, &rdev
->background_cac_abort_wk
);
1096 cfg80211_sched_dfs_chan_update(rdev
);
1098 nl80211_radar_notify(rdev
, chandef
, NL80211_RADAR_DETECTED
, NULL
, gfp
);
1100 memcpy(&rdev
->radar_chandef
, chandef
, sizeof(struct cfg80211_chan_def
));
1101 queue_work(cfg80211_wq
, &rdev
->propagate_radar_detect_wk
);
1103 EXPORT_SYMBOL(__cfg80211_radar_event
);
1105 void cfg80211_cac_event(struct net_device
*netdev
,
1106 const struct cfg80211_chan_def
*chandef
,
1107 enum nl80211_radar_event event
, gfp_t gfp
,
1108 unsigned int link_id
)
1110 struct wireless_dev
*wdev
= netdev
->ieee80211_ptr
;
1111 struct wiphy
*wiphy
= wdev
->wiphy
;
1112 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wiphy
);
1113 unsigned long timeout
;
1115 if (WARN_ON(wdev
->valid_links
&&
1116 !(wdev
->valid_links
& BIT(link_id
))))
1119 trace_cfg80211_cac_event(netdev
, event
, link_id
);
1121 if (WARN_ON(!wdev
->links
[link_id
].cac_started
&&
1122 event
!= NL80211_RADAR_CAC_STARTED
))
1126 case NL80211_RADAR_CAC_FINISHED
:
1127 timeout
= wdev
->links
[link_id
].cac_start_time
+
1128 msecs_to_jiffies(wdev
->links
[link_id
].cac_time_ms
);
1129 WARN_ON(!time_after_eq(jiffies
, timeout
));
1130 cfg80211_set_dfs_state(wiphy
, chandef
, NL80211_DFS_AVAILABLE
);
1131 memcpy(&rdev
->cac_done_chandef
, chandef
,
1132 sizeof(struct cfg80211_chan_def
));
1133 queue_work(cfg80211_wq
, &rdev
->propagate_cac_done_wk
);
1134 cfg80211_sched_dfs_chan_update(rdev
);
1136 case NL80211_RADAR_CAC_ABORTED
:
1137 wdev
->links
[link_id
].cac_started
= false;
1139 case NL80211_RADAR_CAC_STARTED
:
1140 wdev
->links
[link_id
].cac_started
= true;
1147 nl80211_radar_notify(rdev
, chandef
, event
, netdev
, gfp
);
1149 EXPORT_SYMBOL(cfg80211_cac_event
);
1152 __cfg80211_background_cac_event(struct cfg80211_registered_device
*rdev
,
1153 struct wireless_dev
*wdev
,
1154 const struct cfg80211_chan_def
*chandef
,
1155 enum nl80211_radar_event event
)
1157 struct wiphy
*wiphy
= &rdev
->wiphy
;
1158 struct net_device
*netdev
;
1160 lockdep_assert_wiphy(&rdev
->wiphy
);
1162 if (!cfg80211_chandef_valid(chandef
))
1165 if (!rdev
->background_radar_wdev
)
1169 case NL80211_RADAR_CAC_FINISHED
:
1170 cfg80211_set_dfs_state(wiphy
, chandef
, NL80211_DFS_AVAILABLE
);
1171 memcpy(&rdev
->cac_done_chandef
, chandef
, sizeof(*chandef
));
1172 queue_work(cfg80211_wq
, &rdev
->propagate_cac_done_wk
);
1173 cfg80211_sched_dfs_chan_update(rdev
);
1174 wdev
= rdev
->background_radar_wdev
;
1176 case NL80211_RADAR_CAC_ABORTED
:
1177 if (!cancel_delayed_work(&rdev
->background_cac_done_wk
))
1179 wdev
= rdev
->background_radar_wdev
;
1181 case NL80211_RADAR_CAC_STARTED
:
1187 netdev
= wdev
? wdev
->netdev
: NULL
;
1188 nl80211_radar_notify(rdev
, chandef
, event
, netdev
, GFP_KERNEL
);
1192 cfg80211_background_cac_event(struct cfg80211_registered_device
*rdev
,
1193 const struct cfg80211_chan_def
*chandef
,
1194 enum nl80211_radar_event event
)
1196 wiphy_lock(&rdev
->wiphy
);
1197 __cfg80211_background_cac_event(rdev
, rdev
->background_radar_wdev
,
1199 wiphy_unlock(&rdev
->wiphy
);
1202 void cfg80211_background_cac_done_wk(struct work_struct
*work
)
1204 struct delayed_work
*delayed_work
= to_delayed_work(work
);
1205 struct cfg80211_registered_device
*rdev
;
1207 rdev
= container_of(delayed_work
, struct cfg80211_registered_device
,
1208 background_cac_done_wk
);
1209 cfg80211_background_cac_event(rdev
, &rdev
->background_radar_chandef
,
1210 NL80211_RADAR_CAC_FINISHED
);
1213 void cfg80211_background_cac_abort_wk(struct work_struct
*work
)
1215 struct cfg80211_registered_device
*rdev
;
1217 rdev
= container_of(work
, struct cfg80211_registered_device
,
1218 background_cac_abort_wk
);
1219 cfg80211_background_cac_event(rdev
, &rdev
->background_radar_chandef
,
1220 NL80211_RADAR_CAC_ABORTED
);
1223 void cfg80211_background_cac_abort(struct wiphy
*wiphy
)
1225 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wiphy
);
1227 queue_work(cfg80211_wq
, &rdev
->background_cac_abort_wk
);
1229 EXPORT_SYMBOL(cfg80211_background_cac_abort
);
1232 cfg80211_start_background_radar_detection(struct cfg80211_registered_device
*rdev
,
1233 struct wireless_dev
*wdev
,
1234 struct cfg80211_chan_def
*chandef
)
1236 unsigned int cac_time_ms
;
1239 lockdep_assert_wiphy(&rdev
->wiphy
);
1241 if (!wiphy_ext_feature_isset(&rdev
->wiphy
,
1242 NL80211_EXT_FEATURE_RADAR_BACKGROUND
))
1245 /* Offchannel chain already locked by another wdev */
1246 if (rdev
->background_radar_wdev
&& rdev
->background_radar_wdev
!= wdev
)
1249 /* CAC already in progress on the offchannel chain */
1250 if (rdev
->background_radar_wdev
== wdev
&&
1251 delayed_work_pending(&rdev
->background_cac_done_wk
))
1254 err
= rdev_set_radar_background(rdev
, chandef
);
1258 cac_time_ms
= cfg80211_chandef_dfs_cac_time(&rdev
->wiphy
, chandef
);
1260 cac_time_ms
= IEEE80211_DFS_MIN_CAC_TIME_MS
;
1262 rdev
->background_radar_chandef
= *chandef
;
1263 rdev
->background_radar_wdev
= wdev
; /* Get offchain ownership */
1265 __cfg80211_background_cac_event(rdev
, wdev
, chandef
,
1266 NL80211_RADAR_CAC_STARTED
);
1267 queue_delayed_work(cfg80211_wq
, &rdev
->background_cac_done_wk
,
1268 msecs_to_jiffies(cac_time_ms
));
1273 void cfg80211_stop_background_radar_detection(struct wireless_dev
*wdev
)
1275 struct wiphy
*wiphy
= wdev
->wiphy
;
1276 struct cfg80211_registered_device
*rdev
= wiphy_to_rdev(wiphy
);
1278 lockdep_assert_wiphy(wiphy
);
1280 if (wdev
!= rdev
->background_radar_wdev
)
1283 rdev_set_radar_background(rdev
, NULL
);
1284 rdev
->background_radar_wdev
= NULL
; /* Release offchain ownership */
1286 __cfg80211_background_cac_event(rdev
, wdev
,
1287 &rdev
->background_radar_chandef
,
1288 NL80211_RADAR_CAC_ABORTED
);