mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 17:51:53 +00:00
Fixed route table attribute caching
This commit is contained in:
parent
2379ed40be
commit
25e20485ae
@ -1760,12 +1760,14 @@ rte_update(struct channel *c, const net_addr *n, rte *new, struct rte_src *src)
|
|||||||
|
|
||||||
ASSERT(c->channel_state == CS_UP);
|
ASSERT(c->channel_state == CS_UP);
|
||||||
|
|
||||||
|
ea_list *ea_tmp[2] = {};
|
||||||
|
|
||||||
/* The import reloader requires prefilter routes to be the first layer */
|
/* The import reloader requires prefilter routes to be the first layer */
|
||||||
if (new && (c->in_keep & RIK_PREFILTER))
|
if (new && (c->in_keep & RIK_PREFILTER))
|
||||||
if (ea_is_cached(new->attrs) && !new->attrs->next)
|
ea_tmp[0] = new->attrs =
|
||||||
new->attrs = ea_clone(new->attrs);
|
(ea_is_cached(new->attrs) && !new->attrs->next) ?
|
||||||
else
|
ea_clone(new->attrs) :
|
||||||
new->attrs = ea_lookup(new->attrs, 0);
|
ea_lookup(new->attrs, 0);
|
||||||
|
|
||||||
const struct filter *filter = c->in_filter;
|
const struct filter *filter = c->in_filter;
|
||||||
struct channel_import_stats *stats = &c->import_stats;
|
struct channel_import_stats *stats = &c->import_stats;
|
||||||
@ -1799,10 +1801,15 @@ rte_update(struct channel *c, const net_addr *n, rte *new, struct rte_src *src)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (new)
|
if (new)
|
||||||
|
{
|
||||||
|
ea_tmp[1] = new->attrs =
|
||||||
|
ea_is_cached(new->attrs) ? ea_clone(new->attrs) : ea_lookup(new->attrs, !!ea_tmp[0]);
|
||||||
|
|
||||||
if (net_is_flow(n))
|
if (net_is_flow(n))
|
||||||
rt_flowspec_resolve_rte(new, c);
|
rt_flowspec_resolve_rte(new, c);
|
||||||
else
|
else
|
||||||
rt_next_hop_resolve_rte(new);
|
rt_next_hop_resolve_rte(new);
|
||||||
|
}
|
||||||
|
|
||||||
if (new && !rte_validate(c, new))
|
if (new && !rte_validate(c, new))
|
||||||
{
|
{
|
||||||
@ -1823,17 +1830,10 @@ rte_update(struct channel *c, const net_addr *n, rte *new, struct rte_src *src)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Now the route attributes are kept by the in-table cached version
|
/* Now the route attributes are kept by the in-table cached version
|
||||||
* and we may drop the local handle */
|
* and we may drop the local handles */
|
||||||
if (new && (c->in_keep & RIK_PREFILTER))
|
for (uint k = 0; k < ARRAY_SIZE(ea_tmp); k++)
|
||||||
{
|
if (ea_tmp[k])
|
||||||
/* There may be some updates on top of the original attribute block */
|
ea_free(ea_tmp[k]);
|
||||||
ea_list *a = new->attrs;
|
|
||||||
while (a->next)
|
|
||||||
a = a->next;
|
|
||||||
|
|
||||||
ea_free(a);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user