diff --git a/components/dp/core/src/wlan_dp_nud_tracking.c b/components/dp/core/src/wlan_dp_nud_tracking.c index 3272723609..27fbf6b579 100644 --- a/components/dp/core/src/wlan_dp_nud_tracking.c +++ b/components/dp/core/src/wlan_dp_nud_tracking.c @@ -28,6 +28,7 @@ #include "wlan_cm_roam_ucfg_api.h" #include #include "wlan_dp_nud_tracking.h" +#include "wlan_vdev_mgr_ucfg_api.h" #ifdef WLAN_NUD_TRACKING /** @@ -206,23 +207,36 @@ static void dp_nud_capture_stats(struct wlan_dp_intf *dp_intf, */ static bool dp_nud_honour_failure(struct wlan_dp_intf *dp_intf) { - uint32_t tx_transmitted; - uint32_t tx_acked; - uint32_t gw_rx_pkt; + uint32_t tx_transmitted, tx_acked, gw_rx_pkt, rx_received; struct dp_nud_tracking_info *nud_tracking = &dp_intf->nud_tracking; + struct wlan_objmgr_vdev *vdev; + uint8_t bssid[QDF_MAC_ADDR_SIZE]; + bool ap_is_gateway; + + vdev = dp_objmgr_get_vdev_by_user(dp_intf, WLAN_DP_ID); + if (!vdev) + goto fail; + ucfg_wlan_vdev_mgr_get_param_bssid(vdev, bssid); + dp_objmgr_put_vdev_by_user(vdev, WLAN_DP_ID); tx_transmitted = nud_tracking->tx_rx_stats.post_tx_packets - nud_tracking->tx_rx_stats.pre_tx_packets; tx_acked = nud_tracking->tx_rx_stats.post_tx_acked - nud_tracking->tx_rx_stats.pre_tx_acked; gw_rx_pkt = qdf_atomic_read(&nud_tracking->tx_rx_stats.gw_rx_packets); + rx_received = nud_tracking->tx_rx_stats.post_rx_packets - + nud_tracking->tx_rx_stats.pre_rx_packets; + ap_is_gateway = qdf_is_macaddr_equal(&dp_intf->nud_tracking.gw_mac_addr, + (struct qdf_mac_addr *)bssid); - if (!tx_transmitted || !tx_acked || !gw_rx_pkt) { + if (!tx_transmitted || !tx_acked || + !(gw_rx_pkt || (ap_is_gateway && rx_received))) { dp_info("NUD_FAILURE_HONORED [mac:" QDF_MAC_ADDR_FMT "]", QDF_MAC_ADDR_REF(nud_tracking->gw_mac_addr.bytes)); dp_nud_stats_info(dp_intf); return true; } +fail: dp_info("NUD_FAILURE_NOT_HONORED [mac:" QDF_MAC_ADDR_FMT "]", QDF_MAC_ADDR_REF(nud_tracking->gw_mac_addr.bytes));