mirror of
https://github.com/torvalds/linux.git
synced 2026-07-31 19:47:08 +02:00
wifi: iwlwifi: mvm: remove MLO GTK rekey code
iwlmvm driver does not support MLO. Remove this code Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Link: https://patch.msgid.link/20250709081300.4957e50dee91.I2a432256dbc3069e0300e1f833e10a93d203f538@changeid
This commit is contained in:
parent
8a4583d626
commit
cb09c80f59
|
|
@ -1474,9 +1474,6 @@ struct iwl_wowlan_status_data {
|
|||
struct iwl_multicast_key_data igtk;
|
||||
struct iwl_multicast_key_data bigtk[WOWLAN_BIGTK_KEYS_NUM];
|
||||
|
||||
int num_mlo_keys;
|
||||
struct iwl_wowlan_mlo_gtk mlo_keys[WOWLAN_MAX_MLO_KEYS];
|
||||
|
||||
u8 *wake_packet;
|
||||
};
|
||||
|
||||
|
|
@ -1986,167 +1983,6 @@ static void iwl_mvm_d3_update_keys(struct ieee80211_hw *hw,
|
|||
}
|
||||
}
|
||||
|
||||
struct iwl_mvm_d3_mlo_old_keys {
|
||||
u32 cipher[IEEE80211_MLD_MAX_NUM_LINKS][WOWLAN_MLO_GTK_KEY_NUM_TYPES];
|
||||
struct ieee80211_key_conf *key[IEEE80211_MLD_MAX_NUM_LINKS][8];
|
||||
};
|
||||
|
||||
static void iwl_mvm_mlo_key_ciphers(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key,
|
||||
void *data)
|
||||
{
|
||||
struct iwl_mvm_d3_mlo_old_keys *old_keys = data;
|
||||
enum iwl_wowlan_mlo_gtk_type key_type;
|
||||
|
||||
if (key->link_id < 0)
|
||||
return;
|
||||
|
||||
if (WARN_ON(key->link_id >= IEEE80211_MLD_MAX_NUM_LINKS ||
|
||||
key->keyidx >= 8))
|
||||
return;
|
||||
|
||||
if (WARN_ON(old_keys->key[key->link_id][key->keyidx]))
|
||||
return;
|
||||
|
||||
switch (key->cipher) {
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
key_type = WOWLAN_MLO_GTK_KEY_TYPE_GTK;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
if (key->keyidx == 4 || key->keyidx == 5) {
|
||||
key_type = WOWLAN_MLO_GTK_KEY_TYPE_IGTK;
|
||||
break;
|
||||
} else if (key->keyidx == 6 || key->keyidx == 7) {
|
||||
key_type = WOWLAN_MLO_GTK_KEY_TYPE_BIGTK;
|
||||
break;
|
||||
}
|
||||
return;
|
||||
default:
|
||||
/* ignore WEP/TKIP or unknown ciphers */
|
||||
return;
|
||||
}
|
||||
|
||||
old_keys->cipher[key->link_id][key_type] = key->cipher;
|
||||
old_keys->key[key->link_id][key->keyidx] = key;
|
||||
}
|
||||
|
||||
static bool iwl_mvm_mlo_gtk_rekey(struct iwl_wowlan_status_data *status,
|
||||
struct ieee80211_vif *vif,
|
||||
struct iwl_mvm *mvm)
|
||||
{
|
||||
int i;
|
||||
struct iwl_mvm_d3_mlo_old_keys *old_keys;
|
||||
bool ret = true;
|
||||
|
||||
IWL_DEBUG_WOWLAN(mvm, "Num of MLO Keys: %d\n", status->num_mlo_keys);
|
||||
if (!status->num_mlo_keys)
|
||||
return true;
|
||||
|
||||
old_keys = kzalloc(sizeof(*old_keys), GFP_KERNEL);
|
||||
if (!old_keys)
|
||||
return false;
|
||||
|
||||
/* find the cipher for each mlo key */
|
||||
ieee80211_iter_keys(mvm->hw, vif, iwl_mvm_mlo_key_ciphers, old_keys);
|
||||
|
||||
for (i = 0; i < status->num_mlo_keys; i++) {
|
||||
struct iwl_wowlan_mlo_gtk *mlo_key = &status->mlo_keys[i];
|
||||
struct ieee80211_key_conf *key, *old_key;
|
||||
struct ieee80211_key_seq seq;
|
||||
DEFINE_RAW_FLEX(struct ieee80211_key_conf, conf, key,
|
||||
WOWLAN_KEY_MAX_SIZE);
|
||||
u16 flags = le16_to_cpu(mlo_key->flags);
|
||||
int j, link_id, key_id, key_type;
|
||||
|
||||
link_id = u16_get_bits(flags, WOWLAN_MLO_GTK_FLAG_LINK_ID_MSK);
|
||||
key_id = u16_get_bits(flags, WOWLAN_MLO_GTK_FLAG_KEY_ID_MSK);
|
||||
key_type = u16_get_bits(flags,
|
||||
WOWLAN_MLO_GTK_FLAG_KEY_TYPE_MSK);
|
||||
|
||||
if (!(vif->valid_links & BIT(link_id)))
|
||||
continue;
|
||||
|
||||
if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS ||
|
||||
key_id >= 8 ||
|
||||
key_type >= WOWLAN_MLO_GTK_KEY_NUM_TYPES))
|
||||
continue;
|
||||
|
||||
conf->cipher = old_keys->cipher[link_id][key_type];
|
||||
/* WARN_ON? */
|
||||
if (!conf->cipher)
|
||||
continue;
|
||||
|
||||
conf->keylen = 0;
|
||||
switch (conf->cipher) {
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
conf->keylen = WLAN_KEY_LEN_CCMP;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
conf->keylen = WLAN_KEY_LEN_GCMP_256;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
conf->keylen = WLAN_KEY_LEN_BIP_GMAC_128;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
conf->keylen = WLAN_KEY_LEN_BIP_GMAC_256;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
conf->keylen = WLAN_KEY_LEN_AES_CMAC;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
conf->keylen = WLAN_KEY_LEN_BIP_CMAC_256;
|
||||
break;
|
||||
}
|
||||
|
||||
if (WARN_ON(!conf->keylen ||
|
||||
conf->keylen > WOWLAN_KEY_MAX_SIZE))
|
||||
continue;
|
||||
|
||||
memcpy(conf->key, mlo_key->key, conf->keylen);
|
||||
conf->keyidx = key_id;
|
||||
|
||||
old_key = old_keys->key[link_id][key_id];
|
||||
if (old_key) {
|
||||
IWL_DEBUG_WOWLAN(mvm,
|
||||
"Remove MLO key id %d, link id %d\n",
|
||||
key_id, link_id);
|
||||
ieee80211_remove_key(old_key);
|
||||
}
|
||||
|
||||
IWL_DEBUG_WOWLAN(mvm, "Add MLO key id %d, link id %d\n",
|
||||
key_id, link_id);
|
||||
key = ieee80211_gtk_rekey_add(vif, conf, link_id);
|
||||
if (WARN_ON(IS_ERR(key))) {
|
||||
ret = false;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* mac80211 expects the pn in big-endian
|
||||
* also note that seq is a union of all cipher types
|
||||
* (ccmp, gcmp, cmac, gmac), and they all have the same
|
||||
* pn field (of length 6) so just copy it to ccmp.pn.
|
||||
*/
|
||||
for (j = 5; j >= 0; j--)
|
||||
seq.ccmp.pn[5 - j] = mlo_key->pn[j];
|
||||
|
||||
/* group keys are non-QoS and use TID 0 */
|
||||
ieee80211_set_key_rx_seq(key, 0, &seq);
|
||||
}
|
||||
|
||||
out:
|
||||
kfree(old_keys);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool iwl_mvm_gtk_rekey(struct iwl_wowlan_status_data *status,
|
||||
struct ieee80211_vif *vif,
|
||||
struct iwl_mvm *mvm, u32 gtk_cipher)
|
||||
|
|
@ -2346,9 +2182,6 @@ static bool iwl_mvm_setup_connection_keep(struct iwl_mvm *mvm,
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!iwl_mvm_mlo_gtk_rekey(status, vif, mvm))
|
||||
return false;
|
||||
|
||||
ieee80211_gtk_rekey_notify(vif, vif->bss_conf.bssid,
|
||||
(void *)&replay_ctr, GFP_KERNEL);
|
||||
}
|
||||
|
|
@ -2479,10 +2312,11 @@ static void iwl_mvm_parse_wowlan_info_notif(struct iwl_mvm *mvm,
|
|||
struct iwl_wowlan_status_data *status,
|
||||
u32 len)
|
||||
{
|
||||
u32 expected_len = sizeof(*data) +
|
||||
data->num_mlo_link_keys * sizeof(status->mlo_keys[0]);
|
||||
if (IWL_FW_CHECK(mvm, data->num_mlo_link_keys,
|
||||
"MLO is not supported, shouldn't receive MLO keys\n"))
|
||||
return;
|
||||
|
||||
if (len < expected_len) {
|
||||
if (len < sizeof(*data)) {
|
||||
IWL_ERR(mvm, "Invalid WoWLAN info notification!\n");
|
||||
status = NULL;
|
||||
return;
|
||||
|
|
@ -2511,33 +2345,21 @@ static void iwl_mvm_parse_wowlan_info_notif(struct iwl_mvm *mvm,
|
|||
le32_to_cpu(data->num_of_gtk_rekeys);
|
||||
status->received_beacons = le32_to_cpu(data->received_beacons);
|
||||
status->tid_tear_down = data->tid_tear_down;
|
||||
|
||||
if (data->num_mlo_link_keys) {
|
||||
status->num_mlo_keys = data->num_mlo_link_keys;
|
||||
if (IWL_FW_CHECK(mvm,
|
||||
status->num_mlo_keys > WOWLAN_MAX_MLO_KEYS,
|
||||
"Too many mlo keys: %d, max %d\n",
|
||||
status->num_mlo_keys, WOWLAN_MAX_MLO_KEYS))
|
||||
status->num_mlo_keys = WOWLAN_MAX_MLO_KEYS;
|
||||
memcpy(status->mlo_keys, data->mlo_gtks,
|
||||
status->num_mlo_keys * sizeof(status->mlo_keys[0]));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
iwl_mvm_parse_wowlan_info_notif_v4(struct iwl_mvm *mvm,
|
||||
struct iwl_wowlan_info_notif_v4 *data,
|
||||
struct iwl_wowlan_status_data *status,
|
||||
u32 len, bool has_mlo_keys)
|
||||
u32 len)
|
||||
{
|
||||
u32 i;
|
||||
u32 expected_len = sizeof(*data);
|
||||
|
||||
if (has_mlo_keys)
|
||||
expected_len += (data->num_mlo_link_keys *
|
||||
sizeof(status->mlo_keys[0]));
|
||||
if (IWL_FW_CHECK(mvm, data->num_mlo_link_keys,
|
||||
"MLO is not supported, shouldn't receive MLO keys\n"))
|
||||
return;
|
||||
|
||||
if (len < expected_len) {
|
||||
if (len < sizeof(*data)) {
|
||||
IWL_ERR(mvm, "Invalid WoWLAN info notification!\n");
|
||||
status = NULL;
|
||||
return;
|
||||
|
|
@ -2560,17 +2382,6 @@ iwl_mvm_parse_wowlan_info_notif_v4(struct iwl_mvm *mvm,
|
|||
le32_to_cpu(data->num_of_gtk_rekeys);
|
||||
status->received_beacons = le32_to_cpu(data->received_beacons);
|
||||
status->tid_tear_down = data->tid_tear_down;
|
||||
|
||||
if (has_mlo_keys && data->num_mlo_link_keys) {
|
||||
status->num_mlo_keys = data->num_mlo_link_keys;
|
||||
if (IWL_FW_CHECK(mvm,
|
||||
status->num_mlo_keys > WOWLAN_MAX_MLO_KEYS,
|
||||
"Too many mlo keys: %d, max %d\n",
|
||||
status->num_mlo_keys, WOWLAN_MAX_MLO_KEYS))
|
||||
status->num_mlo_keys = WOWLAN_MAX_MLO_KEYS;
|
||||
memcpy(status->mlo_keys, data->mlo_gtks,
|
||||
status->num_mlo_keys * sizeof(status->mlo_keys[0]));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -3321,8 +3132,7 @@ static bool iwl_mvm_wait_d3_notif(struct iwl_notif_wait_data *notif_wait,
|
|||
(void *)pkt->data;
|
||||
|
||||
iwl_mvm_parse_wowlan_info_notif_v4(mvm, notif,
|
||||
d3_data->status, len,
|
||||
wowlan_info_ver > 3);
|
||||
d3_data->status, len);
|
||||
} else {
|
||||
struct iwl_wowlan_info_notif *notif =
|
||||
(void *)pkt->data;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user