Browse Source

qcacmn: fix TX packet logging issue

Packet logging buffer is only 2048 bytes, if copy non-linear
TX packet with skb->len (like TSO) which is likely > 2048,
this will lead to skb panic as packet logging buffer can not
accommodate it.

Only support TX packet logging with single linear buffer.

Change-Id: I1d15f9ab80fcc1720fdb3f7fe8c89e7f5e3c0a79
CRs-Fixed: 3242090
Jinwei Chen 3 years ago
parent
commit
694a2eb657
2 changed files with 6 additions and 2 deletions
  1. 5 1
      dp/wifi3.0/dp_internal.h
  2. 1 1
      dp/wifi3.0/dp_tx.c

+ 5 - 1
dp/wifi3.0/dp_internal.h

@@ -3775,6 +3775,7 @@ dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr,
  * dp_tx_send_pktlog() - send tx packet log
  * @soc: soc handle
  * @pdev: pdev handle
+ * @tx_desc: TX software descriptor
  * @nbuf: nbuf
  * @status: status of tx packet
  *
@@ -3785,11 +3786,13 @@ dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr,
  */
 static inline
 void dp_tx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
+		       struct dp_tx_desc_s *tx_desc,
 		       qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status)
 {
 	ol_txrx_pktdump_cb packetdump_cb = pdev->dp_tx_packetdump_cb;
 
-	if (qdf_unlikely(packetdump_cb)) {
+	if (qdf_unlikely(packetdump_cb) &&
+	    dp_tx_frm_std == tx_desc->frm_type) {
 		packetdump_cb((ol_txrx_soc_handle)soc, pdev->pdev_id,
 			      QDF_NBUF_CB_TX_VDEV_CTX(nbuf),
 			      nbuf, status, QDF_TX_DATA_PKT);
@@ -3823,6 +3826,7 @@ void dp_rx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
 #else
 static inline
 void dp_tx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
+		       struct dp_tx_desc_s *tx_desc,
 		       qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status)
 {
 }

+ 1 - 1
dp/wifi3.0/dp_tx.c

@@ -4758,7 +4758,7 @@ void dp_tx_comp_process_tx_status(struct dp_soc *soc,
 	dp_tx_update_peer_delay_stats(txrx_peer, tx_desc, ts->tid, ring_id);
 	dp_tx_update_peer_sawf_stats(soc, vdev, txrx_peer, tx_desc,
 				     ts, ts->tid);
-	dp_tx_send_pktlog(soc, vdev->pdev, nbuf, dp_status);
+	dp_tx_send_pktlog(soc, vdev->pdev, tx_desc, nbuf, dp_status);
 
 #ifdef QCA_SUPPORT_RDK_STATS
 	if (soc->peerstats_enabled)