mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2025-03-21 22:07:03 +00:00
fixup! Partial import reload looks working
This commit is contained in:
parent
f9e46a8e31
commit
06954bbabf
@ -506,6 +506,7 @@ trie_match_net4(const struct f_trie *t, ip4_addr px, uint plen)
|
|||||||
|
|
||||||
while (n)
|
while (n)
|
||||||
{
|
{
|
||||||
|
log("ip4 filtering %x %x net %x", n->addr, n->accept, px);
|
||||||
/* We are out of path */
|
/* We are out of path */
|
||||||
if (!ip4_prefix_equal(px, n->addr, MIN(plen, n->plen)))
|
if (!ip4_prefix_equal(px, n->addr, MIN(plen, n->plen)))
|
||||||
return 0;
|
return 0;
|
||||||
|
38
nest/proto.c
38
nest/proto.c
@ -60,6 +60,8 @@ static void channel_refeed_stopped(struct rt_export_request *req);
|
|||||||
static void channel_check_stopped(struct channel *c);
|
static void channel_check_stopped(struct channel *c);
|
||||||
static void channel_reload_in_done(struct channel_import_request *cir);
|
static void channel_reload_in_done(struct channel_import_request *cir);
|
||||||
static void channel_request_partial_reload(struct channel *c, struct channel_import_request *cir);
|
static void channel_request_partial_reload(struct channel *c, struct channel_import_request *cir);
|
||||||
|
void print_trie_node(const struct f_trie_node4 *t, int i);
|
||||||
|
|
||||||
|
|
||||||
static inline int proto_is_done(struct proto *p)
|
static inline int proto_is_done(struct proto *p)
|
||||||
{ return (p->proto_state == PS_DOWN) && proto_is_inactive(p); }
|
{ return (p->proto_state == PS_DOWN) && proto_is_inactive(p); }
|
||||||
@ -350,6 +352,12 @@ struct roa_subscription {
|
|||||||
struct f_trie *trie;
|
struct f_trie *trie;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
channel_roa_in_reload_done(struct channel_import_request *req)
|
||||||
|
{
|
||||||
|
rfree(req->trie->lp);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
channel_roa_in_changed(struct settle *se)
|
channel_roa_in_changed(struct settle *se)
|
||||||
{
|
{
|
||||||
@ -357,13 +365,14 @@ channel_roa_in_changed(struct settle *se)
|
|||||||
struct channel *c = s->c;
|
struct channel *c = s->c;
|
||||||
|
|
||||||
CD(c, "Reload triggered by RPKI change");
|
CD(c, "Reload triggered by RPKI change");
|
||||||
|
|
||||||
struct channel_import_request *cir = lp_alloc(s->trie->lp, sizeof *cir);
|
struct channel_import_request *cir = lp_alloc(s->trie->lp, sizeof *cir);
|
||||||
*cir = (struct channel_import_request) {
|
*cir = (struct channel_import_request) {
|
||||||
.trie = s->trie,
|
.trie = s->trie,
|
||||||
|
.done = channel_roa_in_reload_done,
|
||||||
};
|
};
|
||||||
if (s->trie)
|
|
||||||
cir->done = channel_reload_in_done;
|
s->trie = f_new_trie(lp_new(c->proto->pool), 0);
|
||||||
|
|
||||||
|
|
||||||
channel_request_partial_reload(c, cir);
|
channel_request_partial_reload(c, cir);
|
||||||
}
|
}
|
||||||
@ -401,7 +410,8 @@ static void
|
|||||||
channel_export_one_roa(struct rt_export_request *req, const net_addr *net, struct rt_pending_export *first)
|
channel_export_one_roa(struct rt_export_request *req, const net_addr *net, struct rt_pending_export *first)
|
||||||
{
|
{
|
||||||
struct roa_subscription *s = SKIP_BACK(struct roa_subscription, req, req);
|
struct roa_subscription *s = SKIP_BACK(struct roa_subscription, req, req);
|
||||||
|
print_trie_node(&s->trie->root.v4, 10);
|
||||||
|
log("adding %N to %x",net, s->trie );
|
||||||
switch (net->type)
|
switch (net->type)
|
||||||
{
|
{
|
||||||
case NET_ROA4:
|
case NET_ROA4:
|
||||||
@ -413,7 +423,6 @@ channel_export_one_roa(struct rt_export_request *req, const net_addr *net, struc
|
|||||||
default:
|
default:
|
||||||
bug("ROA table sent us a non-roa export");
|
bug("ROA table sent us a non-roa export");
|
||||||
}
|
}
|
||||||
|
|
||||||
settle_kick(&s->settle, s->c->proto->loop);
|
settle_kick(&s->settle, s->c->proto->loop);
|
||||||
|
|
||||||
rpe_mark_seen_all(req->hook, first, NULL, NULL);
|
rpe_mark_seen_all(req->hook, first, NULL, NULL);
|
||||||
@ -425,7 +434,6 @@ channel_dump_roa_req(struct rt_export_request *req)
|
|||||||
struct roa_subscription *s = SKIP_BACK(struct roa_subscription, req, req);
|
struct roa_subscription *s = SKIP_BACK(struct roa_subscription, req, req);
|
||||||
struct channel *c = s->c;
|
struct channel *c = s->c;
|
||||||
struct rtable_private *tab = SKIP_BACK(struct rtable_private, exporter.e, req->hook->table);
|
struct rtable_private *tab = SKIP_BACK(struct rtable_private, exporter.e, req->hook->table);
|
||||||
|
|
||||||
debug(" Channel %s.%s ROA %s change notifier from table %s request %p\n",
|
debug(" Channel %s.%s ROA %s change notifier from table %s request %p\n",
|
||||||
c->proto->name, c->name,
|
c->proto->name, c->name,
|
||||||
(s->settle.hook == channel_roa_in_changed) ? "import" : "export",
|
(s->settle.hook == channel_roa_in_changed) ? "import" : "export",
|
||||||
@ -437,7 +445,6 @@ channel_roa_is_subscribed(struct channel *c, rtable *tab, int dir)
|
|||||||
{
|
{
|
||||||
void (*hook)(struct settle *) =
|
void (*hook)(struct settle *) =
|
||||||
dir ? channel_roa_in_changed : channel_roa_out_changed;
|
dir ? channel_roa_in_changed : channel_roa_out_changed;
|
||||||
|
|
||||||
struct roa_subscription *s;
|
struct roa_subscription *s;
|
||||||
node *n;
|
node *n;
|
||||||
|
|
||||||
@ -456,7 +463,6 @@ channel_roa_subscribe(struct channel *c, rtable *tab, int dir)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
struct roa_subscription *s = mb_allocz(c->proto->pool, sizeof(struct roa_subscription));
|
struct roa_subscription *s = mb_allocz(c->proto->pool, sizeof(struct roa_subscription));
|
||||||
|
|
||||||
*s = (struct roa_subscription) {
|
*s = (struct roa_subscription) {
|
||||||
.settle = SETTLE_INIT(&c->roa_settle, dir ? channel_roa_in_changed : channel_roa_out_changed, NULL),
|
.settle = SETTLE_INIT(&c->roa_settle, dir ? channel_roa_in_changed : channel_roa_out_changed, NULL),
|
||||||
.c = c,
|
.c = c,
|
||||||
@ -471,7 +477,6 @@ channel_roa_subscribe(struct channel *c, rtable *tab, int dir)
|
|||||||
.export_one = channel_export_one_roa,
|
.export_one = channel_export_one_roa,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
add_tail(&c->roa_subscriptions, &s->roa_node);
|
add_tail(&c->roa_subscriptions, &s->roa_node);
|
||||||
rt_request_export(tab, &s->req);
|
rt_request_export(tab, &s->req);
|
||||||
}
|
}
|
||||||
@ -764,13 +769,20 @@ channel_refeed_prefilter(const struct rt_prefilter *p, const net_addr *n)
|
|||||||
for (struct channel_feeding_request *cfr = c->refeeding; cfr; cfr = cfr->next)
|
for (struct channel_feeding_request *cfr = c->refeeding; cfr; cfr = cfr->next)
|
||||||
if (!cfr->trie || trie_match_net(cfr->trie, n))
|
if (!cfr->trie || trie_match_net(cfr->trie, n))
|
||||||
{
|
{
|
||||||
log(L_TRACE "Export this one");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
log(L_TRACE "%N filtered out of export", n);
|
log(L_TRACE "%N filtered out of export", n);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void print_trie_node(const struct f_trie_node4 *t, int i){
|
||||||
|
log("%i:addr %x, acc %x, mask %x",i, t->addr, t->accept, t->mask);
|
||||||
|
i++;
|
||||||
|
for (int j = 0; j < 1 << TRIE_STEP; j++)
|
||||||
|
if (t->c[j])
|
||||||
|
print_trie_node(t->c[j], i);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
channel_import_prefilter(const struct rt_prefilter *p, const net_addr *n)
|
channel_import_prefilter(const struct rt_prefilter *p, const net_addr *n)
|
||||||
{
|
{
|
||||||
@ -782,9 +794,13 @@ channel_import_prefilter(const struct rt_prefilter *p, const net_addr *n)
|
|||||||
for (struct channel_import_request *cir = c->importing; cir; cir = cir->next)
|
for (struct channel_import_request *cir = c->importing; cir; cir = cir->next)
|
||||||
{
|
{
|
||||||
if (!cir->trie || trie_match_net(cir->trie, n))
|
if (!cir->trie || trie_match_net(cir->trie, n))
|
||||||
|
{
|
||||||
|
/*print_trie_node(&cir->trie->root.v4, 0);*/
|
||||||
|
log(L_TRACE "%N passed to import", n);
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
log(L_TRACE "%N filtered out of import", n);
|
log(L_TRACE "%N filtered out of import trie", n);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1251,6 +1251,7 @@ rpe_next(struct rt_pending_export *rpe, struct rte_src *src)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct rt_pending_export * rt_next_export_fast(struct rt_pending_export *last);
|
static struct rt_pending_export * rt_next_export_fast(struct rt_pending_export *last);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
rte_export(struct rt_table_export_hook *th, struct rt_pending_export *rpe)
|
rte_export(struct rt_table_export_hook *th, struct rt_pending_export *rpe)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user