qcacmn: Handle lite monitor frames

Call function to process mpdus when lite monitor
feature is enabled

Change-Id: I0df722a92e91bddc09a84dce2bc2aa6a67548045
CRs-Fixed: 3173953
This commit is contained in:
Jeevan Kukkalli
2022-04-13 21:08:03 +05:30
committed by Madan Koyyalamudi
parent e7615d09c5
commit cedb0f2795
3 changed files with 54 additions and 24 deletions

View File

@@ -31,6 +31,9 @@
#include <dp_rx.h> #include <dp_rx.h>
#include <dp_be.h> #include <dp_be.h>
#include <hal_be_api_mon.h> #include <hal_be_api_mon.h>
#ifdef QCA_SUPPORT_LITE_MONITOR
#include "dp_lite_mon.h"
#endif
/** /**
* dp_rx_mon_deliver_mpdu() - Deliver MPDU to osif layer * dp_rx_mon_deliver_mpdu() - Deliver MPDU to osif layer
@@ -86,29 +89,39 @@ dp_rx_mon_process_ppdu_info(struct dp_pdev *pdev,
mpdu_meta = (struct hal_rx_mon_mpdu_info *)qdf_nbuf_data(mpdu); mpdu_meta = (struct hal_rx_mon_mpdu_info *)qdf_nbuf_data(mpdu);
if (mpdu_meta->full_pkt) { if (dp_lite_mon_is_rx_enabled(mon_pdev)) {
dp_rx_mon_handle_full_mon(pdev, ppdu_info, mpdu); status = dp_lite_mon_rx_mpdu_process(pdev, ppdu_info,
mpdu, mpdu_idx, user);
if (status != QDF_STATUS_SUCCESS) {
qdf_nbuf_free(mpdu);
continue;
}
} else { } else {
qdf_nbuf_free(mpdu); if (mpdu_meta->full_pkt) {
continue; dp_rx_mon_handle_full_mon(pdev,
ppdu_info, mpdu);
} else {
qdf_nbuf_free(mpdu);
continue;
}
/* reset mpdu metadata and apply radiotap header over MPDU */
qdf_mem_zero(mpdu_meta, sizeof(struct hal_rx_mon_mpdu_info));
if (!qdf_nbuf_update_radiotap(&ppdu_info->rx_status,
mpdu,
qdf_nbuf_headroom(mpdu))) {
dp_mon_err("failed to update radiotap pdev: %pK",
pdev);
}
/* Deliver MPDU to osif layer */
status = dp_rx_mon_deliver_mpdu(mon_pdev,
mpdu,
&ppdu_info->rx_status);
if (status != QDF_STATUS_SUCCESS)
qdf_nbuf_free(mpdu);
} }
/* reset mpdu metadata and apply radiotap header over MPDU */
qdf_mem_zero(mpdu_meta, sizeof(struct hal_rx_mon_mpdu_info));
if (!qdf_nbuf_update_radiotap(&ppdu_info->rx_status,
mpdu,
qdf_nbuf_headroom(mpdu))) {
dp_mon_err("failed to update radiotap pdev: %pK",
pdev);
}
/* Deliver MPDU to osif layer */
status = dp_rx_mon_deliver_mpdu(mon_pdev,
mpdu,
&ppdu_info->rx_status);
if (status != QDF_STATUS_SUCCESS)
qdf_nbuf_free(mpdu);
} }
} }
} }
@@ -178,7 +191,8 @@ dp_rx_mon_add_ppdu_info_to_wq(struct dp_mon_pdev *mon_pdev,
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
/* Full monitor or lite monitor mode is not enabled, return */ /* Full monitor or lite monitor mode is not enabled, return */
if (!mon_pdev->monitor_configured) if (!mon_pdev->monitor_configured &&
!dp_lite_mon_is_rx_enabled(mon_pdev))
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
if (qdf_likely(ppdu_info)) { if (qdf_likely(ppdu_info)) {
@@ -238,7 +252,6 @@ dp_rx_mon_handle_full_mon(struct dp_pdev *pdev,
qdf_nbuf_trim_add_frag_size(mpdu, qdf_nbuf_trim_add_frag_size(mpdu,
qdf_nbuf_get_nr_frags(mpdu) - 1, qdf_nbuf_get_nr_frags(mpdu) - 1,
-HAL_RX_FCS_LEN, 0); -HAL_RX_FCS_LEN, 0);
return; return;
} }
@@ -604,7 +617,8 @@ uint8_t dp_rx_mon_process_tlv_status(struct dp_pdev *pdev,
struct ieee80211_frame *qwh; struct ieee80211_frame *qwh;
uint8_t num_buf_reaped = 0; uint8_t num_buf_reaped = 0;
if (!mon_pdev->monitor_configured) { if (!mon_pdev->monitor_configured &&
!dp_lite_mon_is_rx_enabled(mon_pdev)) {
return num_buf_reaped; return num_buf_reaped;
} }
@@ -628,6 +642,7 @@ uint8_t dp_rx_mon_process_tlv_status(struct dp_pdev *pdev,
dp_mon_err("malloc failed pdev: %pK ", pdev); dp_mon_err("malloc failed pdev: %pK ", pdev);
return num_buf_reaped; return num_buf_reaped;
} }
qdf_nbuf_set_next(nbuf, NULL); qdf_nbuf_set_next(nbuf, NULL);
ppdu_info->mpdu_q[user_id][mpdu_idx] = nbuf; ppdu_info->mpdu_q[user_id][mpdu_idx] = nbuf;
@@ -656,6 +671,10 @@ uint8_t dp_rx_mon_process_tlv_status(struct dp_pdev *pdev,
return num_buf_reaped; return num_buf_reaped;
} }
if (dp_lite_mon_is_rx_enabled(mon_pdev) &&
!dp_lite_mon_is_level_msdu(mon_pdev))
break;
nbuf = ppdu_info->mpdu_q[user_id][mpdu_idx]; nbuf = ppdu_info->mpdu_q[user_id][mpdu_idx];
num_frags = qdf_nbuf_get_nr_frags(nbuf); num_frags = qdf_nbuf_get_nr_frags(nbuf);
if (num_frags < QDF_NBUF_MAX_FRAGS) { if (num_frags < QDF_NBUF_MAX_FRAGS) {

View File

@@ -4054,5 +4054,14 @@ dp_lite_mon_get_nac_peer_rssi(struct cdp_soc_t *soc_hdl,
{ {
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
static inline QDF_STATUS
dp_lite_mon_rx_mpdu_process(struct dp_pdev *pdev,
struct hal_rx_ppdu_info *ppdu_info,
qdf_nbuf_t mon_mpdu, uint16_t mpdu_id,
uint8_t user)
{
return QDF_STATUS_E_FAILURE;
}
#endif #endif
#endif /* _DP_MON_H_ */ #endif /* _DP_MON_H_ */

View File

@@ -2857,6 +2857,8 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo,
else if (filter_category == 1) else if (filter_category == 1)
ppdu_info->rx_status.monitor_direct_used = 1; ppdu_info->rx_status.monitor_direct_used = 1;
ppdu_info->rx_user_status[user_id].filter_category = filter_category;
ppdu_info->nac_info.mcast_bcast = ppdu_info->nac_info.mcast_bcast =
rx_mpdu_start->rx_mpdu_info_details.mcast_bcast; rx_mpdu_start->rx_mpdu_info_details.mcast_bcast;
ppdu_info->mpdu_info[user_id].decap_type = ppdu_info->mpdu_info[user_id].decap_type =