diff options
author | Maria Matejka <mq@ucw.cz> | 2021-10-01 14:11:13 +0200 |
---|---|---|
committer | Maria Matejka <mq@ucw.cz> | 2021-11-09 19:20:41 +0100 |
commit | 6d87cf4be7536433d263609828414e687e1d4f08 (patch) | |
tree | 90b46886494c4a2ef43fba97789eaf8d9eefac0b /sysdep/unix/krt.c | |
parent | 0767a0c288097dfaec45fe505c401407ecc5de55 (diff) |
Kernel routes are flushed on shutdown by kernel scan, not by table scan
Diffstat (limited to 'sysdep/unix/krt.c')
-rw-r--r-- | sysdep/unix/krt.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c index b98e7ec0..32bfe7fc 100644 --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@ -542,23 +542,6 @@ krt_is_installed(struct krt_proto *p, net *n) return n->routes && bmap_test(&p->p.main_channel->export_map, n->routes->rte.id); } -static void -krt_flush_routes(struct krt_proto *p) -{ - struct rtable *t = p->p.main_channel->table; - - KRT_TRACE(p, D_EVENTS, "Flushing kernel routes"); - FIB_WALK(&t->fib, net, n) - { - if (krt_is_installed(p, n)) - { - /* FIXME: this does not work if gw is changed in export filter */ - krt_replace_rte(p, n->n.addr, NULL, &n->routes->rte); - } - } - FIB_WALK_END; -} - static struct rte * krt_export_net(struct krt_proto *p, net *net) { @@ -637,6 +620,9 @@ krt_got_route(struct krt_proto *p, rte *e, s8 src) #endif /* The rest is for KRT_SRC_BIRD (or KRT_SRC_UNKNOWN) */ + /* Deleting all routes if flush is requested */ + if (p->flush_routes) + goto delete; /* We wait for the initial feed to have correct installed state */ if (!p->ready) @@ -729,6 +715,17 @@ krt_prune(struct krt_proto *p) p->initialized = 1; } +static void +krt_flush_routes(struct krt_proto *p) +{ + KRT_TRACE(p, D_EVENTS, "Flushing kernel routes"); + p->flush_routes = 1; + krt_init_scan(p); + krt_do_scan(p); + /* No prune! */ + p->flush_routes = 0; +} + void krt_got_route_async(struct krt_proto *p, rte *e, int new, s8 src) { |