From d9111bb36bcff03bbc44f43adb744a120539d88a Mon Sep 17 00:00:00 2001 From: Alok Kumar Date: Mon, 31 Dec 2018 14:32:09 +0530 Subject: [PATCH] qcacld-3.0: Handle NUD event if subnet gateway is configured Add protective check in driver to handle NUD events only if subnet gateway is configured. Change-Id: I5142e4d50490ea4726f337e19c8282359d23423d CRs-Fixed: 2373552 --- core/hdd/src/wlan_hdd_nud_tracking.c | 27 +++++++++++++++++++-------- core/hdd/src/wlan_hdd_nud_tracking.h | 4 +++- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/core/hdd/src/wlan_hdd_nud_tracking.c b/core/hdd/src/wlan_hdd_nud_tracking.c index 97d2db329d73..d5e8426976f9 100644 --- a/core/hdd/src/wlan_hdd_nud_tracking.c +++ b/core/hdd/src/wlan_hdd_nud_tracking.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2018, 2019 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -28,6 +28,7 @@ void hdd_nud_set_gateway_addr(struct hdd_adapter *adapter, qdf_mem_copy(adapter->nud_tracking.gw_mac_addr.bytes, gw_mac_addr.bytes, sizeof(struct qdf_mac_addr)); + adapter->nud_tracking.is_gw_updated = true; } void hdd_nud_incr_gw_rx_pkt_cnt(struct hdd_adapter *adapter, @@ -36,6 +37,9 @@ void hdd_nud_incr_gw_rx_pkt_cnt(struct hdd_adapter *adapter, if (!adapter->nud_tracking.is_gw_rx_pkt_track_enabled) return; + if (!adapter->nud_tracking.is_gw_updated) + return; + if (qdf_is_macaddr_equal(&adapter->nud_tracking.gw_mac_addr, mac_addr)) qdf_atomic_inc(&adapter @@ -83,6 +87,7 @@ void hdd_nud_reset_tracking(struct hdd_adapter *adapter) hdd_debug("Reset the NUD tracking"); qdf_zero_macaddr(&adapter->nud_tracking.gw_mac_addr); + adapter->nud_tracking.is_gw_updated = false; qdf_mem_zero(&adapter->nud_tracking.tx_rx_stats, sizeof(struct hdd_nud_tx_rx_stats)); @@ -171,11 +176,13 @@ static bool hdd_nud_honour_failure(struct hdd_adapter *adapter) ->nud_tracking.tx_rx_stats.gw_rx_packets); if (!tx_transmitted || !tx_acked || !gw_rx_pkt) { - hdd_debug("NUD_FAILURE_HONORED"); + hdd_debug("NUD_FAILURE_HONORED [mac:%pM]", + adapter->nud_tracking.gw_mac_addr.bytes); hdd_nud_stats_info(adapter); return true; } - hdd_debug("NUD_FAILURE_NOT_HONORED"); + hdd_debug("NUD_FAILURE_NOT_HONORED [mac:%pM]", + adapter->nud_tracking.gw_mac_addr.bytes); hdd_nud_stats_info(adapter); return false; } @@ -288,6 +295,7 @@ void hdd_nud_init_tracking(struct hdd_adapter *adapter) adapter->nud_tracking.curr_state = NUD_NONE; adapter->nud_tracking.ignore_nud_tracking = false; + adapter->nud_tracking.is_gw_updated = false; qdf_atomic_init(&adapter ->nud_tracking.tx_rx_stats.gw_rx_packets); @@ -352,6 +360,14 @@ static void hdd_nud_filter_netevent(struct neighbour *neigh) if (status) return; + if (adapter->nud_tracking.ignore_nud_tracking) { + hdd_debug("NUD Tracking is Disabled"); + return; + } + + if (!adapter->nud_tracking.is_gw_updated) + return; + if (adapter->device_mode != QDF_STA_MODE) return; @@ -363,11 +379,6 @@ static void hdd_nud_filter_netevent(struct neighbour *neigh) return; } - if (adapter->nud_tracking.ignore_nud_tracking) { - hdd_debug("NUD Tracking is Disabled"); - return; - } - if (!qdf_is_macaddr_equal(&adapter->nud_tracking.gw_mac_addr, (struct qdf_mac_addr *)&neigh->ha[0])) return; diff --git a/core/hdd/src/wlan_hdd_nud_tracking.h b/core/hdd/src/wlan_hdd_nud_tracking.h index d89de925c2ad..001e94d1c9b3 100644 --- a/core/hdd/src/wlan_hdd_nud_tracking.h +++ b/core/hdd/src/wlan_hdd_nud_tracking.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2018, 2019 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -55,6 +55,7 @@ struct hdd_nud_tx_rx_stats { * @nud_event_work: work to be scheduled during NUD_FAILED * @is_gw_rx_pkt_track_enabled: true if rx pkt capturing is enabled for GW, * else false + * @is_gw_updated: true if GW is updated for NUD Tracking */ struct hdd_nud_tracking_info { uint8_t curr_state; @@ -63,6 +64,7 @@ struct hdd_nud_tracking_info { struct qdf_mac_addr gw_mac_addr; qdf_work_t nud_event_work; bool is_gw_rx_pkt_track_enabled; + bool is_gw_updated; }; /**