From 6e8897fcf527299f546c4a26ef020e4d30fd68ed Mon Sep 17 00:00:00 2001 From: Louis Scalbert Date: Mon, 22 Jul 2024 16:17:40 +0200 Subject: [PATCH] bgpd: fix nexthop resolution of ipv4-mapped ipv6 Fix nexthop resolution of ipv4-mapped ipv6 nexthop addresses. Fixes: 5dd731af84 ("bgpd: prefer link-local to a ipv4-mapped ipv6 global") Signed-off-by: Louis Scalbert --- bgpd/bgp_nht.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index 8ce45558e9..67e7463fe4 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -351,7 +351,9 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop, } return 0; } - + if (afi == AFI_IP6 && p.family == AF_INET) + /* IPv4 mapped IPv6 nexthop address */ + afi = AFI_IP; srte_color = bgp_attr_get_color(pi->attr); } else if (peer) { @@ -1078,14 +1080,25 @@ static int make_prefix(int afi, struct bgp_path_info *pi, struct prefix *p) &ipv4); p->u.prefix4 = ipv4; p->prefixlen = IPV4_MAX_BITLEN; + p->family = AF_INET; } else p->u.prefix6 = pi->attr->mp_nexthop_global; } else p->u.prefix6 = pi->attr->mp_nexthop_local; - } else - p->u.prefix6 = pi->attr->mp_nexthop_global; + } else { + if (IS_MAPPED_IPV6( + &pi->attr->mp_nexthop_global)) { + ipv4_mapped_ipv6_to_ipv4(&pi->attr->mp_nexthop_global, + &ipv4); + p->u.prefix4 = ipv4; + p->prefixlen = IPV4_MAX_BITLEN; + p->family = AF_INET; + } else + p->u.prefix6 = + pi->attr->mp_nexthop_global; + } } break; default: