[TCP]: Fix __tcp_push_pending_frames() 'nonagle' handling.
'nonagle' should be passed to the tcp_snd_test() function as 'TCP_NAGLE_PUSH' if we are checking an SKB not at the tail of the write_queue. This is because Nagle does not apply to such frames since we cannot possibly tack more data onto them. However, while doing this __tcp_push_pending_frames() makes all of the packets in the write_queue use this modified 'nonagle' value. Fix the bug and simplify this function by just calling tcp_write_xmit() directly if sk_send_head is non-NULL. As a result, we can now make tcp_data_snd_check() just call tcp_push_pending_frames() instead of the specialized __tcp_data_snd_check(). Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -894,24 +894,11 @@ void __tcp_push_pending_frames(struct sock *sk, struct tcp_sock *tp,
|
||||
struct sk_buff *skb = sk->sk_send_head;
|
||||
|
||||
if (skb) {
|
||||
if (!tcp_skb_is_last(sk, skb))
|
||||
nonagle = TCP_NAGLE_PUSH;
|
||||
if (!tcp_snd_test(sk, skb, cur_mss, nonagle) ||
|
||||
tcp_write_xmit(sk, cur_mss, nonagle))
|
||||
if (tcp_write_xmit(sk, cur_mss, nonagle))
|
||||
tcp_check_probe_timer(sk, tp);
|
||||
}
|
||||
}
|
||||
|
||||
void __tcp_data_snd_check(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
|
||||
if (after(TCP_SKB_CB(skb)->end_seq, tp->snd_una + tp->snd_wnd) ||
|
||||
tcp_packets_in_flight(tp) >= tp->snd_cwnd ||
|
||||
tcp_write_xmit(sk, tcp_current_mss(sk, 1), tp->nonagle))
|
||||
tcp_check_probe_timer(sk, tp);
|
||||
}
|
||||
|
||||
/* This function returns the amount that we can raise the
|
||||
* usable window based on the following constraints
|
||||
*
|
||||
|
Reference in New Issue
Block a user