summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRenato Westphal <renato@opensourcerouting.org>2017-02-07 09:47:37 -0200
committerRenato Westphal <renato@opensourcerouting.org>2017-02-07 10:22:30 -0200
commit4312ff1c28be6de6c2a6a15e1829f256b7985d0b (patch)
treeec5841376f43be3f5cd3ea1b2e352c8d9d0d7d9c
parent8cb1fc4537e2bc44a021c988b4c5d08618975924 (diff)
zebra: fix installation of LDP labels on static routes
If the ifindex of a nexthop is not zero, we can't assume that its type is NEXTHOP_TYPE_IPV4_IFINDEX or NEXTHOP_TYPE_IPV6_IFINDEX. Nexthops of type NEXTHOP_TYPE_IPV[46] can have their ifindex set by the nexthop_active() function. With that said, we need to me more flexible when comparing nexthops on mpls_ftn_update() to make sure that we'll always find the correct route/nexthop to update. Regression introduced by commit 88d88a ("zebra/ldpd: allow MPLS ECMP on unnumbered interfaces") and found by ANVL. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
-rw-r--r--zebra/zebra_mpls.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c
index decf3f5f8d..56a6ca7afa 100644
--- a/zebra/zebra_mpls.c
+++ b/zebra/zebra_mpls.c
@@ -1308,22 +1308,26 @@ mpls_ftn_update (int add, struct zebra_vrf *zvrf, enum lsp_types_t type,
for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
{
- if (nexthop->type != gtype)
- continue;
- switch (gtype)
+ switch (nexthop->type)
{
case NEXTHOP_TYPE_IPV4:
case NEXTHOP_TYPE_IPV4_IFINDEX:
+ if (gtype != NEXTHOP_TYPE_IPV4 && gtype != NEXTHOP_TYPE_IPV4_IFINDEX)
+ continue;
if (! IPV4_ADDR_SAME (&nexthop->gate.ipv4, &gate->ipv4))
continue;
- if (gtype == NEXTHOP_TYPE_IPV4_IFINDEX && nexthop->ifindex != ifindex)
+ if (nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX &&
+ nexthop->ifindex != ifindex)
continue;
goto found;
case NEXTHOP_TYPE_IPV6:
case NEXTHOP_TYPE_IPV6_IFINDEX:
+ if (gtype != NEXTHOP_TYPE_IPV6 && gtype != NEXTHOP_TYPE_IPV6_IFINDEX)
+ continue;
if (! IPV6_ADDR_SAME (&nexthop->gate.ipv6, &gate->ipv6))
continue;
- if (gtype == NEXTHOP_TYPE_IPV6_IFINDEX && nexthop->ifindex != ifindex)
+ if (nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX &&
+ nexthop->ifindex != ifindex)
continue;
goto found;
default: