From b5e9e5197bb75c4d7c8f19b1e76b31f9defcb915 Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Mon, 16 Oct 2023 15:21:36 +0200 Subject: [PATCH] MPLS: Fix issue with recursive MPLS routes Recursive MPLS routes used hostentry from the original route, which triggered different table than MPLS table, and therefore were not updated. --- nest/mpls.c | 7 +++++-- nest/route.h | 3 ++- nest/rt-table.c | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/nest/mpls.c b/nest/mpls.c index e37535c5..9cdcd572 100644 --- a/nest/mpls.c +++ b/nest/mpls.c @@ -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); diff --git a/nest/route.h b/nest/route.h index f83a5b33..085c45b9 100644 --- a/nest/route.h +++ b/nest/route.h @@ -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 */ diff --git a/nest/rt-table.c b/nest/rt-table.c index e497524f..0ac18cf5 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -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; }