Lines Matching refs:sdata
40 struct ieee80211_sub_if_data *sdata = in ieee80211_mesh_housekeeping_timer() local
41 from_timer(sdata, t, u.mesh.housekeeping_timer); in ieee80211_mesh_housekeeping_timer()
42 struct ieee80211_local *local = sdata->local; in ieee80211_mesh_housekeeping_timer()
43 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_housekeeping_timer()
47 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_mesh_housekeeping_timer()
59 bool mesh_matches_local(struct ieee80211_sub_if_data *sdata, in mesh_matches_local() argument
62 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_matches_local()
87 sband = ieee80211_get_sband(sdata); in mesh_matches_local()
91 ieee80211_sta_get_rates(sdata, ie, sband->band, in mesh_matches_local()
94 if (sdata->vif.bss_conf.basic_rates != basic_rates) in mesh_matches_local()
97 cfg80211_chandef_create(&sta_chan_def, sdata->vif.bss_conf.chandef.chan, in mesh_matches_local()
104 ieee80211_chandef_vht_oper(&sdata->local->hw, vht_cap_info, in mesh_matches_local()
107 ieee80211_chandef_he_6ghz_oper(sdata, ie->he_operation, &sta_chan_def); in mesh_matches_local()
109 if (!cfg80211_chandef_compatible(&sdata->vif.bss_conf.chandef, in mesh_matches_local()
134 u32 mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata) in mesh_accept_plinks_update() argument
145 free_plinks = mesh_plink_availables(sdata); in mesh_accept_plinks_update()
147 if (free_plinks != sdata->u.mesh.accepting_plinks) { in mesh_accept_plinks_update()
148 sdata->u.mesh.accepting_plinks = free_plinks; in mesh_accept_plinks_update()
162 struct ieee80211_sub_if_data *sdata = sta->sdata; in mesh_sta_cleanup() local
166 ieee80211_mbss_info_change_notify(sdata, changed); in mesh_sta_cleanup()
169 int mesh_rmc_init(struct ieee80211_sub_if_data *sdata) in mesh_rmc_init() argument
173 sdata->u.mesh.rmc = kmalloc(sizeof(struct mesh_rmc), GFP_KERNEL); in mesh_rmc_init()
174 if (!sdata->u.mesh.rmc) in mesh_rmc_init()
176 sdata->u.mesh.rmc->idx_mask = RMC_BUCKETS - 1; in mesh_rmc_init()
178 INIT_HLIST_HEAD(&sdata->u.mesh.rmc->bucket[i]); in mesh_rmc_init()
182 void mesh_rmc_free(struct ieee80211_sub_if_data *sdata) in mesh_rmc_free() argument
184 struct mesh_rmc *rmc = sdata->u.mesh.rmc; in mesh_rmc_free()
189 if (!sdata->u.mesh.rmc) in mesh_rmc_free()
200 sdata->u.mesh.rmc = NULL; in mesh_rmc_free()
216 int mesh_rmc_check(struct ieee80211_sub_if_data *sdata, in mesh_rmc_check() argument
219 struct mesh_rmc *rmc = sdata->u.mesh.rmc; in mesh_rmc_check()
254 int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_meshconf_ie() argument
257 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_add_meshconf_ie()
303 int mesh_add_meshid_ie(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb) in mesh_add_meshid_ie() argument
305 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_add_meshid_ie()
320 static int mesh_add_awake_window_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_awake_window_ie() argument
323 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_add_awake_window_ie()
343 int mesh_add_vendor_ies(struct ieee80211_sub_if_data *sdata, in mesh_add_vendor_ies() argument
346 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_add_vendor_ies()
367 int mesh_add_rsn_ie(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb) in mesh_add_rsn_ie() argument
369 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_add_rsn_ie()
390 static int mesh_add_ds_params_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_ds_params_ie() argument
401 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in mesh_add_ds_params_ie()
417 int mesh_add_ht_cap_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_ht_cap_ie() argument
423 sband = ieee80211_get_sband(sdata); in mesh_add_ht_cap_ie()
432 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT || in mesh_add_ht_cap_ie()
433 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_5 || in mesh_add_ht_cap_ie()
434 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_10) in mesh_add_ht_cap_ie()
446 int mesh_add_ht_oper_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_ht_oper_ie() argument
449 struct ieee80211_local *local = sdata->local; in mesh_add_ht_oper_ie()
457 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in mesh_add_ht_oper_ie()
473 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT || in mesh_add_ht_oper_ie()
474 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_5 || in mesh_add_ht_oper_ie()
475 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_10) in mesh_add_ht_oper_ie()
482 ieee80211_ie_build_ht_oper(pos, ht_cap, &sdata->vif.bss_conf.chandef, in mesh_add_ht_oper_ie()
483 sdata->vif.bss_conf.ht_operation_mode, in mesh_add_ht_oper_ie()
489 int mesh_add_vht_cap_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_vht_cap_ie() argument
495 sband = ieee80211_get_sband(sdata); in mesh_add_vht_cap_ie()
504 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT || in mesh_add_vht_cap_ie()
505 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_5 || in mesh_add_vht_cap_ie()
506 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_10) in mesh_add_vht_cap_ie()
518 int mesh_add_vht_oper_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_vht_oper_ie() argument
521 struct ieee80211_local *local = sdata->local; in mesh_add_vht_oper_ie()
529 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in mesh_add_vht_oper_ie()
545 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT || in mesh_add_vht_oper_ie()
546 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_5 || in mesh_add_vht_oper_ie()
547 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_10) in mesh_add_vht_oper_ie()
555 &sdata->vif.bss_conf.chandef); in mesh_add_vht_oper_ie()
560 int mesh_add_he_cap_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_he_cap_ie() argument
567 sband = ieee80211_get_sband(sdata); in mesh_add_he_cap_ie()
574 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT || in mesh_add_he_cap_ie()
575 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_5 || in mesh_add_he_cap_ie()
576 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_10) in mesh_add_he_cap_ie()
588 int mesh_add_he_oper_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_he_oper_ie() argument
596 sband = ieee80211_get_sband(sdata); in mesh_add_he_oper_ie()
602 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT || in mesh_add_he_oper_ie()
603 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_5 || in mesh_add_he_oper_ie()
604 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_10) in mesh_add_he_oper_ie()
608 if (sdata->vif.bss_conf.chandef.chan->band == NL80211_BAND_6GHZ) in mesh_add_he_oper_ie()
615 ieee80211_ie_build_he_oper(pos, &sdata->vif.bss_conf.chandef); in mesh_add_he_oper_ie()
620 int mesh_add_he_6ghz_cap_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_he_6ghz_cap_ie() argument
626 sband = ieee80211_get_sband(sdata); in mesh_add_he_6ghz_cap_ie()
636 ieee80211_ie_build_he_6ghz_cap(sdata, skb); in mesh_add_he_6ghz_cap_ie()
642 struct ieee80211_sub_if_data *sdata = in ieee80211_mesh_path_timer() local
643 from_timer(sdata, t, u.mesh.mesh_path_timer); in ieee80211_mesh_path_timer()
645 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_mesh_path_timer()
650 struct ieee80211_sub_if_data *sdata = in ieee80211_mesh_path_root_timer() local
651 from_timer(sdata, t, u.mesh.mesh_path_root_timer); in ieee80211_mesh_path_root_timer()
652 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_path_root_timer()
656 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_mesh_path_root_timer()
713 unsigned int ieee80211_new_mesh_header(struct ieee80211_sub_if_data *sdata, in ieee80211_new_mesh_header() argument
722 meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL; in ieee80211_new_mesh_header()
725 put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum); in ieee80211_new_mesh_header()
726 sdata->u.mesh.mesh_seqnum++; in ieee80211_new_mesh_header()
742 static void ieee80211_mesh_housekeeping(struct ieee80211_sub_if_data *sdata) in ieee80211_mesh_housekeeping() argument
744 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_housekeeping()
748 ieee80211_sta_expire(sdata, ifmsh->mshcfg.plink_timeout * HZ); in ieee80211_mesh_housekeeping()
749 mesh_path_expire(sdata); in ieee80211_mesh_housekeeping()
751 changed = mesh_accept_plinks_update(sdata); in ieee80211_mesh_housekeeping()
752 ieee80211_mbss_info_change_notify(sdata, changed); in ieee80211_mesh_housekeeping()
759 static void ieee80211_mesh_rootpath(struct ieee80211_sub_if_data *sdata) in ieee80211_mesh_rootpath() argument
761 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_rootpath()
764 mesh_path_tx_root_frame(sdata); in ieee80211_mesh_rootpath()
787 struct ieee80211_sub_if_data *sdata; in ieee80211_mesh_build_beacon() local
790 sdata = container_of(ifmsh, struct ieee80211_sub_if_data, u.mesh); in ieee80211_mesh_build_beacon()
792 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_mesh_build_beacon()
796 ie_len_he_cap = ieee80211_ie_len_he_cap(sdata, in ieee80211_mesh_build_beacon()
841 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_mesh_build_beacon()
842 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); in ieee80211_mesh_build_beacon()
843 ieee80211_mps_set_frame_flags(sdata, NULL, (void *) mgmt); in ieee80211_mesh_build_beacon()
845 cpu_to_le16(sdata->vif.bss_conf.beacon_int); in ieee80211_mesh_build_beacon()
847 sdata->u.mesh.security ? WLAN_CAPABILITY_PRIVACY : 0); in ieee80211_mesh_build_beacon()
918 if (ieee80211_add_srates_ie(sdata, skb, true, band) || in ieee80211_mesh_build_beacon()
919 mesh_add_ds_params_ie(sdata, skb)) in ieee80211_mesh_build_beacon()
929 if (ieee80211_add_ext_srates_ie(sdata, skb, true, band) || in ieee80211_mesh_build_beacon()
930 mesh_add_rsn_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
931 mesh_add_ht_cap_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
932 mesh_add_ht_oper_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
933 mesh_add_meshid_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
934 mesh_add_meshconf_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
935 mesh_add_awake_window_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
936 mesh_add_vht_cap_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
937 mesh_add_vht_oper_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
938 mesh_add_he_cap_ie(sdata, skb, ie_len_he_cap) || in ieee80211_mesh_build_beacon()
939 mesh_add_he_oper_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
940 mesh_add_he_6ghz_cap_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
941 mesh_add_vendor_ies(sdata, skb)) in ieee80211_mesh_build_beacon()
959 ieee80211_mesh_rebuild_beacon(struct ieee80211_sub_if_data *sdata) in ieee80211_mesh_rebuild_beacon() argument
964 old_bcn = rcu_dereference_protected(sdata->u.mesh.beacon, in ieee80211_mesh_rebuild_beacon()
965 lockdep_is_held(&sdata->wdev.mtx)); in ieee80211_mesh_rebuild_beacon()
966 ret = ieee80211_mesh_build_beacon(&sdata->u.mesh); in ieee80211_mesh_rebuild_beacon()
976 void ieee80211_mbss_info_change_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_mbss_info_change_notify() argument
979 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mbss_info_change_notify()
990 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_mbss_info_change_notify()
993 int ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata) in ieee80211_start_mesh() argument
995 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_start_mesh()
996 struct ieee80211_local *local = sdata->local; in ieee80211_start_mesh()
1015 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_start_mesh()
1016 sdata->vif.bss_conf.ht_operation_mode = in ieee80211_start_mesh()
1018 sdata->vif.bss_conf.enable_beacon = true; in ieee80211_start_mesh()
1020 changed |= ieee80211_mps_local_status_update(sdata); in ieee80211_start_mesh()
1023 ieee80211_stop_mesh(sdata); in ieee80211_start_mesh()
1027 ieee80211_recalc_dtim(local, sdata); in ieee80211_start_mesh()
1028 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_start_mesh()
1030 netif_carrier_on(sdata->dev); in ieee80211_start_mesh()
1034 void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_mesh() argument
1036 struct ieee80211_local *local = sdata->local; in ieee80211_stop_mesh()
1037 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_stop_mesh()
1040 netif_carrier_off(sdata->dev); in ieee80211_stop_mesh()
1043 sta_info_flush(sdata); in ieee80211_stop_mesh()
1044 ieee80211_free_keys(sdata, true); in ieee80211_stop_mesh()
1045 mesh_path_flush_by_iface(sdata); in ieee80211_stop_mesh()
1049 sdata->vif.bss_conf.enable_beacon = false; in ieee80211_stop_mesh()
1050 sdata->beacon_rate_set = false; in ieee80211_stop_mesh()
1051 clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state); in ieee80211_stop_mesh()
1052 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED); in ieee80211_stop_mesh()
1056 lockdep_is_held(&sdata->wdev.mtx)); in ieee80211_stop_mesh()
1064 del_timer_sync(&sdata->u.mesh.housekeeping_timer); in ieee80211_stop_mesh()
1065 del_timer_sync(&sdata->u.mesh.mesh_path_root_timer); in ieee80211_stop_mesh()
1066 del_timer_sync(&sdata->u.mesh.mesh_path_timer); in ieee80211_stop_mesh()
1077 static void ieee80211_mesh_csa_mark_radar(struct ieee80211_sub_if_data *sdata) in ieee80211_mesh_csa_mark_radar() argument
1084 err = cfg80211_chandef_dfs_required(sdata->local->hw.wiphy, in ieee80211_mesh_csa_mark_radar()
1085 &sdata->vif.bss_conf.chandef, in ieee80211_mesh_csa_mark_radar()
1088 cfg80211_radar_event(sdata->local->hw.wiphy, in ieee80211_mesh_csa_mark_radar()
1089 &sdata->vif.bss_conf.chandef, GFP_ATOMIC); in ieee80211_mesh_csa_mark_radar()
1093 ieee80211_mesh_process_chnswitch(struct ieee80211_sub_if_data *sdata, in ieee80211_mesh_process_chnswitch() argument
1098 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_process_chnswitch()
1103 sdata_assert_lock(sdata); in ieee80211_mesh_process_chnswitch()
1105 sband = ieee80211_get_sband(sdata); in ieee80211_mesh_process_chnswitch()
1110 switch (sdata->vif.bss_conf.chandef.width) { in ieee80211_mesh_process_chnswitch()
1129 err = ieee80211_parse_ch_switch_ie(sdata, elems, sband->band, in ieee80211_mesh_process_chnswitch()
1131 sta_flags, sdata->vif.addr, in ieee80211_mesh_process_chnswitch()
1142 ieee80211_mesh_csa_mark_radar(sdata); in ieee80211_mesh_process_chnswitch()
1147 if (!cfg80211_chandef_usable(sdata->local->hw.wiphy, ¶ms.chandef, in ieee80211_mesh_process_chnswitch()
1149 !cfg80211_reg_can_beacon(sdata->local->hw.wiphy, ¶ms.chandef, in ieee80211_mesh_process_chnswitch()
1151 sdata_info(sdata, in ieee80211_mesh_process_chnswitch()
1153 sdata->vif.addr, in ieee80211_mesh_process_chnswitch()
1161 err = cfg80211_chandef_dfs_required(sdata->local->hw.wiphy, in ieee80211_mesh_process_chnswitch()
1167 sdata_info(sdata, in ieee80211_mesh_process_chnswitch()
1169 sdata->vif.addr, in ieee80211_mesh_process_chnswitch()
1180 &sdata->vif.bss_conf.chandef)) { in ieee80211_mesh_process_chnswitch()
1181 mcsa_dbg(sdata, in ieee80211_mesh_process_chnswitch()
1186 mcsa_dbg(sdata, in ieee80211_mesh_process_chnswitch()
1203 if (ieee80211_channel_switch(sdata->local->hw.wiphy, sdata->dev, in ieee80211_mesh_process_chnswitch()
1211 ieee80211_mesh_rx_probe_req(struct ieee80211_sub_if_data *sdata, in ieee80211_mesh_rx_probe_req() argument
1214 struct ieee80211_local *local = sdata->local; in ieee80211_mesh_rx_probe_req()
1215 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_rx_probe_req()
1235 if ((!ether_addr_equal(mgmt->da, sdata->vif.addr) && in ieee80211_mesh_rx_probe_req()
1264 ieee80211_tx_skb(sdata, presp); in ieee80211_mesh_rx_probe_req()
1269 static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, in ieee80211_mesh_rx_bcn_presp() argument
1275 struct ieee80211_local *local = sdata->local; in ieee80211_mesh_rx_bcn_presp()
1276 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_rx_bcn_presp()
1285 !ether_addr_equal(mgmt->da, sdata->vif.addr)) in ieee80211_mesh_rx_bcn_presp()
1297 (elems.rsn && sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) || in ieee80211_mesh_rx_bcn_presp()
1298 (!elems.rsn && sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE)) in ieee80211_mesh_rx_bcn_presp()
1311 if (mesh_matches_local(sdata, &elems)) { in ieee80211_mesh_rx_bcn_presp()
1312 mpl_dbg(sdata, "rssi_threshold=%d,rx_status->signal=%d\n", in ieee80211_mesh_rx_bcn_presp()
1313 sdata->u.mesh.mshcfg.rssi_threshold, rx_status->signal); in ieee80211_mesh_rx_bcn_presp()
1314 if (!sdata->u.mesh.user_mpm || in ieee80211_mesh_rx_bcn_presp()
1315 sdata->u.mesh.mshcfg.rssi_threshold == 0 || in ieee80211_mesh_rx_bcn_presp()
1316 sdata->u.mesh.mshcfg.rssi_threshold < rx_status->signal) in ieee80211_mesh_rx_bcn_presp()
1317 mesh_neighbour_update(sdata, mgmt->sa, &elems, in ieee80211_mesh_rx_bcn_presp()
1321 !sdata->vif.csa_active) in ieee80211_mesh_rx_bcn_presp()
1322 ieee80211_mesh_process_chnswitch(sdata, &elems, true); in ieee80211_mesh_rx_bcn_presp()
1326 ifmsh->sync_ops->rx_bcn_presp(sdata, in ieee80211_mesh_rx_bcn_presp()
1330 int ieee80211_mesh_finish_csa(struct ieee80211_sub_if_data *sdata) in ieee80211_mesh_finish_csa() argument
1332 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_finish_csa()
1343 lockdep_is_held(&sdata->wdev.mtx)); in ieee80211_mesh_finish_csa()
1347 ret = ieee80211_mesh_rebuild_beacon(sdata); in ieee80211_mesh_finish_csa()
1353 mcsa_dbg(sdata, "complete switching to center freq %d MHz", in ieee80211_mesh_finish_csa()
1354 sdata->vif.bss_conf.chandef.chan->center_freq); in ieee80211_mesh_finish_csa()
1358 int ieee80211_mesh_csa_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_mesh_csa_beacon() argument
1361 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_csa_beacon()
1365 lockdep_assert_held(&sdata->wdev.mtx); in ieee80211_mesh_csa_beacon()
1377 ret = ieee80211_mesh_rebuild_beacon(sdata); in ieee80211_mesh_csa_beacon()
1388 static int mesh_fwd_csa_frame(struct ieee80211_sub_if_data *sdata, in mesh_fwd_csa_frame() argument
1394 struct ieee80211_local *local = sdata->local; in mesh_fwd_csa_frame()
1408 memcpy(mgmt_fwd->sa, sdata->vif.addr, ETH_ALEN); in mesh_fwd_csa_frame()
1409 memcpy(mgmt_fwd->bssid, sdata->vif.addr, ETH_ALEN); in mesh_fwd_csa_frame()
1411 ieee80211_tx_skb(sdata, skb); in mesh_fwd_csa_frame()
1415 static void mesh_rx_csa_frame(struct ieee80211_sub_if_data *sdata, in mesh_rx_csa_frame() argument
1418 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_rx_csa_frame()
1435 if (!mesh_matches_local(sdata, &elems)) in mesh_rx_csa_frame()
1448 if (!sdata->vif.csa_active && in mesh_rx_csa_frame()
1449 !ieee80211_mesh_process_chnswitch(sdata, &elems, false)) { in mesh_rx_csa_frame()
1450 mcsa_dbg(sdata, "Failed to process CSA action frame"); in mesh_rx_csa_frame()
1456 if (mesh_fwd_csa_frame(sdata, mgmt, len, &elems) < 0) in mesh_rx_csa_frame()
1457 mcsa_dbg(sdata, "Failed to forward the CSA frame"); in mesh_rx_csa_frame()
1461 static void ieee80211_mesh_rx_mgmt_action(struct ieee80211_sub_if_data *sdata, in ieee80211_mesh_rx_mgmt_action() argument
1472 mesh_rx_plink_frame(sdata, mgmt, len, rx_status); in ieee80211_mesh_rx_mgmt_action()
1478 mesh_rx_path_sel_frame(sdata, mgmt, len); in ieee80211_mesh_rx_mgmt_action()
1481 mesh_rx_csa_frame(sdata, mgmt, len); in ieee80211_mesh_rx_mgmt_action()
1486 void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, in ieee80211_mesh_rx_queued_mgmt() argument
1493 sdata_lock(sdata); in ieee80211_mesh_rx_queued_mgmt()
1496 if (!sdata->u.mesh.mesh_id_len) in ieee80211_mesh_rx_queued_mgmt()
1506 ieee80211_mesh_rx_bcn_presp(sdata, stype, mgmt, skb->len, in ieee80211_mesh_rx_queued_mgmt()
1510 ieee80211_mesh_rx_probe_req(sdata, mgmt, skb->len); in ieee80211_mesh_rx_queued_mgmt()
1513 ieee80211_mesh_rx_mgmt_action(sdata, mgmt, skb->len, rx_status); in ieee80211_mesh_rx_queued_mgmt()
1517 sdata_unlock(sdata); in ieee80211_mesh_rx_queued_mgmt()
1520 static void mesh_bss_info_changed(struct ieee80211_sub_if_data *sdata) in mesh_bss_info_changed() argument
1522 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_bss_info_changed()
1531 if (sdata->vif.bss_conf.enable_beacon && in mesh_bss_info_changed()
1536 if (ieee80211_mesh_rebuild_beacon(sdata)) in mesh_bss_info_changed()
1539 ieee80211_bss_info_change_notify(sdata, changed); in mesh_bss_info_changed()
1542 void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata) in ieee80211_mesh_work() argument
1544 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_work()
1546 sdata_lock(sdata); in ieee80211_mesh_work()
1549 if (!sdata->u.mesh.mesh_id_len) in ieee80211_mesh_work()
1555 mesh_path_start_discovery(sdata); in ieee80211_mesh_work()
1558 ieee80211_mesh_housekeeping(sdata); in ieee80211_mesh_work()
1561 ieee80211_mesh_rootpath(sdata); in ieee80211_mesh_work()
1564 mesh_sync_adjust_tsf(sdata); in ieee80211_mesh_work()
1567 mesh_bss_info_changed(sdata); in ieee80211_mesh_work()
1569 sdata_unlock(sdata); in ieee80211_mesh_work()
1573 void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_mesh_init_sdata() argument
1575 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_init_sdata()
1583 mesh_rmc_init(sdata); in ieee80211_mesh_init_sdata()
1591 mesh_pathtbl_init(sdata); in ieee80211_mesh_init_sdata()
1602 sdata->vif.bss_conf.bssid = zero_addr; in ieee80211_mesh_init_sdata()
1605 void ieee80211_mesh_teardown_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_mesh_teardown_sdata() argument
1607 mesh_rmc_free(sdata); in ieee80211_mesh_teardown_sdata()
1608 mesh_pathtbl_unregister(sdata); in ieee80211_mesh_teardown_sdata()