|
@@ -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;
|