before(TCP_SKB_CB(skb)->seq,
                   TCP_SKB_CB(tp->retransmit_skb_hint)->seq))
                tp->retransmit_skb_hint = skb;
-
-       if (!tp->lost_out ||
-           after(TCP_SKB_CB(skb)->end_seq, tp->retransmit_high))
-               tp->retransmit_high = TCP_SKB_CB(skb)->end_seq;
 }
 
 /* Sum the number of packets on the wire we have marked as lost.
                        TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_ACKED;
                        TCP_SKB_CB(skb)->sacked |= TCPCB_LOST;
                        tp->lost_out += tcp_skb_pcount(skb);
-                       tp->retransmit_high = TCP_SKB_CB(skb)->end_seq;
                }
        }
        tcp_verify_left_out(tp);
 
        return err;
 }
 
-/* Check if we forward retransmits are possible in the current
- * window/congestion state.
- */
-static bool tcp_can_forward_retransmit(struct sock *sk)
-{
-       const struct inet_connection_sock *icsk = inet_csk(sk);
-       const struct tcp_sock *tp = tcp_sk(sk);
-
-       /* Forward retransmissions are possible only during Recovery. */
-       if (icsk->icsk_ca_state != TCP_CA_Recovery)
-               return false;
-
-       /* No forward retransmissions in Reno are possible. */
-       if (tcp_is_reno(tp))
-               return false;
-
-       /* Yeah, we have to make difficult choice between forward transmission
-        * and retransmission... Both ways have their merits...
-        *
-        * For now we do not retransmit anything, while we have some new
-        * segments to send. In the other cases, follow rule 3 for
-        * NextSeg() specified in RFC3517.
-        */
-
-       if (tcp_may_send_now(sk))
-               return false;
-
-       return true;
-}
-
 /* This gets called after a retransmit timeout, and the initially
  * retransmitted data is acknowledged.  It tries to continue
  * resending the rest of the retransmit queue, until either
        struct tcp_sock *tp = tcp_sk(sk);
        struct sk_buff *skb;
        struct sk_buff *hole = NULL;
-       u32 max_segs, last_lost;
+       u32 max_segs;
        int mib_idx;
-       int fwd_rexmitting = 0;
 
        if (!tp->packets_out)
                return;
 
-       if (!tp->lost_out)
-               tp->retransmit_high = tp->snd_una;
-
        if (tp->retransmit_skb_hint) {
                skb = tp->retransmit_skb_hint;
-               last_lost = TCP_SKB_CB(skb)->end_seq;
-               if (after(last_lost, tp->retransmit_high))
-                       last_lost = tp->retransmit_high;
        } else {
                skb = tcp_write_queue_head(sk);
-               last_lost = tp->snd_una;
        }
 
        max_segs = tcp_tso_segs(sk, tcp_current_mss(sk));
                 */
                segs = min_t(int, segs, max_segs);
 
-               if (fwd_rexmitting) {
-begin_fwd:
-                       if (!before(TCP_SKB_CB(skb)->seq, tcp_highest_sack_seq(tp)))
-                               break;
-                       mib_idx = LINUX_MIB_TCPFORWARDRETRANS;
-
-               } else if (!before(TCP_SKB_CB(skb)->seq, tp->retransmit_high)) {
-                       tp->retransmit_high = last_lost;
-                       if (!tcp_can_forward_retransmit(sk))
-                               break;
-                       /* Backtrack if necessary to non-L'ed skb */
-                       if (hole) {
-                               skb = hole;
-                               hole = NULL;
-                       }
-                       fwd_rexmitting = 1;
-                       goto begin_fwd;
-
+               if (tp->retrans_out >= tp->lost_out) {
+                       break;
                } else if (!(sacked & TCPCB_LOST)) {
                        if (!hole && !(sacked & (TCPCB_SACKED_RETRANS|TCPCB_SACKED_ACKED)))
                                hole = skb;
                        continue;
 
                } else {
-                       last_lost = TCP_SKB_CB(skb)->end_seq;
                        if (icsk->icsk_ca_state != TCP_CA_Loss)
                                mib_idx = LINUX_MIB_TCPFASTRETRANS;
                        else