浏览代码

qcacmn: Add local packet capture type based filtering

For the control frames regenerated by the host driver based on the
TxMon TLV, add the local packet capture type based filtering.

Change-Id: If6b47368ce36524e1c84c51c298278ced671b915
CRs-Fixed: 3531895
Srinivas Girigowda 1 年之前
父节点
当前提交
afd51dc121
共有 1 个文件被更改,包括 63 次插入1 次删除
  1. 63 1
      dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c

+ 63 - 1
dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c

@@ -952,6 +952,58 @@ dp_tx_lite_mon_filtering(struct dp_pdev *pdev,
 #endif
 
 #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
 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;
 }
+
+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
 
 /**
@@ -1061,7 +1122,8 @@ dp_tx_mon_send_per_usr_mpdu(struct dp_pdev *pdev,
 				&ppdu_info->hal_txmon.rx_user_status[user_idx];
 
 		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);
 			continue;
 		}