qcacmn: Fix Rx packet logging issue

Currently while sending nbuf to rx fate logs
we are not removing rx tlv before sending nbuf
to logger which is causing issue of incorrect
packet type issue.

To Fix issue make changes to make sure that
rx tlv is removed and nbuf length is set

Change-Id: Ib56c8e009398b3410c43be910feb4048bfb06b54
CRs-Fixed: 3241828
This commit is contained in:
Amit Mehta
2022-07-15 14:36:07 +05:30
committed by Madan Koyyalamudi
parent 82fd1e58e2
commit 7e799fcbae
6 changed files with 84 additions and 10 deletions

View File

@@ -594,8 +594,6 @@ done:
tid_stats = tid_stats =
&rx_pdev->stats.tid_stats.tid_rx_stats[reo_ring_num][tid]; &rx_pdev->stats.tid_stats.tid_rx_stats[reo_ring_num][tid];
dp_rx_send_pktlog(soc, rx_pdev, nbuf, QDF_TX_RX_STATUS_OK);
/* /*
* Check if DMA completed -- msdu_done is the last bit * Check if DMA completed -- msdu_done is the last bit
* to be written * to be written
@@ -686,6 +684,8 @@ done:
dp_rx_skip_tlvs(soc, nbuf, msdu_metadata.l3_hdr_pad); dp_rx_skip_tlvs(soc, nbuf, msdu_metadata.l3_hdr_pad);
} }
dp_rx_send_pktlog(soc, rx_pdev, nbuf, QDF_TX_RX_STATUS_OK);
/* /*
* process frame for mulitpass phrase processing * process frame for mulitpass phrase processing
*/ */

View File

@@ -3829,6 +3829,65 @@ void dp_rx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
nbuf, status, QDF_RX_DATA_PKT); nbuf, status, QDF_RX_DATA_PKT);
} }
} }
/*
* dp_rx_err_send_pktlog() - send rx error packet log
* @soc: soc handle
* @pdev: pdev handle
* @mpdu_desc_info: MPDU descriptor info
* @nbuf: nbuf
* @status: status of rx packet
* @set_pktlen: weither to set packet length
*
* This API should only be called when we have not removed
* Rx TLV from head, and head is pointing to rx_tlv
*
* This function is used to send rx packet from erro path
* for logging for which rx packet tlv is not removed.
*
* Return: None
*
*/
static inline
void dp_rx_err_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
struct hal_rx_mpdu_desc_info *mpdu_desc_info,
qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status,
bool set_pktlen)
{
ol_txrx_pktdump_cb packetdump_cb = pdev->dp_rx_packetdump_cb;
qdf_size_t skip_size;
uint16_t msdu_len, nbuf_len;
uint8_t *rx_tlv_hdr;
struct hal_rx_msdu_metadata msdu_metadata;
if (qdf_unlikely(packetdump_cb)) {
rx_tlv_hdr = qdf_nbuf_data(nbuf);
nbuf_len = hal_rx_msdu_start_msdu_len_get(soc->hal_soc,
rx_tlv_hdr);
hal_rx_msdu_metadata_get(soc->hal_soc, rx_tlv_hdr,
&msdu_metadata);
if (mpdu_desc_info->bar_frame ||
(mpdu_desc_info->mpdu_flags & HAL_MPDU_F_FRAGMENT))
skip_size = soc->rx_pkt_tlv_size;
else
skip_size = soc->rx_pkt_tlv_size +
msdu_metadata.l3_hdr_pad;
if (set_pktlen) {
msdu_len = nbuf_len + skip_size;
qdf_nbuf_set_pktlen(nbuf, qdf_min(msdu_len,
(uint16_t)RX_DATA_BUFFER_SIZE));
}
qdf_nbuf_pull_head(nbuf, skip_size);
packetdump_cb((ol_txrx_soc_handle)soc, pdev->pdev_id,
QDF_NBUF_CB_RX_VDEV_ID(nbuf),
nbuf, status, QDF_RX_DATA_PKT);
qdf_nbuf_push_head(nbuf, skip_size);
}
}
#else #else
static inline static inline
void dp_tx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, void dp_tx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
@@ -3842,5 +3901,13 @@ void dp_rx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status) qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status)
{ {
} }
static inline
void dp_rx_err_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
struct hal_rx_mpdu_desc_info *mpdu_desc_info,
qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status,
bool set_pktlen)
{
}
#endif #endif
#endif /* #ifndef _DP_INTERNAL_H_ */ #endif /* #ifndef _DP_INTERNAL_H_ */

View File

@@ -3078,6 +3078,11 @@ bool dp_rx_deliver_special_frame(struct dp_soc *soc,
dp_rx_set_hdr_pad(nbuf, l2_hdr_offset); dp_rx_set_hdr_pad(nbuf, l2_hdr_offset);
qdf_nbuf_pull_head(nbuf, skip_len); qdf_nbuf_pull_head(nbuf, skip_len);
if (txrx_peer->vdev) {
dp_rx_send_pktlog(soc, txrx_peer->vdev->pdev, nbuf,
QDF_TX_RX_STATUS_OK);
}
if (dp_rx_is_special_frame(nbuf, frame_mask)) { if (dp_rx_is_special_frame(nbuf, frame_mask)) {
dp_info("special frame, mpdu sn 0x%x", dp_info("special frame, mpdu sn 0x%x",
hal_rx_get_rx_sequence(soc->hal_soc, rx_tlv_hdr)); hal_rx_get_rx_sequence(soc->hal_soc, rx_tlv_hdr));

View File

@@ -1790,6 +1790,9 @@ dp_rx_defrag_store_fragment(struct dp_soc *soc,
pdev = txrx_peer->vdev->pdev; pdev = txrx_peer->vdev->pdev;
rx_tid = &txrx_peer->rx_tid[tid]; rx_tid = &txrx_peer->rx_tid[tid];
dp_rx_err_send_pktlog(soc, pdev, mpdu_desc_info, frag,
QDF_TX_RX_STATUS_OK, false);
qdf_spin_lock_bh(&rx_tid->defrag_tid_lock); qdf_spin_lock_bh(&rx_tid->defrag_tid_lock);
rx_reorder_array_elem = txrx_peer->rx_tid[tid].array; rx_reorder_array_elem = txrx_peer->rx_tid[tid].array;
if (!rx_reorder_array_elem) { if (!rx_reorder_array_elem) {
@@ -2044,7 +2047,6 @@ uint32_t dp_rx_frag_handle(struct dp_soc *soc, hal_ring_desc_t ring_desc,
if (rx_desc->unmapped) if (rx_desc->unmapped)
return rx_bufs_used; return rx_bufs_used;
dp_rx_send_pktlog(soc, pdev, msdu, QDF_TX_RX_STATUS_OK);
dp_ipa_rx_buf_smmu_mapping_lock(soc); dp_ipa_rx_buf_smmu_mapping_lock(soc);
dp_rx_nbuf_unmap_pool(soc, rx_desc_pool, rx_desc->nbuf); dp_rx_nbuf_unmap_pool(soc, rx_desc_pool, rx_desc->nbuf);
rx_desc->unmapped = 1; rx_desc->unmapped = 1;

View File

@@ -370,9 +370,9 @@ more_msdu_link_desc:
if (hal_rx_encryption_info_valid(soc->hal_soc, rx_tlv_hdr)) if (hal_rx_encryption_info_valid(soc->hal_soc, rx_tlv_hdr))
hal_rx_print_pn(soc->hal_soc, rx_tlv_hdr); hal_rx_print_pn(soc->hal_soc, rx_tlv_hdr);
dp_rx_send_pktlog(soc, pdev, rx_desc->nbuf, dp_rx_err_send_pktlog(soc, pdev, mpdu_desc_info,
QDF_TX_RX_STATUS_DROP); rx_desc->nbuf,
QDF_TX_RX_STATUS_DROP, true);
/* Just free the buffers */ /* Just free the buffers */
dp_rx_buffer_pool_nbuf_free(soc, rx_desc->nbuf, *mac_id); dp_rx_buffer_pool_nbuf_free(soc, rx_desc->nbuf, *mac_id);
@@ -863,7 +863,8 @@ dp_rx_bar_frame_handle(struct dp_soc *soc,
_dp_rx_bar_frame_handle(soc, nbuf, mpdu_desc_info, tid, err_status, _dp_rx_bar_frame_handle(soc, nbuf, mpdu_desc_info, tid, err_status,
err_code); err_code);
dp_rx_send_pktlog(soc, pdev, nbuf, QDF_TX_RX_STATUS_DROP); dp_rx_err_send_pktlog(soc, pdev, mpdu_desc_info, nbuf,
QDF_TX_RX_STATUS_DROP, true);
dp_rx_link_desc_return(soc, ring_desc, dp_rx_link_desc_return(soc, ring_desc,
HAL_BM_ACTION_PUT_IN_IDLE_LIST); HAL_BM_ACTION_PUT_IN_IDLE_LIST);
dp_rx_buffer_pool_nbuf_free(soc, rx_desc->nbuf, dp_rx_buffer_pool_nbuf_free(soc, rx_desc->nbuf,
@@ -1541,7 +1542,6 @@ more_msdu_link_desc:
/* all buffers from a MSDU link belong to same pdev */ /* all buffers from a MSDU link belong to same pdev */
pdev = dp_get_pdev_for_lmac_id(soc, rx_desc_pool_id); pdev = dp_get_pdev_for_lmac_id(soc, rx_desc_pool_id);
dp_rx_send_pktlog(soc, pdev, nbuf, QDF_TX_RX_STATUS_OK);
rx_desc_pool = &soc->rx_desc_buf[rx_desc_pool_id]; rx_desc_pool = &soc->rx_desc_buf[rx_desc_pool_id];
dp_ipa_rx_buf_smmu_mapping_lock(soc); dp_ipa_rx_buf_smmu_mapping_lock(soc);
dp_rx_nbuf_unmap_pool(soc, rx_desc_pool, nbuf); dp_rx_nbuf_unmap_pool(soc, rx_desc_pool, nbuf);

View File

@@ -658,8 +658,6 @@ done:
old_tid = tid; old_tid = tid;
} }
dp_rx_send_pktlog(soc, rx_pdev, nbuf, QDF_TX_RX_STATUS_OK);
/* /*
* Check if DMA completed -- msdu_done is the last bit * Check if DMA completed -- msdu_done is the last bit
* to be written * to be written
@@ -757,6 +755,8 @@ done:
dp_rx_skip_tlvs(soc, nbuf, msdu_metadata.l3_hdr_pad); dp_rx_skip_tlvs(soc, nbuf, msdu_metadata.l3_hdr_pad);
} }
dp_rx_send_pktlog(soc, rx_pdev, nbuf, QDF_TX_RX_STATUS_OK);
/* /*
* process frame for mulitpass phrase processing * process frame for mulitpass phrase processing
*/ */