mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			62 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From patchwork Mon Aug  6 21:04:43 2012
 | 
						|
Content-Type: text/plain; charset="utf-8"
 | 
						|
MIME-Version: 1.0
 | 
						|
Content-Transfer-Encoding: 7bit
 | 
						|
Subject: [net-next] tcp: ecn: dont delay ACKS after CE
 | 
						|
Date: Mon, 06 Aug 2012 11:04:43 -0000
 | 
						|
From: Eric Dumazet <eric.dumazet@gmail.com>
 | 
						|
X-Patchwork-Id: 175453
 | 
						|
Message-Id: <1344287083.26674.83.camel@edumazet-glaptop>
 | 
						|
To: David Miller <davem@davemloft.net>
 | 
						|
Cc: netdev <netdev@vger.kernel.org>,
 | 
						|
	Neal Cardwell <ncardwell@google.com>
 | 
						|
 | 
						|
From: Eric Dumazet <edumazet@google.com>
 | 
						|
 | 
						|
While playing with CoDel and ECN marking, I discovered a
 | 
						|
non optimal behavior of receiver of CE (Congestion Encountered)
 | 
						|
segments.
 | 
						|
 | 
						|
In pathological cases, sender has reduced its cwnd to low values,
 | 
						|
and receiver delays its ACK (by 40 ms).
 | 
						|
 | 
						|
While RFC 3168 6.1.3 (The TCP Receiver) doesn't explicitly recommend
 | 
						|
to send immediate ACKS, we believe its better to not delay ACKS, because
 | 
						|
a CE segment should give same signal than a dropped segment, and its
 | 
						|
quite important to reduce RTT to give ECE/CWR signals as fast as
 | 
						|
possible.
 | 
						|
 | 
						|
Note we already call tcp_enter_quickack_mode() from TCP_ECN_check_ce()
 | 
						|
if we receive a retransmit, for the same reason.
 | 
						|
 | 
						|
Signed-off-by: Eric Dumazet <edumazet@google.com>
 | 
						|
Cc: Neal Cardwell <ncardwell@google.com>
 | 
						|
Acked-by: Neal Cardwell <ncardwell@google.com>
 | 
						|
 | 
						|
---
 | 
						|
net/ipv4/tcp_input.c |    6 +++++-
 | 
						|
 1 file changed, 5 insertions(+), 1 deletion(-)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
--
 | 
						|
To unsubscribe from this list: send the line "unsubscribe netdev" in
 | 
						|
the body of a message to majordomo@vger.kernel.org
 | 
						|
More majordomo info at  http://vger.kernel.org/majordomo-info.html
 | 
						|
 | 
						|
--- a/net/ipv4/tcp_input.c
 | 
						|
+++ b/net/ipv4/tcp_input.c
 | 
						|
@@ -237,7 +237,11 @@ static inline void TCP_ECN_check_ce(stru
 | 
						|
 			tcp_enter_quickack_mode((struct sock *)tp);
 | 
						|
 		break;
 | 
						|
 	case INET_ECN_CE:
 | 
						|
-		tp->ecn_flags |= TCP_ECN_DEMAND_CWR;
 | 
						|
+		if (!(tp->ecn_flags & TCP_ECN_DEMAND_CWR)) {
 | 
						|
+			/* Better not delay acks, sender can have a very low cwnd */
 | 
						|
+			tcp_enter_quickack_mode((struct sock *)tp);
 | 
						|
+			tp->ecn_flags |= TCP_ECN_DEMAND_CWR;
 | 
						|
+		}
 | 
						|
 		/* fallinto */
 | 
						|
 	default:
 | 
						|
 		tp->ecn_flags |= TCP_ECN_SEEN;
 |