From: Maria Matejka Date: Mon, 30 May 2022 15:18:03 +0000 (+0200) Subject: Merge commit '337c04c45e1472d6d9b531a3c55f1f2d30ebf308' into haugesund X-Git-Tag: v3.0-alpha1~171^2~54 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a92ee9d4df265018c0344064019f53bc3afce3a;p=thirdparty%2Fbird.git Merge commit '337c04c45e1472d6d9b531a3c55f1f2d30ebf308' into haugesund --- 1a92ee9d4df265018c0344064019f53bc3afce3a diff --cc lib/route.h index 8253ab8e2,be72bb163..66b8b3120 --- a/lib/route.h +++ b/lib/route.h @@@ -292,6 -285,23 +287,23 @@@ static inline voi ea_set_attr_data(ea_list **to, const struct ea_class *def, uint flags, void *data, uint len) { ea_set_attr(to, EA_LITERAL_STORE_ADATA(def, flags, data, len)); } + /* + * Common route attributes + */ + + /* Preference: first-order comparison */ + extern struct ea_class ea_gen_preference; + static inline u32 rt_get_preference(rte *rt) + { return ea_get_int(rt->attrs->eattrs, &ea_gen_preference, 0); } + + /* IGP metric: second-order comparison */ + extern struct ea_class ea_gen_igp_metric; -u32 rt_get_igp_metric(rte *rt); ++u32 rt_get_igp_metric(const rte *rt); + #define IGP_METRIC_UNKNOWN 0x80000000 /* Default igp_metric used when no other + protocol-specific metric is availabe */ + + + /* Next hop structures */ #define NEXTHOP_MAX_SIZE (sizeof(struct nexthop) + sizeof(u32)*MPLS_MAX_LABEL_STACK) diff --cc nest/rt-dev.c index 77213a2c6,696b37b8d..2d0c594f6 --- a/nest/rt-dev.c +++ b/nest/rt-dev.c @@@ -87,12 -89,12 +86,14 @@@ dev_ifa_notify(struct proto *P, uint fl .nh.iface = ad->iface, }; + ea_set_attr_u32(&a0.eattrs, &ea_gen_preference, 0, c->preference); + - a = rta_lookup(&a0); - e = rte_get_temp(a, src); - e->pflags = 0; - rte_update2(c, net, e, src); + rte e0 = { + .attrs = rta_lookup(&a0), + .src = src, + }; + + rte_update(c, net, &e0, src); } } diff --cc proto/babel/babel.c index eaebdb831,afd0b1e10..6cc6b794c --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@@ -689,16 -687,16 +689,17 @@@ babel_announce_rte(struct babel_proto * .source = RTS_BABEL, .scope = SCOPE_UNIVERSE, .dest = RTD_UNREACHABLE, - .pref = 1, }; + ea_set_attr_u32(&a0.eattrs, &ea_gen_preference, 0, 1); + - rta *a = rta_lookup(&a0); - rte *rte = rte_get_temp(a, p->p.main_source); - rte->pflags = 0; + rte e0 = { + .attrs = &a0, + .src = p->p.main_source, + }; e->unreachable = 1; - rte_update2(c, e->n.addr, rte, p->p.main_source); + rte_update(c, e->n.addr, &e0, p->p.main_source); } else { diff --cc proto/bgp/attrs.c index 73939bf0e,097ba9a21..6a91e6e79 --- a/proto/bgp/attrs.c +++ b/proto/bgp/attrs.c @@@ -2185,8 -2182,9 +2185,8 @@@ use_deterministic_med(struct rte_storag int bgp_rte_recalculate(rtable *table, net *net, rte *new, rte *old, rte *old_best) { - rte *r, *s; rte *key = new ? new : old; - u32 lpref = key->attrs->pref; + u32 lpref = rt_get_preference(key); u32 lasn = bgp_get_neighbor(key); int old_suppressed = old ? !!(old->pflags & BGP_REF_SUPPRESSED) : 0; diff --cc proto/rpki/rpki.c index 153e52934,710764e2a..eecab897d --- a/proto/rpki/rpki.c +++ b/proto/rpki/rpki.c @@@ -127,9 -126,14 +126,11 @@@ rpki_table_add_roa(struct rpki_cache *c .dest = RTD_NONE, }; + ea_set_attr_u32(&a0.eattrs, &ea_gen_preference, 0, channel->preference); + - rta *a = rta_lookup(&a0); - rte *e = rte_get_temp(a, p->p.main_source); + rte e0 = { .attrs = &a0, .src = p->p.main_source, }; - e->pflags = 0; - - rte_update2(channel, &pfxr->n, e, e->src); + rte_update(channel, &pfxr->n, &e0, p->p.main_source); } void diff --cc sysdep/unix/krt.c index 5a29289f3,b8e7670e3..b94b05aee --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@@ -435,13 -433,14 +435,13 @@@ again static void krt_learn_async(struct krt_proto *p, rte *e, int new) { - net *n0 = e->net; - net *n = net_get(p->krt_table, n0->n.addr); - rte *g, **gg, *best, **bestp, *old_best; + net *n = net_get(p->krt_table, e->net); + struct rte_storage *g, **gg, *best, **bestp, *old_best; ASSERT(!e->attrs->cached); - e->attrs->pref = p->p.main_channel->preference; + ea_set_attr_u32(&e->attrs->eattrs, &ea_gen_preference, 0, p->p.main_channel->preference); - e->attrs = rta_lookup(e->attrs); + struct rte_storage *ee = rte_store(e, n, p->krt_table); old_best = n->routes; for(gg=&n->routes; g = *gg; gg = &g->next)