Forráskód Böngészése

qcacmn: Forward the igmp packet for intra bss processing

Forward the igmp packet for intra bss processing

Change-Id: Ie4838a00542e49e8d76503297332b99cf3e67563
CRs-Fixed: 3261921
Sai Rupesh Chevuru 2 éve
szülő
commit
086f192c0a

+ 3 - 0
dp/inc/cdp_txrx_stats_struct.h

@@ -113,6 +113,7 @@
 
 #define CDP_MAX_RX_RINGS 8  /* max rx rings */
 #define CDP_MAX_TX_COMP_RINGS 5 /* max tx/completion rings */
+#define CDP_MAX_RX_WBM_RINGS 1 /* max rx wbm rings */
 
 #define CDP_MAX_TX_TQM_STATUS 9  /* max tx tqm completion status */
 #define CDP_MAX_TX_HTT_STATUS 7  /* max tx htt completion status */
@@ -1055,6 +1056,8 @@ struct cdp_tid_stats {
 					    [CDP_MAX_DATA_TIDS];
 	struct cdp_tid_rx_stats tid_rx_stats[CDP_MAX_RX_RINGS]
 					    [CDP_MAX_DATA_TIDS];
+	struct cdp_tid_rx_stats tid_rx_wbm_stats[CDP_MAX_RX_WBM_RINGS]
+						[CDP_MAX_DATA_TIDS];
 };
 
 /*

+ 9 - 0
dp/wifi3.0/be/dp_be_rx.c

@@ -1179,10 +1179,19 @@ bool dp_rx_mlo_igmp_handler(struct dp_soc *soc,
 	struct dp_vdev *mcast_primary_vdev = NULL;
 	struct dp_vdev_be *be_vdev = dp_get_be_vdev_from_dp_vdev(vdev);
 	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
+	uint8_t tid = qdf_nbuf_get_tid_val(nbuf);
+	struct cdp_tid_rx_stats *tid_stats = &peer->vdev->pdev->stats.
+					tid_stats.tid_rx_wbm_stats[0][tid];
 
 	if (!(qdf_nbuf_is_ipv4_igmp_pkt(nbuf) ||
 	      qdf_nbuf_is_ipv6_igmp_pkt(nbuf)))
 		return false;
+
+	if (!peer->bss_peer) {
+		if (dp_rx_intrabss_mcbc_fwd(soc, peer, NULL, nbuf, tid_stats))
+			dp_rx_err("forwarding failed");
+	}
+
 	/*
 	 * In the case of ME6, Backhaul WDS, NAWDS
 	 * send the igmp pkt on the same link where it received,

+ 8 - 0
dp/wifi3.0/dp_rx_err.c

@@ -2707,6 +2707,7 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
 	bool process_sg_buf = false;
 	uint32_t wbm_err_src;
 	QDF_STATUS status;
+	struct hal_rx_mpdu_desc_info mpdu_desc_info = { 0 };
 
 	/* Debug -- Remove later */
 	qdf_assert(soc && hal_ring_hdl);
@@ -2793,6 +2794,13 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
 			continue;
 		}
 
+		/* Get MPDU DESC info */
+		hal_rx_mpdu_desc_info_get(hal_soc, ring_desc, &mpdu_desc_info);
+
+		if (qdf_likely(mpdu_desc_info.mpdu_flags &
+			       HAL_MPDU_F_QOS_CONTROL_VALID))
+			qdf_nbuf_set_tid_val(rx_desc->nbuf, mpdu_desc_info.tid);
+
 		rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
 		dp_ipa_rx_buf_smmu_mapping_lock(soc);
 		dp_rx_nbuf_unmap_pool(soc, rx_desc_pool, nbuf);

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

@@ -5107,6 +5107,7 @@ void dp_pdev_print_tid_stats(struct dp_pdev *pdev)
 	struct cdp_tid_tx_stats total_tx;
 	struct cdp_tid_rx_stats total_rx;
 	uint8_t tid, tqm_status_idx, htt_status_idx;
+	struct cdp_tid_rx_stats *rx_wbm_stats = NULL;
 
 	DP_PRINT_STATS("Packets received in hardstart: %llu ",
 			pdev->stats.tid_stats.ingress_stack);
@@ -5115,6 +5116,8 @@ void dp_pdev_print_tid_stats(struct dp_pdev *pdev)
 	DP_PRINT_STATS("Per TID Video Stats:\n");
 
 	for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
+		rx_wbm_stats = &pdev->stats.tid_stats.tid_rx_wbm_stats[0][tid];
+
 		dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
 					TID_COUNTER_STATS);
 		DP_PRINT_STATS("----TID: %d----", tid);
@@ -5171,6 +5174,10 @@ void dp_pdev_print_tid_stats(struct dp_pdev *pdev)
 			       total_rx.mcast_msdu_cnt);
 		DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n",
 			       total_rx.bcast_msdu_cnt);
+		DP_PRINT_STATS("Rx WBM Intra Bss Deliver Count: %llu",
+			       rx_wbm_stats->intrabss_cnt);
+		DP_PRINT_STATS("Rx WBM Intrabss Drop Count: %llu",
+			       rx_wbm_stats->fail_cnt[INTRABSS_DROP]);
 	}
 }