From e359ac07ed0183dcb25d986cb7b80d259caab7cc Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Fri, 6 Sep 2019 12:12:23 +0300 Subject: [PATCH] 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 --- bgpd/bgp_route.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 984fc512ab..ee5f41d165 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -1708,18 +1708,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 = -- 2.39.5