From 6bfc8041f8bed2c0b102f16274ae576676e2df62 Mon Sep 17 00:00:00 2001 From: Brad Smith Date: Mon, 9 May 2005 21:54:59 +0000 Subject: - add alpha optimized in4_cksum - de register and use ANSI prototypes From NetBSD ok miod@ martin@ --- sys/arch/alpha/alpha/in_cksum.c | 83 +++++++++++++++++++++++++++++++++-------- sys/arch/alpha/conf/files.alpha | 3 +- 2 files changed, 68 insertions(+), 18 deletions(-) (limited to 'sys') diff --git a/sys/arch/alpha/alpha/in_cksum.c b/sys/arch/alpha/alpha/in_cksum.c index 8e33ffa2fc7..8897226b7c8 100644 --- a/sys/arch/alpha/alpha/in_cksum.c +++ b/sys/arch/alpha/alpha/in_cksum.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in_cksum.c,v 1.6 2003/06/02 23:27:43 millert Exp $ */ +/* $OpenBSD: in_cksum.c,v 1.7 2005/05/09 21:54:58 brad Exp $ */ /* $NetBSD: in_cksum.c,v 1.4 1996/11/13 21:13:06 cgd Exp $ */ /* @@ -37,9 +37,11 @@ #include #include #include +#include #include - -u_int64_t in_cksumdata(caddr_t, int); +#include +#include +#include /* * Checksum routine for Internet Protocol family headers @@ -81,12 +83,8 @@ union q_util { u_int64_t q; }; -u_int64_t in_cksumdata(caddr_t buf, int len); - -u_int64_t -in_cksumdata(buf, len) - register caddr_t buf; - register int len; +static u_int64_t +in_cksumdata(caddr_t buf, int len) { const u_int32_t *lw = (u_int32_t *) buf; u_int64_t sum = 0; @@ -167,14 +165,12 @@ in_cksumdata(buf, len) } int -in_cksum(m, len) - register struct mbuf *m; - register int len; +in_cksum(struct mbuf *m, int len) { - register u_int64_t sum = 0; - register int mlen = 0; - register int clen = 0; - register caddr_t addr; + u_int64_t sum = 0; + int mlen = 0; + int clen = 0; + caddr_t addr; union l_util l_util; union q_util q_util; @@ -196,3 +192,58 @@ in_cksum(m, len) REDUCE16; return (~sum & 0xffff); } + +int +in4_cksum(struct mbuf *m, u_int8_t nxt, int off, int len) +{ + u_int64_t sum = 0; + int mlen = 0; + int clen = 0; + caddr_t addr; + union q_util q_util; + union l_util l_util; + struct ipovly ipov; + + if (nxt != 0) { + /* pseudo header */ + if (off < sizeof(struct ipovly)) + panic("in4_cksum: offset too short"); + if (m->m_len < sizeof(struct ip)) + panic("in4_cksum: bad mbuf chain"); + + memset(&ipov, 0, sizeof(ipov)); + + ipov.ih_len = htons(len); + ipov.ih_pr = nxt; + ipov.ih_src = mtod(m, struct ip *)->ip_src; + ipov.ih_dst = mtod(m, struct ip *)->ip_dst; + + sum += in_cksumdata((caddr_t) &ipov, sizeof(ipov)); + } + + /* skip over unnecessary part */ + while (m != NULL && off > 0) { + if (m->m_len > off) + break; + off -= m->m_len; + m = m->m_next; + } + + for (; m && len; m = m->m_next, off = 0) { + if (m->m_len == 0) + continue; + mlen = m->m_len - off; + if (len < mlen) + mlen = len; + addr = mtod(m, caddr_t) + off; + if ((clen ^ (long) addr) & 1) + sum += in_cksumdata(addr, mlen) << 8; + else + sum += in_cksumdata(addr, mlen); + + clen += mlen; + len -= mlen; + } + REDUCE16; + return (~sum & 0xffff); +} diff --git a/sys/arch/alpha/conf/files.alpha b/sys/arch/alpha/conf/files.alpha index 5f7e2038d60..867b870c4c3 100644 --- a/sys/arch/alpha/conf/files.alpha +++ b/sys/arch/alpha/conf/files.alpha @@ -1,4 +1,4 @@ -# $OpenBSD: files.alpha,v 1.66 2005/05/01 21:36:55 brad Exp $ +# $OpenBSD: files.alpha,v 1.67 2005/05/09 21:54:58 brad Exp $ # $NetBSD: files.alpha,v 1.32 1996/11/25 04:03:21 cgd Exp $ # # alpha-specific configuration info @@ -289,7 +289,6 @@ file dev/clock_subr.c # file arch/alpha/alpha/in_cksum.c inet -file netinet/in4_cksum.c inet file netns/ns_cksum.c ns # XXX -- cgit v1.2.3