From 6bc5d97795702d45dfa0ac0897cfdefd22842965 Mon Sep 17 00:00:00 2001 From: Mark Stapp Date: Tue, 12 May 2020 14:27:02 -0400 Subject: [PATCH] zebra: prefer outer label_type for recursive nexthops When resolving a recursive nexthop, prefer the "outer" label type, if present. Signed-off-by: Mark Stapp --- zebra/zebra_nhg.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c index f24552c80b..a656002fc7 100644 --- a/zebra/zebra_nhg.c +++ b/zebra/zebra_nhg.c @@ -1681,17 +1681,37 @@ static void nexthop_set_resolved(afi_t afi, const struct nexthop *newhop, /* Copy labels of the resolved route and the parent resolving to it */ if (newhop->nh_label) { - for (i = 0; i < newhop->nh_label->num_labels; i++) + for (i = 0; i < newhop->nh_label->num_labels; i++) { + /* Be a bit picky about overrunning the local array */ + if (num_labels >= MPLS_MAX_LABELS) { + if (IS_ZEBRA_DEBUG_NHG || IS_ZEBRA_DEBUG_RIB) + zlog_debug("%s: too many labels in newhop %pNHv", + __func__, newhop); + break; + } labels[num_labels++] = newhop->nh_label->label[i]; + } + /* Use the "outer" type */ label_type = newhop->nh_label_type; } if (nexthop->nh_label) { - for (i = 0; i < nexthop->nh_label->num_labels; i++) + for (i = 0; i < nexthop->nh_label->num_labels; i++) { + /* Be a bit picky about overrunning the local array */ + if (num_labels >= MPLS_MAX_LABELS) { + if (IS_ZEBRA_DEBUG_NHG || IS_ZEBRA_DEBUG_RIB) + zlog_debug("%s: too many labels in nexthop %pNHv", + __func__, nexthop); + break; + } labels[num_labels++] = nexthop->nh_label->label[i]; + } - /* If the parent has labels, use its type */ - label_type = nexthop->nh_label_type; + /* If the parent has labels, use its type if + * we don't already have one. + */ + if (label_type == ZEBRA_LSP_NONE) + label_type = nexthop->nh_label_type; } if (num_labels) -- 2.39.5