wifi: iwlwifi: mvm: fix the key PN index
authorShaul Triebitz <shaul.triebitz@intel.com>
Mon, 5 Feb 2024 19:21:09 +0000 (21:21 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 8 Feb 2024 14:00:47 +0000 (15:00 +0100)
When waking from D3 (and a GTK rekey happened during
D3), the key itself is saved in iwl_wowlan_status_data::gtk
array, but the PN is saved in iwl_wowlan_status_data::gtk_seq
array.
The indices (of the same key) might differ in both arrays.
Fix using the gtk array index in the gtk_seq array.
Rather, iterate and search for the correct key in the
gtk_seq array.

Signed-off-by: Shaul Triebitz <shaul.triebitz@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240205211151.bdd0511c007d.I3325288c64c010a4d008ac4429de1c2b14ef764c@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/d3.c

index 6396fbde03c4a7cd91f84fd32752f273a3a4bb9e..994387eac6f709b9e207165d027f10c5fcc44b3e 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
- * Copyright (C) 2012-2014, 2018-2023 Intel Corporation
+ * Copyright (C) 2012-2014, 2018-2024 Intel Corporation
  * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
  * Copyright (C) 2016-2017 Intel Deutschland GmbH
  */
@@ -1958,7 +1958,7 @@ static bool iwl_mvm_gtk_rekey(struct iwl_wowlan_status_data *status,
                              struct ieee80211_vif *vif,
                              struct iwl_mvm *mvm, u32 gtk_cipher)
 {
-       int i;
+       int i, j;
        struct ieee80211_key_conf *key;
        struct {
                struct ieee80211_key_conf conf;
@@ -2002,7 +2002,15 @@ static bool iwl_mvm_gtk_rekey(struct iwl_wowlan_status_data *status,
                key = ieee80211_gtk_rekey_add(vif, &conf.conf);
                if (IS_ERR(key))
                        return false;
-               iwl_mvm_set_key_rx_seq_idx(key, status, i);
+
+               for (j = 0; j < ARRAY_SIZE(status->gtk_seq); j++) {
+                       if (!status->gtk_seq[j].valid ||
+                           status->gtk_seq[j].key_id != key->keyidx)
+                               continue;
+                       iwl_mvm_set_key_rx_seq_idx(key, status, j);
+                       break;
+               }
+               WARN_ON(j == ARRAY_SIZE(status->gtk_seq));
        }
 
        return true;