1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2008, 2009 open80211s Ltd.
4 * Copyright (C) 2018 - 2024 Intel Corporation
5 * Authors: Luis Carlos Cobo <luisca@cozybit.com>
6 * Javier Cardona <javier@cozybit.com>
9 #include <linux/slab.h>
10 #include <linux/unaligned.h>
11 #include "ieee80211_i.h"
14 #include "driver-ops.h"
16 static int mesh_allocated
;
17 static struct kmem_cache
*rm_cache
;
19 bool mesh_action_is_path_sel(struct ieee80211_mgmt
*mgmt
)
21 return (mgmt
->u
.action
.u
.mesh_action
.action_code
==
22 WLAN_MESH_ACTION_HWMP_PATH_SELECTION
);
25 void ieee80211s_init(void)
28 rm_cache
= kmem_cache_create("mesh_rmc", sizeof(struct rmc_entry
),
32 void ieee80211s_stop(void)
36 kmem_cache_destroy(rm_cache
);
39 static void ieee80211_mesh_housekeeping_timer(struct timer_list
*t
)
41 struct ieee80211_sub_if_data
*sdata
=
42 from_timer(sdata
, t
, u
.mesh
.housekeeping_timer
);
43 struct ieee80211_local
*local
= sdata
->local
;
44 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
46 set_bit(MESH_WORK_HOUSEKEEPING
, &ifmsh
->wrkq_flags
);
48 wiphy_work_queue(local
->hw
.wiphy
, &sdata
->work
);
52 * mesh_matches_local - check if the config of a mesh point matches ours
54 * @sdata: local mesh subif
55 * @ie: information elements of a management frame from the mesh peer
57 * This function checks if the mesh configuration of a mesh point matches the
58 * local mesh configuration, i.e. if both nodes belong to the same mesh network.
60 * Returns: %true if both nodes belong to the same mesh
62 bool mesh_matches_local(struct ieee80211_sub_if_data
*sdata
,
63 struct ieee802_11_elems
*ie
)
65 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
67 struct cfg80211_chan_def sta_chan_def
;
68 struct ieee80211_supported_band
*sband
;
72 * As support for each feature is added, check for matching
73 * - On mesh config capabilities
74 * - Power Save Support En
75 * - Sync support enabled
76 * - Sync support active
77 * - Sync support required from peer
79 * - Power management control on fc
81 if (!(ifmsh
->mesh_id_len
== ie
->mesh_id_len
&&
82 memcmp(ifmsh
->mesh_id
, ie
->mesh_id
, ie
->mesh_id_len
) == 0 &&
83 (ifmsh
->mesh_pp_id
== ie
->mesh_config
->meshconf_psel
) &&
84 (ifmsh
->mesh_pm_id
== ie
->mesh_config
->meshconf_pmetric
) &&
85 (ifmsh
->mesh_cc_id
== ie
->mesh_config
->meshconf_congest
) &&
86 (ifmsh
->mesh_sp_id
== ie
->mesh_config
->meshconf_synch
) &&
87 (ifmsh
->mesh_auth_id
== ie
->mesh_config
->meshconf_auth
)))
90 sband
= ieee80211_get_sband(sdata
);
94 ieee80211_sta_get_rates(sdata
, ie
, sband
->band
,
97 if (sdata
->vif
.bss_conf
.basic_rates
!= basic_rates
)
100 cfg80211_chandef_create(&sta_chan_def
, sdata
->vif
.bss_conf
.chanreq
.oper
.chan
,
102 ieee80211_chandef_ht_oper(ie
->ht_operation
, &sta_chan_def
);
104 if (ie
->vht_cap_elem
)
105 vht_cap_info
= le32_to_cpu(ie
->vht_cap_elem
->vht_cap_info
);
107 ieee80211_chandef_vht_oper(&sdata
->local
->hw
, vht_cap_info
,
108 ie
->vht_operation
, ie
->ht_operation
,
110 ieee80211_chandef_he_6ghz_oper(sdata
->local
, ie
->he_operation
,
114 if (!cfg80211_chandef_compatible(&sdata
->vif
.bss_conf
.chanreq
.oper
,
122 * mesh_peer_accepts_plinks - check if an mp is willing to establish peer links
124 * @ie: information elements of a management frame from the mesh peer
126 * Returns: %true if the mesh peer is willing to establish peer links
128 bool mesh_peer_accepts_plinks(struct ieee802_11_elems
*ie
)
130 return (ie
->mesh_config
->meshconf_cap
&
131 IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS
) != 0;
135 * mesh_accept_plinks_update - update accepting_plink in local mesh beacons
137 * @sdata: mesh interface in which mesh beacons are going to be updated
139 * Returns: beacon changed flag if the beacon content changed.
141 u64
mesh_accept_plinks_update(struct ieee80211_sub_if_data
*sdata
)
146 /* In case mesh_plink_free_count > 0 and mesh_plinktbl_capacity == 0,
147 * the mesh interface might be able to establish plinks with peers that
148 * are already on the table but are not on PLINK_ESTAB state. However,
149 * in general the mesh interface is not accepting peer link requests
150 * from new peers, and that must be reflected in the beacon
152 free_plinks
= mesh_plink_availables(sdata
);
154 if (free_plinks
!= sdata
->u
.mesh
.accepting_plinks
) {
155 sdata
->u
.mesh
.accepting_plinks
= free_plinks
;
156 changed
= BSS_CHANGED_BEACON
;
163 * mesh_sta_cleanup - clean up any mesh sta state
165 * @sta: mesh sta to clean up.
167 void mesh_sta_cleanup(struct sta_info
*sta
)
169 struct ieee80211_sub_if_data
*sdata
= sta
->sdata
;
170 u64 changed
= mesh_plink_deactivate(sta
);
173 ieee80211_mbss_info_change_notify(sdata
, changed
);
176 int mesh_rmc_init(struct ieee80211_sub_if_data
*sdata
)
180 sdata
->u
.mesh
.rmc
= kmalloc(sizeof(struct mesh_rmc
), GFP_KERNEL
);
181 if (!sdata
->u
.mesh
.rmc
)
183 sdata
->u
.mesh
.rmc
->idx_mask
= RMC_BUCKETS
- 1;
184 for (i
= 0; i
< RMC_BUCKETS
; i
++)
185 INIT_HLIST_HEAD(&sdata
->u
.mesh
.rmc
->bucket
[i
]);
189 void mesh_rmc_free(struct ieee80211_sub_if_data
*sdata
)
191 struct mesh_rmc
*rmc
= sdata
->u
.mesh
.rmc
;
193 struct hlist_node
*n
;
196 if (!sdata
->u
.mesh
.rmc
)
199 for (i
= 0; i
< RMC_BUCKETS
; i
++) {
200 hlist_for_each_entry_safe(p
, n
, &rmc
->bucket
[i
], list
) {
202 kmem_cache_free(rm_cache
, p
);
207 sdata
->u
.mesh
.rmc
= NULL
;
211 * mesh_rmc_check - Check frame in recent multicast cache and add if absent.
214 * @sa: source address
215 * @mesh_hdr: mesh_header
217 * Returns: 0 if the frame is not in the cache, nonzero otherwise.
219 * Checks using the source address and the mesh sequence number if we have
220 * received this frame lately. If the frame is not in the cache, it is added to
223 int mesh_rmc_check(struct ieee80211_sub_if_data
*sdata
,
224 const u8
*sa
, struct ieee80211s_hdr
*mesh_hdr
)
226 struct mesh_rmc
*rmc
= sdata
->u
.mesh
.rmc
;
231 struct hlist_node
*n
;
236 /* Don't care about endianness since only match matters */
237 memcpy(&seqnum
, &mesh_hdr
->seqnum
, sizeof(mesh_hdr
->seqnum
));
238 idx
= le32_to_cpu(mesh_hdr
->seqnum
) & rmc
->idx_mask
;
239 hlist_for_each_entry_safe(p
, n
, &rmc
->bucket
[idx
], list
) {
241 if (time_after(jiffies
, p
->exp_time
) ||
242 entries
== RMC_QUEUE_MAX_LEN
) {
244 kmem_cache_free(rm_cache
, p
);
246 } else if ((seqnum
== p
->seqnum
) && ether_addr_equal(sa
, p
->sa
))
250 p
= kmem_cache_alloc(rm_cache
, GFP_ATOMIC
);
255 p
->exp_time
= jiffies
+ RMC_TIMEOUT
;
256 memcpy(p
->sa
, sa
, ETH_ALEN
);
257 hlist_add_head(&p
->list
, &rmc
->bucket
[idx
]);
261 int mesh_add_meshconf_ie(struct ieee80211_sub_if_data
*sdata
,
264 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
266 u8 meshconf_len
= sizeof(struct ieee80211_meshconf_ie
);
267 bool is_connected_to_gate
= ifmsh
->num_gates
> 0 ||
268 ifmsh
->mshcfg
.dot11MeshGateAnnouncementProtocol
||
269 ifmsh
->mshcfg
.dot11MeshConnectedToMeshGate
;
270 bool is_connected_to_as
= ifmsh
->mshcfg
.dot11MeshConnectedToAuthServer
;
272 if (skb_tailroom(skb
) < 2 + meshconf_len
)
275 pos
= skb_put(skb
, 2 + meshconf_len
);
276 *pos
++ = WLAN_EID_MESH_CONFIG
;
277 *pos
++ = meshconf_len
;
279 /* save a pointer for quick updates in pre-tbtt */
280 ifmsh
->meshconf_offset
= pos
- skb
->data
;
282 /* Active path selection protocol ID */
283 *pos
++ = ifmsh
->mesh_pp_id
;
284 /* Active path selection metric ID */
285 *pos
++ = ifmsh
->mesh_pm_id
;
286 /* Congestion control mode identifier */
287 *pos
++ = ifmsh
->mesh_cc_id
;
288 /* Synchronization protocol identifier */
289 *pos
++ = ifmsh
->mesh_sp_id
;
290 /* Authentication Protocol identifier */
291 *pos
++ = ifmsh
->mesh_auth_id
;
292 /* Mesh Formation Info - number of neighbors */
293 neighbors
= atomic_read(&ifmsh
->estab_plinks
);
294 neighbors
= min_t(int, neighbors
, IEEE80211_MAX_MESH_PEERINGS
);
295 *pos
++ = (is_connected_to_as
<< 7) |
297 is_connected_to_gate
;
298 /* Mesh capability */
300 *pos
|= ifmsh
->mshcfg
.dot11MeshForwarding
?
301 IEEE80211_MESHCONF_CAPAB_FORWARDING
: 0x00;
302 *pos
|= ifmsh
->accepting_plinks
?
303 IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS
: 0x00;
304 /* Mesh PS mode. See IEEE802.11-2012 8.4.2.100.8 */
305 *pos
|= ifmsh
->ps_peers_deep_sleep
?
306 IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL
: 0x00;
310 int mesh_add_meshid_ie(struct ieee80211_sub_if_data
*sdata
, struct sk_buff
*skb
)
312 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
315 if (skb_tailroom(skb
) < 2 + ifmsh
->mesh_id_len
)
318 pos
= skb_put(skb
, 2 + ifmsh
->mesh_id_len
);
319 *pos
++ = WLAN_EID_MESH_ID
;
320 *pos
++ = ifmsh
->mesh_id_len
;
321 if (ifmsh
->mesh_id_len
)
322 memcpy(pos
, ifmsh
->mesh_id
, ifmsh
->mesh_id_len
);
327 static int mesh_add_awake_window_ie(struct ieee80211_sub_if_data
*sdata
,
330 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
333 /* see IEEE802.11-2012 13.14.6 */
334 if (ifmsh
->ps_peers_light_sleep
== 0 &&
335 ifmsh
->ps_peers_deep_sleep
== 0 &&
336 ifmsh
->nonpeer_pm
== NL80211_MESH_POWER_ACTIVE
)
339 if (skb_tailroom(skb
) < 4)
342 pos
= skb_put(skb
, 2 + 2);
343 *pos
++ = WLAN_EID_MESH_AWAKE_WINDOW
;
345 put_unaligned_le16(ifmsh
->mshcfg
.dot11MeshAwakeWindowDuration
, pos
);
350 int mesh_add_vendor_ies(struct ieee80211_sub_if_data
*sdata
,
353 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
357 if (!ifmsh
->ie
|| !ifmsh
->ie_len
)
360 /* fast-forward to vendor IEs */
361 offset
= ieee80211_ie_split_vendor(ifmsh
->ie
, ifmsh
->ie_len
, 0);
363 if (offset
< ifmsh
->ie_len
) {
364 len
= ifmsh
->ie_len
- offset
;
365 data
= ifmsh
->ie
+ offset
;
366 if (skb_tailroom(skb
) < len
)
368 skb_put_data(skb
, data
, len
);
374 int mesh_add_rsn_ie(struct ieee80211_sub_if_data
*sdata
, struct sk_buff
*skb
)
376 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
380 if (!ifmsh
->ie
|| !ifmsh
->ie_len
)
384 data
= cfg80211_find_ie(WLAN_EID_RSN
, ifmsh
->ie
, ifmsh
->ie_len
);
390 if (skb_tailroom(skb
) < len
)
392 skb_put_data(skb
, data
, len
);
397 static int mesh_add_ds_params_ie(struct ieee80211_sub_if_data
*sdata
,
400 struct ieee80211_chanctx_conf
*chanctx_conf
;
401 struct ieee80211_channel
*chan
;
404 if (skb_tailroom(skb
) < 3)
408 chanctx_conf
= rcu_dereference(sdata
->vif
.bss_conf
.chanctx_conf
);
409 if (WARN_ON(!chanctx_conf
)) {
413 chan
= chanctx_conf
->def
.chan
;
416 pos
= skb_put(skb
, 2 + 1);
417 *pos
++ = WLAN_EID_DS_PARAMS
;
419 *pos
++ = ieee80211_frequency_to_channel(chan
->center_freq
);
424 int mesh_add_ht_cap_ie(struct ieee80211_sub_if_data
*sdata
,
427 struct ieee80211_supported_band
*sband
;
430 sband
= ieee80211_get_sband(sdata
);
434 /* HT not allowed in 6 GHz */
435 if (sband
->band
== NL80211_BAND_6GHZ
)
438 if (!sband
->ht_cap
.ht_supported
||
439 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_20_NOHT
||
440 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_5
||
441 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_10
)
444 if (skb_tailroom(skb
) < 2 + sizeof(struct ieee80211_ht_cap
))
447 pos
= skb_put(skb
, 2 + sizeof(struct ieee80211_ht_cap
));
448 ieee80211_ie_build_ht_cap(pos
, &sband
->ht_cap
, sband
->ht_cap
.cap
);
453 int mesh_add_ht_oper_ie(struct ieee80211_sub_if_data
*sdata
,
456 struct ieee80211_local
*local
= sdata
->local
;
457 struct ieee80211_chanctx_conf
*chanctx_conf
;
458 struct ieee80211_channel
*channel
;
459 struct ieee80211_supported_band
*sband
;
460 struct ieee80211_sta_ht_cap
*ht_cap
;
464 chanctx_conf
= rcu_dereference(sdata
->vif
.bss_conf
.chanctx_conf
);
465 if (WARN_ON(!chanctx_conf
)) {
469 channel
= chanctx_conf
->def
.chan
;
472 sband
= local
->hw
.wiphy
->bands
[channel
->band
];
473 ht_cap
= &sband
->ht_cap
;
475 /* HT not allowed in 6 GHz */
476 if (sband
->band
== NL80211_BAND_6GHZ
)
479 if (!ht_cap
->ht_supported
||
480 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_20_NOHT
||
481 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_5
||
482 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_10
)
485 if (skb_tailroom(skb
) < 2 + sizeof(struct ieee80211_ht_operation
))
488 pos
= skb_put(skb
, 2 + sizeof(struct ieee80211_ht_operation
));
489 ieee80211_ie_build_ht_oper(pos
, ht_cap
, &sdata
->vif
.bss_conf
.chanreq
.oper
,
490 sdata
->vif
.bss_conf
.ht_operation_mode
,
496 int mesh_add_vht_cap_ie(struct ieee80211_sub_if_data
*sdata
,
499 struct ieee80211_supported_band
*sband
;
502 sband
= ieee80211_get_sband(sdata
);
506 /* VHT not allowed in 6 GHz */
507 if (sband
->band
== NL80211_BAND_6GHZ
)
510 if (!sband
->vht_cap
.vht_supported
||
511 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_20_NOHT
||
512 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_5
||
513 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_10
)
516 if (skb_tailroom(skb
) < 2 + sizeof(struct ieee80211_vht_cap
))
519 pos
= skb_put(skb
, 2 + sizeof(struct ieee80211_vht_cap
));
520 ieee80211_ie_build_vht_cap(pos
, &sband
->vht_cap
, sband
->vht_cap
.cap
);
525 int mesh_add_vht_oper_ie(struct ieee80211_sub_if_data
*sdata
,
528 struct ieee80211_local
*local
= sdata
->local
;
529 struct ieee80211_chanctx_conf
*chanctx_conf
;
530 struct ieee80211_channel
*channel
;
531 struct ieee80211_supported_band
*sband
;
532 struct ieee80211_sta_vht_cap
*vht_cap
;
536 chanctx_conf
= rcu_dereference(sdata
->vif
.bss_conf
.chanctx_conf
);
537 if (WARN_ON(!chanctx_conf
)) {
541 channel
= chanctx_conf
->def
.chan
;
544 sband
= local
->hw
.wiphy
->bands
[channel
->band
];
545 vht_cap
= &sband
->vht_cap
;
547 /* VHT not allowed in 6 GHz */
548 if (sband
->band
== NL80211_BAND_6GHZ
)
551 if (!vht_cap
->vht_supported
||
552 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_20_NOHT
||
553 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_5
||
554 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_10
)
557 if (skb_tailroom(skb
) < 2 + sizeof(struct ieee80211_vht_operation
))
560 pos
= skb_put(skb
, 2 + sizeof(struct ieee80211_vht_operation
));
561 ieee80211_ie_build_vht_oper(pos
, vht_cap
,
562 &sdata
->vif
.bss_conf
.chanreq
.oper
);
567 int mesh_add_he_cap_ie(struct ieee80211_sub_if_data
*sdata
,
568 struct sk_buff
*skb
, u8 ie_len
)
570 struct ieee80211_supported_band
*sband
;
572 sband
= ieee80211_get_sband(sdata
);
576 if (sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_20_NOHT
||
577 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_5
||
578 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_10
)
581 return ieee80211_put_he_cap(skb
, sdata
, sband
, NULL
);
584 int mesh_add_he_oper_ie(struct ieee80211_sub_if_data
*sdata
,
587 const struct ieee80211_sta_he_cap
*he_cap
;
588 struct ieee80211_supported_band
*sband
;
592 sband
= ieee80211_get_sband(sdata
);
596 he_cap
= ieee80211_get_he_iftype_cap(sband
, NL80211_IFTYPE_MESH_POINT
);
598 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_20_NOHT
||
599 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_5
||
600 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_10
)
603 len
= 2 + 1 + sizeof(struct ieee80211_he_operation
);
604 if (sdata
->vif
.bss_conf
.chanreq
.oper
.chan
->band
== NL80211_BAND_6GHZ
)
605 len
+= sizeof(struct ieee80211_he_6ghz_oper
);
607 if (skb_tailroom(skb
) < len
)
610 pos
= skb_put(skb
, len
);
611 ieee80211_ie_build_he_oper(pos
, &sdata
->vif
.bss_conf
.chanreq
.oper
);
616 int mesh_add_he_6ghz_cap_ie(struct ieee80211_sub_if_data
*sdata
,
619 struct ieee80211_supported_band
*sband
;
620 const struct ieee80211_sband_iftype_data
*iftd
;
622 sband
= ieee80211_get_sband(sdata
);
626 iftd
= ieee80211_get_sband_iftype_data(sband
,
627 NL80211_IFTYPE_MESH_POINT
);
628 /* The device doesn't support HE in mesh mode or at all */
632 ieee80211_put_he_6ghz_cap(skb
, sdata
, sdata
->deflink
.smps_mode
);
636 int mesh_add_eht_cap_ie(struct ieee80211_sub_if_data
*sdata
,
637 struct sk_buff
*skb
, u8 ie_len
)
639 struct ieee80211_supported_band
*sband
;
641 sband
= ieee80211_get_sband(sdata
);
645 if (sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_20_NOHT
||
646 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_5
||
647 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_10
)
650 return ieee80211_put_eht_cap(skb
, sdata
, sband
, NULL
);
653 int mesh_add_eht_oper_ie(struct ieee80211_sub_if_data
*sdata
, struct sk_buff
*skb
)
655 const struct ieee80211_sta_eht_cap
*eht_cap
;
656 struct ieee80211_supported_band
*sband
;
660 sband
= ieee80211_get_sband(sdata
);
664 eht_cap
= ieee80211_get_eht_iftype_cap(sband
, NL80211_IFTYPE_MESH_POINT
);
666 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_20_NOHT
||
667 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_5
||
668 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_10
)
671 len
= 2 + 1 + offsetof(struct ieee80211_eht_operation
, optional
) +
672 offsetof(struct ieee80211_eht_operation_info
, optional
);
674 if (skb_tailroom(skb
) < len
)
677 pos
= skb_put(skb
, len
);
678 ieee80211_ie_build_eht_oper(pos
, &sdata
->vif
.bss_conf
.chanreq
.oper
, eht_cap
);
683 static void ieee80211_mesh_path_timer(struct timer_list
*t
)
685 struct ieee80211_sub_if_data
*sdata
=
686 from_timer(sdata
, t
, u
.mesh
.mesh_path_timer
);
688 wiphy_work_queue(sdata
->local
->hw
.wiphy
, &sdata
->work
);
691 static void ieee80211_mesh_path_root_timer(struct timer_list
*t
)
693 struct ieee80211_sub_if_data
*sdata
=
694 from_timer(sdata
, t
, u
.mesh
.mesh_path_root_timer
);
695 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
697 set_bit(MESH_WORK_ROOT
, &ifmsh
->wrkq_flags
);
699 wiphy_work_queue(sdata
->local
->hw
.wiphy
, &sdata
->work
);
702 void ieee80211_mesh_root_setup(struct ieee80211_if_mesh
*ifmsh
)
704 if (ifmsh
->mshcfg
.dot11MeshHWMPRootMode
> IEEE80211_ROOTMODE_ROOT
)
705 set_bit(MESH_WORK_ROOT
, &ifmsh
->wrkq_flags
);
707 clear_bit(MESH_WORK_ROOT
, &ifmsh
->wrkq_flags
);
708 /* stop running timer */
709 del_timer_sync(&ifmsh
->mesh_path_root_timer
);
714 ieee80211_mesh_update_bss_params(struct ieee80211_sub_if_data
*sdata
,
717 struct ieee80211_supported_band
*sband
;
718 const struct element
*cap
;
719 const struct ieee80211_he_operation
*he_oper
= NULL
;
721 sband
= ieee80211_get_sband(sdata
);
725 if (!ieee80211_get_he_iftype_cap(sband
, NL80211_IFTYPE_MESH_POINT
) ||
726 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_20_NOHT
||
727 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_5
||
728 sdata
->vif
.bss_conf
.chanreq
.oper
.width
== NL80211_CHAN_WIDTH_10
)
731 sdata
->vif
.bss_conf
.he_support
= true;
733 cap
= cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION
, ie
, ie_len
);
734 if (cap
&& cap
->datalen
>= 1 + sizeof(*he_oper
) &&
735 cap
->datalen
>= 1 + ieee80211_he_oper_size(cap
->data
+ 1))
736 he_oper
= (void *)(cap
->data
+ 1);
739 sdata
->vif
.bss_conf
.he_oper
.params
=
740 __le32_to_cpu(he_oper
->he_oper_params
);
742 sdata
->vif
.bss_conf
.eht_support
=
743 !!ieee80211_get_eht_iftype_cap(sband
, NL80211_IFTYPE_MESH_POINT
);
746 bool ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data
*sdata
,
747 struct sk_buff
*skb
, u32 ctrl_flags
)
749 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
750 struct ieee80211_mesh_fast_tx_key key
= {
751 .type
= MESH_FAST_TX_TYPE_LOCAL
753 struct ieee80211_mesh_fast_tx
*entry
;
754 struct ieee80211s_hdr
*meshhdr
;
755 u8 sa
[ETH_ALEN
] __aligned(2);
756 struct tid_ampdu_tx
*tid_tx
;
757 struct sta_info
*sta
;
758 bool copy_sa
= false;
762 if (ctrl_flags
& IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP
)
765 if (ifmsh
->mshcfg
.dot11MeshNolearn
)
768 /* Add support for these cases later */
769 if (ifmsh
->ps_peers_light_sleep
|| ifmsh
->ps_peers_deep_sleep
)
772 if (is_multicast_ether_addr(skb
->data
))
775 ethertype
= (skb
->data
[12] << 8) | skb
->data
[13];
776 if (ethertype
< ETH_P_802_3_MIN
)
779 if (skb
->sk
&& skb_shinfo(skb
)->tx_flags
& SKBTX_WIFI_STATUS
)
782 if (skb
->ip_summed
== CHECKSUM_PARTIAL
) {
783 skb_set_transport_header(skb
, skb_checksum_start_offset(skb
));
784 if (skb_checksum_help(skb
))
788 ether_addr_copy(key
.addr
, skb
->data
);
789 if (!ether_addr_equal(skb
->data
+ ETH_ALEN
, sdata
->vif
.addr
))
790 key
.type
= MESH_FAST_TX_TYPE_PROXIED
;
791 entry
= mesh_fast_tx_get(sdata
, &key
);
795 if (skb_headroom(skb
) < entry
->hdrlen
+ entry
->fast_tx
.hdr_len
)
798 sta
= rcu_dereference(entry
->mpath
->next_hop
);
802 tid
= skb
->priority
& IEEE80211_QOS_CTL_TAG1D_MASK
;
803 tid_tx
= rcu_dereference(sta
->ampdu_mlme
.tid_tx
[tid
]);
805 if (!test_bit(HT_AGG_STATE_OPERATIONAL
, &tid_tx
->state
))
808 tid_tx
->last_tx
= jiffies
;
811 skb
= skb_share_check(skb
, GFP_ATOMIC
);
815 skb_set_queue_mapping(skb
, ieee80211_select_queue(sdata
, sta
, skb
));
817 meshhdr
= (struct ieee80211s_hdr
*)entry
->hdr
;
818 if ((meshhdr
->flags
& MESH_FLAGS_AE
) == MESH_FLAGS_AE_A5_A6
) {
819 /* preserve SA from eth header for 6-addr frames */
820 ether_addr_copy(sa
, skb
->data
+ ETH_ALEN
);
824 memcpy(skb_push(skb
, entry
->hdrlen
- 2 * ETH_ALEN
), entry
->hdr
,
827 meshhdr
= (struct ieee80211s_hdr
*)skb
->data
;
828 put_unaligned_le32(atomic_inc_return(&sdata
->u
.mesh
.mesh_seqnum
),
830 meshhdr
->ttl
= sdata
->u
.mesh
.mshcfg
.dot11MeshTTL
;
832 ether_addr_copy(meshhdr
->eaddr2
, sa
);
834 skb_push(skb
, 2 * ETH_ALEN
);
835 __ieee80211_xmit_fast(sdata
, sta
, &entry
->fast_tx
, skb
, tid_tx
,
836 entry
->mpath
->dst
, sdata
->vif
.addr
);
842 * ieee80211_fill_mesh_addresses - fill addresses of a locally originated mesh frame
843 * @hdr: 802.11 frame header
844 * @fc: frame control field
845 * @meshda: destination address in the mesh
846 * @meshsa: source address in the mesh. Same as TA, as frame is
847 * locally originated.
849 * Returns: the length of the 802.11 frame header (excludes mesh control header)
851 int ieee80211_fill_mesh_addresses(struct ieee80211_hdr
*hdr
, __le16
*fc
,
852 const u8
*meshda
, const u8
*meshsa
)
854 if (is_multicast_ether_addr(meshda
)) {
855 *fc
|= cpu_to_le16(IEEE80211_FCTL_FROMDS
);
857 memcpy(hdr
->addr1
, meshda
, ETH_ALEN
);
858 memcpy(hdr
->addr2
, meshsa
, ETH_ALEN
);
859 memcpy(hdr
->addr3
, meshsa
, ETH_ALEN
);
862 *fc
|= cpu_to_le16(IEEE80211_FCTL_FROMDS
| IEEE80211_FCTL_TODS
);
864 eth_zero_addr(hdr
->addr1
); /* RA is resolved later */
865 memcpy(hdr
->addr2
, meshsa
, ETH_ALEN
);
866 memcpy(hdr
->addr3
, meshda
, ETH_ALEN
);
867 memcpy(hdr
->addr4
, meshsa
, ETH_ALEN
);
873 * ieee80211_new_mesh_header - create a new mesh header
874 * @sdata: mesh interface to be used
875 * @meshhdr: uninitialized mesh header
876 * @addr4or5: 1st address in the ae header, which may correspond to address 4
877 * (if addr6 is NULL) or address 5 (if addr6 is present). It may
879 * @addr6: 2nd address in the ae header, which corresponds to addr6 of the
882 * Returns: the header length
884 unsigned int ieee80211_new_mesh_header(struct ieee80211_sub_if_data
*sdata
,
885 struct ieee80211s_hdr
*meshhdr
,
886 const char *addr4or5
, const char *addr6
)
888 if (WARN_ON(!addr4or5
&& addr6
))
891 memset(meshhdr
, 0, sizeof(*meshhdr
));
893 meshhdr
->ttl
= sdata
->u
.mesh
.mshcfg
.dot11MeshTTL
;
895 put_unaligned_le32(atomic_inc_return(&sdata
->u
.mesh
.mesh_seqnum
),
897 if (addr4or5
&& !addr6
) {
898 meshhdr
->flags
|= MESH_FLAGS_AE_A4
;
899 memcpy(meshhdr
->eaddr1
, addr4or5
, ETH_ALEN
);
901 } else if (addr4or5
&& addr6
) {
902 meshhdr
->flags
|= MESH_FLAGS_AE_A5_A6
;
903 memcpy(meshhdr
->eaddr1
, addr4or5
, ETH_ALEN
);
904 memcpy(meshhdr
->eaddr2
, addr6
, ETH_ALEN
);
911 static void ieee80211_mesh_housekeeping(struct ieee80211_sub_if_data
*sdata
)
913 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
916 if (ifmsh
->mshcfg
.plink_timeout
> 0)
917 ieee80211_sta_expire(sdata
, ifmsh
->mshcfg
.plink_timeout
* HZ
);
918 mesh_path_expire(sdata
);
920 changed
= mesh_accept_plinks_update(sdata
);
921 ieee80211_mbss_info_change_notify(sdata
, changed
);
923 mesh_fast_tx_gc(sdata
);
925 mod_timer(&ifmsh
->housekeeping_timer
,
926 round_jiffies(jiffies
+
927 IEEE80211_MESH_HOUSEKEEPING_INTERVAL
));
930 static void ieee80211_mesh_rootpath(struct ieee80211_sub_if_data
*sdata
)
932 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
935 mesh_path_tx_root_frame(sdata
);
937 if (ifmsh
->mshcfg
.dot11MeshHWMPRootMode
== IEEE80211_PROACTIVE_RANN
)
938 interval
= ifmsh
->mshcfg
.dot11MeshHWMPRannInterval
;
940 interval
= ifmsh
->mshcfg
.dot11MeshHWMProotInterval
;
942 mod_timer(&ifmsh
->mesh_path_root_timer
,
943 round_jiffies(TU_TO_EXP_TIME(interval
)));
947 ieee80211_mesh_build_beacon(struct ieee80211_if_mesh
*ifmsh
)
949 struct beacon_data
*bcn
;
950 int head_len
, tail_len
;
952 struct ieee80211_mgmt
*mgmt
;
953 struct mesh_csa_settings
*csa
;
954 const struct ieee80211_supported_band
*sband
;
955 u8 ie_len_he_cap
, ie_len_eht_cap
;
957 struct ieee80211_sub_if_data
*sdata
;
958 int hdr_len
= offsetofend(struct ieee80211_mgmt
, u
.beacon
);
961 sdata
= container_of(ifmsh
, struct ieee80211_sub_if_data
, u
.mesh
);
963 sband
= ieee80211_get_sband(sdata
);
965 ieee80211_chandef_rate_flags(&sdata
->vif
.bss_conf
.chanreq
.oper
);
967 ie_len_he_cap
= ieee80211_ie_len_he_cap(sdata
);
968 ie_len_eht_cap
= ieee80211_ie_len_eht_cap(sdata
);
971 /* Channel Switch Announcement */
972 2 + sizeof(struct ieee80211_channel_sw_ie
) +
973 /* Mesh Channel Switch Parameters */
974 2 + sizeof(struct ieee80211_mesh_chansw_params_ie
) +
975 /* Channel Switch Wrapper + Wide Bandwidth CSA IE */
976 2 + 2 + sizeof(struct ieee80211_wide_bw_chansw_ie
) +
977 2 + sizeof(struct ieee80211_sec_chan_offs_ie
) +
978 2 + 8 + /* supported rates */
979 2 + 3; /* DS params */
980 tail_len
= 2 + (IEEE80211_MAX_SUPP_RATES
- 8) +
981 2 + sizeof(struct ieee80211_ht_cap
) +
982 2 + sizeof(struct ieee80211_ht_operation
) +
983 2 + ifmsh
->mesh_id_len
+
984 2 + sizeof(struct ieee80211_meshconf_ie
) +
985 2 + sizeof(__le16
) + /* awake window */
986 2 + sizeof(struct ieee80211_vht_cap
) +
987 2 + sizeof(struct ieee80211_vht_operation
) +
989 2 + 1 + sizeof(struct ieee80211_he_operation
) +
990 sizeof(struct ieee80211_he_6ghz_oper
) +
991 2 + 1 + sizeof(struct ieee80211_he_6ghz_capa
) +
993 2 + 1 + offsetof(struct ieee80211_eht_operation
, optional
) +
994 offsetof(struct ieee80211_eht_operation_info
, optional
) +
997 bcn
= kzalloc(sizeof(*bcn
) + head_len
+ tail_len
, GFP_KERNEL
);
998 /* need an skb for IE builders to operate on */
999 skb
= __dev_alloc_skb(max(head_len
, tail_len
), GFP_KERNEL
);
1005 * pointers go into the block we allocated,
1006 * memory is | beacon_data | head | tail |
1008 bcn
->head
= ((u8
*) bcn
) + sizeof(*bcn
);
1010 /* fill in the head */
1011 mgmt
= skb_put_zero(skb
, hdr_len
);
1012 mgmt
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_MGMT
|
1013 IEEE80211_STYPE_BEACON
);
1014 eth_broadcast_addr(mgmt
->da
);
1015 memcpy(mgmt
->sa
, sdata
->vif
.addr
, ETH_ALEN
);
1016 memcpy(mgmt
->bssid
, sdata
->vif
.addr
, ETH_ALEN
);
1017 ieee80211_mps_set_frame_flags(sdata
, NULL
, (void *) mgmt
);
1018 mgmt
->u
.beacon
.beacon_int
=
1019 cpu_to_le16(sdata
->vif
.bss_conf
.beacon_int
);
1020 mgmt
->u
.beacon
.capab_info
|= cpu_to_le16(
1021 sdata
->u
.mesh
.security
? WLAN_CAPABILITY_PRIVACY
: 0);
1023 pos
= skb_put(skb
, 2);
1024 *pos
++ = WLAN_EID_SSID
;
1028 csa
= rcu_dereference(ifmsh
->csa
);
1030 enum nl80211_channel_type ct
;
1031 struct cfg80211_chan_def
*chandef
;
1032 int ie_len
= 2 + sizeof(struct ieee80211_channel_sw_ie
) +
1033 2 + sizeof(struct ieee80211_mesh_chansw_params_ie
);
1035 pos
= skb_put_zero(skb
, ie_len
);
1036 *pos
++ = WLAN_EID_CHANNEL_SWITCH
;
1039 *pos
++ = ieee80211_frequency_to_channel(
1040 csa
->settings
.chandef
.chan
->center_freq
);
1041 bcn
->cntdwn_current_counter
= csa
->settings
.count
;
1042 bcn
->cntdwn_counter_offsets
[0] = hdr_len
+ 6;
1043 *pos
++ = csa
->settings
.count
;
1044 *pos
++ = WLAN_EID_CHAN_SWITCH_PARAM
;
1046 if (ifmsh
->csa_role
== IEEE80211_MESH_CSA_ROLE_INIT
) {
1047 *pos
++ = ifmsh
->mshcfg
.dot11MeshTTL
;
1048 *pos
|= WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR
;
1050 *pos
++ = ifmsh
->chsw_ttl
;
1052 *pos
++ |= csa
->settings
.block_tx
?
1053 WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT
: 0x00;
1054 put_unaligned_le16(WLAN_REASON_MESH_CHAN
, pos
);
1056 put_unaligned_le16(ifmsh
->pre_value
, pos
);
1059 switch (csa
->settings
.chandef
.width
) {
1060 case NL80211_CHAN_WIDTH_40
:
1061 ie_len
= 2 + sizeof(struct ieee80211_sec_chan_offs_ie
);
1062 pos
= skb_put_zero(skb
, ie_len
);
1064 *pos
++ = WLAN_EID_SECONDARY_CHANNEL_OFFSET
; /* EID */
1065 *pos
++ = 1; /* len */
1066 ct
= cfg80211_get_chandef_type(&csa
->settings
.chandef
);
1067 if (ct
== NL80211_CHAN_HT40PLUS
)
1068 *pos
++ = IEEE80211_HT_PARAM_CHA_SEC_ABOVE
;
1070 *pos
++ = IEEE80211_HT_PARAM_CHA_SEC_BELOW
;
1072 case NL80211_CHAN_WIDTH_80
:
1073 case NL80211_CHAN_WIDTH_80P80
:
1074 case NL80211_CHAN_WIDTH_160
:
1075 /* Channel Switch Wrapper + Wide Bandwidth CSA IE */
1077 sizeof(struct ieee80211_wide_bw_chansw_ie
);
1078 pos
= skb_put_zero(skb
, ie_len
);
1080 *pos
++ = WLAN_EID_CHANNEL_SWITCH_WRAPPER
; /* EID */
1081 *pos
++ = 5; /* len */
1083 chandef
= &csa
->settings
.chandef
;
1084 ieee80211_ie_build_wide_bw_cs(pos
, chandef
);
1092 if (ieee80211_put_srates_elem(skb
, sband
,
1093 sdata
->vif
.bss_conf
.basic_rates
,
1094 rate_flags
, 0, WLAN_EID_SUPP_RATES
) ||
1095 mesh_add_ds_params_ie(sdata
, skb
))
1098 bcn
->head_len
= skb
->len
;
1099 memcpy(bcn
->head
, skb
->data
, bcn
->head_len
);
1103 bcn
->tail
= bcn
->head
+ bcn
->head_len
;
1105 if (ieee80211_put_srates_elem(skb
, sband
,
1106 sdata
->vif
.bss_conf
.basic_rates
,
1107 rate_flags
, 0, WLAN_EID_EXT_SUPP_RATES
) ||
1108 mesh_add_rsn_ie(sdata
, skb
) ||
1109 mesh_add_ht_cap_ie(sdata
, skb
) ||
1110 mesh_add_ht_oper_ie(sdata
, skb
) ||
1111 mesh_add_meshid_ie(sdata
, skb
) ||
1112 mesh_add_meshconf_ie(sdata
, skb
) ||
1113 mesh_add_awake_window_ie(sdata
, skb
) ||
1114 mesh_add_vht_cap_ie(sdata
, skb
) ||
1115 mesh_add_vht_oper_ie(sdata
, skb
) ||
1116 mesh_add_he_cap_ie(sdata
, skb
, ie_len_he_cap
) ||
1117 mesh_add_he_oper_ie(sdata
, skb
) ||
1118 mesh_add_he_6ghz_cap_ie(sdata
, skb
) ||
1119 mesh_add_eht_cap_ie(sdata
, skb
, ie_len_eht_cap
) ||
1120 mesh_add_eht_oper_ie(sdata
, skb
) ||
1121 mesh_add_vendor_ies(sdata
, skb
))
1124 bcn
->tail_len
= skb
->len
;
1125 memcpy(bcn
->tail
, skb
->data
, bcn
->tail_len
);
1126 ieee80211_mesh_update_bss_params(sdata
, bcn
->tail
, bcn
->tail_len
);
1127 bcn
->meshconf
= (struct ieee80211_meshconf_ie
*)
1128 (bcn
->tail
+ ifmsh
->meshconf_offset
);
1131 rcu_assign_pointer(ifmsh
->beacon
, bcn
);
1140 ieee80211_mesh_rebuild_beacon(struct ieee80211_sub_if_data
*sdata
)
1142 struct beacon_data
*old_bcn
;
1145 old_bcn
= sdata_dereference(sdata
->u
.mesh
.beacon
, sdata
);
1146 ret
= ieee80211_mesh_build_beacon(&sdata
->u
.mesh
);
1148 /* just reuse old beacon */
1152 kfree_rcu(old_bcn
, rcu_head
);
1156 void ieee80211_mbss_info_change_notify(struct ieee80211_sub_if_data
*sdata
,
1159 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
1160 unsigned long bits
= changed
;
1166 /* if we race with running work, worst case this work becomes a noop */
1167 for_each_set_bit(bit
, &bits
, sizeof(changed
) * BITS_PER_BYTE
)
1168 set_bit(bit
, ifmsh
->mbss_changed
);
1169 set_bit(MESH_WORK_MBSS_CHANGED
, &ifmsh
->wrkq_flags
);
1170 wiphy_work_queue(sdata
->local
->hw
.wiphy
, &sdata
->work
);
1173 int ieee80211_start_mesh(struct ieee80211_sub_if_data
*sdata
)
1175 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
1176 struct ieee80211_local
*local
= sdata
->local
;
1177 u64 changed
= BSS_CHANGED_BEACON
|
1178 BSS_CHANGED_BEACON_ENABLED
|
1180 BSS_CHANGED_BASIC_RATES
|
1181 BSS_CHANGED_BEACON_INT
|
1182 BSS_CHANGED_MCAST_RATE
;
1184 local
->fif_other_bss
++;
1185 /* mesh ifaces must set allmulti to forward mcast traffic */
1186 atomic_inc(&local
->iff_allmultis
);
1187 ieee80211_configure_filter(local
);
1189 ifmsh
->mesh_cc_id
= 0; /* Disabled */
1190 /* register sync ops from extensible synchronization framework */
1191 ifmsh
->sync_ops
= ieee80211_mesh_sync_ops_get(ifmsh
->mesh_sp_id
);
1192 ifmsh
->sync_offset_clockdrift_max
= 0;
1193 set_bit(MESH_WORK_HOUSEKEEPING
, &ifmsh
->wrkq_flags
);
1194 ieee80211_mesh_root_setup(ifmsh
);
1195 wiphy_work_queue(local
->hw
.wiphy
, &sdata
->work
);
1196 sdata
->vif
.bss_conf
.ht_operation_mode
=
1197 ifmsh
->mshcfg
.ht_opmode
;
1198 sdata
->vif
.bss_conf
.enable_beacon
= true;
1200 changed
|= ieee80211_mps_local_status_update(sdata
);
1202 if (ieee80211_mesh_build_beacon(ifmsh
)) {
1203 ieee80211_stop_mesh(sdata
);
1207 ieee80211_recalc_dtim(local
, sdata
);
1208 ieee80211_link_info_change_notify(sdata
, &sdata
->deflink
, changed
);
1210 netif_carrier_on(sdata
->dev
);
1214 void ieee80211_stop_mesh(struct ieee80211_sub_if_data
*sdata
)
1216 struct ieee80211_local
*local
= sdata
->local
;
1217 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
1218 struct beacon_data
*bcn
;
1220 netif_carrier_off(sdata
->dev
);
1222 /* flush STAs and mpaths on this iface */
1223 sta_info_flush(sdata
, -1);
1224 ieee80211_free_keys(sdata
, true);
1225 mesh_path_flush_by_iface(sdata
);
1227 /* stop the beacon */
1228 ifmsh
->mesh_id_len
= 0;
1229 sdata
->vif
.bss_conf
.enable_beacon
= false;
1230 sdata
->beacon_rate_set
= false;
1231 clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED
, &sdata
->state
);
1232 ieee80211_link_info_change_notify(sdata
, &sdata
->deflink
,
1233 BSS_CHANGED_BEACON_ENABLED
);
1236 bcn
= sdata_dereference(ifmsh
->beacon
, sdata
);
1237 RCU_INIT_POINTER(ifmsh
->beacon
, NULL
);
1238 kfree_rcu(bcn
, rcu_head
);
1240 /* free all potentially still buffered group-addressed frames */
1241 local
->total_ps_buffered
-= skb_queue_len(&ifmsh
->ps
.bc_buf
);
1242 skb_queue_purge(&ifmsh
->ps
.bc_buf
);
1244 del_timer_sync(&sdata
->u
.mesh
.housekeeping_timer
);
1245 del_timer_sync(&sdata
->u
.mesh
.mesh_path_root_timer
);
1246 del_timer_sync(&sdata
->u
.mesh
.mesh_path_timer
);
1248 /* clear any mesh work (for next join) we may have accrued */
1249 ifmsh
->wrkq_flags
= 0;
1250 memset(ifmsh
->mbss_changed
, 0, sizeof(ifmsh
->mbss_changed
));
1252 local
->fif_other_bss
--;
1253 atomic_dec(&local
->iff_allmultis
);
1254 ieee80211_configure_filter(local
);
1257 static void ieee80211_mesh_csa_mark_radar(struct ieee80211_sub_if_data
*sdata
)
1261 /* if the current channel is a DFS channel, mark the channel as
1264 err
= cfg80211_chandef_dfs_required(sdata
->local
->hw
.wiphy
,
1265 &sdata
->vif
.bss_conf
.chanreq
.oper
,
1266 NL80211_IFTYPE_MESH_POINT
);
1268 cfg80211_radar_event(sdata
->local
->hw
.wiphy
,
1269 &sdata
->vif
.bss_conf
.chanreq
.oper
,
1274 ieee80211_mesh_process_chnswitch(struct ieee80211_sub_if_data
*sdata
,
1275 struct ieee802_11_elems
*elems
, bool beacon
)
1277 struct cfg80211_csa_settings params
;
1278 struct ieee80211_csa_ie csa_ie
;
1279 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
1280 struct ieee80211_supported_band
*sband
;
1282 struct ieee80211_conn_settings conn
= ieee80211_conn_settings_unlimited
;
1283 u32 vht_cap_info
= 0;
1285 lockdep_assert_wiphy(sdata
->local
->hw
.wiphy
);
1287 sband
= ieee80211_get_sband(sdata
);
1291 switch (sdata
->vif
.bss_conf
.chanreq
.oper
.width
) {
1292 case NL80211_CHAN_WIDTH_20_NOHT
:
1293 conn
.mode
= IEEE80211_CONN_MODE_LEGACY
;
1294 conn
.bw_limit
= IEEE80211_CONN_BW_LIMIT_20
;
1296 case NL80211_CHAN_WIDTH_20
:
1297 conn
.mode
= IEEE80211_CONN_MODE_HT
;
1298 conn
.bw_limit
= IEEE80211_CONN_BW_LIMIT_20
;
1300 case NL80211_CHAN_WIDTH_40
:
1301 conn
.mode
= IEEE80211_CONN_MODE_HT
;
1302 conn
.bw_limit
= IEEE80211_CONN_BW_LIMIT_40
;
1308 if (elems
->vht_cap_elem
)
1310 le32_to_cpu(elems
->vht_cap_elem
->vht_cap_info
);
1312 memset(¶ms
, 0, sizeof(params
));
1313 err
= ieee80211_parse_ch_switch_ie(sdata
, elems
, sband
->band
,
1314 vht_cap_info
, &conn
,
1315 sdata
->vif
.addr
, false,
1322 /* Mark the channel unavailable if the reason for the switch is
1325 if (csa_ie
.reason_code
== WLAN_REASON_MESH_CHAN_REGULATORY
)
1326 ieee80211_mesh_csa_mark_radar(sdata
);
1328 params
.chandef
= csa_ie
.chanreq
.oper
;
1329 params
.count
= csa_ie
.count
;
1331 if (!cfg80211_chandef_usable(sdata
->local
->hw
.wiphy
, ¶ms
.chandef
,
1332 IEEE80211_CHAN_DISABLED
) ||
1333 !cfg80211_reg_can_beacon(sdata
->local
->hw
.wiphy
, ¶ms
.chandef
,
1334 NL80211_IFTYPE_MESH_POINT
)) {
1336 "mesh STA %pM switches to unsupported channel (%d MHz, width:%d, CF1/2: %d/%d MHz), aborting\n",
1338 params
.chandef
.chan
->center_freq
,
1339 params
.chandef
.width
,
1340 params
.chandef
.center_freq1
,
1341 params
.chandef
.center_freq2
);
1345 err
= cfg80211_chandef_dfs_required(sdata
->local
->hw
.wiphy
,
1347 NL80211_IFTYPE_MESH_POINT
);
1350 if (err
> 0 && !ifmsh
->userspace_handles_dfs
) {
1352 "mesh STA %pM switches to channel requiring DFS (%d MHz, width:%d, CF1/2: %d/%d MHz), aborting\n",
1354 params
.chandef
.chan
->center_freq
,
1355 params
.chandef
.width
,
1356 params
.chandef
.center_freq1
,
1357 params
.chandef
.center_freq2
);
1361 params
.radar_required
= err
;
1363 if (cfg80211_chandef_identical(¶ms
.chandef
,
1364 &sdata
->vif
.bss_conf
.chanreq
.oper
)) {
1366 "received csa with an identical chandef, ignoring\n");
1371 "received channel switch announcement to go to channel %d MHz\n",
1372 params
.chandef
.chan
->center_freq
);
1374 params
.block_tx
= csa_ie
.mode
& WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT
;
1376 ifmsh
->chsw_ttl
= csa_ie
.ttl
- 1;
1377 if (ifmsh
->pre_value
>= csa_ie
.pre_value
)
1379 ifmsh
->pre_value
= csa_ie
.pre_value
;
1382 if (ifmsh
->chsw_ttl
>= ifmsh
->mshcfg
.dot11MeshTTL
)
1385 ifmsh
->csa_role
= IEEE80211_MESH_CSA_ROLE_REPEATER
;
1387 if (ieee80211_channel_switch(sdata
->local
->hw
.wiphy
, sdata
->dev
,
1395 ieee80211_mesh_rx_probe_req(struct ieee80211_sub_if_data
*sdata
,
1396 struct ieee80211_mgmt
*mgmt
, size_t len
)
1398 struct ieee80211_local
*local
= sdata
->local
;
1399 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
1400 struct sk_buff
*presp
;
1401 struct beacon_data
*bcn
;
1402 struct ieee80211_mgmt
*hdr
;
1403 struct ieee802_11_elems
*elems
;
1407 pos
= mgmt
->u
.probe_req
.variable
;
1408 baselen
= (u8
*) pos
- (u8
*) mgmt
;
1412 elems
= ieee802_11_parse_elems(pos
, len
- baselen
, false, NULL
);
1416 if (!elems
->mesh_id
)
1419 /* 802.11-2012 10.1.4.3.2 */
1420 if ((!ether_addr_equal(mgmt
->da
, sdata
->vif
.addr
) &&
1421 !is_broadcast_ether_addr(mgmt
->da
)) ||
1422 elems
->ssid_len
!= 0)
1425 if (elems
->mesh_id_len
!= 0 &&
1426 (elems
->mesh_id_len
!= ifmsh
->mesh_id_len
||
1427 memcmp(elems
->mesh_id
, ifmsh
->mesh_id
, ifmsh
->mesh_id_len
)))
1431 bcn
= rcu_dereference(ifmsh
->beacon
);
1436 presp
= dev_alloc_skb(local
->tx_headroom
+
1437 bcn
->head_len
+ bcn
->tail_len
);
1441 skb_reserve(presp
, local
->tx_headroom
);
1442 skb_put_data(presp
, bcn
->head
, bcn
->head_len
);
1443 skb_put_data(presp
, bcn
->tail
, bcn
->tail_len
);
1444 hdr
= (struct ieee80211_mgmt
*) presp
->data
;
1445 hdr
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_MGMT
|
1446 IEEE80211_STYPE_PROBE_RESP
);
1447 memcpy(hdr
->da
, mgmt
->sa
, ETH_ALEN
);
1448 IEEE80211_SKB_CB(presp
)->flags
|= IEEE80211_TX_INTFL_DONT_ENCRYPT
;
1449 ieee80211_tx_skb(sdata
, presp
);
1456 static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data
*sdata
,
1458 struct ieee80211_mgmt
*mgmt
,
1460 struct ieee80211_rx_status
*rx_status
)
1462 struct ieee80211_local
*local
= sdata
->local
;
1463 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
1464 struct ieee802_11_elems
*elems
;
1465 struct ieee80211_channel
*channel
;
1468 enum nl80211_band band
= rx_status
->band
;
1470 /* ignore ProbeResp to foreign address */
1471 if (stype
== IEEE80211_STYPE_PROBE_RESP
&&
1472 !ether_addr_equal(mgmt
->da
, sdata
->vif
.addr
))
1475 baselen
= (u8
*) mgmt
->u
.probe_resp
.variable
- (u8
*) mgmt
;
1479 elems
= ieee802_11_parse_elems(mgmt
->u
.probe_resp
.variable
,
1485 /* ignore non-mesh or secure / unsecure mismatch */
1486 if ((!elems
->mesh_id
|| !elems
->mesh_config
) ||
1487 (elems
->rsn
&& sdata
->u
.mesh
.security
== IEEE80211_MESH_SEC_NONE
) ||
1488 (!elems
->rsn
&& sdata
->u
.mesh
.security
!= IEEE80211_MESH_SEC_NONE
))
1491 if (elems
->ds_params
)
1492 freq
= ieee80211_channel_to_frequency(elems
->ds_params
[0], band
);
1494 freq
= rx_status
->freq
;
1496 channel
= ieee80211_get_channel(local
->hw
.wiphy
, freq
);
1498 if (!channel
|| channel
->flags
& IEEE80211_CHAN_DISABLED
)
1501 if (mesh_matches_local(sdata
, elems
)) {
1502 mpl_dbg(sdata
, "rssi_threshold=%d,rx_status->signal=%d\n",
1503 sdata
->u
.mesh
.mshcfg
.rssi_threshold
, rx_status
->signal
);
1504 if (!sdata
->u
.mesh
.user_mpm
||
1505 sdata
->u
.mesh
.mshcfg
.rssi_threshold
== 0 ||
1506 sdata
->u
.mesh
.mshcfg
.rssi_threshold
< rx_status
->signal
)
1507 mesh_neighbour_update(sdata
, mgmt
->sa
, elems
,
1510 if (ifmsh
->csa_role
!= IEEE80211_MESH_CSA_ROLE_INIT
&&
1511 !sdata
->vif
.bss_conf
.csa_active
)
1512 ieee80211_mesh_process_chnswitch(sdata
, elems
, true);
1515 if (ifmsh
->sync_ops
)
1516 ifmsh
->sync_ops
->rx_bcn_presp(sdata
, stype
, mgmt
, len
,
1517 elems
->mesh_config
, rx_status
);
1522 int ieee80211_mesh_finish_csa(struct ieee80211_sub_if_data
*sdata
, u64
*changed
)
1524 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
1525 struct mesh_csa_settings
*tmp_csa_settings
;
1528 /* Reset the TTL value and Initiator flag */
1529 ifmsh
->csa_role
= IEEE80211_MESH_CSA_ROLE_NONE
;
1530 ifmsh
->chsw_ttl
= 0;
1532 /* Remove the CSA and MCSP elements from the beacon */
1533 tmp_csa_settings
= sdata_dereference(ifmsh
->csa
, sdata
);
1534 RCU_INIT_POINTER(ifmsh
->csa
, NULL
);
1535 if (tmp_csa_settings
)
1536 kfree_rcu(tmp_csa_settings
, rcu_head
);
1537 ret
= ieee80211_mesh_rebuild_beacon(sdata
);
1541 *changed
|= BSS_CHANGED_BEACON
;
1543 mcsa_dbg(sdata
, "complete switching to center freq %d MHz",
1544 sdata
->vif
.bss_conf
.chanreq
.oper
.chan
->center_freq
);
1548 int ieee80211_mesh_csa_beacon(struct ieee80211_sub_if_data
*sdata
,
1549 struct cfg80211_csa_settings
*csa_settings
,
1552 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
1553 struct mesh_csa_settings
*tmp_csa_settings
;
1556 lockdep_assert_wiphy(sdata
->local
->hw
.wiphy
);
1558 tmp_csa_settings
= kmalloc(sizeof(*tmp_csa_settings
),
1560 if (!tmp_csa_settings
)
1563 memcpy(&tmp_csa_settings
->settings
, csa_settings
,
1564 sizeof(struct cfg80211_csa_settings
));
1566 rcu_assign_pointer(ifmsh
->csa
, tmp_csa_settings
);
1568 ret
= ieee80211_mesh_rebuild_beacon(sdata
);
1570 tmp_csa_settings
= rcu_dereference(ifmsh
->csa
);
1571 RCU_INIT_POINTER(ifmsh
->csa
, NULL
);
1572 kfree_rcu(tmp_csa_settings
, rcu_head
);
1576 *changed
|= BSS_CHANGED_BEACON
;
1580 static int mesh_fwd_csa_frame(struct ieee80211_sub_if_data
*sdata
,
1581 struct ieee80211_mgmt
*mgmt
, size_t len
,
1582 struct ieee802_11_elems
*elems
)
1584 struct ieee80211_mgmt
*mgmt_fwd
;
1585 struct sk_buff
*skb
;
1586 struct ieee80211_local
*local
= sdata
->local
;
1588 skb
= dev_alloc_skb(local
->tx_headroom
+ len
);
1591 skb_reserve(skb
, local
->tx_headroom
);
1592 mgmt_fwd
= skb_put(skb
, len
);
1594 elems
->mesh_chansw_params_ie
->mesh_ttl
--;
1595 elems
->mesh_chansw_params_ie
->mesh_flags
&=
1596 ~WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR
;
1598 memcpy(mgmt_fwd
, mgmt
, len
);
1599 eth_broadcast_addr(mgmt_fwd
->da
);
1600 memcpy(mgmt_fwd
->sa
, sdata
->vif
.addr
, ETH_ALEN
);
1601 memcpy(mgmt_fwd
->bssid
, sdata
->vif
.addr
, ETH_ALEN
);
1603 ieee80211_tx_skb(sdata
, skb
);
1607 static void mesh_rx_csa_frame(struct ieee80211_sub_if_data
*sdata
,
1608 struct ieee80211_mgmt
*mgmt
, size_t len
)
1610 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
1611 struct ieee802_11_elems
*elems
;
1613 bool fwd_csa
= true;
1617 if (mgmt
->u
.action
.u
.measurement
.action_code
!=
1618 WLAN_ACTION_SPCT_CHL_SWITCH
)
1621 pos
= mgmt
->u
.action
.u
.chan_switch
.variable
;
1622 baselen
= offsetof(struct ieee80211_mgmt
,
1623 u
.action
.u
.chan_switch
.variable
);
1624 elems
= ieee802_11_parse_elems(pos
, len
- baselen
, true, NULL
);
1628 if (!mesh_matches_local(sdata
, elems
))
1631 ifmsh
->chsw_ttl
= elems
->mesh_chansw_params_ie
->mesh_ttl
;
1632 if (!--ifmsh
->chsw_ttl
)
1635 pre_value
= le16_to_cpu(elems
->mesh_chansw_params_ie
->mesh_pre_value
);
1636 if (ifmsh
->pre_value
>= pre_value
)
1639 ifmsh
->pre_value
= pre_value
;
1641 if (!sdata
->vif
.bss_conf
.csa_active
&&
1642 !ieee80211_mesh_process_chnswitch(sdata
, elems
, false)) {
1643 mcsa_dbg(sdata
, "Failed to process CSA action frame");
1647 /* forward or re-broadcast the CSA frame */
1649 if (mesh_fwd_csa_frame(sdata
, mgmt
, len
, elems
) < 0)
1650 mcsa_dbg(sdata
, "Failed to forward the CSA frame");
1656 static void ieee80211_mesh_rx_mgmt_action(struct ieee80211_sub_if_data
*sdata
,
1657 struct ieee80211_mgmt
*mgmt
,
1659 struct ieee80211_rx_status
*rx_status
)
1661 switch (mgmt
->u
.action
.category
) {
1662 case WLAN_CATEGORY_SELF_PROTECTED
:
1663 switch (mgmt
->u
.action
.u
.self_prot
.action_code
) {
1664 case WLAN_SP_MESH_PEERING_OPEN
:
1665 case WLAN_SP_MESH_PEERING_CLOSE
:
1666 case WLAN_SP_MESH_PEERING_CONFIRM
:
1667 mesh_rx_plink_frame(sdata
, mgmt
, len
, rx_status
);
1671 case WLAN_CATEGORY_MESH_ACTION
:
1672 if (mesh_action_is_path_sel(mgmt
))
1673 mesh_rx_path_sel_frame(sdata
, mgmt
, len
);
1675 case WLAN_CATEGORY_SPECTRUM_MGMT
:
1676 mesh_rx_csa_frame(sdata
, mgmt
, len
);
1681 void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data
*sdata
,
1682 struct sk_buff
*skb
)
1684 struct ieee80211_rx_status
*rx_status
;
1685 struct ieee80211_mgmt
*mgmt
;
1688 lockdep_assert_wiphy(sdata
->local
->hw
.wiphy
);
1690 /* mesh already went down */
1691 if (!sdata
->u
.mesh
.mesh_id_len
)
1694 rx_status
= IEEE80211_SKB_RXCB(skb
);
1695 mgmt
= (struct ieee80211_mgmt
*) skb
->data
;
1696 stype
= le16_to_cpu(mgmt
->frame_control
) & IEEE80211_FCTL_STYPE
;
1699 case IEEE80211_STYPE_PROBE_RESP
:
1700 case IEEE80211_STYPE_BEACON
:
1701 ieee80211_mesh_rx_bcn_presp(sdata
, stype
, mgmt
, skb
->len
,
1704 case IEEE80211_STYPE_PROBE_REQ
:
1705 ieee80211_mesh_rx_probe_req(sdata
, mgmt
, skb
->len
);
1707 case IEEE80211_STYPE_ACTION
:
1708 ieee80211_mesh_rx_mgmt_action(sdata
, mgmt
, skb
->len
, rx_status
);
1713 static void mesh_bss_info_changed(struct ieee80211_sub_if_data
*sdata
)
1715 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
1719 for_each_set_bit(bit
, ifmsh
->mbss_changed
,
1720 sizeof(changed
) * BITS_PER_BYTE
) {
1721 clear_bit(bit
, ifmsh
->mbss_changed
);
1722 changed
|= BIT(bit
);
1725 if (sdata
->vif
.bss_conf
.enable_beacon
&&
1726 (changed
& (BSS_CHANGED_BEACON
|
1728 BSS_CHANGED_BASIC_RATES
|
1729 BSS_CHANGED_BEACON_INT
)))
1730 if (ieee80211_mesh_rebuild_beacon(sdata
))
1733 ieee80211_link_info_change_notify(sdata
, &sdata
->deflink
, changed
);
1736 void ieee80211_mesh_work(struct ieee80211_sub_if_data
*sdata
)
1738 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
1740 lockdep_assert_wiphy(sdata
->local
->hw
.wiphy
);
1742 /* mesh already went down */
1743 if (!sdata
->u
.mesh
.mesh_id_len
)
1746 if (ifmsh
->preq_queue_len
&&
1748 ifmsh
->last_preq
+ msecs_to_jiffies(ifmsh
->mshcfg
.dot11MeshHWMPpreqMinInterval
)))
1749 mesh_path_start_discovery(sdata
);
1751 if (test_and_clear_bit(MESH_WORK_HOUSEKEEPING
, &ifmsh
->wrkq_flags
))
1752 ieee80211_mesh_housekeeping(sdata
);
1754 if (test_and_clear_bit(MESH_WORK_ROOT
, &ifmsh
->wrkq_flags
))
1755 ieee80211_mesh_rootpath(sdata
);
1757 if (test_and_clear_bit(MESH_WORK_DRIFT_ADJUST
, &ifmsh
->wrkq_flags
))
1758 mesh_sync_adjust_tsf(sdata
);
1760 if (test_and_clear_bit(MESH_WORK_MBSS_CHANGED
, &ifmsh
->wrkq_flags
))
1761 mesh_bss_info_changed(sdata
);
1765 void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data
*sdata
)
1767 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
1768 static u8 zero_addr
[ETH_ALEN
] = {};
1770 timer_setup(&ifmsh
->housekeeping_timer
,
1771 ieee80211_mesh_housekeeping_timer
, 0);
1773 ifmsh
->accepting_plinks
= true;
1774 atomic_set(&ifmsh
->mpaths
, 0);
1775 mesh_rmc_init(sdata
);
1776 ifmsh
->last_preq
= jiffies
;
1777 ifmsh
->next_perr
= jiffies
;
1778 ifmsh
->csa_role
= IEEE80211_MESH_CSA_ROLE_NONE
;
1779 ifmsh
->nonpeer_pm
= NL80211_MESH_POWER_ACTIVE
;
1780 /* Allocate all mesh structures when creating the first mesh interface. */
1781 if (!mesh_allocated
)
1784 mesh_pathtbl_init(sdata
);
1786 timer_setup(&ifmsh
->mesh_path_timer
, ieee80211_mesh_path_timer
, 0);
1787 timer_setup(&ifmsh
->mesh_path_root_timer
,
1788 ieee80211_mesh_path_root_timer
, 0);
1789 INIT_LIST_HEAD(&ifmsh
->preq_queue
.list
);
1790 skb_queue_head_init(&ifmsh
->ps
.bc_buf
);
1791 spin_lock_init(&ifmsh
->mesh_preq_queue_lock
);
1792 spin_lock_init(&ifmsh
->sync_offset_lock
);
1793 RCU_INIT_POINTER(ifmsh
->beacon
, NULL
);
1795 sdata
->vif
.bss_conf
.bssid
= zero_addr
;
1798 void ieee80211_mesh_teardown_sdata(struct ieee80211_sub_if_data
*sdata
)
1800 mesh_rmc_free(sdata
);
1801 mesh_pathtbl_unregister(sdata
);