diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2005-07-13 16:23:51 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-07-13 16:23:51 -0400 |
commit | 327309e899662b482c58cf25f574513d38b5788c (patch) | |
tree | 069de438aa0e92dd9b6ba28e6b207e2cd07151a5 /net/ipv4/tcp_input.c | |
parent | 0c168775709faa74c1b87f1e61046e0c51ade7f3 (diff) | |
parent | c32511e2718618f0b53479eb36e07439aa363a74 (diff) |
Merge upstream 2.6.13-rc3 into ieee80211 branch of netdev-2.6.
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r-- | net/ipv4/tcp_input.c | 87 |
1 files changed, 42 insertions, 45 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 7bbbbc33eb4b..53a8a5399f1e 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -740,10 +740,10 @@ __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst) | |||
740 | __u32 cwnd = (dst ? dst_metric(dst, RTAX_INITCWND) : 0); | 740 | __u32 cwnd = (dst ? dst_metric(dst, RTAX_INITCWND) : 0); |
741 | 741 | ||
742 | if (!cwnd) { | 742 | if (!cwnd) { |
743 | if (tp->mss_cache_std > 1460) | 743 | if (tp->mss_cache > 1460) |
744 | cwnd = 2; | 744 | cwnd = 2; |
745 | else | 745 | else |
746 | cwnd = (tp->mss_cache_std > 1095) ? 3 : 4; | 746 | cwnd = (tp->mss_cache > 1095) ? 3 : 4; |
747 | } | 747 | } |
748 | return min_t(__u32, cwnd, tp->snd_cwnd_clamp); | 748 | return min_t(__u32, cwnd, tp->snd_cwnd_clamp); |
749 | } | 749 | } |
@@ -914,7 +914,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
914 | if (sk->sk_route_caps & NETIF_F_TSO) { | 914 | if (sk->sk_route_caps & NETIF_F_TSO) { |
915 | sk->sk_route_caps &= ~NETIF_F_TSO; | 915 | sk->sk_route_caps &= ~NETIF_F_TSO; |
916 | sock_set_flag(sk, SOCK_NO_LARGESEND); | 916 | sock_set_flag(sk, SOCK_NO_LARGESEND); |
917 | tp->mss_cache = tp->mss_cache_std; | 917 | tp->mss_cache = tp->mss_cache; |
918 | } | 918 | } |
919 | 919 | ||
920 | if (!tp->sacked_out) | 920 | if (!tp->sacked_out) |
@@ -1077,7 +1077,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
1077 | (IsFack(tp) || | 1077 | (IsFack(tp) || |
1078 | !before(lost_retrans, | 1078 | !before(lost_retrans, |
1079 | TCP_SKB_CB(skb)->ack_seq + tp->reordering * | 1079 | TCP_SKB_CB(skb)->ack_seq + tp->reordering * |
1080 | tp->mss_cache_std))) { | 1080 | tp->mss_cache))) { |
1081 | TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS; | 1081 | TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS; |
1082 | tp->retrans_out -= tcp_skb_pcount(skb); | 1082 | tp->retrans_out -= tcp_skb_pcount(skb); |
1083 | 1083 | ||
@@ -1957,15 +1957,6 @@ static inline void tcp_ack_packets_out(struct sock *sk, struct tcp_sock *tp) | |||
1957 | } | 1957 | } |
1958 | } | 1958 | } |
1959 | 1959 | ||
1960 | /* There is one downside to this scheme. Although we keep the | ||
1961 | * ACK clock ticking, adjusting packet counters and advancing | ||
1962 | * congestion window, we do not liberate socket send buffer | ||
1963 | * space. | ||
1964 | * | ||
1965 | * Mucking with skb->truesize and sk->sk_wmem_alloc et al. | ||
1966 | * then making a write space wakeup callback is a possible | ||
1967 | * future enhancement. WARNING: it is not trivial to make. | ||
1968 | */ | ||
1969 | static int tcp_tso_acked(struct sock *sk, struct sk_buff *skb, | 1960 | static int tcp_tso_acked(struct sock *sk, struct sk_buff *skb, |
1970 | __u32 now, __s32 *seq_rtt) | 1961 | __u32 now, __s32 *seq_rtt) |
1971 | { | 1962 | { |
@@ -2047,7 +2038,8 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p, s32 *seq_usrtt | |||
2047 | * the other end. | 2038 | * the other end. |
2048 | */ | 2039 | */ |
2049 | if (after(scb->end_seq, tp->snd_una)) { | 2040 | if (after(scb->end_seq, tp->snd_una)) { |
2050 | if (tcp_skb_pcount(skb) > 1) | 2041 | if (tcp_skb_pcount(skb) > 1 && |
2042 | after(tp->snd_una, scb->seq)) | ||
2051 | acked |= tcp_tso_acked(sk, skb, | 2043 | acked |= tcp_tso_acked(sk, skb, |
2052 | now, &seq_rtt); | 2044 | now, &seq_rtt); |
2053 | break; | 2045 | break; |
@@ -2810,7 +2802,7 @@ static void tcp_sack_remove(struct tcp_sock *tp) | |||
2810 | int this_sack; | 2802 | int this_sack; |
2811 | 2803 | ||
2812 | /* Empty ofo queue, hence, all the SACKs are eaten. Clear. */ | 2804 | /* Empty ofo queue, hence, all the SACKs are eaten. Clear. */ |
2813 | if (skb_queue_len(&tp->out_of_order_queue) == 0) { | 2805 | if (skb_queue_empty(&tp->out_of_order_queue)) { |
2814 | tp->rx_opt.num_sacks = 0; | 2806 | tp->rx_opt.num_sacks = 0; |
2815 | tp->rx_opt.eff_sacks = tp->rx_opt.dsack; | 2807 | tp->rx_opt.eff_sacks = tp->rx_opt.dsack; |
2816 | return; | 2808 | return; |
@@ -2943,13 +2935,13 @@ queue_and_out: | |||
2943 | if(th->fin) | 2935 | if(th->fin) |
2944 | tcp_fin(skb, sk, th); | 2936 | tcp_fin(skb, sk, th); |
2945 | 2937 | ||
2946 | if (skb_queue_len(&tp->out_of_order_queue)) { | 2938 | if (!skb_queue_empty(&tp->out_of_order_queue)) { |
2947 | tcp_ofo_queue(sk); | 2939 | tcp_ofo_queue(sk); |
2948 | 2940 | ||
2949 | /* RFC2581. 4.2. SHOULD send immediate ACK, when | 2941 | /* RFC2581. 4.2. SHOULD send immediate ACK, when |
2950 | * gap in queue is filled. | 2942 | * gap in queue is filled. |
2951 | */ | 2943 | */ |
2952 | if (!skb_queue_len(&tp->out_of_order_queue)) | 2944 | if (skb_queue_empty(&tp->out_of_order_queue)) |
2953 | tp->ack.pingpong = 0; | 2945 | tp->ack.pingpong = 0; |
2954 | } | 2946 | } |
2955 | 2947 | ||
@@ -3257,9 +3249,8 @@ static int tcp_prune_queue(struct sock *sk) | |||
3257 | * This must not ever occur. */ | 3249 | * This must not ever occur. */ |
3258 | 3250 | ||
3259 | /* First, purge the out_of_order queue. */ | 3251 | /* First, purge the out_of_order queue. */ |
3260 | if (skb_queue_len(&tp->out_of_order_queue)) { | 3252 | if (!skb_queue_empty(&tp->out_of_order_queue)) { |
3261 | NET_ADD_STATS_BH(LINUX_MIB_OFOPRUNED, | 3253 | NET_INC_STATS_BH(LINUX_MIB_OFOPRUNED); |
3262 | skb_queue_len(&tp->out_of_order_queue)); | ||
3263 | __skb_queue_purge(&tp->out_of_order_queue); | 3254 | __skb_queue_purge(&tp->out_of_order_queue); |
3264 | 3255 | ||
3265 | /* Reset SACK state. A conforming SACK implementation will | 3256 | /* Reset SACK state. A conforming SACK implementation will |
@@ -3308,6 +3299,28 @@ void tcp_cwnd_application_limited(struct sock *sk) | |||
3308 | tp->snd_cwnd_stamp = tcp_time_stamp; | 3299 | tp->snd_cwnd_stamp = tcp_time_stamp; |
3309 | } | 3300 | } |
3310 | 3301 | ||
3302 | static inline int tcp_should_expand_sndbuf(struct sock *sk, struct tcp_sock *tp) | ||
3303 | { | ||
3304 | /* If the user specified a specific send buffer setting, do | ||
3305 | * not modify it. | ||
3306 | */ | ||
3307 | if (sk->sk_userlocks & SOCK_SNDBUF_LOCK) | ||
3308 | return 0; | ||
3309 | |||
3310 | /* If we are under global TCP memory pressure, do not expand. */ | ||
3311 | if (tcp_memory_pressure) | ||
3312 | return 0; | ||
3313 | |||
3314 | /* If we are under soft global TCP memory pressure, do not expand. */ | ||
3315 | if (atomic_read(&tcp_memory_allocated) >= sysctl_tcp_mem[0]) | ||
3316 | return 0; | ||
3317 | |||
3318 | /* If we filled the congestion window, do not expand. */ | ||
3319 | if (tp->packets_out >= tp->snd_cwnd) | ||
3320 | return 0; | ||
3321 | |||
3322 | return 1; | ||
3323 | } | ||
3311 | 3324 | ||
3312 | /* When incoming ACK allowed to free some skb from write_queue, | 3325 | /* When incoming ACK allowed to free some skb from write_queue, |
3313 | * we remember this event in flag SOCK_QUEUE_SHRUNK and wake up socket | 3326 | * we remember this event in flag SOCK_QUEUE_SHRUNK and wake up socket |
@@ -3319,11 +3332,8 @@ static void tcp_new_space(struct sock *sk) | |||
3319 | { | 3332 | { |
3320 | struct tcp_sock *tp = tcp_sk(sk); | 3333 | struct tcp_sock *tp = tcp_sk(sk); |
3321 | 3334 | ||
3322 | if (tp->packets_out < tp->snd_cwnd && | 3335 | if (tcp_should_expand_sndbuf(sk, tp)) { |
3323 | !(sk->sk_userlocks & SOCK_SNDBUF_LOCK) && | 3336 | int sndmem = max_t(u32, tp->rx_opt.mss_clamp, tp->mss_cache) + |
3324 | !tcp_memory_pressure && | ||
3325 | atomic_read(&tcp_memory_allocated) < sysctl_tcp_mem[0]) { | ||
3326 | int sndmem = max_t(u32, tp->rx_opt.mss_clamp, tp->mss_cache_std) + | ||
3327 | MAX_TCP_HEADER + 16 + sizeof(struct sk_buff), | 3337 | MAX_TCP_HEADER + 16 + sizeof(struct sk_buff), |
3328 | demanded = max_t(unsigned int, tp->snd_cwnd, | 3338 | demanded = max_t(unsigned int, tp->snd_cwnd, |
3329 | tp->reordering + 1); | 3339 | tp->reordering + 1); |
@@ -3346,22 +3356,9 @@ static inline void tcp_check_space(struct sock *sk) | |||
3346 | } | 3356 | } |
3347 | } | 3357 | } |
3348 | 3358 | ||
3349 | static void __tcp_data_snd_check(struct sock *sk, struct sk_buff *skb) | 3359 | static __inline__ void tcp_data_snd_check(struct sock *sk, struct tcp_sock *tp) |
3350 | { | ||
3351 | struct tcp_sock *tp = tcp_sk(sk); | ||
3352 | |||
3353 | if (after(TCP_SKB_CB(skb)->end_seq, tp->snd_una + tp->snd_wnd) || | ||
3354 | tcp_packets_in_flight(tp) >= tp->snd_cwnd || | ||
3355 | tcp_write_xmit(sk, tp->nonagle)) | ||
3356 | tcp_check_probe_timer(sk, tp); | ||
3357 | } | ||
3358 | |||
3359 | static __inline__ void tcp_data_snd_check(struct sock *sk) | ||
3360 | { | 3360 | { |
3361 | struct sk_buff *skb = sk->sk_send_head; | 3361 | tcp_push_pending_frames(sk, tp); |
3362 | |||
3363 | if (skb != NULL) | ||
3364 | __tcp_data_snd_check(sk, skb); | ||
3365 | tcp_check_space(sk); | 3362 | tcp_check_space(sk); |
3366 | } | 3363 | } |
3367 | 3364 | ||
@@ -3655,7 +3652,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, | |||
3655 | */ | 3652 | */ |
3656 | tcp_ack(sk, skb, 0); | 3653 | tcp_ack(sk, skb, 0); |
3657 | __kfree_skb(skb); | 3654 | __kfree_skb(skb); |
3658 | tcp_data_snd_check(sk); | 3655 | tcp_data_snd_check(sk, tp); |
3659 | return 0; | 3656 | return 0; |
3660 | } else { /* Header too small */ | 3657 | } else { /* Header too small */ |
3661 | TCP_INC_STATS_BH(TCP_MIB_INERRS); | 3658 | TCP_INC_STATS_BH(TCP_MIB_INERRS); |
@@ -3721,7 +3718,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, | |||
3721 | if (TCP_SKB_CB(skb)->ack_seq != tp->snd_una) { | 3718 | if (TCP_SKB_CB(skb)->ack_seq != tp->snd_una) { |
3722 | /* Well, only one small jumplet in fast path... */ | 3719 | /* Well, only one small jumplet in fast path... */ |
3723 | tcp_ack(sk, skb, FLAG_DATA); | 3720 | tcp_ack(sk, skb, FLAG_DATA); |
3724 | tcp_data_snd_check(sk); | 3721 | tcp_data_snd_check(sk, tp); |
3725 | if (!tcp_ack_scheduled(tp)) | 3722 | if (!tcp_ack_scheduled(tp)) |
3726 | goto no_ack; | 3723 | goto no_ack; |
3727 | } | 3724 | } |
@@ -3799,7 +3796,7 @@ step5: | |||
3799 | /* step 7: process the segment text */ | 3796 | /* step 7: process the segment text */ |
3800 | tcp_data_queue(sk, skb); | 3797 | tcp_data_queue(sk, skb); |
3801 | 3798 | ||
3802 | tcp_data_snd_check(sk); | 3799 | tcp_data_snd_check(sk, tp); |
3803 | tcp_ack_snd_check(sk); | 3800 | tcp_ack_snd_check(sk); |
3804 | return 0; | 3801 | return 0; |
3805 | 3802 | ||
@@ -4109,7 +4106,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
4109 | /* Do step6 onward by hand. */ | 4106 | /* Do step6 onward by hand. */ |
4110 | tcp_urg(sk, skb, th); | 4107 | tcp_urg(sk, skb, th); |
4111 | __kfree_skb(skb); | 4108 | __kfree_skb(skb); |
4112 | tcp_data_snd_check(sk); | 4109 | tcp_data_snd_check(sk, tp); |
4113 | return 0; | 4110 | return 0; |
4114 | } | 4111 | } |
4115 | 4112 | ||
@@ -4300,7 +4297,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
4300 | 4297 | ||
4301 | /* tcp_data could move socket to TIME-WAIT */ | 4298 | /* tcp_data could move socket to TIME-WAIT */ |
4302 | if (sk->sk_state != TCP_CLOSE) { | 4299 | if (sk->sk_state != TCP_CLOSE) { |
4303 | tcp_data_snd_check(sk); | 4300 | tcp_data_snd_check(sk, tp); |
4304 | tcp_ack_snd_check(sk); | 4301 | tcp_ack_snd_check(sk); |
4305 | } | 4302 | } |
4306 | 4303 | ||