summaryrefslogtreecommitdiff
path: root/nest
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2023-10-16 15:21:36 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2023-10-16 15:21:36 +0200
commitb5e9e5197bb75c4d7c8f19b1e76b31f9defcb915 (patch)
tree9b8e6ea1658b88c8131a45c38181b29fa81b3873 /nest
parent0e1fbaa5b21db8e5c64a732dbaf0b8afe707a147 (diff)
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.
Diffstat (limited to 'nest')
-rw-r--r--nest/mpls.c7
-rw-r--r--nest/route.h3
-rw-r--r--nest/rt-table.c1
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;
}