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 u64 mesh_set_short_slot_time(struct ieee80211_sub_if_data *sdata)
95 struct ieee80211_local *local = sdata->local;
103 sband = ieee80211_get_sband(sdata);
124 if (sdata != sta->sdata ||
137 if (sdata->vif.bss_conf.use_short_slot != short_slot) {
138 sdata->vif.bss_conf.use_short_slot = short_slot;
140 mpl_dbg(sdata, "mesh_plink %pM: ERP short slot time %d\n",
141 sdata->vif.addr, short_slot);
148 * @sdata: the (mesh) interface to handle
157 static u64 mesh_set_ht_prot_mode(struct ieee80211_sub_if_data *sdata)
159 struct ieee80211_local *local = sdata->local;
164 switch (sdata->vif.bss_conf.chandef.width) {
175 if (sdata != sta->sdata ||
183 mpl_dbg(sdata, "nonHT sta (%pM) is present\n",
189 mpl_dbg(sdata, "HT20 sta (%pM) is present\n", sta->sta.addr);
197 sdata->vif.bss_conf.chandef.width > NL80211_CHAN_WIDTH_20)
202 if (sdata->vif.bss_conf.ht_operation_mode == ht_opmode)
205 sdata->vif.bss_conf.ht_operation_mode = ht_opmode;
206 sdata->u.mesh.mshcfg.ht_opmode = ht_opmode;
207 mpl_dbg(sdata, "selected new HT protection mode %d\n", ht_opmode);
211 static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
216 struct ieee80211_local *local = sdata->local;
227 ie_len_he_cap = ieee80211_ie_len_he_cap(sdata,
229 ie_len_eht_cap = ieee80211_ie_len_eht_cap(sdata,
237 2 + sdata->u.mesh.mesh_id_len +
251 sdata->u.mesh.ie_len);
260 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
261 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
269 sband = ieee80211_get_sband(sdata);
283 if (ieee80211_add_srates_ie(sdata, skb, true, band) ||
284 ieee80211_add_ext_srates_ie(sdata, skb, true, band) ||
285 mesh_add_rsn_ie(sdata, skb) ||
286 mesh_add_meshid_ie(sdata, skb) ||
287 mesh_add_meshconf_ie(sdata, skb))
291 if (mesh_add_meshid_ie(sdata, skb))
335 if (mesh_add_ht_cap_ie(sdata, skb) ||
336 mesh_add_ht_oper_ie(sdata, skb) ||
337 mesh_add_vht_cap_ie(sdata, skb) ||
338 mesh_add_vht_oper_ie(sdata, skb) ||
339 mesh_add_he_cap_ie(sdata, skb, ie_len_he_cap) ||
340 mesh_add_he_oper_ie(sdata, skb) ||
341 mesh_add_he_6ghz_cap_ie(sdata, skb) ||
342 mesh_add_eht_cap_ie(sdata, skb, ie_len_eht_cap) ||
343 mesh_add_eht_oper_ie(sdata, skb))
347 if (mesh_add_vendor_ies(sdata, skb))
350 ieee80211_tx_skb(sdata, skb);
371 struct ieee80211_sub_if_data *sdata = sta->sdata;
377 changed = mesh_plink_dec_estab_count(sdata);
396 struct ieee80211_sub_if_data *sdata = sta->sdata;
402 if (!sdata->u.mesh.user_mpm) {
404 mesh_plink_frame_tx(sdata, sta, WLAN_SP_MESH_PEERING_CLOSE,
409 if (!sdata->u.mesh.user_mpm)
419 static void mesh_sta_info_init(struct ieee80211_sub_if_data *sdata,
423 struct ieee80211_local *local = sdata->local;
428 sband = ieee80211_get_sband(sdata);
432 rates = ieee80211_sta_get_rates(sdata, elems, sband->band,
448 if (ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
453 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
457 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, elems->he_cap,
462 ieee80211_eht_cap_ie_to_sta_eht_cap(sdata, sband, elems->he_cap,
487 static int mesh_allocate_aid(struct ieee80211_sub_if_data *sdata)
501 list_for_each_entry_rcu(sta, &sdata->local->sta_list, list)
515 __mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *hw_addr)
520 if (sdata->local->num_sta >= MESH_MAX_PLINKS)
523 aid = mesh_allocate_aid(sdata);
527 sta = sta_info_alloc(sdata, hw_addr, GFP_KERNEL);
543 mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *addr,
550 if (sdata->u.mesh.user_mpm ||
551 sdata->u.mesh.security & IEEE80211_MESH_SEC_AUTHED) {
553 mesh_plink_availables(sdata)) {
556 if (ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM))
559 cfg80211_notify_new_peer_candidate(sdata->dev, addr,
565 sta = __mesh_sta_info_alloc(sdata, addr);
573 * @sdata: local meshif
582 mesh_sta_info_get(struct ieee80211_sub_if_data *sdata,
589 sta = sta_info_get(sdata, addr);
591 mesh_sta_info_init(sdata, sta, elems);
595 sta = mesh_sta_info_alloc(sdata, addr, elems, rx_status);
601 mesh_sta_info_init(sdata, sta, elems);
613 * @sdata: local meshif
620 void mesh_neighbour_update(struct ieee80211_sub_if_data *sdata,
628 sta = mesh_sta_info_get(sdata, hw_addr, elems, rx_status);
637 sdata->u.mesh.accepting_plinks &&
638 sdata->u.mesh.mshcfg.auto_open_plinks &&
639 rssi_threshold_check(sdata, sta))
645 ieee80211_mbss_info_change_notify(sdata, changed);
653 struct ieee80211_sub_if_data *sdata;
664 if (sta->sdata->local->quiescing)
675 mpl_dbg(sta->sdata,
685 mpl_dbg(sta->sdata,
692 mpl_dbg(sta->sdata,
695 sdata = sta->sdata;
696 mshcfg = &sdata->u.mesh.mshcfg;
704 mpl_dbg(sta->sdata,
736 mesh_plink_frame_tx(sdata, sta, action, sta->sta.addr,
746 static bool llid_in_use(struct ieee80211_sub_if_data *sdata,
749 struct ieee80211_local *local = sdata->local;
755 if (sdata != sta->sdata)
768 static u16 mesh_get_new_llid(struct ieee80211_sub_if_data *sdata)
774 } while (llid_in_use(sdata, llid));
781 struct ieee80211_sub_if_data *sdata = sta->sdata;
788 sta->mesh->llid = mesh_get_new_llid(sdata);
795 mesh_plink_timer_set(sta, sdata->u.mesh.mshcfg.dot11MeshRetryTimeout);
797 mpl_dbg(sdata,
802 changed = ieee80211_mps_local_status_update(sdata);
804 mesh_plink_frame_tx(sdata, sta, WLAN_SP_MESH_PEERING_OPEN,
822 static void mesh_plink_close(struct ieee80211_sub_if_data *sdata,
826 struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg;
835 static u64 mesh_plink_establish(struct ieee80211_sub_if_data *sdata,
838 struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg;
843 changed |= mesh_plink_inc_estab_count(sdata);
844 changed |= mesh_set_ht_prot_mode(sdata);
845 changed |= mesh_set_short_slot_time(sdata);
846 mpl_dbg(sdata, "Mesh plink with %pM ESTABLISHED\n", sta->sta.addr);
855 * @sdata: interface
861 static u64 mesh_plink_fsm(struct ieee80211_sub_if_data *sdata,
864 struct mesh_config *mshcfg = &sdata->u.mesh.mshcfg;
869 mpl_dbg(sdata, "peer %pM in state %s got event %s\n", sta->sta.addr,
881 sta->mesh->llid = mesh_get_new_llid(sdata);
886 changed |= ieee80211_mps_local_status_update(sdata);
898 mesh_plink_close(sdata, sta, event);
919 mesh_plink_close(sdata, sta, event);
926 changed |= mesh_plink_establish(sdata, sta);
937 mesh_plink_close(sdata, sta, event);
941 changed |= mesh_plink_establish(sdata, sta);
952 changed |= mesh_set_ht_prot_mode(sdata);
953 changed |= mesh_set_short_slot_time(sdata);
954 mesh_plink_close(sdata, sta, event);
991 mesh_plink_frame_tx(sdata, sta, action, sta->sta.addr,
997 mesh_plink_frame_tx(sdata, sta,
1010 * @sdata: interface
1021 mesh_plink_get_event(struct ieee80211_sub_if_data *sdata,
1032 mesh_matches_local(sdata, elems));
1042 mpl_dbg(sdata, "Mesh plink: cls or cnf from unknown peer\n");
1046 if (!mesh_plink_free_count(sdata)) {
1047 mpl_dbg(sdata, "Mesh plink error: no more free plinks\n");
1056 mpl_dbg(sdata, "Mesh plink: Action frame from non-authed peer\n");
1067 else if (!mesh_plink_free_count(sdata) ||
1076 else if (!mesh_plink_free_count(sdata) ||
1103 mpl_dbg(sdata, "Mesh plink: unknown frame subtype\n");
1112 mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata,
1126 mpl_dbg(sdata,
1132 sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) {
1133 mpl_dbg(sdata,
1143 mpl_dbg(sdata,
1151 mpl_dbg(sdata, "Mesh plink: missing necessary ie\n");
1165 sta = sta_info_get(sdata, mgmt->sa);
1168 !rssi_threshold_check(sdata, sta)) {
1169 mpl_dbg(sdata, "Mesh plink: %pM does not meet rssi threshold\n",
1175 event = mesh_plink_get_event(sdata, sta, elems, ftype, llid, plid);
1180 sta = mesh_sta_info_get(sdata, mgmt->sa, elems, rx_status);
1182 mpl_dbg(sdata, "Mesh plink: failed to init peer!\n");
1187 mesh_plink_frame_tx(sdata, NULL, WLAN_SP_MESH_PEERING_CLOSE,
1204 changed |= mesh_plink_fsm(sdata, sta, event);
1210 ieee80211_mbss_info_change_notify(sdata, changed);
1213 void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata,
1225 if (sdata->u.mesh.user_mpm)
1230 mpl_dbg(sdata,
1247 mesh_process_plink_frame(sdata, mgmt, elems, rx_status);