]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Merge commit '337c04c45e1472d6d9b531a3c55f1f2d30ebf308' into haugesund
authorMaria Matejka <mq@ucw.cz>
Mon, 30 May 2022 15:18:03 +0000 (17:18 +0200)
committerMaria Matejka <mq@ucw.cz>
Mon, 30 May 2022 15:18:03 +0000 (17:18 +0200)
17 files changed:
1  2 
doc/bird.sgml
filter/f-inst.c
lib/route.h
nest/rt-dev.c
nest/rt-show.c
nest/rt-table.c
nest/rt.h
proto/babel/babel.c
proto/bgp/attrs.c
proto/bgp/packets.c
proto/ospf/ospf.c
proto/ospf/rt.c
proto/perf/perf.c
proto/rip/rip.c
proto/rpki/rpki.c
proto/static/static.c
sysdep/unix/krt.c

diff --cc doc/bird.sgml
Simple merge
diff --cc filter/f-inst.c
Simple merge
diff --cc lib/route.h
index 8253ab8e25e5bae9c44b47456a4035d5a41355f0,be72bb16341c063861e4008e1e3160c4495166e4..66b8b312077aba0a839ed3c74b6a7236574d8fd6
@@@ -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)); }
  
 -u32 rt_get_igp_metric(rte *rt);
+ /*
+  *    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(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 77213a2c637acf76e14bf4af8034e1261fb9d640,696b37b8da4e491c4acda36b6b7a6b9d648c589a..2d0c594f6169ae3cfb4d49f8d13246fe7d74e086
@@@ -87,12 -89,12 +86,14 @@@ dev_ifa_notify(struct proto *P, uint fl
        .nh.iface = ad->iface,
        };
  
 -      a = rta_lookup(&a0);
 -      e = rte_get_temp(a, src);
 -      e->pflags = 0;
 -      rte_update2(c, net, e, src);
+       ea_set_attr_u32(&a0.eattrs, &ea_gen_preference, 0, c->preference);
 +      rte e0 = {
 +      .attrs = rta_lookup(&a0),
 +      .src = src,
 +      };
 +
 +      rte_update(c, net, &e0, src);
      }
  }
  
diff --cc nest/rt-show.c
Simple merge
diff --cc nest/rt-table.c
Simple merge
diff --cc nest/rt.h
Simple merge
index eaebdb831d0566c21f3b31484d5c3bb275033e5d,afd0b1e104544622a010d7ad278b011e6a7d3994..6cc6b794cb6d5f5052e9844e3cf635330c11515c
@@@ -689,16 -687,16 +689,17 @@@ babel_announce_rte(struct babel_proto *
        .source = RTS_BABEL,
        .scope = SCOPE_UNIVERSE,
        .dest = RTD_UNREACHABLE,
-       .pref = 1,
      };
  
 -    rta *a = rta_lookup(&a0);
 -    rte *rte = rte_get_temp(a, p->p.main_source);
 -    rte->pflags = 0;
+     ea_set_attr_u32(&a0.eattrs, &ea_gen_preference, 0, 1);
 +    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
    {
index 73939bf0e48865d3ec92c44eb501ec6b0ed97bea,097ba9a21fe673c2e80e3dc4607ec5d0850272b4..6a91e6e79c43ba68d8d01e5b1f657dd5f25ae0ba
@@@ -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;
  
Simple merge
Simple merge
diff --cc proto/ospf/rt.c
Simple merge
Simple merge
diff --cc proto/rip/rip.c
Simple merge
index 153e52934d204a89bd26963d62ca5921addc0da8,710764e2a78fd010affb4e23290f675c74eaf412..eecab897d1bf5523f98eb924ce48842598f2c696
@@@ -127,9 -126,14 +126,11 @@@ rpki_table_add_roa(struct rpki_cache *c
      .dest = RTD_NONE,
    };
  
 -  rta *a = rta_lookup(&a0);
 -  rte *e = rte_get_temp(a, p->p.main_source);
+   ea_set_attr_u32(&a0.eattrs, &ea_gen_preference, 0, channel->preference);
 +  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
Simple merge
index 5a29289f3561dca7697ead6e167163bcbf9c833b,b8e7670e30a1dfb1c013cf635a45156f8c713e1a..b94b05aeea18b20eb45fa52af4e4737a7e74efca
@@@ -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)