Loading debian/changelog +11 −3 Original line number Diff line number Diff line libnetplus (20260504+1) unstable; urgency=medium libnetplus (20260504+2) unstable; urgency=medium * QUIC: implement PTO (Probe Timeout, RFC 9002 §6.2) — retransmit the oldest unacked packet with exponential back-off when the peer has not acknowledged tail packets, fixing the "tail loss" deadlock where both sides wait indefinitely after the last few UDP datagrams are lost * QUIC: pumpNetwork() now calls checkLossAndRetransmit() so that callers waiting for responses (e.g. parity store_stripe Phase 2) trigger retransmission of lost packets * QUIC: fix sendStreamData(vector) silently losing data on congestion control stall — now retries in a loop with pumpIncoming() between attempts until all data (including FIN) is delivered * QUIC: only mark stream send_fin when all data was actually sent on the wire, preventing incorrect state when CC breaks the send loop -- Jan Koester <jan.koester@tuxist.de> Sun, 04 May 2026 19:00:00 +0200 -- Jan Koester <jan.koester@tuxist.de> Sun, 04 May 2026 19:30:00 +0200 libnetplus (20260502+1) unstable; urgency=medium Loading src/quic.cpp +2 −3 Original line number Diff line number Diff line Loading @@ -3629,7 +3629,6 @@ void quic::checkLossAndRetransmit() { if (age >= pto_thresh) { // Retransmit the oldest unacked packet as a probe auto sp = oldest; // copy — will be erased below uint64_t old_pn = _sent_packets.begin()->first; _sent_packets.erase(_sent_packets.begin()); ++_pto_count; Loading Loading @@ -3659,8 +3658,8 @@ void quic::checkLossAndRetransmit() { sp.stream_data.data(), sp.stream_data.size(), sp.fin, packet.size()); } QUIC_DBG("PTO probe: old_pn=%lu new_pn=%lu age=%.3fs pto=%.3fs", (unsigned long)old_pn, (unsigned long)new_pn, age, pto_thresh); QUIC_DBG("PTO probe: new_pn=%lu age=%.3fs pto=%.3fs", (unsigned long)new_pn, age, pto_thresh); } } } Loading Loading
debian/changelog +11 −3 Original line number Diff line number Diff line libnetplus (20260504+1) unstable; urgency=medium libnetplus (20260504+2) unstable; urgency=medium * QUIC: implement PTO (Probe Timeout, RFC 9002 §6.2) — retransmit the oldest unacked packet with exponential back-off when the peer has not acknowledged tail packets, fixing the "tail loss" deadlock where both sides wait indefinitely after the last few UDP datagrams are lost * QUIC: pumpNetwork() now calls checkLossAndRetransmit() so that callers waiting for responses (e.g. parity store_stripe Phase 2) trigger retransmission of lost packets * QUIC: fix sendStreamData(vector) silently losing data on congestion control stall — now retries in a loop with pumpIncoming() between attempts until all data (including FIN) is delivered * QUIC: only mark stream send_fin when all data was actually sent on the wire, preventing incorrect state when CC breaks the send loop -- Jan Koester <jan.koester@tuxist.de> Sun, 04 May 2026 19:00:00 +0200 -- Jan Koester <jan.koester@tuxist.de> Sun, 04 May 2026 19:30:00 +0200 libnetplus (20260502+1) unstable; urgency=medium Loading
src/quic.cpp +2 −3 Original line number Diff line number Diff line Loading @@ -3629,7 +3629,6 @@ void quic::checkLossAndRetransmit() { if (age >= pto_thresh) { // Retransmit the oldest unacked packet as a probe auto sp = oldest; // copy — will be erased below uint64_t old_pn = _sent_packets.begin()->first; _sent_packets.erase(_sent_packets.begin()); ++_pto_count; Loading Loading @@ -3659,8 +3658,8 @@ void quic::checkLossAndRetransmit() { sp.stream_data.data(), sp.stream_data.size(), sp.fin, packet.size()); } QUIC_DBG("PTO probe: old_pn=%lu new_pn=%lu age=%.3fs pto=%.3fs", (unsigned long)old_pn, (unsigned long)new_pn, age, pto_thresh); QUIC_DBG("PTO probe: new_pn=%lu age=%.3fs pto=%.3fs", (unsigned long)new_pn, age, pto_thresh); } } } Loading