]> git.puffer.fish Git - mirror/frr.git/commitdiff
IPv6 multipath is broken in BGP if nexthop contains only global address.
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 20 May 2015 00:24:45 +0000 (17:24 -0700)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 20 May 2015 00:24:45 +0000 (17:24 -0700)
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>
bgpd/bgp_zebra.c

index 4e02eeb4703fafc2245a334bafb810f2fbf09a1a..99a7be21b487ce51af68c6c4f1f63dc64b557360 100644 (file)
@@ -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));