svn commit: r243226 - in user/andre/tcp_workqueue/sys: net netinet netinet6

Andre Oppermann andre at FreeBSD.org
Sun Nov 18 14:00:04 UTC 2012


Author: andre
Date: Sun Nov 18 14:00:03 2012
New Revision: 243226
URL: http://svnweb.freebsd.org/changeset/base/243226

Log:
  Adjustments to the various Ethernet/IP/IPv6/UDP/TCP/SCTP output
  functions to correctly set and update the csum_l[2-4]hlen header
  length indicators.

Modified:
  user/andre/tcp_workqueue/sys/net/if_ethersubr.c
  user/andre/tcp_workqueue/sys/netinet/ip_output.c
  user/andre/tcp_workqueue/sys/netinet/sctp_output.c
  user/andre/tcp_workqueue/sys/netinet/tcp_output.c
  user/andre/tcp_workqueue/sys/netinet/udp_usrreq.c
  user/andre/tcp_workqueue/sys/netinet6/ip6_output.c

Modified: user/andre/tcp_workqueue/sys/net/if_ethersubr.c
==============================================================================
--- user/andre/tcp_workqueue/sys/net/if_ethersubr.c	Sun Nov 18 12:57:58 2012	(r243225)
+++ user/andre/tcp_workqueue/sys/net/if_ethersubr.c	Sun Nov 18 14:00:03 2012	(r243226)
@@ -328,6 +328,21 @@ ether_output(struct ifnet *ifp, struct m
 			sizeof(eh->ether_shost));
 
 	/*
+	 * Fill in ethernet header length for checksum offload features.
+	 * NB: The vlan header length must not be specified with hardware
+	 * vlan insertion.
+	 */
+	if (m->m_pkthdr.csum_flags) {
+		uint8_t ehlen;
+
+		if (eh->ether_type == ntohs(ETHERTYPE_VLAN))
+			ehlen = sizeof(struct ether_vlan_header);
+		else
+			ehlen = sizeof(struct ether_header);
+		m->m_pkthdr.csum_l2hlen += ehlen;
+	}
+
+	/*
 	 * If a simplex interface, and the packet is being sent to our
 	 * Ethernet address or a broadcast address, loopback a copy.
 	 * XXX To make a simplex device behave exactly like a duplex

Modified: user/andre/tcp_workqueue/sys/netinet/ip_output.c
==============================================================================
--- user/andre/tcp_workqueue/sys/netinet/ip_output.c	Sun Nov 18 12:57:58 2012	(r243225)
+++ user/andre/tcp_workqueue/sys/netinet/ip_output.c	Sun Nov 18 14:00:03 2012	(r243226)
@@ -582,6 +582,7 @@ passout:
 	}
 
 	m->m_pkthdr.csum_flags |= CSUM_IP;
+	m->m_pkthdr.csum_l3hlen += ip_len;
 	if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA & ~ifp->if_hwassist) {
 		in_delayed_cksum(m);
 		m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;

Modified: user/andre/tcp_workqueue/sys/netinet/sctp_output.c
==============================================================================
--- user/andre/tcp_workqueue/sys/netinet/sctp_output.c	Sun Nov 18 12:57:58 2012	(r243225)
+++ user/andre/tcp_workqueue/sys/netinet/sctp_output.c	Sun Nov 18 14:00:03 2012	(r243226)
@@ -4130,7 +4130,7 @@ sctp_lowlevel_chunk_output(struct sctp_i
 				SCTP_STAT_INCR(sctps_sendnocrc);
 #else
 				m->m_pkthdr.csum_flags = CSUM_SCTP;
-				m->m_pkthdr.csum_data = 0;
+				m->m_pkthdr.csum_l4hlen = sizeof(struct sctphdr);
 				SCTP_STAT_INCR(sctps_sendhwcrc);
 #endif
 			}
@@ -4479,7 +4479,7 @@ sctp_lowlevel_chunk_output(struct sctp_i
 				SCTP_STAT_INCR(sctps_sendnocrc);
 #else
 				m->m_pkthdr.csum_flags = CSUM_SCTP_IPV6;
-				m->m_pkthdr.csum_data = 0;
+				m->m_pkthdr.csum_l4hlen = sizeof(struct sctphdr);
 				SCTP_STAT_INCR(sctps_sendhwcrc);
 #endif
 			}
@@ -11006,7 +11006,7 @@ sctp_send_resp_msg(struct sockaddr *src,
 			SCTP_STAT_INCR(sctps_sendnocrc);
 #else
 			mout->m_pkthdr.csum_flags = CSUM_SCTP;
-			mout->m_pkthdr.csum_data = 0;
+			mout->m_pkthdr.csum_l4hlen = sizeof(struct sctphdr);
 			SCTP_STAT_INCR(sctps_sendhwcrc);
 #endif
 		}
@@ -11036,7 +11036,7 @@ sctp_send_resp_msg(struct sockaddr *src,
 			SCTP_STAT_INCR(sctps_sendnocrc);
 #else
 			mout->m_pkthdr.csum_flags = CSUM_SCTP_IPV6;
-			mout->m_pkthdr.csum_data = 0;
+			mout->m_pkthdr.csum_l4hlen = sizeof(struct sctphdr);
 			SCTP_STAT_INCR(sctps_sendhwcrc);
 #endif
 		}

Modified: user/andre/tcp_workqueue/sys/netinet/tcp_output.c
==============================================================================
--- user/andre/tcp_workqueue/sys/netinet/tcp_output.c	Sun Nov 18 12:57:58 2012	(r243225)
+++ user/andre/tcp_workqueue/sys/netinet/tcp_output.c	Sun Nov 18 14:00:03 2012	(r243226)
@@ -1078,7 +1078,7 @@ send:
 	 * checksum extended header and data.
 	 */
 	m->m_pkthdr.len = hdrlen + len; /* in6_cksum() need this */
-	m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum);
+	m->m_pkthdr.csum_l4hlen = sizeof(struct tcphdr) + optlen;
 #ifdef INET6
 	if (isipv6) {
 		/*

Modified: user/andre/tcp_workqueue/sys/netinet/udp_usrreq.c
==============================================================================
--- user/andre/tcp_workqueue/sys/netinet/udp_usrreq.c	Sun Nov 18 12:57:58 2012	(r243225)
+++ user/andre/tcp_workqueue/sys/netinet/udp_usrreq.c	Sun Nov 18 14:00:03 2012	(r243226)
@@ -1227,7 +1227,7 @@ udp_output(struct inpcb *inp, struct mbu
 		ui->ui_sum = in_pseudo(ui->ui_src.s_addr, faddr.s_addr,
 		    htons((u_short)len + sizeof(struct udphdr) + IPPROTO_UDP));
 		m->m_pkthdr.csum_flags = CSUM_UDP;
-		m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum);
+		m->m_pkthdr.csum_l4hlen = sizeof(struct udphdr);
 	} else
 		ui->ui_sum = 0;
 	((struct ip *)ui)->ip_len = htons(sizeof(struct udpiphdr) + len);

Modified: user/andre/tcp_workqueue/sys/netinet6/ip6_output.c
==============================================================================
--- user/andre/tcp_workqueue/sys/netinet6/ip6_output.c	Sun Nov 18 12:57:58 2012	(r243225)
+++ user/andre/tcp_workqueue/sys/netinet6/ip6_output.c	Sun Nov 18 14:00:03 2012	(r243226)
@@ -1030,6 +1030,9 @@ passout:
 			ia6->ia_ifa.if_obytes += m->m_pkthdr.len;
 			ifa_free(&ia6->ia_ifa);
 		}
+		if (m->m_pkthdr.csum_flags &
+		    (CSUM_UDP_IPV6|CSUM_TCP_IPV6|CSUM_SCTP_IPV6|CSUM_TSO))
+			m->m_pkthdr.csum_l3hlen += sizeof(struct ip6_hdr);
 		error = nd6_output(ifp, origifp, m, dst, ro->ro_rt);
 		goto done;
 	}


More information about the svn-src-user mailing list