diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index fced2fbcab..2a4de56944 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -558,7 +558,18 @@ static int make_prefix(int afi, struct bgp_path_info *pi, struct prefix *p) p->u.prefix6 = p_orig->u.prefix6; p->prefixlen = p_orig->prefixlen; } else { - p->u.prefix6 = pi->attr->mp_nexthop_global; + /* If we receive MP_REACH nexthop with ::(LL) + * or LL(LL), use LL address as nexthop cache. + */ + if (pi->attr->mp_nexthop_len + == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL + && (IN6_IS_ADDR_UNSPECIFIED( + &pi->attr->mp_nexthop_global) + || IN6_IS_ADDR_LINKLOCAL( + &pi->attr->mp_nexthop_global))) + p->u.prefix6 = pi->attr->mp_nexthop_local; + else + p->u.prefix6 = pi->attr->mp_nexthop_global; p->prefixlen = IPV6_MAX_BITLEN; } break;