summaryrefslogtreecommitdiffstats
path: root/sys/netpfil
diff options
context:
space:
mode:
authorkp <kp@FreeBSD.org>2015-11-11 12:36:42 +0000
committerkp <kp@FreeBSD.org>2015-11-11 12:36:42 +0000
commit2867f2c1d4795c2446a1c1d0b30db57d3aaca364 (patch)
tree47d5ec7564a5fe96005def26bc2ed1eae1371ee1 /sys/netpfil
parent9c319c0ee46b77f68febe6ec66b2e787d91e1627 (diff)
downloadFreeBSD-src-2867f2c1d4795c2446a1c1d0b30db57d3aaca364.zip
FreeBSD-src-2867f2c1d4795c2446a1c1d0b30db57d3aaca364.tar.gz
MFC r290161:
pf: Fix IPv6 checksums with route-to. When using route-to (or reply-to) pf sends the packet directly to the output interface. If that interface doesn't support checksum offloading the checksum has to be calculated in software. That was already done in the IPv4 case, but not for the IPv6 case. As a result we'd emit packets with pseudo-header checksums (i.e. incorrect checksums). This issue was exposed by the changes in r289316 when pf stopped performing full checksum calculations for all packets. Submitted by: Luoqi Chen
Diffstat (limited to 'sys/netpfil')
-rw-r--r--sys/netpfil/pf/pf.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c
index 8f3a5ed..48da880 100644
--- a/sys/netpfil/pf/pf.c
+++ b/sys/netpfil/pf/pf.c
@@ -5576,6 +5576,13 @@ pf_route6(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
if (ifp->if_flags & IFF_LOOPBACK)
m0->m_flags |= M_SKIP_FIREWALL;
+ if (m0->m_pkthdr.csum_flags & CSUM_DELAY_DATA_IPV6 &
+ ~ifp->if_hwassist) {
+ uint32_t plen = m0->m_pkthdr.len - sizeof(*ip6);
+ in6_delayed_cksum(m0, plen, sizeof(struct ip6_hdr));
+ m0->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA_IPV6;
+ }
+
/*
* If the packet is too large for the outgoing interface,
* send back an icmp6 error.
OpenPOWER on IntegriCloud