diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
| -rw-r--r-- | net/ipv4/tcp_input.c | 13 | 
1 files changed, 11 insertions, 2 deletions
| diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 355d3dffd021..8e5522c6833a 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -265,7 +265,7 @@ static void __tcp_ecn_check_ce(struct sock *sk, const struct sk_buff *skb)  		 * it is probably a retransmit.  		 */  		if (tp->ecn_flags & TCP_ECN_SEEN) -			tcp_enter_quickack_mode(sk, 1); +			tcp_enter_quickack_mode(sk, 2);  		break;  	case INET_ECN_CE:  		if (tcp_ca_needs_ecn(sk)) @@ -273,7 +273,7 @@ static void __tcp_ecn_check_ce(struct sock *sk, const struct sk_buff *skb)  		if (!(tp->ecn_flags & TCP_ECN_DEMAND_CWR)) {  			/* Better not delay acks, sender can have a very low cwnd */ -			tcp_enter_quickack_mode(sk, 1); +			tcp_enter_quickack_mode(sk, 2);  			tp->ecn_flags |= TCP_ECN_DEMAND_CWR;  		}  		tp->ecn_flags |= TCP_ECN_SEEN; @@ -3181,6 +3181,15 @@ static int tcp_clean_rtx_queue(struct sock *sk, u32 prior_fack,  		if (tcp_is_reno(tp)) {  			tcp_remove_reno_sacks(sk, pkts_acked); + +			/* If any of the cumulatively ACKed segments was +			 * retransmitted, non-SACK case cannot confirm that +			 * progress was due to original transmission due to +			 * lack of TCPCB_SACKED_ACKED bits even if some of +			 * the packets may have been never retransmitted. +			 */ +			if (flag & FLAG_RETRANS_DATA_ACKED) +				flag &= ~FLAG_ORIG_SACK_ACKED;  		} else {  			int delta; | 
