Account when the next nd6_timer_to is scheduled in nd6_timer()
authorflorian <florian@openbsd.org>
Fri, 3 Aug 2018 09:11:56 +0000 (09:11 +0000)
committerflorian <florian@openbsd.org>
Fri, 3 Aug 2018 09:11:56 +0000 (09:11 +0000)
otherwise nd6_llinfo_settimer() might wrongly assume that a timeout is
already scheduled earlier and not schedule one itself. This in turn
lead to the neighbor cache no longer updating because neighbor
solicitations were not send.
Observed by many.
OK kn

sys/netinet6/nd6.c

index bce15ad..f11c067 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: nd6.c,v 1.225 2018/07/11 21:18:23 nayden Exp $        */
+/*     $OpenBSD: nd6.c,v 1.226 2018/08/03 09:11:56 florian Exp $       */
 /*     $KAME: nd6.c,v 1.280 2002/06/08 19:52:07 itojun Exp $   */
 
 /*
@@ -336,8 +336,10 @@ nd6_timer(void *arg)
        secs = expire - time_uptime;
        if (secs < 0)
                secs = 0;
-       if (!TAILQ_EMPTY(&nd6_list))
+       if (!TAILQ_EMPTY(&nd6_list)) {
+               nd6_timer_next = time_uptime + secs;
                timeout_add_sec(&nd6_timer_to, secs);
+       }
 
        NET_UNLOCK();
 }