mirror of
https://github.com/refraction-networking/uquic.git
synced 2025-04-03 20:27:35 +03:00
uTLS is not yet bumped to the new version, so this commit breaks the dependencies relationship by getting rid of the local replace.
55 lines
1.5 KiB
Go
55 lines
1.5 KiB
Go
package ackhandler
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/refraction-networking/uquic/internal/protocol"
|
|
)
|
|
|
|
// A Packet is a packet
|
|
type packet struct {
|
|
SendTime time.Time
|
|
PacketNumber protocol.PacketNumber
|
|
StreamFrames []StreamFrame
|
|
Frames []Frame
|
|
LargestAcked protocol.PacketNumber // InvalidPacketNumber if the packet doesn't contain an ACK
|
|
Length protocol.ByteCount
|
|
EncryptionLevel protocol.EncryptionLevel
|
|
|
|
IsPathMTUProbePacket bool // We don't report the loss of Path MTU probe packets to the congestion controller.
|
|
|
|
includedInBytesInFlight bool
|
|
declaredLost bool
|
|
skippedPacket bool
|
|
}
|
|
|
|
func (p *packet) outstanding() bool {
|
|
return !p.declaredLost && !p.skippedPacket && !p.IsPathMTUProbePacket
|
|
}
|
|
|
|
var packetPool = sync.Pool{New: func() any { return &packet{} }}
|
|
|
|
func getPacket() *packet {
|
|
p := packetPool.Get().(*packet)
|
|
p.PacketNumber = 0
|
|
p.StreamFrames = nil
|
|
p.Frames = nil
|
|
p.LargestAcked = 0
|
|
p.Length = 0
|
|
p.EncryptionLevel = protocol.EncryptionLevel(0)
|
|
p.SendTime = time.Time{}
|
|
p.IsPathMTUProbePacket = false
|
|
p.includedInBytesInFlight = false
|
|
p.declaredLost = false
|
|
p.skippedPacket = false
|
|
return p
|
|
}
|
|
|
|
// We currently only return Packets back into the pool when they're acknowledged (not when they're lost).
|
|
// This simplifies the code, and gives the vast majority of the performance benefit we can gain from using the pool.
|
|
func putPacket(p *packet) {
|
|
p.Frames = nil
|
|
p.StreamFrames = nil
|
|
packetPool.Put(p)
|
|
}
|