diff options
author | Cy Schubert <cy@FreeBSD.org> | 2019-07-12 01:59:08 +0000 |
---|---|---|
committer | Cy Schubert <cy@FreeBSD.org> | 2019-07-12 01:59:08 +0000 |
commit | 75118b47fc3524bfbce5e5144a970f5acaaa7450 (patch) | |
tree | 54fff9615c5697d6c94a206b0163e60e362cbb05 /sys/contrib/ipfilter/netinet/fil.c | |
parent | 1ea717577ff49c661edf602ce7e361345165c52b (diff) | |
download | src-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.c | 55 |
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 |