diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2015-05-17 00:54:33 +0200 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2015-05-17 00:56:34 +0200 |
commit | d0e23d42de133de706151411d8d4091d07904d29 (patch) | |
tree | 3191d81ac887797f359e2577b1d22c7b9397a571 /nest | |
parent | 86f567e13c2202fc3c3a1ce49f9a35220a50f117 (diff) |
Simplify flushing process
Related to changes from previous patch.
Diffstat (limited to 'nest')
-rw-r--r-- | nest/rt-table.c | 35 |
1 files changed, 4 insertions, 31 deletions
diff --git a/nest/rt-table.c b/nest/rt-table.c index a8fe137c..24517e2c 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -1384,9 +1384,8 @@ rt_init(void) static int -rt_prune_step(rtable *tab, int step, int *limit) +rt_prune_step(rtable *tab, int *limit) { - static struct tbf rl_flush = TBF_DEFAULT_LOG_LIMITS; struct fib_iterator *fit = &tab->prune_fit; DBG("Pruning route table %s\n", tab->name); @@ -1411,9 +1410,7 @@ again: rescan: for (e=n->routes; e; e=e->next) - if (e->sender->proto->flushing || - (e->flags & REF_DISCARD) || - (step && e->attrs->src->proto->flushing)) + if (e->sender->proto->flushing || (e->flags & REF_DISCARD)) { if (*limit <= 0) { @@ -1421,10 +1418,6 @@ again: return 0; } - if (step) - log_rl(&rl_flush, L_WARN "Route %I/%d from %s still in %s after flush", - n->n.prefix, n->n.pxlen, e->attrs->src->proto->name, tab->name); - rte_discard(tab, e); (*limit)--; @@ -1464,7 +1457,7 @@ static inline int rt_prune_table(rtable *tab) { int limit = 512; - return rt_prune_step(tab, 0, &limit); + return rt_prune_step(tab, &limit); } /** @@ -1473,37 +1466,17 @@ rt_prune_table(rtable *tab) * The prune loop scans routing tables and removes routes belonging to flushing * protocols, discarded routes and also stale network entries. Returns 1 when * all such routes are pruned. It is a part of the protocol flushing loop. - * - * The prune loop runs in two steps. In the first step it prunes just the routes - * with flushing senders (in explicitly marked tables) so the route removal is - * propagated as usual. In the second step, all remaining relevant routes are - * removed. Ideally, there shouldn't be any, but it happens when pipe filters - * are changed. */ int rt_prune_loop(void) { - static int step = 0; int limit = 512; rtable *t; - again: WALK_LIST(t, routing_tables) - if (! rt_prune_step(t, step, &limit)) + if (! rt_prune_step(t, &limit)) return 0; - if (step == 0) - { - /* Prepare for the second step */ - WALK_LIST(t, routing_tables) - t->prune_state = RPS_SCHEDULED; - - step = 1; - goto again; - } - - /* Done */ - step = 0; return 1; } |