]> nv-tegra.nvidia Code Review - linux-2.6.git/blobdiff - net/ipv4/tcp_input.c
[TCP]: Fix __tcp_push_pending_frames() 'nonagle' handling.
[linux-2.6.git] / net / ipv4 / tcp_input.c
index 577424323d5993df11e2e97c6ab3bf29d8b595c6..b27be2f819acff07dd861dd73fae4030ab15a80a 100644 (file)
@@ -3346,12 +3346,9 @@ static inline void tcp_check_space(struct sock *sk)
        }
 }
 
        }
 }
 
-static __inline__ void tcp_data_snd_check(struct sock *sk)
+static __inline__ void tcp_data_snd_check(struct sock *sk, struct tcp_sock *tp)
 {
 {
-       struct sk_buff *skb = sk->sk_send_head;
-
-       if (skb != NULL)
-               __tcp_data_snd_check(sk, skb);
+       tcp_push_pending_frames(sk, tp);
        tcp_check_space(sk);
 }
 
        tcp_check_space(sk);
 }
 
@@ -3645,7 +3642,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
                                 */
                                tcp_ack(sk, skb, 0);
                                __kfree_skb(skb); 
                                 */
                                tcp_ack(sk, skb, 0);
                                __kfree_skb(skb); 
-                               tcp_data_snd_check(sk);
+                               tcp_data_snd_check(sk, tp);
                                return 0;
                        } else { /* Header too small */
                                TCP_INC_STATS_BH(TCP_MIB_INERRS);
                                return 0;
                        } else { /* Header too small */
                                TCP_INC_STATS_BH(TCP_MIB_INERRS);
@@ -3711,7 +3708,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
                        if (TCP_SKB_CB(skb)->ack_seq != tp->snd_una) {
                                /* Well, only one small jumplet in fast path... */
                                tcp_ack(sk, skb, FLAG_DATA);
                        if (TCP_SKB_CB(skb)->ack_seq != tp->snd_una) {
                                /* Well, only one small jumplet in fast path... */
                                tcp_ack(sk, skb, FLAG_DATA);
-                               tcp_data_snd_check(sk);
+                               tcp_data_snd_check(sk, tp);
                                if (!tcp_ack_scheduled(tp))
                                        goto no_ack;
                        }
                                if (!tcp_ack_scheduled(tp))
                                        goto no_ack;
                        }
@@ -3789,7 +3786,7 @@ step5:
        /* step 7: process the segment text */
        tcp_data_queue(sk, skb);
 
        /* step 7: process the segment text */
        tcp_data_queue(sk, skb);
 
-       tcp_data_snd_check(sk);
+       tcp_data_snd_check(sk, tp);
        tcp_ack_snd_check(sk);
        return 0;
 
        tcp_ack_snd_check(sk);
        return 0;
 
@@ -4099,7 +4096,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                /* Do step6 onward by hand. */
                tcp_urg(sk, skb, th);
                __kfree_skb(skb);
                /* Do step6 onward by hand. */
                tcp_urg(sk, skb, th);
                __kfree_skb(skb);
-               tcp_data_snd_check(sk);
+               tcp_data_snd_check(sk, tp);
                return 0;
        }
 
                return 0;
        }
 
@@ -4290,7 +4287,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
 
        /* tcp_data could move socket to TIME-WAIT */
        if (sk->sk_state != TCP_CLOSE) {
 
        /* tcp_data could move socket to TIME-WAIT */
        if (sk->sk_state != TCP_CLOSE) {
-               tcp_data_snd_check(sk);
+               tcp_data_snd_check(sk, tp);
                tcp_ack_snd_check(sk);
        }
 
                tcp_ack_snd_check(sk);
        }