diff --git a/pkg/tcpip/stack/neighbor_entry.go b/pkg/tcpip/stack/neighbor_entry.go index 0a59eecdd..b8ceeebf2 100644 --- a/pkg/tcpip/stack/neighbor_entry.go +++ b/pkg/tcpip/stack/neighbor_entry.go @@ -592,13 +592,13 @@ func (e *neighborEntry) handleConfirmationLocked(linkAddr tcpip.LinkAddress, fla // Precondition: e.mu MUST be locked. func (e *neighborEntry) handleUpperLevelConfirmationLocked() { switch e.mu.neigh.State { - case Reachable, Stale, Delay, Probe: - wasReachable := e.mu.neigh.State == Reachable - // Set state to Reachable again to refresh timers. + case Stale, Delay, Probe: e.setStateLocked(Reachable) - if !wasReachable { - e.dispatchChangeEventLocked() - } + e.dispatchChangeEventLocked() + + case Reachable: + // Avoid setStateLocked; Timer.Reset is cheaper. + e.mu.timer.timer.Reset(e.nudState.ReachableTime()) case Unknown, Incomplete, Unreachable, Static: // Do nothing