svn commit: r242001 - user/andre/tcp_workqueue/sys/netinet

Andre Oppermann andre at FreeBSD.org
Wed Oct 24 14:34:14 UTC 2012


Author: andre
Date: Wed Oct 24 14:34:13 2012
New Revision: 242001
URL: http://svn.freebsd.org/changeset/base/242001

Log:
  Prevent total TSO not only from exceeding IP_MAXPACKET (64K) with
  IP[46] header, IP[46] options and TCP header and options but also
  from exceeding the magic 64K in total DMA size by deducting the
  max_linkhdr length as well.
  
  This fixes an edge case in TSO operation when the NIC driver only
  handles 64K DMA transfers including ethernet link headers.

Modified:
  user/andre/tcp_workqueue/sys/netinet/tcp_output.c

Modified: user/andre/tcp_workqueue/sys/netinet/tcp_output.c
==============================================================================
--- user/andre/tcp_workqueue/sys/netinet/tcp_output.c	Wed Oct 24 14:06:47 2012	(r242000)
+++ user/andre/tcp_workqueue/sys/netinet/tcp_output.c	Wed Oct 24 14:34:13 2012	(r242001)
@@ -772,9 +772,12 @@ send:
 			 * Limit a burst to IP_MAXPACKET minus IP,
 			 * TCP and options length to keep ip->ip_len
 			 * from overflowing.
+			 * Deduct max_linkhdr as well to prevent the
+			 * eventual DMA chain from exceeding IP_MAXPACKET
+			 * (64K) as well.
 			 */
-			if (len > IP_MAXPACKET - hdrlen) {
-				len = IP_MAXPACKET - hdrlen;
+			if (len > IP_MAXPACKET - (hdrlen + max_linkhdr)) {
+				len = IP_MAXPACKET - (hdrlen + max_linkhdr);
 				sendalot = 1;
 			}
 
@@ -805,7 +808,7 @@ send:
 	} else
 		tso = 0;
 
-	KASSERT(len + hdrlen + ipoptlen <= IP_MAXPACKET,
+	KASSERT(len + hdrlen + ipoptlen + max_linkhdr <= IP_MAXPACKET,
 	    ("%s: len > IP_MAXPACKET", __func__));
 
 /*#ifdef DIAGNOSTIC*/


More information about the svn-src-user mailing list