git: 7d98cc096b99 - main - Fix ipfw fwd that doesn't work in some cases
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 11 Apr 2022 11:25:13 UTC
The branch main has been updated by ae: URL: https://cgit.FreeBSD.org/src/commit/?id=7d98cc096b995ca3bfd85277ed009b0f872c3e1b commit 7d98cc096b995ca3bfd85277ed009b0f872c3e1b Author: Andrey V. Elsukov <ae@FreeBSD.org> AuthorDate: 2022-04-01 13:49:25 +0000 Commit: Andrey V. Elsukov <ae@FreeBSD.org> CommitDate: 2022-04-11 11:16:43 +0000 Fix ipfw fwd that doesn't work in some cases For IPv4 use dst pointer as destination address in fib4_lookup(). It keeps destination address from IPv4 header and can be changed when PACKET_TAG_IPFORWARD tag was set by packet filter. For IPv6 override destination address with address from dst_sa.sin6_addr, that was set from PACKET_TAG_IPFORWARD tag. Reviewed by: eugen MFC after: 1 week PR: 256828, 261697, 255705 Differential Revision: https://reviews.freebsd.org/D34732 --- sys/netinet/ip_output.c | 2 +- sys/netinet6/ip6_output.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c index 818d115d8a2d..b68a6536c8b8 100644 --- a/sys/netinet/ip_output.c +++ b/sys/netinet/ip_output.c @@ -513,7 +513,7 @@ again: } else { struct nhop_object *nh; - nh = fib4_lookup(M_GETFIB(m), ip->ip_dst, 0, NHR_NONE, + nh = fib4_lookup(M_GETFIB(m), dst->sin_addr, 0, NHR_NONE, m->m_pkthdr.flowid); if (nh == NULL) { #if defined(IPSEC) || defined(IPSEC_SUPPORT) diff --git a/sys/netinet6/ip6_output.c b/sys/netinet6/ip6_output.c index 406776bdb5a4..818b08c3ab40 100644 --- a/sys/netinet6/ip6_output.c +++ b/sys/netinet6/ip6_output.c @@ -772,6 +772,8 @@ again: ia = ifatoia6(nh->nh_ifa); if (nh->nh_flags & NHF_GATEWAY) dst->sin6_addr = nh->gw6_sa.sin6_addr; + else if (fwd_tag != NULL) + dst->sin6_addr = dst_sa.sin6_addr; nonh6lookup: ; }