Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 12 Mar 2010 22:58:52 +0000 (UTC)
From:      Randall Stewart <rrs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r205104 - in head/sys: dev/xen/netback netinet netinet6
Message-ID:  <201003122258.o2CMwqDM039077@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rrs
Date: Fri Mar 12 22:58:52 2010
New Revision: 205104
URL: http://svn.freebsd.org/changeset/base/205104

Log:
  The proper fix for the delayed SCTP checksum is to
  have the delayed function take an argument as to the offset
  to the SCTP header. This allows it to work for V4 and V6.
  This of course means changing all callers of the function
  to either pass the header len, if they have it, or create
  it (ip_hl << 2 or sizeof(ip6_hdr)).
  PR:		144529
  MFC after:	2 weeks

Modified:
  head/sys/dev/xen/netback/netback.c
  head/sys/netinet/ip_divert.c
  head/sys/netinet/ip_ipsec.c
  head/sys/netinet/ip_output.c
  head/sys/netinet/sctp_crc32.c
  head/sys/netinet/sctp_crc32.h
  head/sys/netinet6/ip6_output.c

Modified: head/sys/dev/xen/netback/netback.c
==============================================================================
--- head/sys/dev/xen/netback/netback.c	Fri Mar 12 22:39:35 2010	(r205103)
+++ head/sys/dev/xen/netback/netback.c	Fri Mar 12 22:58:52 2010	(r205104)
@@ -302,7 +302,7 @@ fixup_checksum(struct mbuf *m)
 		m->m_pkthdr.csum_flags &= ~CSUM_TCP;
 #ifdef SCTP
 	} else if (sw_csum & CSUM_SCTP) {
-		sctp_delayed_cksum(m);
+		sctp_delayed_cksum(m, iphlen);
 		sw_csum &= ~CSUM_SCTP;
 #endif
 	} else {

Modified: head/sys/netinet/ip_divert.c
==============================================================================
--- head/sys/netinet/ip_divert.c	Fri Mar 12 22:39:35 2010	(r205103)
+++ head/sys/netinet/ip_divert.c	Fri Mar 12 22:58:52 2010	(r205104)
@@ -227,7 +227,7 @@ divert_packet(struct mbuf *m, int incomi
 #ifdef SCTP
 	if (m->m_pkthdr.csum_flags & CSUM_SCTP) {
 		ip->ip_len = ntohs(ip->ip_len);
-		sctp_delayed_cksum(m);
+		sctp_delayed_cksum(m, (uint32_t)(ip->ip_hl << 2));
 		m->m_pkthdr.csum_flags &= ~CSUM_SCTP;
 		ip->ip_len = htons(ip->ip_len);
 	}

Modified: head/sys/netinet/ip_ipsec.c
==============================================================================
--- head/sys/netinet/ip_ipsec.c	Fri Mar 12 22:39:35 2010	(r205103)
+++ head/sys/netinet/ip_ipsec.c	Fri Mar 12 22:58:52 2010	(r205104)
@@ -342,7 +342,7 @@ ip_ipsec_output(struct mbuf **m, struct 
 		}
 #ifdef SCTP
 		if ((*m)->m_pkthdr.csum_flags & CSUM_SCTP) {
-			sctp_delayed_cksum(*m);
+			sctp_delayed_cksum(*m, (uint32_t)(ip->ip_hl << 2));
 			(*m)->m_pkthdr.csum_flags &= ~CSUM_SCTP;
 		}
 #endif

Modified: head/sys/netinet/ip_output.c
==============================================================================
--- head/sys/netinet/ip_output.c	Fri Mar 12 22:39:35 2010	(r205103)
+++ head/sys/netinet/ip_output.c	Fri Mar 12 22:58:52 2010	(r205104)
@@ -583,7 +583,7 @@ passout:
 	}
 #ifdef SCTP
 	if (sw_csum & CSUM_SCTP) {
-		sctp_delayed_cksum(m);
+		sctp_delayed_cksum(m, (uint32_t)(ip->ip_hl << 2));
 		sw_csum &= ~CSUM_SCTP;
 	}
 #endif
@@ -725,7 +725,7 @@ ip_fragment(struct ip *ip, struct mbuf *
 #ifdef SCTP
 	if (m0->m_pkthdr.csum_flags & CSUM_SCTP &&
 	    (if_hwassist_flags & CSUM_IP_FRAGS) == 0) {
-		sctp_delayed_cksum(m0);
+		sctp_delayed_cksum(m0, hlen);
 		m0->m_pkthdr.csum_flags &= ~CSUM_SCTP;
 	}
 #endif

Modified: head/sys/netinet/sctp_crc32.c
==============================================================================
--- head/sys/netinet/sctp_crc32.c	Fri Mar 12 22:39:35 2010	(r205103)
+++ head/sys/netinet/sctp_crc32.c	Fri Mar 12 22:58:52 2010	(r205104)
@@ -127,14 +127,12 @@ sctp_calculate_cksum(struct mbuf *m, uin
 
 
 void
-sctp_delayed_cksum(struct mbuf *m)
+sctp_delayed_cksum(struct mbuf *m, uint32_t offset)
 {
 	struct ip *ip;
 	uint32_t checksum;
-	uint32_t offset;
 
 	ip = mtod(m, struct ip *);
-	offset = ip->ip_hl << 2;
 	checksum = sctp_calculate_cksum(m, offset);
 	SCTP_STAT_DECR(sctps_sendhwcrc);
 	SCTP_STAT_INCR(sctps_sendswcrc);

Modified: head/sys/netinet/sctp_crc32.h
==============================================================================
--- head/sys/netinet/sctp_crc32.h	Fri Mar 12 22:39:35 2010	(r205103)
+++ head/sys/netinet/sctp_crc32.h	Fri Mar 12 22:58:52 2010	(r205104)
@@ -39,7 +39,7 @@ __FBSDID("$FreeBSD$");
 #if defined(_KERNEL) || defined(__Userspace__)
 
 uint32_t sctp_calculate_cksum(struct mbuf *, uint32_t);
-void sctp_delayed_cksum(struct mbuf *);
+void sctp_delayed_cksum(struct mbuf *, uint32_t offset);
 
 #endif				/* _KERNEL */
 

Modified: head/sys/netinet6/ip6_output.c
==============================================================================
--- head/sys/netinet6/ip6_output.c	Fri Mar 12 22:39:35 2010	(r205103)
+++ head/sys/netinet6/ip6_output.c	Fri Mar 12 22:58:52 2010	(r205104)
@@ -872,7 +872,7 @@ passout:
 #ifdef SCTP
 	sw_csum = m->m_pkthdr.csum_flags & ~ifp->if_hwassist;
 	if (sw_csum & CSUM_SCTP) {
-		sctp_delayed_cksum(m);
+		sctp_delayed_cksum(m, sizeof(struct ip6_hdr));
 		sw_csum &= ~CSUM_SCTP;
 	}
 #endif



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