wifi: iwlwifi: iwlmvm: handle unprotected deauth/disassoc in d3
authorShaul Triebitz <shaul.triebitz@intel.com>
Tue, 6 Feb 2024 16:02:12 +0000 (18:02 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 12 Feb 2024 20:24:01 +0000 (21:24 +0100)
In MFP, do not disconnect if an unprotected deauth
or disassoc was received during D3.
For that, need to configure wowlan with MFP (IS_11W_ASSOC).

Now, in case of an unprotected deauth/disassoc, the wakeup
reason returned by the firmware will be:
IWL_WAKEUP_BY_11W_UNPROTECTED_DEAUTH_OR_DISASSOC
(and not IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_DEAUTH
which will cause a disconnection).
Also, report this reason to cfg80211.

In another patch, the driver will send an SA query.

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

index e1c77276557d2f341cacdc0660ff570c02b7bc03..26c01d740d0d80f54fe41ff28b00858b6c812226 100644 (file)
@@ -925,6 +925,9 @@ iwl_mvm_get_wowlan_config(struct iwl_mvm *mvm,
        wowlan_config_cmd->flags = ENABLE_L3_FILTERING |
                ENABLE_NBNS_FILTERING | ENABLE_DHCP_FILTERING;
 
+       if (ap_sta->mfp)
+               wowlan_config_cmd->flags |= IS_11W_ASSOC;
+
        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);
@@ -1511,6 +1514,9 @@ static void iwl_mvm_report_wakeup_reasons(struct iwl_mvm *mvm,
        if (reasons & IWL_WOWLAN_WAKEUP_BY_REM_WAKE_WAKEUP_PACKET)
                wakeup.tcp_match = true;
 
+       if (reasons & IWL_WAKEUP_BY_11W_UNPROTECTED_DEAUTH_OR_DISASSOC)
+               wakeup.unprot_deauth_disassoc = true;
+
        if (status->wake_packet) {
                int pktsize = status->wake_packet_bufsize;
                int pktlen = status->wake_packet_length;