|
@@ -952,6 +952,58 @@ dp_tx_lite_mon_filtering(struct dp_pdev *pdev,
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE
|
|
#ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE
|
|
|
|
+/**
|
|
|
|
+ * dp_tx_mon_lpc_type_filtering() - Additional filtering for lpc
|
|
|
|
+ * @pdev: Pointer to physical device
|
|
|
|
+ * @tx_ppdu_info: pointer to dp_tx_ppdu_info structure
|
|
|
|
+ * @buf: qdf nbuf structure of buffer
|
|
|
|
+ *
|
|
|
|
+ * Return: QDF_STATUS
|
|
|
|
+ */
|
|
|
|
+static inline QDF_STATUS
|
|
|
|
+dp_tx_mon_lpc_type_filtering(struct dp_pdev *pdev,
|
|
|
|
+ struct dp_tx_ppdu_info *tx_ppdu_info,
|
|
|
|
+ qdf_nbuf_t buf)
|
|
|
|
+{
|
|
|
|
+ struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
|
|
|
+ qdf_nbuf_t nbuf;
|
|
|
|
+ struct ieee80211_frame_min_one *wh;
|
|
|
|
+ uint16_t mgmt_filter, ctrl_filter, data_filter, type;
|
|
|
|
+
|
|
|
|
+ if (qdf_unlikely(!IS_LOCAL_PKT_CAPTURE_RUNNING(mon_pdev,
|
|
|
|
+ is_local_pkt_capture_running)))
|
|
|
|
+ return QDF_STATUS_E_ABORTED;
|
|
|
|
+
|
|
|
|
+ if (dp_tx_mon_nbuf_get_num_frag(buf)) {
|
|
|
|
+ wh = (struct ieee80211_frame_min_one *)qdf_nbuf_get_frag_addr(buf, 0);
|
|
|
|
+ } else {
|
|
|
|
+ nbuf = qdf_nbuf_get_ext_list(buf);
|
|
|
|
+ if (nbuf)
|
|
|
|
+ wh = (struct ieee80211_frame_min_one *)qdf_nbuf_data(nbuf);
|
|
|
|
+ else
|
|
|
|
+ return QDF_STATUS_E_ABORTED;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ mgmt_filter = mon_pdev->fp_mgmt_filter;
|
|
|
|
+ ctrl_filter = mon_pdev->fp_ctrl_filter;
|
|
|
|
+ data_filter = mon_pdev->fp_data_filter;
|
|
|
|
+
|
|
|
|
+ type = (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK);
|
|
|
|
+
|
|
|
|
+ switch (type) {
|
|
|
|
+ case QDF_IEEE80211_FC0_TYPE_MGT:
|
|
|
|
+ return mgmt_filter ? QDF_STATUS_SUCCESS : QDF_STATUS_E_ABORTED;
|
|
|
|
+ case QDF_IEEE80211_FC0_TYPE_CTL:
|
|
|
|
+ return ctrl_filter ? QDF_STATUS_SUCCESS : QDF_STATUS_E_ABORTED;
|
|
|
|
+ case QDF_IEEE80211_FC0_TYPE_DATA:
|
|
|
|
+ return data_filter ? QDF_STATUS_SUCCESS : QDF_STATUS_E_ABORTED;
|
|
|
|
+ default:
|
|
|
|
+ return QDF_STATUS_E_ABORTED;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
|
+}
|
|
|
|
+
|
|
static int
|
|
static int
|
|
dp_tx_handle_local_pkt_capture(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
|
|
dp_tx_handle_local_pkt_capture(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
|
|
{
|
|
{
|
|
@@ -976,6 +1028,15 @@ dp_tx_handle_local_pkt_capture(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
|
|
{
|
|
{
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+static inline QDF_STATUS
|
|
|
|
+dp_tx_mon_lpc_type_filtering(struct dp_pdev *pdev,
|
|
|
|
+ struct dp_tx_ppdu_info *tx_ppdu_info,
|
|
|
|
+ qdf_nbuf_t buf)
|
|
|
|
+{
|
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
|
+}
|
|
|
|
+
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -1061,7 +1122,8 @@ dp_tx_mon_send_per_usr_mpdu(struct dp_pdev *pdev,
|
|
&ppdu_info->hal_txmon.rx_user_status[user_idx];
|
|
&ppdu_info->hal_txmon.rx_user_status[user_idx];
|
|
|
|
|
|
if (dp_tx_lite_mon_filtering(pdev, ppdu_info, buf,
|
|
if (dp_tx_lite_mon_filtering(pdev, ppdu_info, buf,
|
|
- ++mpdu_count)) {
|
|
|
|
|
|
+ ++mpdu_count) ||
|
|
|
|
+ dp_tx_mon_lpc_type_filtering(pdev, ppdu_info, buf)) {
|
|
qdf_nbuf_free(buf);
|
|
qdf_nbuf_free(buf);
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|