diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 119b71d45380..eed21dee3aaa 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -3085,6 +3085,9 @@ hdd_association_completion_handler(struct hdd_adapter *adapter, if (!reqRsnIe) return QDF_STATUS_E_NOMEM; + if (roam_info->fReassocReq || ft_carrier_on) + hdd_nud_indicate_roam(adapter); + /* * For reassoc, the station is already registered, all we need * is to change the state of the STA in TL. @@ -3379,7 +3382,6 @@ hdd_association_completion_handler(struct hdd_adapter *adapter, eCSR_BSS_TYPE_INFRASTRUCTURE); } - hdd_nud_indicate_roam(adapter); /* Start the tx queues */ hdd_debug("Enabling queues"); hdd_netif_queue_enable(adapter); diff --git a/core/hdd/src/wlan_hdd_nud_tracking.c b/core/hdd/src/wlan_hdd_nud_tracking.c index c6ae5970245e..f93114b5795a 100644 --- a/core/hdd/src/wlan_hdd_nud_tracking.c +++ b/core/hdd/src/wlan_hdd_nud_tracking.c @@ -504,7 +504,20 @@ static void hdd_nud_filter_netevent(struct neighbour *neigh) case NUD_FAILED: hdd_debug("NUD_FAILED [0x%x]", neigh->nud_state); - hdd_nud_process_failure_event(adapter); + /* + * This condition is to handle the scenario where NUD_FAILED + * events are received without any NUD_PROBE/INCOMPLETE event + * post roaming. Nud state is set to NONE as part of roaming. + * NUD_FAILED is not honored when the curr state is any state + * other than NUD_PROBE/INCOMPLETE so post roaming, nud state + * is moved to NUD_PROBE to honor future NUD_FAILED events. + */ + if (adapter->nud_tracking.curr_state == NUD_NONE) { + hdd_nud_capture_stats(adapter, NUD_PROBE); + hdd_nud_set_tracking(adapter, NUD_PROBE, true); + } else { + hdd_nud_process_failure_event(adapter); + } break; default: hdd_debug("NUD Event For Other State [0x%x]",