]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Joined the RTA igp_metric and EA igp_metric attributes
authorMaria Matejka <mq@ucw.cz>
Wed, 20 Apr 2022 08:25:14 +0000 (10:25 +0200)
committerMaria Matejka <mq@ucw.cz>
Wed, 4 May 2022 13:39:21 +0000 (15:39 +0200)
lib/route.h
nest/rt-attr.c
nest/rt-table.c
proto/bgp/attrs.c
proto/bgp/packets.c

index f24fd55529deaa197a9cb1a40ba9fb58d7f992dc..3b3686964287bf05034a04fec818750338536ca2 100644 (file)
@@ -85,7 +85,6 @@ typedef struct rta {
   struct ea_list *eattrs;              /* Extended Attribute chain */
   struct hostentry *hostentry;         /* Hostentry for recursive next-hops */
   ip_addr from;                                /* Advertising router */
-  u32 igp_metric;                      /* IGP metric to next hop (for iBGP routes) */
   u16 cached:1;                                /* Are attributes cached? */
   u16 source:7;                                /* Route source (RTS_...) */
   u16 scope:4;                         /* Route scope (SCOPE_... -- see ip.h) */
@@ -118,10 +117,6 @@ typedef struct rta {
 #define RTD_PROHIBIT 4                 /* Administratively prohibited */
 #define RTD_MAX 5
 
-#define IGP_METRIC_UNKNOWN 0x80000000  /* Default igp_metric used when no other
-                                          protocol-specific metric is availabe */
-
-
 extern const char * rta_dest_names[RTD_MAX];
 
 static inline const char *rta_dest_name(uint n)
@@ -186,6 +181,8 @@ struct ea_class_ref {
   struct ea_class *class;
 };
 
+#define IGP_METRIC_UNKNOWN 0x80000000  /* Default igp_metric used when no other
+                                          protocol-specific metric is availabe */
 extern struct ea_class ea_gen_igp_metric;
 
 void ea_register_init(struct ea_class *);
index a763db4d50251d2a3bf9ecd5acb75581c460886d..6bb276237b32acd8931560515663fb04b65ecf1b 100644 (file)
@@ -1225,7 +1225,6 @@ rta_hash(rta *a)
 #define BMIX(f) mem_hash_mix_num(&h, a->f);
   MIX(hostentry);
   MIX(from);
-  MIX(igp_metric);
   BMIX(source);
   BMIX(scope);
   BMIX(dest);
@@ -1241,7 +1240,6 @@ rta_same(rta *x, rta *y)
   return (x->source == y->source &&
          x->scope == y->scope &&
          x->dest == y->dest &&
-         x->igp_metric == y->igp_metric &&
          ipa_equal(x->from, y->from) &&
          x->hostentry == y->hostentry &&
          nexthop_same(&(x->nh), &(y->nh)) &&
index af59d63b53ca7d951521c7e405c438610b2061db..01194e02136995376c92c697f1f66d49f674a77e 100644 (file)
@@ -2386,7 +2386,8 @@ rta_apply_hostentry(rta *a, struct hostentry *he, mpls_label_stack *mls)
 {
   a->hostentry = he;
   a->dest = he->dest;
-  a->igp_metric = he->igp_metric;
+
+  ea_set_attr_u32(&a->eattrs, &ea_gen_igp_metric, 0, he->igp_metric);
 
   if (a->dest != RTD_UNICAST)
   {
@@ -2483,7 +2484,8 @@ rta_next_hop_outdated(rta *a)
   if (!he->src)
     return a->dest != RTD_UNREACHABLE;
 
-  return (a->dest != he->dest) || (a->igp_metric != he->igp_metric) ||
+  return (a->dest != he->dest) ||
+    (ea_get_int(a->eattrs, &ea_gen_igp_metric, IGP_METRIC_UNKNOWN) != he->igp_metric) ||
     (!he->nexthop_linkable) || !nexthop_same(&(a->nh), &(he->src->nh));
 }
 
index 72a4f68ad622718e7a76e56c21a35ef5b6410879..597cf96cb6412f8de22b60f28b2e58bc873f20ef 100644 (file)
@@ -383,7 +383,7 @@ bgp_total_aigp_metric_(rte *e, u64 *metric, const struct adata **ad)
     return 0;
 
   u64 aigp = get_u64(b + 3);
-  u64 step = e->attrs->igp_metric;
+  u64 step = rt_get_igp_metric(e);
 
   if (!rte_resolvable(e) || (step >= IGP_METRIC_UNKNOWN))
     step = BGP_AIGP_MAX;
@@ -2046,8 +2046,8 @@ bgp_rte_better(rte *new, rte *old)
     return 1;
 
   /* RFC 4271 9.1.2.2. e) Compare IGP metrics */
-  n = new_bgp->cf->igp_metric ? new->attrs->igp_metric : 0;
-  o = old_bgp->cf->igp_metric ? old->attrs->igp_metric : 0;
+  n = new_bgp->cf->igp_metric ? rt_get_igp_metric(new) : 0;
+  o = old_bgp->cf->igp_metric ? rt_get_igp_metric(old) : 0;
   if (n < o)
     return 1;
   if (n > o)
@@ -2155,8 +2155,8 @@ bgp_rte_mergable(rte *pri, rte *sec)
     return 0;
 
   /* RFC 4271 9.1.2.2. e) Compare IGP metrics */
-  p = pri_bgp->cf->igp_metric ? pri->attrs->igp_metric : 0;
-  s = sec_bgp->cf->igp_metric ? sec->attrs->igp_metric : 0;
+  p = pri_bgp->cf->igp_metric ? rt_get_igp_metric(pri) : 0;
+  s = sec_bgp->cf->igp_metric ? rt_get_igp_metric(sec) : 0;
   if (p != s)
     return 0;
 
@@ -2394,14 +2394,14 @@ bgp_get_route_info(rte *e, byte *buf)
   {
     buf += bsprintf(buf, "/%lu", metric);
   }
-  else if (e->attrs->igp_metric)
+  else if (metric = rt_get_igp_metric(e))
   {
     if (!rte_resolvable(e))
       buf += bsprintf(buf, "/-");
-    else if (e->attrs->igp_metric >= IGP_METRIC_UNKNOWN)
+    else if (metric >= IGP_METRIC_UNKNOWN)
       buf += bsprintf(buf, "/?");
     else
-      buf += bsprintf(buf, "/%d", e->attrs->igp_metric);
+      buf += bsprintf(buf, "/%d", metric);
   }
   buf += bsprintf(buf, ") [");
 
index a18ff373e5600143b65fda59f38c3752afcc3484..5c9bb8ba4935ec1719d8d61ec6231a0fda03576c 100644 (file)
@@ -969,7 +969,7 @@ bgp_apply_next_hop(struct bgp_parse_state *s, rta *a, ip_addr gw, ip_addr ll)
     a->dest = RTD_UNICAST;
     a->nh.gw = nbr->addr;
     a->nh.iface = nbr->iface;
-    a->igp_metric = c->cf->cost;
+    ea_set_attr_u32(&a->eattrs, &ea_gen_igp_metric, 0, c->cf->cost);
   }
   else /* GW_RECURSIVE */
   {