]> git.puffer.fish Git - matthieu/frr.git/commitdiff
Revert "bgpd: prefer link-local to a ipv4-mapped ipv6 global"
authorDonatas Abraitis <donatas@opensourcerouting.org>
Wed, 14 Aug 2024 17:14:59 +0000 (20:14 +0300)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Wed, 14 Aug 2024 17:14:59 +0000 (20:14 +0300)
This reverts commit 5dd731af8421e8b3070eec0b3af4ad234c95c6bb.

bgpd/bgp_nht.c

index 8ce45558e96fd95a6ff5bb78c76792586fa52f16..dc6dc54a3b07d7b9db32cb027e55318826013990 100644 (file)
@@ -320,6 +320,11 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop,
                        afi = BGP_ATTR_MP_NEXTHOP_LEN_IP6(pi->attr) ? AFI_IP6
                                                                    : AFI_IP;
 
+               /* Validation for the ipv4 mapped ipv6 nexthop. */
+               if (IS_MAPPED_IPV6(&pi->attr->mp_nexthop_global)) {
+                       afi = AFI_IP;
+               }
+
                /* This will return true if the global IPv6 NH is a link local
                 * addr */
                if (make_prefix(afi, pi, &p) < 0)
@@ -1035,11 +1040,19 @@ static int make_prefix(int afi, struct bgp_path_info *pi, struct prefix *p)
                        p->u.prefix4 = p_orig->u.prefix4;
                        p->prefixlen = p_orig->prefixlen;
                } else {
-                       if (p_orig->family == AF_EVPN)
-                               p->u.prefix4 = pi->attr->mp_nexthop_global_in;
-                       else
-                               p->u.prefix4 = pi->attr->nexthop;
-                       p->prefixlen = IPV4_MAX_BITLEN;
+                       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;
+                       } else {
+                               if (p_orig->family == AF_EVPN)
+                                       p->u.prefix4 =
+                                               pi->attr->mp_nexthop_global_in;
+                               else
+                                       p->u.prefix4 = pi->attr->nexthop;
+                               p->prefixlen = IPV4_MAX_BITLEN;
+                       }
                }
                break;
        case AFI_IP6:
@@ -1055,7 +1068,6 @@ static int make_prefix(int afi, struct bgp_path_info *pi, struct prefix *p)
                        /* If we receive MP_REACH nexthop with ::(LL)
                         * or LL(LL), use LL address as nexthop cache.
                         */
-                       p->prefixlen = IPV6_MAX_BITLEN;
                        if (pi->attr &&
                            pi->attr->mp_nexthop_len ==
                                    BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL &&
@@ -1070,22 +1082,15 @@ static int make_prefix(int afi, struct bgp_path_info *pi, struct prefix *p)
                                 pi->attr->mp_nexthop_len ==
                                         BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL) {
                                if (CHECK_FLAG(pi->attr->nh_flags,
-                                              BGP_ATTR_NH_MP_PREFER_GLOBAL)) {
-                                       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;
-                                       } else
-                                               p->u.prefix6 =
-                                                       pi->attr->mp_nexthop_global;
-                               } else
+                                              BGP_ATTR_NH_MP_PREFER_GLOBAL))
+                                       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;
+                       p->prefixlen = IPV6_MAX_BITLEN;
                }
                break;
        default: