]> git.puffer.fish Git - matthieu/frr.git/commitdiff
vrrpd: fix broken reads when reinitializing
authorQuentin Young <qlyoung@cumulusnetworks.com>
Tue, 5 Mar 2019 20:33:27 +0000 (20:33 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Fri, 17 May 2019 00:27:08 +0000 (00:27 +0000)
When a VRRP router was shut down - either due to an administrative
event, or its interface getting deleted, or some other reason - it was
forgetting to cancel its read task. When it was started again, the read
task was still around, and so it wasn't getting scheduled again with the
new socket fd's. This caused our socket to queue ingress packets but
never read them, resulting in the restarted router always electing
itself to Master (since it wasn't listening to any other advertisements,
even though the kernel was delivering them).

The t_write cancellation call doesn't matter here, but I'm putting it in
there because it doesn't hurt and this way I won't forget about it if it
becomes necessary in the future.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
vrrpd/vrrp.c

index 524619dfadf9c93689a55674e92c7a251b1cd422..d4a6dfc95afad5ca7b47d57d19169e0b12026518 100644 (file)
@@ -1534,6 +1534,8 @@ static int vrrp_shutdown(struct vrrp_router *r)
        /* Cancel all timers */
        THREAD_OFF(r->t_adver_timer);
        THREAD_OFF(r->t_master_down_timer);
+       THREAD_OFF(r->t_read);
+       THREAD_OFF(r->t_write);
 
        if (r->sock_rx > 0) {
                close(r->sock_rx);