diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index fa5c404999..4b740a6162 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -1826,6 +1826,7 @@ struct cdp_tx_ingress_stats { uint32_t headroom_insufficient; uint32_t fail_per_pkt_vdev_id_check; uint32_t drop_ingress; + uint32_t invalid_peer_id_in_exc_path; } dropped; /* Mesh packets info */ diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index fdabe1a2a0..2f0b324c01 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -7437,6 +7437,8 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev) pdev->stats.tx_i.dropped.res_full); DP_PRINT_STATS(" Drop Ingress = %u", pdev->stats.tx_i.dropped.drop_ingress); + DP_PRINT_STATS(" invalid peer id in exception path = %u", + pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path); DP_PRINT_STATS("Tx failed = %u", pdev->stats.tx.tx_failed); DP_PRINT_STATS(" FW removed Pkts = %u", @@ -8721,7 +8723,8 @@ void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj) tgtobj->stats.tx_i.dropped.desc_na.num + tgtobj->stats.tx_i.dropped.res_full + tgtobj->stats.tx_i.dropped.drop_ingress + - tgtobj->stats.tx_i.dropped.headroom_insufficient; + tgtobj->stats.tx_i.dropped.headroom_insufficient + + tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path; } void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj, @@ -8772,6 +8775,7 @@ void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj, DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.res_full); DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.drop_ingress); DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient); + DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.invalid_peer_id_in_exc_path); DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified); DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw); DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd); @@ -8790,7 +8794,8 @@ void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj, tgtobj->stats.tx_i.dropped.desc_na.num + tgtobj->stats.tx_i.dropped.res_full + tgtobj->stats.tx_i.dropped.drop_ingress + - tgtobj->stats.tx_i.dropped.headroom_insufficient; + tgtobj->stats.tx_i.dropped.headroom_insufficient + + tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path; } QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl, diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index fe6a324d70..e6756ccb87 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -3134,6 +3134,21 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, goto fail; } + /* for peer based metadata check if peer is valid */ + if (tx_exc_metadata->peer_id != CDP_INVALID_PEER) { + struct dp_peer *peer = NULL; + + peer = dp_peer_get_ref_by_id(vdev->pdev->soc, + tx_exc_metadata->peer_id, + DP_MOD_ID_TX_EXCEPTION); + if (qdf_unlikely(!peer)) { + DP_STATS_INC(vdev, + tx_i.dropped.invalid_peer_id_in_exc_path, + 1); + goto fail; + } + dp_peer_unref_delete(peer, DP_MOD_ID_TX_EXCEPTION); + } /* Basic sanity checks for unsupported packets */ /* MESH mode */