kern/144529: commit references a PR

dfilter service dfilter at FreeBSD.ORG
Mon Apr 5 13:50:05 UTC 2010


The following reply was made to PR kern/144529; it has been noted by GNATS.

From: dfilter at FreeBSD.ORG (dfilter service)
To: bug-followup at FreeBSD.org
Cc:  
Subject: Re: kern/144529: commit references a PR
Date: Mon,  5 Apr 2010 13:48:32 +0000 (UTC)

 Author: rrs
 Date: Mon Apr  5 13:48:23 2010
 New Revision: 206181
 URL: http://svn.freebsd.org/changeset/base/206181
 
 Log:
   MFC of 2 items to fix the csum for v6 issue:
   Revision 205075 and 205104:
   
   ---------205075----------
   With the recent change of the sctp checksum to support offload,
   no delayed checksum was added to the ip6 output code. This
   causes cards that do not support SCTP checksum offload to
   have SCTP packets that are IPv6 NOT have the sctp checksum
   performed. Thus you could not communicate with a peer. This
   adds the missing bits to make the checksum happen for these cards.
   -------------------------
   ---------205104----------
   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
 
 Modified:
   stable/8/sys/dev/xen/netback/netback.c
   stable/8/sys/netinet/ip_divert.c
   stable/8/sys/netinet/ip_ipsec.c
   stable/8/sys/netinet/ip_output.c
   stable/8/sys/netinet/sctp_crc32.c
   stable/8/sys/netinet/sctp_crc32.h
   stable/8/sys/netinet6/ip6_output.c
 Directory Properties:
   stable/8/sys/   (props changed)
   stable/8/sys/amd64/include/xen/   (props changed)
   stable/8/sys/cddl/contrib/opensolaris/   (props changed)
   stable/8/sys/contrib/dev/acpica/   (props changed)
   stable/8/sys/contrib/pf/   (props changed)
   stable/8/sys/dev/xen/xenpci/   (props changed)
 
 Modified: stable/8/sys/dev/xen/netback/netback.c
 ==============================================================================
 --- stable/8/sys/dev/xen/netback/netback.c	Mon Apr  5 13:33:54 2010	(r206180)
 +++ stable/8/sys/dev/xen/netback/netback.c	Mon Apr  5 13:48:23 2010	(r206181)
 @@ -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: stable/8/sys/netinet/ip_divert.c
 ==============================================================================
 --- stable/8/sys/netinet/ip_divert.c	Mon Apr  5 13:33:54 2010	(r206180)
 +++ stable/8/sys/netinet/ip_divert.c	Mon Apr  5 13:48:23 2010	(r206181)
 @@ -234,7 +234,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: stable/8/sys/netinet/ip_ipsec.c
 ==============================================================================
 --- stable/8/sys/netinet/ip_ipsec.c	Mon Apr  5 13:33:54 2010	(r206180)
 +++ stable/8/sys/netinet/ip_ipsec.c	Mon Apr  5 13:48:23 2010	(r206181)
 @@ -343,7 +343,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: stable/8/sys/netinet/ip_output.c
 ==============================================================================
 --- stable/8/sys/netinet/ip_output.c	Mon Apr  5 13:33:54 2010	(r206180)
 +++ stable/8/sys/netinet/ip_output.c	Mon Apr  5 13:48:23 2010	(r206181)
 @@ -589,7 +589,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
 @@ -731,7 +731,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: stable/8/sys/netinet/sctp_crc32.c
 ==============================================================================
 --- stable/8/sys/netinet/sctp_crc32.c	Mon Apr  5 13:33:54 2010	(r206180)
 +++ stable/8/sys/netinet/sctp_crc32.c	Mon Apr  5 13:48:23 2010	(r206181)
 @@ -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: stable/8/sys/netinet/sctp_crc32.h
 ==============================================================================
 --- stable/8/sys/netinet/sctp_crc32.h	Mon Apr  5 13:33:54 2010	(r206180)
 +++ stable/8/sys/netinet/sctp_crc32.h	Mon Apr  5 13:48:23 2010	(r206181)
 @@ -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: stable/8/sys/netinet6/ip6_output.c
 ==============================================================================
 --- stable/8/sys/netinet6/ip6_output.c	Mon Apr  5 13:33:54 2010	(r206180)
 +++ stable/8/sys/netinet6/ip6_output.c	Mon Apr  5 13:48:23 2010	(r206181)
 @@ -66,6 +66,7 @@ __FBSDID("$FreeBSD$");
  #include "opt_inet.h"
  #include "opt_inet6.h"
  #include "opt_ipsec.h"
 +#include "opt_sctp.h"
  
  #include <sys/param.h>
  #include <sys/kernel.h>
 @@ -102,6 +103,10 @@ __FBSDID("$FreeBSD$");
  #include <netipsec/key.h>
  #include <netinet6/ip6_ipsec.h>
  #endif /* IPSEC */
 +#ifdef SCTP
 +#include <netinet/sctp.h>
 +#include <netinet/sctp_crc32.h>
 +#endif
  
  #include <netinet6/ip6protosw.h>
  #include <netinet6/scope6_var.h>
 @@ -208,6 +213,9 @@ ip6_output(struct mbuf *m0, struct ip6_p
  	struct route_in6 *ro_pmtu = NULL;
  	int hdrsplit = 0;
  	int needipsec = 0;
 +#ifdef SCTP
 +	int sw_csum;
 +#endif
  #ifdef IPSEC
  	struct ipsec_output_state state;
  	struct ip6_rthdr *rh = NULL;
 @@ -829,6 +837,10 @@ again:
  			}
  			m->m_pkthdr.csum_flags |=
  			    CSUM_IP_CHECKED | CSUM_IP_VALID;
 +#ifdef SCTP
 +			if (m->m_pkthdr.csum_flags & CSUM_SCTP)
 +				m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID;
 +#endif
  			error = netisr_queue(NETISR_IPV6, m);
  			goto done;
  		} else
 @@ -857,6 +869,13 @@ passout:
  	 * 4: if dontfrag == 1 && alwaysfrag == 1
  	 *	error, as we cannot handle this conflicting request
  	 */
 +#ifdef SCTP
 +	sw_csum = m->m_pkthdr.csum_flags & ~ifp->if_hwassist;
 +	if (sw_csum & CSUM_SCTP) {
 +		sctp_delayed_cksum(m, sizeof(struct ip6_hdr));
 +		sw_csum &= ~CSUM_SCTP;
 +	}
 +#endif
  	tlen = m->m_pkthdr.len;
  
  	if (opt && (opt->ip6po_flags & IP6PO_DONTFRAG))
 _______________________________________________
 svn-src-all at freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
 


More information about the freebsd-net mailing list