Эх сурвалжийг харах

qcacmn: Enable Subtype and PPDU filtering

Enable subtype filtering for all types of frames. Check the subtype
for all types of frames and drop the frames which are not requested.

Also enable PPDU level filtering by dropping the MPDUs after the first
MPDUs.

Change-Id: I94496ec278724a7023a79b50c2cd7a77b2707e74
CRs-Fixed: 3247309
Nandha Kishore Easwaran 3 жил өмнө
parent
commit
9b81f6a195

+ 15 - 0
dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c

@@ -3095,8 +3095,14 @@ dp_mon_filter_reset_tx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev)
 				DP_MON_FILTER_LITE_MON_MODE;
 	enum dp_mon_filter_srng_type srng_type =
 				DP_MON_FILTER_SRNG_TYPE_TXMON_DEST;
+	struct dp_lite_mon_tx_config *config = NULL;
 
 	be_mon_pdev->filter_be[filter_mode][srng_type] = filter;
+	config = be_mon_pdev->lite_mon_tx_config;
+	if (!config)
+		return;
+	config->subtype_filtering = false;
+
 }
 
 void
@@ -3136,6 +3142,9 @@ dp_mon_filter_setup_tx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev)
 		if ((config->tx_config.level == CDP_LITE_MON_LEVEL_MPDU) ||
 		    (config->tx_config.level == CDP_LITE_MON_LEVEL_PPDU))
 			tx_tlv_filter->mgmt_mpdu_log = 1;
+		if (config->tx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP] !=
+		    CDP_LITE_MON_FILTER_ALL)
+			config->subtype_filtering = true;
 	}
 
 	/* configure ctrl filters */
@@ -3146,6 +3155,9 @@ dp_mon_filter_setup_tx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev)
 		if ((config->tx_config.level == CDP_LITE_MON_LEVEL_MPDU) ||
 		    (config->tx_config.level == CDP_LITE_MON_LEVEL_PPDU))
 			tx_tlv_filter->ctrl_mpdu_log = 1;
+		if (config->tx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP] !=
+		    CDP_LITE_MON_FILTER_ALL)
+			config->subtype_filtering = true;
 	}
 	/* configure data filters */
 	if (config->tx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP]) {
@@ -3155,6 +3167,9 @@ dp_mon_filter_setup_tx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev)
 		if ((config->tx_config.level == CDP_LITE_MON_LEVEL_MPDU) ||
 		    (config->tx_config.level == CDP_LITE_MON_LEVEL_PPDU))
 			tx_tlv_filter->data_mpdu_log = 1;
+		if (config->tx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP] !=
+		    CDP_LITE_MON_FILTER_ALL)
+			config->subtype_filtering = true;
 	}
 
 	dp_mon_filter_show_tx_filter_be(mode, &filter);

+ 144 - 3
dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c

@@ -506,7 +506,7 @@ struct dp_tx_ppdu_info *dp_tx_mon_get_ppdu_info(struct dp_pdev *pdev,
 	TXMON_PPDU_HAL(tx_ppdu_info, is_used) = 0;
 	TXMON_PPDU_HAL(tx_ppdu_info, num_users) = num_user;
 	TXMON_PPDU_HAL(tx_ppdu_info, ppdu_id) = ppdu_id;
-	tx_ppdu_info->ppdu_id = ppdu_id;
+	TXMON_PPDU(tx_ppdu_info, ppdu_id) = ppdu_id;
 
 	for (i = 0; i < num_user; i++) {
 		qdf_nbuf_queue_t *mpdu_q;
@@ -658,11 +658,142 @@ static void dp_fill_lite_mon_vdev(struct cdp_tx_indication_info *tx_cap_info,
 	if (lite_mon_vdev)
 		tx_cap_info->osif_vdev = lite_mon_vdev->osif_vdev;
 }
+
+/**
+ * dp_lite_mon_filter_ppdu() - Filter frames at ppdu level
+ * @mpdu_count: mpdu count in the nbuf queue
+ * @level: Lite monitor filter level
+ *
+ * Return: QDF_STATUS
+ */
+static inline QDF_STATUS
+dp_lite_mon_filter_ppdu(uint8_t mpdu_count, uint8_t level)
+{
+	if (level == CDP_LITE_MON_LEVEL_PPDU && mpdu_count > 1)
+		return QDF_STATUS_E_CANCELED;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * dp_lite_mon_filter_subtype() - filter frames with subtype
+ * @tx_ppdu_info: pointer to dp_tx_ppdu_info structure
+ * @config: Lite monitor configuration
+ *
+ * Return: QDF_STATUS
+ */
+static inline QDF_STATUS
+dp_lite_mon_filter_subtype(struct dp_tx_ppdu_info *tx_ppdu_info,
+			   struct dp_lite_mon_tx_config *config, qdf_nbuf_t buf)
+{
+	uint16_t mgmt_filter, ctrl_filter, data_filter, type, subtype;
+	struct ieee80211_frame_min_one *wh;
+	uint8_t is_mcast = 0;
+	qdf_nbuf_t nbuf;
+
+	/* Return here if subtype filtering is not required */
+	if (!config->subtype_filtering)
+		return QDF_STATUS_SUCCESS;
+
+	mgmt_filter = config->tx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP];
+	ctrl_filter = config->tx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP];
+	data_filter = config->tx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP];
+
+	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_INVAL;
+	}
+
+	type = (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK);
+	subtype = ((wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) >>
+		IEEE80211_FC0_SUBTYPE_SHIFT);
+
+	switch (type) {
+	case IEEE80211_FC0_TYPE_MGT:
+		if (mgmt_filter >> subtype & 0x1)
+			return QDF_STATUS_SUCCESS;
+		else
+			return QDF_STATUS_E_ABORTED;
+	case IEEE80211_FC0_TYPE_CTL:
+		if (ctrl_filter >> subtype & 0x1)
+			return QDF_STATUS_SUCCESS;
+		else
+			return QDF_STATUS_E_ABORTED;
+	case IEEE80211_FC0_TYPE_DATA:
+		is_mcast = DP_FRAME_IS_MULTICAST(wh->i_addr1);
+		if ((is_mcast && (data_filter & FILTER_DATA_MCAST)) ||
+		    (!is_mcast && (data_filter & FILTER_DATA_UCAST)))
+			return QDF_STATUS_SUCCESS;
+		return QDF_STATUS_E_ABORTED;
+	default:
+		return QDF_STATUS_E_INVAL;
+	}
+}
+
+/**
+ * dp_tx_lite_mon_filtering() - Additional filtering for lite monitor
+ * @pdev: Pointer to physical device
+ * @tx_ppdu_info: pointer to dp_tx_ppdu_info structure
+ * @buf: qdf nbuf structure of buffer
+ * @mpdu_count: mpdu count in the nbuf queue
+ *
+ * Return: QDF_STATUS
+ */
+static inline QDF_STATUS
+dp_tx_lite_mon_filtering(struct dp_pdev *pdev,
+			 struct dp_tx_ppdu_info *tx_ppdu_info,
+			 qdf_nbuf_t buf, int mpdu_count)
+{
+	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
+	struct dp_mon_pdev_be *mon_pdev_be =
+		dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
+	struct dp_lite_mon_tx_config *config =
+		mon_pdev_be->lite_mon_tx_config;
+	QDF_STATUS ret;
+
+	if (!dp_lite_mon_is_tx_enabled(mon_pdev))
+		return QDF_STATUS_SUCCESS;
+
+	/* PPDU level filtering */
+	ret = dp_lite_mon_filter_ppdu(mpdu_count, config->tx_config.level);
+	if (ret)
+		return ret;
+
+	/* Subtype filtering */
+	ret = dp_lite_mon_filter_subtype(tx_ppdu_info, config, buf);
+	if (ret)
+		return ret;
+
+	return QDF_STATUS_SUCCESS;
+}
+
 #else
 static void dp_fill_lite_mon_vdev(struct cdp_tx_indication_info *tx_cap_info,
 				  struct dp_mon_pdev_be *mon_pdev_be)
 {
 }
+
+/**
+ * dp_tx_lite_mon_filtering() - Additional filtering for lite monitor
+ * @pdev: Pointer to physical device
+ * @tx_ppdu_info: pointer to dp_tx_ppdu_info structure
+ * @buf: qdf nbuf structure of buffer
+ * @mpdu_count: mpdu count in the nbuf queue
+ *
+ * Return: QDF_STATUS
+ */
+static inline QDF_STATUS
+dp_tx_lite_mon_filtering(struct dp_pdev *pdev,
+			 struct dp_tx_ppdu_info *tx_ppdu_info,
+			 qdf_nbuf_t buf, int mpdu_count)
+{
+	return QDF_STATUS_SUCCESS;
+}
 #endif
 
 /**
@@ -670,12 +801,13 @@ static void dp_fill_lite_mon_vdev(struct cdp_tx_indication_info *tx_cap_info,
  * @pdev: pdev Handle
  * @mpdu: pointer to mpdu
  * @num_frag: number of frag in mpdu
+ * @ppdu_id: ppdu id of the mpdu
  *
  * Return: void
  */
 static void
 dp_tx_mon_send_to_stack(struct dp_pdev *pdev, qdf_nbuf_t mpdu,
-			uint32_t num_frag)
+			uint32_t num_frag, uint32_t ppdu_id)
 {
 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
 	struct dp_mon_pdev_be *mon_pdev_be =
@@ -688,6 +820,7 @@ dp_tx_mon_send_to_stack(struct dp_pdev *pdev, qdf_nbuf_t mpdu,
 
 	tx_capture_info.radiotap_done = 1;
 	tx_capture_info.mpdu_nbuf = mpdu;
+	tx_capture_info.mpdu_info.ppdu_id = ppdu_id;
 	if (!dp_lite_mon_is_tx_enabled(mon_pdev)) {
 		dp_wdi_event_handler(WDI_EVENT_TX_PKT_CAPTURE,
 				     pdev->soc,
@@ -723,6 +856,7 @@ dp_tx_mon_send_per_usr_mpdu(struct dp_pdev *pdev,
 {
 	qdf_nbuf_queue_t *usr_mpdu_q = NULL;
 	qdf_nbuf_t buf = NULL;
+	uint8_t mpdu_count = 0;
 
 	usr_mpdu_q = &TXMON_PPDU_USR(ppdu_info, user_idx, mpdu_q);
 
@@ -732,10 +866,17 @@ dp_tx_mon_send_per_usr_mpdu(struct dp_pdev *pdev,
 		ppdu_info->hal_txmon.rx_status.rx_user_status =
 				&ppdu_info->hal_txmon.rx_user_status[user_idx];
 
+		if (dp_tx_lite_mon_filtering(pdev, ppdu_info, buf,
+					     ++mpdu_count)) {
+			qdf_nbuf_free(buf);
+			continue;
+		}
+
 		qdf_nbuf_update_radiotap(&ppdu_info->hal_txmon.rx_status,
 					 buf, qdf_nbuf_headroom(buf));
 
-		dp_tx_mon_send_to_stack(pdev, buf, num_frag);
+		dp_tx_mon_send_to_stack(pdev, buf, num_frag,
+					TXMON_PPDU(ppdu_info, ppdu_id));
 	}
 }
 

+ 0 - 10
dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h

@@ -178,16 +178,6 @@ dp_tx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 #define INITIATOR_WINDOW 0
 #define RESPONSE_WINDOW 1
 
-#define FRAME_CONTROL_TYPE_MASK  0x0C
-#define FRAME_CONTROL_TYPE_SHIFT 2
-
-#define FRAME_CONTROL_SUBTYPE_MASK  0xF0
-#define FRAME_CONTROL_SUBTYPE_SHIFT 4
-
-#define FRAME_CTRL_TYPE_MGMT 0x0
-#define FRAME_CTRL_TYPE_CTRL 0x1
-#define FRAME_CTRL_TYPE_DATA 0x2
-
 /**
  * bf_type -  tx monitor supported Beamformed type
  */

+ 51 - 113
dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c

@@ -315,6 +315,7 @@ dp_tx_mon_generate_cts2self_frm(struct dp_pdev *pdev,
 	uint16_t duration_le = 0;
 	struct ieee80211_frame_min_one *wh_min = NULL;
 	qdf_nbuf_t mpdu_nbuf = NULL;
+	uint8_t frm_ctl;
 
 	/* sanity check */
 	if (qdf_unlikely(!pdev))
@@ -343,9 +344,13 @@ dp_tx_mon_generate_cts2self_frm(struct dp_pdev *pdev,
 	wh_min = (struct ieee80211_frame_min_one *)qdf_nbuf_data(mpdu_nbuf);
 	qdf_mem_zero(wh_min, MAX_DUMMY_FRM_BODY);
 
+	frm_ctl = (IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL |
+		   IEEE80211_FC0_SUBTYPE_CTS);
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control) = frm_ctl;
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control_info_valid) = 1;
 	wh_min->i_fc[1] = 0;
-	wh_min->i_fc[0] = (IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL |
-			   IEEE80211_FC0_SUBTYPE_CTS);
+	wh_min->i_fc[0] = frm_ctl;
+
 	duration_le = qdf_cpu_to_le16(TXMON_PPDU_COM(tx_ppdu_info, duration));
 	wh_min->i_dur[1] = (duration_le & 0xFF00) >> 8;
 	wh_min->i_dur[0] = (duration_le & 0xFF);
@@ -387,6 +392,7 @@ dp_tx_mon_generate_rts_frm(struct dp_pdev *pdev,
 	uint16_t duration_le = 0;
 	struct ieee80211_ctlframe_addr2 *wh_min = NULL;
 	qdf_nbuf_t mpdu_nbuf = NULL;
+	uint8_t frm_ctl;
 
 	/* sanity check */
 	if (qdf_unlikely(!pdev))
@@ -414,9 +420,13 @@ dp_tx_mon_generate_rts_frm(struct dp_pdev *pdev,
 	wh_min = (struct ieee80211_ctlframe_addr2 *)qdf_nbuf_data(mpdu_nbuf);
 	qdf_mem_zero(wh_min, MAX_DUMMY_FRM_BODY);
 
+	frm_ctl = (IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL |
+		   IEEE80211_FC0_SUBTYPE_RTS);
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control) = frm_ctl;
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control_info_valid) = 1;
 	wh_min->i_fc[1] = 0;
-	wh_min->i_fc[0] = (IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL |
-			   IEEE80211_FC0_SUBTYPE_RTS);
+	wh_min->i_fc[0] = frm_ctl;
+
 	duration_le = qdf_cpu_to_le16(TXMON_PPDU_COM(tx_ppdu_info, duration));
 	wh_min->i_aidordur[1] = (duration_le & 0xFF00) >> 8;
 	wh_min->i_aidordur[0] = (duration_le & 0xFF);
@@ -467,6 +477,7 @@ dp_tx_mon_generate_ack_frm(struct dp_pdev *pdev,
 	struct ieee80211_frame_min_one *wh_addr1 = NULL;
 	qdf_nbuf_t mpdu_nbuf = NULL;
 	uint8_t user_id = TXMON_PPDU(tx_ppdu_info, cur_usr_idx);
+	uint8_t frm_ctl;
 
 	/* sanity check */
 	if (qdf_unlikely(!pdev))
@@ -492,9 +503,13 @@ dp_tx_mon_generate_ack_frm(struct dp_pdev *pdev,
 		return;
 
 	wh_addr1 = (struct ieee80211_frame_min_one *)qdf_nbuf_data(mpdu_nbuf);
+
+	frm_ctl = (IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL |
+		   IEEE80211_FC0_SUBTYPE_ACK);
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control) = frm_ctl;
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control_info_valid) = 1;
 	wh_addr1->i_fc[1] = 0;
-	wh_addr1->i_fc[0] = (IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL |
-			     IEEE80211_FC0_SUBTYPE_ACK);
+	wh_addr1->i_fc[0] = frm_ctl;
 
 	if (window_flag == INITIATOR_WINDOW) {
 		qdf_mem_copy(wh_addr1->i_addr1,
@@ -538,6 +553,7 @@ dp_tx_mon_generate_3addr_qos_null_frm(struct dp_pdev *pdev,
 	qdf_nbuf_t mpdu_nbuf = NULL;
 	uint16_t duration_le = 0;
 	uint8_t num_users = 0;
+	uint8_t frm_ctl;
 
 	/* sanity check */
 	if (qdf_unlikely(!pdev))
@@ -564,11 +580,13 @@ dp_tx_mon_generate_3addr_qos_null_frm(struct dp_pdev *pdev,
 
 	wh_addr3 = (struct ieee80211_qosframe *)qdf_nbuf_data(mpdu_nbuf);
 	qdf_mem_zero(wh_addr3, sizeof(struct ieee80211_qosframe));
-	wh_addr3->i_fc[0] = 0;
+
+	frm_ctl = (IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_DATA |
+		   IEEE80211_FC0_SUBTYPE_QOS_NULL);
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control) = frm_ctl;
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control_info_valid) = 1;
 	wh_addr3->i_fc[1] = 0;
-	wh_addr3->i_fc[0] = (IEEE80211_FC0_VERSION_0 |
-			     IEEE80211_FC0_TYPE_DATA |
-			     IEEE80211_FC0_SUBTYPE_QOS_NULL);
+	wh_addr3->i_fc[0] = frm_ctl;
 
 	duration_le = qdf_cpu_to_le16(TXMON_PPDU_COM(tx_ppdu_info, duration));
 	wh_addr3->i_dur[1] = (duration_le & 0xFF00) >> 8;
@@ -612,6 +630,7 @@ dp_tx_mon_generate_4addr_qos_null_frm(struct dp_pdev *pdev,
 	qdf_nbuf_t mpdu_nbuf = NULL;
 	uint16_t duration_le = 0;
 	uint8_t num_users = 0;
+	uint8_t frm_ctl;
 
 	/* sanity check */
 	if (qdf_unlikely(!pdev))
@@ -638,10 +657,13 @@ dp_tx_mon_generate_4addr_qos_null_frm(struct dp_pdev *pdev,
 
 	wh_addr4 = (struct ieee80211_qosframe_addr4 *)qdf_nbuf_data(mpdu_nbuf);
 	qdf_mem_zero(wh_addr4, sizeof(struct ieee80211_qosframe_addr4));
+
+	frm_ctl = (IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_DATA |
+		   IEEE80211_FC0_SUBTYPE_QOS_NULL);
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control) = frm_ctl;
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control_info_valid) = 1;
 	wh_addr4->i_fc[1] = 0;
-	wh_addr4->i_fc[0] = (IEEE80211_FC0_VERSION_0 |
-			     IEEE80211_FC0_TYPE_DATA |
-			     IEEE80211_FC0_SUBTYPE_QOS_NULL);
+	wh_addr4->i_fc[0] = frm_ctl;
 
 	duration_le = qdf_cpu_to_le16(TXMON_PPDU_COM(tx_ppdu_info, duration));
 	wh_addr4->i_dur[1] = (duration_le & 0xFF00) >> 8;
@@ -700,6 +722,7 @@ dp_tx_mon_generate_mu_block_ack_frm(struct dp_pdev *pdev,
 	uint32_t ba_sz = 0;
 	uint8_t num_users = TXMON_PPDU_HAL(tx_ppdu_info, num_users);
 	uint8_t i = 0;
+	uint8_t frm_ctl;
 
 	/* sanity check */
 	if (qdf_unlikely(!pdev))
@@ -738,11 +761,13 @@ dp_tx_mon_generate_mu_block_ack_frm(struct dp_pdev *pdev,
 	wh_addr2 = (struct ieee80211_ctlframe_addr2 *)qdf_nbuf_data(mpdu_nbuf);
 	qdf_mem_zero(wh_addr2, DP_BA_ACK_FRAME_SIZE);
 
-	wh_addr2->i_fc[0] = 0;
+	frm_ctl = (IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL |
+		   IEEE80211_FC0_BLOCK_ACK);
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control) = frm_ctl;
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control_info_valid) = 1;
 	wh_addr2->i_fc[1] = 0;
-	wh_addr2->i_fc[0] = (IEEE80211_FC0_VERSION_0 |
-			     IEEE80211_FC0_TYPE_CTL |
-			     IEEE80211_FC0_BLOCK_ACK);
+	wh_addr2->i_fc[0] = frm_ctl;
+
 	*(u_int16_t *)(&wh_addr2->i_aidordur) = qdf_cpu_to_le16(0x0000);
 
 	qdf_mem_copy(wh_addr2->i_addr2,
@@ -810,6 +835,7 @@ dp_tx_mon_generate_block_ack_frm(struct dp_pdev *pdev,
 	uint8_t user_id = TXMON_PPDU(tx_ppdu_info, cur_usr_idx);
 	uint32_t ba_bitmap_sz = TXMON_PPDU_USR(tx_ppdu_info,
 					       user_id, ba_bitmap_sz);
+	uint8_t frm_ctl;
 
 	/* sanity check */
 	if (qdf_unlikely(!pdev))
@@ -871,11 +897,13 @@ dp_tx_mon_generate_block_ack_frm(struct dp_pdev *pdev,
 	wh_addr2 = (struct ieee80211_ctlframe_addr2 *)qdf_nbuf_data(mpdu_nbuf);
 	qdf_mem_zero(wh_addr2, DP_BA_ACK_FRAME_SIZE);
 
-	wh_addr2->i_fc[0] = 0;
+	frm_ctl = (IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL |
+		   IEEE80211_FC0_BLOCK_ACK);
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control) = frm_ctl;
+	TXMON_PPDU_COM(tx_ppdu_info, frame_control_info_valid) = 1;
 	wh_addr2->i_fc[1] = 0;
-	wh_addr2->i_fc[0] = (IEEE80211_FC0_VERSION_0 |
-			     IEEE80211_FC0_TYPE_CTL |
-			     IEEE80211_FC0_BLOCK_ACK);
+	wh_addr2->i_fc[0] = frm_ctl;
+
 	/* duration */
 	*(u_int16_t *)(&wh_addr2->i_aidordur) = qdf_cpu_to_le16(0x0020);
 
@@ -1075,63 +1103,6 @@ dp_tx_mon_generate_prot_frm(struct dp_pdev *pdev,
 	}
 }
 
-/**
- * dp_lite_mon_filter_subtype() - filter frames with subtype
- * @mon_pdev_be: mon pdev Handle
- * @ppdu_info: pointer to hal_tx_ppdu_info structure
- *
- * Return: QDF_STATUS
- */
-static inline QDF_STATUS
-dp_lite_mon_filter_subtype(struct dp_mon_pdev_be *mon_pdev_be,
-			   struct hal_tx_ppdu_info *ppdu_info)
-{
-	struct dp_mon_pdev *mon_pdev = &mon_pdev_be->mon_pdev;
-	uint16_t frame_control;
-	struct dp_lite_mon_tx_config *lite_mon_tx_config =
-			mon_pdev_be->lite_mon_tx_config;
-	uint16_t mgmt_filter, ctrl_filter, data_filter, type, subtype;
-
-	if (!dp_lite_mon_is_tx_enabled(mon_pdev))
-		return QDF_STATUS_SUCCESS;
-
-	if (!TXMON_HAL_STATUS(ppdu_info, frame_control_info_valid)) {
-		dp_mon_err("Queue extension is invalid");
-		return QDF_STATUS_E_ABORTED;
-	}
-
-	frame_control = TXMON_HAL_STATUS(ppdu_info, frame_control);
-	qdf_spin_lock_bh(&lite_mon_tx_config->lite_mon_tx_lock);
-	mgmt_filter = lite_mon_tx_config->tx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP];
-	ctrl_filter = lite_mon_tx_config->tx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP];
-	data_filter = lite_mon_tx_config->tx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP];
-	qdf_spin_unlock_bh(&lite_mon_tx_config->lite_mon_tx_lock);
-
-	type = (frame_control & FRAME_CONTROL_TYPE_MASK) >>
-		FRAME_CONTROL_TYPE_SHIFT;
-	subtype = (frame_control & FRAME_CONTROL_SUBTYPE_MASK) >>
-		FRAME_CONTROL_SUBTYPE_SHIFT;
-
-	switch (type) {
-	case FRAME_CTRL_TYPE_MGMT:
-		if (mgmt_filter >> subtype & 0x1)
-			return QDF_STATUS_SUCCESS;
-		else
-			return QDF_STATUS_E_ABORTED;
-	case FRAME_CTRL_TYPE_CTRL:
-		if (ctrl_filter >> subtype & 0x1)
-			return QDF_STATUS_SUCCESS;
-		else
-			return QDF_STATUS_E_ABORTED;
-	case FRAME_CTRL_TYPE_DATA:
-		/* Allowing all data frames */
-		return QDF_STATUS_SUCCESS;
-	default:
-		dp_mon_err("Unknown frame type in framecontrol\n");
-		return QDF_STATUS_E_INVAL;
-	}
-}
-
 /**
  * dp_tx_mon_generated_response_frm() - API to handle generated response frame
  * @pdev: pdev Handle
@@ -1170,38 +1141,17 @@ dp_tx_mon_generated_response_frm(struct dp_pdev *pdev,
 	switch (gen_response) {
 	case TXMON_GEN_RESP_SELFGEN_ACK:
 	{
-		TXMON_PPDU_COM(tx_ppdu_info,
-			       frame_control) = ((IEEE80211_FC0_TYPE_CTL <<
-						  IEEE80211_FC0_TYPE_SHIFT) |
-						 (IEEE80211_FC0_SUBTYPE_ACK <<
-						  IEEE80211_FC0_SUBTYPE_SHIFT));
-		TXMON_PPDU_COM(tx_ppdu_info,
-			       frame_control_info_valid) = 1;
 		dp_tx_mon_generate_ack_frm(pdev, tx_ppdu_info, RESPONSE_WINDOW);
 		break;
 	}
 	case TXMON_GEN_RESP_SELFGEN_CTS:
 	{
-		TXMON_PPDU_COM(tx_ppdu_info,
-			       frame_control) = ((IEEE80211_FC0_TYPE_CTL <<
-						  IEEE80211_FC0_TYPE_SHIFT) |
-						 (IEEE80211_FC0_SUBTYPE_CTS <<
-						  IEEE80211_FC0_SUBTYPE_SHIFT));
-		TXMON_PPDU_COM(tx_ppdu_info,
-			       frame_control_info_valid) = 1;
 		dp_tx_mon_generate_cts2self_frm(pdev, tx_ppdu_info,
 						RESPONSE_WINDOW);
 		break;
 	}
 	case TXMON_GEN_RESP_SELFGEN_BA:
 	{
-		TXMON_PPDU_COM(tx_ppdu_info,
-			       frame_control) = ((IEEE80211_FC0_TYPE_CTL <<
-						  IEEE80211_FC0_TYPE_SHIFT) |
-						 (IEEE80211_FC0_BLOCK_ACK <<
-						  IEEE80211_FC0_SUBTYPE_SHIFT));
-		TXMON_PPDU_COM(tx_ppdu_info,
-			       frame_control_info_valid) = 1;
 		dp_tx_mon_generate_block_ack_frm(pdev, tx_ppdu_info,
 						 RESPONSE_WINDOW);
 		break;
@@ -1403,8 +1353,6 @@ dp_tx_mon_update_ppdu_info_status(struct dp_pdev *pdev,
 	case HAL_MON_RESPONSE_END_STATUS_INFO:
 	{
 		dp_tx_mon_generated_response_frm(pdev, tx_data_ppdu_info);
-		status = dp_lite_mon_filter_subtype(mon_pdev_be,
-						    &tx_data_ppdu_info->hal_txmon);
 		break;
 	}
 	case HAL_MON_TX_FES_STATUS_START:
@@ -1414,8 +1362,7 @@ dp_tx_mon_update_ppdu_info_status(struct dp_pdev *pdev,
 	}
 	case HAL_MON_TX_QUEUE_EXTENSION:
 	{
-		status = dp_lite_mon_filter_subtype(mon_pdev_be,
-						    &tx_data_ppdu_info->hal_txmon);
+		/* No action for Queue Extension TLV */
 		break;
 	}
 	default:
@@ -1507,8 +1454,7 @@ dp_tx_mon_process_tlv_2_0(struct dp_pdev *pdev,
 	}
 
 	/* iterate status buffer queue */
-	while (tx_mon_be->cur_frag_q_idx < tx_mon_be->last_frag_q_idx &&
-	       status == QDF_STATUS_SUCCESS) {
+	while (tx_mon_be->cur_frag_q_idx < tx_mon_be->last_frag_q_idx) {
 		/* get status buffer from frag_q_vec */
 		status_frag = tx_mon_be->frag_q_vec[cur_frag_q_idx].frag_buf;
 		end_offset = tx_mon_be->frag_q_vec[cur_frag_q_idx].end_offset;
@@ -1542,14 +1488,6 @@ dp_tx_mon_process_tlv_2_0(struct dp_pdev *pdev,
 							tlv_status,
 							mon_desc_list_ref);
 
-			if (status != QDF_STATUS_SUCCESS) {
-				dp_tx_mon_status_free_packet_buf(pdev,
-							status_frag,
-							end_offset,
-							mon_desc_list_ref);
-				break;
-			}
-
 			/* need api definition for hal_tx_status_get_next_tlv */
 			tx_tlv = hal_tx_status_get_next_tlv(tx_tlv);
 			if ((tx_tlv - tx_tlv_start) >= end_offset)