0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-11-14 07:08:42 +00:00

Kernel routes are flushed on shutdown by kernel scan, not by table scan

This commit is contained in:
Maria Matejka 2021-10-01 14:11:13 +02:00
parent 0767a0c288
commit 6d87cf4be7
2 changed files with 15 additions and 17 deletions

View File

@ -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); 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 * static struct rte *
krt_export_net(struct krt_proto *p, net *net) 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 #endif
/* The rest is for KRT_SRC_BIRD (or KRT_SRC_UNKNOWN) */ /* 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 */ /* We wait for the initial feed to have correct installed state */
if (!p->ready) if (!p->ready)
@ -729,6 +715,17 @@ krt_prune(struct krt_proto *p)
p->initialized = 1; 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 void
krt_got_route_async(struct krt_proto *p, rte *e, int new, s8 src) krt_got_route_async(struct krt_proto *p, rte *e, int new, s8 src)
{ {

View File

@ -66,6 +66,7 @@ struct krt_proto {
byte ready; /* Initial feed has been finished */ byte ready; /* Initial feed has been finished */
byte initialized; /* First scan has been finished */ byte initialized; /* First scan has been finished */
byte reload; /* Next scan is doing reload */ byte reload; /* Next scan is doing reload */
byte flush_routes; /* Scanning to flush */
}; };
extern pool *krt_pool; extern pool *krt_pool;