Date: Sat, 1 Mar 2008 10:02:10 GMT From: Vitezslav Novy <vnovy@vnovy.net> To: freebsd-gnats-submit@FreeBSD.org Subject: kern/121257: TSO + natd -> slow outgoing tcp traffic Message-ID: <200803011002.m21A2ACM078074@www.freebsd.org> Resent-Message-ID: <200803011010.m21AA6N6053676@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 121257 >Category: kern >Synopsis: TSO + natd -> slow outgoing tcp traffic >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sat Mar 01 10:10:01 UTC 2008 >Closed-Date: >Last-Modified: >Originator: Vitezslav Novy >Release: 7.0-RELEASE >Organization: >Environment: FreeBSD vn.chello.upc.cz 7.0-RELEASE FreeBSD 7.0-RELEASE #2: Fri Feb 29 21:37:33 CET 2008 rumik@vn.chello.upc.cz:/usr/obj/usr/src/sys/GENERIC i386 >Description: If TSO flag is set on interface and packets are diverted to natd by ipfw on same interface, tcp traffic going out through this interface is very slow. It's because tcp layer sends big packet with TSO flag set, packet is diverted by ipfw and tcp layer gets OK return value. Then packet is reinjected to ip stack by natd, but TSO flag is lost. Packet is dropped by ip_output and ERR return value is delivered to natd, which can do nothing with it. Because tcp layer has no info about problem, packet is resend after tcp retransmit timeout. retransmited packets are sent without TSO flag, so it is sent successfully. >How-To-Repeat: Just look at outgoing tcp traffic on interface with tso flag set and natd running on it. >Fix: Ad hoc: Disable TSO flag on interface OR if possible, change ipfw rules to not divert all traffic on interface OR in natd rc script clear tso flag on interface when natd is started on it OR in kernel during divert, reject packet with tso flag set. It gives tcp layer feedback and connection tso flag will be cleared. It's easy to make this change in ipfw code. Maybe packet diverted by divert rule should be rejected, and packet diverted by tee rule should be accepted (they are not reinjected to ip stack usually). >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803011002.m21A2ACM078074>