mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-03 06:32:33 +00:00
bgpd: Fix nexthop comparison for v6
When we have both a LL and a Global address, use what the attribute wants for comparison instead of assuming Global than LL. This was causing BGP to install v6 routes that used the LL as the nexthop, where the global address was different and being used as the basis for comparison. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
647450524c
commit
05a38c0c8b
@ -102,6 +102,7 @@ int bgp_maximum_paths_unset(struct bgp *bgp, afi_t afi, safi_t safi,
|
||||
int bgp_info_nexthop_cmp(struct bgp_info *bi1, struct bgp_info *bi2)
|
||||
{
|
||||
int compare;
|
||||
struct in6_addr addr1, addr2;
|
||||
|
||||
compare = IPV4_ADDR_CMP(&bi1->attr->nexthop, &bi2->attr->nexthop);
|
||||
if (!compare) {
|
||||
@ -120,13 +121,18 @@ int bgp_info_nexthop_cmp(struct bgp_info *bi1, struct bgp_info *bi2)
|
||||
&bi2->attr->mp_nexthop_global);
|
||||
break;
|
||||
case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL:
|
||||
compare = IPV6_ADDR_CMP(
|
||||
&bi1->attr->mp_nexthop_global,
|
||||
&bi2->attr->mp_nexthop_global);
|
||||
addr1 = (bi1->attr->mp_nexthop_prefer_global) ?
|
||||
bi1->attr->mp_nexthop_global
|
||||
: bi1->attr->mp_nexthop_local;
|
||||
addr2 = (bi2->attr->mp_nexthop_prefer_global) ?
|
||||
bi2->attr->mp_nexthop_global
|
||||
: bi2->attr->mp_nexthop_local;
|
||||
|
||||
if (!bi1->attr->mp_nexthop_prefer_global &&
|
||||
!bi2->attr->mp_nexthop_prefer_global)
|
||||
compare = !(bi1->peer->ifindex == bi2->peer->ifindex);
|
||||
if (!compare)
|
||||
compare = IPV6_ADDR_CMP(
|
||||
&bi1->attr->mp_nexthop_local,
|
||||
&bi2->attr->mp_nexthop_local);
|
||||
compare = IPV6_ADDR_CMP(&addr1, &addr2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user