Date: Sat, 02 Jul 2011 14:24:37 -0700 From: Colin Percival <cperciva@freebsd.org> To: freebsd-net@freebsd.org, Jack F Vogel <jfv@FreeBSD.org> Subject: integer overflow in TCP LRO Message-ID: <4E0F8C95.50507@freebsd.org>
next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------070300000001080603080107
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Hi all,
In tcp_lro_rx it's possible for lro->len to exceed 65536, resulting in an
integer overflow and 65536 bytes of TCP "packet loss" when tcp_lro_flush
stuffs lro->len back into an IP header.
It's clear that an attempt was made to avoid overflow
339: /* flush packet if required */
340: device_mtu = cntl->ifp->if_mtu;
341: if (lro->len > (65535 - device_mtu)) {
but this doesn't work because incoming "packets" can be larger than
device_mtu bytes if LRO is turned on.
I've attached a patch which fixes this and improves Linux->FreeBSD network
performance on EC2 cluster compute nodes from 13 Mbps to 4100 Mbps... any
objections to me committing this?
--
Colin Percival
Security Officer, FreeBSD | freebsd.org | The power to serve
Founder / author, Tarsnap | tarsnap.com | Online backups for the truly paranoid
--------------070300000001080603080107
Content-Type: text/x-patch;
name="tcp_lro.c.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="tcp_lro.c.diff"
--- tcp_lro.c.orig 2011-07-02 19:53:51.000000000 +0000
+++ tcp_lro.c 2011-07-02 18:12:31.000000000 +0000
@@ -274,6 +274,14 @@
lro->dest_port == tcp->th_dport &&
lro->source_ip == ip->ip_src.s_addr &&
lro->dest_ip == ip->ip_dst.s_addr) {
+ /* Flush now if appending will result in overflow. */
+ if (lro->len > (65535 - tcp_data_len)) {
+ SLIST_REMOVE(&cntl->lro_active, lro,
+ lro_entry, next);
+ tcp_lro_flush(cntl, lro);
+ break;
+ }
+
/* Try to append it */
if (__predict_false(seq != lro->next_seq)) {
--------------070300000001080603080107--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4E0F8C95.50507>
