Date: Wed, 24 Oct 2012 14:34:13 +0000 (UTC) From: Andre Oppermann <andre@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r242001 - user/andre/tcp_workqueue/sys/netinet Message-ID: <201210241434.q9OEYDP7033095@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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*/
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201210241434.q9OEYDP7033095>