diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 0d29335fbb..147501a7b9 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -839,6 +839,7 @@ struct cdp_tx_stats { * @rx_rssi_measured_time: Time at which rssi is measured * @rssi: RSSI of received signal * @last_rssi: Previous rssi + * @multipass_rx_pkt_drop: Dropped multipass rx pkt */ struct cdp_rx_stats { struct cdp_pkt_info to_stack; @@ -902,6 +903,7 @@ struct cdp_rx_stats { uint32_t rx_rssi_measured_time; uint8_t rssi; uint8_t last_rssi; + uint32_t multipass_rx_pkt_drop; }; /* struct cdp_tx_ingress_stats - Tx ingress Stats diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index c3f52bb303..74015b925c 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -591,6 +591,8 @@ static inline void dp_update_pdev_stats(struct dp_pdev *tgtobj, srcobj->tx.last_ack_rssi; tgtobj->stats.rx.mec_drop.num += srcobj->rx.mec_drop.num; tgtobj->stats.rx.mec_drop.bytes += srcobj->rx.mec_drop.bytes; + tgtobj->stats.rx.multipass_rx_pkt_drop += + srcobj->rx.multipass_rx_pkt_drop; } static inline void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj, @@ -774,6 +776,8 @@ static inline void dp_update_vdev_stats(struct cdp_vdev_stats *tgtobj, srcobj->stats.tx.last_ack_rssi; tgtobj->rx.mec_drop.num += srcobj->stats.rx.mec_drop.num; tgtobj->rx.mec_drop.bytes += srcobj->stats.rx.mec_drop.bytes; + tgtobj->rx.multipass_rx_pkt_drop += + srcobj->stats.rx.multipass_rx_pkt_drop; } #define DP_UPDATE_STATS(_tgtobj, _srcobj) \ @@ -868,6 +872,7 @@ static inline void dp_update_vdev_stats(struct cdp_vdev_stats *tgtobj, \ _tgtobj->stats.tx.last_ack_rssi = \ _srcobj->stats.tx.last_ack_rssi; \ + DP_STATS_AGGR(_tgtobj, _srcobj, rx.multipass_rx_pkt_drop); \ } while (0) extern int dp_peer_find_attach(struct dp_soc *soc); diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 6666c6a52f..1b7b12a0d3 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -4974,6 +4974,7 @@ static struct cdp_vdev *dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc, vdev->safemode = 0; vdev->drop_unenc = 1; vdev->sec_type = cdp_sec_type_none; + vdev->multipass_en = false; #ifdef notyet vdev->filters_num = 0; #endif diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index ab624a5ceb..14b60d978f 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -2129,7 +2129,13 @@ done: * process frame for mulitpass phrase processing */ if (qdf_unlikely(vdev->multipass_en)) { - dp_rx_multipass_process(peer, nbuf, tid); + if (dp_rx_multipass_process(peer, nbuf, tid) == false) { + DP_STATS_INC(peer, rx.multipass_rx_pkt_drop, 1); + qdf_nbuf_free(nbuf); + nbuf = next; + dp_peer_unref_del_find_by_id(peer); + continue; + } } if (!dp_wds_rx_policy_check(rx_tlv_hdr, vdev, peer)) { diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index b300f5a4f3..f11300ad6f 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -5282,6 +5282,8 @@ void dp_print_peer_stats(struct dp_peer *peer) peer->stats.rx.rx_byte_rate); DP_PRINT_STATS(" Data received in last sec: %d", peer->stats.rx.rx_data_rate); + DP_PRINT_STATS("Multipass Rx Packet Drop = %d", + peer->stats.rx.multipass_rx_pkt_drop); } void dp_print_per_ring_stats(struct dp_soc *soc)