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