]> www.infradead.org Git - users/hch/misc.git/commitdiff
wifi: iwlwifi: mld/mvm: set beacon protection capability in wowlan config
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Thu, 21 Aug 2025 17:47:18 +0000 (20:47 +0300)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Tue, 26 Aug 2025 15:39:44 +0000 (18:39 +0300)
Although the FW knows if a BIGTK was installed and can conclude from
that the beacon protection capability, the specific component
of the FW that is responsible for rekeying while in wowlan, doesn't know
what keys were installed.
So we need to tell that the FW when we go to wowlan, otherwise it will
ignore the BIGTK rekey, if such occurs.
Set this bit when needed.

Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250821204455.d3968487865e.I784f564ab85f618f26d3f082197a384bb219e07c@changeid
drivers/net/wireless/intel/iwlwifi/fw/api/d3.h
drivers/net/wireless/intel/iwlwifi/mld/d3.c
drivers/net/wireless/intel/iwlwifi/mld/key.c
drivers/net/wireless/intel/iwlwifi/mld/key.h
drivers/net/wireless/intel/iwlwifi/mvm/d3.c

index 53445087e9cbd012955348708e44fa29add940d8..9103f70c41c02d27fa4f2bed1923fc69bb0f1b81 100644 (file)
@@ -367,6 +367,7 @@ enum iwl_wowlan_flags {
        ENABLE_NBNS_FILTERING   = BIT(2),
        ENABLE_DHCP_FILTERING   = BIT(3),
        ENABLE_STORE_BEACON     = BIT(4),
+       HAS_BEACON_PROTECTION   = BIT(5),
 };
 
 /**
index da621fe11d62433bbb032f5f48491d00dbcaa196..86bb3a7a9f7f0aa6f300734875f1e1c9a94c2642 100644 (file)
@@ -1570,7 +1570,8 @@ static void
 iwl_mld_set_wowlan_config_cmd(struct iwl_mld *mld,
                              struct cfg80211_wowlan *wowlan,
                              struct iwl_wowlan_config_cmd *wowlan_config_cmd,
-                             struct ieee80211_sta *ap_sta)
+                             struct ieee80211_sta *ap_sta,
+                             struct ieee80211_bss_conf *link)
 {
        wowlan_config_cmd->is_11n_connection =
                                        ap_sta->deflink.ht_cap.ht_supported;
@@ -1580,6 +1581,9 @@ iwl_mld_set_wowlan_config_cmd(struct iwl_mld *mld,
        if (ap_sta->mfp)
                wowlan_config_cmd->flags |= IS_11W_ASSOC;
 
+       if (iwl_mld_beacon_protection_enabled(mld, link))
+               wowlan_config_cmd->flags |= HAS_BEACON_PROTECTION;
+
        if (wowlan->disconnect)
                wowlan_config_cmd->wakeup_filter |=
                        cpu_to_le32(IWL_WOWLAN_WAKEUP_BEACON_MISS |
@@ -1777,7 +1781,7 @@ iwl_mld_wowlan_config(struct iwl_mld *mld, struct ieee80211_vif *bss_vif,
                return ret;
 
        iwl_mld_set_wowlan_config_cmd(mld, wowlan,
-                                     &wowlan_config_cmd, ap_sta);
+                                     &wowlan_config_cmd, ap_sta, link_conf);
        ret = iwl_mld_send_cmd_pdu(mld, WOWLAN_CONFIGURATION,
                                   &wowlan_config_cmd);
        if (ret)
index a90477971c7203461024cda64b7fe5feb9b41e00..04192c5f07ffce82ce48eccc208350f1b98d089c 100644 (file)
@@ -394,3 +394,15 @@ void iwl_mld_track_bigtk(struct iwl_mld *mld,
        else
                RCU_INIT_POINTER(link->bigtks[key->keyidx - 6], NULL);
 }
+
+bool iwl_mld_beacon_protection_enabled(struct iwl_mld *mld,
+                                      struct ieee80211_bss_conf *link)
+{
+       struct iwl_mld_link *mld_link = iwl_mld_link_from_mac80211(link);
+
+       if (WARN_ON(!mld_link))
+               return false;
+
+       return rcu_access_pointer(mld_link->bigtks[0]) ||
+               rcu_access_pointer(mld_link->bigtks[1]);
+}
index 63de3469270a2499b25f72aabc7b3b455faccc94..5a9efdaa3b0385af53667e1a5fe6e999cb43a8f0 100644 (file)
@@ -40,4 +40,7 @@ void iwl_mld_track_bigtk(struct iwl_mld *mld,
                         struct ieee80211_vif *vif,
                         struct ieee80211_key_conf *key, bool add);
 
+bool iwl_mld_beacon_protection_enabled(struct iwl_mld *mld,
+                                      struct ieee80211_bss_conf *link);
+
 #endif /* __iwl_mld_key_h__ */
index a31bc2af530068fdadb7512d73fb163b1628130b..198a280b60f9882a0131316b87f3c960090b4e91 100644 (file)
@@ -928,6 +928,10 @@ iwl_mvm_get_wowlan_config(struct iwl_mvm *mvm,
        if (ap_sta->mfp)
                wowlan_config_cmd->flags |= IS_11W_ASSOC;
 
+       if (rcu_access_pointer(mvmvif->bcn_prot.keys[0]) ||
+           rcu_access_pointer(mvmvif->bcn_prot.keys[1]))
+               wowlan_config_cmd->flags |= HAS_BEACON_PROTECTION;
+
        if (iwl_fw_lookup_cmd_ver(mvm->fw, WOWLAN_CONFIGURATION, 0) < 6) {
                /* Query the last used seqno and set it */
                int ret = iwl_mvm_get_last_nonqos_seq(mvm, vif);