diff --git a/dp/inc/cdp_txrx_me.h b/dp/inc/cdp_txrx_me.h index 9d4c3e29db..9d552edcb3 100644 --- a/dp/inc/cdp_txrx_me.h +++ b/dp/inc/cdp_txrx_me.h @@ -65,7 +65,7 @@ cdp_tx_me_free_descriptor(ol_txrx_soc_handle soc, uint8_t pdev_id) static inline uint16_t cdp_tx_me_convert_ucast(ol_txrx_soc_handle soc, uint8_t vdev_id, qdf_nbuf_t wbuf, u_int8_t newmac[][6], - uint8_t newmaccnt, uint8_t tid) + uint8_t newmaccnt, uint8_t tid, bool is_igmp) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -79,7 +79,7 @@ cdp_tx_me_convert_ucast(ol_txrx_soc_handle soc, uint8_t vdev_id, return 0; return soc->ops->me_ops->tx_me_convert_ucast - (soc, vdev_id, wbuf, newmac, newmaccnt, tid); + (soc, vdev_id, wbuf, newmac, newmaccnt, tid, is_igmp); } #endif diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 416a345474..bf4773afb8 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -769,7 +769,8 @@ struct cdp_me_ops { uint16_t (*tx_me_convert_ucast)(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_t wbuf, u_int8_t newmac[][6], - uint8_t newmaccnt, uint8_t tid); + uint8_t newmaccnt, uint8_t tid, + bool is_igmp); }; struct cdp_mon_ops { diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index cc9e44f643..e3508d266e 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -1178,6 +1178,8 @@ struct cdp_rx_stats { * @ucast: total unicast packets transmitted * @fail_seg_alloc: Segment allocation failure * @clone_fail: NBUF clone failure + * @igmp_rcvd: igmp pkts received for conversion to ucast pkts + * @igmp_ucast_converted: unicast pkts sent as part of VoW IGMP improvements * @dropped_pkt: Total scatter gather packets * @desc_na: Desc Not Available * @exc_desc_na: Exception desc Not Available @@ -1225,6 +1227,12 @@ struct cdp_tx_ingress_stats { uint32_t clone_fail; } mcast_en; + /* IGMP Multicast Enhancement packets info */ + struct { + uint32_t igmp_rcvd; + uint32_t igmp_ucast_converted; + } igmp_mcast_en; + /* Packets dropped on the Tx side */ struct { struct cdp_pkt_info dropped_pkt; diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 6c8b11fa20..8e641a9ee6 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -683,6 +683,8 @@ static inline void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj, DP_STATS_AGGR(tgtobj, srcobj, tx_i.mcast_en.dropped_send_fail); DP_STATS_AGGR(tgtobj, srcobj, tx_i.mcast_en.ucast); + DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_rcvd); + DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_ucast_converted); DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.dma_error); DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.ring_full); DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.enqueue_fail); @@ -1194,7 +1196,8 @@ void dp_rx_bar_stats_cb(struct dp_soc *soc, void *cb_ctxt, uint16_t dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_t nbuf, uint8_t newmac[][QDF_MAC_ADDR_SIZE], - uint8_t new_mac_cnt, uint8_t tid); + uint8_t new_mac_cnt, uint8_t tid, + bool is_igmp); void dp_tx_me_alloc_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id); void dp_tx_me_free_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id); diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 5f82d94e7b..6517015154 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -8820,6 +8820,30 @@ static void dp_txrx_update_vdev_me_stats(struct dp_vdev *vdev, host_stats->mcast_en.clone_fail); } +/* dp_txrx_update_vdev_igmp_me_stats(): Update vdev IGMP ME stats sent from CDP + * @vdev: DP vdev handle + * @buf: buffer containing specific stats structure + * + * Returns: void + */ +static void dp_txrx_update_vdev_igmp_me_stats(struct dp_vdev *vdev, + void *buf) +{ + struct cdp_tx_ingress_stats *host_stats = NULL; + + if (!buf) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "Invalid host stats buf"); + return; + } + host_stats = (struct cdp_tx_ingress_stats *)buf; + + DP_STATS_INC(vdev, tx_i.igmp_mcast_en.igmp_rcvd, + host_stats->igmp_mcast_en.igmp_rcvd); + DP_STATS_INC(vdev, tx_i.igmp_mcast_en.igmp_ucast_converted, + host_stats->igmp_mcast_en.igmp_ucast_converted); +} + /* dp_txrx_update_vdev_host_stats(): Update stats sent through CDP * @soc: DP soc handle * @vdev_id: id of DP vdev handle @@ -8848,6 +8872,7 @@ static QDF_STATUS dp_txrx_update_vdev_host_stats(struct cdp_soc_t *soc_hdl, break; case DP_VDEV_STATS_TX_ME: dp_txrx_update_vdev_me_stats(vdev, buf); + dp_txrx_update_vdev_igmp_me_stats(vdev, buf); break; default: qdf_info("Invalid stats_id %d", stats_id); diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 095cd67a3e..f55051fa7d 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -6182,6 +6182,11 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev) pdev->stats.tx_i.mcast_en.dropped_send_fail); DP_PRINT_STATS(" Unicast sent = %d", pdev->stats.tx_i.mcast_en.ucast); + DP_PRINT_STATS("IGMP Mcast Enhancement:"); + DP_PRINT_STATS(" IGMP packets received = %d", + pdev->stats.tx_i.igmp_mcast_en.igmp_rcvd); + DP_PRINT_STATS(" Converted to uncast = %d", + pdev->stats.tx_i.igmp_mcast_en.igmp_ucast_converted); DP_PRINT_STATS("Raw:"); DP_PRINT_STATS(" Packets = %d", pdev->stats.tx_i.raw.raw_pkt.num);