Browse Source

qcacmn: Add check for invalid frame ctrl version

Add check for invalid frame control version while
handling raw frames with FCS errors

Change-Id: I443bb20c5516604ff3ba797570118b3b2123dbd5
CRs-Fixed: 3589137
Jeevan Kukkalli 1 year ago
parent
commit
89339b7e3a

+ 1 - 0
dp/inc/cdp_txrx_stats_struct.h

@@ -3202,6 +3202,7 @@ struct cdp_pdev_stats {
 		/* Monitor mode related */
 		uint32_t mon_rx_drop;
 		uint32_t mon_radiotap_update_err;
+		uint32_t mon_ver_err;
 	} dropped;
 
 	struct {

+ 2 - 0
dp/wifi3.0/dp_stats.c

@@ -8247,6 +8247,8 @@ dp_print_pdev_rx_stats(struct dp_pdev *pdev)
 		       pdev->stats.dropped.mon_rx_drop);
 	DP_PRINT_STATS("        mon_radiotap_update_err = %u",
 		       pdev->stats.dropped.mon_radiotap_update_err);
+	DP_PRINT_STATS("        mon_ver_err = %u",
+		       pdev->stats.dropped.mon_ver_err);
 	DP_PRINT_STATS("        mec_drop = %llu",
 		       pdev->stats.rx.mec_drop.num);
 	DP_PRINT_STATS("	Bytes = %llu",

+ 9 - 0
dp/wifi3.0/monitor/1.0/dp_rx_mon_dest_1.0.c

@@ -1960,6 +1960,15 @@ dp_rx_mon_frag_restitch_mpdu_from_msdus(struct dp_soc *soc,
 	 * packet in RAW mode.
 	 */
 	if (buf_info.is_decap_raw == 1) {
+		if (qdf_unlikely(mon_pdev->ppdu_info.rx_status.rs_fcs_err)) {
+			hdr_desc = hal_rx_desc_get_80211_hdr(soc->hal_soc, rx_desc);
+			wh = (struct ieee80211_frame *)hdr_desc;
+			if ((wh->i_fc[0] & QDF_IEEE80211_FC0_VERSION_MASK) !=
+			    QDF_IEEE80211_FC0_VERSION_0) {
+				DP_STATS_INC(dp_pdev, dropped.mon_ver_err, 1);
+				return NULL;
+			}
+		}
 		dp_rx_mon_fraglist_prepare(head_msdu, tail_msdu);
 		goto mpdu_stitch_done;
 	}