From f48ef67985f99a2e6f4c9552f0e92ee80d94e2a0 Mon Sep 17 00:00:00 2001 From: Tamir Duberstein Date: Fri, 1 Apr 2022 10:16:50 -0700 Subject: [PATCH] Reduce timer churn in NUD PiperOrigin-RevId: 438852403 --- pkg/tcpip/stack/neighbor_entry.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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