From: Don Slice Date: Tue, 25 Sep 2018 13:22:22 +0000 (-0700) Subject: bgpd: allow nht registration on ipv6 link-local addresses X-Git-Tag: frr-7.1-dev~290^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=687a2b5dcccd7d7b288b7a00fcc6f39130f471e0;p=mirror%2Ffrr.git bgpd: allow nht registration on ipv6 link-local addresses Signed-off-by: Don Slice 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. --- diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index dd1ffe9f3b..c94c707157 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -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) {