summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2021-10-01 14:11:13 +0200
committerMaria Matejka <mq@ucw.cz>2021-11-09 19:20:41 +0100
commit6d87cf4be7536433d263609828414e687e1d4f08 (patch)
tree90b46886494c4a2ef43fba97789eaf8d9eefac0b
parent0767a0c288097dfaec45fe505c401407ecc5de55 (diff)
Kernel routes are flushed on shutdown by kernel scan, not by table scan
-rw-r--r--sysdep/unix/krt.c31
-rw-r--r--sysdep/unix/krt.h1
2 files changed, 15 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)
{
diff --git a/sysdep/unix/krt.h b/sysdep/unix/krt.h
index cd4bd07d..f6ad6fde 100644
--- a/sysdep/unix/krt.h
+++ b/sysdep/unix/krt.h
@@ -66,6 +66,7 @@ struct krt_proto {
byte ready; /* Initial feed has been finished */
byte initialized; /* First scan has been finished */
byte reload; /* Next scan is doing reload */
+ byte flush_routes; /* Scanning to flush */
};
extern pool *krt_pool;