]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: allow nht registration on ipv6 link-local addresses 3125/head
authorDon Slice <dslice@cumulusnetworks.com>
Tue, 25 Sep 2018 13:22:22 +0000 (06:22 -0700)
committerDon Slice <dslice@cumulusnetworks.com>
Wed, 3 Oct 2018 12:24:57 +0000 (12:24 +0000)
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
Testing Done: bgp-smoke completed with no new failures

While testing 5549 support using global addresses, discovered that
ipv6 nexthop tracking thru a route-reflector didn't work.  Since
the next-hop used for remote nexthops resolves to the link-local
of the route-reflector, we need to track it in order to react to
interface down events.  Also tripped over a crash in certain cases
which is also resolved in this fix.

bgpd/bgp_nht.c

index dd1ffe9f3bd4540132c3d42d1ee24b742e9adcf4..c94c7071572a68d0d2224eaa96192e0f650bd174 100644 (file)
@@ -169,11 +169,6 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop,
                if (make_prefix(afi, ri, &p) < 0)
                        return 1;
        } else if (peer) {
-               /* Don't register link local NH */
-               if (afi == AFI_IP6
-                   && IN6_IS_ADDR_LINKLOCAL(&peer->su.sin6.sin6_addr))
-                       return 1;
-
                if (!sockunion2hostprefix(&peer->su, &p)) {
                        if (BGP_DEBUG(nht, NHT)) {
                                zlog_debug(
@@ -287,10 +282,6 @@ void bgp_delete_connected_nexthop(afi_t afi, struct peer *peer)
        if (!peer)
                return;
 
-       /* We don't register link local address for NHT */
-       if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL(&peer->su.sin6.sin6_addr))
-               return;
-
        if (!sockunion2hostprefix(&peer->su, &p))
                return;
 
@@ -437,8 +428,9 @@ void bgp_parse_nexthop_update(int command, vrf_id_t vrf_id)
                         * we receive from bgp.  This is to allow us
                         * to work with v4 routing over v6 nexthops
                         */
-                       if (peer &&
-                           CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE)
+                       if (peer && !peer->ifp
+                           && CHECK_FLAG(peer->flags,
+                                         PEER_FLAG_CAPABILITY_ENHE)
                            && nhr.prefix.family == AF_INET6) {
                                struct interface *ifp;
 
@@ -556,11 +548,6 @@ static int make_prefix(int afi, struct bgp_info *ri, struct prefix *p)
                }
                break;
        case AFI_IP6:
-               /* We don't register link local NH */
-               if (ri->attr->mp_nexthop_len != BGP_ATTR_NHLEN_IPV6_GLOBAL
-                   || IN6_IS_ADDR_LINKLOCAL(&ri->attr->mp_nexthop_global))
-                       return -1;
-
                p->family = AF_INET6;
 
                if (is_bgp_static) {