* qlog: split the PTO count updates ouf of the MetricsUpdated event
This allows us to not use pointers for all member variables of both
events.
* ackhandler: avoid spurious call to GetCongestionWindow
* congestion: prevent uint64 overflow in pacer
This should never happen for bandwidths even remotely possible in
real-world scenarios, but it’s better to be safe.
* congestion: add a benchmark test for the pacer
* add a comment
* utils: initialize the {Smoothed, Latest, Min}RTT to 100ms
* utils: use time.Duration.Nanoseconds instead of uint64
No functional change expected.
* congestion: better check to avoid division by zero
* qlog: implement a Trace and a Writer struct
* qlog: rename Trace to FileSeq
* split qlog trace writer and QUIC qlog events into separate packages
* use the new qlog.Recorder instead of the logging.ConnectionTracer
* ackhandler: implement a lost packet tracker
* logging: add ConnectionTracer.DetectedSpuriousLoss event
* ackhandler: detect spurious losses
* qlog: add support for logging spurious packet loss
* ackhandler: delete lost packets after detecting spurios loss
* guard against slice index underflow
* simplify timer resets
As of Go 1.23, timer resets work as expected, and there’s no need to
read a (potentially) stale value from the timer channel.
* don't save the last time
* track if blocked
* remove unblock after sendingScheduled
* fix unblock logic when sending
* don't use fallthrough
* track the blocking mode
* remove stale comment
* implement a memory-optimized time.Time replacement
* monotime: properly handle systems with bad timer resolution (Windows)
* monotime: simplify Since
This allows for more accurate packet number difference calculations,
which is especially important once we attempt to detect spurious loss
detection events.
* ackhandler: optimize memory layout of packet struct
The packet number can be derived from the position that this packet is
stored at in the packets slice in the sent packet history. There is no
need to store the packet number, saving 8 bytes per packet.
* ackhandler: avoid copying the packet struct
* update to Go 1.25, drop support for Go 1.23
* ci: update golangci-lint to v2.4.0
* use new go tool command for gomock / mockgen
* also update Go version used for oss-fuzz
* ackhandler: check for missing packets below reordering treshold
No functional change expected.
With the Acknowledgement Frequency extension, the reordering threshold
will become configurable. With this change, it will be easy to use the
peer-requested value instead of the predefined constant.
* improve documentation
* call HighestMissingUpTo in randomized test
* Add master-style frame handling benchmarks using type switches
* Fixing styling issue.
* put STREAM frame back
* remove BenchmarkParseStreamAndACK
* use random data for STREAM and DATAGRAM
* improve comment
---------
Co-authored-by: Marten Seemann <martenseemann@gmail.com>
* handshake: store key update interval in an atomic
We recently changed the way the key update interval is set in tests to
use an environment variable. This resolved a race condition that existed
in the earlier logic, however, parsing of the environment variable now
shows up in benchmark tests.
Using an atomic variable should have a negligible performance impact.
* use an atomic swap