From: Maria Matejka Date: Mon, 30 May 2022 15:26:25 +0000 (+0200) Subject: Merge commit '1c30b689ddd032ef8000fb7836348a48ba3184ff' into haugesund X-Git-Tag: v3.0-alpha1~171^2~52 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=41508ceac3cdd74ca705d3bfc6a79464bf38e0b5;p=thirdparty%2Fbird.git Merge commit '1c30b689ddd032ef8000fb7836348a48ba3184ff' into haugesund --- 41508ceac3cdd74ca705d3bfc6a79464bf38e0b5 diff --cc filter/f-inst.c index 7fa1c8b8f,23271ce75..caf473f0f --- a/filter/f-inst.c +++ b/filter/f-inst.c @@@ -534,9 -534,8 +534,8 @@@ switch (sa.sa_code) { case SA_GW: RESULT(sa.type, ip, rta->nh.gw); break; - case SA_NET: RESULT(sa.type, net, (*fs->rte)->net->n.addr); break; - case SA_PROTO: RESULT(sa.type, s, (*fs->rte)->src->proto->name); break; + case SA_NET: RESULT(sa.type, net, fs->rte->net); break; + case SA_PROTO: RESULT(sa.type, s, fs->rte->src->proto->name); break; - case SA_SOURCE: RESULT(sa.type, i, rta->source); break; case SA_DEST: RESULT(sa.type, i, rta->dest); break; case SA_IFNAME: RESULT(sa.type, s, rta->nh.iface ? rta->nh.iface->name : ""); break; case SA_IFINDEX: RESULT(sa.type, i, rta->nh.iface ? rta->nh.iface->index : 0); break; diff --cc lib/route.h index 30ac26729,8fdb5d8b3..cfb08bbe5 --- a/lib/route.h +++ b/lib/route.h @@@ -310,6 -308,12 +310,12 @@@ u32 rt_get_igp_metric(const rte *rt) /* From: Advertising router */ extern struct ea_class ea_gen_from; + /* Source: An old method to devise the route source protocol and kind. + * To be superseded in a near future by something more informative. */ + extern struct ea_class ea_gen_source; -static inline u32 rt_get_source_attr(rte *rt) ++static inline u32 rt_get_source_attr(const rte *rt) + { return ea_get_int(rt->attrs->eattrs, &ea_gen_source, 0); } + /* Next hop structures */ #define NEXTHOP_MAX_SIZE (sizeof(struct nexthop) + sizeof(u32)*MPLS_MAX_LABEL_STACK) diff --cc nest/rt-dev.c index 5d4233dcd,af6506f6d..b0ad34e66 --- a/nest/rt-dev.c +++ b/nest/rt-dev.c @@@ -86,13 -88,12 +85,14 @@@ dev_ifa_notify(struct proto *P, uint fl }; ea_set_attr_u32(&a0.eattrs, &ea_gen_preference, 0, c->preference); + ea_set_attr_u32(&a0.eattrs, &ea_gen_source, 0, RTS_DEVICE); - 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 nest/rt-table.c index 3d42c9de6,4f119ac0c..3f3aee18f --- a/nest/rt-table.c +++ b/nest/rt-table.c @@@ -2736,8 -2619,8 +2736,8 @@@ rt_flowspec_check(rtable *tab_ip, rtabl if (!nc) continue; - rte *rc = nc->routes; + const rte *rc = &nc->routes->rte; - if (rc->attrs->source != RTS_BGP) + if (rt_get_source_attr(rc) != RTS_BGP) return 0; if (rta_get_first_asn(rc->attrs) != asn_b) @@@ -2750,11 -2633,11 +2750,11 @@@ #endif /* CONFIG_BGP */ -static rte * -rt_flowspec_update_rte(rtable *tab, rte *r) +static struct rte_storage * +rt_flowspec_update_rte(rtable *tab, net *n, rte *r) { #ifdef CONFIG_BGP - if (r->attrs->source != RTS_BGP) + if (rt_get_source_attr(r) != RTS_BGP) return NULL; struct bgp_channel *bc = (struct bgp_channel *) r->sender; diff --cc proto/babel/babel.c index d3eef506f,a7dcee098..be75694fd --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@@ -690,14 -687,14 +689,15 @@@ babel_announce_rte(struct babel_proto * }; ea_set_attr_u32(&a0.eattrs, &ea_gen_preference, 0, 1); + ea_set_attr_u32(&a0.eattrs, &ea_gen_source, 0, RTS_BABEL); - 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/ospf/ospf.c index 121e8f9cd,731adaa5f..8fe64d958 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@@ -411,9 -414,9 +414,9 @@@ ospf_rte_better(struct rte *new, struc } static u32 -ospf_rte_igp_metric(struct rte *rt) +ospf_rte_igp_metric(const rte *rt) { - if (rt->attrs->source == RTS_OSPF_EXT2) + if (rt_get_source_attr(rt) == RTS_OSPF_EXT2) return IGP_METRIC_UNKNOWN; return ea_get_int(rt->attrs->eattrs, &ea_ospf_metric1, LSINFINITY); diff --cc proto/ospf/rt.c index 0cfd37476,917390566..23b767bc9 --- a/proto/ospf/rt.c +++ b/proto/ospf/rt.c @@@ -2089,15 -2099,14 +2099,16 @@@ again1 eattrs.a[eattrs.l.count++] = EA_LITERAL_EMBEDDED(&ea_ospf_router_id, 0, nf->n.rid); + ASSERT_DIE(ARRAY_SIZE(eattrs.a) >= eattrs.l.count); a0.eattrs = &eattrs.l; - rta *a = rta_lookup(&a0); - rte *e = rte_get_temp(a, p->p.main_source); - rta_free(nf->old_rta); - nf->old_rta = rta_clone(a); + nf->old_rta = rta_lookup(&a0); + + rte e0 = { + .attrs = nf->old_rta, + .src = p->p.main_source, + }; DBG("Mod rte type %d - %N via %I on iface %s, met %d\n", a0.source, nf->fn.addr, a0.gw, a0.iface ? a0.iface->name : "(none)", nf->n.metric1); diff --cc proto/rpki/rpki.c index 8e2dbf49d,56d8add2f..96a794fa9 --- a/proto/rpki/rpki.c +++ b/proto/rpki/rpki.c @@@ -126,10 -125,14 +125,11 @@@ rpki_table_add_roa(struct rpki_cache *c }; ea_set_attr_u32(&a0.eattrs, &ea_gen_preference, 0, channel->preference); + ea_set_attr_u32(&a0.eattrs, &ea_gen_source, 0, RTS_RPKI); - 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/bsd/krt-sock.c index 19ef2394c,61ac7a5c1..1c1bd50ca --- a/sysdep/bsd/krt-sock.c +++ b/sysdep/bsd/krt-sock.c @@@ -518,9 -519,11 +518,10 @@@ krt_read_route(struct ks_msg *msg, stru net = net_get(p->p.main_channel->table, &ndst); rta a = { - .source = RTS_INHERIT, - .src = p->p.main_source, }; + ea_set_attr_u32(&a->eattrs, &ea_gen_source, 0, RTS_INHERIT); + /* reject/blackhole routes have also set RTF_GATEWAY, we wil check them first. */