From: Maria Matejka Date: Mon, 11 Jul 2022 08:41:17 +0000 (+0200) Subject: Merge commit 'beb5f78a' into backport X-Git-Tag: v2.0.11~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d429bc5c841a8e9d4c81786973edfa56d20a407e;p=thirdparty%2Fbird.git Merge commit 'beb5f78a' into backport --- d429bc5c841a8e9d4c81786973edfa56d20a407e diff --cc nest/protocol.h index d0810a8fc,3b3812a51..29d759ea3 --- a/nest/protocol.h +++ b/nest/protocol.h @@@ -213,7 -215,9 +213,7 @@@ struct proto void (*ifa_notify)(struct proto *, unsigned flags, struct ifa *a); void (*rt_notify)(struct proto *, struct channel *, struct network *net, struct rte *new, struct rte *old); void (*neigh_notify)(struct neighbor *neigh); - int (*preexport)(struct proto *, struct rte *rt); - void (*make_tmp_attrs)(struct rte *rt, struct linpool *pool); - void (*store_tmp_attrs)(struct rte *rt, struct linpool *pool); - int (*preexport)(struct channel *, struct rte **rt, struct linpool *pool); ++ int (*preexport)(struct channel *, struct rte *rt); void (*reload_routes)(struct channel *); void (*feed_begin)(struct channel *, int initial); void (*feed_end)(struct channel *); diff --cc nest/route.h index 6641a8d72,1dacd92fa..a4f19fc49 --- a/nest/route.h +++ b/nest/route.h @@@ -317,10 -354,10 +317,10 @@@ net *net_get(rtable *tab, const net_add net *net_route(rtable *tab, const net_addr *n); int net_roa_check(rtable *tab, const net_addr *n, u32 asn); rte *rte_find(net *net, struct rte_src *src); -rte *rte_get_temp(struct rta *); +rte *rte_get_temp(struct rta *, struct rte_src *src); void rte_update2(struct channel *c, const net_addr *n, rte *new, struct rte_src *src); /* rte_update() moved to protocol.h to avoid dependency conflicts */ - int rt_examine(rtable *t, net_addr *a, struct proto *p, const struct filter *filter); + int rt_examine(rtable *t, net_addr *a, struct channel *c, const struct filter *filter); rte *rt_export_merged(struct channel *c, net *net, rte **rt_free, linpool *pool, int silent); void rt_refresh_begin(rtable *t, struct channel *c); void rt_refresh_end(rtable *t, struct channel *c); diff --cc nest/rt-show.c index 198779665,7639e5f72..183d023c9 --- a/nest/rt-show.c +++ b/nest/rt-show.c @@@ -153,7 -154,7 +153,7 @@@ rt_show_net(struct cli *c, net *n, stru else if (d->export_mode) { struct proto *ep = ec->proto; - int ic = ep->preexport ? ep->preexport(ep, e) : 0; - int ic = ep->preexport ? ep->preexport(ec, &e, c->show_pool) : 0; ++ int ic = ep->preexport ? ep->preexport(ec, e) : 0; if (ec->ra_mode == RA_OPTIMAL || ec->ra_mode == RA_MERGED) pass = 1; diff --cc nest/rt-table.c index 19bed165c,a2fa5e770..97bbc4f0c --- a/nest/rt-table.c +++ b/nest/rt-table.c @@@ -725,7 -870,7 +725,7 @@@ export_filter_(struct channel *c, rte * rt = rt0; *rt_free = NULL; - v = p->preexport ? p->preexport(p, rt) : 0; - v = p->preexport ? p->preexport(c, &rt, pool) : 0; ++ v = p->preexport ? p->preexport(c, rt) : 0; if (v < 0) { if (silent) @@@ -1694,9 -1895,12 +1695,9 @@@ rt_examine(rtable *t, net_addr *a, stru rte_update_lock(); /* Rest is stripped down export_filter() */ - int v = p->preexport ? p->preexport(p, rt) : 0; - int v = p->preexport ? p->preexport(c, &rt, rte_update_pool) : 0; ++ int v = p->preexport ? p->preexport(c, rt) : 0; if (v == RIC_PROCESS) - { - rte_make_tmp_attrs(&rt, rte_update_pool, NULL); v = (f_run(filter, &rt, rte_update_pool, FF_SILENT) <= F_ACCEPT); - } /* Discard temporary rte */ if (rt != n->routes) diff --cc proto/babel/babel.c index d9ebfbad1,0d0304f9b..7ea1aba89 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@@ -2256,11 -2230,12 +2256,11 @@@ babel_kick_timer(struct babel_proto *p static int - babel_preexport(struct proto *P, struct rte *new) -babel_preexport(struct channel *C, struct rte **new, struct linpool *pool UNUSED) ++babel_preexport(struct channel *C, struct rte *new) { - struct rta *a = (*new)->attrs; - + struct rta *a = new->attrs; /* Reject our own unreachable routes */ - if ((a->dest == RTD_UNREACHABLE) && (new->src->proto == P)) - if ((a->dest == RTD_UNREACHABLE) && (a->src->proto == C->proto)) ++ if ((a->dest == RTD_UNREACHABLE) && (new->src->proto == C->proto)) return -1; return 0; diff --cc proto/bgp/attrs.c index d8948f298,9dd9fb1ac..2f6cf6404 --- a/proto/bgp/attrs.c +++ b/proto/bgp/attrs.c @@@ -1676,10 -1669,11 +1676,10 @@@ bgp_free_prefix(struct bgp_channel *c, */ int - bgp_preexport(struct proto *P, rte *e) -bgp_preexport(struct channel *C, rte **new, struct linpool *pool UNUSED) ++bgp_preexport(struct channel *C, rte *e) { - rte *e = *new; - struct proto *SRC = e->attrs->src->proto; + struct proto *SRC = e->src->proto; - struct bgp_proto *p = (struct bgp_proto *) P; + struct bgp_proto *p = (struct bgp_proto *) C->proto; struct bgp_proto *src = (SRC->proto == &proto_bgp) ? (struct bgp_proto *) SRC : NULL; /* Reject our routes */ diff --cc proto/bgp/bgp.h index 8a44514cc,7cd1c27da..13102857d --- a/proto/bgp/bgp.h +++ b/proto/bgp/bgp.h @@@ -585,9 -588,8 +585,9 @@@ int bgp_rte_better(struct rte *, struc int bgp_rte_mergable(rte *pri, rte *sec); int bgp_rte_recalculate(rtable *table, net *net, rte *new, rte *old, rte *old_best); struct rte *bgp_rte_modify_stale(struct rte *r, struct linpool *pool); +u32 bgp_rte_igp_metric(struct rte *); void bgp_rt_notify(struct proto *P, struct channel *C, net *n, rte *new, rte *old); - int bgp_preexport(struct proto *, struct rte *); -int bgp_preexport(struct channel *, struct rte **, struct linpool *); ++int bgp_preexport(struct channel *, struct rte *); int bgp_get_attr(const struct eattr *e, byte *buf, int buflen); void bgp_get_route_info(struct rte *, byte *buf); int bgp_total_aigp_metric_(rte *e, u64 *metric, const struct adata **ad); diff --cc proto/ospf/ospf.c index d8bcc8383,42ffdb063..ad4b2d14d --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@@ -107,10 -107,12 +107,10 @@@ #include #include "ospf.h" - static int ospf_preexport(struct proto *P, rte *new); -static int ospf_preexport(struct channel *C, rte **new, struct linpool *pool); -static void ospf_make_tmp_attrs(struct rte *rt, struct linpool *pool); -static void ospf_store_tmp_attrs(struct rte *rt, struct linpool *pool); ++static int ospf_preexport(struct channel *P, rte *new); static void ospf_reload_routes(struct channel *C); static int ospf_rte_better(struct rte *new, struct rte *old); -static int ospf_rte_same(struct rte *new, struct rte *old); +static u32 ospf_rte_igp_metric(struct rte *rt); static void ospf_disp(timer *timer); @@@ -482,13 -484,14 +482,13 @@@ ospf_disp(timer * timer * import to the filters. */ static int - ospf_preexport(struct proto *P, rte *e) -ospf_preexport(struct channel *C, rte **new, struct linpool *pool UNUSED) ++ospf_preexport(struct channel *C, rte *e) { - struct ospf_proto *p = (struct ospf_proto *) P; + struct ospf_proto *p = (struct ospf_proto *) C->proto; struct ospf_area *oa = ospf_main_area(p); - rte *e = *new; /* Reject our own routes */ - if (e->src->proto == P) - if (e->attrs->src->proto == &p->p) ++ if (e->src->proto == &p->p) return -1; /* Do not export routes to stub areas */ diff --cc proto/pipe/pipe.c index c34571353,481f5804e..1f1ad8574 --- a/proto/pipe/pipe.c +++ b/proto/pipe/pipe.c @@@ -97,11 -101,11 +97,11 @@@ pipe_rt_notify(struct proto *P, struct } static int - pipe_preexport(struct proto *P, rte *e) -pipe_preexport(struct channel *C, rte **ee, struct linpool *p UNUSED) ++pipe_preexport(struct channel *C, rte *e) { - struct proto *pp = (*ee)->sender->proto; + struct proto *pp = e->sender->proto; - if (pp == P) + if (pp == C->proto) return -1; /* Avoid local loops automatically */ return 0; diff --cc proto/radv/radv.c index 7985997a3,fe3713ef4..541c39861 --- a/proto/radv/radv.c +++ b/proto/radv/radv.c @@@ -391,12 -391,12 +391,12 @@@ radv_net_match_trigger(struct radv_conf } int - radv_preexport(struct proto *P, rte *new) -radv_preexport(struct channel *C, rte **new, struct linpool *pool UNUSED) ++radv_preexport(struct channel *C, rte *new) { // struct radv_proto *p = (struct radv_proto *) P; - struct radv_config *cf = (struct radv_config *) (P->cf); + struct radv_config *cf = (struct radv_config *) (C->proto->cf); - if (radv_net_match_trigger(cf, (*new)->net)) + if (radv_net_match_trigger(cf, new->net)) return RIC_PROCESS; if (cf->propagate_routes) diff --cc sysdep/unix/krt.c index bfd69b737,a02cf9779..be547a936 --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@@ -888,11 -886,29 +888,11 @@@ krt_scan_timer_kick(struct krt_proto *p * Updates */ -static void -krt_make_tmp_attrs(struct rte *rt, struct linpool *pool) -{ - rte_init_tmp_attrs(rt, pool, 2); - rte_make_tmp_attr(rt, EA_KRT_SOURCE, EAF_TYPE_INT, rt->u.krt.proto); - rte_make_tmp_attr(rt, EA_KRT_METRIC, EAF_TYPE_INT, rt->u.krt.metric); -} - -static void -krt_store_tmp_attrs(struct rte *rt, struct linpool *pool) -{ - rte_init_tmp_attrs(rt, pool, 2); - rt->u.krt.proto = rte_store_tmp_attr(rt, EA_KRT_SOURCE); - rt->u.krt.metric = rte_store_tmp_attr(rt, EA_KRT_METRIC); -} - static int - krt_preexport(struct proto *P, rte *e) -krt_preexport(struct channel *C, rte **new, struct linpool *pool UNUSED) ++krt_preexport(struct channel *C, rte *e) { // struct krt_proto *p = (struct krt_proto *) P; - if (e->src->proto == P) - rte *e = *new; - - if (e->attrs->src->proto == C->proto) ++ if (e->src->proto == C->proto) return -1; if (!krt_capable(e))