Jelajahi Sumber

qcacmn: Handle lite monitor frames

Call function to process mpdus when lite monitor
feature is enabled

Change-Id: I0df722a92e91bddc09a84dce2bc2aa6a67548045
CRs-Fixed: 3173953
Jeevan Kukkalli 3 tahun lalu
induk
melakukan
cedb0f2795

+ 41 - 22
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c

@@ -31,6 +31,9 @@
 #include <dp_rx.h>
 #include <dp_be.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
@@ -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);
-			}
+				/* 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);
+				/* 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);
+				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) {

+ 9 - 0
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_ */

+ 2 - 0
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 =