Lines Matching defs:sdata

58 static bool rssi_threshold_check(struct ieee80211_sub_if_data *sdata,
61 s32 rssi_threshold = sdata->u.mesh.mshcfg.rssi_threshold;
93 static u32 mesh_set_short_slot_time(struct ieee80211_sub_if_data *sdata)
95 struct ieee80211_local *local = sdata->local;
102 sband = ieee80211_get_sband(sdata);
123 if (sdata != sta->sdata ||
136 if (sdata->vif.bss_conf.use_short_slot != short_slot) {
137 sdata->vif.bss_conf.use_short_slot = short_slot;
139 mpl_dbg(sdata, "mesh_plink %pM: ERP short slot time %d\n",
140 sdata->vif.addr, short_slot);
147 * @sdata: the (mesh) interface to handle
156 static u32 mesh_set_ht_prot_mode(struct ieee80211_sub_if_data *sdata)
158 struct ieee80211_local *local = sdata->local;
163 switch (sdata->vif.bss_conf.chandef.width) {
174 if (sdata != sta->sdata ||
182 mpl_dbg(sdata, "nonHT sta (%pM) is present\n",
188 mpl_dbg(sdata, "HT20 sta (%pM) is present\n", sta->sta.addr);
196 sdata->vif.bss_conf.chandef.width > NL80211_CHAN_WIDTH_20)
201 if (sdata->vif.bss_conf.ht_operation_mode == ht_opmode)
204 sdata->vif.bss_conf.ht_operation_mode = ht_opmode;
205 sdata->u.mesh.mshcfg.ht_opmode = ht_opmode;
206 mpl_dbg(sdata, "selected new HT protection mode %d\n", ht_opmode);
210 static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
215 struct ieee80211_local *local = sdata->local;
226 ie_len_he_cap = ieee80211_ie_len_he_cap(sdata,
234 2 + sdata->u.mesh.mesh_id_len +
245 sdata->u.mesh.ie_len);
254 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
255 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
263 sband = ieee80211_get_sband(sdata);
277 if (ieee80211_add_srates_ie(sdata, skb, true, band) ||
278 ieee80211_add_ext_srates_ie(sdata, skb, true, band) ||
279 mesh_add_rsn_ie(sdata, skb) ||
280 mesh_add_meshid_ie(sdata, skb) ||
281 mesh_add_meshconf_ie(sdata, skb))
285 if (mesh_add_meshid_ie(sdata, skb))
329 if (mesh_add_ht_cap_ie(sdata, skb) ||
330 mesh_add_ht_oper_ie(sdata, skb) ||
331 mesh_add_vht_cap_ie(sdata, skb) ||
332 mesh_add_vht_oper_ie(sdata, skb) ||
333 mesh_add_he_cap_ie(sdata, skb, ie_len_he_cap) ||
334 mesh_add_he_oper_ie(sdata, skb) ||
335 mesh_add_he_6ghz_cap_ie(sdata, skb))
339 if (mesh_add_vendor_ies(sdata, skb))
342 ieee80211_tx_skb(sdata, skb);
363 struct ieee80211_sub_if_data *sdata = sta->sdata;
369 changed = mesh_plink_dec_estab_count(sdata);
388 struct ieee80211_sub_if_data *sdata = sta->sdata;
394 if (!sdata->u.mesh.user_mpm) {
396 mesh_plink_frame_tx(sdata, sta, WLAN_SP_MESH_PEERING_CLOSE,
401 if (!sdata->u.mesh.user_mpm)
411 static void mesh_sta_info_init(struct ieee80211_sub_if_data *sdata,
415 struct ieee80211_local *local = sdata->local;
420 sband = ieee80211_get_sband(sdata);
424 rates = ieee80211_sta_get_rates(sdata, elems, sband->band,
440 if (ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
444 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
447 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, elems->he_cap,
472 static int mesh_allocate_aid(struct ieee80211_sub_if_data *sdata)
487 list_for_each_entry_rcu(sta, &sdata->local->sta_list, list)
501 __mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *hw_addr)
506 if (sdata->local->num_sta >= MESH_MAX_PLINKS)
509 aid = mesh_allocate_aid(sdata);
513 sta = sta_info_alloc(sdata, hw_addr, GFP_KERNEL);
529 mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *addr,
536 if (sdata->u.mesh.user_mpm ||
537 sdata->u.mesh.security & IEEE80211_MESH_SEC_AUTHED) {
539 mesh_plink_availables(sdata)) {
542 if (ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM))
545 cfg80211_notify_new_peer_candidate(sdata->dev, addr,
551 sta = __mesh_sta_info_alloc(sdata, addr);
559 * @sdata: local meshif
568 mesh_sta_info_get(struct ieee80211_sub_if_data *sdata,
575 sta = sta_info_get(sdata, addr);
577 mesh_sta_info_init(sdata, sta, elems);
581 sta = mesh_sta_info_alloc(sdata, addr, elems, rx_status);
587 mesh_sta_info_init(sdata, sta, elems);
599 * @sdata: local meshif
606 void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata,
614 sta = mesh_sta_info_get(sdata, hw_addr, elems, rx_status);
623 sdata->u.mesh.accepting_plinks &&
624 sdata->u.mesh.mshcfg.auto_open_plinks &&
625 rssi_threshold_check(sdata, sta))
631 ieee80211_mbss_info_change_notify(sdata, changed);
639 struct ieee80211_sub_if_data *sdata;
650 if (sta->sdata->local->quiescing)
661 mpl_dbg(sta->sdata,
671 mpl_dbg(sta->sdata,
678 mpl_dbg(sta->sdata,
681 sdata = sta->sdata;
682 mshcfg = &sdata->u.mesh.mshcfg;
690 mpl_dbg(sta->sdata,
722 mesh_plink_frame_tx(sdata, sta, action, sta->sta.addr,
732 static bool llid_in_use(struct ieee80211_sub_if_data *sdata,
735 struct ieee80211_local *local = sdata->local;
741 if (sdata != sta->sdata)
754 static u16 mesh_get_new_llid(struct ieee80211_sub_if_data *sdata)
760 } while (llid_in_use(sdata, llid));
767 struct ieee80211_sub_if_data *sdata = sta->sdata;
774 sta->mesh->llid = mesh_get_new_llid(sdata);
781 mesh_plink_timer_set(sta, sdata->u.mesh.mshcfg.dot11MeshRetryTimeout);
783 mpl_dbg(sdata,
788 changed = ieee80211_mps_local_status_update(sdata);
790 mesh_plink_frame_tx(sdata, sta, WLAN_SP_MESH_PEERING_OPEN,
808 static void mesh_plink_close(struct ieee80211_sub_if_data *sdata,
812 struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg;
821 static u32 mesh_plink_establish(struct ieee80211_sub_if_data *sdata,
824 struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg;
829 changed |= mesh_plink_inc_estab_count(sdata);
830 changed |= mesh_set_ht_prot_mode(sdata);
831 changed |= mesh_set_short_slot_time(sdata);
832 mpl_dbg(sdata, "Mesh plink with %pM ESTABLISHED\n", sta->sta.addr);
841 * @sdata: interface
847 static u32 mesh_plink_fsm(struct ieee80211_sub_if_data *sdata,
850 struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg;
855 mpl_dbg(sdata, "peer %pM in state %s got event %s\n", sta->sta.addr,
867 sta->mesh->llid = mesh_get_new_llid(sdata);
872 changed |= ieee80211_mps_local_status_update(sdata);
884 mesh_plink_close(sdata, sta, event);
905 mesh_plink_close(sdata, sta, event);
912 changed |= mesh_plink_establish(sdata, sta);
923 mesh_plink_close(sdata, sta, event);
927 changed |= mesh_plink_establish(sdata, sta);
938 changed |= mesh_set_ht_prot_mode(sdata);
939 changed |= mesh_set_short_slot_time(sdata);
940 mesh_plink_close(sdata, sta, event);
977 mesh_plink_frame_tx(sdata, sta, action, sta->sta.addr,
983 mesh_plink_frame_tx(sdata, sta,
996 * @sdata: interface
1007 mesh_plink_get_event(struct ieee80211_sub_if_data *sdata,
1018 mesh_matches_local(sdata, elems));
1028 mpl_dbg(sdata, "Mesh plink: cls or cnf from unknown peer\n");
1032 if (!mesh_plink_free_count(sdata)) {
1033 mpl_dbg(sdata, "Mesh plink error: no more free plinks\n");
1042 mpl_dbg(sdata, "Mesh plink: Action frame from non-authed peer\n");
1053 else if (!mesh_plink_free_count(sdata) ||
1062 else if (!mesh_plink_free_count(sdata) ||
1089 mpl_dbg(sdata, "Mesh plink: unknown frame subtype\n");
1098 mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata,
1112 mpl_dbg(sdata,
1118 sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) {
1119 mpl_dbg(sdata,
1129 mpl_dbg(sdata,
1137 mpl_dbg(sdata, "Mesh plink: missing necessary ie\n");
1151 sta = sta_info_get(sdata, mgmt->sa);
1154 !rssi_threshold_check(sdata, sta)) {
1155 mpl_dbg(sdata, "Mesh plink: %pM does not meet rssi threshold\n",
1161 event = mesh_plink_get_event(sdata, sta, elems, ftype, llid, plid);
1166 sta = mesh_sta_info_get(sdata, mgmt->sa, elems, rx_status);
1168 mpl_dbg(sdata, "Mesh plink: failed to init peer!\n");
1173 mesh_plink_frame_tx(sdata, NULL, WLAN_SP_MESH_PEERING_CLOSE,
1190 changed |= mesh_plink_fsm(sdata, sta, event);
1196 ieee80211_mbss_info_change_notify(sdata, changed);
1199 void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata,
1211 if (sdata->u.mesh.user_mpm)
1216 mpl_dbg(sdata,
1233 mesh_process_plink_frame(sdata, mgmt, &elems, rx_status);