VYPR
Unrated severityNVD Advisory· Published Jun 3, 2026

CVE-2026-46271

CVE-2026-46271

Description

Linux kernel WiFi driver crash fixed by ensuring WoW offloads are only enabled on the primary link.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

Linux kernel WiFi driver crash fixed by ensuring WoW offloads are only enabled on the primary link.

Vulnerability

The Linux kernel's ath12k WiFi driver is vulnerable to a firmware crash on the WCN7850 device when multi-link connections are used. This occurs because Wake-on-Wireless (WoW) offloads are incorrectly enabled on both primary and secondary links, leading to the firmware instability. The issue affects the WCN7850 hardware, specifically tested on WCN7850 hw2.0 PCI WLAN.HMT.1.1.c5-00284-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.

Exploitation

An attacker would need to establish a multi-link WiFi connection to a vulnerable WCN7850 device. Once connected, the firmware crash is triggered by the driver's behavior of enabling WoW offloads on both the primary and secondary links, rather than exclusively on the primary link as intended.

Impact

Successful exploitation of this vulnerability results in a crash of the WCN7850 firmware. This would likely lead to a denial of service for WiFi connectivity on the affected device, rendering the wireless network unusable.

Mitigation

This vulnerability has been resolved by changing the driver to perform WoW offloads only on the primary link. The fix is available in the Linux kernel. The specific fixed version and release date are not detailed in the provided references, nor is information on workarounds or End-of-Life status. The reference provided is a kernel git commit, indicating the fix is integrated into the kernel source tree [1].

AI Insight generated on Jun 3, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected products

2

Patches

6
7379837c3f9e

wifi: ath12k: do WoW offloads only on primary link

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitBaochen QiangFixed in 6.18.14via kernel-cna
1 file changed · +16 1
  • drivers/net/wireless/ath/ath12k/wow.c+16 1 modified
    diff --git a/drivers/net/wireless/ath/ath12k/wow.c b/drivers/net/wireless/ath/ath12k/wow.c
    index e8481626f1940..c78aa95d49791 100644
    --- a/drivers/net/wireless/ath/ath12k/wow.c
    +++ b/drivers/net/wireless/ath/ath12k/wow.c
    @@ -135,6 +135,9 @@ static int ath12k_wow_cleanup(struct ath12k *ar)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		ret = ath12k_wow_vif_cleanup(arvif);
     		if (ret) {
     			ath12k_warn(ar->ab, "failed to clean wow wakeups on vdev %i: %d\n",
    @@ -479,8 +482,12 @@ static int ath12k_wow_set_wakeups(struct ath12k *ar,
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (ath12k_wow_is_p2p_vdev(arvif->ahvif))
     			continue;
    +
     		ret = ath12k_wow_vif_set_wakeups(arvif, wowlan);
     		if (ret) {
     			ath12k_warn(ar->ab, "failed to set wow wakeups on vdev %i: %d\n",
    @@ -538,6 +545,9 @@ static int ath12k_wow_nlo_cleanup(struct ath12k *ar)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (ath12k_wow_is_p2p_vdev(arvif->ahvif))
     			continue;
     
    @@ -745,6 +755,9 @@ static int ath12k_wow_arp_ns_offload(struct ath12k *ar, bool enable)
     	list_for_each_entry(arvif, &ar->arvifs, list) {
     		ahvif = arvif->ahvif;
     
    +		if (arvif != &ahvif->deflink)
    +			continue;
    +
     		if (ahvif->vdev_type != WMI_VDEV_TYPE_STA)
     			continue;
     
    @@ -776,6 +789,9 @@ static int ath12k_gtk_rekey_offload(struct ath12k *ar, bool enable)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA ||
     		    !arvif->is_up ||
     		    !arvif->rekey_data.enable_offload)
    -- 
    cgit 1.3-korg
    
    
    
e62102ac9b77

wifi: ath12k: do WoW offloads only on primary link

1 file changed · +16 1
  • drivers/net/wireless/ath/ath12k/wow.c+16 1 modified
    diff --git a/drivers/net/wireless/ath/ath12k/wow.c b/drivers/net/wireless/ath/ath12k/wow.c
    index f56ec44a16361..bb08e17405825 100644
    --- a/drivers/net/wireless/ath/ath12k/wow.c
    +++ b/drivers/net/wireless/ath/ath12k/wow.c
    @@ -135,6 +135,9 @@ static int ath12k_wow_cleanup(struct ath12k *ar)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		ret = ath12k_wow_vif_cleanup(arvif);
     		if (ret) {
     			ath12k_warn(ar->ab, "failed to clean wow wakeups on vdev %i: %d\n",
    @@ -479,8 +482,12 @@ static int ath12k_wow_set_wakeups(struct ath12k *ar,
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (ath12k_wow_is_p2p_vdev(arvif->ahvif))
     			continue;
    +
     		ret = ath12k_wow_vif_set_wakeups(arvif, wowlan);
     		if (ret) {
     			ath12k_warn(ar->ab, "failed to set wow wakeups on vdev %i: %d\n",
    @@ -538,6 +545,9 @@ static int ath12k_wow_nlo_cleanup(struct ath12k *ar)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (ath12k_wow_is_p2p_vdev(arvif->ahvif))
     			continue;
     
    @@ -745,6 +755,9 @@ static int ath12k_wow_arp_ns_offload(struct ath12k *ar, bool enable)
     	list_for_each_entry(arvif, &ar->arvifs, list) {
     		ahvif = arvif->ahvif;
     
    +		if (arvif != &ahvif->deflink)
    +			continue;
    +
     		if (ahvif->vdev_type != WMI_VDEV_TYPE_STA)
     			continue;
     
    @@ -776,6 +789,9 @@ static int ath12k_gtk_rekey_offload(struct ath12k *ar, bool enable)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA ||
     		    !arvif->is_up ||
     		    !arvif->rekey_data.enable_offload)
    -- 
    cgit 1.3-korg
    
    
    
e042da1085d9

wifi: ath12k: do WoW offloads only on primary link

1 file changed · +16 1
  • drivers/net/wireless/ath/ath12k/wow.c+16 1 modified
    diff --git a/drivers/net/wireless/ath/ath12k/wow.c b/drivers/net/wireless/ath/ath12k/wow.c
    index e8481626f1940..c78aa95d49791 100644
    --- a/drivers/net/wireless/ath/ath12k/wow.c
    +++ b/drivers/net/wireless/ath/ath12k/wow.c
    @@ -135,6 +135,9 @@ static int ath12k_wow_cleanup(struct ath12k *ar)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		ret = ath12k_wow_vif_cleanup(arvif);
     		if (ret) {
     			ath12k_warn(ar->ab, "failed to clean wow wakeups on vdev %i: %d\n",
    @@ -479,8 +482,12 @@ static int ath12k_wow_set_wakeups(struct ath12k *ar,
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (ath12k_wow_is_p2p_vdev(arvif->ahvif))
     			continue;
    +
     		ret = ath12k_wow_vif_set_wakeups(arvif, wowlan);
     		if (ret) {
     			ath12k_warn(ar->ab, "failed to set wow wakeups on vdev %i: %d\n",
    @@ -538,6 +545,9 @@ static int ath12k_wow_nlo_cleanup(struct ath12k *ar)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (ath12k_wow_is_p2p_vdev(arvif->ahvif))
     			continue;
     
    @@ -745,6 +755,9 @@ static int ath12k_wow_arp_ns_offload(struct ath12k *ar, bool enable)
     	list_for_each_entry(arvif, &ar->arvifs, list) {
     		ahvif = arvif->ahvif;
     
    +		if (arvif != &ahvif->deflink)
    +			continue;
    +
     		if (ahvif->vdev_type != WMI_VDEV_TYPE_STA)
     			continue;
     
    @@ -776,6 +789,9 @@ static int ath12k_gtk_rekey_offload(struct ath12k *ar, bool enable)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA ||
     		    !arvif->is_up ||
     		    !arvif->rekey_data.enable_offload)
    -- 
    cgit 1.3-korg
    
    
    
7379837c3f9e

wifi: ath12k: do WoW offloads only on primary link

1 file changed · +16 1
  • drivers/net/wireless/ath/ath12k/wow.c+16 1 modified
    diff --git a/drivers/net/wireless/ath/ath12k/wow.c b/drivers/net/wireless/ath/ath12k/wow.c
    index e8481626f1940..c78aa95d49791 100644
    --- a/drivers/net/wireless/ath/ath12k/wow.c
    +++ b/drivers/net/wireless/ath/ath12k/wow.c
    @@ -135,6 +135,9 @@ static int ath12k_wow_cleanup(struct ath12k *ar)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		ret = ath12k_wow_vif_cleanup(arvif);
     		if (ret) {
     			ath12k_warn(ar->ab, "failed to clean wow wakeups on vdev %i: %d\n",
    @@ -479,8 +482,12 @@ static int ath12k_wow_set_wakeups(struct ath12k *ar,
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (ath12k_wow_is_p2p_vdev(arvif->ahvif))
     			continue;
    +
     		ret = ath12k_wow_vif_set_wakeups(arvif, wowlan);
     		if (ret) {
     			ath12k_warn(ar->ab, "failed to set wow wakeups on vdev %i: %d\n",
    @@ -538,6 +545,9 @@ static int ath12k_wow_nlo_cleanup(struct ath12k *ar)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (ath12k_wow_is_p2p_vdev(arvif->ahvif))
     			continue;
     
    @@ -745,6 +755,9 @@ static int ath12k_wow_arp_ns_offload(struct ath12k *ar, bool enable)
     	list_for_each_entry(arvif, &ar->arvifs, list) {
     		ahvif = arvif->ahvif;
     
    +		if (arvif != &ahvif->deflink)
    +			continue;
    +
     		if (ahvif->vdev_type != WMI_VDEV_TYPE_STA)
     			continue;
     
    @@ -776,6 +789,9 @@ static int ath12k_gtk_rekey_offload(struct ath12k *ar, bool enable)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA ||
     		    !arvif->is_up ||
     		    !arvif->rekey_data.enable_offload)
    -- 
    cgit 1.3-korg
    
    
    
e042da1085d9

wifi: ath12k: do WoW offloads only on primary link

1 file changed · +16 1
  • drivers/net/wireless/ath/ath12k/wow.c+16 1 modified
    diff --git a/drivers/net/wireless/ath/ath12k/wow.c b/drivers/net/wireless/ath/ath12k/wow.c
    index e8481626f1940..c78aa95d49791 100644
    --- a/drivers/net/wireless/ath/ath12k/wow.c
    +++ b/drivers/net/wireless/ath/ath12k/wow.c
    @@ -135,6 +135,9 @@ static int ath12k_wow_cleanup(struct ath12k *ar)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		ret = ath12k_wow_vif_cleanup(arvif);
     		if (ret) {
     			ath12k_warn(ar->ab, "failed to clean wow wakeups on vdev %i: %d\n",
    @@ -479,8 +482,12 @@ static int ath12k_wow_set_wakeups(struct ath12k *ar,
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (ath12k_wow_is_p2p_vdev(arvif->ahvif))
     			continue;
    +
     		ret = ath12k_wow_vif_set_wakeups(arvif, wowlan);
     		if (ret) {
     			ath12k_warn(ar->ab, "failed to set wow wakeups on vdev %i: %d\n",
    @@ -538,6 +545,9 @@ static int ath12k_wow_nlo_cleanup(struct ath12k *ar)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (ath12k_wow_is_p2p_vdev(arvif->ahvif))
     			continue;
     
    @@ -745,6 +755,9 @@ static int ath12k_wow_arp_ns_offload(struct ath12k *ar, bool enable)
     	list_for_each_entry(arvif, &ar->arvifs, list) {
     		ahvif = arvif->ahvif;
     
    +		if (arvif != &ahvif->deflink)
    +			continue;
    +
     		if (ahvif->vdev_type != WMI_VDEV_TYPE_STA)
     			continue;
     
    @@ -776,6 +789,9 @@ static int ath12k_gtk_rekey_offload(struct ath12k *ar, bool enable)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA ||
     		    !arvif->is_up ||
     		    !arvif->rekey_data.enable_offload)
    -- 
    cgit 1.3-korg
    
    
    
e62102ac9b77

wifi: ath12k: do WoW offloads only on primary link

1 file changed · +16 1
  • drivers/net/wireless/ath/ath12k/wow.c+16 1 modified
    diff --git a/drivers/net/wireless/ath/ath12k/wow.c b/drivers/net/wireless/ath/ath12k/wow.c
    index f56ec44a16361..bb08e17405825 100644
    --- a/drivers/net/wireless/ath/ath12k/wow.c
    +++ b/drivers/net/wireless/ath/ath12k/wow.c
    @@ -135,6 +135,9 @@ static int ath12k_wow_cleanup(struct ath12k *ar)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		ret = ath12k_wow_vif_cleanup(arvif);
     		if (ret) {
     			ath12k_warn(ar->ab, "failed to clean wow wakeups on vdev %i: %d\n",
    @@ -479,8 +482,12 @@ static int ath12k_wow_set_wakeups(struct ath12k *ar,
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (ath12k_wow_is_p2p_vdev(arvif->ahvif))
     			continue;
    +
     		ret = ath12k_wow_vif_set_wakeups(arvif, wowlan);
     		if (ret) {
     			ath12k_warn(ar->ab, "failed to set wow wakeups on vdev %i: %d\n",
    @@ -538,6 +545,9 @@ static int ath12k_wow_nlo_cleanup(struct ath12k *ar)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (ath12k_wow_is_p2p_vdev(arvif->ahvif))
     			continue;
     
    @@ -745,6 +755,9 @@ static int ath12k_wow_arp_ns_offload(struct ath12k *ar, bool enable)
     	list_for_each_entry(arvif, &ar->arvifs, list) {
     		ahvif = arvif->ahvif;
     
    +		if (arvif != &ahvif->deflink)
    +			continue;
    +
     		if (ahvif->vdev_type != WMI_VDEV_TYPE_STA)
     			continue;
     
    @@ -776,6 +789,9 @@ static int ath12k_gtk_rekey_offload(struct ath12k *ar, bool enable)
     	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
     
     	list_for_each_entry(arvif, &ar->arvifs, list) {
    +		if (arvif != &arvif->ahvif->deflink)
    +			continue;
    +
     		if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA ||
     		    !arvif->is_up ||
     		    !arvif->rekey_data.enable_offload)
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"The WCN7850 firmware crashes when Wi-Fi Offload (WoW) is enabled on both primary and secondary network links during a multi-link connection."

Attack vector

This vulnerability affects devices utilizing the ath12k driver in the Linux kernel, specifically when operating in a multi-link connection scenario. The firmware crash occurs due to WoW offloads being incorrectly enabled on both primary and secondary links. An attacker could potentially trigger this by establishing a multi-link connection where WoW offloads are active on all links, leading to a denial-of-service condition.

Affected code

The vulnerability resides in the `drivers/net/wireless/ath/ath12k/wow.c` file. Specifically, the changes are made within functions responsible for managing Wi-Fi Offload (WoW) functionalities, including `ath12k_wow_cleanup`, `ath12k_wow_set_wakeups`, `ath12k_wow_nlo_cleanup`, `ath12k_wow_arp_ns_offload`, and `ath12k_gtk_rekey_offload` [patch_id=4686520].

What the fix does

The patch modifies the `ath12k/wow.c` file to ensure that WoW offloads are only performed on the primary link. This is achieved by adding checks within functions like `ath12k_wow_cleanup`, `ath12k_wow_set_wakeups`, `ath12k_wow_nlo_cleanup`, `ath12k_wow_arp_ns_offload`, and `ath12k_gtk_rekey_offload` to verify if the current virtual interface (`arvif`) is the default link (`&arvif->ahvif->deflink`). By restricting WoW offloads to the primary link, the firmware no longer encounters the crash condition associated with processing these offloads on secondary links [patch_id=4686520].

Preconditions

  • configThe device must be running a Linux kernel with the ath12k driver.
  • configThe device must support multi-link connections and Wi-Fi Offload (WoW).

Generated on Jun 3, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

3

News mentions

2