Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 May 2012 18:25:09 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r235924 - head/sys/netinet6
Message-ID:  <201205241825.q4OIP9RN053394@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bz
Date: Thu May 24 18:25:09 2012
New Revision: 235924
URL: http://svn.freebsd.org/changeset/base/235924

Log:
  MFp4 bz_ipv6_fast:
  
    Introduce a (for now copied stripped down) in6_cksum_pseudo()
    function.  We should be able to use this from in6_cksum() but
    we should also ponder possible MD specific improvements.
    It takes an extra csum argument to allow for easy checks as
    will be done by the upper layer protocol input paths.
  
    Sponsored by:	The FreeBSD Foundation
    Sponsored by:	iXsystems
  
  Reviewed by:	gnn (as part of the whole)
  MFC After:	3 days

Modified:
  head/sys/netinet6/in6.h
  head/sys/netinet6/in6_cksum.c

Modified: head/sys/netinet6/in6.h
==============================================================================
--- head/sys/netinet6/in6.h	Thu May 24 18:22:57 2012	(r235923)
+++ head/sys/netinet6/in6.h	Thu May 24 18:25:09 2012	(r235924)
@@ -632,7 +632,9 @@ struct ip6_mtuinfo {
 
 #ifdef _KERNEL
 struct cmsghdr;
+struct ip6_hdr;
 
+int	in6_cksum_pseudo(struct ip6_hdr *, uint32_t, uint8_t, uint16_t);
 int	in6_cksum __P((struct mbuf *, u_int8_t, u_int32_t, u_int32_t));
 int	in6_localaddr __P((struct in6_addr *));
 int	in6_localip(struct in6_addr *);

Modified: head/sys/netinet6/in6_cksum.c
==============================================================================
--- head/sys/netinet6/in6_cksum.c	Thu May 24 18:22:57 2012	(r235923)
+++ head/sys/netinet6/in6_cksum.c	Thu May 24 18:25:09 2012	(r235924)
@@ -80,6 +80,66 @@ __FBSDID("$FreeBSD$");
 #define ADDCARRY(x)  (x > 65535 ? x -= 65535 : x)
 #define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; (void)ADDCARRY(sum);}
 
+static int
+_in6_cksum_pseudo(struct ip6_hdr *ip6, uint32_t len, uint8_t nxt, uint16_t csum)
+{
+	int sum;
+	uint16_t scope, *w;
+	union {
+		u_int16_t phs[4];
+		struct {
+			u_int32_t	ph_len;
+			u_int8_t	ph_zero[3];
+			u_int8_t	ph_nxt;
+		} __packed ph;
+	} uph;
+
+	sum = csum;
+
+	/*
+	 * First create IP6 pseudo header and calculate a summary.
+	 */
+	uph.ph.ph_len = htonl(len);
+	uph.ph.ph_zero[0] = uph.ph.ph_zero[1] = uph.ph.ph_zero[2] = 0;
+	uph.ph.ph_nxt = nxt;
+
+	/* Payload length and upper layer identifier. */
+	sum += uph.phs[0];  sum += uph.phs[1];
+	sum += uph.phs[2];  sum += uph.phs[3];
+
+	/* IPv6 source address. */
+	scope = in6_getscope(&ip6->ip6_src);
+	w = (u_int16_t *)&ip6->ip6_src;
+	sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
+	sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7];
+	if (scope != 0)
+		sum -= scope;
+
+	/* IPv6 destination address. */
+	scope = in6_getscope(&ip6->ip6_dst);
+	w = (u_int16_t *)&ip6->ip6_dst;
+	sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
+	sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7];
+	if (scope != 0)
+		sum -= scope;
+
+	return (sum);
+}
+
+int
+in6_cksum_pseudo(struct ip6_hdr *ip6, uint32_t len, uint8_t nxt, uint16_t csum)
+{
+	int sum;
+	union {
+		u_int16_t s[2];
+		u_int32_t l;
+	} l_util;
+
+	sum = _in6_cksum_pseudo(ip6, len, nxt, csum);
+	REDUCE;
+	return (sum);
+}
+
 /*
  * m MUST contain a contiguous IP6 header.
  * off is an offset where TCP/UDP/ICMP6 header starts.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201205241825.q4OIP9RN053394>