From 3d574679b8cceb1362bb973e7dfe9981fc93b79b Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Fri, 20 Mar 2009 12:58:21 +0100 Subject: [PATCH] Fix bugs related to kernel table synchronization. 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 | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c index 816eb444..83456b0f 100644 --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@ -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);