diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c index 12f693cc24..f7535f247f 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c @@ -31,6 +31,9 @@ #include #include #include +#ifdef QCA_SUPPORT_LITE_MONITOR +#include "dp_lite_mon.h" +#endif /** * 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); - if (mpdu_meta->full_pkt) { - dp_rx_mon_handle_full_mon(pdev, ppdu_info, mpdu); + if (dp_lite_mon_is_rx_enabled(mon_pdev)) { + 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 { - qdf_nbuf_free(mpdu); - continue; + if (mpdu_meta->full_pkt) { + 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); /* 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; 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_get_nr_frags(mpdu) - 1, -HAL_RX_FCS_LEN, 0); - return; } @@ -604,7 +617,8 @@ uint8_t dp_rx_mon_process_tlv_status(struct dp_pdev *pdev, struct ieee80211_frame *qwh; 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; } @@ -628,6 +642,7 @@ uint8_t dp_rx_mon_process_tlv_status(struct dp_pdev *pdev, dp_mon_err("malloc failed pdev: %pK ", pdev); return num_buf_reaped; } + qdf_nbuf_set_next(nbuf, NULL); 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; } + 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]; num_frags = qdf_nbuf_get_nr_frags(nbuf); if (num_frags < QDF_NBUF_MAX_FRAGS) { diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index 880f9d3097..ff8a53a387 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -4054,5 +4054,14 @@ dp_lite_mon_get_nac_peer_rssi(struct cdp_soc_t *soc_hdl, { 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 /* _DP_MON_H_ */ diff --git a/hal/wifi3.0/be/hal_be_api_mon.h b/hal/wifi3.0/be/hal_be_api_mon.h index 110ea82c20..ac3a470186 100644 --- a/hal/wifi3.0/be/hal_be_api_mon.h +++ b/hal/wifi3.0/be/hal_be_api_mon.h @@ -2857,6 +2857,8 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo, else if (filter_category == 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 = rx_mpdu_start->rx_mpdu_info_details.mcast_bcast; ppdu_info->mpdu_info[user_id].decap_type =