#define TCP_RACK_LOST_RETRANS  0x1
 
 extern void tcp_rack_mark_lost(struct sock *sk, const struct skb_mstamp *now);
-extern void tcp_rack_advance(struct tcp_sock *tp, u8 sacked,
+extern void tcp_rack_advance(struct tcp_sock *tp, u8 sacked, u32 end_seq,
                             const struct skb_mstamp *xmit_time,
                             const struct skb_mstamp *ack_time);
 extern void tcp_rack_reo_timeout(struct sock *sk);
 
                return sacked;
 
        if (!(sacked & TCPCB_SACKED_ACKED)) {
-               tcp_rack_advance(tp, sacked, xmit_time, &state->ack_time);
+               tcp_rack_advance(tp, sacked, end_seq,
+                                xmit_time, &state->ack_time);
 
                if (sacked & TCPCB_SACKED_RETRANS) {
                        /* If the segment is not tagged as lost,
                } else if (tcp_is_sack(tp)) {
                        tp->delivered += acked_pcount;
                        if (!tcp_skb_spurious_retrans(tp, skb))
-                               tcp_rack_advance(tp, sacked,
+                               tcp_rack_advance(tp, sacked, scb->end_seq,
                                                 &skb->skb_mstamp,
                                                 &sack->ack_time);
                }
 
        }
 }
 
+static bool tcp_rack_sent_after(const struct skb_mstamp *t1,
+                               const struct skb_mstamp *t2,
+                               u32 seq1, u32 seq2)
+{
+       return skb_mstamp_after(t1, t2) ||
+              (t1->v64 == t2->v64 && after(seq1, seq2));
+}
+
 /* Marks a packet lost, if some packet sent later has been (s)acked.
  * The underlying idea is similar to the traditional dupthresh and FACK
  * but they look at different metrics:
                    scb->sacked & TCPCB_SACKED_ACKED)
                        continue;
 
-               if (skb_mstamp_after(&tp->rack.mstamp, &skb->skb_mstamp)) {
+               if (tcp_rack_sent_after(&tp->rack.mstamp, &skb->skb_mstamp,
+                                       tp->rack.end_seq, scb->end_seq)) {
                        /* Step 3 in draft-cheng-tcpm-rack-00.txt:
                         * A packet is lost if its elapsed time is beyond
                         * the recent RTT plus the reordering window.
  * This is "Step 3: Advance RACK.xmit_time and update RACK.RTT" from
  * draft-cheng-tcpm-rack-00.txt
  */
-void tcp_rack_advance(struct tcp_sock *tp, u8 sacked,
+void tcp_rack_advance(struct tcp_sock *tp, u8 sacked, u32 end_seq,
                      const struct skb_mstamp *xmit_time,
                      const struct skb_mstamp *ack_time)
 {
        u32 rtt_us;
 
        if (tp->rack.mstamp.v64 &&
-           !skb_mstamp_after(xmit_time, &tp->rack.mstamp))
+           !tcp_rack_sent_after(xmit_time, &tp->rack.mstamp,
+                                end_seq, tp->rack.end_seq))
                return;
 
        rtt_us = skb_mstamp_us_delta(ack_time, xmit_time);
        }
        tp->rack.rtt_us = rtt_us;
        tp->rack.mstamp = *xmit_time;
+       tp->rack.end_seq = end_seq;
        tp->rack.advanced = 1;
 }