]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: iwlwifi: mvm: remove MLO GTK rekey code
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 9 Jul 2025 05:16:31 +0000 (08:16 +0300)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 9 Jul 2025 08:43:16 +0000 (11:43 +0300)
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
drivers/net/wireless/intel/iwlwifi/mvm/d3.c

index e1070b89130075f82908a560fd116d3f2ba68716..1af9e54a882d53a09cbe88d7434935eb6c03fd3c 100644 (file)
@@ -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;