From: Donatas Abraitis Date: Fri, 6 Sep 2019 09:12:23 +0000 (+0300) Subject: bgpd: Do not send next-hop as :: in MP_REACH_NLRI if no link-local exists X-Git-Tag: frr-7.2.1~31^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=33038f887d6594d00f390696b03fbaeaba8ffc98;p=mirror%2Ffrr.git bgpd: Do not send next-hop as :: in MP_REACH_NLRI if no link-local exists This is the unusual case when you have global IPv6 address and no link-local on interface attached. Like here: eth1: mtu 1500 qdisc pfifo_fast state UP link/ether 08:00:27:65:c6:82 brd ff:ff:ff:ff:ff:ff inet6 2a02:4780:face::1/64 scope global valid_lft forever preferred_lft forever Signed-off-by: Donatas Abraitis --- diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index c122df498a..53b675689b 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -1752,18 +1752,22 @@ int subgroup_announce_check(struct bgp_node *rn, struct bgp_path_info *pi, * if * the peer (group) is configured to receive link-local nexthop * unchanged - * and it is available in the prefix OR we're not reflecting the route - * and + * and it is available in the prefix OR we're not reflecting the route, + * link-local nexthop address is valid and * the peer (group) to whom we're going to announce is on a shared * network * and this is either a self-originated route or the peer is EBGP. + * By checking if nexthop LL address is valid we are sure that + * we do not announce LL address as `::`. */ if (NEXTHOP_IS_V6) { attr->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL; if ((CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) && IN6_IS_ADDR_LINKLOCAL(&attr->mp_nexthop_local)) - || (!reflect && peer->shared_network + || (!reflect + && IN6_IS_ADDR_LINKLOCAL(&peer->nexthop.v6_local) + && peer->shared_network && (from == bgp->peer_self || peer->sort == BGP_PEER_EBGP))) { attr->mp_nexthop_len =