Lines Matching refs:sdata

58 static bool rssi_threshold_check(struct ieee80211_sub_if_data *sdata,  in rssi_threshold_check()  argument
61 s32 rssi_threshold = sdata->u.mesh.mshcfg.rssi_threshold; in rssi_threshold_check()
93 static u64 mesh_set_short_slot_time(struct ieee80211_sub_if_data *sdata) in mesh_set_short_slot_time() argument
95 struct ieee80211_local *local = sdata->local; in mesh_set_short_slot_time()
103 sband = ieee80211_get_sband(sdata); in mesh_set_short_slot_time()
124 if (sdata != sta->sdata || in mesh_set_short_slot_time()
137 if (sdata->vif.bss_conf.use_short_slot != short_slot) { in mesh_set_short_slot_time()
138 sdata->vif.bss_conf.use_short_slot = short_slot; in mesh_set_short_slot_time()
140 mpl_dbg(sdata, "mesh_plink %pM: ERP short slot time %d\n", in mesh_set_short_slot_time()
141 sdata->vif.addr, short_slot); in mesh_set_short_slot_time()
159 static u64 mesh_set_ht_prot_mode(struct ieee80211_sub_if_data *sdata) in mesh_set_ht_prot_mode() argument
161 struct ieee80211_local *local = sdata->local; in mesh_set_ht_prot_mode()
166 switch (sdata->vif.bss_conf.chanreq.oper.width) { in mesh_set_ht_prot_mode()
177 if (sdata != sta->sdata || in mesh_set_ht_prot_mode()
185 mpl_dbg(sdata, "nonHT sta (%pM) is present\n", in mesh_set_ht_prot_mode()
191 mpl_dbg(sdata, "HT20 sta (%pM) is present\n", sta->sta.addr); in mesh_set_ht_prot_mode()
199 sdata->vif.bss_conf.chanreq.oper.width > NL80211_CHAN_WIDTH_20) in mesh_set_ht_prot_mode()
204 if (sdata->vif.bss_conf.ht_operation_mode == ht_opmode) in mesh_set_ht_prot_mode()
207 sdata->vif.bss_conf.ht_operation_mode = ht_opmode; in mesh_set_ht_prot_mode()
208 sdata->u.mesh.mshcfg.ht_opmode = ht_opmode; in mesh_set_ht_prot_mode()
209 mpl_dbg(sdata, "selected new HT protection mode %d\n", ht_opmode); in mesh_set_ht_prot_mode()
213 static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, in mesh_plink_frame_tx() argument
218 struct ieee80211_local *local = sdata->local; in mesh_plink_frame_tx()
229 ie_len_he_cap = ieee80211_ie_len_he_cap(sdata); in mesh_plink_frame_tx()
230 ie_len_eht_cap = ieee80211_ie_len_eht_cap(sdata); in mesh_plink_frame_tx()
237 2 + sdata->u.mesh.mesh_id_len + in mesh_plink_frame_tx()
251 sdata->u.mesh.ie_len); in mesh_plink_frame_tx()
260 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in mesh_plink_frame_tx()
261 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); in mesh_plink_frame_tx()
269 sband = ieee80211_get_sband(sdata); in mesh_plink_frame_tx()
283 basic_rates = sdata->vif.bss_conf.basic_rates; in mesh_plink_frame_tx()
289 mesh_add_rsn_ie(sdata, skb) || in mesh_plink_frame_tx()
290 mesh_add_meshid_ie(sdata, skb) || in mesh_plink_frame_tx()
291 mesh_add_meshconf_ie(sdata, skb)) in mesh_plink_frame_tx()
295 if (mesh_add_meshid_ie(sdata, skb)) in mesh_plink_frame_tx()
339 if (mesh_add_ht_cap_ie(sdata, skb) || in mesh_plink_frame_tx()
340 mesh_add_ht_oper_ie(sdata, skb) || in mesh_plink_frame_tx()
341 mesh_add_vht_cap_ie(sdata, skb) || in mesh_plink_frame_tx()
342 mesh_add_vht_oper_ie(sdata, skb) || in mesh_plink_frame_tx()
343 mesh_add_he_cap_ie(sdata, skb, ie_len_he_cap) || in mesh_plink_frame_tx()
344 mesh_add_he_oper_ie(sdata, skb) || in mesh_plink_frame_tx()
345 mesh_add_he_6ghz_cap_ie(sdata, skb) || in mesh_plink_frame_tx()
346 mesh_add_eht_cap_ie(sdata, skb, ie_len_eht_cap) || in mesh_plink_frame_tx()
347 mesh_add_eht_oper_ie(sdata, skb)) in mesh_plink_frame_tx()
351 if (mesh_add_vendor_ies(sdata, skb)) in mesh_plink_frame_tx()
354 ieee80211_tx_skb(sdata, skb); in mesh_plink_frame_tx()
375 struct ieee80211_sub_if_data *sdata = sta->sdata; in __mesh_plink_deactivate() local
381 changed = mesh_plink_dec_estab_count(sdata); in __mesh_plink_deactivate()
402 struct ieee80211_sub_if_data *sdata = sta->sdata; in mesh_plink_deactivate() local
408 if (!sdata->u.mesh.user_mpm) { in mesh_plink_deactivate()
410 mesh_plink_frame_tx(sdata, sta, WLAN_SP_MESH_PEERING_CLOSE, in mesh_plink_deactivate()
415 if (!sdata->u.mesh.user_mpm) in mesh_plink_deactivate()
425 static void mesh_sta_info_init(struct ieee80211_sub_if_data *sdata, in mesh_sta_info_init() argument
429 struct ieee80211_local *local = sdata->local; in mesh_sta_info_init()
434 sband = ieee80211_get_sband(sdata); in mesh_sta_info_init()
438 rates = ieee80211_sta_get_rates(sdata, elems, sband->band, NULL); in mesh_sta_info_init()
453 if (ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in mesh_sta_info_init()
458 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in mesh_sta_info_init()
462 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, elems->he_cap, in mesh_sta_info_init()
467 ieee80211_eht_cap_ie_to_sta_eht_cap(sdata, sband, elems->he_cap, in mesh_sta_info_init()
493 static int mesh_allocate_aid(struct ieee80211_sub_if_data *sdata) in mesh_allocate_aid() argument
507 list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) in mesh_allocate_aid()
521 __mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *hw_addr) in __mesh_sta_info_alloc() argument
526 if (sdata->local->num_sta >= MESH_MAX_PLINKS) in __mesh_sta_info_alloc()
529 aid = mesh_allocate_aid(sdata); in __mesh_sta_info_alloc()
533 sta = sta_info_alloc(sdata, hw_addr, GFP_KERNEL); in __mesh_sta_info_alloc()
549 mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *addr, in mesh_sta_info_alloc() argument
556 if (sdata->u.mesh.user_mpm || in mesh_sta_info_alloc()
557 sdata->u.mesh.security & IEEE80211_MESH_SEC_AUTHED) { in mesh_sta_info_alloc()
559 mesh_plink_availables(sdata)) { in mesh_sta_info_alloc()
562 if (ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM)) in mesh_sta_info_alloc()
565 cfg80211_notify_new_peer_candidate(sdata->dev, addr, in mesh_sta_info_alloc()
571 sta = __mesh_sta_info_alloc(sdata, addr); in mesh_sta_info_alloc()
588 mesh_sta_info_get(struct ieee80211_sub_if_data *sdata, in mesh_sta_info_get() argument
595 sta = sta_info_get(sdata, addr); in mesh_sta_info_get()
597 mesh_sta_info_init(sdata, sta, elems); in mesh_sta_info_get()
601 sta = mesh_sta_info_alloc(sdata, addr, elems, rx_status); in mesh_sta_info_get()
607 mesh_sta_info_init(sdata, sta, elems); in mesh_sta_info_get()
626 void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata, in mesh_neighbour_update() argument
634 sta = mesh_sta_info_get(sdata, hw_addr, elems, rx_status); in mesh_neighbour_update()
643 sdata->u.mesh.accepting_plinks && in mesh_neighbour_update()
644 sdata->u.mesh.mshcfg.auto_open_plinks && in mesh_neighbour_update()
645 rssi_threshold_check(sdata, sta)) in mesh_neighbour_update()
651 ieee80211_mbss_info_change_notify(sdata, changed); in mesh_neighbour_update()
659 struct ieee80211_sub_if_data *sdata; in mesh_plink_timer() local
670 if (sta->sdata->local->quiescing) in mesh_plink_timer()
681 mpl_dbg(sta->sdata, in mesh_plink_timer()
691 mpl_dbg(sta->sdata, in mesh_plink_timer()
698 mpl_dbg(sta->sdata, in mesh_plink_timer()
701 sdata = sta->sdata; in mesh_plink_timer()
702 mshcfg = &sdata->u.mesh.mshcfg; in mesh_plink_timer()
710 mpl_dbg(sta->sdata, in mesh_plink_timer()
742 mesh_plink_frame_tx(sdata, sta, action, sta->sta.addr, in mesh_plink_timer()
752 static bool llid_in_use(struct ieee80211_sub_if_data *sdata, in llid_in_use() argument
755 struct ieee80211_local *local = sdata->local; in llid_in_use()
761 if (sdata != sta->sdata) in llid_in_use()
774 static u16 mesh_get_new_llid(struct ieee80211_sub_if_data *sdata) in mesh_get_new_llid() argument
780 } while (llid_in_use(sdata, llid)); in mesh_get_new_llid()
787 struct ieee80211_sub_if_data *sdata = sta->sdata; in mesh_plink_open() local
794 sta->mesh->llid = mesh_get_new_llid(sdata); in mesh_plink_open()
801 mesh_plink_timer_set(sta, sdata->u.mesh.mshcfg.dot11MeshRetryTimeout); in mesh_plink_open()
803 mpl_dbg(sdata, in mesh_plink_open()
808 changed = ieee80211_mps_local_status_update(sdata); in mesh_plink_open()
810 mesh_plink_frame_tx(sdata, sta, WLAN_SP_MESH_PEERING_OPEN, in mesh_plink_open()
828 static void mesh_plink_close(struct ieee80211_sub_if_data *sdata, in mesh_plink_close() argument
832 struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg; in mesh_plink_close()
841 static u64 mesh_plink_establish(struct ieee80211_sub_if_data *sdata, in mesh_plink_establish() argument
844 struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg; in mesh_plink_establish()
849 changed |= mesh_plink_inc_estab_count(sdata); in mesh_plink_establish()
850 changed |= mesh_set_ht_prot_mode(sdata); in mesh_plink_establish()
851 changed |= mesh_set_short_slot_time(sdata); in mesh_plink_establish()
852 mpl_dbg(sdata, "Mesh plink with %pM ESTABLISHED\n", sta->sta.addr); in mesh_plink_establish()
867 static u64 mesh_plink_fsm(struct ieee80211_sub_if_data *sdata, in mesh_plink_fsm() argument
870 struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg; in mesh_plink_fsm()
875 mpl_dbg(sdata, "peer %pM in state %s got event %s\n", sta->sta.addr, in mesh_plink_fsm()
887 sta->mesh->llid = mesh_get_new_llid(sdata); in mesh_plink_fsm()
892 changed |= ieee80211_mps_local_status_update(sdata); in mesh_plink_fsm()
904 mesh_plink_close(sdata, sta, event); in mesh_plink_fsm()
925 mesh_plink_close(sdata, sta, event); in mesh_plink_fsm()
932 changed |= mesh_plink_establish(sdata, sta); in mesh_plink_fsm()
943 mesh_plink_close(sdata, sta, event); in mesh_plink_fsm()
947 changed |= mesh_plink_establish(sdata, sta); in mesh_plink_fsm()
958 changed |= mesh_set_ht_prot_mode(sdata); in mesh_plink_fsm()
959 changed |= mesh_set_short_slot_time(sdata); in mesh_plink_fsm()
960 mesh_plink_close(sdata, sta, event); in mesh_plink_fsm()
997 mesh_plink_frame_tx(sdata, sta, action, sta->sta.addr, in mesh_plink_fsm()
1003 mesh_plink_frame_tx(sdata, sta, in mesh_plink_fsm()
1027 mesh_plink_get_event(struct ieee80211_sub_if_data *sdata, in mesh_plink_get_event() argument
1038 mesh_matches_local(sdata, elems)); in mesh_plink_get_event()
1048 mpl_dbg(sdata, "Mesh plink: cls or cnf from unknown peer\n"); in mesh_plink_get_event()
1052 if (!mesh_plink_free_count(sdata)) { in mesh_plink_get_event()
1053 mpl_dbg(sdata, "Mesh plink error: no more free plinks\n"); in mesh_plink_get_event()
1062 mpl_dbg(sdata, "Mesh plink: Action frame from non-authed peer\n"); in mesh_plink_get_event()
1073 else if (!mesh_plink_free_count(sdata) || in mesh_plink_get_event()
1082 else if (!mesh_plink_free_count(sdata) || in mesh_plink_get_event()
1109 mpl_dbg(sdata, "Mesh plink: unknown frame subtype\n"); in mesh_plink_get_event()
1118 mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata, in mesh_process_plink_frame() argument
1132 mpl_dbg(sdata, in mesh_process_plink_frame()
1138 sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) { in mesh_process_plink_frame()
1139 mpl_dbg(sdata, in mesh_process_plink_frame()
1149 mpl_dbg(sdata, in mesh_process_plink_frame()
1157 mpl_dbg(sdata, "Mesh plink: missing necessary ie\n"); in mesh_process_plink_frame()
1171 sta = sta_info_get(sdata, mgmt->sa); in mesh_process_plink_frame()
1174 !rssi_threshold_check(sdata, sta)) { in mesh_process_plink_frame()
1175 mpl_dbg(sdata, "Mesh plink: %pM does not meet rssi threshold\n", in mesh_process_plink_frame()
1181 event = mesh_plink_get_event(sdata, sta, elems, ftype, llid, plid); in mesh_process_plink_frame()
1186 sta = mesh_sta_info_get(sdata, mgmt->sa, elems, rx_status); in mesh_process_plink_frame()
1188 mpl_dbg(sdata, "Mesh plink: failed to init peer!\n"); in mesh_process_plink_frame()
1193 mesh_plink_frame_tx(sdata, NULL, WLAN_SP_MESH_PEERING_CLOSE, in mesh_process_plink_frame()
1210 changed |= mesh_plink_fsm(sdata, sta, event); in mesh_process_plink_frame()
1216 ieee80211_mbss_info_change_notify(sdata, changed); in mesh_process_plink_frame()
1219 void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, in mesh_rx_plink_frame() argument
1231 if (sdata->u.mesh.user_mpm) in mesh_rx_plink_frame()
1236 mpl_dbg(sdata, in mesh_rx_plink_frame()
1253 mesh_process_plink_frame(sdata, mgmt, elems, rx_status); in mesh_rx_plink_frame()