aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/ipfilter/netinet/fil.c
diff options
context:
space:
mode:
authorCy Schubert <cy@FreeBSD.org>2019-07-12 01:59:08 +0000
committerCy Schubert <cy@FreeBSD.org>2019-07-12 01:59:08 +0000
commit75118b47fc3524bfbce5e5144a970f5acaaa7450 (patch)
tree54fff9615c5697d6c94a206b0163e60e362cbb05 /sys/contrib/ipfilter/netinet/fil.c
parent1ea717577ff49c661edf602ce7e361345165c52b (diff)
downloadsrc-75118b47fc3524bfbce5e5144a970f5acaaa7450.tar.gz
src-75118b47fc3524bfbce5e5144a970f5acaaa7450.zip
Move the new ipf_pcksum6() function from ip_fil_freebsd.c to fil.c.
The reason for this is that ipftest(8), which still works on FreeBSD-11, fails to link to it, breaking stable/11 builds. ipftest(8) was broken (segfault) sometime during the FreeBSD-12 cycle. glebius@ suggested we disable building it until I can get around to fixing it. Hence this was not caught in -current. The intention is to fix ipftest(8) as it is used by the netbsd-tests (imported by ngie@ many moons ago) for regression testing. MFC after: immediately
Notes
Notes: svn path=/head/; revision=349929
Diffstat (limited to 'sys/contrib/ipfilter/netinet/fil.c')
-rw-r--r--sys/contrib/ipfilter/netinet/fil.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/sys/contrib/ipfilter/netinet/fil.c b/sys/contrib/ipfilter/netinet/fil.c
index 0a956238297d..243dbbd8c51b 100644
--- a/sys/contrib/ipfilter/netinet/fil.c
+++ b/sys/contrib/ipfilter/netinet/fil.c
@@ -179,6 +179,10 @@ static int ipf_updateipid __P((fr_info_t *));
static int ipf_settimeout __P((struct ipf_main_softc_s *,
struct ipftuneable *,
ipftuneval_t *));
+#ifdef USE_INET6
+static u_int ipf_pcksum6 __P((fr_info_t *, ip6_t *,
+ u_int32_t, u_int32_t));
+#endif
#if !defined(_KERNEL) || SOLARIS
static int ppsratecheck(struct timeval *, int *, int);
#endif
@@ -10226,4 +10230,55 @@ ipf_inet6_mask_del(bits, mask, mtab)
mtab->imt6_max--;
ASSERT(mtab->imt6_max >= 0);
}
+
+#ifdef _KERNEL
+static u_int
+ipf_pcksum6(fin, ip6, off, len)
+ fr_info_t *fin;
+ ip6_t *ip6;
+ u_int32_t off;
+ u_int32_t len;
+{
+ struct mbuf *m;
+ int sum;
+
+ m = fin->fin_m;
+ if (m->m_len < sizeof(struct ip6_hdr)) {
+ return 0xffff;
+ }
+
+ sum = in6_cksum(m, ip6->ip6_nxt, off, len);
+ return(sum);
+}
+#else
+static u_int
+ipf_pcksum6(fin, ip6, off, len)
+ fr_info_t *fin;
+ ip6_t *ip6;
+ u_int32_t off;
+ u_int32_t len;
+{
+ u_short *sp;
+ u_int sum;
+
+ sp = (u_short *)&ip6->ip6_src;
+ sum = *sp++; /* ip6_src */
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++; /* ip6_dst */
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ return(ipf_pcksum(fin, off, sum));
+}
+#endif
#endif