Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Sep 2021 06:39:17 GMT
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 26302099fb91 - stable/13 - ipfw_nat64: fix direct output mode
Message-ID:  <202109030639.1836dHV2044774@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by ae:

URL: https://cgit.FreeBSD.org/src/commit/?id=26302099fb9176a33936af002fa6de6864cea6b2

commit 26302099fb9176a33936af002fa6de6864cea6b2
Author:     Andrey V. Elsukov <ae@FreeBSD.org>
AuthorDate: 2021-08-26 10:48:23 +0000
Commit:     Andrey V. Elsukov <ae@FreeBSD.org>
CommitDate: 2021-09-03 06:35:43 +0000

    ipfw_nat64: fix direct output mode
    
    In nat64_find_route[46] handle NHF_GATEWAY flag and use destination
    address from next hop to do link layer address lookup.
    
    PR:             255928
    Reviewed by:    melifaro
    Obtained from:  Yandex LLC
    Sponsored by:   Yandex LLC
    Differential Revision:  https://reviews.freebsd.org/D31680
    
    (cherry picked from commit da3a09d8941dc29f20447e263b3a6d60370c6203)
---
 sys/netpfil/ipfw/nat64/nat64_translate.c | 32 ++++++++++++++------------------
 1 file changed, 14 insertions(+), 18 deletions(-)

diff --git a/sys/netpfil/ipfw/nat64/nat64_translate.c b/sys/netpfil/ipfw/nat64/nat64_translate.c
index 29666a7d3a9a..aa6f47656d9d 100644
--- a/sys/netpfil/ipfw/nat64/nat64_translate.c
+++ b/sys/netpfil/ipfw/nat64/nat64_translate.c
@@ -622,27 +622,22 @@ static struct nhop_object *
 nat64_find_route6(struct sockaddr_in6 *dst, struct mbuf *m)
 {
 	struct nhop_object *nh;
+
 	NET_EPOCH_ASSERT();
-	nh = fib6_lookup(M_GETFIB(m), &dst->sin6_addr, 0, 0, 0);
+	nh = fib6_lookup(M_GETFIB(m), &dst->sin6_addr, 0, NHR_NONE, 0);
 	if (nh == NULL)
-		return NULL;
+		return (NULL);
 	if (nh->nh_flags & (NHF_BLACKHOLE | NHF_REJECT))
-		return NULL;
-	/*
-	 * XXX: we need to use destination address with embedded scope
-	 * zone id, because LLTABLE uses such form of addresses for lookup.
-	 */
+		return (NULL);
+
 	dst->sin6_family = AF_INET6;
 	dst->sin6_len = sizeof(*dst);
-	dst->sin6_addr = ifatoia6(nh->nh_ifa)->ia_addr.sin6_addr;
-	if (IN6_IS_SCOPE_LINKLOCAL(&dst->sin6_addr))
-		dst->sin6_addr.s6_addr16[1] =
-		    htons(nh->nh_ifp->if_index & 0xffff);
+	if (nh->nh_flags & NHF_GATEWAY)
+		dst->sin6_addr = nh->gw6_sa.sin6_addr;
 	dst->sin6_port = 0;
 	dst->sin6_scope_id = 0;
 	dst->sin6_flowinfo = 0;
-
-	return nh;
+	return (nh);
 }
 
 #define	NAT64_ICMP6_PLEN	64
@@ -776,17 +771,18 @@ nat64_find_route4(struct sockaddr_in *dst, struct mbuf *m)
 	struct nhop_object *nh;
 
 	NET_EPOCH_ASSERT();
-	nh = fib4_lookup(M_GETFIB(m), dst->sin_addr, 0, 0, 0);
+	nh = fib4_lookup(M_GETFIB(m), dst->sin_addr, 0, NHR_NONE, 0);
 	if (nh == NULL)
-		return NULL;
+		return (NULL);
 	if (nh->nh_flags & (NHF_BLACKHOLE | NHF_BROADCAST | NHF_REJECT))
-		return NULL;
+		return (NULL);
 
 	dst->sin_family = AF_INET;
 	dst->sin_len = sizeof(*dst);
-	dst->sin_addr = IA_SIN(nh->nh_ifa)->sin_addr;
+	if (nh->nh_flags & NHF_GATEWAY)
+		dst->sin_addr = nh->gw4_sa.sin_addr;
 	dst->sin_port = 0;
-	return nh;
+	return (nh);
 }
 
 #define	NAT64_ICMP_PLEN	64



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202109030639.1836dHV2044774>