Fixes route tracing w.r.t. kept filtered routes.
This commit is contained in:
parent
cf3a704b6a
commit
7057752924
1 changed files with 27 additions and 22 deletions
|
@ -627,6 +627,8 @@ rte_same(rte *x, rte *y)
|
||||||
(!x->attrs->proto->rte_same || x->attrs->proto->rte_same(x, y));
|
(!x->attrs->proto->rte_same || x->attrs->proto->rte_same(x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int rte_is_ok(rte *e) { return e && !rte_is_filtered(e); }
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rte_recalculate(struct announce_hook *ah, net *net, rte *new, ea_list *tmpa, struct proto *src)
|
rte_recalculate(struct announce_hook *ah, net *net, rte *new, ea_list *tmpa, struct proto *src)
|
||||||
{
|
{
|
||||||
|
@ -715,10 +717,15 @@ rte_recalculate(struct announce_hook *ah, net *net, rte *new, ea_list *tmpa, str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new && !rte_is_filtered(new))
|
int new_ok = rte_is_ok(new);
|
||||||
|
int old_ok = rte_is_ok(old);
|
||||||
|
|
||||||
|
if (new_ok)
|
||||||
stats->imp_updates_accepted++;
|
stats->imp_updates_accepted++;
|
||||||
else
|
else if (old_ok)
|
||||||
stats->imp_withdraws_accepted++;
|
stats->imp_withdraws_accepted++;
|
||||||
|
else
|
||||||
|
stats->imp_withdraws_ignored++;
|
||||||
|
|
||||||
if (new)
|
if (new)
|
||||||
rte_is_filtered(new) ? stats->filt_routes++ : stats->imp_routes++;
|
rte_is_filtered(new) ? stats->filt_routes++ : stats->imp_routes++;
|
||||||
|
@ -808,17 +815,19 @@ rte_recalculate(struct announce_hook *ah, net *net, rte *new, ea_list *tmpa, str
|
||||||
new->lastmod = now;
|
new->lastmod = now;
|
||||||
|
|
||||||
/* Log the route change */
|
/* Log the route change */
|
||||||
if (new)
|
if (p->debug & D_ROUTES)
|
||||||
rte_trace_in(D_ROUTES, p, new, net->routes == new ? "added [best]" : "added");
|
{
|
||||||
|
if (new_ok)
|
||||||
if (!new && (p->debug & D_ROUTES))
|
rte_trace(p, new, '>', new == net->routes ? "added [best]" : "added");
|
||||||
|
else if (old_ok)
|
||||||
{
|
{
|
||||||
if (old != old_best)
|
if (old != old_best)
|
||||||
rte_trace_in(D_ROUTES, p, old, "removed");
|
rte_trace(p, old, '>', "removed");
|
||||||
else if (net->routes)
|
else if (rte_is_ok(net->routes))
|
||||||
rte_trace_in(D_ROUTES, p, old, "removed [replaced]");
|
rte_trace(p, old, '>', "removed [replaced]");
|
||||||
else
|
else
|
||||||
rte_trace_in(D_ROUTES, p, old, "removed [sole]");
|
rte_trace(p, old, '>', "removed [sole]");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Propagate the route change */
|
/* Propagate the route change */
|
||||||
|
@ -833,17 +842,13 @@ rte_recalculate(struct announce_hook *ah, net *net, rte *new, ea_list *tmpa, str
|
||||||
(table->gc_time + table->config->gc_min_time <= now))
|
(table->gc_time + table->config->gc_min_time <= now))
|
||||||
rt_schedule_gc(table);
|
rt_schedule_gc(table);
|
||||||
|
|
||||||
if (old)
|
if (old_ok && p->rte_remove)
|
||||||
{
|
|
||||||
if (p->rte_remove)
|
|
||||||
p->rte_remove(net, old);
|
p->rte_remove(net, old);
|
||||||
rte_free_quick(old);
|
if (new_ok && p->rte_insert)
|
||||||
}
|
|
||||||
if (new)
|
|
||||||
{
|
|
||||||
if (p->rte_insert)
|
|
||||||
p->rte_insert(net, new);
|
p->rte_insert(net, new);
|
||||||
}
|
|
||||||
|
if (old)
|
||||||
|
rte_free_quick(old);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rte_update_nest_cnt; /* Nesting counter to allow recursive updates */
|
static int rte_update_nest_cnt; /* Nesting counter to allow recursive updates */
|
||||||
|
|
Loading…
Reference in a new issue