0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-22 09:41:54 +00:00

Fixed bad filter re-evaluation with import table if filtered->accepted

The import table feed wasn't resetting the table-specific route values
like REF_FILTERED and thus made the route look like filtered even though
it should have been re-evaluated as accepted.
This commit is contained in:
Maria Matejka 2023-03-08 21:38:18 +01:00
parent aa5fc3b99d
commit 97d2875e99
4 changed files with 18 additions and 6 deletions

View File

@ -46,6 +46,16 @@ static inline int rte_is_valid(rte *r) { return r && !(r->flags & REF_FILTERED);
/* Route just has REF_FILTERED flag */
static inline int rte_is_filtered(rte *r) { return !!(r->flags & REF_FILTERED); }
/* Strip the route of the table-specific values */
static inline rte rte_init_from(const rte *r)
{
return (rte) {
.attrs = r->attrs,
.net = r->net,
.src = r->src,
};
}
struct rte_src {
struct rte_src *next; /* Hash chain */
struct rte_owner *owner; /* Route source owner */

View File

@ -657,7 +657,10 @@ channel_reload_stopped(struct rt_export_request *req)
/* Restart reload */
if (c->reload_pending)
{
c->reload_pending = 0;
channel_request_reload(c);
}
if (c->channel_state != CS_UP)
channel_check_stopped(c);

View File

@ -4406,8 +4406,10 @@ void channel_reload_export_bulk(struct rt_export_request *req, const net_addr *n
for (uint i=0; i<count; i++)
if (feed[i]->sender == c->in_req.hook)
{
/* Strip the table-specific information */
rte new = rte_init_from(feed[i]);
/* Strip the later attribute layers */
rte new = *feed[i];
while (new.attrs->next)
new.attrs = new.attrs->next;

View File

@ -62,12 +62,9 @@ pipe_rt_notify(struct proto *P, struct channel *src_ch, const net_addr *n, rte *
if (new)
{
rte e0 = {
.attrs = new->attrs,
.src = new->src,
.generation = new->generation + 1,
};
rte e0 = rte_init_from(new);
e0.generation = new->generation + 1;
ea_unset_attr(&e0.attrs, 0, &ea_gen_hostentry);
rte_update(dst, n, &e0, new->src);