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

ROA aggregator uses its own rte source instead of recycling

This commit is contained in:
Maria Matejka 2024-06-25 11:19:14 +02:00
parent 6f981969bb
commit 3d45539455
3 changed files with 35 additions and 18 deletions

View File

@ -2206,18 +2206,13 @@ channel_reset_limit(struct channel *c, struct limit *l, int dir)
c->limit_active &= ~(1 << dir); c->limit_active &= ~(1 << dir);
} }
static struct rte_owner_class default_rte_owner_class;
static inline void static inline void
proto_do_start(struct proto *p) proto_do_start(struct proto *p)
{ {
p->active = 1; p->active = 1;
rt_init_sources(&p->sources, p->name, proto_event_list(p));
if (!p->sources.class)
p->sources.class = &default_rte_owner_class;
p->sources.debug = p->debug; p->sources.debug = p->debug;
rt_init_sources(&p->sources, p->name, proto_event_list(p));
if (!p->cf->late_if_feed) if (!p->cf->late_if_feed)
iface_subscribe(&p->iface_sub); iface_subscribe(&p->iface_sub);

View File

@ -401,6 +401,8 @@ rt_dump_sources(struct rte_owner *o)
debug("\n"); debug("\n");
} }
static struct rte_owner_class default_rte_owner_class;
void void
rt_init_sources(struct rte_owner *o, const char *name, event_list *list) rt_init_sources(struct rte_owner *o, const char *name, event_list *list)
{ {
@ -412,6 +414,8 @@ rt_init_sources(struct rte_owner *o, const char *name, event_list *list)
o->prune = ev_new_init(rta_pool, rt_prune_sources, o); o->prune = ev_new_init(rta_pool, rt_prune_sources, o);
o->stop = NULL; o->stop = NULL;
o->list = list; o->list = list;
if (!o->class)
o->class = &default_rte_owner_class;
RTA_UNLOCK; RTA_UNLOCK;
if (o->debug & D_EVENTS) if (o->debug & D_EVENTS)
log(L_TRACE "%s: initialized rte_src owner", o->name); log(L_TRACE "%s: initialized rte_src owner", o->name);

View File

@ -413,6 +413,8 @@ net_route(struct rtable_reading *tr, const net_addr *n)
struct rt_roa_aggregator { struct rt_roa_aggregator {
struct rt_stream stream; struct rt_stream stream;
struct rte_owner sources;
struct rte_src *main_source;
struct rt_export_request src; struct rt_export_request src;
event event; event event;
}; };
@ -479,8 +481,8 @@ rt_aggregate_roa(void *_rag)
RT_EXPORT_WALK(&rag->src, u) TMP_SAVED RT_EXPORT_WALK(&rag->src, u) TMP_SAVED
{ {
_Bool withdraw = 0;
const net_addr *nroa = NULL; const net_addr *nroa = NULL;
struct rte_src *src = NULL;
switch (u->kind) switch (u->kind)
{ {
case RT_EXPORT_STOP: case RT_EXPORT_STOP:
@ -489,12 +491,12 @@ rt_aggregate_roa(void *_rag)
case RT_EXPORT_FEED: case RT_EXPORT_FEED:
nroa = u->feed->ni->addr; nroa = u->feed->ni->addr;
src = (u->feed->count_routes > 0) ? u->feed->block[0].src : NULL; withdraw = (u->feed->count_routes == 0);
break; break;
case RT_EXPORT_UPDATE: case RT_EXPORT_UPDATE:
nroa = u->update->new ? u->update->new->net : u->update->old->net; nroa = u->update->new ? u->update->new->net : u->update->old->net;
src = u->update->new ? u->update->new->src : NULL; withdraw = !u->update->new;
break; break;
} }
@ -541,22 +543,22 @@ rt_aggregate_roa(void *_rag)
if ((rad->u[p].asn == asn) && (rad->u[p].max_pxlen)) if ((rad->u[p].asn == asn) && (rad->u[p].max_pxlen))
/* Found */ /* Found */
if (src) if (withdraw)
continue;
else
memcpy(&rad_new->u[p], &rad->u[p+1], (--count - p) * sizeof rad->u[p]); memcpy(&rad_new->u[p], &rad->u[p+1], (--count - p) * sizeof rad->u[p]);
else
continue;
else else
/* Not found */ /* Not found */
if (src) if (withdraw)
continue;
else
{ {
rad_new->u[p].asn = asn; rad_new->u[p].asn = asn;
rad_new->u[p].max_pxlen = max_pxlen; rad_new->u[p].max_pxlen = max_pxlen;
memcpy(&rad_new->u[p+1], &rad->u[p], (count++ - p) * sizeof rad->u[p]); memcpy(&rad_new->u[p+1], &rad->u[p], (count++ - p) * sizeof rad->u[p]);
} }
else
continue;
} }
else if (src) else if (!withdraw)
{ {
count = 1; count = 1;
rad_new = tmp_alloc(sizeof *rad_new + sizeof rad_new->u[0]); rad_new = tmp_alloc(sizeof *rad_new + sizeof rad_new->u[0]);
@ -569,12 +571,12 @@ rt_aggregate_roa(void *_rag)
rad_new->ad.length = (byte *) &rad_new->u[count] - rad_new->ad.data; rad_new->ad.length = (byte *) &rad_new->u[count] - rad_new->ad.data;
rte r = { rte r = {
.src = src ?: prev.src, .src = rag->main_source,
}; };
ea_set_attr(&r.attrs, EA_LITERAL_DIRECT_ADATA(&ea_roa_aggregated, 0, &rad_new->ad)); ea_set_attr(&r.attrs, EA_LITERAL_DIRECT_ADATA(&ea_roa_aggregated, 0, &rad_new->ad));
rte_import(&rag->stream.dst, &nip.n, &r, prev.src ?: src); rte_import(&rag->stream.dst, &nip.n, &r, rag->main_source);
#if 0 #if 0
/* Do not split ROA aggregator, we want this to be finished asap */ /* Do not split ROA aggregator, we want this to be finished asap */
@ -620,6 +622,9 @@ rt_setup_roa_aggregator(rtable *t)
}, },
}; };
rt_init_sources(&rag->sources, ragname, birdloop_event_list(t->loop));
rag->main_source = rt_get_source_o(&rag->sources, 0);
tab->master = &rag->stream; tab->master = &rag->stream;
} }
@ -627,13 +632,26 @@ rt_setup_roa_aggregator(rtable *t)
rt_export_subscribe(src, best, &rag->src); rt_export_subscribe(src, best, &rag->src);
} }
static void
rt_roa_aggregator_sources_gone(void *t)
{
rt_unlock_table((rtable *) t);
}
static void static void
rt_stop_roa_aggregator(rtable *t) rt_stop_roa_aggregator(rtable *t)
{ {
struct rt_roa_aggregator *rag; struct rt_roa_aggregator *rag;
RT_LOCKED(t, tab) RT_LOCKED(t, tab)
{
rag = SKIP_BACK(struct rt_roa_aggregator, stream, tab->master); rag = SKIP_BACK(struct rt_roa_aggregator, stream, tab->master);
rt_lock_table(tab);
rt_destroy_sources(&rag->sources, ev_new_init(tab->rp,
rt_roa_aggregator_sources_gone, tab));
rt_unlock_source(rag->main_source);
}
/* Stopping both import and export. /* Stopping both import and export.
* All memory will be freed with table shutdown, * All memory will be freed with table shutdown,
* no need to do anything from import done callback */ * no need to do anything from import done callback */