1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00

wifi: iwlwifi: mvm: select STA mask only for active links

During reconfig, we might send keys, but those should be only
sent to already active link stations. Iterate only active ones
to fix that issue.

Fixes: aea99650f7 ("wifi: iwlwifi: mvm: set STA mask for keys in MLO")
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240320232419.c6818d1c6033.I6357f05c55ef111002ddc169287eb356ca0c1b21@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Johannes Berg 2024-03-20 23:26:36 +02:00
parent b97b0c04f8
commit 2783ab506e

View file

@ -9,7 +9,9 @@
u32 iwl_mvm_sta_fw_id_mask(struct iwl_mvm *mvm, struct ieee80211_sta *sta, u32 iwl_mvm_sta_fw_id_mask(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
int filter_link_id) int filter_link_id)
{ {
struct ieee80211_link_sta *link_sta;
struct iwl_mvm_sta *mvmsta; struct iwl_mvm_sta *mvmsta;
struct ieee80211_vif *vif;
unsigned int link_id; unsigned int link_id;
u32 result = 0; u32 result = 0;
@ -17,26 +19,27 @@ u32 iwl_mvm_sta_fw_id_mask(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
return 0; return 0;
mvmsta = iwl_mvm_sta_from_mac80211(sta); mvmsta = iwl_mvm_sta_from_mac80211(sta);
vif = mvmsta->vif;
/* it's easy when the STA is not an MLD */ /* it's easy when the STA is not an MLD */
if (!sta->valid_links) if (!sta->valid_links)
return BIT(mvmsta->deflink.sta_id); return BIT(mvmsta->deflink.sta_id);
/* but if it is an MLD, get the mask of all the FW STAs it has ... */ /* but if it is an MLD, get the mask of all the FW STAs it has ... */
for (link_id = 0; link_id < ARRAY_SIZE(mvmsta->link); link_id++) { for_each_sta_active_link(vif, sta, link_sta, link_id) {
struct iwl_mvm_link_sta *link_sta; struct iwl_mvm_link_sta *mvm_link_sta;
/* unless we have a specific link in mind */ /* unless we have a specific link in mind */
if (filter_link_id >= 0 && link_id != filter_link_id) if (filter_link_id >= 0 && link_id != filter_link_id)
continue; continue;
link_sta = mvm_link_sta =
rcu_dereference_check(mvmsta->link[link_id], rcu_dereference_check(mvmsta->link[link_id],
lockdep_is_held(&mvm->mutex)); lockdep_is_held(&mvm->mutex));
if (!link_sta) if (!link_sta)
continue; continue;
result |= BIT(link_sta->sta_id); result |= BIT(mvm_link_sta->sta_id);
} }
return result; return result;