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.
This commit is contained in:
Ondrej Zajicek 2009-03-20 12:58:21 +01:00
parent 48d79d521c
commit 3d574679b8

View file

@ -462,8 +462,12 @@ krt_flush_routes(struct krt_proto *p)
if (e) if (e)
{ {
rta *a = e->attrs; rta *a = e->attrs;
if (a->source != RTS_DEVICE && a->source != RTS_INHERIT) if ((n->n.flags & KRF_INSTALLED) &&
a->source != RTS_DEVICE && a->source != RTS_INHERIT)
{
krt_set_notify(p, e->net, NULL, e); krt_set_notify(p, e->net, NULL, e);
n->n.flags &= ~KRF_INSTALLED;
}
} }
} }
FIB_WALK_END; FIB_WALK_END;
@ -795,7 +799,8 @@ krt_shutdown(struct proto *P)
#endif #endif
tm_stop(p->scan_timer); 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_flush_routes(p);
krt_set_shutdown(p, last); krt_set_shutdown(p, last);