From 086f192c0ab2d8440ab7a357277646e1b77be1b9 Mon Sep 17 00:00:00 2001 From: Sai Rupesh Chevuru Date: Wed, 10 Aug 2022 15:53:24 +0530 Subject: [PATCH] qcacmn: Forward the igmp packet for intra bss processing Forward the igmp packet for intra bss processing Change-Id: Ie4838a00542e49e8d76503297332b99cf3e67563 CRs-Fixed: 3261921 --- dp/inc/cdp_txrx_stats_struct.h | 3 +++ dp/wifi3.0/be/dp_be_rx.c | 9 +++++++++ dp/wifi3.0/dp_rx_err.c | 8 ++++++++ dp/wifi3.0/dp_stats.c | 7 +++++++ 4 files changed, 27 insertions(+) diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 707432d4be..136e485080 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/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]; }; /* diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index 7bfc81a1e5..51432179dd 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/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, diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index e6e4c5eabe..e4bc314e32 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/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); diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 94ea4a780e..53d227339f 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/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]); } }