]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Moved route source attribute (RTS_*) to eattrs
authorMaria Matejka <mq@ucw.cz>
Wed, 4 May 2022 12:41:51 +0000 (14:41 +0200)
committerMaria Matejka <mq@ucw.cz>
Wed, 4 May 2022 13:39:53 +0000 (15:39 +0200)
20 files changed:
filter/config.Y
filter/data.h
filter/f-inst.c
lib/route.h
lib/type_test.c
nest/rt-attr.c
nest/rt-dev.c
nest/rt-table.c
proto/babel/babel.c
proto/bgp/attrs.c
proto/bgp/config.Y
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/bsd/krt-sock.c
sysdep/linux/netlink.c

index 6af39c10e85380fe13ff24feddf71d9195e93cd3..ca79259338b6de78ec9b52568bf747f00cf2cc35 100644 (file)
@@ -285,7 +285,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
        SET, STRING, BGPMASK, BGPPATH, CLIST, ECLIST, LCLIST,
        IF, THEN, ELSE, CASE,
        TRUE, FALSE, RT, RO, UNKNOWN, GENERIC,
-       FROM, GW, NET, MASK, PROTO, SOURCE, SCOPE, DEST, IFNAME, IFINDEX, WEIGHT, GW_MPLS,
+       FROM, GW, NET, MASK, PROTO, SCOPE, DEST, IFNAME, IFINDEX, WEIGHT, GW_MPLS,
        ROA_CHECK, ASN, SRC, DST,
        IS_V4, IS_V6,
        LEN, MAXLEN,
@@ -765,7 +765,6 @@ static_attr:
    GW      { $$ = f_new_static_attr(T_IP,         SA_GW,       0); }
  | NET     { $$ = f_new_static_attr(T_NET,       SA_NET,       1); }
  | PROTO   { $$ = f_new_static_attr(T_STRING,     SA_PROTO,    1); }
- | SOURCE  { $$ = f_new_static_attr(T_ENUM_RTS,   SA_SOURCE,   1); }
  | DEST    { $$ = f_new_static_attr(T_ENUM_RTD,   SA_DEST,     0); }
  | IFNAME  { $$ = f_new_static_attr(T_STRING,     SA_IFNAME,   0); }
  | IFINDEX { $$ = f_new_static_attr(T_INT,        SA_IFINDEX,  1); }
index 49b29499f895f9ccdc0e1ddac82ca4f99bd283a3..23db4a85a160ecba53f4c30947cb1b375cf68525 100644 (file)
@@ -25,7 +25,6 @@ enum f_sa_code {
   SA_GW = 1,
   SA_NET,
   SA_PROTO,
-  SA_SOURCE,
   SA_DEST,
   SA_IFNAME,
   SA_IFINDEX,
index 5eacc7169a3cddebd38d159b80e17a7f94656e28..23271ce75ca1213a86b7b76eb69bfab4a56a58d6 100644 (file)
       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_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;
index 40ba150dc8a96ffbfc6edcc19a75dd1ce37ba6d8..8fdb5d8b3e6e0d42efb91c3f074a7b57ad6b794c 100644 (file)
@@ -85,7 +85,6 @@ typedef struct rta {
   struct ea_list *eattrs;              /* Extended Attribute chain */
   struct hostentry *hostentry;         /* Hostentry for recursive next-hops */
   u16 cached:1;                                /* Are attributes cached? */
-  u16 source:7;                                /* Route source (RTS_...) */
   u16 dest:4;                          /* Route destination type (RTD_...) */
   struct nexthop nh;                   /* Next hop */
 } rta;
@@ -131,12 +130,13 @@ static inline int rte_is_reachable(rte *r)
 typedef struct eattr {
   word id;                             /* EA_CODE(PROTOCOL_..., protocol-dependent ID) */
   byte flags;                          /* Protocol-dependent flags */
-  byte type:5;                         /* Attribute type */
+  byte type;                           /* Attribute type */
+  byte rfu:5;
   byte originated:1;                   /* The attribute has originated locally */
   byte fresh:1;                                /* An uncached attribute (e.g. modified in export filter) */
   byte undef:1;                                /* Explicitly undefined */
 
-  PADDING(unused, 0, 4);
+  PADDING(unused, 3, 3);
 
   union bval u;
 } eattr;
@@ -308,6 +308,12 @@ u32 rt_get_igp_metric(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)
+{ 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)
index 20e7630b9af51d1046cbada80a7e44592df1367d..b526db696245bc28e33e3a2975d8bf570ab18c09 100644 (file)
@@ -54,6 +54,7 @@ t_eattr(void)
   e.id = ~0;
   e.flags = ~0;
   e.type = ~0;
+  e.rfu = ~0;
   e.originated = ~0;
   e.fresh = ~0;
   e.undef = ~0;
index a892bfd510167ad5d5bfb74d38722118b9377c6d..39fd7db42ea87901ae5e02f51a7332652ffb929d 100644 (file)
@@ -92,6 +92,22 @@ const char * const rta_src_names[RTS_MAX] = {
   [RTS_RPKI]           = "RPKI",
 };
 
+static void
+ea_gen_source_format(const eattr *a, byte *buf, uint size)
+{
+  if ((a->u.data >= RTS_MAX) || !rta_src_names[a->u.data])
+    bsnprintf(buf, size, "unknown");
+  else
+    bsnprintf(buf, size, "%s", rta_src_names[a->u.data]);
+}
+
+struct ea_class ea_gen_source = {
+  .name = "source",
+  .type = T_ENUM_RTS,
+  .readonly = 1,
+  .format = ea_gen_source_format,
+};
+
 const char * rta_dest_names[RTD_MAX] = {
   [RTD_NONE]           = "",
   [RTD_UNICAST]                = "unicast",
@@ -1234,7 +1250,6 @@ rta_hash(rta *a)
 #define MIX(f) mem_hash_mix(&h, &(a->f), sizeof(a->f));
 #define BMIX(f) mem_hash_mix_num(&h, a->f);
   MIX(hostentry);
-  BMIX(source);
   BMIX(dest);
 #undef MIX
 
@@ -1244,8 +1259,7 @@ rta_hash(rta *a)
 static inline int
 rta_same(rta *x, rta *y)
 {
-  return (x->source == y->source &&
-         x->dest == y->dest &&
+  return (x->dest == y->dest &&
          x->hostentry == y->hostentry &&
          nexthop_same(&(x->nh), &(y->nh)) &&
          ea_same(x->eattrs, y->eattrs));
@@ -1388,15 +1402,10 @@ rta_do_cow(rta *o, linpool *lp)
 void
 rta_dump(rta *a)
 {
-  static char *rts[] = { "", "RTS_STATIC", "RTS_INHERIT", "RTS_DEVICE",
-                        "RTS_STAT_DEV", "RTS_REDIR", "RTS_RIP",
-                        "RTS_OSPF", "RTS_OSPF_IA", "RTS_OSPF_EXT1",
-                        "RTS_OSPF_EXT2", "RTS_BGP", "RTS_PIPE", "RTS_BABEL" };
   static char *rtd[] = { "", " DEV", " HOLE", " UNREACH", " PROHIBIT" };
 
-  debug("uc=%d %s %s h=%04x",
-       a->uc, rts[a->source],
-       rtd[a->dest], a->hash_key);
+  debug("uc=%d %s h=%04x",
+       a->uc, rtd[a->dest], a->hash_key);
   if (!a->cached)
     debug(" !CACHED");
   if (a->dest == RTD_UNICAST)
@@ -1441,8 +1450,6 @@ rta_dump_all(void)
 void
 rta_show(struct cli *c, rta *a)
 {
-  cli_printf(c, -1008, "\tType: %s", rta_src_names[a->source]);
-
   for(ea_list *eal = a->eattrs; eal; eal=eal->next)
     for(int i=0; i<eal->count; i++)
       ea_show(c, &eal->attrs[i]);
@@ -1476,6 +1483,7 @@ rta_init(void)
   ea_register_init(&ea_gen_preference);
   ea_register_init(&ea_gen_igp_metric);
   ea_register_init(&ea_gen_from);
+  ea_register_init(&ea_gen_source);
 }
 
 /*
index ffd5afd5973e74bfadd4a7d6c216bc57714d0982..af6506f6d7ff80f18db8fe4cdbd773747c07f740 100644 (file)
@@ -83,12 +83,12 @@ dev_ifa_notify(struct proto *P, uint flags, struct ifa *ad)
       struct rte_src *src = rt_get_source(P, ad->iface->index);
 
       rta a0 = {
-       .source = RTS_DEVICE,
        .dest = RTD_UNICAST,
        .nh.iface = ad->iface,
       };
 
       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);
index e8b04e0b5adbd0f28b7792f2242029c3f45f2957..4f119ac0c7eaab05701b303e5c4a5ba3bd4645cc 100644 (file)
@@ -2588,7 +2588,7 @@ rt_flowspec_check(rtable *tab_ip, rtable *tab_flow, const net_addr *n, rta *a, i
   trie_add_prefix(tab_flow->flowspec_trie, &dst, (nb ? nb->n.addr->pxlen : 0), max_pxlen);
 
   /* No best-match BGP route -> no flowspec */
-  if (!rb || (rb->attrs->source != RTS_BGP))
+  if (!rb || (rt_get_source_attr(rb) != RTS_BGP))
     return 0;
 
   /* Find ORIGINATOR_ID values */
@@ -2620,7 +2620,7 @@ rt_flowspec_check(rtable *tab_ip, rtable *tab_flow, const net_addr *n, rta *a, i
       continue;
 
     rte *rc = nc->routes;
-    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)
@@ -2637,7 +2637,7 @@ static rte *
 rt_flowspec_update_rte(rtable *tab, 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;
@@ -3471,7 +3471,7 @@ rt_get_igp_metric(rte *rt)
   if (ea)
     return ea->u.data;
 
-  if (rt->attrs->source == RTS_DEVICE)
+  if (rt_get_source_attr(rt) == RTS_DEVICE)
     return 0;
 
   if (rt->src->proto->rte_igp_metric)
index cd221c7b9fc964da49109fccba05703b13d1e3ec..a7dcee098ea6a4deadab620b9a783f741b021181 100644 (file)
@@ -645,12 +645,13 @@ babel_announce_rte(struct babel_proto *p, struct babel_entry *e)
   {
     struct {
       ea_list l;
-      eattr a[5];
+      eattr a[6];
     } eattrs = {
       .l.count = ARRAY_SIZE(eattrs.a),
       .a = {
        EA_LITERAL_EMBEDDED(&ea_gen_preference, 0, c->preference),
        EA_LITERAL_STORE_ADATA(&ea_gen_from, 0, &r->neigh->addr, sizeof(r->neigh->addr)),
+       EA_LITERAL_EMBEDDED(&ea_gen_source, 0, RTS_BABEL),
        EA_LITERAL_EMBEDDED(&ea_babel_metric, 0, r->metric),
        EA_LITERAL_STORE_ADATA(&ea_babel_router_id, 0, &r->router_id, sizeof(r->router_id)),
        EA_LITERAL_EMBEDDED(&ea_babel_seqno, 0, r->seqno),
@@ -658,7 +659,6 @@ babel_announce_rte(struct babel_proto *p, struct babel_entry *e)
     };
 
     rta a0 = {
-      .source = RTS_BABEL,
       .dest = RTD_UNICAST,
       .nh.gw = r->next_hop,
       .nh.iface = r->neigh->ifa->iface,
@@ -683,11 +683,11 @@ babel_announce_rte(struct babel_proto *p, struct babel_entry *e)
   {
     /* Unreachable */
     rta a0 = {
-      .source = RTS_BABEL,
       .dest = RTD_UNREACHABLE,
     };
 
     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);
index 097ba9a21fe673c2e80e3dc4607ec5d0850272b4..1efc26cec1abc157b11d7a1d4c39abef7cbb1d99 100644 (file)
@@ -402,7 +402,7 @@ bgp_total_aigp_metric_(rte *e, u64 *metric, const struct adata **ad)
 static inline int
 bgp_init_aigp_metric(rte *e, u64 *metric, const struct adata **ad)
 {
-  if (e->attrs->source == RTS_BGP)
+  if (rt_get_source_attr(e) == RTS_BGP)
     return 0;
 
   *metric = rt_get_igp_metric(e);
index b4d8b83f970205ea9ef0511e64a427fafe07b909..24f3ec8f412180757a030a25697e752c1c1b9581 100644 (file)
@@ -43,7 +43,7 @@ CF_KEYWORDS(CEASE, PREFIX, LIMIT, HIT, ADMINISTRATIVE, SHUTDOWN, RESET, PEER,
 
 CF_GRAMMAR
 
-toksym: BGP_MED | BGP_LOCAL_PREF ;
+toksym: BGP_MED | BGP_LOCAL_PREF | SOURCE ;
 
 proto: bgp_proto '}'  ;
 
index 62d60e9a7a6deb40a7acf83908a55c70fe88f3ad..0aa4dc40c4f6e6fb781e80b3931fcc22b692d06f 100644 (file)
@@ -2474,11 +2474,11 @@ bgp_decode_nlri(struct bgp_parse_state *s, u32 afi, byte *nlri, uint len, ea_lis
   {
     a = allocz(RTA_MAX_SIZE);
 
-    a->source = RTS_BGP;
     a->eattrs = ea;
 
     ea_set_attr_data(&a->eattrs, &ea_gen_from, 0, &s->proto->remote_ip, sizeof(ip_addr));
     ea_set_attr_u32(&a->eattrs, &ea_gen_preference, 0, c->c.preference);
+    ea_set_attr_u32(&a->eattrs, &ea_gen_source, 0, RTS_BGP);
 
     c->desc->decode_next_hop(s, nh, nh_len, a);
     bgp_finish_attrs(s, a);
index 427c2c8614d6fd9e52bf6fe55ce15a29c8f72bde..731adaa5f687834cf852e627a6e3963c9332c0fc 100644 (file)
@@ -392,15 +392,18 @@ ospf_rte_better(struct rte *new, struct rte *old)
   if (new_metric1 == LSINFINITY)
     return 0;
 
-  if(new->attrs->source < old->attrs->source) return 1;
-  if(new->attrs->source > old->attrs->source) return 0;
+  u32 ns = rt_get_source_attr(new);
+  u32 os = rt_get_source_attr(old);
 
-  if(new->attrs->source == RTS_OSPF_EXT2)
+  if (ns < os) return 1;
+  if (ns > os) return 0;
+
+  if (ns == RTS_OSPF_EXT2)
   {
     u32 old_metric2 = ea_get_int(old->attrs->eattrs, &ea_ospf_metric2, LSINFINITY);
     u32 new_metric2 = ea_get_int(new->attrs->eattrs, &ea_ospf_metric2, LSINFINITY);
-    if(new_metric2 < old_metric2) return 1;
-    if(new_metric2 > old_metric2) return 0;
+    if (new_metric2 < old_metric2) return 1;
+    if (new_metric2 > old_metric2) return 0;
   }
 
   u32 old_metric1 = ea_get_int(old->attrs->eattrs, &ea_ospf_metric1, LSINFINITY);
@@ -413,7 +416,7 @@ ospf_rte_better(struct rte *new, struct rte *old)
 static u32
 ospf_rte_igp_metric(struct 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);
@@ -571,7 +574,8 @@ ospf_get_route_info(rte * rte, byte * buf)
 {
   char *type = "<bug>";
 
-  switch (rte->attrs->source)
+  uint source = rt_get_source_attr(rte);
+  switch (source)
   {
   case RTS_OSPF:
     type = "I";
@@ -589,10 +593,10 @@ ospf_get_route_info(rte * rte, byte * buf)
 
   buf += bsprintf(buf, " %s", type);
   buf += bsprintf(buf, " (%d/%d", rt_get_preference(rte), ea_get_int(rte->attrs->eattrs, &ea_ospf_metric1, LSINFINITY));
-  if (rte->attrs->source == RTS_OSPF_EXT2)
+  if (source == RTS_OSPF_EXT2)
     buf += bsprintf(buf, "/%d", ea_get_int(rte->attrs->eattrs, &ea_ospf_metric2, LSINFINITY));
   buf += bsprintf(buf, ")");
-  if (rte->attrs->source == RTS_OSPF_EXT1 || rte->attrs->source == RTS_OSPF_EXT2)
+  if (source == RTS_OSPF_EXT1 || source == RTS_OSPF_EXT2)
   {
     eattr *ea = ea_find(rte->attrs->eattrs, &ea_ospf_tag);
     if (ea && (ea->u.data > 0))
index ddc5b1625c65d6ad5809eac930a6f063e1f07d83..9173905667cf8732e642d7eb65be765b0d26247b 100644 (file)
@@ -2004,11 +2004,19 @@ static inline int
 ort_changed(ort *nf, rta *nr)
 {
   rta *or = nf->old_rta;
-  return !or ||
+
+  if (!or ||
     (nf->n.metric1 != nf->old_metric1) || (nf->n.metric2 != nf->old_metric2) ||
     (nf->n.tag != nf->old_tag) || (nf->n.rid != nf->old_rid) ||
-    (nr->source != or->source) || (nr->dest != or->dest) ||
-    !nexthop_same(&(nr->nh), &(or->nh));
+    (nr->dest != or->dest) ||
+    !nexthop_same(&(nr->nh), &(or->nh)))
+    return 1;
+
+  if ( ea_get_int(nr->eattrs, &ea_gen_source, 0)
+     != ea_get_int(or->eattrs, &ea_gen_source, 0))
+    return 1;
+
+  return 0;
 }
 
 static void
@@ -2053,7 +2061,6 @@ again1:
     if (nf->n.type) /* Add the route */
     {
       rta a0 = {
-       .source = nf->n.type,
        .dest = RTD_UNICAST,
        .nh = *(nf->n.nhs),
       };
@@ -2067,7 +2074,7 @@ again1:
 
        struct {
          ea_list l;
-         eattr a[5];
+         eattr a[6];
        } eattrs;
 
        eattrs.l = (ea_list) {};
@@ -2075,6 +2082,9 @@ again1:
        eattrs.a[eattrs.l.count++] =
          EA_LITERAL_EMBEDDED(&ea_gen_preference, 0, p->p.main_channel->preference);
 
+       eattrs.a[eattrs.l.count++] = 
+         EA_LITERAL_EMBEDDED(&ea_gen_source, 0, nf->n.type);
+
        eattrs.a[eattrs.l.count++] =
          EA_LITERAL_EMBEDDED(&ea_ospf_metric1, 0, nf->n.metric1);
 
@@ -2089,6 +2099,7 @@ 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);
index 47a2867d3a4147f4fcbb772776d13085c253e806..4329556c4480ac96b1356bc5586e582929b687d0 100644 (file)
@@ -143,7 +143,6 @@ perf_loop(void *data)
 
     if (!p->attrs_per_rte || !(i % p->attrs_per_rte)) {
       struct rta a0 = {
-       .source = RTS_PERF,
        .dest = RTD_UNICAST,
        .nh.iface = p->ifa->iface,
        .nh.gw = gw,
@@ -151,6 +150,7 @@ perf_loop(void *data)
       };
 
       ea_set_attr_u32(&a0.eattrs, &ea_gen_preference, 0, p->p.main_channel->preference);
+      ea_set_attr_u32(&a0.eattrs, &ea_gen_source, 0, RTS_PERF);
 
       p->data[i].a = rta_lookup(&a0);
     }
index f54426061577bf0cb35d114414b0103a1fb6375d..f7f34c27e0adc13bafab32097ea72f3239f8e125 100644 (file)
@@ -152,17 +152,17 @@ rip_announce_rte(struct rip_proto *p, struct rip_entry *en)
   {
     /* Update */
     rta a0 = {
-      .source = RTS_RIP,
       .dest = RTD_UNICAST,
     };
 
     struct {
       ea_list l;
-      eattr a[2];
+      eattr a[3];
     } ea_block = {
       .l.count = ARRAY_SIZE(ea_block.a),
       .a = {
        EA_LITERAL_EMBEDDED(&ea_gen_preference, 0, p->p.main_channel->preference),
+       EA_LITERAL_EMBEDDED(&ea_gen_source, 0, RTS_RIP),
        EA_LITERAL_EMBEDDED(&ea_rip_metric, 0, rt->metric),
       },
     };
index af963f49875889ddecf42ff5bfa531162e2e87c8..56d8add2fcbdba360289eaa37e201db267965a60 100644 (file)
@@ -121,11 +121,11 @@ rpki_table_add_roa(struct rpki_cache *cache, struct channel *channel, const net_
   struct rpki_proto *p = cache->p;
 
   rta a0 = {
-    .source = RTS_RPKI,
     .dest = RTD_NONE,
   };
 
   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);
index ff833b1608698384272fec6cdb38108a4d75f93c..1400e98585e8bf30cdc99525aeb46cdcbc065296 100644 (file)
@@ -55,9 +55,9 @@ static_announce_rte(struct static_proto *p, struct static_route *r)
 {
   rta *a = allocz(RTA_MAX_SIZE);
   struct rte_src *src = static_get_source(p, r->index);
-  a->source = RTS_STATIC;
   a->dest = r->dest;
   ea_set_attr_u32(&a->eattrs, &ea_gen_preference, 0, p->p.main_channel->preference);
+  ea_set_attr_u32(&a->eattrs, &ea_gen_source, 0, RTS_STATIC);
 
   if (r->dest == RTD_UNICAST)
   {
index bc6b1839a5f8c24683512fe70b39c5e14017f30e..61ac7a5c128810419ab091a9cd367122787d14f4 100644 (file)
@@ -520,9 +520,10 @@ krt_read_route(struct ks_msg *msg, struct krt_proto *p, int scan)
 
   rta a = {
     .src = p->p.main_source,
-    .source = RTS_INHERIT,
   };
 
+  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. */
 
index c506c71cd50a2fc3800973e655d23b352625168f..e0219ce005070e16febecffb92434656d54ec31a 100644 (file)
@@ -1854,7 +1854,7 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h)
     nl_announce_route(s);
 
   rta *ra = lp_allocz(s->pool, RTA_MAX_SIZE);
-  ra->source = RTS_INHERIT;
+  ea_set_attr_u32(&ra->eattrs, &ea_gen_source, 0, RTS_INHERIT);
 
   if (a[RTA_FLOW])
     s->rta_flow = rta_get_u32(a[RTA_FLOW]);