|
@@ -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);
|
|
tcp_ack(sk, skb, 0);
|
|
__kfree_skb(skb);
|
|
__kfree_skb(skb);
|
|
- tcp_data_snd_check(sk);
|
|
|
|
|
|
+ tcp_data_snd_check(sk, tp);
|
|
return 0;
|
|
return 0;
|
|
} else { /* Header too small */
|
|
} else { /* Header too small */
|
|
TCP_INC_STATS_BH(TCP_MIB_INERRS);
|
|
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) {
|
|
if (TCP_SKB_CB(skb)->ack_seq != tp->snd_una) {
|
|
/* Well, only one small jumplet in fast path... */
|
|
/* Well, only one small jumplet in fast path... */
|
|
tcp_ack(sk, skb, FLAG_DATA);
|
|
tcp_ack(sk, skb, FLAG_DATA);
|
|
- tcp_data_snd_check(sk);
|
|
|
|
|
|
+ tcp_data_snd_check(sk, tp);
|
|
if (!tcp_ack_scheduled(tp))
|
|
if (!tcp_ack_scheduled(tp))
|
|
goto no_ack;
|
|
goto no_ack;
|
|
}
|
|
}
|
|
@@ -3789,7 +3786,7 @@ step5:
|
|
/* step 7: process the segment text */
|
|
/* step 7: process the segment text */
|
|
tcp_data_queue(sk, skb);
|
|
tcp_data_queue(sk, skb);
|
|
|
|
|
|
- tcp_data_snd_check(sk);
|
|
|
|
|
|
+ tcp_data_snd_check(sk, tp);
|
|
tcp_ack_snd_check(sk);
|
|
tcp_ack_snd_check(sk);
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
@@ -4099,7 +4096,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|
/* Do step6 onward by hand. */
|
|
/* Do step6 onward by hand. */
|
|
tcp_urg(sk, skb, th);
|
|
tcp_urg(sk, skb, th);
|
|
__kfree_skb(skb);
|
|
__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 */
|
|
/* tcp_data could move socket to TIME-WAIT */
|
|
if (sk->sk_state != TCP_CLOSE) {
|
|
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);
|
|
}
|
|
}
|
|
|
|
|