diff options
| author | Linus Torvalds <[email protected]> | 2010-10-23 11:47:02 -0700 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2010-10-23 11:47:02 -0700 | 
| commit | 5f05647dd81c11a6a165ccc8f0c1370b16f3bcb0 (patch) | |
| tree | 7851ef1c93aa1aba7ef327ca4b75fd35e6d10f29 /net/ipv4/tcp_input.c | |
| parent | 02f36038c568111ad4fc433f6fa760ff5e38fab4 (diff) | |
| parent | ec37a48d1d16c30b655ac5280209edf52a6775d4 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1699 commits)
  bnx2/bnx2x: Unsupported Ethtool operations should return -EINVAL.
  vlan: Calling vlan_hwaccel_do_receive() is always valid.
  tproxy: use the interface primary IP address as a default value for --on-ip
  tproxy: added IPv6 support to the socket match
  cxgb3: function namespace cleanup
  tproxy: added IPv6 support to the TPROXY target
  tproxy: added IPv6 socket lookup function to nf_tproxy_core
  be2net: Changes to use only priority codes allowed by f/w
  tproxy: allow non-local binds of IPv6 sockets if IP_TRANSPARENT is enabled
  tproxy: added tproxy sockopt interface in the IPV6 layer
  tproxy: added udp6_lib_lookup function
  tproxy: added const specifiers to udp lookup functions
  tproxy: split off ipv6 defragmentation to a separate module
  l2tp: small cleanup
  nf_nat: restrict ICMP translation for embedded header
  can: mcp251x: fix generation of error frames
  can: mcp251x: fix endless loop in interrupt handler if CANINTF_MERRF is set
  can-raw: add msg_flags to distinguish local traffic
  9p: client code cleanup
  rds: make local functions/variables static
  ...
Fix up conflicts in net/core/dev.c, drivers/net/pcmcia/smc91c92_cs.c and
drivers/net/wireless/ath/ath9k/debug.c as per David
Diffstat (limited to 'net/ipv4/tcp_input.c')
| -rw-r--r-- | net/ipv4/tcp_input.c | 55 | 
1 files changed, 23 insertions, 32 deletions
| diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index b55f60f6fcbe..ee0df4817498 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -182,7 +182,7 @@ static void tcp_incr_quickack(struct sock *sk)  		icsk->icsk_ack.quick = min(quickacks, TCP_MAX_QUICKACKS);  } -void tcp_enter_quickack_mode(struct sock *sk) +static void tcp_enter_quickack_mode(struct sock *sk)  {  	struct inet_connection_sock *icsk = inet_csk(sk);  	tcp_incr_quickack(sk); @@ -805,25 +805,12 @@ void tcp_update_metrics(struct sock *sk)  	}  } -/* Numbers are taken from RFC3390. - * - * John Heffner states: - * - *	The RFC specifies a window of no more than 4380 bytes - *	unless 2*MSS > 4380.  Reading the pseudocode in the RFC - *	is a bit misleading because they use a clamp at 4380 bytes - *	rather than use a multiplier in the relevant range. - */  __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst)  {  	__u32 cwnd = (dst ? dst_metric(dst, RTAX_INITCWND) : 0); -	if (!cwnd) { -		if (tp->mss_cache > 1460) -			cwnd = 2; -		else -			cwnd = (tp->mss_cache > 1095) ? 3 : 4; -	} +	if (!cwnd) +		cwnd = rfc3390_bytes_to_packets(tp->mss_cache);  	return min_t(__u32, cwnd, tp->snd_cwnd_clamp);  } @@ -2314,7 +2301,7 @@ static inline int tcp_dupack_heuristics(struct tcp_sock *tp)  static inline int tcp_skb_timedout(struct sock *sk, struct sk_buff *skb)  { -	return (tcp_time_stamp - TCP_SKB_CB(skb)->when > inet_csk(sk)->icsk_rto); +	return tcp_time_stamp - TCP_SKB_CB(skb)->when > inet_csk(sk)->icsk_rto;  }  static inline int tcp_head_timedout(struct sock *sk) @@ -2508,7 +2495,7 @@ static void tcp_timeout_skbs(struct sock *sk)  /* Mark head of queue up as lost. With RFC3517 SACK, the packets is   * is against sacked "cnt", otherwise it's against facked "cnt"   */ -static void tcp_mark_head_lost(struct sock *sk, int packets) +static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head)  {  	struct tcp_sock *tp = tcp_sk(sk);  	struct sk_buff *skb; @@ -2516,13 +2503,13 @@ static void tcp_mark_head_lost(struct sock *sk, int packets)  	int err;  	unsigned int mss; -	if (packets == 0) -		return; -  	WARN_ON(packets > tp->packets_out);  	if (tp->lost_skb_hint) {  		skb = tp->lost_skb_hint;  		cnt = tp->lost_cnt_hint; +		/* Head already handled? */ +		if (mark_head && skb != tcp_write_queue_head(sk)) +			return;  	} else {  		skb = tcp_write_queue_head(sk);  		cnt = 0; @@ -2557,6 +2544,9 @@ static void tcp_mark_head_lost(struct sock *sk, int packets)  		}  		tcp_skb_mark_lost(tp, skb); + +		if (mark_head) +			break;  	}  	tcp_verify_left_out(tp);  } @@ -2568,17 +2558,18 @@ static void tcp_update_scoreboard(struct sock *sk, int fast_rexmit)  	struct tcp_sock *tp = tcp_sk(sk);  	if (tcp_is_reno(tp)) { -		tcp_mark_head_lost(sk, 1); +		tcp_mark_head_lost(sk, 1, 1);  	} else if (tcp_is_fack(tp)) {  		int lost = tp->fackets_out - tp->reordering;  		if (lost <= 0)  			lost = 1; -		tcp_mark_head_lost(sk, lost); +		tcp_mark_head_lost(sk, lost, 0);  	} else {  		int sacked_upto = tp->sacked_out - tp->reordering; -		if (sacked_upto < fast_rexmit) -			sacked_upto = fast_rexmit; -		tcp_mark_head_lost(sk, sacked_upto); +		if (sacked_upto >= 0) +			tcp_mark_head_lost(sk, sacked_upto, 0); +		else if (fast_rexmit) +			tcp_mark_head_lost(sk, 1, 1);  	}  	tcp_timeout_skbs(sk); @@ -2887,7 +2878,7 @@ static void tcp_mtup_probe_success(struct sock *sk)  		       icsk->icsk_mtup.probe_size;  	tp->snd_cwnd_cnt = 0;  	tp->snd_cwnd_stamp = tcp_time_stamp; -	tp->rcv_ssthresh = tcp_current_ssthresh(sk); +	tp->snd_ssthresh = tcp_current_ssthresh(sk);  	icsk->icsk_mtup.search_low = icsk->icsk_mtup.probe_size;  	icsk->icsk_mtup.probe_size = 0; @@ -2984,7 +2975,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, int flag)  	    before(tp->snd_una, tp->high_seq) &&  	    icsk->icsk_ca_state != TCP_CA_Open &&  	    tp->fackets_out > tp->reordering) { -		tcp_mark_head_lost(sk, tp->fackets_out - tp->reordering); +		tcp_mark_head_lost(sk, tp->fackets_out - tp->reordering, 0);  		NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPLOSS);  	} @@ -3412,8 +3403,8 @@ static void tcp_ack_probe(struct sock *sk)  static inline int tcp_ack_is_dubious(const struct sock *sk, const int flag)  { -	return (!(flag & FLAG_NOT_DUP) || (flag & FLAG_CA_ALERT) || -		inet_csk(sk)->icsk_ca_state != TCP_CA_Open); +	return !(flag & FLAG_NOT_DUP) || (flag & FLAG_CA_ALERT) || +		inet_csk(sk)->icsk_ca_state != TCP_CA_Open;  }  static inline int tcp_may_raise_cwnd(const struct sock *sk, const int flag) @@ -3430,9 +3421,9 @@ static inline int tcp_may_update_window(const struct tcp_sock *tp,  					const u32 ack, const u32 ack_seq,  					const u32 nwin)  { -	return (after(ack, tp->snd_una) || +	return	after(ack, tp->snd_una) ||  		after(ack_seq, tp->snd_wl1) || -		(ack_seq == tp->snd_wl1 && nwin > tp->snd_wnd)); +		(ack_seq == tp->snd_wl1 && nwin > tp->snd_wnd);  }  /* Update our send window. |