summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2015-05-19 17:24:45 -0700
committerDonald Sharp <sharpd@cumulusnetworks.com>2015-05-19 17:24:45 -0700
commit000830bdaec70daeeefc1289c1da22e9b7e7c9dc (patch)
tree10d5d48379eb0106fa56fc798d8b84fde4fc726d
parent431aa9f906144968a9ca6c127da292f46ffa242e (diff)
IPv6 multipath is broken in BGP if nexthop contains only global address.
IPv6 always uses both nextop IPv6 address and ifIndex in sending routes down to zebra. In cases where only the global IPv6 address is present in the nexthop information, the existing code doesn't set the ifIndex. An example of such a case is when a route-map isused with "set ipv6 next-hop" and only global address is specified. This code causes the ifIndex to be determined and set thereby fixing the multipath programming. Signed-off-by: Dinesh G Dutt <ddutt@cumulusnetworks.com> Reviewed-by: Shrijeet Mukherjee <shm@cumulusnetworks.com>
-rw-r--r--bgpd/bgp_zebra.c45
1 files changed, 24 insertions, 21 deletions
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 4e02eeb470..99a7be21b4 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -822,7 +822,7 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp, sa
if (nexthop == NULL)
return;
- if (IN6_IS_ADDR_LINKLOCAL (nexthop) && ! ifindex)
+ if (!ifindex)
{
if (info->peer->ifname)
ifindex = if_nametoindex (info->peer->ifname);
@@ -836,13 +836,14 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp, sa
for (mpinfo = bgp_info_mpath_first (info); mpinfo;
mpinfo = bgp_info_mpath_next (mpinfo))
{
+ ifindex = 0;
+
/* Only global address nexthop exists. */
if (mpinfo->attr->extra->mp_nexthop_len == 16)
- {
nexthop = &mpinfo->attr->extra->mp_nexthop_global;
- }
+
/* If both global and link-local address present. */
- if (mpinfo->attr->extra->mp_nexthop_len == 32)
+ if (mpinfo->attr->extra->mp_nexthop_len == 32)
{
/* Workaround for Cisco's nexthop bug. */
if (IN6_IS_ADDR_UNSPECIFIED (&mpinfo->attr->extra->mp_nexthop_global)
@@ -860,26 +861,28 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp, sa
ifindex = mpinfo->peer->nexthop.ifp->ifindex;
}
}
- if (nexthop == NULL)
- {
- continue;
- }
- if (IN6_IS_ADDR_LINKLOCAL (nexthop) && ! ifindex)
- {
- if (mpinfo->peer->ifname)
- {
- ifindex = if_nametoindex (mpinfo->peer->ifname);
+ if (nexthop == NULL)
+ {
+ continue;
+ }
+
+ if (!ifindex)
+ {
+ if (mpinfo->peer->ifname)
+ {
+ ifindex = if_nametoindex (mpinfo->peer->ifname);
}
- else if (mpinfo->peer->nexthop.ifp)
- {
- ifindex = mpinfo->peer->nexthop.ifp->ifindex;
- }
- }
- if (ifindex == 0)
- {
- continue;
+ else if (mpinfo->peer->nexthop.ifp)
+ {
+ ifindex = mpinfo->peer->nexthop.ifp->ifindex;
}
+ }
+
+ if (ifindex == 0)
+ {
+ continue;
+ }
stream_put (bgp_nexthop_buf, &nexthop, sizeof (struct in6_addr *));
stream_put (bgp_ifindices_buf, &ifindex, sizeof (unsigned int));