Lines Matching refs:sdata
43 struct ieee80211_sub_if_data *sdata = (void *) data; in ieee80211_mesh_housekeeping_timer() local
44 struct ieee80211_local *local = sdata->local; in ieee80211_mesh_housekeeping_timer()
45 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_housekeeping_timer()
49 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_mesh_housekeeping_timer()
61 bool mesh_matches_local(struct ieee80211_sub_if_data *sdata, in mesh_matches_local() argument
64 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_matches_local()
65 struct ieee80211_local *local = sdata->local; in mesh_matches_local()
88 ieee80211_sta_get_rates(local, ie, ieee80211_get_sdata_band(sdata), in mesh_matches_local()
91 if (sdata->vif.bss_conf.basic_rates != basic_rates) in mesh_matches_local()
94 ieee80211_ht_oper_to_chandef(sdata->vif.bss_conf.chandef.chan, in mesh_matches_local()
97 if (!cfg80211_chandef_compatible(&sdata->vif.bss_conf.chandef, in mesh_matches_local()
122 u32 mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata) in mesh_accept_plinks_update() argument
133 free_plinks = mesh_plink_availables(sdata); in mesh_accept_plinks_update()
135 if (free_plinks != sdata->u.mesh.accepting_plinks) { in mesh_accept_plinks_update()
136 sdata->u.mesh.accepting_plinks = free_plinks; in mesh_accept_plinks_update()
150 struct ieee80211_sub_if_data *sdata = sta->sdata; in mesh_sta_cleanup() local
158 changed = mesh_accept_plinks_update(sdata); in mesh_sta_cleanup()
159 if (!sdata->u.mesh.user_mpm) { in mesh_sta_cleanup()
165 ieee80211_mbss_info_change_notify(sdata, changed); in mesh_sta_cleanup()
168 int mesh_rmc_init(struct ieee80211_sub_if_data *sdata) in mesh_rmc_init() argument
172 sdata->u.mesh.rmc = kmalloc(sizeof(struct mesh_rmc), GFP_KERNEL); in mesh_rmc_init()
173 if (!sdata->u.mesh.rmc) in mesh_rmc_init()
175 sdata->u.mesh.rmc->idx_mask = RMC_BUCKETS - 1; in mesh_rmc_init()
177 INIT_LIST_HEAD(&sdata->u.mesh.rmc->bucket[i]); in mesh_rmc_init()
181 void mesh_rmc_free(struct ieee80211_sub_if_data *sdata) in mesh_rmc_free() argument
183 struct mesh_rmc *rmc = sdata->u.mesh.rmc; in mesh_rmc_free()
187 if (!sdata->u.mesh.rmc) in mesh_rmc_free()
198 sdata->u.mesh.rmc = NULL; in mesh_rmc_free()
214 int mesh_rmc_check(struct ieee80211_sub_if_data *sdata, in mesh_rmc_check() argument
217 struct mesh_rmc *rmc = sdata->u.mesh.rmc; in mesh_rmc_check()
248 int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_meshconf_ie() argument
251 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_add_meshconf_ie()
291 int mesh_add_meshid_ie(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb) in mesh_add_meshid_ie() argument
293 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_add_meshid_ie()
308 static int mesh_add_awake_window_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_awake_window_ie() argument
311 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_add_awake_window_ie()
331 int mesh_add_vendor_ies(struct ieee80211_sub_if_data *sdata, in mesh_add_vendor_ies() argument
334 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_add_vendor_ies()
355 int mesh_add_rsn_ie(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb) in mesh_add_rsn_ie() argument
357 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in mesh_add_rsn_ie()
383 static int mesh_add_ds_params_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_ds_params_ie() argument
394 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in mesh_add_ds_params_ie()
410 int mesh_add_ht_cap_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_ht_cap_ie() argument
413 struct ieee80211_local *local = sdata->local; in mesh_add_ht_cap_ie()
414 enum ieee80211_band band = ieee80211_get_sdata_band(sdata); in mesh_add_ht_cap_ie()
420 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT) in mesh_add_ht_cap_ie()
432 int mesh_add_ht_oper_ie(struct ieee80211_sub_if_data *sdata, in mesh_add_ht_oper_ie() argument
435 struct ieee80211_local *local = sdata->local; in mesh_add_ht_oper_ie()
439 cfg80211_get_chandef_type(&sdata->vif.bss_conf.chandef); in mesh_add_ht_oper_ie()
445 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in mesh_add_ht_oper_ie()
463 ieee80211_ie_build_ht_oper(pos, ht_cap, &sdata->vif.bss_conf.chandef, in mesh_add_ht_oper_ie()
464 sdata->vif.bss_conf.ht_operation_mode); in mesh_add_ht_oper_ie()
471 struct ieee80211_sub_if_data *sdata = in ieee80211_mesh_path_timer() local
474 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_mesh_path_timer()
479 struct ieee80211_sub_if_data *sdata = in ieee80211_mesh_path_root_timer() local
481 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_path_root_timer()
485 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_mesh_path_root_timer()
542 int ieee80211_new_mesh_header(struct ieee80211_sub_if_data *sdata, in ieee80211_new_mesh_header() argument
551 meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL; in ieee80211_new_mesh_header()
554 put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum); in ieee80211_new_mesh_header()
555 sdata->u.mesh.mesh_seqnum++; in ieee80211_new_mesh_header()
571 static void ieee80211_mesh_housekeeping(struct ieee80211_sub_if_data *sdata) in ieee80211_mesh_housekeeping() argument
573 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_housekeeping()
576 ieee80211_sta_expire(sdata, IEEE80211_MESH_PEER_INACTIVITY_LIMIT); in ieee80211_mesh_housekeeping()
577 mesh_path_expire(sdata); in ieee80211_mesh_housekeeping()
579 changed = mesh_accept_plinks_update(sdata); in ieee80211_mesh_housekeeping()
580 ieee80211_mbss_info_change_notify(sdata, changed); in ieee80211_mesh_housekeeping()
587 static void ieee80211_mesh_rootpath(struct ieee80211_sub_if_data *sdata) in ieee80211_mesh_rootpath() argument
589 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_rootpath()
592 mesh_path_tx_root_frame(sdata); in ieee80211_mesh_rootpath()
613 struct ieee80211_sub_if_data *sdata; in ieee80211_mesh_build_beacon() local
617 sdata = container_of(ifmsh, struct ieee80211_sub_if_data, u.mesh); in ieee80211_mesh_build_beacon()
619 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_mesh_build_beacon()
654 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_mesh_build_beacon()
655 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); in ieee80211_mesh_build_beacon()
656 ieee80211_mps_set_frame_flags(sdata, NULL, (void *) mgmt); in ieee80211_mesh_build_beacon()
658 cpu_to_le16(sdata->vif.bss_conf.beacon_int); in ieee80211_mesh_build_beacon()
660 sdata->u.mesh.security ? WLAN_CAPABILITY_PRIVACY : 0); in ieee80211_mesh_build_beacon()
666 if (ieee80211_add_srates_ie(sdata, skb, true, band) || in ieee80211_mesh_build_beacon()
667 mesh_add_ds_params_ie(sdata, skb)) in ieee80211_mesh_build_beacon()
677 if (ieee80211_add_ext_srates_ie(sdata, skb, true, band) || in ieee80211_mesh_build_beacon()
678 mesh_add_rsn_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
679 mesh_add_ht_cap_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
680 mesh_add_ht_oper_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
681 mesh_add_meshid_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
682 mesh_add_meshconf_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
683 mesh_add_awake_window_ie(sdata, skb) || in ieee80211_mesh_build_beacon()
684 mesh_add_vendor_ies(sdata, skb)) in ieee80211_mesh_build_beacon()
721 void ieee80211_mbss_info_change_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_mbss_info_change_notify() argument
724 if (sdata->vif.bss_conf.enable_beacon && in ieee80211_mbss_info_change_notify()
729 if (ieee80211_mesh_rebuild_beacon(&sdata->u.mesh)) in ieee80211_mbss_info_change_notify()
731 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_mbss_info_change_notify()
734 int ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata) in ieee80211_start_mesh() argument
736 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_start_mesh()
737 struct ieee80211_local *local = sdata->local; in ieee80211_start_mesh()
743 enum ieee80211_band band = ieee80211_get_sdata_band(sdata); in ieee80211_start_mesh()
758 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_start_mesh()
759 sdata->vif.bss_conf.ht_operation_mode = in ieee80211_start_mesh()
761 sdata->vif.bss_conf.enable_beacon = true; in ieee80211_start_mesh()
762 sdata->vif.bss_conf.basic_rates = in ieee80211_start_mesh()
765 changed |= ieee80211_mps_local_status_update(sdata); in ieee80211_start_mesh()
768 ieee80211_stop_mesh(sdata); in ieee80211_start_mesh()
772 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_start_mesh()
774 netif_carrier_on(sdata->dev); in ieee80211_start_mesh()
778 void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_mesh() argument
780 struct ieee80211_local *local = sdata->local; in ieee80211_stop_mesh()
781 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_stop_mesh()
784 netif_carrier_off(sdata->dev); in ieee80211_stop_mesh()
788 sdata->vif.bss_conf.enable_beacon = false; in ieee80211_stop_mesh()
789 clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state); in ieee80211_stop_mesh()
790 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED); in ieee80211_stop_mesh()
799 sta_info_flush(sdata); in ieee80211_stop_mesh()
800 mesh_path_flush_by_iface(sdata); in ieee80211_stop_mesh()
806 del_timer_sync(&sdata->u.mesh.housekeeping_timer); in ieee80211_stop_mesh()
807 del_timer_sync(&sdata->u.mesh.mesh_path_root_timer); in ieee80211_stop_mesh()
808 del_timer_sync(&sdata->u.mesh.mesh_path_timer); in ieee80211_stop_mesh()
816 cancel_work_sync(&sdata->work); in ieee80211_stop_mesh()
824 ieee80211_mesh_rx_probe_req(struct ieee80211_sub_if_data *sdata, in ieee80211_mesh_rx_probe_req() argument
827 struct ieee80211_local *local = sdata->local; in ieee80211_mesh_rx_probe_req()
828 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_rx_probe_req()
844 if ((!ether_addr_equal(mgmt->da, sdata->vif.addr) && in ieee80211_mesh_rx_probe_req()
873 ieee80211_tx_skb(sdata, presp); in ieee80211_mesh_rx_probe_req()
878 static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, in ieee80211_mesh_rx_bcn_presp() argument
884 struct ieee80211_local *local = sdata->local; in ieee80211_mesh_rx_bcn_presp()
885 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_rx_bcn_presp()
894 !ether_addr_equal(mgmt->da, sdata->vif.addr)) in ieee80211_mesh_rx_bcn_presp()
906 (elems.rsn && sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) || in ieee80211_mesh_rx_bcn_presp()
907 (!elems.rsn && sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE)) in ieee80211_mesh_rx_bcn_presp()
920 if (mesh_matches_local(sdata, &elems)) in ieee80211_mesh_rx_bcn_presp()
921 mesh_neighbour_update(sdata, mgmt->sa, &elems); in ieee80211_mesh_rx_bcn_presp()
924 ifmsh->sync_ops->rx_bcn_presp(sdata, in ieee80211_mesh_rx_bcn_presp()
928 static void ieee80211_mesh_rx_mgmt_action(struct ieee80211_sub_if_data *sdata, in ieee80211_mesh_rx_mgmt_action() argument
939 mesh_rx_plink_frame(sdata, mgmt, len, rx_status); in ieee80211_mesh_rx_mgmt_action()
945 mesh_rx_path_sel_frame(sdata, mgmt, len); in ieee80211_mesh_rx_mgmt_action()
950 void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, in ieee80211_mesh_rx_queued_mgmt() argument
964 ieee80211_mesh_rx_bcn_presp(sdata, stype, mgmt, skb->len, in ieee80211_mesh_rx_queued_mgmt()
968 ieee80211_mesh_rx_probe_req(sdata, mgmt, skb->len); in ieee80211_mesh_rx_queued_mgmt()
971 ieee80211_mesh_rx_mgmt_action(sdata, mgmt, skb->len, rx_status); in ieee80211_mesh_rx_queued_mgmt()
976 void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata) in ieee80211_mesh_work() argument
978 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_work()
983 mesh_path_start_discovery(sdata); in ieee80211_mesh_work()
992 ieee80211_mesh_housekeeping(sdata); in ieee80211_mesh_work()
995 ieee80211_mesh_rootpath(sdata); in ieee80211_mesh_work()
998 mesh_sync_adjust_tbtt(sdata); in ieee80211_mesh_work()
1003 struct ieee80211_sub_if_data *sdata; in ieee80211_mesh_notify_scan_completed() local
1006 list_for_each_entry_rcu(sdata, &local->interfaces, list) in ieee80211_mesh_notify_scan_completed()
1007 if (ieee80211_vif_is_mesh(&sdata->vif) && in ieee80211_mesh_notify_scan_completed()
1008 ieee80211_sdata_running(sdata)) in ieee80211_mesh_notify_scan_completed()
1009 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_mesh_notify_scan_completed()
1013 void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_mesh_init_sdata() argument
1015 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_mesh_init_sdata()
1020 (unsigned long) sdata); in ieee80211_mesh_init_sdata()
1027 mesh_rmc_init(sdata); in ieee80211_mesh_init_sdata()
1035 (unsigned long) sdata); in ieee80211_mesh_init_sdata()
1038 (unsigned long) sdata); in ieee80211_mesh_init_sdata()
1046 sdata->vif.bss_conf.bssid = zero_addr; in ieee80211_mesh_init_sdata()