Move <machine/in_cksum.h> to <sys/in_cksum.h>. This file is now platform
authorMatthew Dillon <dillon@dragonflybsd.org>
Sat, 14 Feb 2004 21:15:34 +0000 (21:15 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sat, 14 Feb 2004 21:15:34 +0000 (21:15 +0000)
independant.  If we want to add extreme machine specialization later on
then sys/in_cksum.h will #include machine/in_cksum.h.

Move i386/i386/in_cksum.c to netinet/in_cksum.c.  Note that netinet/in_cksum.c
already existed but was not used by the build system at all.  The move
overwrites it.  The new in_cksum.c is a portable, complete rewrite which
references core assembly (procedure call) to do 32-bit-aligned work.  See
also i386/i386/in_cksum2.s.

29 files changed:
contrib/ipfilter/ip_compat.h
sbin/natd/icmp.c
sbin/natd/natd.c
sys/conf/files
sys/conf/files.amd64
sys/conf/files.i386
sys/conf/files.pc98
sys/contrib/ipfilter/netinet/fil.c
sys/contrib/ipfilter/netinet/ip_compat.h
sys/contrib/ipfilter/netinet/ip_fil.c
sys/dev/netif/txp/if_txp.c
sys/net/ip_mroute/ip_mroute.c
sys/net/ipfw/ip_fw2.c
sys/netinet/igmp.c
sys/netinet/in_cksum.c
sys/netinet/ip_gre.c
sys/netinet/ip_icmp.c
sys/netinet/ip_input.c
sys/netinet/ip_output.c
sys/netinet/tcp_input.c
sys/netinet/tcp_output.c
sys/netinet/tcp_subr.c
sys/netinet/tcp_syncache.c
sys/netinet/udp_usrreq.c
sys/netinet6/ipsec.c
sys/netproto/ipsec/ipsec.c
sys/netproto/ipsec/ipsec_input.c
sys/netproto/ipsec/ipsec_output.c
sys/sys/in_cksum.h [new file with mode: 0644]

index c321847..eeff5dc 100644 (file)
@@ -5,7 +5,7 @@
  *
  * @(#)ip_compat.h     1.8 1/14/96
  * $Id: ip_compat.h,v 2.26.2.47 2002/10/26 06:24:42 darrenr Exp $
- * $DragonFly: src/contrib/ipfilter/Attic/ip_compat.h,v 1.3 2003/10/08 20:06:15 dillon Exp $
+ * $DragonFly: src/contrib/ipfilter/Attic/ip_compat.h,v 1.4 2004/02/14 21:12:34 dillon Exp $
  */
 
 #ifndef        __IP_COMPAT_H__
@@ -235,9 +235,8 @@ typedef      int    minor_t;
 # endif
 #endif /* __FreeBSD__ && KERNEL */
 
-#if defined(__FreeBSD_version) && (__FreeBSD_version >= 500000) && \
-    defined(_KERNEL)
-# include <machine/in_cksum.h>
+#if defined(__DragonFly__) && defined(_KERNEL)
+#include <sys/in_cksum.h>
 #endif
 
 /*
index e7edbd3..39c2842 100644 (file)
@@ -10,7 +10,7 @@
  * Ari Suutari <suutari@iki.fi>
  *
  * $FreeBSD: src/sbin/natd/icmp.c,v 1.6 1999/08/28 00:13:45 peter Exp $
- * $DragonFly: src/sbin/natd/icmp.c,v 1.2 2003/06/17 04:27:34 dillon Exp $
+ * $DragonFly: src/sbin/natd/icmp.c,v 1.3 2004/02/14 21:12:37 dillon Exp $
  */
 
 #include <stdlib.h>
@@ -31,7 +31,6 @@
 #include <netinet/in_systm.h>
 #include <netinet/ip.h>
 #include <netinet/ip_icmp.h>
-#include <machine/in_cksum.h>
 
 #include <alias.h>
 
index f1d6e21..1581e2b 100644 (file)
@@ -10,7 +10,7 @@
  * Ari Suutari <suutari@iki.fi>
  *
  * $FreeBSD: src/sbin/natd/natd.c,v 1.25.2.5 2002/02/01 09:18:32 ru Exp $
- * $DragonFly: src/sbin/natd/natd.c,v 1.3 2003/09/28 14:39:20 hmp Exp $
+ * $DragonFly: src/sbin/natd/natd.c,v 1.4 2004/02/14 21:12:37 dillon Exp $
  */
 
 #define SYSLOG_NAMES
@@ -23,7 +23,6 @@
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
 #include <netinet/ip.h>
-#include <machine/in_cksum.h>
 #include <netinet/tcp.h>
 #include <netinet/udp.h>
 #include <netinet/ip_icmp.h>
index 943c935..947a3cb 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/sys/conf/files,v 1.340.2.137 2003/06/04 17:10:30 sam Exp $
-# $DragonFly: src/sys/conf/files,v 1.47 2004/02/13 21:15:12 joerg Exp $
+# $DragonFly: src/sys/conf/files,v 1.48 2004/02/14 21:12:38 dillon Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -922,6 +922,7 @@ netinet/if_ether.c                  optional ether
 netinet/in_gif.c               optional gif inet
 netinet/igmp.c                 optional inet
 netinet/in.c                   optional inet
+netinet/in_cksum.c             optional inet
 #netinet/in_hostcache.c                optional inet
 netinet/ip_gre.c               optional gre inet
 netinet/ip_id.c                        optional inet
index 9d21924..c995e8e 100644 (file)
@@ -2,7 +2,7 @@
 # files marked standard are always included.
 #
 # $FreeBSD: src/sys/conf/files.i386,v 1.307.2.38 2003/01/02 20:41:33 kan Exp $
-# $DragonFly: src/sys/conf/Attic/files.amd64,v 1.1 2004/02/02 08:05:56 dillon Exp $
+# $DragonFly: src/sys/conf/Attic/files.amd64,v 1.2 2004/02/14 21:12:38 dillon Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -143,7 +143,6 @@ i386/i386/globals.s         standard
 i386/i386/i386-gdbstub.c       optional        ddb
 i386/i386/i686_mem.c           standard
 i386/i386/identcpu.c           standard
-i386/i386/in_cksum.c           optional        inet
 i386/i386/initcpu.c            standard
 i386/i386/k6_mem.c             standard
 # locore.s needs to be handled in Makefile to put it first.  Otherwise it's
index 690ad90..735b5c2 100644 (file)
@@ -2,7 +2,7 @@
 # files marked standard are always included.
 #
 # $FreeBSD: src/sys/conf/files.i386,v 1.307.2.38 2003/01/02 20:41:33 kan Exp $
-# $DragonFly: src/sys/conf/Attic/files.i386,v 1.12 2004/02/14 02:09:25 dillon Exp $
+# $DragonFly: src/sys/conf/Attic/files.i386,v 1.13 2004/02/14 21:12:38 dillon Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -195,7 +195,6 @@ i386/i386/globals.s         standard
 i386/i386/i386-gdbstub.c       optional        ddb
 i386/i386/i686_mem.c           standard
 i386/i386/identcpu.c           standard
-i386/i386/in_cksum.c           optional        inet
 i386/i386/in_cksum2.s          optional        inet
 i386/i386/initcpu.c            standard
 i386/i386/k6_mem.c             standard
index 0ac6db9..d3c3867 100644 (file)
@@ -4,7 +4,7 @@
 # modified for PC-9801
 #
 # $FreeBSD: src/sys/conf/files.pc98,v 1.140.2.44 2003/02/10 13:11:50 nyan Exp $
-# $DragonFly: src/sys/conf/Attic/files.pc98,v 1.4 2003/12/07 19:23:36 dillon Exp $
+# $DragonFly: src/sys/conf/Attic/files.pc98,v 1.5 2004/02/14 21:12:38 dillon Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -176,7 +176,6 @@ i386/i386/globals.s         standard
 i386/i386/i386-gdbstub.c       optional        ddb
 i386/i386/i686_mem.c           standard
 i386/i386/identcpu.c           standard
-i386/i386/in_cksum.c           optional        inet
 i386/i386/initcpu.c            standard
 i386/i386/k6_mem.c             standard
 # locore.s needs to be handled in Makefile to put it first.  Otherwise it's
index 5a05c55..ada34cf 100644 (file)
@@ -5,7 +5,7 @@
  *
  * @(#)fil.c        1.36 6/5/96 (C) 1993-2000 Darren Reed
  * $FreeBSD: src/sys/contrib/ipfilter/netinet/fil.c,v 1.23.2.6 2003/03/01 03:55:54 darrenr Exp $
- * $DragonFly: src/sys/contrib/ipfilter/netinet/fil.c,v 1.6 2004/02/12 22:35:47 joerg Exp $
+ * $DragonFly: src/sys/contrib/ipfilter/netinet/fil.c,v 1.7 2004/02/14 21:12:38 dillon Exp $
  */
 #if defined(__sgi) && (IRIX > 602)
 # include <sys/ptimers.h>
@@ -99,7 +99,7 @@
 #endif
 #include "ipl.h"
 
-#include <machine/in_cksum.h>
+#include <sys/in_cksum.h>
 
 static const char sccsid[] = "@(#)fil.c        1.36 6/5/96 (C) 1993-2000 Darren Reed";
 
index 918e6fd..0b588da 100644 (file)
@@ -6,7 +6,7 @@
  * @(#)ip_compat.h     1.8 1/14/96
  * $Id: ip_compat.h,v 2.26.2.46 2002/06/27 14:39:40 darrenr Exp $
  * $FreeBSD: src/sys/contrib/ipfilter/netinet/ip_compat.h,v 1.13.2.5 2003/03/01 03:55:54 darrenr Exp $
- * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_compat.h,v 1.9 2004/02/12 22:35:47 joerg Exp $
+ * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_compat.h,v 1.10 2004/02/14 21:12:38 dillon Exp $
  */
 
 #ifndef        __IP_COMPAT_H__
@@ -235,9 +235,8 @@ typedef      int    minor_t;
 # endif
 #endif /* __FreeBSD__ && KERNEL */
 
-#if defined(__FreeBSD_version) && (__FreeBSD_version >= 500000) && \
-    defined(_KERNEL)
-# include <machine/in_cksum.h>
+#if defined(__DragonFly__) && defined(_KERNEL)
+#include <sys/in_cksum.h>
 #endif
 
 /*
index 218f531..aafe41c 100644 (file)
@@ -6,7 +6,7 @@
  * @(#)ip_fil.c     2.41 6/5/96 (C) 1993-2000 Darren Reed
  * @(#)$Id: ip_fil.c,v 2.42.2.60 2002/08/28 12:40:39 darrenr Exp $
  * $FreeBSD: src/sys/contrib/ipfilter/netinet/ip_fil.c,v 1.25.2.6 2003/03/01 03:55:54 darrenr Exp $
- * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_fil.c,v 1.9 2004/02/12 22:35:47 joerg Exp $
+ * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_fil.c,v 1.10 2004/02/14 21:12:38 dillon Exp $
  */
 #ifndef        SOLARIS
 #define        SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
@@ -130,7 +130,7 @@ extern      int     ip6_getpmtu(struct route_in6 *, struct route_in6 *,
                            struct ifnet *, struct in6_addr *, u_long *);
 #endif
 
-#include <machine/in_cksum.h>
+#include <sys/in_cksum.h>
 
 static const char sccsid[] = "@(#)ip_fil.c     2.41 6/5/96 (C) 1993-2000 Darren Reed";
 
index 2a2d8ba..7db3f10 100644 (file)
@@ -1,6 +1,6 @@
 /*     $OpenBSD: if_txp.c,v 1.48 2001/06/27 06:34:50 kjc Exp $ */
 /*     $FreeBSD: src/sys/dev/txp/if_txp.c,v 1.4.2.4 2001/12/14 19:50:43 jlemon Exp $ */
-/*     $DragonFly: src/sys/dev/netif/txp/if_txp.c,v 1.6 2004/01/06 01:40:50 dillon Exp $ */
+/*     $DragonFly: src/sys/dev/netif/txp/if_txp.c,v 1.7 2004/02/14 21:12:38 dillon Exp $ */
 
 /*
  * Copyright (c) 2001
@@ -62,7 +62,7 @@
 #include <netinet/in_var.h>
 #include <netinet/ip.h>
 #include <netinet/if_ether.h>
-#include <machine/in_cksum.h>
+#include <sys/in_cksum.h>
 
 #include <net/if_media.h>
 
index afc3261..a053184 100644 (file)
@@ -18,7 +18,7 @@
  * bandwidth metering and signaling
  *
  * $FreeBSD: src/sys/netinet/ip_mroute.c,v 1.56.2.10 2003/08/24 21:37:34 hsu Exp $
- * $DragonFly: src/sys/net/ip_mroute/ip_mroute.c,v 1.6 2004/01/06 03:17:26 dillon Exp $
+ * $DragonFly: src/sys/net/ip_mroute/ip_mroute.c,v 1.7 2004/02/14 21:12:38 dillon Exp $
  */
 
 #include "opt_mrouting.h"
@@ -40,6 +40,7 @@
 #include <sys/syslog.h>
 #include <sys/systm.h>
 #include <sys/time.h>
+#include <sys/in_cksum.h>
 #include <net/if.h>
 #include <net/netisr.h>
 #include <net/route.h>
@@ -55,7 +56,6 @@
 #include <netinet/pim_var.h>
 #endif
 #include <netinet/udp.h>
-#include <machine/in_cksum.h>
 
 /*
  * Control debugging code for rsvp and multicast routing code.
index 3a0db31..4596f6f 100644 (file)
@@ -23,7 +23,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netinet/ip_fw2.c,v 1.6.2.12 2003/04/08 10:42:32 maxim Exp $
- * $DragonFly: src/sys/net/ipfw/ip_fw2.c,v 1.6 2004/02/13 17:45:51 joerg Exp $
+ * $DragonFly: src/sys/net/ipfw/ip_fw2.c,v 1.7 2004/02/14 21:12:38 dillon Exp $
  */
 
 #define        DEB(x)
@@ -55,6 +55,7 @@
 #include <sys/sysctl.h>
 #include <sys/syslog.h>
 #include <sys/ucred.h>
+#include <sys/in_cksum.h>
 #include <net/if.h>
 #include <net/route.h>
 #include <netinet/in.h>
@@ -75,8 +76,6 @@
 
 #include <netinet/if_ether.h> /* XXX for ETHERTYPE_IP */
 
-#include <machine/in_cksum.h>  /* XXX for in_cksum */
-
 /*
  * XXX This one should go in sys/mbuf.h. It is used to avoid that
  * a firewall-generated packet loops forever through the firewall.
index dd47cb1..765173e 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     @(#)igmp.c      8.1 (Berkeley) 7/19/93
  * $FreeBSD: src/sys/netinet/igmp.c,v 1.29.2.2 2003/01/23 21:06:44 sam Exp $
- * $DragonFly: src/sys/netinet/igmp.c,v 1.5 2004/02/14 02:09:28 dillon Exp $
+ * $DragonFly: src/sys/netinet/igmp.c,v 1.6 2004/02/14 21:12:39 dillon Exp $
  */
 
 /*
@@ -58,6 +58,7 @@
 #include <sys/protosw.h>
 #include <sys/kernel.h>
 #include <sys/sysctl.h>
+#include <sys/in_cksum.h>
 
 #include <net/if.h>
 #include <net/route.h>
@@ -70,8 +71,6 @@
 #include <netinet/igmp.h>
 #include <netinet/igmp_var.h>
 
-#include <machine/in_cksum.h>
-
 static MALLOC_DEFINE(M_IGMP, "igmp", "igmp state");
 
 static struct router_info *
index f4c305b..48b338c 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 1988, 1992, 1993
- *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 2003 Matthew Dillon <dillon@backplane.com>
+ * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *     @(#)in_cksum.c  8.1 (Berkeley) 6/10/93
- * $FreeBSD: src/sys/netinet/in_cksum.c,v 1.6 1999/08/28 00:49:16 peter Exp $
- * $DragonFly: src/sys/netinet/in_cksum.c,v 1.3 2003/07/26 21:00:04 rob Exp $
+ * $DragonFly: src/sys/netinet/in_cksum.c,v 1.4 2004/02/14 21:12:39 dillon Exp $
  */
 
 #include <sys/param.h>
+#include <sys/systm.h>
 #include <sys/mbuf.h>
+#include <sys/in_cksum.h>
+
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+
+#include <machine/endian.h>
 
 /*
- * Checksum routine for Internet Protocol family headers (Portable Version).
+ * Return the 16 bit 1's complement checksum in network byte order.  Devolve
+ * the mbuf into 32 bit aligned segments that we can pass to assembly and
+ * do the rest manually.  Even though we return a 16 bit unsigned value,
+ * we declare it as a 32 bit unsigned value to reduce unnecessary assembly
+ * conversions.
+ *
+ * Byte ordering issues.  Note two things.  First, no secondary carry occurs,
+ * and second, a one's complement checksum is endian-independant.  If we are
+ * given a data buffer in network byte order, our checksum will be in network
+ * byte order.
+ *
+ * 0xffff + 0xffff = 0xfffe + C = 0xffff (so no second carry occurs).
  *
- * This routine is very heavily used in the network
- * code and should be modified for each CPU to be as fast as possible.
+ * 0x8142 + 0x8243 = 0x0385 + C = 0x0386 (checksum is in same byte order
+ * 0x4281 + 0x4382              = 0x8603  as the data regardless of arch)
+ *
+ * This works with 16, 32, 64, etc... bits as long as we deal with the 
+ * carry when collapsing it back down to 16 bits.
  */
+__uint32_t
+in_cksum_range(struct mbuf *m, int offset, int bytes)
+{
+    __uint8_t *ptr;
+    __uint32_t sum0;
+    __uint32_t sum1;
+    int n;
+    int flip;
 
-#define ADDCARRY(x)  (x > 65535 ? x -= 65535 : x)
-#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);}
+    /*
+     * Skip fully engulfed mbufs.  Branch predict optimal.
+     */
+    while (m && offset >= m->m_len) {
+       offset -= m->m_len;
+       m = m->m_next;
+    }
 
-int
-in_cksum(m, len)
-       struct mbuf *m;
-       int len;
-{
-       u_short *w;
-       int sum = 0;
-       int mlen = 0;
-       int byte_swapped = 0;
+    /*
+     * Process the checksum for each segment.  Note that the code below is
+     * branch-predict optimal, so it's faster then you might otherwise
+     * believe.  When we are buffer-aligned but also odd-byte-aligned from
+     * the point of view of the IP packet, we accumulate to sum1 instead of
+     * sum0.
+     *
+     * Initial offsets do not pre-set flip (assert that offset is even?)
+     */
+    sum0 = 0;
+    sum1 = 0;
+    flip = 0;
+    while (bytes > 0 && m) {
+       /*
+        * Calculate pointer base and number of bytes to snarf, account
+        * for snarfed bytes.
+        */
+       ptr = mtod(m, __uint8_t *) + offset;
+       if ((n = m->m_len - offset) > bytes)
+           n = bytes;
+       bytes -= n;
 
-       union {
-               char    c[2];
-               u_short s;
-       } s_util;
-       union {
-               u_short s[2];
-               long    l;
-       } l_util;
+       /*
+        * First 16-bit-align our buffer by eating a byte if necessary,
+        * then 32-bit-align our buffer by eating a word if necessary.
+        *
+        * We are endian-sensitive when chomping a byte.  WARNING!  Be
+        * careful optimizing this!  16 ane 32 bit words must be aligned
+        * for this to be generic code.
+        */
+       if (((intptr_t)ptr & 1) && n) {
+#if BYTE_ORDER == LITTLE_ENDIAN
+           if (flip)
+               sum1 += ptr[0];
+           else
+               sum0 += ptr[0];
+#else
+           if (flip)
+               sum0 += ptr[0];
+           else
+               sum1 += ptr[0];
+#endif
+           ++ptr;
+           --n;
+           flip = 1 - flip;
+       }
+       if (((intptr_t)ptr & 2) && n > 1) {
+           if (flip)
+               sum1 += *(__uint16_t *)ptr;
+           else
+               sum0 += *(__uint16_t *)ptr;
+           ptr += 2;
+           n -= 2;
+       }
 
-       for (;m && len; m = m->m_next) {
-               if (m->m_len == 0)
-                       continue;
-               w = mtod(m, u_short *);
-               if (mlen == -1) {
-                       /*
-                        * The first byte of this mbuf is the continuation
-                        * of a word spanning between this mbuf and the
-                        * last mbuf.
-                        *
-                        * s_util.c[0] is already saved when scanning previous
-                        * mbuf.
-                        */
-                       s_util.c[1] = *(char *)w;
-                       sum += s_util.s;
-                       w = (u_short *)((char *)w + 1);
-                       mlen = m->m_len - 1;
-                       len--;
-               } else
-                       mlen = m->m_len;
-               if (len < mlen)
-                       mlen = len;
-               len -= mlen;
-               /*
-                * Force to even boundary.
-                */
-               if ((1 & (int) w) && (mlen > 0)) {
-                       REDUCE;
-                       sum <<= 8;
-                       s_util.c[0] = *(u_char *)w;
-                       w = (u_short *)((char *)w + 1);
-                       mlen--;
-                       byte_swapped = 1;
-               }
-               /*
-                * Unroll the loop to make overhead from
-                * branches &c small.
-                */
-               while ((mlen -= 32) >= 0) {
-                       sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
-                       sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7];
-                       sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11];
-                       sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15];
-                       w += 16;
-               }
-               mlen += 32;
-               while ((mlen -= 8) >= 0) {
-                       sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
-                       w += 4;
-               }
-               mlen += 8;
-               if (mlen == 0 && byte_swapped == 0)
-                       continue;
-               REDUCE;
-               while ((mlen -= 2) >= 0) {
-                       sum += *w++;
-               }
-               if (byte_swapped) {
-                       REDUCE;
-                       sum <<= 8;
-                       byte_swapped = 0;
-                       if (mlen == -1) {
-                               s_util.c[1] = *(char *)w;
-                               sum += s_util.s;
-                               mlen = 0;
-                       } else
-                               mlen = -1;
-               } else if (mlen == -1)
-                       s_util.c[0] = *(char *)w;
+       /*
+        * Process a 32-bit aligned data buffer and accumulate the result
+        * in sum0 or sum1.  Allow only one 16 bit overflow carry.
+        */
+       if (n >= 4) {
+           __uint32_t sum32;
+
+           sum32 = asm_ones32((void *)ptr, n >> 2);
+           sum32 = (sum32 >> 16) + (sum32 & 0xffff);
+           if (flip)
+               sum1 += sum32;
+           else
+               sum0 += sum32;
+           ptr += n & ~3;
+           /* n &= 3; dontcare */
        }
-       if (len)
-               printf("cksum: out of data\n");
-       if (mlen == -1) {
-               /* The last mbuf has odd # of bytes. Follow the
-                  standard (the odd byte may be shifted left by 8 bits
-                  or not as determined by endian-ness of the machine) */
-               s_util.c[1] = 0;
-               sum += s_util.s;
+
+       /*
+        * Handle oddly-sized buffers.  Handle word issues first while
+        * ptr is still aligned.
+        */
+       if (n & 2) {
+           if (flip)
+               sum1 += *(__uint16_t *)ptr;
+           else
+               sum0 += *(__uint16_t *)ptr;
+           ptr += 2;
+           /* n -= 2; dontcare */
        }
-       REDUCE;
-       return (~sum & 0xffff);
+       if (n & 1) {
+#if BYTE_ORDER == LITTLE_ENDIAN
+           if (flip)
+               sum1 += ptr[0];
+           else
+               sum0 += ptr[0];
+#else
+           if (flip)
+               sum0 += ptr[0];
+           else
+               sum1 += ptr[0];
+#endif
+           /* ++ptr; dontcare */
+           /* --n; dontcare */
+           flip = 1 - flip;
+       }
+       m = m->m_next;
+       offset = 0;
+    }
+
+    /*
+     * Due to byte aligned or oddly-sized buffers we may have a checksum
+     * in sum1 which needs to be shifted and added to our main sum.  There
+     * is a presumption here that no more then 255 overflows occured which
+     * is 255/3 byte aligned mbufs in the worst case.
+     */
+    sum0 += sum1 << 8;
+    sum0 = (sum0 >> 16) + (sum0 & 0xffff);
+    if (sum0 > 0xffff)
+       ++sum0;
+    return(~sum0 & 0xffff);
 }
+
index d5ad24b..7f595c7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * $NetBSD: ip_gre.c,v 1.21 2002/08/14 00:23:30 itojun Exp $ 
- * $DragonFly: src/sys/netinet/ip_gre.c,v 1.5 2003/09/15 23:38:14 hsu Exp $
+ * $DragonFly: src/sys/netinet/ip_gre.c,v 1.6 2004/02/14 21:12:39 dillon Exp $
  *
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -57,6 +57,7 @@
 #include <sys/time.h>
 #include <sys/kernel.h>
 #include <sys/syslog.h>
+#include <sys/in_cksum.h>
 #include <net/bpf.h>
 #include <net/ethernet.h>
 #include <net/if.h>
@@ -71,7 +72,6 @@
 #include <netinet/ip.h>
 #include <netinet/ip_var.h>
 #include <netinet/ip_gre.h>
-#include <machine/in_cksum.h>
 #else
 #error ip_gre input without IP?
 #endif
index c319bf2..f9b6d74 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)ip_icmp.c   8.2 (Berkeley) 1/4/94
  * $FreeBSD: src/sys/netinet/ip_icmp.c,v 1.39.2.19 2003/01/24 05:11:34 sam Exp $
- * $DragonFly: src/sys/netinet/ip_icmp.c,v 1.6 2004/02/14 02:09:28 dillon Exp $
+ * $DragonFly: src/sys/netinet/ip_icmp.c,v 1.7 2004/02/14 21:12:39 dillon Exp $
  */
 
 #include "opt_ipsec.h"
@@ -45,6 +45,7 @@
 #include <sys/time.h>
 #include <sys/kernel.h>
 #include <sys/sysctl.h>
+#include <sys/in_cksum.h>
 
 #include <net/if.h>
 #include <net/if_types.h>
@@ -70,8 +71,6 @@
 #define        IPSEC
 #endif
 
-#include <machine/in_cksum.h>
-
 /*
  * ICMP routines: error generation, receive packet processing, and
  * routines to turnaround packets back to the originator, and
index b3be8b0..673221e 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)ip_input.c  8.2 (Berkeley) 1/4/94
  * $FreeBSD: src/sys/netinet/ip_input.c,v 1.130.2.52 2003/03/07 07:01:28 silby Exp $
- * $DragonFly: src/sys/netinet/ip_input.c,v 1.9 2003/12/02 08:00:22 asmodai Exp $
+ * $DragonFly: src/sys/netinet/ip_input.c,v 1.10 2004/02/14 21:12:39 dillon Exp $
  */
 
 #define        _IP_VHL
@@ -58,6 +58,7 @@
 #include <sys/kernel.h>
 #include <sys/syslog.h>
 #include <sys/sysctl.h>
+#include <sys/in_cksum.h>
 
 #include <net/if.h>
 #include <net/if_types.h>
@@ -77,7 +78,6 @@
 #include <netinet/in_pcb.h>
 #include <netinet/ip_var.h>
 #include <netinet/ip_icmp.h>
-#include <machine/in_cksum.h>
 
 #include <netinet/ipprotosw.h>
 
index 2ce8424..0e03121 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)ip_output.c 8.3 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/netinet/ip_output.c,v 1.99.2.37 2003/04/15 06:44:45 silby Exp $
- * $DragonFly: src/sys/netinet/ip_output.c,v 1.9 2003/12/02 08:00:22 asmodai Exp $
+ * $DragonFly: src/sys/netinet/ip_output.c,v 1.10 2004/02/14 21:12:39 dillon Exp $
  */
 
 #define _IP_VHL
@@ -56,6 +56,7 @@
 #include <sys/socketvar.h>
 #include <sys/proc.h>
 #include <sys/sysctl.h>
+#include <sys/in_cksum.h>
 
 #include <net/if.h>
 #ifdef PFIL_HOOKS
@@ -70,8 +71,6 @@
 #include <netinet/in_var.h>
 #include <netinet/ip_var.h>
 
-#include <machine/in_cksum.h>
-
 static MALLOC_DEFINE(M_IPMOPTS, "ip_moptions", "internet multicast options");
 
 #ifdef IPSEC
index 62a3b2b..3985693 100644 (file)
@@ -33,7 +33,7 @@
  *
  *     @(#)tcp_input.c 8.12 (Berkeley) 5/24/95
  * $FreeBSD: src/sys/netinet/tcp_input.c,v 1.107.2.38 2003/05/21 04:46:41 cjc Exp $
- * $DragonFly: src/sys/netinet/tcp_input.c,v 1.12 2003/10/19 05:19:21 hsu Exp $
+ * $DragonFly: src/sys/netinet/tcp_input.c,v 1.13 2004/02/14 21:12:39 dillon Exp $
  */
 
 #include "opt_ipfw.h"          /* for ipfw_fwd         */
@@ -53,6 +53,7 @@
 #include <sys/socket.h>
 #include <sys/socketvar.h>
 #include <sys/syslog.h>
+#include <sys/in_cksum.h>
 
 #include <machine/cpu.h>       /* before tcp_seq.h, for tcp_random18() */
 
@@ -97,8 +98,6 @@ struct tcphdr tcp_savetcp;
 #include <netproto/key/key.h>
 #endif /*IPSEC*/
 
-#include <machine/in_cksum.h>
-
 MALLOC_DEFINE(M_TSEGQ, "tseg_qent", "TCP segment queue entry");
 
 static const int tcprexmtthresh = 3;
index a439275..40cda55 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)tcp_output.c        8.4 (Berkeley) 5/24/95
  * $FreeBSD: src/sys/netinet/tcp_output.c,v 1.39.2.20 2003/01/29 22:45:36 hsu Exp $
- * $DragonFly: src/sys/netinet/tcp_output.c,v 1.8 2004/02/08 00:11:02 hsu Exp $
+ * $DragonFly: src/sys/netinet/tcp_output.c,v 1.9 2004/02/14 21:12:39 dillon Exp $
  */
 
 #include "opt_inet6.h"
@@ -48,6 +48,7 @@
 #include <sys/protosw.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
+#include <sys/in_cksum.h>
 
 #include <net/route.h>
 
@@ -79,8 +80,6 @@
 #define        IPSEC
 #endif /*FAST_IPSEC*/
 
-#include <machine/in_cksum.h>
-
 #ifdef notyet
 extern struct mbuf *m_copypack();
 #endif
index 560933b..8854333 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)tcp_subr.c  8.2 (Berkeley) 5/24/95
  * $FreeBSD: src/sys/netinet/tcp_subr.c,v 1.73.2.31 2003/01/24 05:11:34 sam Exp $
- * $DragonFly: src/sys/netinet/tcp_subr.c,v 1.9 2003/11/08 07:57:51 dillon Exp $
+ * $DragonFly: src/sys/netinet/tcp_subr.c,v 1.10 2004/02/14 21:12:39 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -55,6 +55,7 @@
 #include <sys/socketvar.h>
 #include <sys/protosw.h>
 #include <sys/random.h>
+#include <sys/in_cksum.h>
 
 #include <vm/vm_zone.h>
 
 #define        IPSEC
 #endif /*FAST_IPSEC*/
 
-#include <machine/in_cksum.h>
 #include <sys/md5.h>
 
 int    tcp_mssdflt = TCP_MSS;
index 27109d1..75f3146 100644 (file)
@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netinet/tcp_syncache.c,v 1.5.2.14 2003/02/24 04:02:27 silby Exp $
- * $DragonFly: src/sys/netinet/tcp_syncache.c,v 1.9 2004/01/24 05:24:15 hsu Exp $
+ * $DragonFly: src/sys/netinet/tcp_syncache.c,v 1.10 2004/02/14 21:12:39 dillon Exp $
  */
 
 #include "opt_inet6.h"
@@ -49,6 +49,7 @@
 #include <sys/random.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
+#include <sys/in_cksum.h>
 
 #include <net/if.h>
 #include <net/route.h>
@@ -92,7 +93,6 @@
 #define        IPSEC
 #endif /*FAST_IPSEC*/
 
-#include <machine/in_cksum.h>
 #include <vm/vm_zone.h>
 
 static int tcp_syncookies = 1;
index 1e95e73..f023679 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)udp_usrreq.c        8.6 (Berkeley) 5/23/95
  * $FreeBSD: src/sys/netinet/udp_usrreq.c,v 1.64.2.18 2003/01/24 05:11:34 sam Exp $
- * $DragonFly: src/sys/netinet/udp_usrreq.c,v 1.8 2003/11/08 07:57:51 dillon Exp $
+ * $DragonFly: src/sys/netinet/udp_usrreq.c,v 1.9 2004/02/14 21:12:39 dillon Exp $
  */
 
 #include "opt_ipsec.h"
@@ -50,6 +50,7 @@
 #include <sys/socketvar.h>
 #include <sys/sysctl.h>
 #include <sys/syslog.h>
+#include <sys/in_cksum.h>
 
 #include <vm/vm_zone.h>
 
@@ -81,8 +82,6 @@
 #include <netinet6/ipsec.h>
 #endif /*IPSEC*/
 
-#include <machine/in_cksum.h>
-
 /*
  * UDP protocol implementation.
  * Per RFC 768, August, 1980.
index cfc23e9..2d327d2 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/netinet6/ipsec.c,v 1.3.2.12 2003/05/06 06:46:58 suz Exp $     */
-/*     $DragonFly: src/sys/netinet6/ipsec.c,v 1.4 2003/08/23 11:02:45 rob Exp $        */
+/*     $DragonFly: src/sys/netinet6/ipsec.c,v 1.5 2004/02/14 21:15:31 dillon Exp $     */
 /*     $KAME: ipsec.c,v 1.103 2001/05/24 07:14:18 sakane Exp $ */
 
 /*
@@ -53,6 +53,7 @@
 #include <sys/syslog.h>
 #include <sys/sysctl.h>
 #include <sys/proc.h>
+#include <sys/in_cksum.h>
 
 #include <net/if.h>
 #include <net/route.h>
 #include <netproto/key/keydb.h>
 #include <netproto/key/key_debug.h>
 
-#include <machine/in_cksum.h>
-
 #include <net/net_osdep.h>
 
 #ifdef IPSEC_DEBUG
index 00c1554..da69c0b 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/netipsec/ipsec.c,v 1.2.2.1 2003/01/24 05:11:35 sam Exp $      */
-/*     $DragonFly: src/sys/netproto/ipsec/ipsec.c,v 1.4 2003/08/23 10:06:23 rob Exp $  */
+/*     $DragonFly: src/sys/netproto/ipsec/ipsec.c,v 1.5 2004/02/14 21:15:33 dillon Exp $       */
 /*     $KAME: ipsec.c,v 1.103 2001/05/24 07:14:18 sakane Exp $ */
 
 /*
@@ -53,6 +53,7 @@
 #include <sys/syslog.h>
 #include <sys/sysctl.h>
 #include <sys/proc.h>
+#include <sys/in_cksum.h>
 
 #include <net/if.h>
 #include <net/route.h>
@@ -91,8 +92,6 @@
 
 #include "xform.h"
 
-#include <machine/in_cksum.h>
-
 #include <net/net_osdep.h>
 
 #ifdef IPSEC_DEBUG
index db28ecd..8188c77 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/netipsec/ipsec_input.c,v 1.2.4.2 2003/03/28 20:32:53 sam Exp $        */
-/*     $DragonFly: src/sys/netproto/ipsec/ipsec_input.c,v 1.4 2003/11/09 02:22:36 dillon Exp $ */
+/*     $DragonFly: src/sys/netproto/ipsec/ipsec_input.c,v 1.5 2004/02/14 21:15:33 dillon Exp $ */
 /*     $OpenBSD: ipsec_input.c,v 1.63 2003/02/20 18:35:43 deraadt Exp $        */
 /*
  * The authors of this code are John Ioannidis (ji@tla.org),
@@ -54,6 +54,7 @@
 #include <sys/socket.h>
 #include <sys/errno.h>
 #include <sys/syslog.h>
+#include <sys/in_cksum.h>
 
 #include <net/if.h>
 #include <net/route.h>
@@ -89,7 +90,6 @@
 #include "xform.h"
 #include <netinet6/ip6protosw.h>
 
-#include <machine/in_cksum.h>
 #include <machine/stdarg.h>
 
 #include <net/net_osdep.h>
index 79c793d..8c27519 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netipsec/ipsec_output.c,v 1.3.2.2 2003/03/28 20:32:53 sam Exp $
- * $DragonFly: src/sys/netproto/ipsec/ipsec_output.c,v 1.3 2003/08/07 21:17:37 dillon Exp $
+ * $DragonFly: src/sys/netproto/ipsec/ipsec_output.c,v 1.4 2004/02/14 21:15:33 dillon Exp $
  */
 
 /*
@@ -42,6 +42,7 @@
 #include <sys/socket.h>
 #include <sys/errno.h>
 #include <sys/syslog.h>
+#include <sys/in_cksum.h>
 
 #include <net/if.h>
 #include <net/route.h>
@@ -79,8 +80,6 @@
 #include "keydb.h"
 #include "key_debug.h"
 
-#include <machine/in_cksum.h>
-
 int
 ipsec_process_done(struct mbuf *m, struct ipsecrequest *isr)
 {
diff --git a/sys/sys/in_cksum.h b/sys/sys/in_cksum.h
new file mode 100644 (file)
index 0000000..f94588a
--- /dev/null
@@ -0,0 +1,101 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Copyright (c) 2004 Matthew Dillon, All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     from tahoe:     in_cksum.c      1.2     86/01/05
+ *     from:           @(#)in_cksum.c  1.3 (Berkeley) 1/19/91
+ *     from: Id: in_cksum.c,v 1.8 1995/12/03 18:35:19 bde Exp
+ * $FreeBSD: src/sys/i386/include/in_cksum.h,v 1.7.2.2 2002/07/02 04:03:04 jdp Exp $
+ * $DragonFly: src/sys/sys/in_cksum.h,v 1.1 2004/02/14 21:15:34 dillon Exp $
+ */
+
+#ifndef _SYS_IN_CKSUM_H_
+#define        _SYS_IN_CKSUM_H_
+
+#ifdef _KERNEL
+
+struct ip;
+struct mbuf;
+
+__uint32_t in_cksum_range(struct mbuf *m, int offset, int bytes);
+__uint32_t asm_ones32(const void *buf, int count);     /* in 32 bit words */
+
+static __inline u_int
+in_cksum(struct mbuf *m, int len)
+{
+    return(in_cksum_range(m, 0, len));
+}
+
+static __inline u_int
+in_cksum_skip(struct mbuf *m, int len, int skip)
+{
+    return(in_cksum_range(m, skip, len - skip));
+}
+       
+static __inline u_int
+in_cksum_hdr(const struct ip *ip)
+{
+    __uint32_t sum;
+
+    sum = asm_ones32((const void *)ip, 5);     /* 5x4 = 20 bytes */
+    sum = (sum >> 16) + (sum & 0xFFFF);
+    if (sum > 0xFFFF)
+       ++sum;
+    return(~sum & 0xFFFF);
+}
+
+#endif
+
+static __inline u_short
+in_addword(u_short sum, u_short b)
+{
+    /* __volatile is necessary because the condition codes are used. */
+    __asm __volatile ("addw %1, %0; adcw $0,%0" : "+r" (sum) : "r" (b));
+
+    return (sum);
+}
+
+static __inline u_short
+in_pseudo(u_int sum, u_int b, u_int c)
+{
+    /* __volatile is necessary because the condition codes are used. */
+    __asm __volatile ("addl %1,%0; adcl %2,%0; adcl $0,%0" 
+                       : "+r" (sum) 
+                       : "g" (b), "g" (c));
+    sum = (sum & 0xffff) + (sum >> 16);
+    if (sum > 0xffff)
+       sum -= 0xffff;
+    return (sum);
+}
+
+#endif /* _MACHINE_IN_CKSUM_H_ */