Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/net/npf Optimise checksum fixup routines:



details:   https://anonhg.NetBSD.org/src/rev/616419caabaf
branches:  trunk
changeset: 791518:616419caabaf
user:      rmind <rmind%NetBSD.org@localhost>
date:      Fri Nov 22 01:48:36 2013 +0000

description:
Optimise checksum fixup routines:
- npf_fixup16_cksum: 1's complement sum is endian-independent.
- npf_fixup32_cksum: the first 32->16 bit reduction is not needed.

Pointed out by Valery Ushakov.

diffstat:

 sys/net/npf/npf_inet.c |  29 ++++++++++++++++++++---------
 1 files changed, 20 insertions(+), 9 deletions(-)

diffs (67 lines):

diff -r 65d430a13988 -r 616419caabaf sys/net/npf/npf_inet.c
--- a/sys/net/npf/npf_inet.c    Fri Nov 22 01:24:21 2013 +0000
+++ b/sys/net/npf/npf_inet.c    Fri Nov 22 01:48:36 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: npf_inet.c,v 1.26 2013/11/22 01:24:21 rmind Exp $      */
+/*     $NetBSD: npf_inet.c,v 1.27 2013/11/22 01:48:36 rmind Exp $      */
 
 /*-
  * Copyright (c) 2009-2012 The NetBSD Foundation, Inc.
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npf_inet.c,v 1.26 2013/11/22 01:24:21 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npf_inet.c,v 1.27 2013/11/22 01:48:36 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -60,7 +60,7 @@
 #include "npf_impl.h"
 
 /*
- * npf_fixup{16,32}_cksum: update IPv4 checksum.
+ * npf_fixup{16,32}_cksum: incremental update of the Internet checksum.
  */
 
 uint16_t
@@ -71,22 +71,33 @@
        /*
         * RFC 1624:
         *      HC' = ~(~HC + ~m + m')
+        *
+        * Note: 1's complement sum is endian-independent (RFC 1071, page 2).
         */
-       sum = ~ntohs(cksum) & 0xffff;
-       sum += (~ntohs(odatum) & 0xffff) + ntohs(ndatum);
+       sum = ~cksum & 0xffff;
+       sum += (~odatum & 0xffff) + ndatum;
        sum = (sum >> 16) + (sum & 0xffff);
        sum += (sum >> 16);
 
-       return htons(~sum & 0xffff);
+       return ~sum & 0xffff;
 }
 
 uint16_t
 npf_fixup32_cksum(uint16_t cksum, uint32_t odatum, uint32_t ndatum)
 {
+       uint32_t sum;
 
-       cksum = npf_fixup16_cksum(cksum, odatum & 0xffff, ndatum & 0xffff);
-       cksum = npf_fixup16_cksum(cksum, odatum >> 16, ndatum >> 16);
-       return cksum;
+       /*
+        * Checksum 32-bit datum as as two 16-bit.  Note, the first
+        * 32->16 bit reduction is not necessary.
+        */
+       sum = ~cksum & 0xffff;
+       sum += (~odatum & 0xffff) + (ndatum & 0xffff);
+
+       sum += (~odatum >> 16) + (ndatum >> 16);
+       sum = (sum >> 16) + (sum & 0xffff);
+       sum += (sum >> 16);
+       return ~sum & 0xffff;
 }
 
 /*



Home | Main Index | Thread Index | Old Index