]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fix bugs related to kernel table synchronization.
authorOndrej Zajicek <santiago@crfreenet.org>
Fri, 20 Mar 2009 11:58:21 +0000 (12:58 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Fri, 20 Mar 2009 11:58:21 +0000 (12:58 +0100)
KRF_INSTALLED flag was not cleared during reconfiguration
that lead to not removing routes during reconfigure when
export rules changed.

We also should not try to remove routes we didi not installed,
on Linux this leads to warnings (as kernel checks route source
field and do not allow to remove non-bird routes) but we should
not rely on it.

sysdep/unix/krt.c

index 816eb44482c641db12a5e7ac9e3518c734b05126..83456b0f09ca5b5368f5043b22c9cb026972c84f 100644 (file)
@@ -462,8 +462,12 @@ krt_flush_routes(struct krt_proto *p)
       if (e)
        {
          rta *a = e->attrs;
-         if (a->source != RTS_DEVICE && a->source != RTS_INHERIT)
-           krt_set_notify(p, e->net, NULL, e);
+         if ((n->n.flags & KRF_INSTALLED) &&
+             a->source != RTS_DEVICE && a->source != RTS_INHERIT)
+           {
+             krt_set_notify(p, e->net, NULL, e);
+             n->n.flags &= ~KRF_INSTALLED;
+           }
        }
     }
   FIB_WALK_END;
@@ -795,7 +799,8 @@ krt_shutdown(struct proto *P)
 #endif
     tm_stop(p->scan_timer);
 
-  if (!KRT_CF->persist)
+  /* FIXME we should flush routes even when persist during reconfiguration */
+  if (p->initialized && !KRT_CF->persist)
     krt_flush_routes(p);
 
   krt_set_shutdown(p, last);