Commit 072573f6 authored by Johannes Berg's avatar Johannes Berg

wifi: iwlwifi: mvm: remove only link-specific AP keys

When we remove the AP station, we iterate over the links
and remove all the keys, however, the key iteration will
return all keys for all links, so skip the ones that we
don't need based on the link ID.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230329100039.e724878f502e.I66870d4629244b4b309be79e11cbbd384bdf93be@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent f14ad95a
...@@ -2722,7 +2722,7 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm, ...@@ -2722,7 +2722,7 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
&mvm->status)) { &mvm->status)) {
/* first remove remaining keys */ /* first remove remaining keys */
iwl_mvm_sec_key_remove_ap(mvm, vif, iwl_mvm_sec_key_remove_ap(mvm, vif,
&mvmvif->deflink); &mvmvif->deflink, 0);
/* /*
* Remove AP station now that * Remove AP station now that
......
...@@ -195,6 +195,7 @@ static void iwl_mvm_sec_key_remove_ap_iter(struct ieee80211_hw *hw, ...@@ -195,6 +195,7 @@ static void iwl_mvm_sec_key_remove_ap_iter(struct ieee80211_hw *hw,
void *data) void *data)
{ {
struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
unsigned int link_id = (uintptr_t)data;
if (key->hw_key_idx == STA_KEY_IDX_INVALID) if (key->hw_key_idx == STA_KEY_IDX_INVALID)
return; return;
...@@ -202,13 +203,17 @@ static void iwl_mvm_sec_key_remove_ap_iter(struct ieee80211_hw *hw, ...@@ -202,13 +203,17 @@ static void iwl_mvm_sec_key_remove_ap_iter(struct ieee80211_hw *hw,
if (sta) if (sta)
return; return;
if (key->link_id >= 0 && key->link_id != link_id)
return;
_iwl_mvm_sec_key_del(mvm, vif, NULL, key, CMD_ASYNC); _iwl_mvm_sec_key_del(mvm, vif, NULL, key, CMD_ASYNC);
key->hw_key_idx = STA_KEY_IDX_INVALID; key->hw_key_idx = STA_KEY_IDX_INVALID;
} }
void iwl_mvm_sec_key_remove_ap(struct iwl_mvm *mvm, void iwl_mvm_sec_key_remove_ap(struct iwl_mvm *mvm,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct iwl_mvm_vif_link_info *link) struct iwl_mvm_vif_link_info *link,
unsigned int link_id)
{ {
u32 sec_key_id = WIDE_ID(DATA_PATH_GROUP, SEC_KEY_CMD); u32 sec_key_id = WIDE_ID(DATA_PATH_GROUP, SEC_KEY_CMD);
u8 sec_key_ver = iwl_fw_lookup_cmd_ver(mvm->fw, sec_key_id, 0); u8 sec_key_ver = iwl_fw_lookup_cmd_ver(mvm->fw, sec_key_id, 0);
...@@ -222,5 +227,5 @@ void iwl_mvm_sec_key_remove_ap(struct iwl_mvm *mvm, ...@@ -222,5 +227,5 @@ void iwl_mvm_sec_key_remove_ap(struct iwl_mvm *mvm,
ieee80211_iter_keys_rcu(mvm->hw, vif, ieee80211_iter_keys_rcu(mvm->hw, vif,
iwl_mvm_sec_key_remove_ap_iter, iwl_mvm_sec_key_remove_ap_iter,
NULL); (void *)(uintptr_t)link_id);
} }
...@@ -544,7 +544,7 @@ static void iwl_mvm_mld_vif_delete_all_stas(struct iwl_mvm *mvm, ...@@ -544,7 +544,7 @@ static void iwl_mvm_mld_vif_delete_all_stas(struct iwl_mvm *mvm,
if (!link) if (!link)
continue; continue;
iwl_mvm_sec_key_remove_ap(mvm, vif, link); iwl_mvm_sec_key_remove_ap(mvm, vif, link, i);
ret = iwl_mvm_mld_rm_sta_id(mvm, vif, link->ap_sta_id); ret = iwl_mvm_mld_rm_sta_id(mvm, vif, link->ap_sta_id);
if (ret) if (ret)
IWL_ERR(mvm, "failed to remove AP station\n"); IWL_ERR(mvm, "failed to remove AP station\n");
......
...@@ -2328,7 +2328,8 @@ int iwl_mvm_sec_key_del(struct iwl_mvm *mvm, ...@@ -2328,7 +2328,8 @@ int iwl_mvm_sec_key_del(struct iwl_mvm *mvm,
struct ieee80211_key_conf *keyconf); struct ieee80211_key_conf *keyconf);
void iwl_mvm_sec_key_remove_ap(struct iwl_mvm *mvm, void iwl_mvm_sec_key_remove_ap(struct iwl_mvm *mvm,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct iwl_mvm_vif_link_info *link); struct iwl_mvm_vif_link_info *link,
unsigned int link_id);
int iwl_rfi_send_config_cmd(struct iwl_mvm *mvm, int iwl_rfi_send_config_cmd(struct iwl_mvm *mvm,
struct iwl_rfi_lut_entry *rfi_table); struct iwl_rfi_lut_entry *rfi_table);
......
...@@ -2022,7 +2022,7 @@ bool iwl_mvm_sta_del(struct iwl_mvm *mvm, struct ieee80211_vif *vif, ...@@ -2022,7 +2022,7 @@ bool iwl_mvm_sta_del(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
return true; return true;
/* first remove remaining keys */ /* first remove remaining keys */
iwl_mvm_sec_key_remove_ap(mvm, vif, &mvmvif->deflink); iwl_mvm_sec_key_remove_ap(mvm, vif, &mvmvif->deflink, 0);
/* unassoc - go ahead - remove the AP STA now */ /* unassoc - go ahead - remove the AP STA now */
mvmvif->deflink.ap_sta_id = IWL_MVM_INVALID_STA; mvmvif->deflink.ap_sta_id = IWL_MVM_INVALID_STA;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment