]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: add missing checks for vpnv6 nexthop lengths 3878/head
authorRenato Westphal <renato@opensourcerouting.org>
Tue, 26 Feb 2019 21:22:27 +0000 (18:22 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Tue, 26 Feb 2019 22:02:24 +0000 (19:02 -0300)
A few code paths weren't handling the vpnv6 nexthop lenghts as
expected, which was leading to problems like imported vpnv6 routes
not being marked as valid when they should. Fix this.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
bgpd/bgp_route.h
bgpd/bgp_zebra.c

index 85325a93cf638c474feeb3550a7aa006be512e79..8efd3aea955431cffba9ed58279bb565f57b7db0 100644 (file)
@@ -279,7 +279,10 @@ struct bgp_static {
 
 #define BGP_ATTR_NEXTHOP_AFI_IP6(attr)                                         \
        (!CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_NEXT_HOP))             \
-        && ((attr)->mp_nexthop_len == 16 || (attr)->mp_nexthop_len == 32))
+        && ((attr)->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL              \
+            || (attr)->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL    \
+            || (attr)->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV6_GLOBAL          \
+            || (attr)->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV6_GLOBAL_AND_LL))
 #define BGP_PATH_COUNTABLE(BI)                                                 \
        (!CHECK_FLAG((BI)->flags, BGP_PATH_HISTORY)                            \
         && !CHECK_FLAG((BI)->flags, BGP_PATH_REMOVED))
index 3f18d69a2d6a5333b71f74960148e3be0c45805d..621ded5bfd297d78b6342c8a3d0bb583296706a0 100644 (file)
@@ -945,14 +945,17 @@ bgp_path_info_to_ipv6_nexthop(struct bgp_path_info *path, ifindex_t *ifindex)
        struct in6_addr *nexthop = NULL;
 
        /* Only global address nexthop exists. */
-       if (path->attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL) {
+       if (path->attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL
+           || path->attr->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV6_GLOBAL) {
                nexthop = &path->attr->mp_nexthop_global;
                if (IN6_IS_ADDR_LINKLOCAL(nexthop))
                        *ifindex = path->attr->nh_ifindex;
        }
 
        /* If both global and link-local address present. */
-       if (path->attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL) {
+       if (path->attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL
+           || path->attr->mp_nexthop_len
+                      == BGP_ATTR_NHLEN_VPNV6_GLOBAL_AND_LL) {
                /* Check if route-map is set to prefer global over link-local */
                if (path->attr->mp_nexthop_prefer_global) {
                        nexthop = &path->attr->mp_nexthop_global;