diff options
-rw-r--r-- | net/ipv4/tcp_output.c | 68 |
1 files changed, 34 insertions, 34 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index a6375ca2a59e..2a8409c3af1a 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -842,54 +842,54 @@ static inline void tcp_cwnd_validate(struct sock *sk, struct tcp_sock *tp) | |||
842 | static int tcp_write_xmit(struct sock *sk, int nonagle) | 842 | static int tcp_write_xmit(struct sock *sk, int nonagle) |
843 | { | 843 | { |
844 | struct tcp_sock *tp = tcp_sk(sk); | 844 | struct tcp_sock *tp = tcp_sk(sk); |
845 | struct sk_buff *skb; | ||
845 | unsigned int mss_now; | 846 | unsigned int mss_now; |
847 | int sent_pkts; | ||
846 | 848 | ||
847 | /* If we are closed, the bytes will have to remain here. | 849 | /* If we are closed, the bytes will have to remain here. |
848 | * In time closedown will finish, we empty the write queue and all | 850 | * In time closedown will finish, we empty the write queue and all |
849 | * will be happy. | 851 | * will be happy. |
850 | */ | 852 | */ |
851 | if (sk->sk_state != TCP_CLOSE) { | 853 | if (unlikely(sk->sk_state == TCP_CLOSE)) |
852 | struct sk_buff *skb; | 854 | return 0; |
853 | int sent_pkts = 0; | ||
854 | 855 | ||
855 | /* Account for SACKS, we may need to fragment due to this. | ||
856 | * It is just like the real MSS changing on us midstream. | ||
857 | * We also handle things correctly when the user adds some | ||
858 | * IP options mid-stream. Silly to do, but cover it. | ||
859 | */ | ||
860 | mss_now = tcp_current_mss(sk, 1); | ||
861 | |||
862 | while ((skb = sk->sk_send_head) && | ||
863 | tcp_snd_test(sk, skb, mss_now, | ||
864 | tcp_skb_is_last(sk, skb) ? nonagle : | ||
865 | TCP_NAGLE_PUSH)) { | ||
866 | if (skb->len > mss_now) { | ||
867 | if (tcp_fragment(sk, skb, mss_now)) | ||
868 | break; | ||
869 | } | ||
870 | 856 | ||
871 | TCP_SKB_CB(skb)->when = tcp_time_stamp; | 857 | /* Account for SACKS, we may need to fragment due to this. |
872 | tcp_tso_set_push(skb); | 858 | * It is just like the real MSS changing on us midstream. |
873 | if (tcp_transmit_skb(sk, skb_clone(skb, GFP_ATOMIC))) | 859 | * We also handle things correctly when the user adds some |
860 | * IP options mid-stream. Silly to do, but cover it. | ||
861 | */ | ||
862 | mss_now = tcp_current_mss(sk, 1); | ||
863 | sent_pkts = 0; | ||
864 | while ((skb = sk->sk_send_head) && | ||
865 | tcp_snd_test(sk, skb, mss_now, | ||
866 | tcp_skb_is_last(sk, skb) ? nonagle : | ||
867 | TCP_NAGLE_PUSH)) { | ||
868 | if (skb->len > mss_now) { | ||
869 | if (tcp_fragment(sk, skb, mss_now)) | ||
874 | break; | 870 | break; |
871 | } | ||
875 | 872 | ||
876 | /* Advance the send_head. This one is sent out. | 873 | TCP_SKB_CB(skb)->when = tcp_time_stamp; |
877 | * This call will increment packets_out. | 874 | tcp_tso_set_push(skb); |
878 | */ | 875 | if (tcp_transmit_skb(sk, skb_clone(skb, GFP_ATOMIC))) |
879 | update_send_head(sk, tp, skb); | 876 | break; |
880 | 877 | ||
881 | tcp_minshall_update(tp, mss_now, skb); | 878 | /* Advance the send_head. This one is sent out. |
882 | sent_pkts = 1; | 879 | * This call will increment packets_out. |
883 | } | 880 | */ |
881 | update_send_head(sk, tp, skb); | ||
884 | 882 | ||
885 | if (sent_pkts) { | 883 | tcp_minshall_update(tp, mss_now, skb); |
886 | tcp_cwnd_validate(sk, tp); | 884 | sent_pkts = 1; |
887 | return 0; | 885 | } |
888 | } | ||
889 | 886 | ||
890 | return !tp->packets_out && sk->sk_send_head; | 887 | if (sent_pkts) { |
888 | tcp_cwnd_validate(sk, tp); | ||
889 | return 0; | ||
891 | } | 890 | } |
892 | return 0; | 891 | |
892 | return !tp->packets_out && sk->sk_send_head; | ||
893 | } | 893 | } |
894 | 894 | ||
895 | /* Push out any pending frames which were held back due to | 895 | /* Push out any pending frames which were held back due to |