Skip to content

Commit fcf4b1f

Browse files
receive: keep retransmissions for ACKed-but-not-yet-delivered seqs
A retransmission for a sequence number that was ACKed past (because periodicACK crossed a gap, either in-row or via the PktTsbpdTime <= now branch) but not yet delivered was being dropped by the Lt(lastACKSequenceNumber) branch as "already acknowledged". Allow retransmissions through this branch; they fall into the out-of-order handling below where they either fill the gap or are detected as duplicates. TLPKTDROP semantics remain enforced by the earlier Lte(lastDeliveredSequenceNumber) check, which still drops anything already delivered or skipped past. Makes the regression test from the previous commit pass. Made-with: Cursor Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 572af9c commit fcf4b1f

1 file changed

Lines changed: 17 additions & 4 deletions

File tree

congestion/live/receive.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,24 @@ func (r *receiver) Push(pkt packet.Packet) {
194194
}
195195

196196
if pkt.Header().PacketSequenceNumber.Lt(r.lastACKSequenceNumber) {
197-
// Already acknowledged, ignoring
198-
r.statistics.PktDrop++
199-
r.statistics.ByteDrop += pktLen
197+
if !pkt.Header().RetransmittedPacketFlag {
198+
// Already acknowledged, ignoring
199+
r.statistics.PktDrop++
200+
r.statistics.ByteDrop += pktLen
200201

201-
return
202+
return
203+
}
204+
// Retransmission for a sequence number that was ACKed past but
205+
// not yet delivered. periodicACK and the delivery loop are
206+
// separate critical sections within Tick: lastACKSequenceNumber
207+
// can advance past a gap (e.g. when packets after the gap have
208+
// ripe PktTsbpdTime) before lastDeliveredSequenceNumber catches
209+
// up. A retransmission may legitimately arrive in that window.
210+
// Allow it to flow into the out-of-order branch below, where
211+
// it will either fill the gap or be detected as a duplicate.
212+
// TLPKTDROP semantics are still enforced by the earlier
213+
// Lte(lastDeliveredSequenceNumber) check, which drops anything
214+
// already delivered or skipped past.
202215
}
203216

204217
if pkt.Header().PacketSequenceNumber.Equals(r.maxSeenSequenceNumber.Inc()) {

0 commit comments

Comments
 (0)