Selaa lähdekoodia

qcacmn: Add support for RX offload packets in packet capture mode

Add support to process RX offload packets in packet capture mode.
To distinguish rx offload packets from normal rx packets,
DP_PEER_METADATA_OFFLOAD bit is set in peer metadata, based on value
of this bit rx packet is delivered to stack or packet capture
component.

Change-Id: Ice656a0bc14efd0382c4949d695daa8e926ce41e
CRs-Fixed: 2856792
Surabhi Vishnoi 4 vuotta sitten
vanhempi
sitoutus
01c8d3f45f
3 muutettua tiedostoa jossa 63 lisäystä ja 10 poistoa
  1. 1 1
      dp/wifi3.0/dp_htt.c
  2. 45 7
      dp/wifi3.0/dp_rx.c
  3. 17 2
      dp/wifi3.0/dp_rx.h

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

@@ -4466,7 +4466,7 @@ dp_offload_ind_handler(struct htt_soc *soc, uint32_t *msg_word)
 	pdev_id = dp_get_host_pdev_id_for_target_pdev_id(soc->dp_soc,
 							 target_pdev_id);
 	dp_wdi_event_handler(WDI_EVENT_PKT_CAPTURE_OFFLOAD_TX_DATA, soc->dp_soc,
-			     msg_word, HTT_INVALID_PEER, WDI_NO_VAL,
+			     msg_word, HTT_INVALID_VDEV, WDI_NO_VAL,
 			     pdev_id);
 }
 #else

+ 45 - 7
dp/wifi3.0/dp_rx.c

@@ -2218,12 +2218,40 @@ static inline void dp_rx_update_stats(struct dp_soc *soc,
  * This function is used to deliver rx packet to packet capture
  */
 void dp_rx_deliver_to_pkt_capture(struct dp_soc *soc,  struct dp_pdev *pdev,
-				  uint16_t peer_id, uint32_t ppdu_id,
+				  uint16_t peer_id, uint32_t is_offload,
 				  qdf_nbuf_t netbuf)
 {
 	dp_wdi_event_handler(WDI_EVENT_PKT_CAPTURE_RX_DATA, soc, netbuf,
-			     peer_id, WDI_NO_VAL, pdev->pdev_id);
+			     peer_id, is_offload, pdev->pdev_id);
 }
+
+void dp_rx_deliver_to_pkt_capture_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf,
+					  uint32_t is_offload)
+{
+	uint16_t msdu_len = 0;
+	uint16_t peer_id, vdev_id;
+	uint32_t pkt_len = 0;
+	uint8_t *rx_tlv_hdr;
+	uint32_t l2_hdr_offset = 0;
+	struct hal_rx_msdu_metadata msdu_metadata;
+
+	peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf);
+	vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf);
+	rx_tlv_hdr = qdf_nbuf_data(nbuf);
+	hal_rx_msdu_metadata_get(soc->hal_soc, rx_tlv_hdr, &msdu_metadata);
+	msdu_len = QDF_NBUF_CB_RX_PKT_LEN(nbuf);
+	pkt_len = msdu_len + msdu_metadata.l3_hdr_pad +
+		  RX_PKT_TLVS_LEN;
+	l2_hdr_offset =
+		hal_rx_msdu_end_l3_hdr_padding_get(soc->hal_soc, rx_tlv_hdr);
+
+	qdf_nbuf_set_pktlen(nbuf, pkt_len);
+	dp_rx_skip_tlvs(nbuf, msdu_metadata.l3_hdr_pad);
+
+	dp_wdi_event_handler(WDI_EVENT_PKT_CAPTURE_RX_DATA, soc, nbuf,
+			     HTT_INVALID_VDEV, is_offload, 0);
+}
+
 #endif
 
 /**
@@ -2287,6 +2315,7 @@ uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl,
 	QDF_STATUS status;
 	qdf_nbuf_t ebuf_head;
 	qdf_nbuf_t ebuf_tail;
+	uint8_t pkt_capture_offload = 0;
 
 	DP_HIST_INIT();
 
@@ -2482,6 +2511,10 @@ more_data:
 		QDF_NBUF_CB_RX_VDEV_ID(rx_desc->nbuf) =
 			DP_PEER_METADATA_VDEV_ID_GET(peer_mdata);
 
+		/* to indicate whether this msdu is rx offload */
+		pkt_capture_offload =
+			DP_PEER_METADATA_OFFLOAD_GET(peer_mdata);
+
 		/*
 		 * save msdu flags first, last and continuation msdu in
 		 * nbuf->cb, also save mcbc, is_da_valid, is_sa_valid and
@@ -2656,7 +2689,10 @@ done:
 
 		} else {
 			nbuf->next = NULL;
-			dp_rx_deliver_to_stack_no_peer(soc, nbuf);
+			dp_rx_deliver_to_pkt_capture_no_peer(
+					soc, nbuf, pkt_capture_offload);
+			if (!pkt_capture_offload)
+				dp_rx_deliver_to_stack_no_peer(soc, nbuf);
 			nbuf = next;
 			continue;
 		}
@@ -2899,10 +2935,12 @@ done:
 	if (qdf_likely(deliver_list_head)) {
 		if (qdf_likely(peer)) {
 			dp_rx_deliver_to_pkt_capture(soc, vdev->pdev, peer_id,
-						     0, deliver_list_head);
-			dp_rx_deliver_to_stack(soc, vdev, peer,
-					       deliver_list_head,
-					       deliver_list_tail);
+						     pkt_capture_offload,
+						     deliver_list_head);
+			if (!pkt_capture_offload)
+				dp_rx_deliver_to_stack(soc, vdev, peer,
+						       deliver_list_head,
+						       deliver_list_tail);
 		}
 		else {
 			nbuf = deliver_list_head;

+ 17 - 2
dp/wifi3.0/dp_rx.h

@@ -51,6 +51,9 @@
 #define DP_PEER_METADATA_PEER_ID_SHIFT	0
 #define DP_PEER_METADATA_VDEV_ID_MASK	0x003f0000
 #define DP_PEER_METADATA_VDEV_ID_SHIFT	16
+#define DP_PEER_METADATA_OFFLOAD_MASK	0x01000000
+#define DP_PEER_METADATA_OFFLOAD_SHIFT	24
+
 
 #define DP_DEFAULT_NOISEFLOOR	(-96)
 
@@ -62,6 +65,10 @@
 	(((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK)	\
 			>> DP_PEER_METADATA_VDEV_ID_SHIFT)
 
+#define DP_PEER_METADATA_OFFLOAD_GET(_peer_metadata)		\
+	(((_peer_metadata) & DP_PEER_METADATA_OFFLOAD_MASK)	\
+			>> DP_PEER_METADATA_OFFLOAD_SHIFT)
+
 #define DP_RX_DESC_MAGIC 0xdec0de
 
 #define dp_rx_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_RX, params)
@@ -1625,14 +1632,22 @@ void dp_rx_link_desc_refill_duplicate_check(
  * This function is used to deliver rx packet to packet capture
  */
 void dp_rx_deliver_to_pkt_capture(struct dp_soc *soc,  struct dp_pdev *pdev,
-				  uint16_t peer_id, uint32_t ppdu_id,
+				  uint16_t peer_id, uint32_t is_offload,
 				  qdf_nbuf_t netbuf);
+void dp_rx_deliver_to_pkt_capture_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf,
+					  uint32_t is_offload);
 #else
 static inline void
 dp_rx_deliver_to_pkt_capture(struct dp_soc *soc,  struct dp_pdev *pdev,
-			     uint16_t peer_id, uint32_t ppdu_id,
+			     uint16_t peer_id, uint32_t is_offload,
 			     qdf_nbuf_t netbuf)
 {
 }
+
+static inline void
+dp_rx_deliver_to_pkt_capture_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf,
+				     uint32_t is_offload)
+{
+}
 #endif
 #endif /* _DP_RX_H */