linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] wifi: ath12k: Ignore fragments from uninitialized peer
@ 2023-08-21 13:03 Harshitha Prem
  2023-08-21 13:03 ` [PATCH v2 1/2] wifi: ath12k: Ignore fragments from uninitialized peer in dp Harshitha Prem
  2023-08-21 13:03 ` [PATCH v2 2/2] wifi: ath12k: fix undefined behavior with __fls " Harshitha Prem
  0 siblings, 2 replies; 5+ messages in thread
From: Harshitha Prem @ 2023-08-21 13:03 UTC (permalink / raw)
  To: ath12k; +Cc: linux-wireless, Harshitha Prem

When max virtual ap interfaces are configured in all the bands
with ACS and hostapd restart is done every 60s,
a crash is observed at random times in dp_rx path.

This patch series handles the following:
    1. Ignore the fragments of the peer which does not have its
       datapath initialized.
    2. Fix the undefined behavior of __fls which was found during
       this crash.

---
  v2: updated commit messages as per review comments from
      Johannes and Jeff
---

Harshitha Prem (2):
  wifi: ath12k: Ignore fragments from uninitialized peer in  dp
  wifi: ath12k: fix undefined behavior with __fls in dp

 drivers/net/wireless/ath/ath12k/dp.c    |  1 +
 drivers/net/wireless/ath/ath12k/dp_rx.c | 11 ++++++++++-
 drivers/net/wireless/ath/ath12k/peer.h  |  3 +++
 3 files changed, 14 insertions(+), 1 deletion(-)


base-commit: 3f257461ab0ab19806bae2bfde4c3cd88dbf050e
-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/2] wifi: ath12k: Ignore fragments from uninitialized peer in  dp
  2023-08-21 13:03 [PATCH v2 0/2] wifi: ath12k: Ignore fragments from uninitialized peer Harshitha Prem
@ 2023-08-21 13:03 ` Harshitha Prem
  2023-09-05 13:26   ` Kalle Valo
  2023-08-21 13:03 ` [PATCH v2 2/2] wifi: ath12k: fix undefined behavior with __fls " Harshitha Prem
  1 sibling, 1 reply; 5+ messages in thread
From: Harshitha Prem @ 2023-08-21 13:03 UTC (permalink / raw)
  To: ath12k; +Cc: linux-wireless, Harshitha Prem

When max virtual ap interfaces are configured in all the bands with
ACS and hostapd restart is done every 60s, a crash is observed at 
random times.

In the above scenario, a fragmented packet is received for self peer,
for which rx_tid and rx_frags are not initialized in datapath.
While handling this fragment, crash is observed as the rx_frag list
is uninitialized and when we walk in ath12k_dp_rx_h_sort_frags,
skb null leads to exception.

To address this, before processing received fragments we check
dp_setup_done flag is set to ensure that peer has completed its
dp peer setup for fragment queue, else ignore processing the
fragments.

Call trace:
    PC points to "ath12k_dp_process_rx_err+0x4e8/0xfcc [ath12k]"
    LR points to "ath12k_dp_process_rx_err+0x480/0xfcc [ath12k]".
    The Backtrace obtained is as follows:
    ath12k_dp_process_rx_err+0x4e8/0xfcc [ath12k]
    ath12k_dp_service_srng+0x78/0x260 [ath12k]
    ath12k_pci_write32+0x990/0xb0c [ath12k]
    __napi_poll+0x30/0xa4
    net_rx_action+0x118/0x270
    __do_softirq+0x10c/0x244
    irq_exit+0x64/0xb4
    __handle_domain_irq+0x88/0xac
    gic_handle_irq+0x74/0xbc
    el1_irq+0xf0/0x1c0
    arch_cpu_idle+0x10/0x18
    do_idle+0x104/0x248
    cpu_startup_entry+0x20/0x64
    rest_init+0xd0/0xdc
    arch_call_rest_init+0xc/0x14

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1

Signed-off-by: Harshitha Prem <quic_hprem@quicinc.com>
---
 drivers/net/wireless/ath/ath12k/dp.c    | 1 +
 drivers/net/wireless/ath/ath12k/dp_rx.c | 9 +++++++++
 drivers/net/wireless/ath/ath12k/peer.h  | 3 +++
 3 files changed, 13 insertions(+)

diff --git a/drivers/net/wireless/ath/ath12k/dp.c b/drivers/net/wireless/ath/ath12k/dp.c
index ae1645d0f42a..d825e08d820a 100644
--- a/drivers/net/wireless/ath/ath12k/dp.c
+++ b/drivers/net/wireless/ath/ath12k/dp.c
@@ -38,6 +38,7 @@ void ath12k_dp_peer_cleanup(struct ath12k *ar, int vdev_id, const u8 *addr)
 
 	ath12k_dp_rx_peer_tid_cleanup(ar, peer);
 	crypto_free_shash(peer->tfm_mmic);
+	peer->dp_setup_done = false;
 	spin_unlock_bh(&ab->base_lock);
 }
 
diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c
index 67f8c140840f..5923c7c9eaff 100644
--- a/drivers/net/wireless/ath/ath12k/dp_rx.c
+++ b/drivers/net/wireless/ath/ath12k/dp_rx.c
@@ -2748,6 +2748,7 @@ int ath12k_dp_rx_peer_frag_setup(struct ath12k *ar, const u8 *peer_mac, int vdev
 	}
 
 	peer->tfm_mmic = tfm;
+	peer->dp_setup_done = true;
 	spin_unlock_bh(&ab->base_lock);
 
 	return 0;
@@ -3214,6 +3215,14 @@ static int ath12k_dp_rx_frag_h_mpdu(struct ath12k *ar,
 		ret = -ENOENT;
 		goto out_unlock;
 	}
+
+	if (!peer->dp_setup_done) {
+		ath12k_warn(ab, "The peer %pM [%d] has uninitialized datapath\n",
+			    peer->addr, peer_id);
+		ret = -ENOENT;
+		goto out_unlock;
+	}
+
 	rx_tid = &peer->rx_tid[tid];
 
 	if ((!skb_queue_empty(&rx_tid->rx_frags) && seqno != rx_tid->cur_sn) ||
diff --git a/drivers/net/wireless/ath/ath12k/peer.h b/drivers/net/wireless/ath/ath12k/peer.h
index b296dc0e2f67..c6edb24cbedd 100644
--- a/drivers/net/wireless/ath/ath12k/peer.h
+++ b/drivers/net/wireless/ath/ath12k/peer.h
@@ -44,6 +44,9 @@ struct ath12k_peer {
 	struct ppdu_user_delayba ppdu_stats_delayba;
 	bool delayba_flag;
 	bool is_authorized;
+
+	/* protected by ab->data_lock */
+	bool dp_setup_done;
 };
 
 void ath12k_peer_unmap_event(struct ath12k_base *ab, u16 peer_id);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/2] wifi: ath12k: fix undefined behavior with __fls in dp
  2023-08-21 13:03 [PATCH v2 0/2] wifi: ath12k: Ignore fragments from uninitialized peer Harshitha Prem
  2023-08-21 13:03 ` [PATCH v2 1/2] wifi: ath12k: Ignore fragments from uninitialized peer in dp Harshitha Prem
@ 2023-08-21 13:03 ` Harshitha Prem
       [not found]   ` <ab94c255-8ac3-4b2a-a7a5-af40058ad6e6@quicinc.com>
  1 sibling, 1 reply; 5+ messages in thread
From: Harshitha Prem @ 2023-08-21 13:03 UTC (permalink / raw)
  To: ath12k; +Cc: linux-wireless, Harshitha Prem

When max virtual ap interfaces are configured in all the bands
with ACS and hostapd restart is done every 60s,
a crash is observed at random times because of handling the
uninitialized peer fragments with fragment id of packet as 0.

"__fls" would have an undefined behavior if the argument is passed
as "0". Hence, added changes to handle the same.

Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices")

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1

Signed-off-by: Harshitha Prem <quic_hprem@quicinc.com>
---
 drivers/net/wireless/ath/ath12k/dp_rx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c
index 5923c7c9eaff..ea8dfea22be6 100644
--- a/drivers/net/wireless/ath/ath12k/dp_rx.c
+++ b/drivers/net/wireless/ath/ath12k/dp_rx.c
@@ -3238,7 +3238,7 @@ static int ath12k_dp_rx_frag_h_mpdu(struct ath12k *ar,
 		goto out_unlock;
 	}
 
-	if (frag_no > __fls(rx_tid->rx_frag_bitmap))
+	if ((!rx_tid->rx_frag_bitmap || frag_no > __fls(rx_tid->rx_frag_bitmap)))
 		__skb_queue_tail(&rx_tid->rx_frags, msdu);
 	else
 		ath12k_dp_rx_h_sort_frags(ab, &rx_tid->rx_frags, msdu);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 2/2] wifi: ath12k: fix undefined behavior with __fls in dp
       [not found]   ` <ab94c255-8ac3-4b2a-a7a5-af40058ad6e6@quicinc.com>
@ 2023-08-22 13:27     ` Kalle Valo
  0 siblings, 0 replies; 5+ messages in thread
From: Kalle Valo @ 2023-08-22 13:27 UTC (permalink / raw)
  To: Jeff Johnson; +Cc: ath12k, linux-wireless

Jeff Johnson <quic_jjohnson@quicinc.com> writes:

> On 8/21/2023 6:03 AM, Harshitha Prem wrote:
>> When max virtual ap interfaces are configured in all the bands
>> with ACS and hostapd restart is done every 60s,
>> a crash is observed at random times because of handling the
>> uninitialized peer fragments with fragment id of packet as 0.
>> "__fls" would have an undefined behavior if the argument is passed
>> as "0". Hence, added changes to handle the same.
>> Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7
>> devices")
>
> this should be in the last section with the Signed-off-by
>
> see
> <https://www.kernel.org/doc/html/latest/process/submitting-patches.html#using-reported-by-tested-by-reviewed-by-suggested-by-and-fixes>

I can fix that in the pending branch, no need to resend because of this.

-- 
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/2] wifi: ath12k: Ignore fragments from uninitialized peer in  dp
  2023-08-21 13:03 ` [PATCH v2 1/2] wifi: ath12k: Ignore fragments from uninitialized peer in dp Harshitha Prem
@ 2023-09-05 13:26   ` Kalle Valo
  0 siblings, 0 replies; 5+ messages in thread
From: Kalle Valo @ 2023-09-05 13:26 UTC (permalink / raw)
  To: Harshitha Prem; +Cc: ath12k, linux-wireless, Harshitha Prem

Harshitha Prem <quic_hprem@quicinc.com> wrote:

> When max virtual ap interfaces are configured in all the bands with
> ACS and hostapd restart is done every 60s, a crash is observed at
> random times.
> 
> In the above scenario, a fragmented packet is received for self peer,
> for which rx_tid and rx_frags are not initialized in datapath.
> While handling this fragment, crash is observed as the rx_frag list
> is uninitialized and when we walk in ath12k_dp_rx_h_sort_frags,
> skb null leads to exception.
> 
> To address this, before processing received fragments we check
> dp_setup_done flag is set to ensure that peer has completed its
> dp peer setup for fragment queue, else ignore processing the
> fragments.
> 
> Call trace:
>     PC points to "ath12k_dp_process_rx_err+0x4e8/0xfcc [ath12k]"
>     LR points to "ath12k_dp_process_rx_err+0x480/0xfcc [ath12k]".
>     The Backtrace obtained is as follows:
>     ath12k_dp_process_rx_err+0x4e8/0xfcc [ath12k]
>     ath12k_dp_service_srng+0x78/0x260 [ath12k]
>     ath12k_pci_write32+0x990/0xb0c [ath12k]
>     __napi_poll+0x30/0xa4
>     net_rx_action+0x118/0x270
>     __do_softirq+0x10c/0x244
>     irq_exit+0x64/0xb4
>     __handle_domain_irq+0x88/0xac
>     gic_handle_irq+0x74/0xbc
>     el1_irq+0xf0/0x1c0
>     arch_cpu_idle+0x10/0x18
>     do_idle+0x104/0x248
>     cpu_startup_entry+0x20/0x64
>     rest_init+0xd0/0xdc
>     arch_call_rest_init+0xc/0x14
> 
> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
> 
> Signed-off-by: Harshitha Prem <quic_hprem@quicinc.com>
> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>

2 patches applied to ath-next branch of ath.git, thanks.

bbc86757ca62 wifi: ath12k: Ignore fragments from uninitialized peer in  dp
d48f55e773dc wifi: ath12k: fix undefined behavior with __fls in dp

-- 
https://patchwork.kernel.org/project/linux-wireless/patch/20230821130343.29495-2-quic_hprem@quicinc.com/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-09-05 16:02 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-21 13:03 [PATCH v2 0/2] wifi: ath12k: Ignore fragments from uninitialized peer Harshitha Prem
2023-08-21 13:03 ` [PATCH v2 1/2] wifi: ath12k: Ignore fragments from uninitialized peer in dp Harshitha Prem
2023-09-05 13:26   ` Kalle Valo
2023-08-21 13:03 ` [PATCH v2 2/2] wifi: ath12k: fix undefined behavior with __fls " Harshitha Prem
     [not found]   ` <ab94c255-8ac3-4b2a-a7a5-af40058ad6e6@quicinc.com>
2023-08-22 13:27     ` Kalle Valo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).