Loading debian/changelog +9 −0 Original line number Diff line number Diff line libnetplus (20260504+8) unstable; urgency=medium * QUIC: fix PTO re-queue spin loop — when sendPacket() failed (EAGAIN), the re-queued entry kept its original sent_time, causing checkLossAndRetransmit to fire PTO again immediately on the next call. This created an infinite hot loop that blocked the event loop. Fix: reset sent_time to now and increment _pto_count for exponential back-off on send failure. libnetplus (20260504+7) unstable; urgency=medium * QUIC: cap max_udp_payload_size to 1472 (Ethernet-safe) instead of Loading src/quic.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -3714,10 +3714,12 @@ void quic::checkLossAndRetransmit() { ++_pto_count; } else { // Send failed (EAGAIN) — re-queue under original PN // so the data is not permanently lost // so the data is not permanently lost. Reset sent_time // to now and increment _pto_count so the next PTO check // doesn't fire immediately (avoids hot spin-loop). sp.sent_time = now; ++_pto_count; _sent_packets[old_pn] = std::move(sp); std::cerr << "[QUIC-DIAG] PTO send failed, re-queued pn=" << old_pn << "\n"; } QUIC_DBG("PTO probe: new_pn=%lu age=%.3fs pto=%.3fs", (unsigned long)new_pn, age, pto_thresh); Loading Loading
debian/changelog +9 −0 Original line number Diff line number Diff line libnetplus (20260504+8) unstable; urgency=medium * QUIC: fix PTO re-queue spin loop — when sendPacket() failed (EAGAIN), the re-queued entry kept its original sent_time, causing checkLossAndRetransmit to fire PTO again immediately on the next call. This created an infinite hot loop that blocked the event loop. Fix: reset sent_time to now and increment _pto_count for exponential back-off on send failure. libnetplus (20260504+7) unstable; urgency=medium * QUIC: cap max_udp_payload_size to 1472 (Ethernet-safe) instead of Loading
src/quic.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -3714,10 +3714,12 @@ void quic::checkLossAndRetransmit() { ++_pto_count; } else { // Send failed (EAGAIN) — re-queue under original PN // so the data is not permanently lost // so the data is not permanently lost. Reset sent_time // to now and increment _pto_count so the next PTO check // doesn't fire immediately (avoids hot spin-loop). sp.sent_time = now; ++_pto_count; _sent_packets[old_pn] = std::move(sp); std::cerr << "[QUIC-DIAG] PTO send failed, re-queued pn=" << old_pn << "\n"; } QUIC_DBG("PTO probe: new_pn=%lu age=%.3fs pto=%.3fs", (unsigned long)new_pn, age, pto_thresh); Loading