OSDN Git Service

tcp: fix TCP_REPAIR xmit queue setup
[uclinux-h8/linux.git] / net / ipv4 / tcp_output.c
index d212e4c..c07990a 100644 (file)
@@ -2321,18 +2321,19 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle,
        while ((skb = tcp_send_head(sk))) {
                unsigned int limit;
 
+               if (unlikely(tp->repair) && tp->repair_queue == TCP_SEND_QUEUE) {
+                       /* "skb_mstamp_ns" is used as a start point for the retransmit timer */
+                       skb->skb_mstamp_ns = tp->tcp_wstamp_ns = tp->tcp_clock_cache;
+                       list_move_tail(&skb->tcp_tsorted_anchor, &tp->tsorted_sent_queue);
+                       goto repair; /* Skip network transmission */
+               }
+
                if (tcp_pacing_check(sk))
                        break;
 
                tso_segs = tcp_init_tso_segs(skb, mss_now);
                BUG_ON(!tso_segs);
 
-               if (unlikely(tp->repair) && tp->repair_queue == TCP_SEND_QUEUE) {
-                       /* "skb_mstamp" is used as a start point for the retransmit timer */
-                       tcp_update_skb_after_send(sk, skb, tp->tcp_wstamp_ns);
-                       goto repair; /* Skip network transmission */
-               }
-
                cwnd_quota = tcp_cwnd_test(tp, skb);
                if (!cwnd_quota) {
                        if (push_one == 2)