]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: add missing checks for vpnv6 nexthop lengths
authorRenato Westphal <renato@opensourcerouting.org>
Tue, 26 Feb 2019 21:22:27 +0000 (18:22 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Fri, 1 Mar 2019 19:55:57 +0000 (16:55 -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 0b3a203af760299d67bdb7c47dfb03b91978ac23..8da568a9f1f31da0f295c4f45e5309926e9b9c45 100644 (file)
@@ -277,7 +277,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 66d33337395b49b0dfe02537fc7cae9cfc4c7d10..03ce288fe51ac79b0c6fc9b062e059af59844f6e 100644 (file)
@@ -935,14 +935,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;