diff options
Diffstat (limited to 'net/dccp/timer.c')
| -rw-r--r-- | net/dccp/timer.c | 20 | 
1 files changed, 4 insertions, 16 deletions
diff --git a/net/dccp/timer.c b/net/dccp/timer.c index 6a5b961b6f5..54b3c7e9e01 100644 --- a/net/dccp/timer.c +++ b/net/dccp/timer.c @@ -99,21 +99,11 @@ static void dccp_retransmit_timer(struct sock *sk)  	}  	/* -	 * sk->sk_send_head has to have one skb with -	 * DCCP_SKB_CB(skb)->dccpd_type set to one of the retransmittable DCCP -	 * packet types. The only packets eligible for retransmission are: -	 *	-- Requests in client-REQUEST  state (sec. 8.1.1) -	 *	-- Acks     in client-PARTOPEN state (sec. 8.1.5) -	 *	-- CloseReq in server-CLOSEREQ state (sec. 8.3) -	 *	-- Close    in   node-CLOSING  state (sec. 8.3)                */ -	WARN_ON(sk->sk_send_head == NULL); - -	/*  	 * More than than 4MSL (8 minutes) has passed, a RESET(aborted) was  	 * sent, no need to retransmit, this sock is dead.  	 */  	if (dccp_write_timeout(sk)) -		goto out; +		return;  	/*  	 * We want to know the number of packets retransmitted, not the @@ -122,30 +112,28 @@ static void dccp_retransmit_timer(struct sock *sk)  	if (icsk->icsk_retransmits == 0)  		DCCP_INC_STATS_BH(DCCP_MIB_TIMEOUTS); -	if (dccp_retransmit_skb(sk, sk->sk_send_head) < 0) { +	if (dccp_retransmit_skb(sk) != 0) {  		/*  		 * Retransmission failed because of local congestion,  		 * do not backoff.  		 */ -		if (icsk->icsk_retransmits == 0) +		if (--icsk->icsk_retransmits == 0)  			icsk->icsk_retransmits = 1;  		inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,  					  min(icsk->icsk_rto,  					      TCP_RESOURCE_PROBE_INTERVAL),  					  DCCP_RTO_MAX); -		goto out; +		return;  	}  backoff:  	icsk->icsk_backoff++; -	icsk->icsk_retransmits++;  	icsk->icsk_rto = min(icsk->icsk_rto << 1, DCCP_RTO_MAX);  	inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, icsk->icsk_rto,  				  DCCP_RTO_MAX);  	if (icsk->icsk_retransmits > sysctl_dccp_retries1)  		__sk_dst_reset(sk); -out:;  }  static void dccp_write_timer(unsigned long data)  |