summaryrefslogtreecommitdiffstats
path: root/sys/contrib
diff options
context:
space:
mode:
authormlaier <mlaier@FreeBSD.org>2007-07-03 11:50:02 +0000
committermlaier <mlaier@FreeBSD.org>2007-07-03 11:50:02 +0000
commita8f964c8c62b86f839eb9871bc1603f00cd03c6b (patch)
treeefb4cd885e19eac66324810d5a9ae47e174c7a58 /sys/contrib
parent7bd493c8303ecccabb6c496bd13a245bd8af916c (diff)
downloadFreeBSD-src-a8f964c8c62b86f839eb9871bc1603f00cd03c6b.zip
FreeBSD-src-a8f964c8c62b86f839eb9871bc1603f00cd03c6b.tar.gz
Fix hardware checksum verification on fragments.
MFC after: 7 days Reported/tested by: Hugo Koji Kobayashi, Vadym Chepkov Reviewed/help by: yongari Approved by: re (kensmith)
Diffstat (limited to 'sys/contrib')
-rw-r--r--sys/contrib/pf/net/pf_norm.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/contrib/pf/net/pf_norm.c b/sys/contrib/pf/net/pf_norm.c
index 98ed5fb..0153644 100644
--- a/sys/contrib/pf/net/pf_norm.c
+++ b/sys/contrib/pf/net/pf_norm.c
@@ -566,8 +566,17 @@ pf_reassemble(struct mbuf **m0, struct pf_fragment **frag,
m2 = frent->fr_m;
pool_put(&pf_frent_pl, frent);
pf_nfrents--;
+#ifdef __FreeBSD__
+ m->m_pkthdr.csum_flags &= m2->m_pkthdr.csum_flags;
+ m->m_pkthdr.csum_data += m2->m_pkthdr.csum_data;
+#endif
m_cat(m, m2);
}
+#ifdef __FreeBSD__
+ while (m->m_pkthdr.csum_data & 0xffff0000)
+ m->m_pkthdr.csum_data = (m->m_pkthdr.csum_data & 0xffff) +
+ (m->m_pkthdr.csum_data >> 16);
+#endif
ip->ip_src = (*frag)->fr_src;
ip->ip_dst = (*frag)->fr_dst;
OpenPOWER on IntegriCloud