Source-Changes-HG archive

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

[src/trunk]: src/sys Add infrastructure to allow ports to override build of i...



details:   https://anonhg.NetBSD.org/src/rev/3364d587f994
branches:  trunk
changeset: 510305:3364d587f994
user:      sommerfeld <sommerfeld%NetBSD.org@localhost>
date:      Sat May 26 17:46:11 2001 +0000

description:
Add infrastructure to allow ports to override build of in6_cksum.c by
enabling the INET6_MD_CKSUM option, which is defopted into opt_inet.h.
Supply an i386 assembly version of in6_cksum in in_cksum.s; on
P6-family cpu's, this is is roughly 20% faster than the C code in
sys/netinet6 for ethernet-mtu-sized mbufs in L1 cache.  Turn on
INET6_MD_CKSUM in i386/conf/std.i386

While we're here, also nuke some now-obsolete XXX comments from
in_cksum.s.

diffstat:

 sys/arch/i386/conf/std.i386    |   4 +-
 sys/arch/i386/i386/genassym.cf |   6 ++-
 sys/arch/i386/i386/in_cksum.s  |  76 ++++++++++++++++++++++++++++++++++++++---
 sys/conf/files                 |   6 +-
 4 files changed, 81 insertions(+), 11 deletions(-)

diffs (180 lines):

diff -r 31b014efa33a -r 3364d587f994 sys/arch/i386/conf/std.i386
--- a/sys/arch/i386/conf/std.i386       Sat May 26 16:49:58 2001 +0000
+++ b/sys/arch/i386/conf/std.i386       Sat May 26 17:46:11 2001 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: std.i386,v 1.19 2000/06/22 20:27:53 fvdl Exp $
+# $NetBSD: std.i386,v 1.20 2001/05/26 17:46:12 sommerfeld Exp $
 #
 # standard, required NetBSD/i386 'options'
 
@@ -7,3 +7,5 @@
 options        EXEC_AOUT       # exec a.out binaries
 options                EXEC_ELF32      # exec ELF binaries
 options        EXEC_SCRIPT     # exec #! scripts
+
+options                INET6_MD_CKSUM  # machine-dependant code for in6_cksum
diff -r 31b014efa33a -r 3364d587f994 sys/arch/i386/i386/genassym.cf
--- a/sys/arch/i386/i386/genassym.cf    Sat May 26 16:49:58 2001 +0000
+++ b/sys/arch/i386/i386/genassym.cf    Sat May 26 17:46:11 2001 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: genassym.cf,v 1.26 2001/04/14 13:56:02 augustss Exp $
+#      $NetBSD: genassym.cf,v 1.27 2001/05/26 17:46:12 sommerfeld Exp $
 
 #
 # Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -89,6 +89,7 @@
 include <netinet/in.h>
 include <netinet/in_systm.h>
 include <netinet/ip.h>
+include <netinet/ip6.h>
 include <netinet/ip_var.h>
 
 include <uvm/uvm.h>
@@ -158,6 +159,9 @@
 define IP_SRC                  offsetof(struct ip, ip_src)
 define IP_DST                  offsetof(struct ip, ip_dst)
 
+define IP6_SRC                 offsetof(struct ip6_hdr, ip6_src)
+define IP6_DST                 offsetof(struct ip6_hdr, ip6_dst)
+
 define V_TRAP                  offsetof(struct uvmexp, traps)
 define V_INTR                  offsetof(struct uvmexp, intrs)
 
diff -r 31b014efa33a -r 3364d587f994 sys/arch/i386/i386/in_cksum.s
--- a/sys/arch/i386/i386/in_cksum.s     Sat May 26 16:49:58 2001 +0000
+++ b/sys/arch/i386/i386/in_cksum.s     Sat May 26 17:46:11 2001 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in_cksum.s,v 1.15 2001/05/23 15:56:51 sommerfeld Exp $ */
+/*     $NetBSD: in_cksum.s,v 1.16 2001/05/26 17:46:12 sommerfeld Exp $ */
 
 /*-
  * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -69,6 +69,8 @@
  * SUCH DAMAGE.
  */
 
+#include "opt_inet.h"
+       
 #include <machine/asm.h>
 #include "assym.h"
 
@@ -124,7 +126,71 @@
        addw    %dx, %ax        ; \
        adcw    $0, %ax
 
-/* XXX There should really be a section 9 for this. --PM, May 21, 2001 */
+
+/*
+ * XXX KAME handles link-local scopes in a way which causes us great pain.
+ * we need to special-case link-local addresses and not include the scope id
+ * as part of the transport-layer pseudoheader.
+ * Both ff02::/16 and fe80::/10 get this treatment.
+ *
+ * so, big-endian, this would be:      
+ * (s6_addr32[0] & 0xffc00000) == 0xfe800000
+ * (s6_addr32[0] & 0xff0f) == 0xff020000
+ * since we're little-endian,
+ * (s6_addr32[0] & 0x0000c0ff) == 0x000080fe
+ * (s6_addr32[0] & 0x00000fff) == 0x000002ff
+ */
+       
+#define ADD6SCOPE(n) \
+       movw    n(%ebx), %cx    ; \
+       addl    %ecx,%eax       ; \
+       andl    $0xc0ff,%ecx    ; \
+       cmpl    $0x80fe,%ecx    ; \
+       je      1f              ; \
+       movw    n(%ebx), %cx    ; \
+       andl    $0xfff,%ecx     ; \
+       cmpl    $0x2ff,%ecx     ; \
+       je      1f              ; \
+       movw    n+2(%ebx),%cx   ; \
+       addl    %ecx,%eax       ; \
+1:
+       
+#if defined(INET6) && defined(INET6_MD_CKSUM)
+/*
+ * XXX does not deal with jumbograms.
+ */
+/* LINTSTUB: Func: int in6_cksum(struct mbuf *m, u_int8_t nxt, int off, int len) */
+ENTRY(in6_cksum)
+       pushl   %ebp
+       pushl   %ebx
+       pushl   %esi
+
+       movl    16(%esp), %ebp
+       movzbl  20(%esp), %eax          /* sum = nxt */
+       movl    24(%esp), %edx          /* %edx = off */
+       movl    28(%esp), %esi          /* %esi = len */
+       testl   %eax, %eax
+       jz      mbuf_loop_0             /* skip if nxt == 0 */
+       movl    M_DATA(%ebp), %ebx
+       addl    %esi, %eax              /* sum += len */
+       shll    $8, %eax                /* sum = htons(sum) */
+       xorl    %ecx,%ecx               
+       ADD6SCOPE(IP6_SRC)
+       ADD6SCOPE(IP6_DST)
+       ADD(IP6_SRC+4)                  /* sum += ip6->ip6_src */
+       ADC(IP6_SRC+8)                  /* sum += ip6->ip6_src */
+       ADC(IP6_SRC+12)                 /* sum += ip6->ip6_src */
+       ADC(IP6_DST+4)                  /* sum += ip6->ip_dst */
+       ADC(IP6_DST+8)                  /* sum += ip6->ip_dst */
+       ADC(IP6_DST+12)                 /* sum += ip6->ip_dst */
+       
+       MOP
+#ifdef INET
+       jmp     mbuf_loop_0
+#endif
+#endif
+
+#ifdef INET
 /* LINTSTUB: Func: int in4_cksum(struct mbuf *m, u_int8_t nxt, int off, int len) */
 ENTRY(in4_cksum)
        pushl   %ebp
@@ -144,7 +210,7 @@
        ADD(IP_SRC)                     /* sum += ip->ip_src */
        ADC(IP_DST)                     /* sum += ip->ip_dst */
        MOP
-
+#endif
 mbuf_loop_0:
        testl   %ebp, %ebp
        jz      out_of_mbufs
@@ -170,9 +236,7 @@
        jmp     in4_entry
 
 
-/* XXX There should really be a section 9 for this. --PM, May 21, 2001 */
-/* XXX The prototype below deserves better parameter names. */
-/* LINTSTUB: Func: int in_cksum(struct mbuf *m, int i) */
+/* LINTSTUB: Func: int in_cksum(struct mbuf *m, int len) */
 ENTRY(in_cksum)
        pushl   %ebp
        pushl   %ebx
diff -r 31b014efa33a -r 3364d587f994 sys/conf/files
--- a/sys/conf/files    Sat May 26 16:49:58 2001 +0000
+++ b/sys/conf/files    Sat May 26 17:46:11 2001 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files,v 1.441 2001/05/18 19:59:03 matt Exp $
+#      $NetBSD: files,v 1.442 2001/05/26 17:46:11 sommerfeld Exp $
 
 #      @(#)files.newconf       7.5 (Berkeley) 5/10/93
 
@@ -55,7 +55,7 @@
                                COMPAT_13 COMPAT_14 COMPAT_15 COMPAT_NOMID
 
 # networking protocols
-defopt opt_inet.h      INET INET6
+defopt opt_inet.h      INET INET6 INET6_MD_CKSUM
 defopt opt_ipsec.h     IPSEC IPSEC_ESP
 defopt opt_inet_conf.h SUBNETSARELOCAL HOSTZEROBROADCAST
 defopt opt_atalk.h     NETATALK
@@ -1039,7 +1039,7 @@
 file   netinet6/frag6.c                inet6
 file   netinet6/icmp6.c                inet6
 file   netinet6/in6.c                  inet6
-file   netinet6/in6_cksum.c            inet6
+file   netinet6/in6_cksum.c            inet6 & !inet6_md_cksum
 file   netinet6/in6_gif.c              gif & inet6
 file   netinet6/in6_ifattach.c         inet6
 file   netinet6/in6_pcb.c              inet6



Home | Main Index | Thread Index | Old Index