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.
This commit is contained in:
sommerfeld 2001-05-26 17:46:11 +00:00
parent 839708d0cf
commit bdecf91bef
4 changed files with 81 additions and 11 deletions

View File

@ -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 @@ machine i386
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

View File

@ -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 <sys/mbuf.h>
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 M_NEXT offsetof(struct mbuf, m_next)
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)

View File

@ -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 @@ ENTRY(in4_cksum)
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 @@ mbuf_loop_0:
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

View File

@ -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 @@ defopt opt_compat_netbsd.h COMPAT_09 COMPAT_10 COMPAT_11 COMPAT_12
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/esp_rijndael.c ipsec & ipsec_esp
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