]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
MPLS: Fix issue with recursive MPLS routes
authorOndrej Zajicek <santiago@crfreenet.org>
Mon, 16 Oct 2023 13:21:36 +0000 (15:21 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Mon, 16 Oct 2023 13:21:36 +0000 (15:21 +0200)
Recursive MPLS routes used hostentry from the original route, which
triggered different table than MPLS table, and therefore were not
updated.

nest/mpls.c
nest/route.h
nest/rt-table.c

index e37535c5dde67a619c4615300669a569f0936b17..9cdcd572adef497b583341a920117d13016a71e8 100644 (file)
@@ -1059,10 +1059,13 @@ mpls_announce_fec(struct mpls_fec_map *m, struct mpls_fec *fec, const rta *src)
     const u32 *labels = &src->nh.label[src->nh.labels - src->nh.labels_orig];
     mpls_label_stack ms;
 
-    /* Apply the hostentry with the original labelstack */
+    /* Reconstruct the original labelstack */
     ms.len = src->nh.labels_orig;
     memcpy(ms.stack, labels, src->nh.labels_orig * sizeof(u32));
-    rta_apply_hostentry(a, src->hostentry, &ms);
+
+    /* The same hostentry, but different dependent table */
+    struct hostentry *s = src->hostentry;
+    rta_set_recursive_next_hop(m->channel->table, a, s->owner, s->addr, s->link, &ms);
   }
 
   net_addr_mpls n = NET_ADDR_MPLS(fec->label);
index f83a5b33023f3478406a00a2378e99788c4a2c8b..085c45b9222172d25c3c4abd87f4a23e5bf00401 100644 (file)
@@ -244,7 +244,8 @@ struct hostentry {
   ip_addr addr;                                /* IP address of host, part of key */
   ip_addr link;                                /* (link-local) IP address of host, used as gw
                                           if host is directly attached */
-  struct rtable *tab;                  /* Dependent table, part of key */
+  rtable *tab;                         /* Dependent table, part of key */
+  rtable *owner;                       /* Nexthop owner table */
   struct hostentry *next;              /* Next in hash chain */
   unsigned hash_key;                   /* Hash key */
   unsigned uc;                         /* Use count */
index e497524f391bb40fa839724a30c944fd64ffc783..0ac18cf58be119c27870fd683c863fa2aa6574b2 100644 (file)
@@ -3663,6 +3663,7 @@ rt_get_hostentry(rtable *tab, ip_addr a, ip_addr ll, rtable *dep)
       return he;
 
   he = hc_new_hostentry(hc, tab->rp, a, link, dep, k);
+  he->owner = tab;
   rt_update_hostentry(tab, he);
   return he;
 }