mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-23 02:01:55 +00:00
Nest: Use 'old' route from export table
When export table is enabled for channel, then use routes from export table as 'old' for rt_notify() notifications.
This commit is contained in:
parent
ee147fc1a5
commit
623e41cc50
@ -329,7 +329,7 @@ int rte_update_in(struct channel *c, const net_addr *n, rte *new, struct rte_src
|
|||||||
int rt_reload_channel(struct channel *c);
|
int rt_reload_channel(struct channel *c);
|
||||||
void rt_reload_channel_abort(struct channel *c);
|
void rt_reload_channel_abort(struct channel *c);
|
||||||
void rt_prune_sync(rtable *t, int all);
|
void rt_prune_sync(rtable *t, int all);
|
||||||
int rte_update_out(struct channel *c, const net_addr *n, rte *new, rte *old0, int refeed);
|
int rte_update_out(struct channel *c, const net_addr *n, rte *new, rte *old0, rte **old_free, int refeed);
|
||||||
struct rtable_config *rt_new_table(struct symbol *s, uint addr_type);
|
struct rtable_config *rt_new_table(struct symbol *s, uint addr_type);
|
||||||
void cmd_show_table_stats(struct rtable_config *tab);
|
void cmd_show_table_stats(struct rtable_config *tab);
|
||||||
|
|
||||||
|
@ -565,6 +565,7 @@ do_rt_notify(struct channel *c, net *net, rte *new, rte *old, ea_list *tmpa, int
|
|||||||
{
|
{
|
||||||
struct proto *p = c->proto;
|
struct proto *p = c->proto;
|
||||||
struct proto_stats *stats = &c->stats;
|
struct proto_stats *stats = &c->stats;
|
||||||
|
rte *old_free = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First, apply export limit.
|
* First, apply export limit.
|
||||||
@ -611,9 +612,13 @@ do_rt_notify(struct channel *c, net *net, rte *new, rte *old, ea_list *tmpa, int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->out_table && !rte_update_out(c, net->n.addr, new, old, refeed))
|
if (c->out_table && !rte_update_out(c, net->n.addr, new, old, &old_free, refeed))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Use route from export_table as old */
|
||||||
|
if (old_free)
|
||||||
|
old = old_free;
|
||||||
|
|
||||||
if (new)
|
if (new)
|
||||||
stats->exp_updates_accepted++;
|
stats->exp_updates_accepted++;
|
||||||
else
|
else
|
||||||
@ -648,6 +653,9 @@ do_rt_notify(struct channel *c, net *net, rte *new, rte *old, ea_list *tmpa, int
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
p->rt_notify(p, c, net, new, old, new->attrs->eattrs);
|
p->rt_notify(p, c, net, new, old, new->attrs->eattrs);
|
||||||
|
|
||||||
|
if (old_free)
|
||||||
|
rte_free(old_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -2578,7 +2586,7 @@ rt_prune_sync(rtable *t, int all)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
rte_update_out(struct channel *c, const net_addr *n, rte *new, rte *old0, int refeed)
|
rte_update_out(struct channel *c, const net_addr *n, rte *new, rte *old0, rte **old_free, int refeed)
|
||||||
{
|
{
|
||||||
struct rtable *tab = c->out_table;
|
struct rtable *tab = c->out_table;
|
||||||
struct rte_src *src;
|
struct rte_src *src;
|
||||||
@ -2621,8 +2629,8 @@ rte_update_out(struct channel *c, const net_addr *n, rte *new, rte *old0, int re
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Remove the old rte */
|
/* Remove the old rte */
|
||||||
|
*old_free = old;
|
||||||
*pos = old->next;
|
*pos = old->next;
|
||||||
rte_free_quick(old);
|
|
||||||
tab->route_count--;
|
tab->route_count--;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user