mirror of
https://github.com/refraction-networking/uquic.git
synced 2025-04-05 21:27:35 +03:00
ackhandler: unexport Packet
This commit is contained in:
parent
e1bcedc78c
commit
da55dfaabd
12 changed files with 526 additions and 610 deletions
|
@ -1793,12 +1793,12 @@ func (s *connection) sendPackets(now time.Time) error {
|
||||||
// MTU probe packets per connection.
|
// MTU probe packets per connection.
|
||||||
if s.handshakeConfirmed && s.mtuDiscoverer != nil && s.mtuDiscoverer.ShouldSendProbe(now) {
|
if s.handshakeConfirmed && s.mtuDiscoverer != nil && s.mtuDiscoverer.ShouldSendProbe(now) {
|
||||||
ping, size := s.mtuDiscoverer.GetPing()
|
ping, size := s.mtuDiscoverer.GetPing()
|
||||||
p, buf, err := s.packer.PackMTUProbePacket(ping, size, now, s.version)
|
p, buf, err := s.packer.PackMTUProbePacket(ping, size, s.version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
s.logShortHeaderPacket(p.DestConnID, p.Ack, p.Frames, p.StreamFrames, p.PacketNumber, p.PacketNumberLen, p.KeyPhase, buf.Len(), false)
|
s.logShortHeaderPacket(p.DestConnID, p.Ack, p.Frames, p.StreamFrames, p.PacketNumber, p.PacketNumberLen, p.KeyPhase, buf.Len(), false)
|
||||||
s.registerPackedShortHeaderPacket(p.Packet, now)
|
s.registerPackedShortHeaderPacket(p, now)
|
||||||
s.sendQueue.Send(buf, buf.Len())
|
s.sendQueue.Send(buf, buf.Len())
|
||||||
// This is kind of a hack. We need to trigger sending again somehow.
|
// This is kind of a hack. We need to trigger sending again somehow.
|
||||||
s.pacingDeadline = deadlineSendImmediately
|
s.pacingDeadline = deadlineSendImmediately
|
||||||
|
@ -1811,7 +1811,7 @@ func (s *connection) sendPackets(now time.Time) error {
|
||||||
s.windowUpdateQueue.QueueAll()
|
s.windowUpdateQueue.QueueAll()
|
||||||
|
|
||||||
if !s.handshakeConfirmed {
|
if !s.handshakeConfirmed {
|
||||||
packet, err := s.packer.PackCoalescedPacket(false, s.mtuDiscoverer.CurrentSize(), now, s.version)
|
packet, err := s.packer.PackCoalescedPacket(false, s.mtuDiscoverer.CurrentSize(), s.version)
|
||||||
if err != nil || packet == nil {
|
if err != nil || packet == nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1929,7 +1929,7 @@ func (s *connection) resetPacingDeadline() {
|
||||||
|
|
||||||
func (s *connection) maybeSendAckOnlyPacket(now time.Time) error {
|
func (s *connection) maybeSendAckOnlyPacket(now time.Time) error {
|
||||||
if !s.handshakeConfirmed {
|
if !s.handshakeConfirmed {
|
||||||
packet, err := s.packer.PackCoalescedPacket(true, s.mtuDiscoverer.CurrentSize(), now, s.version)
|
packet, err := s.packer.PackCoalescedPacket(true, s.mtuDiscoverer.CurrentSize(), s.version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1940,7 +1940,7 @@ func (s *connection) maybeSendAckOnlyPacket(now time.Time) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
p, buf, err := s.packer.PackAckOnlyPacket(s.mtuDiscoverer.CurrentSize(), now, s.version)
|
p, buf, err := s.packer.PackAckOnlyPacket(s.mtuDiscoverer.CurrentSize(), s.version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == errNothingToPack {
|
if err == errNothingToPack {
|
||||||
return nil
|
return nil
|
||||||
|
@ -1948,7 +1948,7 @@ func (s *connection) maybeSendAckOnlyPacket(now time.Time) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
s.logShortHeaderPacket(p.DestConnID, p.Ack, p.Frames, p.StreamFrames, p.PacketNumber, p.PacketNumberLen, p.KeyPhase, buf.Len(), false)
|
s.logShortHeaderPacket(p.DestConnID, p.Ack, p.Frames, p.StreamFrames, p.PacketNumber, p.PacketNumberLen, p.KeyPhase, buf.Len(), false)
|
||||||
s.registerPackedShortHeaderPacket(p.Packet, now)
|
s.registerPackedShortHeaderPacket(p, now)
|
||||||
s.sendQueue.Send(buf, buf.Len())
|
s.sendQueue.Send(buf, buf.Len())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -1962,7 +1962,7 @@ func (s *connection) sendProbePacket(encLevel protocol.EncryptionLevel, now time
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
packet, err = s.packer.MaybePackProbePacket(encLevel, s.mtuDiscoverer.CurrentSize(), now, s.version)
|
packet, err = s.packer.MaybePackProbePacket(encLevel, s.mtuDiscoverer.CurrentSize(), s.version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1983,7 +1983,7 @@ func (s *connection) sendProbePacket(encLevel protocol.EncryptionLevel, now time
|
||||||
panic("unexpected encryption level")
|
panic("unexpected encryption level")
|
||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
packet, err = s.packer.MaybePackProbePacket(encLevel, s.mtuDiscoverer.CurrentSize(), now, s.version)
|
packet, err = s.packer.MaybePackProbePacket(encLevel, s.mtuDiscoverer.CurrentSize(), s.version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1999,22 +1999,26 @@ func (s *connection) sendProbePacket(encLevel protocol.EncryptionLevel, now time
|
||||||
// If there was nothing to pack, the returned size is 0.
|
// If there was nothing to pack, the returned size is 0.
|
||||||
func (s *connection) appendPacket(buf *packetBuffer, maxSize protocol.ByteCount, now time.Time) (protocol.ByteCount, error) {
|
func (s *connection) appendPacket(buf *packetBuffer, maxSize protocol.ByteCount, now time.Time) (protocol.ByteCount, error) {
|
||||||
startLen := buf.Len()
|
startLen := buf.Len()
|
||||||
p, err := s.packer.AppendPacket(buf, maxSize, now, s.version)
|
p, err := s.packer.AppendPacket(buf, maxSize, s.version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
size := buf.Len() - startLen
|
size := buf.Len() - startLen
|
||||||
s.logShortHeaderPacket(p.DestConnID, p.Ack, p.Frames, p.StreamFrames, p.PacketNumber, p.PacketNumberLen, p.KeyPhase, size, false)
|
s.logShortHeaderPacket(p.DestConnID, p.Ack, p.Frames, p.StreamFrames, p.PacketNumber, p.PacketNumberLen, p.KeyPhase, size, false)
|
||||||
s.registerPackedShortHeaderPacket(p.Packet, now)
|
s.registerPackedShortHeaderPacket(p, now)
|
||||||
return size, nil
|
return size, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *connection) registerPackedShortHeaderPacket(p *ackhandler.Packet, now time.Time) {
|
func (s *connection) registerPackedShortHeaderPacket(p shortHeaderPacket, now time.Time) {
|
||||||
if s.firstAckElicitingPacketAfterIdleSentTime.IsZero() && (len(p.StreamFrames) > 0 || ackhandler.HasAckElicitingFrames(p.Frames)) {
|
if s.firstAckElicitingPacketAfterIdleSentTime.IsZero() && (len(p.StreamFrames) > 0 || ackhandler.HasAckElicitingFrames(p.Frames)) {
|
||||||
s.firstAckElicitingPacketAfterIdleSentTime = now
|
s.firstAckElicitingPacketAfterIdleSentTime = now
|
||||||
}
|
}
|
||||||
|
|
||||||
s.sentPacketHandler.SentPacket(p)
|
largestAcked := protocol.InvalidPacketNumber
|
||||||
|
if p.Ack != nil {
|
||||||
|
largestAcked = p.Ack.LargestAcked()
|
||||||
|
}
|
||||||
|
s.sentPacketHandler.SentPacket(now, p.PacketNumber, largestAcked, p.StreamFrames, p.Frames, protocol.Encryption1RTT, p.Length, p.IsPathMTUProbePacket)
|
||||||
s.connIDManager.SentPacket()
|
s.connIDManager.SentPacket()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2024,13 +2028,21 @@ func (s *connection) sendPackedCoalescedPacket(packet *coalescedPacket, now time
|
||||||
if s.firstAckElicitingPacketAfterIdleSentTime.IsZero() && p.IsAckEliciting() {
|
if s.firstAckElicitingPacketAfterIdleSentTime.IsZero() && p.IsAckEliciting() {
|
||||||
s.firstAckElicitingPacketAfterIdleSentTime = now
|
s.firstAckElicitingPacketAfterIdleSentTime = now
|
||||||
}
|
}
|
||||||
s.sentPacketHandler.SentPacket(p.ToAckHandlerPacket(now, s.retransmissionQueue))
|
largestAcked := protocol.InvalidPacketNumber
|
||||||
|
if p.ack != nil {
|
||||||
|
largestAcked = p.ack.LargestAcked()
|
||||||
|
}
|
||||||
|
s.sentPacketHandler.SentPacket(now, p.header.PacketNumber, largestAcked, p.streamFrames, p.frames, p.EncryptionLevel(), p.length, false)
|
||||||
}
|
}
|
||||||
if p := packet.shortHdrPacket; p != nil {
|
if p := packet.shortHdrPacket; p != nil {
|
||||||
if s.firstAckElicitingPacketAfterIdleSentTime.IsZero() && p.IsAckEliciting() {
|
if s.firstAckElicitingPacketAfterIdleSentTime.IsZero() && p.IsAckEliciting() {
|
||||||
s.firstAckElicitingPacketAfterIdleSentTime = now
|
s.firstAckElicitingPacketAfterIdleSentTime = now
|
||||||
}
|
}
|
||||||
s.sentPacketHandler.SentPacket(p.Packet)
|
largestAcked := protocol.InvalidPacketNumber
|
||||||
|
if p.Ack != nil {
|
||||||
|
largestAcked = p.Ack.LargestAcked()
|
||||||
|
}
|
||||||
|
s.sentPacketHandler.SentPacket(now, p.PacketNumber, largestAcked, p.StreamFrames, p.Frames, protocol.Encryption1RTT, p.Length, p.IsPathMTUProbePacket)
|
||||||
}
|
}
|
||||||
s.connIDManager.SentPacket()
|
s.connIDManager.SentPacket()
|
||||||
s.sendQueue.Send(packet.buffer, packet.buffer.Len())
|
s.sendQueue.Send(packet.buffer, packet.buffer.Len())
|
||||||
|
@ -2042,14 +2054,14 @@ func (s *connection) sendConnectionClose(e error) ([]byte, error) {
|
||||||
var transportErr *qerr.TransportError
|
var transportErr *qerr.TransportError
|
||||||
var applicationErr *qerr.ApplicationError
|
var applicationErr *qerr.ApplicationError
|
||||||
if errors.As(e, &transportErr) {
|
if errors.As(e, &transportErr) {
|
||||||
packet, err = s.packer.PackConnectionClose(transportErr, s.mtuDiscoverer.CurrentSize(), time.Now(), s.version)
|
packet, err = s.packer.PackConnectionClose(transportErr, s.mtuDiscoverer.CurrentSize(), s.version)
|
||||||
} else if errors.As(e, &applicationErr) {
|
} else if errors.As(e, &applicationErr) {
|
||||||
packet, err = s.packer.PackApplicationClose(applicationErr, s.mtuDiscoverer.CurrentSize(), time.Now(), s.version)
|
packet, err = s.packer.PackApplicationClose(applicationErr, s.mtuDiscoverer.CurrentSize(), s.version)
|
||||||
} else {
|
} else {
|
||||||
packet, err = s.packer.PackConnectionClose(&qerr.TransportError{
|
packet, err = s.packer.PackConnectionClose(&qerr.TransportError{
|
||||||
ErrorCode: qerr.InternalError,
|
ErrorCode: qerr.InternalError,
|
||||||
ErrorMessage: fmt.Sprintf("connection BUG: unspecified error type (msg: %s)", e.Error()),
|
ErrorMessage: fmt.Sprintf("connection BUG: unspecified error type (msg: %s)", e.Error()),
|
||||||
}, s.mtuDiscoverer.CurrentSize(), time.Now(), s.version)
|
}, s.mtuDiscoverer.CurrentSize(), s.version)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -68,10 +68,8 @@ var _ = Describe("Connection", func() {
|
||||||
}}
|
}}
|
||||||
} else {
|
} else {
|
||||||
packet.shortHdrPacket = &shortHeaderPacket{
|
packet.shortHdrPacket = &shortHeaderPacket{
|
||||||
Packet: &ackhandler.Packet{
|
|
||||||
PacketNumber: pn,
|
PacketNumber: pn,
|
||||||
Length: 6,
|
Length: 6,
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return packet
|
return packet
|
||||||
|
@ -87,7 +85,7 @@ var _ = Describe("Connection", func() {
|
||||||
}
|
}
|
||||||
|
|
||||||
expectAppendPacket := func(packer *MockPacker, p shortHeaderPacket, b []byte) *gomock.Call {
|
expectAppendPacket := func(packer *MockPacker, p shortHeaderPacket, b []byte) *gomock.Call {
|
||||||
return packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), Version1).DoAndReturn(func(buf *packetBuffer, _ protocol.ByteCount, _ time.Time, _ protocol.VersionNumber) (shortHeaderPacket, error) {
|
return packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), Version1).DoAndReturn(func(buf *packetBuffer, _ protocol.ByteCount, _ protocol.VersionNumber) (shortHeaderPacket, error) {
|
||||||
buf.Data = append(buf.Data, b...)
|
buf.Data = append(buf.Data, b...)
|
||||||
return p, nil
|
return p, nil
|
||||||
})
|
})
|
||||||
|
@ -448,7 +446,7 @@ var _ = Describe("Connection", func() {
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
buffer := getPacketBuffer()
|
buffer := getPacketBuffer()
|
||||||
buffer.Data = append(buffer.Data, []byte("connection close")...)
|
buffer.Data = append(buffer.Data, []byte("connection close")...)
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).DoAndReturn(func(e *qerr.ApplicationError, _ protocol.ByteCount, _ time.Time, _ protocol.VersionNumber) (*coalescedPacket, error) {
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).DoAndReturn(func(e *qerr.ApplicationError, _ protocol.ByteCount, _ protocol.VersionNumber) (*coalescedPacket, error) {
|
||||||
Expect(e.ErrorCode).To(BeEquivalentTo(qerr.NoError))
|
Expect(e.ErrorCode).To(BeEquivalentTo(qerr.NoError))
|
||||||
Expect(e.ErrorMessage).To(BeEmpty())
|
Expect(e.ErrorMessage).To(BeEmpty())
|
||||||
return &coalescedPacket{buffer: buffer}, nil
|
return &coalescedPacket{buffer: buffer}, nil
|
||||||
|
@ -473,7 +471,7 @@ var _ = Describe("Connection", func() {
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
tracer.EXPECT().Close()
|
tracer.EXPECT().Close()
|
||||||
|
@ -492,7 +490,7 @@ var _ = Describe("Connection", func() {
|
||||||
streamManager.EXPECT().CloseWithError(expectedErr)
|
streamManager.EXPECT().CloseWithError(expectedErr)
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
packer.EXPECT().PackApplicationClose(expectedErr, gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(expectedErr, gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
gomock.InOrder(
|
gomock.InOrder(
|
||||||
tracer.EXPECT().ClosedConnection(expectedErr),
|
tracer.EXPECT().ClosedConnection(expectedErr),
|
||||||
|
@ -513,7 +511,7 @@ var _ = Describe("Connection", func() {
|
||||||
streamManager.EXPECT().CloseWithError(expectedErr)
|
streamManager.EXPECT().CloseWithError(expectedErr)
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
packer.EXPECT().PackConnectionClose(expectedErr, gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackConnectionClose(expectedErr, gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
gomock.InOrder(
|
gomock.InOrder(
|
||||||
tracer.EXPECT().ClosedConnection(expectedErr),
|
tracer.EXPECT().ClosedConnection(expectedErr),
|
||||||
|
@ -553,7 +551,7 @@ var _ = Describe("Connection", func() {
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
returned := make(chan struct{})
|
returned := make(chan struct{})
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
|
@ -612,7 +610,7 @@ var _ = Describe("Connection", func() {
|
||||||
sph.EXPECT().GetLossDetectionTimeout().Return(time.Now().Add(time.Hour)).AnyTimes()
|
sph.EXPECT().GetLossDetectionTimeout().Return(time.Now().Add(time.Hour)).AnyTimes()
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
||||||
// only expect a single SentPacket() call
|
// only expect a single SentPacket() call
|
||||||
sph.EXPECT().SentPacket(gomock.Any())
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
tracer.EXPECT().SentShortHeaderPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
tracer.EXPECT().SentShortHeaderPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
tracer.EXPECT().Close()
|
tracer.EXPECT().Close()
|
||||||
|
@ -620,8 +618,8 @@ var _ = Describe("Connection", func() {
|
||||||
connRunner.EXPECT().Remove(gomock.Any()).AnyTimes()
|
connRunner.EXPECT().Remove(gomock.Any()).AnyTimes()
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
conn.sentPacketHandler = sph
|
conn.sentPacketHandler = sph
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 1}}, []byte("foobar"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 1}, []byte("foobar"))
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack).AnyTimes()
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack).AnyTimes()
|
||||||
runConn()
|
runConn()
|
||||||
conn.queueControlFrame(&wire.PingFrame{})
|
conn.queueControlFrame(&wire.PingFrame{})
|
||||||
conn.scheduleSending()
|
conn.scheduleSending()
|
||||||
|
@ -810,7 +808,7 @@ var _ = Describe("Connection", func() {
|
||||||
unpacker.EXPECT().UnpackLongHeader(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(nil, handshake.ErrDecryptionFailed)
|
unpacker.EXPECT().UnpackLongHeader(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(nil, handshake.ErrDecryptionFailed)
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
cryptoSetup.EXPECT().RunHandshake().MaxTimes(1)
|
cryptoSetup.EXPECT().RunHandshake().MaxTimes(1)
|
||||||
|
@ -847,7 +845,7 @@ var _ = Describe("Connection", func() {
|
||||||
}).Times(3)
|
}).Times(3)
|
||||||
tracer.EXPECT().ReceivedShortHeaderPacket(gomock.Any(), gomock.Any(), gomock.Any()).Do(func(hdr *logging.ShortHeader, _ protocol.ByteCount, _ []logging.Frame) {
|
tracer.EXPECT().ReceivedShortHeaderPacket(gomock.Any(), gomock.Any(), gomock.Any()).Do(func(hdr *logging.ShortHeader, _ protocol.ByteCount, _ []logging.Frame) {
|
||||||
}).Times(3)
|
}).Times(3)
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version) // only expect a single call
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version) // only expect a single call
|
||||||
|
|
||||||
for i := 0; i < 3; i++ {
|
for i := 0; i < 3; i++ {
|
||||||
conn.handlePacket(getShortHeaderPacket(srcConnID, 0x1337+protocol.PacketNumber(i), []byte("foobar")))
|
conn.handlePacket(getShortHeaderPacket(srcConnID, 0x1337+protocol.PacketNumber(i), []byte("foobar")))
|
||||||
|
@ -863,7 +861,7 @@ var _ = Describe("Connection", func() {
|
||||||
// make the go routine return
|
// make the go routine return
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
tracer.EXPECT().Close()
|
tracer.EXPECT().Close()
|
||||||
|
@ -882,7 +880,7 @@ var _ = Describe("Connection", func() {
|
||||||
}).Times(3)
|
}).Times(3)
|
||||||
tracer.EXPECT().ReceivedShortHeaderPacket(gomock.Any(), gomock.Any(), gomock.Any()).Do(func(hdr *logging.ShortHeader, _ protocol.ByteCount, _ []logging.Frame) {
|
tracer.EXPECT().ReceivedShortHeaderPacket(gomock.Any(), gomock.Any(), gomock.Any()).Do(func(hdr *logging.ShortHeader, _ protocol.ByteCount, _ []logging.Frame) {
|
||||||
}).Times(3)
|
}).Times(3)
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version).Times(3)
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version).Times(3)
|
||||||
|
|
||||||
for i := 0; i < 3; i++ {
|
for i := 0; i < 3; i++ {
|
||||||
conn.handlePacket(getShortHeaderPacket(srcConnID, 0x1337+protocol.PacketNumber(i), []byte("foobar")))
|
conn.handlePacket(getShortHeaderPacket(srcConnID, 0x1337+protocol.PacketNumber(i), []byte("foobar")))
|
||||||
|
@ -898,7 +896,7 @@ var _ = Describe("Connection", func() {
|
||||||
// make the go routine return
|
// make the go routine return
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
tracer.EXPECT().Close()
|
tracer.EXPECT().Close()
|
||||||
|
@ -911,7 +909,7 @@ var _ = Describe("Connection", func() {
|
||||||
unpacker.EXPECT().UnpackShortHeader(gomock.Any(), gomock.Any()).Return(protocol.PacketNumber(0), protocol.PacketNumberLen(0), protocol.KeyPhaseBit(0), nil, wire.ErrInvalidReservedBits)
|
unpacker.EXPECT().UnpackShortHeader(gomock.Any(), gomock.Any()).Return(protocol.PacketNumber(0), protocol.PacketNumberLen(0), protocol.KeyPhaseBit(0), nil, wire.ErrInvalidReservedBits)
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
done := make(chan struct{})
|
done := make(chan struct{})
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
|
@ -947,7 +945,7 @@ var _ = Describe("Connection", func() {
|
||||||
conn.handlePacket(getShortHeaderPacket(srcConnID, 0x42, nil))
|
conn.handlePacket(getShortHeaderPacket(srcConnID, 0x42, nil))
|
||||||
Consistently(runErr).ShouldNot(Receive())
|
Consistently(runErr).ShouldNot(Receive())
|
||||||
// make the go routine return
|
// make the go routine return
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
tracer.EXPECT().Close()
|
tracer.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
|
@ -959,7 +957,7 @@ var _ = Describe("Connection", func() {
|
||||||
unpacker.EXPECT().UnpackShortHeader(gomock.Any(), gomock.Any()).Return(protocol.PacketNumber(0), protocol.PacketNumberLen(0), protocol.KeyPhaseBit(0), nil, &qerr.TransportError{ErrorCode: qerr.ConnectionIDLimitError})
|
unpacker.EXPECT().UnpackShortHeader(gomock.Any(), gomock.Any()).Return(protocol.PacketNumber(0), protocol.PacketNumberLen(0), protocol.KeyPhaseBit(0), nil, &qerr.TransportError{ErrorCode: qerr.ConnectionIDLimitError})
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
done := make(chan struct{})
|
done := make(chan struct{})
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
|
@ -1184,7 +1182,7 @@ var _ = Describe("Connection", func() {
|
||||||
|
|
||||||
AfterEach(func() {
|
AfterEach(func() {
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
|
@ -1211,17 +1209,17 @@ var _ = Describe("Connection", func() {
|
||||||
sph.EXPECT().TimeUntilSend().AnyTimes()
|
sph.EXPECT().TimeUntilSend().AnyTimes()
|
||||||
sph.EXPECT().GetLossDetectionTimeout().AnyTimes()
|
sph.EXPECT().GetLossDetectionTimeout().AnyTimes()
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
||||||
sph.EXPECT().SentPacket(gomock.Any())
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
conn.sentPacketHandler = sph
|
conn.sentPacketHandler = sph
|
||||||
runConn()
|
runConn()
|
||||||
p := shortHeaderPacket{
|
p := shortHeaderPacket{
|
||||||
DestConnID: protocol.ParseConnectionID([]byte{1, 2, 3}),
|
DestConnID: protocol.ParseConnectionID([]byte{1, 2, 3}),
|
||||||
|
PacketNumber: 1337,
|
||||||
PacketNumberLen: protocol.PacketNumberLen3,
|
PacketNumberLen: protocol.PacketNumberLen3,
|
||||||
Packet: &ackhandler.Packet{PacketNumber: 1337},
|
|
||||||
KeyPhase: protocol.KeyPhaseOne,
|
KeyPhase: protocol.KeyPhaseOne,
|
||||||
}
|
}
|
||||||
expectAppendPacket(packer, p, []byte("foobar"))
|
expectAppendPacket(packer, p, []byte("foobar"))
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack).AnyTimes()
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack).AnyTimes()
|
||||||
sent := make(chan struct{})
|
sent := make(chan struct{})
|
||||||
sender.EXPECT().WouldBlock().AnyTimes()
|
sender.EXPECT().WouldBlock().AnyTimes()
|
||||||
sender.EXPECT().Send(gomock.Any(), gomock.Any()).Do(func(*packetBuffer, protocol.ByteCount) { close(sent) })
|
sender.EXPECT().Send(gomock.Any(), gomock.Any()).Do(func(*packetBuffer, protocol.ByteCount) { close(sent) })
|
||||||
|
@ -1238,7 +1236,7 @@ var _ = Describe("Connection", func() {
|
||||||
It("doesn't send packets if there's nothing to send", func() {
|
It("doesn't send packets if there's nothing to send", func() {
|
||||||
conn.handshakeConfirmed = true
|
conn.handshakeConfirmed = true
|
||||||
runConn()
|
runConn()
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack).AnyTimes()
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack).AnyTimes()
|
||||||
conn.receivedPacketHandler.ReceivedPacket(0x035e, protocol.ECNNon, protocol.Encryption1RTT, time.Now(), true)
|
conn.receivedPacketHandler.ReceivedPacket(0x035e, protocol.ECNNon, protocol.Encryption1RTT, time.Now(), true)
|
||||||
conn.scheduleSending()
|
conn.scheduleSending()
|
||||||
time.Sleep(50 * time.Millisecond) // make sure there are no calls to mconn.Write()
|
time.Sleep(50 * time.Millisecond) // make sure there are no calls to mconn.Write()
|
||||||
|
@ -1250,7 +1248,7 @@ var _ = Describe("Connection", func() {
|
||||||
sph.EXPECT().GetLossDetectionTimeout().AnyTimes()
|
sph.EXPECT().GetLossDetectionTimeout().AnyTimes()
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAck)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAck)
|
||||||
done := make(chan struct{})
|
done := make(chan struct{})
|
||||||
packer.EXPECT().PackCoalescedPacket(true, gomock.Any(), gomock.Any(), conn.version).Do(func(bool, protocol.ByteCount, time.Time, protocol.VersionNumber) { close(done) })
|
packer.EXPECT().PackCoalescedPacket(true, gomock.Any(), conn.version).Do(func(bool, protocol.ByteCount, protocol.VersionNumber) { close(done) })
|
||||||
conn.sentPacketHandler = sph
|
conn.sentPacketHandler = sph
|
||||||
runConn()
|
runConn()
|
||||||
conn.scheduleSending()
|
conn.scheduleSending()
|
||||||
|
@ -1263,12 +1261,12 @@ var _ = Describe("Connection", func() {
|
||||||
sph.EXPECT().TimeUntilSend().AnyTimes()
|
sph.EXPECT().TimeUntilSend().AnyTimes()
|
||||||
sph.EXPECT().GetLossDetectionTimeout().AnyTimes()
|
sph.EXPECT().GetLossDetectionTimeout().AnyTimes()
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
||||||
sph.EXPECT().SentPacket(gomock.Any())
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
conn.sentPacketHandler = sph
|
conn.sentPacketHandler = sph
|
||||||
fc := mocks.NewMockConnectionFlowController(mockCtrl)
|
fc := mocks.NewMockConnectionFlowController(mockCtrl)
|
||||||
fc.EXPECT().IsNewlyBlocked().Return(true, protocol.ByteCount(1337))
|
fc.EXPECT().IsNewlyBlocked().Return(true, protocol.ByteCount(1337))
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 13}}, []byte("foobar"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 13}, []byte("foobar"))
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack).AnyTimes()
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack).AnyTimes()
|
||||||
conn.connFlowController = fc
|
conn.connFlowController = fc
|
||||||
runConn()
|
runConn()
|
||||||
sent := make(chan struct{})
|
sent := make(chan struct{})
|
||||||
|
@ -1321,9 +1319,9 @@ var _ = Describe("Connection", func() {
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendNone)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendNone)
|
||||||
sph.EXPECT().QueueProbePacket(encLevel)
|
sph.EXPECT().QueueProbePacket(encLevel)
|
||||||
p := getCoalescedPacket(123, enc != protocol.Encryption1RTT)
|
p := getCoalescedPacket(123, enc != protocol.Encryption1RTT)
|
||||||
packer.EXPECT().MaybePackProbePacket(encLevel, gomock.Any(), gomock.Any(), conn.version).Return(p, nil)
|
packer.EXPECT().MaybePackProbePacket(encLevel, gomock.Any(), conn.version).Return(p, nil)
|
||||||
sph.EXPECT().SentPacket(gomock.Any()).Do(func(packet *ackhandler.Packet) {
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Do(func(_ time.Time, pn, _ protocol.PacketNumber, _ []ackhandler.StreamFrame, _ []ackhandler.Frame, _ protocol.EncryptionLevel, _ protocol.ByteCount, _ bool) {
|
||||||
Expect(packet.PacketNumber).To(Equal(protocol.PacketNumber(123)))
|
Expect(pn).To(Equal(protocol.PacketNumber(123)))
|
||||||
})
|
})
|
||||||
conn.sentPacketHandler = sph
|
conn.sentPacketHandler = sph
|
||||||
runConn()
|
runConn()
|
||||||
|
@ -1346,9 +1344,9 @@ var _ = Describe("Connection", func() {
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendNone)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendNone)
|
||||||
sph.EXPECT().QueueProbePacket(encLevel).Return(false)
|
sph.EXPECT().QueueProbePacket(encLevel).Return(false)
|
||||||
p := getCoalescedPacket(123, enc != protocol.Encryption1RTT)
|
p := getCoalescedPacket(123, enc != protocol.Encryption1RTT)
|
||||||
packer.EXPECT().MaybePackProbePacket(encLevel, gomock.Any(), gomock.Any(), conn.version).Return(p, nil)
|
packer.EXPECT().MaybePackProbePacket(encLevel, gomock.Any(), conn.version).Return(p, nil)
|
||||||
sph.EXPECT().SentPacket(gomock.Any()).Do(func(packet *ackhandler.Packet) {
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Do(func(_ time.Time, pn, _ protocol.PacketNumber, _ []ackhandler.StreamFrame, _ []ackhandler.Frame, _ protocol.EncryptionLevel, _ protocol.ByteCount, _ bool) {
|
||||||
Expect(packet.PacketNumber).To(Equal(protocol.PacketNumber(123)))
|
Expect(pn).To(Equal(protocol.PacketNumber(123)))
|
||||||
})
|
})
|
||||||
conn.sentPacketHandler = sph
|
conn.sentPacketHandler = sph
|
||||||
runConn()
|
runConn()
|
||||||
|
@ -1390,7 +1388,7 @@ var _ = Describe("Connection", func() {
|
||||||
|
|
||||||
AfterEach(func() {
|
AfterEach(func() {
|
||||||
// make the go routine return
|
// make the go routine return
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
|
@ -1402,12 +1400,12 @@ var _ = Describe("Connection", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("sends multiple packets one by one immediately", func() {
|
It("sends multiple packets one by one immediately", func() {
|
||||||
sph.EXPECT().SentPacket(gomock.Any()).Times(2)
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(2)
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).Times(2)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).Times(2)
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendPacingLimited)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendPacingLimited)
|
||||||
sph.EXPECT().TimeUntilSend().Return(time.Now().Add(time.Hour))
|
sph.EXPECT().TimeUntilSend().Return(time.Now().Add(time.Hour))
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 10}}, []byte("packet10"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 10}, []byte("packet10"))
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 11}}, []byte("packet11"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 11}, []byte("packet11"))
|
||||||
sender.EXPECT().WouldBlock().AnyTimes()
|
sender.EXPECT().WouldBlock().AnyTimes()
|
||||||
sender.EXPECT().Send(gomock.Any(), gomock.Any()).Do(func(b *packetBuffer, _ protocol.ByteCount) {
|
sender.EXPECT().Send(gomock.Any(), gomock.Any()).Do(func(b *packetBuffer, _ protocol.ByteCount) {
|
||||||
Expect(b.Data).To(Equal([]byte("packet10")))
|
Expect(b.Data).To(Equal([]byte("packet10")))
|
||||||
|
@ -1426,15 +1424,15 @@ var _ = Describe("Connection", func() {
|
||||||
|
|
||||||
It("sends multiple packets one by one immediately, with GSO", func() {
|
It("sends multiple packets one by one immediately, with GSO", func() {
|
||||||
enableGSO()
|
enableGSO()
|
||||||
sph.EXPECT().SentPacket(gomock.Any()).Times(2)
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(2)
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).Times(3)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).Times(3)
|
||||||
payload1 := make([]byte, conn.mtuDiscoverer.CurrentSize())
|
payload1 := make([]byte, conn.mtuDiscoverer.CurrentSize())
|
||||||
rand.Read(payload1)
|
rand.Read(payload1)
|
||||||
payload2 := make([]byte, conn.mtuDiscoverer.CurrentSize())
|
payload2 := make([]byte, conn.mtuDiscoverer.CurrentSize())
|
||||||
rand.Read(payload2)
|
rand.Read(payload2)
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 10}}, payload1)
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 10}, payload1)
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 11}}, payload2)
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 11}, payload2)
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(shortHeaderPacket{}, errNothingToPack)
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any()).Return(shortHeaderPacket{}, errNothingToPack)
|
||||||
sender.EXPECT().WouldBlock().AnyTimes()
|
sender.EXPECT().WouldBlock().AnyTimes()
|
||||||
sender.EXPECT().Send(gomock.Any(), conn.mtuDiscoverer.CurrentSize()).Do(func(b *packetBuffer, l protocol.ByteCount) {
|
sender.EXPECT().Send(gomock.Any(), conn.mtuDiscoverer.CurrentSize()).Do(func(b *packetBuffer, l protocol.ByteCount) {
|
||||||
Expect(b.Data).To(Equal(append(payload1, payload2...)))
|
Expect(b.Data).To(Equal(append(payload1, payload2...)))
|
||||||
|
@ -1450,15 +1448,15 @@ var _ = Describe("Connection", func() {
|
||||||
|
|
||||||
It("stops appending packets when a smaller packet is packed, with GSO", func() {
|
It("stops appending packets when a smaller packet is packed, with GSO", func() {
|
||||||
enableGSO()
|
enableGSO()
|
||||||
sph.EXPECT().SentPacket(gomock.Any()).Times(2)
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(2)
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).Times(2)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).Times(2)
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendNone)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendNone)
|
||||||
payload1 := make([]byte, conn.mtuDiscoverer.CurrentSize())
|
payload1 := make([]byte, conn.mtuDiscoverer.CurrentSize())
|
||||||
rand.Read(payload1)
|
rand.Read(payload1)
|
||||||
payload2 := make([]byte, conn.mtuDiscoverer.CurrentSize()-1)
|
payload2 := make([]byte, conn.mtuDiscoverer.CurrentSize()-1)
|
||||||
rand.Read(payload2)
|
rand.Read(payload2)
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 10}}, payload1)
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 10}, payload1)
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 11}}, payload2)
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 11}, payload2)
|
||||||
sender.EXPECT().WouldBlock().AnyTimes()
|
sender.EXPECT().WouldBlock().AnyTimes()
|
||||||
sender.EXPECT().Send(gomock.Any(), conn.mtuDiscoverer.CurrentSize()).Do(func(b *packetBuffer, l protocol.ByteCount) {
|
sender.EXPECT().Send(gomock.Any(), conn.mtuDiscoverer.CurrentSize()).Do(func(b *packetBuffer, l protocol.ByteCount) {
|
||||||
Expect(b.Data).To(Equal(append(payload1, payload2...)))
|
Expect(b.Data).To(Equal(append(payload1, payload2...)))
|
||||||
|
@ -1473,10 +1471,10 @@ var _ = Describe("Connection", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("sends multiple packets, when the pacer allows immediate sending", func() {
|
It("sends multiple packets, when the pacer allows immediate sending", func() {
|
||||||
sph.EXPECT().SentPacket(gomock.Any())
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).Times(2)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).Times(2)
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 10}}, []byte("packet10"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 10}, []byte("packet10"))
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
||||||
sender.EXPECT().WouldBlock().AnyTimes()
|
sender.EXPECT().WouldBlock().AnyTimes()
|
||||||
sender.EXPECT().Send(gomock.Any(), gomock.Any())
|
sender.EXPECT().Send(gomock.Any(), gomock.Any())
|
||||||
go func() {
|
go func() {
|
||||||
|
@ -1489,10 +1487,10 @@ var _ = Describe("Connection", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("allows an ACK to be sent when pacing limited", func() {
|
It("allows an ACK to be sent when pacing limited", func() {
|
||||||
sph.EXPECT().SentPacket(gomock.Any())
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
sph.EXPECT().TimeUntilSend().Return(time.Now().Add(time.Hour))
|
sph.EXPECT().TimeUntilSend().Return(time.Now().Add(time.Hour))
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendPacingLimited)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendPacingLimited)
|
||||||
packer.EXPECT().PackAckOnlyPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 123}}, getPacketBuffer(), nil)
|
packer.EXPECT().PackAckOnlyPacket(gomock.Any(), conn.version).Return(shortHeaderPacket{PacketNumber: 123}, getPacketBuffer(), nil)
|
||||||
|
|
||||||
sender.EXPECT().WouldBlock().AnyTimes()
|
sender.EXPECT().WouldBlock().AnyTimes()
|
||||||
sender.EXPECT().Send(gomock.Any(), gomock.Any())
|
sender.EXPECT().Send(gomock.Any(), gomock.Any())
|
||||||
|
@ -1508,10 +1506,10 @@ var _ = Describe("Connection", func() {
|
||||||
// when becoming congestion limited, at some point the SendMode will change from SendAny to SendAck
|
// when becoming congestion limited, at some point the SendMode will change from SendAny to SendAck
|
||||||
// we shouldn't send the ACK in the same run
|
// we shouldn't send the ACK in the same run
|
||||||
It("doesn't send an ACK right after becoming congestion limited", func() {
|
It("doesn't send an ACK right after becoming congestion limited", func() {
|
||||||
sph.EXPECT().SentPacket(gomock.Any())
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny)
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAck)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAck)
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 100}}, []byte("packet100"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 100}, []byte("packet100"))
|
||||||
sender.EXPECT().WouldBlock().AnyTimes()
|
sender.EXPECT().WouldBlock().AnyTimes()
|
||||||
sender.EXPECT().Send(gomock.Any(), gomock.Any())
|
sender.EXPECT().Send(gomock.Any(), gomock.Any())
|
||||||
go func() {
|
go func() {
|
||||||
|
@ -1527,13 +1525,13 @@ var _ = Describe("Connection", func() {
|
||||||
pacingDelay := scaleDuration(100 * time.Millisecond)
|
pacingDelay := scaleDuration(100 * time.Millisecond)
|
||||||
gomock.InOrder(
|
gomock.InOrder(
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny),
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny),
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 100}}, []byte("packet100")),
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 100}, []byte("packet100")),
|
||||||
sph.EXPECT().SentPacket(gomock.Any()),
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()),
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendPacingLimited),
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendPacingLimited),
|
||||||
sph.EXPECT().TimeUntilSend().Return(time.Now().Add(pacingDelay)),
|
sph.EXPECT().TimeUntilSend().Return(time.Now().Add(pacingDelay)),
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny),
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny),
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 101}}, []byte("packet101")),
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 101}, []byte("packet101")),
|
||||||
sph.EXPECT().SentPacket(gomock.Any()),
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()),
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendPacingLimited),
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendPacingLimited),
|
||||||
sph.EXPECT().TimeUntilSend().Return(time.Now().Add(time.Hour)),
|
sph.EXPECT().TimeUntilSend().Return(time.Now().Add(time.Hour)),
|
||||||
)
|
)
|
||||||
|
@ -1552,12 +1550,12 @@ var _ = Describe("Connection", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("sends multiple packets at once", func() {
|
It("sends multiple packets at once", func() {
|
||||||
sph.EXPECT().SentPacket(gomock.Any()).Times(3)
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(3)
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).Times(3)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).Times(3)
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendPacingLimited)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendPacingLimited)
|
||||||
sph.EXPECT().TimeUntilSend().Return(time.Now().Add(time.Hour))
|
sph.EXPECT().TimeUntilSend().Return(time.Now().Add(time.Hour))
|
||||||
for pn := protocol.PacketNumber(1000); pn < 1003; pn++ {
|
for pn := protocol.PacketNumber(1000); pn < 1003; pn++ {
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: pn}}, []byte("packet"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: pn}, []byte("packet"))
|
||||||
}
|
}
|
||||||
written := make(chan struct{}, 3)
|
written := make(chan struct{}, 3)
|
||||||
sender.EXPECT().WouldBlock().AnyTimes()
|
sender.EXPECT().WouldBlock().AnyTimes()
|
||||||
|
@ -1590,10 +1588,10 @@ var _ = Describe("Connection", func() {
|
||||||
|
|
||||||
written := make(chan struct{})
|
written := make(chan struct{})
|
||||||
sender.EXPECT().WouldBlock().AnyTimes()
|
sender.EXPECT().WouldBlock().AnyTimes()
|
||||||
sph.EXPECT().SentPacket(gomock.Any())
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 1000}}, []byte("packet1000"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 1000}, []byte("packet1000"))
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
||||||
sender.EXPECT().Send(gomock.Any(), gomock.Any()).DoAndReturn(func(*packetBuffer, protocol.ByteCount) { close(written) })
|
sender.EXPECT().Send(gomock.Any(), gomock.Any()).DoAndReturn(func(*packetBuffer, protocol.ByteCount) { close(written) })
|
||||||
available <- struct{}{}
|
available <- struct{}{}
|
||||||
Eventually(written).Should(BeClosed())
|
Eventually(written).Should(BeClosed())
|
||||||
|
@ -1610,13 +1608,13 @@ var _ = Describe("Connection", func() {
|
||||||
|
|
||||||
written := make(chan struct{})
|
written := make(chan struct{})
|
||||||
sender.EXPECT().WouldBlock().AnyTimes()
|
sender.EXPECT().WouldBlock().AnyTimes()
|
||||||
sph.EXPECT().SentPacket(gomock.Any()).Do(func(*ackhandler.Packet) {
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Do(func(time.Time, protocol.PacketNumber, protocol.PacketNumber, []ackhandler.StreamFrame, []ackhandler.Frame, protocol.EncryptionLevel, protocol.ByteCount, bool) {
|
||||||
sph.EXPECT().ReceivedBytes(gomock.Any())
|
sph.EXPECT().ReceivedBytes(gomock.Any())
|
||||||
conn.handlePacket(receivedPacket{buffer: getPacketBuffer()})
|
conn.handlePacket(receivedPacket{buffer: getPacketBuffer()})
|
||||||
})
|
})
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 10}}, []byte("packet10"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 10}, []byte("packet10"))
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
||||||
sender.EXPECT().Send(gomock.Any(), gomock.Any()).DoAndReturn(func(*packetBuffer, protocol.ByteCount) { close(written) })
|
sender.EXPECT().Send(gomock.Any(), gomock.Any()).DoAndReturn(func(*packetBuffer, protocol.ByteCount) { close(written) })
|
||||||
|
|
||||||
conn.scheduleSending()
|
conn.scheduleSending()
|
||||||
|
@ -1626,9 +1624,9 @@ var _ = Describe("Connection", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("stops sending when the send queue is full", func() {
|
It("stops sending when the send queue is full", func() {
|
||||||
sph.EXPECT().SentPacket(gomock.Any())
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny)
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 1000}}, []byte("packet1000"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 1000}, []byte("packet1000"))
|
||||||
written := make(chan struct{}, 1)
|
written := make(chan struct{}, 1)
|
||||||
sender.EXPECT().WouldBlock()
|
sender.EXPECT().WouldBlock()
|
||||||
sender.EXPECT().WouldBlock().Return(true).Times(2)
|
sender.EXPECT().WouldBlock().Return(true).Times(2)
|
||||||
|
@ -1645,11 +1643,11 @@ var _ = Describe("Connection", func() {
|
||||||
time.Sleep(scaleDuration(50 * time.Millisecond))
|
time.Sleep(scaleDuration(50 * time.Millisecond))
|
||||||
|
|
||||||
// now make room in the send queue
|
// now make room in the send queue
|
||||||
sph.EXPECT().SentPacket(gomock.Any())
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
||||||
sender.EXPECT().WouldBlock().AnyTimes()
|
sender.EXPECT().WouldBlock().AnyTimes()
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 1001}}, []byte("packet1001"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 1001}, []byte("packet1001"))
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
||||||
sender.EXPECT().Send(gomock.Any(), gomock.Any()).DoAndReturn(func(*packetBuffer, protocol.ByteCount) { written <- struct{}{} })
|
sender.EXPECT().Send(gomock.Any(), gomock.Any()).DoAndReturn(func(*packetBuffer, protocol.ByteCount) { written <- struct{}{} })
|
||||||
available <- struct{}{}
|
available <- struct{}{}
|
||||||
Eventually(written).Should(Receive())
|
Eventually(written).Should(Receive())
|
||||||
|
@ -1662,7 +1660,7 @@ var _ = Describe("Connection", func() {
|
||||||
It("doesn't set a pacing timer when there is no data to send", func() {
|
It("doesn't set a pacing timer when there is no data to send", func() {
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
||||||
sender.EXPECT().WouldBlock().AnyTimes()
|
sender.EXPECT().WouldBlock().AnyTimes()
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
||||||
// don't EXPECT any calls to mconn.Write()
|
// don't EXPECT any calls to mconn.Write()
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
|
@ -1677,7 +1675,7 @@ var _ = Describe("Connection", func() {
|
||||||
mtuDiscoverer := NewMockMTUDiscoverer(mockCtrl)
|
mtuDiscoverer := NewMockMTUDiscoverer(mockCtrl)
|
||||||
conn.mtuDiscoverer = mtuDiscoverer
|
conn.mtuDiscoverer = mtuDiscoverer
|
||||||
conn.config.DisablePathMTUDiscovery = false
|
conn.config.DisablePathMTUDiscovery = false
|
||||||
sph.EXPECT().SentPacket(gomock.Any())
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny)
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendNone)
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendNone)
|
||||||
written := make(chan struct{}, 1)
|
written := make(chan struct{}, 1)
|
||||||
|
@ -1686,7 +1684,7 @@ var _ = Describe("Connection", func() {
|
||||||
mtuDiscoverer.EXPECT().ShouldSendProbe(gomock.Any()).Return(true)
|
mtuDiscoverer.EXPECT().ShouldSendProbe(gomock.Any()).Return(true)
|
||||||
ping := ackhandler.Frame{Frame: &wire.PingFrame{}}
|
ping := ackhandler.Frame{Frame: &wire.PingFrame{}}
|
||||||
mtuDiscoverer.EXPECT().GetPing().Return(ping, protocol.ByteCount(1234))
|
mtuDiscoverer.EXPECT().GetPing().Return(ping, protocol.ByteCount(1234))
|
||||||
packer.EXPECT().PackMTUProbePacket(ping, protocol.ByteCount(1234), gomock.Any(), conn.version).Return(shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 1}}, getPacketBuffer(), nil)
|
packer.EXPECT().PackMTUProbePacket(ping, protocol.ByteCount(1234), conn.version).Return(shortHeaderPacket{PacketNumber: 1}, getPacketBuffer(), nil)
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
cryptoSetup.EXPECT().RunHandshake().MaxTimes(1)
|
cryptoSetup.EXPECT().RunHandshake().MaxTimes(1)
|
||||||
|
@ -1713,7 +1711,7 @@ var _ = Describe("Connection", func() {
|
||||||
// make the go routine return
|
// make the go routine return
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
sender.EXPECT().Close()
|
sender.EXPECT().Close()
|
||||||
|
@ -1729,10 +1727,10 @@ var _ = Describe("Connection", func() {
|
||||||
sph.EXPECT().TimeUntilSend().AnyTimes()
|
sph.EXPECT().TimeUntilSend().AnyTimes()
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
||||||
|
|
||||||
sph.EXPECT().SentPacket(gomock.Any())
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
conn.sentPacketHandler = sph
|
conn.sentPacketHandler = sph
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 1}}, []byte("packet1"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 1}, []byte("packet1"))
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
|
@ -1750,13 +1748,13 @@ var _ = Describe("Connection", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("sets the timer to the ack timer", func() {
|
It("sets the timer to the ack timer", func() {
|
||||||
expectAppendPacket(packer, shortHeaderPacket{Packet: &ackhandler.Packet{PacketNumber: 1234}}, []byte("packet1234"))
|
expectAppendPacket(packer, shortHeaderPacket{PacketNumber: 1234}, []byte("packet1234"))
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack)
|
||||||
sph := mockackhandler.NewMockSentPacketHandler(mockCtrl)
|
sph := mockackhandler.NewMockSentPacketHandler(mockCtrl)
|
||||||
sph.EXPECT().GetLossDetectionTimeout().AnyTimes()
|
sph.EXPECT().GetLossDetectionTimeout().AnyTimes()
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
||||||
sph.EXPECT().SentPacket(gomock.Any()).Do(func(p *ackhandler.Packet) {
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Do(func(_ time.Time, pn, _ protocol.PacketNumber, _ []ackhandler.StreamFrame, _ []ackhandler.Frame, _ protocol.EncryptionLevel, _ protocol.ByteCount, _ bool) {
|
||||||
Expect(p.PacketNumber).To(Equal(protocol.PacketNumber(1234)))
|
Expect(pn).To(Equal(protocol.PacketNumber(1234)))
|
||||||
})
|
})
|
||||||
conn.sentPacketHandler = sph
|
conn.sentPacketHandler = sph
|
||||||
rph := mockackhandler.NewMockReceivedPacketHandler(mockCtrl)
|
rph := mockackhandler.NewMockReceivedPacketHandler(mockCtrl)
|
||||||
|
@ -1784,7 +1782,7 @@ var _ = Describe("Connection", func() {
|
||||||
conn.sentPacketHandler = sph
|
conn.sentPacketHandler = sph
|
||||||
buffer := getPacketBuffer()
|
buffer := getPacketBuffer()
|
||||||
buffer.Data = append(buffer.Data, []byte("foobar")...)
|
buffer.Data = append(buffer.Data, []byte("foobar")...)
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version).Return(&coalescedPacket{
|
||||||
buffer: buffer,
|
buffer: buffer,
|
||||||
longHdrPackets: []*longHeaderPacket{
|
longHdrPackets: []*longHeaderPacket{
|
||||||
{
|
{
|
||||||
|
@ -1803,21 +1801,21 @@ var _ = Describe("Connection", func() {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}, nil)
|
}, nil)
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version).AnyTimes()
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version).AnyTimes()
|
||||||
|
|
||||||
sph.EXPECT().GetLossDetectionTimeout().AnyTimes()
|
sph.EXPECT().GetLossDetectionTimeout().AnyTimes()
|
||||||
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
sph.EXPECT().SendMode(gomock.Any()).Return(ackhandler.SendAny).AnyTimes()
|
||||||
sph.EXPECT().TimeUntilSend().Return(time.Now()).AnyTimes()
|
sph.EXPECT().TimeUntilSend().Return(time.Now()).AnyTimes()
|
||||||
gomock.InOrder(
|
gomock.InOrder(
|
||||||
sph.EXPECT().SentPacket(gomock.Any()).Do(func(p *ackhandler.Packet) {
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Do(func(_ time.Time, pn, _ protocol.PacketNumber, _ []ackhandler.StreamFrame, _ []ackhandler.Frame, encLevel protocol.EncryptionLevel, size protocol.ByteCount, _ bool) {
|
||||||
Expect(p.EncryptionLevel).To(Equal(protocol.EncryptionInitial))
|
Expect(encLevel).To(Equal(protocol.EncryptionInitial))
|
||||||
Expect(p.PacketNumber).To(Equal(protocol.PacketNumber(13)))
|
Expect(pn).To(Equal(protocol.PacketNumber(13)))
|
||||||
Expect(p.Length).To(BeEquivalentTo(123))
|
Expect(size).To(BeEquivalentTo(123))
|
||||||
}),
|
}),
|
||||||
sph.EXPECT().SentPacket(gomock.Any()).Do(func(p *ackhandler.Packet) {
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Do(func(_ time.Time, pn, _ protocol.PacketNumber, _ []ackhandler.StreamFrame, _ []ackhandler.Frame, encLevel protocol.EncryptionLevel, size protocol.ByteCount, _ bool) {
|
||||||
Expect(p.EncryptionLevel).To(Equal(protocol.EncryptionHandshake))
|
Expect(encLevel).To(Equal(protocol.EncryptionHandshake))
|
||||||
Expect(p.PacketNumber).To(Equal(protocol.PacketNumber(37)))
|
Expect(pn).To(Equal(protocol.PacketNumber(37)))
|
||||||
Expect(p.Length).To(BeEquivalentTo(1234))
|
Expect(size).To(BeEquivalentTo(1234))
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
gomock.InOrder(
|
gomock.InOrder(
|
||||||
|
@ -1844,7 +1842,7 @@ var _ = Describe("Connection", func() {
|
||||||
// make sure the go routine returns
|
// make sure the go routine returns
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
|
@ -1854,7 +1852,7 @@ var _ = Describe("Connection", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("cancels the HandshakeComplete context when the handshake completes", func() {
|
It("cancels the HandshakeComplete context when the handshake completes", func() {
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version).AnyTimes()
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version).AnyTimes()
|
||||||
finishHandshake := make(chan struct{})
|
finishHandshake := make(chan struct{})
|
||||||
sph := mockackhandler.NewMockSentPacketHandler(mockCtrl)
|
sph := mockackhandler.NewMockSentPacketHandler(mockCtrl)
|
||||||
conn.sentPacketHandler = sph
|
conn.sentPacketHandler = sph
|
||||||
|
@ -1879,7 +1877,7 @@ var _ = Describe("Connection", func() {
|
||||||
// make sure the go routine returns
|
// make sure the go routine returns
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
|
@ -1890,7 +1888,7 @@ var _ = Describe("Connection", func() {
|
||||||
|
|
||||||
It("sends a connection ticket when the handshake completes", func() {
|
It("sends a connection ticket when the handshake completes", func() {
|
||||||
const size = protocol.MaxPostHandshakeCryptoFrameSize * 3 / 2
|
const size = protocol.MaxPostHandshakeCryptoFrameSize * 3 / 2
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version).AnyTimes()
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version).AnyTimes()
|
||||||
finishHandshake := make(chan struct{})
|
finishHandshake := make(chan struct{})
|
||||||
connRunner.EXPECT().Retire(clientDestConnID)
|
connRunner.EXPECT().Retire(clientDestConnID)
|
||||||
go func() {
|
go func() {
|
||||||
|
@ -1924,7 +1922,7 @@ var _ = Describe("Connection", func() {
|
||||||
// make sure the go routine returns
|
// make sure the go routine returns
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
|
@ -1934,10 +1932,10 @@ var _ = Describe("Connection", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("doesn't cancel the HandshakeComplete context when the handshake fails", func() {
|
It("doesn't cancel the HandshakeComplete context when the handshake fails", func() {
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version).AnyTimes()
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version).AnyTimes()
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
tracer.EXPECT().Close()
|
tracer.EXPECT().Close()
|
||||||
|
@ -1960,20 +1958,20 @@ var _ = Describe("Connection", func() {
|
||||||
sph.EXPECT().GetLossDetectionTimeout().AnyTimes()
|
sph.EXPECT().GetLossDetectionTimeout().AnyTimes()
|
||||||
sph.EXPECT().TimeUntilSend().AnyTimes()
|
sph.EXPECT().TimeUntilSend().AnyTimes()
|
||||||
sph.EXPECT().SetHandshakeConfirmed()
|
sph.EXPECT().SetHandshakeConfirmed()
|
||||||
sph.EXPECT().SentPacket(gomock.Any())
|
sph.EXPECT().SentPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
tracer.EXPECT().SentShortHeaderPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
tracer.EXPECT().SentShortHeaderPacket(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
conn.sentPacketHandler = sph
|
conn.sentPacketHandler = sph
|
||||||
done := make(chan struct{})
|
done := make(chan struct{})
|
||||||
connRunner.EXPECT().Retire(clientDestConnID)
|
connRunner.EXPECT().Retire(clientDestConnID)
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).DoAndReturn(func(_ *packetBuffer, _ protocol.ByteCount, _ time.Time, v protocol.VersionNumber) (shortHeaderPacket, error) {
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).DoAndReturn(func(_ *packetBuffer, _ protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, error) {
|
||||||
frames, _ := conn.framer.AppendControlFrames(nil, protocol.MaxByteCount, v)
|
frames, _ := conn.framer.AppendControlFrames(nil, protocol.MaxByteCount, v)
|
||||||
Expect(frames).ToNot(BeEmpty())
|
Expect(frames).ToNot(BeEmpty())
|
||||||
Expect(frames[0].Frame).To(BeEquivalentTo(&wire.HandshakeDoneFrame{}))
|
Expect(frames[0].Frame).To(BeEquivalentTo(&wire.HandshakeDoneFrame{}))
|
||||||
defer close(done)
|
defer close(done)
|
||||||
return shortHeaderPacket{Packet: &ackhandler.Packet{}}, nil
|
return shortHeaderPacket{}, nil
|
||||||
})
|
})
|
||||||
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack).AnyTimes()
|
packer.EXPECT().AppendPacket(gomock.Any(), gomock.Any(), conn.version).Return(shortHeaderPacket{}, errNothingToPack).AnyTimes()
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
cryptoSetup.EXPECT().RunHandshake()
|
cryptoSetup.EXPECT().RunHandshake()
|
||||||
|
@ -1987,7 +1985,7 @@ var _ = Describe("Connection", func() {
|
||||||
// make sure the go routine returns
|
// make sure the go routine returns
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
tracer.EXPECT().Close()
|
tracer.EXPECT().Close()
|
||||||
|
@ -2005,7 +2003,7 @@ var _ = Describe("Connection", func() {
|
||||||
}()
|
}()
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
|
@ -2029,7 +2027,7 @@ var _ = Describe("Connection", func() {
|
||||||
}()
|
}()
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
|
@ -2050,7 +2048,7 @@ var _ = Describe("Connection", func() {
|
||||||
InitialSourceConnectionID: destConnID,
|
InitialSourceConnectionID: destConnID,
|
||||||
}
|
}
|
||||||
streamManager.EXPECT().UpdateLimits(params)
|
streamManager.EXPECT().UpdateLimits(params)
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version).MaxTimes(3)
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version).MaxTimes(3)
|
||||||
Expect(conn.earlyConnReady()).ToNot(BeClosed())
|
Expect(conn.earlyConnReady()).ToNot(BeClosed())
|
||||||
tracer.EXPECT().ReceivedTransportParameters(params)
|
tracer.EXPECT().ReceivedTransportParameters(params)
|
||||||
conn.handleTransportParameters(params)
|
conn.handleTransportParameters(params)
|
||||||
|
@ -2086,7 +2084,7 @@ var _ = Describe("Connection", func() {
|
||||||
// make the go routine return
|
// make the go routine return
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
streamManager.EXPECT().CloseWithError(gomock.Any())
|
streamManager.EXPECT().CloseWithError(gomock.Any())
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
tracer.EXPECT().ClosedConnection(gomock.Any())
|
tracer.EXPECT().ClosedConnection(gomock.Any())
|
||||||
|
@ -2099,7 +2097,7 @@ var _ = Describe("Connection", func() {
|
||||||
setRemoteIdleTimeout(5 * time.Second)
|
setRemoteIdleTimeout(5 * time.Second)
|
||||||
conn.lastPacketReceivedTime = time.Now().Add(-5 * time.Second / 2)
|
conn.lastPacketReceivedTime = time.Now().Add(-5 * time.Second / 2)
|
||||||
sent := make(chan struct{})
|
sent := make(chan struct{})
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version).Do(func(bool, protocol.ByteCount, time.Time, protocol.VersionNumber) (*coalescedPacket, error) {
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version).Do(func(bool, protocol.ByteCount, protocol.VersionNumber) (*coalescedPacket, error) {
|
||||||
close(sent)
|
close(sent)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
})
|
})
|
||||||
|
@ -2112,7 +2110,7 @@ var _ = Describe("Connection", func() {
|
||||||
setRemoteIdleTimeout(time.Hour)
|
setRemoteIdleTimeout(time.Hour)
|
||||||
conn.lastPacketReceivedTime = time.Now().Add(-protocol.MaxKeepAliveInterval).Add(-time.Millisecond)
|
conn.lastPacketReceivedTime = time.Now().Add(-protocol.MaxKeepAliveInterval).Add(-time.Millisecond)
|
||||||
sent := make(chan struct{})
|
sent := make(chan struct{})
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version).Do(func(bool, protocol.ByteCount, time.Time, protocol.VersionNumber) (*coalescedPacket, error) {
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version).Do(func(bool, protocol.ByteCount, protocol.VersionNumber) (*coalescedPacket, error) {
|
||||||
close(sent)
|
close(sent)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
})
|
})
|
||||||
|
@ -2200,7 +2198,7 @@ var _ = Describe("Connection", func() {
|
||||||
conn.config.HandshakeIdleTimeout = 9999 * time.Second
|
conn.config.HandshakeIdleTimeout = 9999 * time.Second
|
||||||
conn.config.MaxIdleTimeout = 9999 * time.Second
|
conn.config.MaxIdleTimeout = 9999 * time.Second
|
||||||
conn.lastPacketReceivedTime = time.Now().Add(-time.Minute)
|
conn.lastPacketReceivedTime = time.Now().Add(-time.Minute)
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).DoAndReturn(func(e *qerr.ApplicationError, _ protocol.ByteCount, _ time.Time, _ protocol.VersionNumber) (*coalescedPacket, error) {
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).DoAndReturn(func(e *qerr.ApplicationError, _ protocol.ByteCount, _ protocol.VersionNumber) (*coalescedPacket, error) {
|
||||||
Expect(e.ErrorCode).To(BeZero())
|
Expect(e.ErrorCode).To(BeZero())
|
||||||
return &coalescedPacket{buffer: getPacketBuffer()}, nil
|
return &coalescedPacket{buffer: getPacketBuffer()}, nil
|
||||||
})
|
})
|
||||||
|
@ -2231,7 +2229,7 @@ var _ = Describe("Connection", func() {
|
||||||
|
|
||||||
It("closes the connection due to the idle timeout before handshake", func() {
|
It("closes the connection due to the idle timeout before handshake", func() {
|
||||||
conn.config.HandshakeIdleTimeout = 0
|
conn.config.HandshakeIdleTimeout = 0
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version).AnyTimes()
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version).AnyTimes()
|
||||||
connRunner.EXPECT().Remove(gomock.Any()).AnyTimes()
|
connRunner.EXPECT().Remove(gomock.Any()).AnyTimes()
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
gomock.InOrder(
|
gomock.InOrder(
|
||||||
|
@ -2257,7 +2255,7 @@ var _ = Describe("Connection", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("closes the connection due to the idle timeout after handshake", func() {
|
It("closes the connection due to the idle timeout after handshake", func() {
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version).AnyTimes()
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version).AnyTimes()
|
||||||
gomock.InOrder(
|
gomock.InOrder(
|
||||||
connRunner.EXPECT().Retire(clientDestConnID),
|
connRunner.EXPECT().Retire(clientDestConnID),
|
||||||
connRunner.EXPECT().Remove(gomock.Any()),
|
connRunner.EXPECT().Remove(gomock.Any()),
|
||||||
|
@ -2298,7 +2296,7 @@ var _ = Describe("Connection", func() {
|
||||||
}()
|
}()
|
||||||
Consistently(conn.Context().Done()).ShouldNot(BeClosed())
|
Consistently(conn.Context().Done()).ShouldNot(BeClosed())
|
||||||
// make the go routine return
|
// make the go routine return
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
|
@ -2485,7 +2483,7 @@ var _ = Describe("Client Connection", func() {
|
||||||
tracer.EXPECT().ReceivedLongHeaderPacket(gomock.Any(), p.Size(), []logging.Frame{})
|
tracer.EXPECT().ReceivedLongHeaderPacket(gomock.Any(), p.Size(), []logging.Frame{})
|
||||||
Expect(conn.handlePacketImpl(p)).To(BeTrue())
|
Expect(conn.handlePacketImpl(p)).To(BeTrue())
|
||||||
// make sure the go routine returns
|
// make sure the go routine returns
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil)
|
||||||
expectReplaceWithClosed()
|
expectReplaceWithClosed()
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
|
@ -2744,9 +2742,9 @@ var _ = Describe("Client Connection", func() {
|
||||||
if !closed {
|
if !closed {
|
||||||
connRunner.EXPECT().ReplaceWithClosed(gomock.Any(), gomock.Any(), gomock.Any())
|
connRunner.EXPECT().ReplaceWithClosed(gomock.Any(), gomock.Any(), gomock.Any())
|
||||||
if applicationClose {
|
if applicationClose {
|
||||||
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil).MaxTimes(1)
|
packer.EXPECT().PackApplicationClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil).MaxTimes(1)
|
||||||
} else {
|
} else {
|
||||||
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil).MaxTimes(1)
|
packer.EXPECT().PackConnectionClose(gomock.Any(), gomock.Any(), conn.version).Return(&coalescedPacket{buffer: getPacketBuffer()}, nil).MaxTimes(1)
|
||||||
}
|
}
|
||||||
cryptoSetup.EXPECT().Close()
|
cryptoSetup.EXPECT().Close()
|
||||||
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
mconn.EXPECT().Write(gomock.Any(), gomock.Any())
|
||||||
|
@ -2775,7 +2773,7 @@ var _ = Describe("Client Connection", func() {
|
||||||
StatelessResetToken: protocol.StatelessResetToken{16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1},
|
StatelessResetToken: protocol.StatelessResetToken{16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), gomock.Any(), conn.version).MaxTimes(1)
|
packer.EXPECT().PackCoalescedPacket(false, gomock.Any(), conn.version).MaxTimes(1)
|
||||||
tracer.EXPECT().ReceivedTransportParameters(params)
|
tracer.EXPECT().ReceivedTransportParameters(params)
|
||||||
conn.handleTransportParameters(params)
|
conn.handleTransportParameters(params)
|
||||||
conn.handleHandshakeComplete()
|
conn.handleHandshakeComplete()
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
// SentPacketHandler handles ACKs received for outgoing packets
|
// SentPacketHandler handles ACKs received for outgoing packets
|
||||||
type SentPacketHandler interface {
|
type SentPacketHandler interface {
|
||||||
// SentPacket may modify the packet
|
// SentPacket may modify the packet
|
||||||
SentPacket(packet *Packet)
|
SentPacket(t time.Time, pn, largestAcked protocol.PacketNumber, streamFrames []StreamFrame, frames []Frame, encLevel protocol.EncryptionLevel, size protocol.ByteCount, isPathMTUProbePacket bool)
|
||||||
// ReceivedAck processes an ACK frame.
|
// ReceivedAck processes an ACK frame.
|
||||||
// It does not store a copy of the frame.
|
// It does not store a copy of the frame.
|
||||||
ReceivedAck(f *wire.AckFrame, encLevel protocol.EncryptionLevel, recvTime time.Time) (bool /* 1-RTT packet acked */, error)
|
ReceivedAck(f *wire.AckFrame, encLevel protocol.EncryptionLevel, recvTime time.Time) (bool /* 1-RTT packet acked */, error)
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// A Packet is a packet
|
// A Packet is a packet
|
||||||
type Packet struct {
|
type packet struct {
|
||||||
SendTime time.Time
|
SendTime time.Time
|
||||||
PacketNumber protocol.PacketNumber
|
PacketNumber protocol.PacketNumber
|
||||||
StreamFrames []StreamFrame
|
StreamFrames []StreamFrame
|
||||||
|
@ -24,14 +24,14 @@ type Packet struct {
|
||||||
skippedPacket bool
|
skippedPacket bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Packet) outstanding() bool {
|
func (p *packet) outstanding() bool {
|
||||||
return !p.declaredLost && !p.skippedPacket && !p.IsPathMTUProbePacket
|
return !p.declaredLost && !p.skippedPacket && !p.IsPathMTUProbePacket
|
||||||
}
|
}
|
||||||
|
|
||||||
var packetPool = sync.Pool{New: func() any { return &Packet{} }}
|
var packetPool = sync.Pool{New: func() any { return &packet{} }}
|
||||||
|
|
||||||
func GetPacket() *Packet {
|
func getPacket() *packet {
|
||||||
p := packetPool.Get().(*Packet)
|
p := packetPool.Get().(*packet)
|
||||||
p.PacketNumber = 0
|
p.PacketNumber = 0
|
||||||
p.StreamFrames = nil
|
p.StreamFrames = nil
|
||||||
p.Frames = nil
|
p.Frames = nil
|
||||||
|
@ -48,7 +48,7 @@ func GetPacket() *Packet {
|
||||||
|
|
||||||
// We currently only return Packets back into the pool when they're acknowledged (not when they're lost).
|
// 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.
|
// This simplifies the code, and gives the vast majority of the performance benefit we can gain from using the pool.
|
||||||
func putPacket(p *Packet) {
|
func putPacket(p *packet) {
|
||||||
p.Frames = nil
|
p.Frames = nil
|
||||||
p.StreamFrames = nil
|
p.StreamFrames = nil
|
||||||
packetPool.Put(p)
|
packetPool.Put(p)
|
||||||
|
|
|
@ -75,7 +75,7 @@ type sentPacketHandler struct {
|
||||||
// Only applies to the application-data packet number space.
|
// Only applies to the application-data packet number space.
|
||||||
lowestNotConfirmedAcked protocol.PacketNumber
|
lowestNotConfirmedAcked protocol.PacketNumber
|
||||||
|
|
||||||
ackedPackets []*Packet // to avoid allocations in detectAndRemoveAckedPackets
|
ackedPackets []*packet // to avoid allocations in detectAndRemoveAckedPackets
|
||||||
|
|
||||||
bytesInFlight protocol.ByteCount
|
bytesInFlight protocol.ByteCount
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ func (h *sentPacketHandler) DropPackets(encLevel protocol.EncryptionLevel) {
|
||||||
h.dropPackets(encLevel)
|
h.dropPackets(encLevel)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *sentPacketHandler) removeFromBytesInFlight(p *Packet) {
|
func (h *sentPacketHandler) removeFromBytesInFlight(p *packet) {
|
||||||
if p.includedInBytesInFlight {
|
if p.includedInBytesInFlight {
|
||||||
if p.Length > h.bytesInFlight {
|
if p.Length > h.bytesInFlight {
|
||||||
panic("negative bytes_in_flight")
|
panic("negative bytes_in_flight")
|
||||||
|
@ -165,7 +165,7 @@ func (h *sentPacketHandler) dropPackets(encLevel protocol.EncryptionLevel) {
|
||||||
// remove outstanding packets from bytes_in_flight
|
// remove outstanding packets from bytes_in_flight
|
||||||
if encLevel == protocol.EncryptionInitial || encLevel == protocol.EncryptionHandshake {
|
if encLevel == protocol.EncryptionInitial || encLevel == protocol.EncryptionHandshake {
|
||||||
pnSpace := h.getPacketNumberSpace(encLevel)
|
pnSpace := h.getPacketNumberSpace(encLevel)
|
||||||
pnSpace.history.Iterate(func(p *Packet) (bool, error) {
|
pnSpace.history.Iterate(func(p *packet) (bool, error) {
|
||||||
h.removeFromBytesInFlight(p)
|
h.removeFromBytesInFlight(p)
|
||||||
return true, nil
|
return true, nil
|
||||||
})
|
})
|
||||||
|
@ -182,7 +182,7 @@ func (h *sentPacketHandler) dropPackets(encLevel protocol.EncryptionLevel) {
|
||||||
// and not when the client drops 0-RTT keys when the handshake completes.
|
// and not when the client drops 0-RTT keys when the handshake completes.
|
||||||
// When 0-RTT is rejected, all application data sent so far becomes invalid.
|
// When 0-RTT is rejected, all application data sent so far becomes invalid.
|
||||||
// Delete the packets from the history and remove them from bytes_in_flight.
|
// Delete the packets from the history and remove them from bytes_in_flight.
|
||||||
h.appDataPackets.history.Iterate(func(p *Packet) (bool, error) {
|
h.appDataPackets.history.Iterate(func(p *packet) (bool, error) {
|
||||||
if p.EncryptionLevel != protocol.Encryption0RTT && !p.skippedPacket {
|
if p.EncryptionLevel != protocol.Encryption0RTT && !p.skippedPacket {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
@ -228,7 +228,25 @@ func (h *sentPacketHandler) packetsInFlight() int {
|
||||||
return packetsInFlight
|
return packetsInFlight
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *sentPacketHandler) SentPacket(p *Packet) {
|
func (h *sentPacketHandler) SentPacket(
|
||||||
|
t time.Time,
|
||||||
|
pn, largestAcked protocol.PacketNumber,
|
||||||
|
streamFrames []StreamFrame,
|
||||||
|
frames []Frame,
|
||||||
|
encLevel protocol.EncryptionLevel,
|
||||||
|
size protocol.ByteCount,
|
||||||
|
isPathMTUProbePacket bool,
|
||||||
|
) {
|
||||||
|
p := getPacket()
|
||||||
|
p.SendTime = t
|
||||||
|
p.PacketNumber = pn
|
||||||
|
p.EncryptionLevel = encLevel
|
||||||
|
p.Length = size
|
||||||
|
p.LargestAcked = largestAcked
|
||||||
|
p.StreamFrames = streamFrames
|
||||||
|
p.Frames = frames
|
||||||
|
p.IsPathMTUProbePacket = isPathMTUProbePacket
|
||||||
|
|
||||||
h.bytesSent += p.Length
|
h.bytesSent += p.Length
|
||||||
// For the client, drop the Initial packet number space when the first Handshake packet is sent.
|
// For the client, drop the Initial packet number space when the first Handshake packet is sent.
|
||||||
if h.perspective == protocol.PerspectiveClient && p.EncryptionLevel == protocol.EncryptionHandshake && h.initialPackets != nil {
|
if h.perspective == protocol.PerspectiveClient && p.EncryptionLevel == protocol.EncryptionHandshake && h.initialPackets != nil {
|
||||||
|
@ -359,13 +377,13 @@ func (h *sentPacketHandler) GetLowestPacketNotConfirmedAcked() protocol.PacketNu
|
||||||
}
|
}
|
||||||
|
|
||||||
// Packets are returned in ascending packet number order.
|
// Packets are returned in ascending packet number order.
|
||||||
func (h *sentPacketHandler) detectAndRemoveAckedPackets(ack *wire.AckFrame, encLevel protocol.EncryptionLevel) ([]*Packet, error) {
|
func (h *sentPacketHandler) detectAndRemoveAckedPackets(ack *wire.AckFrame, encLevel protocol.EncryptionLevel) ([]*packet, error) {
|
||||||
pnSpace := h.getPacketNumberSpace(encLevel)
|
pnSpace := h.getPacketNumberSpace(encLevel)
|
||||||
h.ackedPackets = h.ackedPackets[:0]
|
h.ackedPackets = h.ackedPackets[:0]
|
||||||
ackRangeIndex := 0
|
ackRangeIndex := 0
|
||||||
lowestAcked := ack.LowestAcked()
|
lowestAcked := ack.LowestAcked()
|
||||||
largestAcked := ack.LargestAcked()
|
largestAcked := ack.LargestAcked()
|
||||||
err := pnSpace.history.Iterate(func(p *Packet) (bool, error) {
|
err := pnSpace.history.Iterate(func(p *packet) (bool, error) {
|
||||||
// Ignore packets below the lowest acked
|
// Ignore packets below the lowest acked
|
||||||
if p.PacketNumber < lowestAcked {
|
if p.PacketNumber < lowestAcked {
|
||||||
return true, nil
|
return true, nil
|
||||||
|
@ -580,7 +598,7 @@ func (h *sentPacketHandler) detectLostPackets(now time.Time, encLevel protocol.E
|
||||||
lostSendTime := now.Add(-lossDelay)
|
lostSendTime := now.Add(-lossDelay)
|
||||||
|
|
||||||
priorInFlight := h.bytesInFlight
|
priorInFlight := h.bytesInFlight
|
||||||
return pnSpace.history.Iterate(func(p *Packet) (bool, error) {
|
return pnSpace.history.Iterate(func(p *packet) (bool, error) {
|
||||||
if p.PacketNumber > pnSpace.largestAcked {
|
if p.PacketNumber > pnSpace.largestAcked {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
@ -792,7 +810,7 @@ func (h *sentPacketHandler) QueueProbePacket(encLevel protocol.EncryptionLevel)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *sentPacketHandler) queueFramesForRetransmission(p *Packet) {
|
func (h *sentPacketHandler) queueFramesForRetransmission(p *packet) {
|
||||||
if len(p.Frames) == 0 && len(p.StreamFrames) == 0 {
|
if len(p.Frames) == 0 && len(p.StreamFrames) == 0 {
|
||||||
panic("no frames")
|
panic("no frames")
|
||||||
}
|
}
|
||||||
|
@ -813,7 +831,7 @@ func (h *sentPacketHandler) queueFramesForRetransmission(p *Packet) {
|
||||||
func (h *sentPacketHandler) ResetForRetry() error {
|
func (h *sentPacketHandler) ResetForRetry() error {
|
||||||
h.bytesInFlight = 0
|
h.bytesInFlight = 0
|
||||||
var firstPacketSendTime time.Time
|
var firstPacketSendTime time.Time
|
||||||
h.initialPackets.history.Iterate(func(p *Packet) (bool, error) {
|
h.initialPackets.history.Iterate(func(p *packet) (bool, error) {
|
||||||
if firstPacketSendTime.IsZero() {
|
if firstPacketSendTime.IsZero() {
|
||||||
firstPacketSendTime = p.SendTime
|
firstPacketSendTime = p.SendTime
|
||||||
}
|
}
|
||||||
|
@ -825,7 +843,7 @@ func (h *sentPacketHandler) ResetForRetry() error {
|
||||||
})
|
})
|
||||||
// All application data packets sent at this point are 0-RTT packets.
|
// All application data packets sent at this point are 0-RTT packets.
|
||||||
// In the case of a Retry, we can assume that the server dropped all of them.
|
// In the case of a Retry, we can assume that the server dropped all of them.
|
||||||
h.appDataPackets.history.Iterate(func(p *Packet) (bool, error) {
|
h.appDataPackets.history.Iterate(func(p *packet) (bool, error) {
|
||||||
if !p.declaredLost && !p.skippedPacket {
|
if !p.declaredLost && !p.skippedPacket {
|
||||||
h.queueFramesForRetransmission(p)
|
h.queueFramesForRetransmission(p)
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
getPacket := func(pn protocol.PacketNumber, encLevel protocol.EncryptionLevel) *Packet {
|
getPacket := func(pn protocol.PacketNumber, encLevel protocol.EncryptionLevel) *packet {
|
||||||
for _, p := range handler.getPacketNumberSpace(encLevel).history.packets {
|
for _, p := range handler.getPacketNumberSpace(encLevel).history.packets {
|
||||||
if p != nil && p.PacketNumber == pn {
|
if p != nil && p.PacketNumber == pn {
|
||||||
return p
|
return p
|
||||||
|
@ -61,7 +61,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
ackElicitingPacket := func(p *Packet) *Packet {
|
ackElicitingPacket := func(p *packet) *packet {
|
||||||
if p.EncryptionLevel == 0 {
|
if p.EncryptionLevel == 0 {
|
||||||
p.EncryptionLevel = protocol.Encryption1RTT
|
p.EncryptionLevel = protocol.Encryption1RTT
|
||||||
}
|
}
|
||||||
|
@ -81,35 +81,39 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
nonAckElicitingPacket := func(p *Packet) *Packet {
|
nonAckElicitingPacket := func(p *packet) *packet {
|
||||||
p = ackElicitingPacket(p)
|
p = ackElicitingPacket(p)
|
||||||
p.Frames = nil
|
p.Frames = nil
|
||||||
p.LargestAcked = 1
|
p.LargestAcked = 1
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
initialPacket := func(p *Packet) *Packet {
|
initialPacket := func(p *packet) *packet {
|
||||||
p = ackElicitingPacket(p)
|
p = ackElicitingPacket(p)
|
||||||
p.EncryptionLevel = protocol.EncryptionInitial
|
p.EncryptionLevel = protocol.EncryptionInitial
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
handshakePacket := func(p *Packet) *Packet {
|
handshakePacket := func(p *packet) *packet {
|
||||||
p = ackElicitingPacket(p)
|
p = ackElicitingPacket(p)
|
||||||
p.EncryptionLevel = protocol.EncryptionHandshake
|
p.EncryptionLevel = protocol.EncryptionHandshake
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
handshakePacketNonAckEliciting := func(p *Packet) *Packet {
|
handshakePacketNonAckEliciting := func(p *packet) *packet {
|
||||||
p = nonAckElicitingPacket(p)
|
p = nonAckElicitingPacket(p)
|
||||||
p.EncryptionLevel = protocol.EncryptionHandshake
|
p.EncryptionLevel = protocol.EncryptionHandshake
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sentPacket := func(p *packet) {
|
||||||
|
handler.SentPacket(p.SendTime, p.PacketNumber, p.LargestAcked, p.StreamFrames, p.Frames, p.EncryptionLevel, p.Length, p.IsPathMTUProbePacket)
|
||||||
|
}
|
||||||
|
|
||||||
expectInPacketHistory := func(expected []protocol.PacketNumber, encLevel protocol.EncryptionLevel) {
|
expectInPacketHistory := func(expected []protocol.PacketNumber, encLevel protocol.EncryptionLevel) {
|
||||||
pnSpace := handler.getPacketNumberSpace(encLevel)
|
pnSpace := handler.getPacketNumberSpace(encLevel)
|
||||||
var length int
|
var length int
|
||||||
pnSpace.history.Iterate(func(p *Packet) (bool, error) {
|
pnSpace.history.Iterate(func(p *packet) (bool, error) {
|
||||||
if !p.declaredLost && !p.skippedPacket {
|
if !p.declaredLost && !p.skippedPacket {
|
||||||
length++
|
length++
|
||||||
}
|
}
|
||||||
|
@ -128,24 +132,24 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
Context("registering sent packets", func() {
|
Context("registering sent packets", func() {
|
||||||
It("accepts two consecutive packets", func() {
|
It("accepts two consecutive packets", func() {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, EncryptionLevel: protocol.EncryptionHandshake}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, EncryptionLevel: protocol.EncryptionHandshake}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2, EncryptionLevel: protocol.EncryptionHandshake}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, EncryptionLevel: protocol.EncryptionHandshake}))
|
||||||
Expect(handler.handshakePackets.largestSent).To(Equal(protocol.PacketNumber(2)))
|
Expect(handler.handshakePackets.largestSent).To(Equal(protocol.PacketNumber(2)))
|
||||||
expectInPacketHistory([]protocol.PacketNumber{1, 2}, protocol.EncryptionHandshake)
|
expectInPacketHistory([]protocol.PacketNumber{1, 2}, protocol.EncryptionHandshake)
|
||||||
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2)))
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2)))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("uses the same packet number space for 0-RTT and 1-RTT packets", func() {
|
It("uses the same packet number space for 0-RTT and 1-RTT packets", func() {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, EncryptionLevel: protocol.Encryption0RTT}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, EncryptionLevel: protocol.Encryption0RTT}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2, EncryptionLevel: protocol.Encryption1RTT}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, EncryptionLevel: protocol.Encryption1RTT}))
|
||||||
Expect(handler.appDataPackets.largestSent).To(Equal(protocol.PacketNumber(2)))
|
Expect(handler.appDataPackets.largestSent).To(Equal(protocol.PacketNumber(2)))
|
||||||
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2)))
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2)))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("accepts packet number 0", func() {
|
It("accepts packet number 0", func() {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 0, EncryptionLevel: protocol.Encryption1RTT}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 0, EncryptionLevel: protocol.Encryption1RTT}))
|
||||||
Expect(handler.appDataPackets.largestSent).To(BeZero())
|
Expect(handler.appDataPackets.largestSent).To(BeZero())
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, EncryptionLevel: protocol.Encryption1RTT}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, EncryptionLevel: protocol.Encryption1RTT}))
|
||||||
Expect(handler.appDataPackets.largestSent).To(Equal(protocol.PacketNumber(1)))
|
Expect(handler.appDataPackets.largestSent).To(Equal(protocol.PacketNumber(1)))
|
||||||
expectInPacketHistory([]protocol.PacketNumber{0, 1}, protocol.Encryption1RTT)
|
expectInPacketHistory([]protocol.PacketNumber{0, 1}, protocol.Encryption1RTT)
|
||||||
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2)))
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2)))
|
||||||
|
@ -153,14 +157,14 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
It("stores the sent time", func() {
|
It("stores the sent time", func() {
|
||||||
sendTime := time.Now().Add(-time.Minute)
|
sendTime := time.Now().Add(-time.Minute)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, SendTime: sendTime}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: sendTime}))
|
||||||
Expect(handler.appDataPackets.lastAckElicitingPacketTime).To(Equal(sendTime))
|
Expect(handler.appDataPackets.lastAckElicitingPacketTime).To(Equal(sendTime))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("stores the sent time of Initial packets", func() {
|
It("stores the sent time of Initial packets", func() {
|
||||||
sendTime := time.Now().Add(-time.Minute)
|
sendTime := time.Now().Add(-time.Minute)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, SendTime: sendTime, EncryptionLevel: protocol.EncryptionInitial}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: sendTime, EncryptionLevel: protocol.EncryptionInitial}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2, SendTime: sendTime.Add(time.Hour), EncryptionLevel: protocol.Encryption1RTT}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: sendTime.Add(time.Hour), EncryptionLevel: protocol.Encryption1RTT}))
|
||||||
Expect(handler.initialPackets.lastAckElicitingPacketTime).To(Equal(sendTime))
|
Expect(handler.initialPackets.lastAckElicitingPacketTime).To(Equal(sendTime))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -168,7 +172,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
Context("ACK processing", func() {
|
Context("ACK processing", func() {
|
||||||
JustBeforeEach(func() {
|
JustBeforeEach(func() {
|
||||||
for i := protocol.PacketNumber(0); i < 10; i++ {
|
for i := protocol.PacketNumber(0); i < 10; i++ {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: i}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: i}))
|
||||||
}
|
}
|
||||||
// Increase RTT, because the tests would be flaky otherwise
|
// Increase RTT, because the tests would be flaky otherwise
|
||||||
updateRTT(time.Hour)
|
updateRTT(time.Hour)
|
||||||
|
@ -184,9 +188,9 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("says if a 1-RTT packet was acknowledged", func() {
|
It("says if a 1-RTT packet was acknowledged", func() {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 10, EncryptionLevel: protocol.Encryption0RTT}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 10, EncryptionLevel: protocol.Encryption0RTT}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 11, EncryptionLevel: protocol.Encryption0RTT}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 11, EncryptionLevel: protocol.Encryption0RTT}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 12, EncryptionLevel: protocol.Encryption1RTT}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 12, EncryptionLevel: protocol.Encryption1RTT}))
|
||||||
acked1RTT, err := handler.ReceivedAck(
|
acked1RTT, err := handler.ReceivedAck(
|
||||||
&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 11}}},
|
&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 11}}},
|
||||||
protocol.Encryption1RTT,
|
protocol.Encryption1RTT,
|
||||||
|
@ -217,9 +221,9 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("rejects ACKs that acknowledge a skipped packet number", func() {
|
It("rejects ACKs that acknowledge a skipped packet number", func() {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 10}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 10}))
|
||||||
handler.appDataPackets.history.SkippedPacket(11)
|
handler.appDataPackets.history.SkippedPacket(11)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 12}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 12}))
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 12}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 12}}}
|
||||||
_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
|
_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
|
||||||
Expect(err).To(MatchError(&qerr.TransportError{
|
Expect(err).To(MatchError(&qerr.TransportError{
|
||||||
|
@ -254,7 +258,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
expectInPacketHistoryOrLost := func(expected []protocol.PacketNumber, encLevel protocol.EncryptionLevel) {
|
expectInPacketHistoryOrLost := func(expected []protocol.PacketNumber, encLevel protocol.EncryptionLevel) {
|
||||||
pnSpace := handler.getPacketNumberSpace(encLevel)
|
pnSpace := handler.getPacketNumberSpace(encLevel)
|
||||||
var length int
|
var length int
|
||||||
pnSpace.history.Iterate(func(p *Packet) (bool, error) {
|
pnSpace.history.Iterate(func(p *packet) (bool, error) {
|
||||||
if !p.declaredLost {
|
if !p.declaredLost {
|
||||||
length++
|
length++
|
||||||
}
|
}
|
||||||
|
@ -295,7 +299,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
It("calls the OnAcked callback", func() {
|
It("calls the OnAcked callback", func() {
|
||||||
var acked bool
|
var acked bool
|
||||||
ping := &wire.PingFrame{}
|
ping := &wire.PingFrame{}
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: 10,
|
PacketNumber: 10,
|
||||||
Frames: []Frame{{
|
Frames: []Frame{{
|
||||||
Frame: ping,
|
Frame: ping,
|
||||||
|
@ -403,7 +407,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("ignores the DelayTime for Initial and Handshake packets", func() {
|
It("ignores the DelayTime for Initial and Handshake packets", func() {
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 1}))
|
sentPacket(initialPacket(&packet{PacketNumber: 1}))
|
||||||
handler.rttStats.SetMaxAckDelay(time.Hour)
|
handler.rttStats.SetMaxAckDelay(time.Hour)
|
||||||
// make sure the rttStats have a min RTT, so that the delay is used
|
// make sure the rttStats have a min RTT, so that the delay is used
|
||||||
handler.rttStats.UpdateRTT(5*time.Minute, 0, time.Now())
|
handler.rttStats.UpdateRTT(5*time.Minute, 0, time.Now())
|
||||||
|
@ -448,7 +452,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
Context("determining which ACKs we have received an ACK for", func() {
|
Context("determining which ACKs we have received an ACK for", func() {
|
||||||
JustBeforeEach(func() {
|
JustBeforeEach(func() {
|
||||||
morePackets := []*Packet{
|
morePackets := []*packet{
|
||||||
{
|
{
|
||||||
PacketNumber: 10,
|
PacketNumber: 10,
|
||||||
LargestAcked: 100,
|
LargestAcked: 100,
|
||||||
|
@ -471,7 +475,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, packet := range morePackets {
|
for _, packet := range morePackets {
|
||||||
handler.SentPacket(packet)
|
sentPacket(packet)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -522,7 +526,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
protocol.ByteCount(42),
|
protocol.ByteCount(42),
|
||||||
true,
|
true,
|
||||||
)
|
)
|
||||||
handler.SentPacket(&Packet{
|
sentPacket(&packet{
|
||||||
PacketNumber: 1,
|
PacketNumber: 1,
|
||||||
Length: 42,
|
Length: 42,
|
||||||
Frames: []Frame{{Frame: &wire.PingFrame{}}},
|
Frames: []Frame{{Frame: &wire.PingFrame{}}},
|
||||||
|
@ -538,9 +542,9 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
cong.EXPECT().OnPacketAcked(protocol.PacketNumber(1), protocol.ByteCount(1), protocol.ByteCount(3), rcvTime),
|
cong.EXPECT().OnPacketAcked(protocol.PacketNumber(1), protocol.ByteCount(1), protocol.ByteCount(3), rcvTime),
|
||||||
cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(3), rcvTime),
|
cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(3), rcvTime),
|
||||||
)
|
)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 1}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 2}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 3}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 3}))
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 2}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 2}}}
|
||||||
_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, rcvTime)
|
_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, rcvTime)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
@ -548,8 +552,8 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
It("doesn't call OnPacketAcked when a retransmitted packet is acked", func() {
|
It("doesn't call OnPacketAcked when a retransmitted packet is acked", func() {
|
||||||
cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(2)
|
cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(2)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, SendTime: time.Now().Add(-time.Hour)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: time.Now().Add(-time.Hour)}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 2}))
|
||||||
// lose packet 1
|
// lose packet 1
|
||||||
gomock.InOrder(
|
gomock.InOrder(
|
||||||
cong.EXPECT().MaybeExitSlowStart(),
|
cong.EXPECT().MaybeExitSlowStart(),
|
||||||
|
@ -568,7 +572,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
It("doesn't call OnPacketLost when a Path MTU probe packet is lost", func() {
|
It("doesn't call OnPacketLost when a Path MTU probe packet is lost", func() {
|
||||||
cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(2)
|
cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(2)
|
||||||
var mtuPacketDeclaredLost bool
|
var mtuPacketDeclaredLost bool
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: 1,
|
PacketNumber: 1,
|
||||||
SendTime: time.Now().Add(-time.Hour),
|
SendTime: time.Now().Add(-time.Hour),
|
||||||
IsPathMTUProbePacket: true,
|
IsPathMTUProbePacket: true,
|
||||||
|
@ -579,7 +583,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 2}))
|
||||||
// lose packet 1, but don't EXPECT any calls to OnPacketLost()
|
// lose packet 1, but don't EXPECT any calls to OnPacketLost()
|
||||||
gomock.InOrder(
|
gomock.InOrder(
|
||||||
cong.EXPECT().MaybeExitSlowStart(),
|
cong.EXPECT().MaybeExitSlowStart(),
|
||||||
|
@ -594,10 +598,10 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
It("calls OnPacketAcked and OnPacketLost with the right bytes_in_flight value", func() {
|
It("calls OnPacketAcked and OnPacketLost with the right bytes_in_flight value", func() {
|
||||||
cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(4)
|
cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(4)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, SendTime: time.Now().Add(-time.Hour)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: time.Now().Add(-time.Hour)}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2, SendTime: time.Now().Add(-30 * time.Minute)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: time.Now().Add(-30 * time.Minute)}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 3, SendTime: time.Now().Add(-30 * time.Minute)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 3, SendTime: time.Now().Add(-30 * time.Minute)}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 4, SendTime: time.Now()}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 4, SendTime: time.Now()}))
|
||||||
// receive the first ACK
|
// receive the first ACK
|
||||||
gomock.InOrder(
|
gomock.InOrder(
|
||||||
cong.EXPECT().MaybeExitSlowStart(),
|
cong.EXPECT().MaybeExitSlowStart(),
|
||||||
|
@ -621,7 +625,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
It("passes the bytes in flight to the congestion controller", func() {
|
It("passes the bytes in flight to the congestion controller", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
cong.EXPECT().OnPacketSent(gomock.Any(), protocol.ByteCount(42), gomock.Any(), protocol.ByteCount(42), true)
|
cong.EXPECT().OnPacketSent(gomock.Any(), protocol.ByteCount(42), gomock.Any(), protocol.ByteCount(42), true)
|
||||||
handler.SentPacket(&Packet{
|
sentPacket(&packet{
|
||||||
Length: 42,
|
Length: 42,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
Frames: []Frame{{Frame: &wire.PingFrame{}}},
|
Frames: []Frame{{Frame: &wire.PingFrame{}}},
|
||||||
|
@ -648,7 +652,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes()
|
cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes()
|
||||||
for i := protocol.PacketNumber(0); i < protocol.MaxOutstandingSentPackets; i++ {
|
for i := protocol.PacketNumber(0); i < protocol.MaxOutstandingSentPackets; i++ {
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: i}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: i}))
|
||||||
}
|
}
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendAck))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendAck))
|
||||||
})
|
})
|
||||||
|
@ -671,8 +675,8 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
It("doesn't set an alarm if there are no outstanding packets", func() {
|
It("doesn't set an alarm if there are no outstanding packets", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 10}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 10}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 11}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 11}))
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 11}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 11}}}
|
||||||
_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
|
_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
@ -687,8 +691,8 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
Context("probe packets", func() {
|
Context("probe packets", func() {
|
||||||
It("queues a probe packet", func() {
|
It("queues a probe packet", func() {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 10}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 10}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 11}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 11}))
|
||||||
queued := handler.QueueProbePacket(protocol.Encryption1RTT)
|
queued := handler.QueueProbePacket(protocol.Encryption1RTT)
|
||||||
Expect(queued).To(BeTrue())
|
Expect(queued).To(BeTrue())
|
||||||
Expect(lostPackets).To(Equal([]protocol.PacketNumber{10}))
|
Expect(lostPackets).To(Equal([]protocol.PacketNumber{10}))
|
||||||
|
@ -703,7 +707,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
handler.peerAddressValidated = true
|
handler.peerAddressValidated = true
|
||||||
handler.SetHandshakeConfirmed()
|
handler.SetHandshakeConfirmed()
|
||||||
sendTime := time.Now().Add(-time.Hour)
|
sendTime := time.Now().Add(-time.Hour)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, SendTime: sendTime}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: sendTime}))
|
||||||
timeout := handler.GetLossDetectionTimeout().Sub(sendTime)
|
timeout := handler.GetLossDetectionTimeout().Sub(sendTime)
|
||||||
Expect(handler.GetLossDetectionTimeout().Sub(sendTime)).To(Equal(timeout))
|
Expect(handler.GetLossDetectionTimeout().Sub(sendTime)).To(Equal(timeout))
|
||||||
handler.ptoCount = 1
|
handler.ptoCount = 1
|
||||||
|
@ -726,8 +730,8 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
handler.SetHandshakeConfirmed()
|
handler.SetHandshakeConfirmed()
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, SendTime: now.Add(-time.Minute)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: now.Add(-time.Minute)}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2, SendTime: now.Add(-time.Minute)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: now.Add(-time.Minute)}))
|
||||||
handler.appDataPackets.pns.(*skippingPacketNumberGenerator).next = 3
|
handler.appDataPackets.pns.(*skippingPacketNumberGenerator).next = 3
|
||||||
Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", now.Add(-time.Minute), time.Second))
|
Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", now.Add(-time.Minute), time.Second))
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
||||||
|
@ -751,12 +755,12 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
sendTimeHandshake := now.Add(-2 * time.Minute)
|
sendTimeHandshake := now.Add(-2 * time.Minute)
|
||||||
sendTimeAppData := now.Add(-time.Minute)
|
sendTimeAppData := now.Add(-time.Minute)
|
||||||
|
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: 1,
|
PacketNumber: 1,
|
||||||
EncryptionLevel: protocol.EncryptionHandshake,
|
EncryptionLevel: protocol.EncryptionHandshake,
|
||||||
SendTime: sendTimeHandshake,
|
SendTime: sendTimeHandshake,
|
||||||
}))
|
}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: 2,
|
PacketNumber: 2,
|
||||||
SendTime: sendTimeAppData,
|
SendTime: sendTimeAppData,
|
||||||
}))
|
}))
|
||||||
|
@ -778,7 +782,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
handler.SetHandshakeConfirmed()
|
handler.SetHandshakeConfirmed()
|
||||||
var lostPackets []protocol.PacketNumber
|
var lostPackets []protocol.PacketNumber
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT),
|
PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT),
|
||||||
SendTime: time.Now().Add(-time.Hour),
|
SendTime: time.Now().Add(-time.Hour),
|
||||||
Frames: []Frame{
|
Frames: []Frame{
|
||||||
|
@ -790,36 +794,36 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
}))
|
}))
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
||||||
Expect(handler.SendMode(time.Now())).ToNot(Equal(SendPTOAppData))
|
Expect(handler.SendMode(time.Now())).ToNot(Equal(SendPTOAppData))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("only counts ack-eliciting packets as probe packets", func() {
|
It("only counts ack-eliciting packets as probe packets", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
handler.SetHandshakeConfirmed()
|
handler.SetHandshakeConfirmed()
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT),
|
PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT),
|
||||||
SendTime: time.Now().Add(-time.Hour),
|
SendTime: time.Now().Add(-time.Hour),
|
||||||
}))
|
}))
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
||||||
for i := 0; i < 30; i++ {
|
for i := 0; i < 30; i++ {
|
||||||
handler.SentPacket(nonAckElicitingPacket(&Packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
sentPacket(nonAckElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
||||||
}
|
}
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
||||||
Expect(handler.SendMode(time.Now())).ToNot(Equal(SendPTOAppData))
|
Expect(handler.SendMode(time.Now())).ToNot(Equal(SendPTOAppData))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("gets two probe packets if PTO expires", func() {
|
It("gets two probe packets if PTO expires", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
handler.SetHandshakeConfirmed()
|
handler.SetHandshakeConfirmed()
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
||||||
|
|
||||||
updateRTT(time.Hour)
|
updateRTT(time.Hour)
|
||||||
Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue())
|
Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue())
|
||||||
|
@ -827,40 +831,40 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed()) // TLP
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed()) // TLP
|
||||||
Expect(handler.ptoCount).To(BeEquivalentTo(1))
|
Expect(handler.ptoCount).To(BeEquivalentTo(1))
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
||||||
|
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed()) // PTO
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed()) // PTO
|
||||||
Expect(handler.ptoCount).To(BeEquivalentTo(2))
|
Expect(handler.ptoCount).To(BeEquivalentTo(2))
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
||||||
|
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("gets two probe packets if PTO expires, for Handshake packets", func() {
|
It("gets two probe packets if PTO expires, for Handshake packets", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 1}))
|
sentPacket(initialPacket(&packet{PacketNumber: 1}))
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 2}))
|
sentPacket(initialPacket(&packet{PacketNumber: 2}))
|
||||||
|
|
||||||
updateRTT(time.Hour)
|
updateRTT(time.Hour)
|
||||||
Expect(handler.initialPackets.lossTime.IsZero()).To(BeTrue())
|
Expect(handler.initialPackets.lossTime.IsZero()).To(BeTrue())
|
||||||
|
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 3}))
|
sentPacket(initialPacket(&packet{PacketNumber: 3}))
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 4}))
|
sentPacket(initialPacket(&packet{PacketNumber: 4}))
|
||||||
|
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("doesn't send 1-RTT probe packets before the handshake completes", func() {
|
It("doesn't send 1-RTT probe packets before the handshake completes", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)}))
|
||||||
updateRTT(time.Hour)
|
updateRTT(time.Hour)
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
||||||
Expect(handler.GetLossDetectionTimeout()).To(BeZero())
|
Expect(handler.GetLossDetectionTimeout()).To(BeZero())
|
||||||
|
@ -875,7 +879,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
handler.SetHandshakeConfirmed()
|
handler.SetHandshakeConfirmed()
|
||||||
pn := handler.PopPacketNumber(protocol.Encryption1RTT)
|
pn := handler.PopPacketNumber(protocol.Encryption1RTT)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: pn, SendTime: time.Now().Add(-time.Hour)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: pn, SendTime: time.Now().Add(-time.Hour)}))
|
||||||
updateRTT(time.Second)
|
updateRTT(time.Second)
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData))
|
||||||
|
@ -887,7 +891,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
It("handles ACKs for the original packet", func() {
|
It("handles ACKs for the original packet", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT),
|
PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT),
|
||||||
SendTime: time.Now().Add(-time.Hour),
|
SendTime: time.Now().Add(-time.Hour),
|
||||||
}))
|
}))
|
||||||
|
@ -900,7 +904,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
handler.SetHandshakeConfirmed()
|
handler.SetHandshakeConfirmed()
|
||||||
updateRTT(time.Second)
|
updateRTT(time.Second)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 5, SendTime: time.Now(), IsPathMTUProbePacket: true}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 5, SendTime: time.Now(), IsPathMTUProbePacket: true}))
|
||||||
Expect(handler.GetLossDetectionTimeout()).To(BeZero())
|
Expect(handler.GetLossDetectionTimeout()).To(BeZero())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -910,7 +914,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
handler.ReceivedPacket(protocol.EncryptionInitial) // receiving an Initial packet doesn't validate the client's address
|
handler.ReceivedPacket(protocol.EncryptionInitial) // receiving an Initial packet doesn't validate the client's address
|
||||||
handler.ReceivedBytes(200)
|
handler.ReceivedBytes(200)
|
||||||
handler.SentPacket(&Packet{
|
sentPacket(&packet{
|
||||||
PacketNumber: 1,
|
PacketNumber: 1,
|
||||||
Length: 599,
|
Length: 599,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
|
@ -918,7 +922,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
SendTime: now,
|
SendTime: now,
|
||||||
})
|
})
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
||||||
handler.SentPacket(&Packet{
|
sentPacket(&packet{
|
||||||
PacketNumber: 2,
|
PacketNumber: 2,
|
||||||
Length: 1,
|
Length: 1,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
|
@ -930,7 +934,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
It("cancels the loss detection timer when it is amplification limited, and resets it when becoming unblocked", func() {
|
It("cancels the loss detection timer when it is amplification limited, and resets it when becoming unblocked", func() {
|
||||||
handler.ReceivedBytes(300)
|
handler.ReceivedBytes(300)
|
||||||
handler.SentPacket(&Packet{
|
sentPacket(&packet{
|
||||||
PacketNumber: 1,
|
PacketNumber: 1,
|
||||||
Length: 900,
|
Length: 900,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
|
@ -946,7 +950,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
It("resets the loss detection timer when the client's address is validated", func() {
|
It("resets the loss detection timer when the client's address is validated", func() {
|
||||||
handler.ReceivedBytes(300)
|
handler.ReceivedBytes(300)
|
||||||
handler.SentPacket(&Packet{
|
sentPacket(&packet{
|
||||||
PacketNumber: 1,
|
PacketNumber: 1,
|
||||||
Length: 900,
|
Length: 900,
|
||||||
EncryptionLevel: protocol.EncryptionHandshake,
|
EncryptionLevel: protocol.EncryptionHandshake,
|
||||||
|
@ -962,9 +966,9 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
It("cancels the loss detection alarm when all Handshake packets are acknowledged", func() {
|
It("cancels the loss detection alarm when all Handshake packets are acknowledged", func() {
|
||||||
t := time.Now().Add(-time.Second)
|
t := time.Now().Add(-time.Second)
|
||||||
handler.ReceivedBytes(99999)
|
handler.ReceivedBytes(99999)
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2, SendTime: t}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: t}))
|
||||||
handler.SentPacket(handshakePacket(&Packet{PacketNumber: 3, SendTime: t}))
|
sentPacket(handshakePacket(&packet{PacketNumber: 3, SendTime: t}))
|
||||||
handler.SentPacket(handshakePacket(&Packet{PacketNumber: 4, SendTime: t}))
|
sentPacket(handshakePacket(&packet{PacketNumber: 4, SendTime: t}))
|
||||||
Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
|
Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
|
||||||
handler.ReceivedAck(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 3, Largest: 4}}}, protocol.EncryptionHandshake, time.Now())
|
handler.ReceivedAck(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 3, Largest: 4}}}, protocol.EncryptionHandshake, time.Now())
|
||||||
Expect(handler.GetLossDetectionTimeout()).To(BeZero())
|
Expect(handler.GetLossDetectionTimeout()).To(BeZero())
|
||||||
|
@ -980,7 +984,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
It("do not limits the window", func() {
|
It("do not limits the window", func() {
|
||||||
handler.ReceivedBytes(0)
|
handler.ReceivedBytes(0)
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
||||||
handler.SentPacket(&Packet{
|
sentPacket(&packet{
|
||||||
PacketNumber: 1,
|
PacketNumber: 1,
|
||||||
Length: 900,
|
Length: 900,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
|
@ -997,7 +1001,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("sends an Initial packet to unblock the server", func() {
|
It("sends an Initial packet to unblock the server", func() {
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 1}))
|
sentPacket(initialPacket(&packet{PacketNumber: 1}))
|
||||||
_, err := handler.ReceivedAck(
|
_, err := handler.ReceivedAck(
|
||||||
&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
|
&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
|
||||||
protocol.EncryptionInitial,
|
protocol.EncryptionInitial,
|
||||||
|
@ -1011,12 +1015,12 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
|
||||||
|
|
||||||
// send a single packet to unblock the server
|
// send a single packet to unblock the server
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 2}))
|
sentPacket(initialPacket(&packet{PacketNumber: 2}))
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
||||||
|
|
||||||
// Now receive an ACK for a Handshake packet.
|
// Now receive an ACK for a Handshake packet.
|
||||||
// This tells the client that the server completed address validation.
|
// This tells the client that the server completed address validation.
|
||||||
handler.SentPacket(handshakePacket(&Packet{PacketNumber: 1}))
|
sentPacket(handshakePacket(&packet{PacketNumber: 1}))
|
||||||
_, err = handler.ReceivedAck(
|
_, err = handler.ReceivedAck(
|
||||||
&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
|
&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
|
||||||
protocol.EncryptionHandshake,
|
protocol.EncryptionHandshake,
|
||||||
|
@ -1028,7 +1032,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("sends a Handshake packet to unblock the server, if Initial keys were already dropped", func() {
|
It("sends a Handshake packet to unblock the server, if Initial keys were already dropped", func() {
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 1}))
|
sentPacket(initialPacket(&packet{PacketNumber: 1}))
|
||||||
_, err := handler.ReceivedAck(
|
_, err := handler.ReceivedAck(
|
||||||
&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
|
&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
|
||||||
protocol.EncryptionInitial,
|
protocol.EncryptionInitial,
|
||||||
|
@ -1036,7 +1040,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
)
|
)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
handler.SentPacket(handshakePacketNonAckEliciting(&Packet{PacketNumber: 1})) // also drops Initial packets
|
sentPacket(handshakePacketNonAckEliciting(&packet{PacketNumber: 1})) // also drops Initial packets
|
||||||
Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
|
Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake))
|
||||||
|
@ -1048,12 +1052,12 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
time.Now(),
|
time.Now(),
|
||||||
)
|
)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
handler.SentPacket(handshakePacketNonAckEliciting(&Packet{PacketNumber: 2}))
|
sentPacket(handshakePacketNonAckEliciting(&packet{PacketNumber: 2}))
|
||||||
Expect(handler.GetLossDetectionTimeout()).To(BeZero())
|
Expect(handler.GetLossDetectionTimeout()).To(BeZero())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("doesn't send a packet to unblock the server after handshake confirmation, even if no Handshake ACK was received", func() {
|
It("doesn't send a packet to unblock the server after handshake confirmation, even if no Handshake ACK was received", func() {
|
||||||
handler.SentPacket(handshakePacket(&Packet{PacketNumber: 1}))
|
sentPacket(handshakePacket(&packet{PacketNumber: 1}))
|
||||||
Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
|
Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake))
|
||||||
|
@ -1063,14 +1067,14 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("correctly sets the timer after the Initial packet number space has been dropped", func() {
|
It("correctly sets the timer after the Initial packet number space has been dropped", func() {
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 1, SendTime: time.Now().Add(-19 * time.Second)}))
|
sentPacket(initialPacket(&packet{PacketNumber: 1, SendTime: time.Now().Add(-19 * time.Second)}))
|
||||||
_, err := handler.ReceivedAck(
|
_, err := handler.ReceivedAck(
|
||||||
&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
|
&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}},
|
||||||
protocol.EncryptionInitial,
|
protocol.EncryptionInitial,
|
||||||
time.Now(),
|
time.Now(),
|
||||||
)
|
)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
handler.SentPacket(handshakePacketNonAckEliciting(&Packet{PacketNumber: 1, SendTime: time.Now()}))
|
sentPacket(handshakePacketNonAckEliciting(&packet{PacketNumber: 1, SendTime: time.Now()}))
|
||||||
Expect(handler.initialPackets).To(BeNil())
|
Expect(handler.initialPackets).To(BeNil())
|
||||||
|
|
||||||
pto := handler.rttStats.PTO(false)
|
pto := handler.rttStats.PTO(false)
|
||||||
|
@ -1082,8 +1086,8 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
It("doesn't reset the PTO count when receiving an ACK", func() {
|
It("doesn't reset the PTO count when receiving an ACK", func() {
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 1, SendTime: now.Add(-time.Minute)}))
|
sentPacket(initialPacket(&packet{PacketNumber: 1, SendTime: now.Add(-time.Minute)}))
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 2, SendTime: now.Add(-time.Minute)}))
|
sentPacket(initialPacket(&packet{PacketNumber: 2, SendTime: now.Add(-time.Minute)}))
|
||||||
Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", now.Add(-time.Minute), time.Second))
|
Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", now.Add(-time.Minute), time.Second))
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
|
||||||
|
@ -1098,7 +1102,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
It("declares packet below the packet loss threshold as lost", func() {
|
It("declares packet below the packet loss threshold as lost", func() {
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
for i := protocol.PacketNumber(1); i <= 6; i++ {
|
for i := protocol.PacketNumber(1); i <= 6; i++ {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: i}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: i}))
|
||||||
}
|
}
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 6, Largest: 6}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 6, Largest: 6}}}
|
||||||
_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, now)
|
_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, now)
|
||||||
|
@ -1111,8 +1115,8 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
Context("Delay-based loss detection", func() {
|
Context("Delay-based loss detection", func() {
|
||||||
It("immediately detects old packets as lost when receiving an ACK", func() {
|
It("immediately detects old packets as lost when receiving an ACK", func() {
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, SendTime: now.Add(-time.Hour)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: now.Add(-time.Hour)}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2, SendTime: now.Add(-time.Second)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: now.Add(-time.Second)}))
|
||||||
Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue())
|
Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue())
|
||||||
|
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
||||||
|
@ -1127,9 +1131,9 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
handler.handshakeConfirmed = true
|
handler.handshakeConfirmed = true
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 1, SendTime: now.Add(-2 * time.Second)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: now.Add(-2 * time.Second)}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2, SendTime: now.Add(-2 * time.Second)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: now.Add(-2 * time.Second)}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 3, SendTime: now}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 3, SendTime: now}))
|
||||||
Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue())
|
Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue())
|
||||||
|
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
||||||
|
@ -1150,9 +1154,9 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
It("sets the early retransmit alarm for crypto packets", func() {
|
It("sets the early retransmit alarm for crypto packets", func() {
|
||||||
handler.ReceivedBytes(1000)
|
handler.ReceivedBytes(1000)
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 1, SendTime: now.Add(-2 * time.Second)}))
|
sentPacket(initialPacket(&packet{PacketNumber: 1, SendTime: now.Add(-2 * time.Second)}))
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 2, SendTime: now.Add(-2 * time.Second)}))
|
sentPacket(initialPacket(&packet{PacketNumber: 2, SendTime: now.Add(-2 * time.Second)}))
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 3, SendTime: now}))
|
sentPacket(initialPacket(&packet{PacketNumber: 3, SendTime: now}))
|
||||||
Expect(handler.initialPackets.lossTime.IsZero()).To(BeTrue())
|
Expect(handler.initialPackets.lossTime.IsZero()).To(BeTrue())
|
||||||
|
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
||||||
|
@ -1173,7 +1177,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
It("sets the early retransmit alarm for Path MTU probe packets", func() {
|
It("sets the early retransmit alarm for Path MTU probe packets", func() {
|
||||||
var mtuPacketDeclaredLost bool
|
var mtuPacketDeclaredLost bool
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: 1,
|
PacketNumber: 1,
|
||||||
SendTime: now.Add(-3 * time.Second),
|
SendTime: now.Add(-3 * time.Second),
|
||||||
IsPathMTUProbePacket: true,
|
IsPathMTUProbePacket: true,
|
||||||
|
@ -1184,7 +1188,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: 2, SendTime: now.Add(-3 * time.Second)}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: now.Add(-3 * time.Second)}))
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}}
|
||||||
_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, now.Add(-time.Second))
|
_, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, now.Add(-time.Second))
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
@ -1198,7 +1202,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
Context("crypto packets", func() {
|
Context("crypto packets", func() {
|
||||||
It("rejects an ACK that acks packets with a higher encryption level", func() {
|
It("rejects an ACK that acks packets with a higher encryption level", func() {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: 13,
|
PacketNumber: 13,
|
||||||
EncryptionLevel: protocol.Encryption1RTT,
|
EncryptionLevel: protocol.Encryption1RTT,
|
||||||
}))
|
}))
|
||||||
|
@ -1212,13 +1216,13 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
It("deletes Initial packets, as a server", func() {
|
It("deletes Initial packets, as a server", func() {
|
||||||
for i := protocol.PacketNumber(0); i < 6; i++ {
|
for i := protocol.PacketNumber(0); i < 6; i++ {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: i,
|
PacketNumber: i,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
for i := protocol.PacketNumber(0); i < 10; i++ {
|
for i := protocol.PacketNumber(0); i < 10; i++ {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: i,
|
PacketNumber: i,
|
||||||
EncryptionLevel: protocol.EncryptionHandshake,
|
EncryptionLevel: protocol.EncryptionHandshake,
|
||||||
}))
|
}))
|
||||||
|
@ -1236,7 +1240,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
It("deletes Initials, as a client", func() {
|
It("deletes Initials, as a client", func() {
|
||||||
for i := 0; i < 6; i++ {
|
for i := 0; i < 6; i++ {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: handler.PopPacketNumber(protocol.EncryptionInitial),
|
PacketNumber: handler.PopPacketNumber(protocol.EncryptionInitial),
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
Length: 1,
|
Length: 1,
|
||||||
|
@ -1246,14 +1250,14 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
handler.DropPackets(protocol.EncryptionInitial)
|
handler.DropPackets(protocol.EncryptionInitial)
|
||||||
// DropPackets should be ignored for clients and the Initial packet number space.
|
// DropPackets should be ignored for clients and the Initial packet number space.
|
||||||
// It has to be possible to send another Initial packets after this function was called.
|
// It has to be possible to send another Initial packets after this function was called.
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: handler.PopPacketNumber(protocol.EncryptionInitial),
|
PacketNumber: handler.PopPacketNumber(protocol.EncryptionInitial),
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
Length: 1,
|
Length: 1,
|
||||||
}))
|
}))
|
||||||
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(7)))
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(7)))
|
||||||
// Sending a Handshake packet triggers dropping of Initials.
|
// Sending a Handshake packet triggers dropping of Initials.
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: handler.PopPacketNumber(protocol.EncryptionHandshake),
|
PacketNumber: handler.PopPacketNumber(protocol.EncryptionHandshake),
|
||||||
EncryptionLevel: protocol.EncryptionHandshake,
|
EncryptionLevel: protocol.EncryptionHandshake,
|
||||||
}))
|
}))
|
||||||
|
@ -1266,13 +1270,13 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
It("deletes Handshake packets", func() {
|
It("deletes Handshake packets", func() {
|
||||||
for i := protocol.PacketNumber(0); i < 6; i++ {
|
for i := protocol.PacketNumber(0); i < 6; i++ {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: i,
|
PacketNumber: i,
|
||||||
EncryptionLevel: protocol.EncryptionHandshake,
|
EncryptionLevel: protocol.EncryptionHandshake,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
for i := protocol.PacketNumber(0); i < 10; i++ {
|
for i := protocol.PacketNumber(0); i < 10; i++ {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: i,
|
PacketNumber: i,
|
||||||
EncryptionLevel: protocol.Encryption1RTT,
|
EncryptionLevel: protocol.Encryption1RTT,
|
||||||
}))
|
}))
|
||||||
|
@ -1290,13 +1294,13 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
handler.appDataPackets.history.SkippedPacket(3)
|
handler.appDataPackets.history.SkippedPacket(3)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: i,
|
PacketNumber: i,
|
||||||
EncryptionLevel: protocol.Encryption0RTT,
|
EncryptionLevel: protocol.Encryption0RTT,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
for i := protocol.PacketNumber(6); i < 12; i++ {
|
for i := protocol.PacketNumber(6); i < 12; i++ {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{PacketNumber: i}))
|
sentPacket(ackElicitingPacket(&packet{PacketNumber: i}))
|
||||||
}
|
}
|
||||||
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(11)))
|
Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(11)))
|
||||||
handler.DropPackets(protocol.Encryption0RTT)
|
handler.DropPackets(protocol.Encryption0RTT)
|
||||||
|
@ -1307,8 +1311,8 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
It("cancels the PTO when dropping a packet number space", func() {
|
It("cancels the PTO when dropping a packet number space", func() {
|
||||||
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
handler.ReceivedPacket(protocol.EncryptionHandshake)
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
handler.SentPacket(handshakePacket(&Packet{PacketNumber: 1, SendTime: now.Add(-time.Minute)}))
|
sentPacket(handshakePacket(&packet{PacketNumber: 1, SendTime: now.Add(-time.Minute)}))
|
||||||
handler.SentPacket(handshakePacket(&Packet{PacketNumber: 2, SendTime: now.Add(-time.Minute)}))
|
sentPacket(handshakePacket(&packet{PacketNumber: 2, SendTime: now.Add(-time.Minute)}))
|
||||||
Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", now.Add(-time.Minute), time.Second))
|
Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", now.Add(-time.Minute), time.Second))
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake))
|
||||||
|
@ -1350,7 +1354,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("queues outstanding packets for retransmission, cancels alarms and resets PTO count when receiving a Retry", func() {
|
It("queues outstanding packets for retransmission, cancels alarms and resets PTO count when receiving a Retry", func() {
|
||||||
handler.SentPacket(initialPacket(&Packet{PacketNumber: 42}))
|
sentPacket(initialPacket(&packet{PacketNumber: 42}))
|
||||||
Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
|
Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero())
|
||||||
Expect(handler.bytesInFlight).ToNot(BeZero())
|
Expect(handler.bytesInFlight).ToNot(BeZero())
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendAny))
|
||||||
|
@ -1365,7 +1369,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
|
|
||||||
It("queues outstanding frames for retransmission and cancels alarms when receiving a Retry", func() {
|
It("queues outstanding frames for retransmission and cancels alarms when receiving a Retry", func() {
|
||||||
var lostInitial, lost0RTT bool
|
var lostInitial, lost0RTT bool
|
||||||
handler.SentPacket(&Packet{
|
sentPacket(&packet{
|
||||||
PacketNumber: 13,
|
PacketNumber: 13,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
Frames: []Frame{
|
Frames: []Frame{
|
||||||
|
@ -1377,7 +1381,7 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
Length: 100,
|
Length: 100,
|
||||||
})
|
})
|
||||||
pn := handler.PopPacketNumber(protocol.Encryption0RTT)
|
pn := handler.PopPacketNumber(protocol.Encryption0RTT)
|
||||||
handler.SentPacket(&Packet{
|
sentPacket(&packet{
|
||||||
PacketNumber: pn,
|
PacketNumber: pn,
|
||||||
EncryptionLevel: protocol.Encryption0RTT,
|
EncryptionLevel: protocol.Encryption0RTT,
|
||||||
Frames: []Frame{
|
Frames: []Frame{
|
||||||
|
@ -1400,12 +1404,12 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("uses a Retry for an RTT estimate, if it was not retransmitted", func() {
|
It("uses a Retry for an RTT estimate, if it was not retransmitted", func() {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: 42,
|
PacketNumber: 42,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
SendTime: time.Now().Add(-500 * time.Millisecond),
|
SendTime: time.Now().Add(-500 * time.Millisecond),
|
||||||
}))
|
}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: 43,
|
PacketNumber: 43,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
SendTime: time.Now().Add(-10 * time.Millisecond),
|
SendTime: time.Now().Add(-10 * time.Millisecond),
|
||||||
|
@ -1415,12 +1419,12 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("uses a Retry for an RTT estimate, but doesn't set the RTT to a value lower than 5ms", func() {
|
It("uses a Retry for an RTT estimate, but doesn't set the RTT to a value lower than 5ms", func() {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: 42,
|
PacketNumber: 42,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
SendTime: time.Now().Add(-500 * time.Microsecond),
|
SendTime: time.Now().Add(-500 * time.Microsecond),
|
||||||
}))
|
}))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: 43,
|
PacketNumber: 43,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
SendTime: time.Now().Add(-10 * time.Microsecond),
|
SendTime: time.Now().Add(-10 * time.Microsecond),
|
||||||
|
@ -1430,14 +1434,14 @@ var _ = Describe("SentPacketHandler", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("doesn't use a Retry for an RTT estimate, if it was not retransmitted", func() {
|
It("doesn't use a Retry for an RTT estimate, if it was not retransmitted", func() {
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: 42,
|
PacketNumber: 42,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
SendTime: time.Now().Add(-800 * time.Millisecond),
|
SendTime: time.Now().Add(-800 * time.Millisecond),
|
||||||
}))
|
}))
|
||||||
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
||||||
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
|
Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial))
|
||||||
handler.SentPacket(ackElicitingPacket(&Packet{
|
sentPacket(ackElicitingPacket(&packet{
|
||||||
PacketNumber: 43,
|
PacketNumber: 43,
|
||||||
EncryptionLevel: protocol.EncryptionInitial,
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
SendTime: time.Now().Add(-100 * time.Millisecond),
|
SendTime: time.Now().Add(-100 * time.Millisecond),
|
||||||
|
|
|
@ -7,7 +7,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type sentPacketHistory struct {
|
type sentPacketHistory struct {
|
||||||
packets []*Packet
|
packets []*packet
|
||||||
|
|
||||||
numOutstanding int
|
numOutstanding int
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ type sentPacketHistory struct {
|
||||||
|
|
||||||
func newSentPacketHistory() *sentPacketHistory {
|
func newSentPacketHistory() *sentPacketHistory {
|
||||||
return &sentPacketHistory{
|
return &sentPacketHistory{
|
||||||
packets: make([]*Packet, 0, 32),
|
packets: make([]*packet, 0, 32),
|
||||||
highestPacketNumber: protocol.InvalidPacketNumber,
|
highestPacketNumber: protocol.InvalidPacketNumber,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ func (h *sentPacketHistory) checkSequentialPacketNumberUse(pn protocol.PacketNum
|
||||||
func (h *sentPacketHistory) SkippedPacket(pn protocol.PacketNumber) {
|
func (h *sentPacketHistory) SkippedPacket(pn protocol.PacketNumber) {
|
||||||
h.checkSequentialPacketNumberUse(pn)
|
h.checkSequentialPacketNumberUse(pn)
|
||||||
h.highestPacketNumber = pn
|
h.highestPacketNumber = pn
|
||||||
h.packets = append(h.packets, &Packet{
|
h.packets = append(h.packets, &packet{
|
||||||
PacketNumber: pn,
|
PacketNumber: pn,
|
||||||
skippedPacket: true,
|
skippedPacket: true,
|
||||||
})
|
})
|
||||||
|
@ -46,7 +46,7 @@ func (h *sentPacketHistory) SentNonAckElicitingPacket(pn protocol.PacketNumber)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *sentPacketHistory) SentAckElicitingPacket(p *Packet) {
|
func (h *sentPacketHistory) SentAckElicitingPacket(p *packet) {
|
||||||
h.checkSequentialPacketNumberUse(p.PacketNumber)
|
h.checkSequentialPacketNumberUse(p.PacketNumber)
|
||||||
h.highestPacketNumber = p.PacketNumber
|
h.highestPacketNumber = p.PacketNumber
|
||||||
h.packets = append(h.packets, p)
|
h.packets = append(h.packets, p)
|
||||||
|
@ -56,7 +56,7 @@ func (h *sentPacketHistory) SentAckElicitingPacket(p *Packet) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterate iterates through all packets.
|
// Iterate iterates through all packets.
|
||||||
func (h *sentPacketHistory) Iterate(cb func(*Packet) (cont bool, err error)) error {
|
func (h *sentPacketHistory) Iterate(cb func(*packet) (cont bool, err error)) error {
|
||||||
for _, p := range h.packets {
|
for _, p := range h.packets {
|
||||||
if p == nil {
|
if p == nil {
|
||||||
continue
|
continue
|
||||||
|
@ -73,7 +73,7 @@ func (h *sentPacketHistory) Iterate(cb func(*Packet) (cont bool, err error)) err
|
||||||
}
|
}
|
||||||
|
|
||||||
// FirstOutstanding returns the first outstanding packet.
|
// FirstOutstanding returns the first outstanding packet.
|
||||||
func (h *sentPacketHistory) FirstOutstanding() *Packet {
|
func (h *sentPacketHistory) FirstOutstanding() *packet {
|
||||||
if !h.HasOutstandingPackets() {
|
if !h.HasOutstandingPackets() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,9 +46,9 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("saves sent packets", func() {
|
It("saves sent packets", func() {
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 0})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 0})
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 1})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 1})
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 2})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 2})
|
||||||
expectInHistory([]protocol.PacketNumber{0, 1, 2})
|
expectInHistory([]protocol.PacketNumber{0, 1, 2})
|
||||||
expectSkippedInHistory(nil)
|
expectSkippedInHistory(nil)
|
||||||
})
|
})
|
||||||
|
@ -56,34 +56,34 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
It("saves non-ack-eliciting packets", func() {
|
It("saves non-ack-eliciting packets", func() {
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
hist.SentNonAckElicitingPacket(0)
|
hist.SentNonAckElicitingPacket(0)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 1, SendTime: now})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 1, SendTime: now})
|
||||||
hist.SentNonAckElicitingPacket(2)
|
hist.SentNonAckElicitingPacket(2)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 3, SendTime: now})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 3, SendTime: now})
|
||||||
expectInHistory([]protocol.PacketNumber{1, 3})
|
expectInHistory([]protocol.PacketNumber{1, 3})
|
||||||
})
|
})
|
||||||
|
|
||||||
It("saves sent packets, with skipped packet number", func() {
|
It("saves sent packets, with skipped packet number", func() {
|
||||||
hist.SkippedPacket(0)
|
hist.SkippedPacket(0)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 1})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 1})
|
||||||
hist.SkippedPacket(2)
|
hist.SkippedPacket(2)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 3})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 3})
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 4})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 4})
|
||||||
expectInHistory([]protocol.PacketNumber{1, 3, 4})
|
expectInHistory([]protocol.PacketNumber{1, 3, 4})
|
||||||
expectSkippedInHistory([]protocol.PacketNumber{0, 2})
|
expectSkippedInHistory([]protocol.PacketNumber{0, 2})
|
||||||
})
|
})
|
||||||
|
|
||||||
It("doesn't save non-ack-eliciting packets", func() {
|
It("doesn't save non-ack-eliciting packets", func() {
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 1})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 1})
|
||||||
hist.SkippedPacket(2)
|
hist.SkippedPacket(2)
|
||||||
hist.SentNonAckElicitingPacket(3)
|
hist.SentNonAckElicitingPacket(3)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 4})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 4})
|
||||||
expectInHistory([]protocol.PacketNumber{1, 4})
|
expectInHistory([]protocol.PacketNumber{1, 4})
|
||||||
})
|
})
|
||||||
|
|
||||||
It("gets the length", func() {
|
It("gets the length", func() {
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 0})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 0})
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 1})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 1})
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 2})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 2})
|
||||||
Expect(hist.Len()).To(Equal(3))
|
Expect(hist.Len()).To(Equal(3))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -93,8 +93,8 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("gets the first outstanding packet", func() {
|
It("gets the first outstanding packet", func() {
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 2})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 2})
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 3})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 3})
|
||||||
front := hist.FirstOutstanding()
|
front := hist.FirstOutstanding()
|
||||||
Expect(front).ToNot(BeNil())
|
Expect(front).ToNot(BeNil())
|
||||||
Expect(front.PacketNumber).To(Equal(protocol.PacketNumber(2)))
|
Expect(front.PacketNumber).To(Equal(protocol.PacketNumber(2)))
|
||||||
|
@ -105,9 +105,9 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("doesn't regard path MTU packets as outstanding", func() {
|
It("doesn't regard path MTU packets as outstanding", func() {
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 2})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 2})
|
||||||
hist.SkippedPacket(3)
|
hist.SkippedPacket(3)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 4, IsPathMTUProbePacket: true})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 4, IsPathMTUProbePacket: true})
|
||||||
front := hist.FirstOutstanding()
|
front := hist.FirstOutstanding()
|
||||||
Expect(front).ToNot(BeNil())
|
Expect(front).ToNot(BeNil())
|
||||||
Expect(front.PacketNumber).To(Equal(protocol.PacketNumber(2)))
|
Expect(front.PacketNumber).To(Equal(protocol.PacketNumber(2)))
|
||||||
|
@ -115,20 +115,20 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("removes packets", func() {
|
It("removes packets", func() {
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 0})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 0})
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 1})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 1})
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 2})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 2})
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 3})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 3})
|
||||||
Expect(hist.Remove(2)).To(Succeed())
|
Expect(hist.Remove(2)).To(Succeed())
|
||||||
expectInHistory([]protocol.PacketNumber{0, 1, 3})
|
expectInHistory([]protocol.PacketNumber{0, 1, 3})
|
||||||
})
|
})
|
||||||
|
|
||||||
It("also removes skipped packets before the removed packet", func() {
|
It("also removes skipped packets before the removed packet", func() {
|
||||||
hist.SkippedPacket(0)
|
hist.SkippedPacket(0)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 1})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 1})
|
||||||
hist.SkippedPacket(2)
|
hist.SkippedPacket(2)
|
||||||
hist.SkippedPacket(3)
|
hist.SkippedPacket(3)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 4})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 4})
|
||||||
expectSkippedInHistory([]protocol.PacketNumber{0, 2, 3})
|
expectSkippedInHistory([]protocol.PacketNumber{0, 2, 3})
|
||||||
Expect(hist.Remove(4)).To(Succeed())
|
Expect(hist.Remove(4)).To(Succeed())
|
||||||
expectSkippedInHistory([]protocol.PacketNumber{0})
|
expectSkippedInHistory([]protocol.PacketNumber{0})
|
||||||
|
@ -139,57 +139,57 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("panics on non-sequential packet number use", func() {
|
It("panics on non-sequential packet number use", func() {
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 100})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 100})
|
||||||
Expect(func() { hist.SentAckElicitingPacket(&Packet{PacketNumber: 102}) }).To(Panic())
|
Expect(func() { hist.SentAckElicitingPacket(&packet{PacketNumber: 102}) }).To(Panic())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("removes and adds packets", func() {
|
It("removes and adds packets", func() {
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 0})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 0})
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 1})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 1})
|
||||||
hist.SkippedPacket(2)
|
hist.SkippedPacket(2)
|
||||||
hist.SkippedPacket(3)
|
hist.SkippedPacket(3)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 4})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 4})
|
||||||
hist.SkippedPacket(5)
|
hist.SkippedPacket(5)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 6})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 6})
|
||||||
Expect(hist.Remove(0)).To(Succeed())
|
Expect(hist.Remove(0)).To(Succeed())
|
||||||
Expect(hist.Remove(1)).To(Succeed())
|
Expect(hist.Remove(1)).To(Succeed())
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 7})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 7})
|
||||||
expectInHistory([]protocol.PacketNumber{4, 6, 7})
|
expectInHistory([]protocol.PacketNumber{4, 6, 7})
|
||||||
})
|
})
|
||||||
|
|
||||||
It("removes the last packet, then adds more", func() {
|
It("removes the last packet, then adds more", func() {
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 0})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 0})
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 1})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 1})
|
||||||
Expect(hist.Remove(0)).To(Succeed())
|
Expect(hist.Remove(0)).To(Succeed())
|
||||||
Expect(hist.Remove(1)).To(Succeed())
|
Expect(hist.Remove(1)).To(Succeed())
|
||||||
expectInHistory([]protocol.PacketNumber{})
|
expectInHistory([]protocol.PacketNumber{})
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 2})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 2})
|
||||||
expectInHistory([]protocol.PacketNumber{2})
|
expectInHistory([]protocol.PacketNumber{2})
|
||||||
Expect(hist.Remove(2)).To(Succeed())
|
Expect(hist.Remove(2)).To(Succeed())
|
||||||
expectInHistory(nil)
|
expectInHistory(nil)
|
||||||
})
|
})
|
||||||
|
|
||||||
It("errors when trying to remove a non existing packet", func() {
|
It("errors when trying to remove a non existing packet", func() {
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 1})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 1})
|
||||||
Expect(hist.Remove(2)).To(MatchError("packet 2 not found in sent packet history"))
|
Expect(hist.Remove(2)).To(MatchError("packet 2 not found in sent packet history"))
|
||||||
})
|
})
|
||||||
|
|
||||||
Context("iterating", func() {
|
Context("iterating", func() {
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
hist.SkippedPacket(0)
|
hist.SkippedPacket(0)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 1})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 1})
|
||||||
hist.SkippedPacket(2)
|
hist.SkippedPacket(2)
|
||||||
hist.SkippedPacket(3)
|
hist.SkippedPacket(3)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 4})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 4})
|
||||||
hist.SkippedPacket(5)
|
hist.SkippedPacket(5)
|
||||||
hist.SkippedPacket(6)
|
hist.SkippedPacket(6)
|
||||||
hist.SkippedPacket(7)
|
hist.SkippedPacket(7)
|
||||||
hist.SentAckElicitingPacket(&Packet{PacketNumber: 8})
|
hist.SentAckElicitingPacket(&packet{PacketNumber: 8})
|
||||||
})
|
})
|
||||||
|
|
||||||
It("iterates over all packets", func() {
|
It("iterates over all packets", func() {
|
||||||
var iterations []protocol.PacketNumber
|
var iterations []protocol.PacketNumber
|
||||||
Expect(hist.Iterate(func(p *Packet) (bool, error) {
|
Expect(hist.Iterate(func(p *packet) (bool, error) {
|
||||||
if p.skippedPacket {
|
if p.skippedPacket {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
@ -201,7 +201,7 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
|
|
||||||
It("also iterates over skipped packets", func() {
|
It("also iterates over skipped packets", func() {
|
||||||
var packets, skippedPackets, allPackets []protocol.PacketNumber
|
var packets, skippedPackets, allPackets []protocol.PacketNumber
|
||||||
Expect(hist.Iterate(func(p *Packet) (bool, error) {
|
Expect(hist.Iterate(func(p *packet) (bool, error) {
|
||||||
if p.skippedPacket {
|
if p.skippedPacket {
|
||||||
skippedPackets = append(skippedPackets, p.PacketNumber)
|
skippedPackets = append(skippedPackets, p.PacketNumber)
|
||||||
} else {
|
} else {
|
||||||
|
@ -217,7 +217,7 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
|
|
||||||
It("stops iterating", func() {
|
It("stops iterating", func() {
|
||||||
var iterations []protocol.PacketNumber
|
var iterations []protocol.PacketNumber
|
||||||
Expect(hist.Iterate(func(p *Packet) (bool, error) {
|
Expect(hist.Iterate(func(p *packet) (bool, error) {
|
||||||
if p.skippedPacket {
|
if p.skippedPacket {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
@ -230,7 +230,7 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
It("returns the error", func() {
|
It("returns the error", func() {
|
||||||
testErr := errors.New("test error")
|
testErr := errors.New("test error")
|
||||||
var iterations []protocol.PacketNumber
|
var iterations []protocol.PacketNumber
|
||||||
Expect(hist.Iterate(func(p *Packet) (bool, error) {
|
Expect(hist.Iterate(func(p *packet) (bool, error) {
|
||||||
if p.skippedPacket {
|
if p.skippedPacket {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
@ -246,7 +246,7 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
It("doesn't iterate over deleted packets", func() {
|
It("doesn't iterate over deleted packets", func() {
|
||||||
hist.Remove(4)
|
hist.Remove(4)
|
||||||
var iterations []protocol.PacketNumber
|
var iterations []protocol.PacketNumber
|
||||||
Expect(hist.Iterate(func(p *Packet) (bool, error) {
|
Expect(hist.Iterate(func(p *packet) (bool, error) {
|
||||||
if p.skippedPacket {
|
if p.skippedPacket {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
@ -261,7 +261,7 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
|
|
||||||
It("allows deletions", func() {
|
It("allows deletions", func() {
|
||||||
var iterations []protocol.PacketNumber
|
var iterations []protocol.PacketNumber
|
||||||
Expect(hist.Iterate(func(p *Packet) (bool, error) {
|
Expect(hist.Iterate(func(p *packet) (bool, error) {
|
||||||
if p.skippedPacket {
|
if p.skippedPacket {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
@ -279,12 +279,12 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
Context("outstanding packets", func() {
|
Context("outstanding packets", func() {
|
||||||
It("says if it has outstanding packets", func() {
|
It("says if it has outstanding packets", func() {
|
||||||
Expect(hist.HasOutstandingPackets()).To(BeFalse())
|
Expect(hist.HasOutstandingPackets()).To(BeFalse())
|
||||||
hist.SentAckElicitingPacket(&Packet{EncryptionLevel: protocol.Encryption1RTT, PacketNumber: 0})
|
hist.SentAckElicitingPacket(&packet{EncryptionLevel: protocol.Encryption1RTT, PacketNumber: 0})
|
||||||
Expect(hist.HasOutstandingPackets()).To(BeTrue())
|
Expect(hist.HasOutstandingPackets()).To(BeTrue())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("accounts for deleted packets", func() {
|
It("accounts for deleted packets", func() {
|
||||||
hist.SentAckElicitingPacket(&Packet{
|
hist.SentAckElicitingPacket(&packet{
|
||||||
PacketNumber: 10,
|
PacketNumber: 10,
|
||||||
EncryptionLevel: protocol.Encryption1RTT,
|
EncryptionLevel: protocol.Encryption1RTT,
|
||||||
})
|
})
|
||||||
|
@ -294,11 +294,11 @@ var _ = Describe("SentPacketHistory", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("counts the number of packets", func() {
|
It("counts the number of packets", func() {
|
||||||
hist.SentAckElicitingPacket(&Packet{
|
hist.SentAckElicitingPacket(&packet{
|
||||||
PacketNumber: 10,
|
PacketNumber: 10,
|
||||||
EncryptionLevel: protocol.Encryption1RTT,
|
EncryptionLevel: protocol.Encryption1RTT,
|
||||||
})
|
})
|
||||||
hist.SentAckElicitingPacket(&Packet{
|
hist.SentAckElicitingPacket(&packet{
|
||||||
PacketNumber: 11,
|
PacketNumber: 11,
|
||||||
EncryptionLevel: protocol.Encryption1RTT,
|
EncryptionLevel: protocol.Encryption1RTT,
|
||||||
})
|
})
|
||||||
|
|
|
@ -176,15 +176,15 @@ func (mr *MockSentPacketHandlerMockRecorder) SendMode(arg0 interface{}) *gomock.
|
||||||
}
|
}
|
||||||
|
|
||||||
// SentPacket mocks base method.
|
// SentPacket mocks base method.
|
||||||
func (m *MockSentPacketHandler) SentPacket(arg0 *ackhandler.Packet) {
|
func (m *MockSentPacketHandler) SentPacket(arg0 time.Time, arg1, arg2 protocol.PacketNumber, arg3 []ackhandler.StreamFrame, arg4 []ackhandler.Frame, arg5 protocol.EncryptionLevel, arg6 protocol.ByteCount, arg7 bool) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
m.ctrl.Call(m, "SentPacket", arg0)
|
m.ctrl.Call(m, "SentPacket", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SentPacket indicates an expected call of SentPacket.
|
// SentPacket indicates an expected call of SentPacket.
|
||||||
func (mr *MockSentPacketHandlerMockRecorder) SentPacket(arg0 interface{}) *gomock.Call {
|
func (mr *MockSentPacketHandlerMockRecorder) SentPacket(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SentPacket", reflect.TypeOf((*MockSentPacketHandler)(nil).SentPacket), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SentPacket", reflect.TypeOf((*MockSentPacketHandler)(nil).SentPacket), arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetHandshakeConfirmed mocks base method.
|
// SetHandshakeConfirmed mocks base method.
|
||||||
|
|
|
@ -6,7 +6,6 @@ package quic
|
||||||
|
|
||||||
import (
|
import (
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
time "time"
|
|
||||||
|
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
ackhandler "github.com/quic-go/quic-go/internal/ackhandler"
|
ackhandler "github.com/quic-go/quic-go/internal/ackhandler"
|
||||||
|
@ -38,39 +37,39 @@ func (m *MockPacker) EXPECT() *MockPackerMockRecorder {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AppendPacket mocks base method.
|
// AppendPacket mocks base method.
|
||||||
func (m *MockPacker) AppendPacket(arg0 *packetBuffer, arg1 protocol.ByteCount, arg2 time.Time, arg3 protocol.VersionNumber) (shortHeaderPacket, error) {
|
func (m *MockPacker) AppendPacket(arg0 *packetBuffer, arg1 protocol.ByteCount, arg2 protocol.VersionNumber) (shortHeaderPacket, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "AppendPacket", arg0, arg1, arg2, arg3)
|
ret := m.ctrl.Call(m, "AppendPacket", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(shortHeaderPacket)
|
ret0, _ := ret[0].(shortHeaderPacket)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
|
|
||||||
// AppendPacket indicates an expected call of AppendPacket.
|
// AppendPacket indicates an expected call of AppendPacket.
|
||||||
func (mr *MockPackerMockRecorder) AppendPacket(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
|
func (mr *MockPackerMockRecorder) AppendPacket(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendPacket", reflect.TypeOf((*MockPacker)(nil).AppendPacket), arg0, arg1, arg2, arg3)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendPacket", reflect.TypeOf((*MockPacker)(nil).AppendPacket), arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MaybePackProbePacket mocks base method.
|
// MaybePackProbePacket mocks base method.
|
||||||
func (m *MockPacker) MaybePackProbePacket(arg0 protocol.EncryptionLevel, arg1 protocol.ByteCount, arg2 time.Time, arg3 protocol.VersionNumber) (*coalescedPacket, error) {
|
func (m *MockPacker) MaybePackProbePacket(arg0 protocol.EncryptionLevel, arg1 protocol.ByteCount, arg2 protocol.VersionNumber) (*coalescedPacket, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "MaybePackProbePacket", arg0, arg1, arg2, arg3)
|
ret := m.ctrl.Call(m, "MaybePackProbePacket", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(*coalescedPacket)
|
ret0, _ := ret[0].(*coalescedPacket)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
|
|
||||||
// MaybePackProbePacket indicates an expected call of MaybePackProbePacket.
|
// MaybePackProbePacket indicates an expected call of MaybePackProbePacket.
|
||||||
func (mr *MockPackerMockRecorder) MaybePackProbePacket(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
|
func (mr *MockPackerMockRecorder) MaybePackProbePacket(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MaybePackProbePacket", reflect.TypeOf((*MockPacker)(nil).MaybePackProbePacket), arg0, arg1, arg2, arg3)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MaybePackProbePacket", reflect.TypeOf((*MockPacker)(nil).MaybePackProbePacket), arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackAckOnlyPacket mocks base method.
|
// PackAckOnlyPacket mocks base method.
|
||||||
func (m *MockPacker) PackAckOnlyPacket(arg0 protocol.ByteCount, arg1 time.Time, arg2 protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) {
|
func (m *MockPacker) PackAckOnlyPacket(arg0 protocol.ByteCount, arg1 protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "PackAckOnlyPacket", arg0, arg1, arg2)
|
ret := m.ctrl.Call(m, "PackAckOnlyPacket", arg0, arg1)
|
||||||
ret0, _ := ret[0].(shortHeaderPacket)
|
ret0, _ := ret[0].(shortHeaderPacket)
|
||||||
ret1, _ := ret[1].(*packetBuffer)
|
ret1, _ := ret[1].(*packetBuffer)
|
||||||
ret2, _ := ret[2].(error)
|
ret2, _ := ret[2].(error)
|
||||||
|
@ -78,60 +77,60 @@ func (m *MockPacker) PackAckOnlyPacket(arg0 protocol.ByteCount, arg1 time.Time,
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackAckOnlyPacket indicates an expected call of PackAckOnlyPacket.
|
// PackAckOnlyPacket indicates an expected call of PackAckOnlyPacket.
|
||||||
func (mr *MockPackerMockRecorder) PackAckOnlyPacket(arg0, arg1, arg2 interface{}) *gomock.Call {
|
func (mr *MockPackerMockRecorder) PackAckOnlyPacket(arg0, arg1 interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PackAckOnlyPacket", reflect.TypeOf((*MockPacker)(nil).PackAckOnlyPacket), arg0, arg1, arg2)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PackAckOnlyPacket", reflect.TypeOf((*MockPacker)(nil).PackAckOnlyPacket), arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackApplicationClose mocks base method.
|
// PackApplicationClose mocks base method.
|
||||||
func (m *MockPacker) PackApplicationClose(arg0 *qerr.ApplicationError, arg1 protocol.ByteCount, arg2 time.Time, arg3 protocol.VersionNumber) (*coalescedPacket, error) {
|
func (m *MockPacker) PackApplicationClose(arg0 *qerr.ApplicationError, arg1 protocol.ByteCount, arg2 protocol.VersionNumber) (*coalescedPacket, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "PackApplicationClose", arg0, arg1, arg2, arg3)
|
ret := m.ctrl.Call(m, "PackApplicationClose", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(*coalescedPacket)
|
ret0, _ := ret[0].(*coalescedPacket)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackApplicationClose indicates an expected call of PackApplicationClose.
|
// PackApplicationClose indicates an expected call of PackApplicationClose.
|
||||||
func (mr *MockPackerMockRecorder) PackApplicationClose(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
|
func (mr *MockPackerMockRecorder) PackApplicationClose(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PackApplicationClose", reflect.TypeOf((*MockPacker)(nil).PackApplicationClose), arg0, arg1, arg2, arg3)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PackApplicationClose", reflect.TypeOf((*MockPacker)(nil).PackApplicationClose), arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackCoalescedPacket mocks base method.
|
// PackCoalescedPacket mocks base method.
|
||||||
func (m *MockPacker) PackCoalescedPacket(arg0 bool, arg1 protocol.ByteCount, arg2 time.Time, arg3 protocol.VersionNumber) (*coalescedPacket, error) {
|
func (m *MockPacker) PackCoalescedPacket(arg0 bool, arg1 protocol.ByteCount, arg2 protocol.VersionNumber) (*coalescedPacket, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "PackCoalescedPacket", arg0, arg1, arg2, arg3)
|
ret := m.ctrl.Call(m, "PackCoalescedPacket", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(*coalescedPacket)
|
ret0, _ := ret[0].(*coalescedPacket)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackCoalescedPacket indicates an expected call of PackCoalescedPacket.
|
// PackCoalescedPacket indicates an expected call of PackCoalescedPacket.
|
||||||
func (mr *MockPackerMockRecorder) PackCoalescedPacket(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
|
func (mr *MockPackerMockRecorder) PackCoalescedPacket(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PackCoalescedPacket", reflect.TypeOf((*MockPacker)(nil).PackCoalescedPacket), arg0, arg1, arg2, arg3)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PackCoalescedPacket", reflect.TypeOf((*MockPacker)(nil).PackCoalescedPacket), arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackConnectionClose mocks base method.
|
// PackConnectionClose mocks base method.
|
||||||
func (m *MockPacker) PackConnectionClose(arg0 *qerr.TransportError, arg1 protocol.ByteCount, arg2 time.Time, arg3 protocol.VersionNumber) (*coalescedPacket, error) {
|
func (m *MockPacker) PackConnectionClose(arg0 *qerr.TransportError, arg1 protocol.ByteCount, arg2 protocol.VersionNumber) (*coalescedPacket, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "PackConnectionClose", arg0, arg1, arg2, arg3)
|
ret := m.ctrl.Call(m, "PackConnectionClose", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(*coalescedPacket)
|
ret0, _ := ret[0].(*coalescedPacket)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackConnectionClose indicates an expected call of PackConnectionClose.
|
// PackConnectionClose indicates an expected call of PackConnectionClose.
|
||||||
func (mr *MockPackerMockRecorder) PackConnectionClose(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
|
func (mr *MockPackerMockRecorder) PackConnectionClose(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PackConnectionClose", reflect.TypeOf((*MockPacker)(nil).PackConnectionClose), arg0, arg1, arg2, arg3)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PackConnectionClose", reflect.TypeOf((*MockPacker)(nil).PackConnectionClose), arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackMTUProbePacket mocks base method.
|
// PackMTUProbePacket mocks base method.
|
||||||
func (m *MockPacker) PackMTUProbePacket(arg0 ackhandler.Frame, arg1 protocol.ByteCount, arg2 time.Time, arg3 protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) {
|
func (m *MockPacker) PackMTUProbePacket(arg0 ackhandler.Frame, arg1 protocol.ByteCount, arg2 protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "PackMTUProbePacket", arg0, arg1, arg2, arg3)
|
ret := m.ctrl.Call(m, "PackMTUProbePacket", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(shortHeaderPacket)
|
ret0, _ := ret[0].(shortHeaderPacket)
|
||||||
ret1, _ := ret[1].(*packetBuffer)
|
ret1, _ := ret[1].(*packetBuffer)
|
||||||
ret2, _ := ret[2].(error)
|
ret2, _ := ret[2].(error)
|
||||||
|
@ -139,9 +138,9 @@ func (m *MockPacker) PackMTUProbePacket(arg0 ackhandler.Frame, arg1 protocol.Byt
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackMTUProbePacket indicates an expected call of PackMTUProbePacket.
|
// PackMTUProbePacket indicates an expected call of PackMTUProbePacket.
|
||||||
func (mr *MockPackerMockRecorder) PackMTUProbePacket(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
|
func (mr *MockPackerMockRecorder) PackMTUProbePacket(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PackMTUProbePacket", reflect.TypeOf((*MockPacker)(nil).PackMTUProbePacket), arg0, arg1, arg2, arg3)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PackMTUProbePacket", reflect.TypeOf((*MockPacker)(nil).PackMTUProbePacket), arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetToken mocks base method.
|
// SetToken mocks base method.
|
||||||
|
|
233
packet_packer.go
233
packet_packer.go
|
@ -3,7 +3,6 @@ package quic
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/quic-go/quic-go/internal/ackhandler"
|
"github.com/quic-go/quic-go/internal/ackhandler"
|
||||||
"github.com/quic-go/quic-go/internal/handshake"
|
"github.com/quic-go/quic-go/internal/handshake"
|
||||||
|
@ -15,13 +14,13 @@ import (
|
||||||
var errNothingToPack = errors.New("nothing to pack")
|
var errNothingToPack = errors.New("nothing to pack")
|
||||||
|
|
||||||
type packer interface {
|
type packer interface {
|
||||||
PackCoalescedPacket(onlyAck bool, maxPacketSize protocol.ByteCount, now time.Time, v protocol.VersionNumber) (*coalescedPacket, error)
|
PackCoalescedPacket(onlyAck bool, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (*coalescedPacket, error)
|
||||||
PackAckOnlyPacket(maxPacketSize protocol.ByteCount, now time.Time, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error)
|
PackAckOnlyPacket(maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error)
|
||||||
AppendPacket(buf *packetBuffer, maxPacketSize protocol.ByteCount, now time.Time, v protocol.VersionNumber) (shortHeaderPacket, error)
|
AppendPacket(buf *packetBuffer, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, error)
|
||||||
MaybePackProbePacket(protocol.EncryptionLevel, protocol.ByteCount, time.Time, protocol.VersionNumber) (*coalescedPacket, error)
|
MaybePackProbePacket(protocol.EncryptionLevel, protocol.ByteCount, protocol.VersionNumber) (*coalescedPacket, error)
|
||||||
PackConnectionClose(*qerr.TransportError, protocol.ByteCount, time.Time, protocol.VersionNumber) (*coalescedPacket, error)
|
PackConnectionClose(*qerr.TransportError, protocol.ByteCount, protocol.VersionNumber) (*coalescedPacket, error)
|
||||||
PackApplicationClose(*qerr.ApplicationError, protocol.ByteCount, time.Time, protocol.VersionNumber) (*coalescedPacket, error)
|
PackApplicationClose(*qerr.ApplicationError, protocol.ByteCount, protocol.VersionNumber) (*coalescedPacket, error)
|
||||||
PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount, now time.Time, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error)
|
PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error)
|
||||||
|
|
||||||
SetToken([]byte)
|
SetToken([]byte)
|
||||||
}
|
}
|
||||||
|
@ -37,13 +36,6 @@ type payload struct {
|
||||||
length protocol.ByteCount
|
length protocol.ByteCount
|
||||||
}
|
}
|
||||||
|
|
||||||
type nullFrameHandler struct{}
|
|
||||||
|
|
||||||
func (n nullFrameHandler) OnAcked(wire.Frame) {}
|
|
||||||
func (n nullFrameHandler) OnLost(wire.Frame) {}
|
|
||||||
|
|
||||||
var doNothingFrameHandler ackhandler.FrameHandler = &nullFrameHandler{}
|
|
||||||
|
|
||||||
type longHeaderPacket struct {
|
type longHeaderPacket struct {
|
||||||
header *wire.ExtendedHeader
|
header *wire.ExtendedHeader
|
||||||
ack *wire.AckFrame
|
ack *wire.AckFrame
|
||||||
|
@ -51,15 +43,18 @@ type longHeaderPacket struct {
|
||||||
streamFrames []ackhandler.StreamFrame // only used for 0-RTT packets
|
streamFrames []ackhandler.StreamFrame // only used for 0-RTT packets
|
||||||
|
|
||||||
length protocol.ByteCount
|
length protocol.ByteCount
|
||||||
|
|
||||||
isMTUProbePacket bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type shortHeaderPacket struct {
|
type shortHeaderPacket struct {
|
||||||
*ackhandler.Packet
|
PacketNumber protocol.PacketNumber
|
||||||
|
Frames []ackhandler.Frame
|
||||||
|
StreamFrames []ackhandler.StreamFrame
|
||||||
|
Ack *wire.AckFrame
|
||||||
|
Length protocol.ByteCount
|
||||||
|
IsPathMTUProbePacket bool
|
||||||
|
|
||||||
// used for logging
|
// used for logging
|
||||||
DestConnID protocol.ConnectionID
|
DestConnID protocol.ConnectionID
|
||||||
Ack *wire.AckFrame
|
|
||||||
PacketNumberLen protocol.PacketNumberLen
|
PacketNumberLen protocol.PacketNumberLen
|
||||||
KeyPhase protocol.KeyPhaseBit
|
KeyPhase protocol.KeyPhaseBit
|
||||||
}
|
}
|
||||||
|
@ -88,39 +83,6 @@ func (p *longHeaderPacket) EncryptionLevel() protocol.EncryptionLevel {
|
||||||
|
|
||||||
func (p *longHeaderPacket) IsAckEliciting() bool { return ackhandler.HasAckElicitingFrames(p.frames) }
|
func (p *longHeaderPacket) IsAckEliciting() bool { return ackhandler.HasAckElicitingFrames(p.frames) }
|
||||||
|
|
||||||
func (p *longHeaderPacket) ToAckHandlerPacket(now time.Time, q *retransmissionQueue) *ackhandler.Packet {
|
|
||||||
largestAcked := protocol.InvalidPacketNumber
|
|
||||||
if p.ack != nil {
|
|
||||||
largestAcked = p.ack.LargestAcked()
|
|
||||||
}
|
|
||||||
encLevel := p.EncryptionLevel()
|
|
||||||
for i := range p.frames {
|
|
||||||
if p.frames[i].Handler != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
//nolint:exhaustive // Short header packets are handled separately.
|
|
||||||
switch encLevel {
|
|
||||||
case protocol.EncryptionInitial:
|
|
||||||
p.frames[i].Handler = q.InitialAckHandler()
|
|
||||||
case protocol.EncryptionHandshake:
|
|
||||||
p.frames[i].Handler = q.HandshakeAckHandler()
|
|
||||||
case protocol.Encryption0RTT:
|
|
||||||
p.frames[i].Handler = q.AppDataAckHandler()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ap := ackhandler.GetPacket()
|
|
||||||
ap.PacketNumber = p.header.PacketNumber
|
|
||||||
ap.LargestAcked = largestAcked
|
|
||||||
ap.Frames = p.frames
|
|
||||||
ap.StreamFrames = p.streamFrames
|
|
||||||
ap.Length = p.length
|
|
||||||
ap.EncryptionLevel = encLevel
|
|
||||||
ap.SendTime = now
|
|
||||||
ap.IsPathMTUProbePacket = p.isMTUProbePacket
|
|
||||||
return ap
|
|
||||||
}
|
|
||||||
|
|
||||||
type packetNumberManager interface {
|
type packetNumberManager interface {
|
||||||
PeekPacketNumber(protocol.EncryptionLevel) (protocol.PacketNumber, protocol.PacketNumberLen)
|
PeekPacketNumber(protocol.EncryptionLevel) (protocol.PacketNumber, protocol.PacketNumberLen)
|
||||||
PopPacketNumber(protocol.EncryptionLevel) protocol.PacketNumber
|
PopPacketNumber(protocol.EncryptionLevel) protocol.PacketNumber
|
||||||
|
@ -194,18 +156,18 @@ func newPacketPacker(
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackConnectionClose packs a packet that closes the connection with a transport error.
|
// PackConnectionClose packs a packet that closes the connection with a transport error.
|
||||||
func (p *packetPacker) PackConnectionClose(e *qerr.TransportError, maxPacketSize protocol.ByteCount, now time.Time, v protocol.VersionNumber) (*coalescedPacket, error) {
|
func (p *packetPacker) PackConnectionClose(e *qerr.TransportError, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (*coalescedPacket, error) {
|
||||||
var reason string
|
var reason string
|
||||||
// don't send details of crypto errors
|
// don't send details of crypto errors
|
||||||
if !e.ErrorCode.IsCryptoError() {
|
if !e.ErrorCode.IsCryptoError() {
|
||||||
reason = e.ErrorMessage
|
reason = e.ErrorMessage
|
||||||
}
|
}
|
||||||
return p.packConnectionClose(false, uint64(e.ErrorCode), e.FrameType, reason, maxPacketSize, now, v)
|
return p.packConnectionClose(false, uint64(e.ErrorCode), e.FrameType, reason, maxPacketSize, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackApplicationClose packs a packet that closes the connection with an application error.
|
// PackApplicationClose packs a packet that closes the connection with an application error.
|
||||||
func (p *packetPacker) PackApplicationClose(e *qerr.ApplicationError, maxPacketSize protocol.ByteCount, now time.Time, v protocol.VersionNumber) (*coalescedPacket, error) {
|
func (p *packetPacker) PackApplicationClose(e *qerr.ApplicationError, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (*coalescedPacket, error) {
|
||||||
return p.packConnectionClose(true, uint64(e.ErrorCode), 0, e.ErrorMessage, maxPacketSize, now, v)
|
return p.packConnectionClose(true, uint64(e.ErrorCode), 0, e.ErrorMessage, maxPacketSize, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *packetPacker) packConnectionClose(
|
func (p *packetPacker) packConnectionClose(
|
||||||
|
@ -214,7 +176,6 @@ func (p *packetPacker) packConnectionClose(
|
||||||
frameType uint64,
|
frameType uint64,
|
||||||
reason string,
|
reason string,
|
||||||
maxPacketSize protocol.ByteCount,
|
maxPacketSize protocol.ByteCount,
|
||||||
now time.Time,
|
|
||||||
v protocol.VersionNumber,
|
v protocol.VersionNumber,
|
||||||
) (*coalescedPacket, error) {
|
) (*coalescedPacket, error) {
|
||||||
var sealers [4]sealer
|
var sealers [4]sealer
|
||||||
|
@ -299,17 +260,11 @@ func (p *packetPacker) packConnectionClose(
|
||||||
paddingLen = p.initialPaddingLen(payloads[i].frames, size, maxPacketSize)
|
paddingLen = p.initialPaddingLen(payloads[i].frames, size, maxPacketSize)
|
||||||
}
|
}
|
||||||
if encLevel == protocol.Encryption1RTT {
|
if encLevel == protocol.Encryption1RTT {
|
||||||
ap, ack, err := p.appendShortHeaderPacket(buffer, connID, oneRTTPacketNumber, oneRTTPacketNumberLen, keyPhase, payloads[i], paddingLen, maxPacketSize, sealers[i], false, now, v)
|
shp, err := p.appendShortHeaderPacket(buffer, connID, oneRTTPacketNumber, oneRTTPacketNumberLen, keyPhase, payloads[i], paddingLen, maxPacketSize, sealers[i], false, v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
packet.shortHdrPacket = &shortHeaderPacket{
|
packet.shortHdrPacket = &shp
|
||||||
Packet: ap,
|
|
||||||
DestConnID: connID,
|
|
||||||
Ack: ack,
|
|
||||||
PacketNumberLen: oneRTTPacketNumberLen,
|
|
||||||
KeyPhase: keyPhase,
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
longHdrPacket, err := p.appendLongHeaderPacket(buffer, hdrs[i], payloads[i], paddingLen, encLevel, sealers[i], v)
|
longHdrPacket, err := p.appendLongHeaderPacket(buffer, hdrs[i], payloads[i], paddingLen, encLevel, sealers[i], v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -359,7 +314,7 @@ func (p *packetPacker) initialPaddingLen(frames []ackhandler.Frame, currentSize,
|
||||||
// PackCoalescedPacket packs a new packet.
|
// PackCoalescedPacket packs a new packet.
|
||||||
// It packs an Initial / Handshake if there is data to send in these packet number spaces.
|
// It packs an Initial / Handshake if there is data to send in these packet number spaces.
|
||||||
// It should only be called before the handshake is confirmed.
|
// It should only be called before the handshake is confirmed.
|
||||||
func (p *packetPacker) PackCoalescedPacket(onlyAck bool, maxPacketSize protocol.ByteCount, now time.Time, v protocol.VersionNumber) (*coalescedPacket, error) {
|
func (p *packetPacker) PackCoalescedPacket(onlyAck bool, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (*coalescedPacket, error) {
|
||||||
var (
|
var (
|
||||||
initialHdr, handshakeHdr, zeroRTTHdr *wire.ExtendedHeader
|
initialHdr, handshakeHdr, zeroRTTHdr *wire.ExtendedHeader
|
||||||
initialPayload, handshakePayload, zeroRTTPayload, oneRTTPayload payload
|
initialPayload, handshakePayload, zeroRTTPayload, oneRTTPayload payload
|
||||||
|
@ -462,36 +417,30 @@ func (p *packetPacker) PackCoalescedPacket(onlyAck bool, maxPacketSize protocol.
|
||||||
}
|
}
|
||||||
packet.longHdrPackets = append(packet.longHdrPackets, longHdrPacket)
|
packet.longHdrPackets = append(packet.longHdrPackets, longHdrPacket)
|
||||||
} else if oneRTTPayload.length > 0 {
|
} else if oneRTTPayload.length > 0 {
|
||||||
ap, ack, err := p.appendShortHeaderPacket(buffer, connID, oneRTTPacketNumber, oneRTTPacketNumberLen, kp, oneRTTPayload, 0, maxPacketSize, oneRTTSealer, false, now, v)
|
shp, err := p.appendShortHeaderPacket(buffer, connID, oneRTTPacketNumber, oneRTTPacketNumberLen, kp, oneRTTPayload, 0, maxPacketSize, oneRTTSealer, false, v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
packet.shortHdrPacket = &shortHeaderPacket{
|
packet.shortHdrPacket = &shp
|
||||||
Packet: ap,
|
|
||||||
DestConnID: connID,
|
|
||||||
Ack: ack,
|
|
||||||
PacketNumberLen: oneRTTPacketNumberLen,
|
|
||||||
KeyPhase: kp,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return packet, nil
|
return packet, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackAckOnlyPacket packs a packet containing only an ACK in the application data packet number space.
|
// PackAckOnlyPacket packs a packet containing only an ACK in the application data packet number space.
|
||||||
// It should be called after the handshake is confirmed.
|
// It should be called after the handshake is confirmed.
|
||||||
func (p *packetPacker) PackAckOnlyPacket(maxPacketSize protocol.ByteCount, now time.Time, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) {
|
func (p *packetPacker) PackAckOnlyPacket(maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) {
|
||||||
buf := getPacketBuffer()
|
buf := getPacketBuffer()
|
||||||
packet, err := p.appendPacket(buf, true, maxPacketSize, now, v)
|
packet, err := p.appendPacket(buf, true, maxPacketSize, v)
|
||||||
return packet, buf, err
|
return packet, buf, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// AppendPacket packs a packet in the application data packet number space.
|
// AppendPacket packs a packet in the application data packet number space.
|
||||||
// It should be called after the handshake is confirmed.
|
// It should be called after the handshake is confirmed.
|
||||||
func (p *packetPacker) AppendPacket(buf *packetBuffer, maxPacketSize protocol.ByteCount, now time.Time, v protocol.VersionNumber) (shortHeaderPacket, error) {
|
func (p *packetPacker) AppendPacket(buf *packetBuffer, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, error) {
|
||||||
return p.appendPacket(buf, false, maxPacketSize, now, v)
|
return p.appendPacket(buf, false, maxPacketSize, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *packetPacker) appendPacket(buf *packetBuffer, onlyAck bool, maxPacketSize protocol.ByteCount, now time.Time, v protocol.VersionNumber) (shortHeaderPacket, error) {
|
func (p *packetPacker) appendPacket(buf *packetBuffer, onlyAck bool, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, error) {
|
||||||
sealer, err := p.cryptoSetup.Get1RTTSealer()
|
sealer, err := p.cryptoSetup.Get1RTTSealer()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return shortHeaderPacket{}, err
|
return shortHeaderPacket{}, err
|
||||||
|
@ -505,17 +454,7 @@ func (p *packetPacker) appendPacket(buf *packetBuffer, onlyAck bool, maxPacketSi
|
||||||
}
|
}
|
||||||
kp := sealer.KeyPhase()
|
kp := sealer.KeyPhase()
|
||||||
|
|
||||||
ap, ack, err := p.appendShortHeaderPacket(buf, connID, pn, pnLen, kp, pl, 0, maxPacketSize, sealer, false, now, v)
|
return p.appendShortHeaderPacket(buf, connID, pn, pnLen, kp, pl, 0, maxPacketSize, sealer, false, v)
|
||||||
if err != nil {
|
|
||||||
return shortHeaderPacket{}, err
|
|
||||||
}
|
|
||||||
return shortHeaderPacket{
|
|
||||||
Packet: ap,
|
|
||||||
DestConnID: connID,
|
|
||||||
Ack: ack,
|
|
||||||
PacketNumberLen: pnLen,
|
|
||||||
KeyPhase: kp,
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *packetPacker) maybeGetCryptoPacket(maxPacketSize protocol.ByteCount, encLevel protocol.EncryptionLevel, onlyAck, ackAllowed bool, v protocol.VersionNumber) (*wire.ExtendedHeader, payload) {
|
func (p *packetPacker) maybeGetCryptoPacket(maxPacketSize protocol.ByteCount, encLevel protocol.EncryptionLevel, onlyAck, ackAllowed bool, v protocol.VersionNumber) (*wire.ExtendedHeader, payload) {
|
||||||
|
@ -530,14 +469,17 @@ func (p *packetPacker) maybeGetCryptoPacket(maxPacketSize protocol.ByteCount, en
|
||||||
}
|
}
|
||||||
|
|
||||||
var s cryptoStream
|
var s cryptoStream
|
||||||
|
var handler ackhandler.FrameHandler
|
||||||
var hasRetransmission bool
|
var hasRetransmission bool
|
||||||
//nolint:exhaustive // Initial and Handshake are the only two encryption levels here.
|
//nolint:exhaustive // Initial and Handshake are the only two encryption levels here.
|
||||||
switch encLevel {
|
switch encLevel {
|
||||||
case protocol.EncryptionInitial:
|
case protocol.EncryptionInitial:
|
||||||
s = p.initialStream
|
s = p.initialStream
|
||||||
|
handler = p.retransmissionQueue.InitialAckHandler()
|
||||||
hasRetransmission = p.retransmissionQueue.HasInitialData()
|
hasRetransmission = p.retransmissionQueue.HasInitialData()
|
||||||
case protocol.EncryptionHandshake:
|
case protocol.EncryptionHandshake:
|
||||||
s = p.handshakeStream
|
s = p.handshakeStream
|
||||||
|
handler = p.retransmissionQueue.HandshakeAckHandler()
|
||||||
hasRetransmission = p.retransmissionQueue.HasHandshakeData()
|
hasRetransmission = p.retransmissionQueue.HasHandshakeData()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -561,25 +503,27 @@ func (p *packetPacker) maybeGetCryptoPacket(maxPacketSize protocol.ByteCount, en
|
||||||
maxPacketSize -= hdr.GetLength(v)
|
maxPacketSize -= hdr.GetLength(v)
|
||||||
if hasRetransmission {
|
if hasRetransmission {
|
||||||
for {
|
for {
|
||||||
var f wire.Frame
|
var f ackhandler.Frame
|
||||||
//nolint:exhaustive // 0-RTT packets can't contain any retransmission.s
|
//nolint:exhaustive // 0-RTT packets can't contain any retransmission.s
|
||||||
switch encLevel {
|
switch encLevel {
|
||||||
case protocol.EncryptionInitial:
|
case protocol.EncryptionInitial:
|
||||||
f = p.retransmissionQueue.GetInitialFrame(maxPacketSize, v)
|
f.Frame = p.retransmissionQueue.GetInitialFrame(maxPacketSize, v)
|
||||||
|
f.Handler = p.retransmissionQueue.InitialAckHandler()
|
||||||
case protocol.EncryptionHandshake:
|
case protocol.EncryptionHandshake:
|
||||||
f = p.retransmissionQueue.GetHandshakeFrame(maxPacketSize, v)
|
f.Frame = p.retransmissionQueue.GetHandshakeFrame(maxPacketSize, v)
|
||||||
|
f.Handler = p.retransmissionQueue.HandshakeAckHandler()
|
||||||
}
|
}
|
||||||
if f == nil {
|
if f.Frame == nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
pl.frames = append(pl.frames, ackhandler.Frame{Frame: f})
|
pl.frames = append(pl.frames, f)
|
||||||
frameLen := f.Length(v)
|
frameLen := f.Frame.Length(v)
|
||||||
pl.length += frameLen
|
pl.length += frameLen
|
||||||
maxPacketSize -= frameLen
|
maxPacketSize -= frameLen
|
||||||
}
|
}
|
||||||
} else if s.HasData() {
|
} else if s.HasData() {
|
||||||
cf := s.PopCryptoFrame(maxPacketSize)
|
cf := s.PopCryptoFrame(maxPacketSize)
|
||||||
pl.frames = []ackhandler.Frame{{Frame: cf}}
|
pl.frames = []ackhandler.Frame{{Frame: cf, Handler: handler}}
|
||||||
pl.length += cf.Length(v)
|
pl.length += cf.Length(v)
|
||||||
}
|
}
|
||||||
return hdr, pl
|
return hdr, pl
|
||||||
|
@ -611,10 +555,7 @@ func (p *packetPacker) maybeGetAppDataPacket(maxPayloadSize protocol.ByteCount,
|
||||||
// the packet only contains an ACK
|
// the packet only contains an ACK
|
||||||
if p.numNonAckElicitingAcks >= protocol.MaxNonAckElicitingAcks {
|
if p.numNonAckElicitingAcks >= protocol.MaxNonAckElicitingAcks {
|
||||||
ping := &wire.PingFrame{}
|
ping := &wire.PingFrame{}
|
||||||
pl.frames = append(pl.frames, ackhandler.Frame{
|
pl.frames = append(pl.frames, ackhandler.Frame{Frame: ping})
|
||||||
Frame: ping,
|
|
||||||
Handler: doNothingFrameHandler, // don't retransmit the PING frame when it is lost
|
|
||||||
})
|
|
||||||
pl.length += ping.Length(v)
|
pl.length += ping.Length(v)
|
||||||
p.numNonAckElicitingAcks = 0
|
p.numNonAckElicitingAcks = 0
|
||||||
} else {
|
} else {
|
||||||
|
@ -629,10 +570,7 @@ func (p *packetPacker) maybeGetAppDataPacket(maxPayloadSize protocol.ByteCount,
|
||||||
func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAck, ackAllowed bool, v protocol.VersionNumber) payload {
|
func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAck, ackAllowed bool, v protocol.VersionNumber) payload {
|
||||||
if onlyAck {
|
if onlyAck {
|
||||||
if ack := p.acks.GetAckFrame(protocol.Encryption1RTT, true); ack != nil {
|
if ack := p.acks.GetAckFrame(protocol.Encryption1RTT, true); ack != nil {
|
||||||
return payload{
|
return payload{ack: ack, length: ack.Length(v)}
|
||||||
ack: ack,
|
|
||||||
length: ack.Length(v),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return payload{}
|
return payload{}
|
||||||
}
|
}
|
||||||
|
@ -655,11 +593,7 @@ func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAc
|
||||||
if f := p.datagramQueue.Peek(); f != nil {
|
if f := p.datagramQueue.Peek(); f != nil {
|
||||||
size := f.Length(v)
|
size := f.Length(v)
|
||||||
if size <= maxFrameSize-pl.length {
|
if size <= maxFrameSize-pl.length {
|
||||||
pl.frames = append(pl.frames, ackhandler.Frame{
|
pl.frames = append(pl.frames, ackhandler.Frame{Frame: f})
|
||||||
Frame: f,
|
|
||||||
// Set it to a no-op. Then we won't set the default callback, which would retransmit the frame.
|
|
||||||
Handler: doNothingFrameHandler,
|
|
||||||
})
|
|
||||||
pl.length += size
|
pl.length += size
|
||||||
p.datagramQueue.Pop()
|
p.datagramQueue.Pop()
|
||||||
}
|
}
|
||||||
|
@ -680,15 +614,20 @@ func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAc
|
||||||
if f == nil {
|
if f == nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
pl.frames = append(pl.frames, ackhandler.Frame{Frame: f})
|
pl.frames = append(pl.frames, ackhandler.Frame{Frame: f, Handler: p.retransmissionQueue.AppDataAckHandler()})
|
||||||
pl.length += f.Length(v)
|
pl.length += f.Length(v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasData {
|
if hasData {
|
||||||
var lengthAdded protocol.ByteCount
|
var lengthAdded protocol.ByteCount
|
||||||
|
startLen := len(pl.frames)
|
||||||
pl.frames, lengthAdded = p.framer.AppendControlFrames(pl.frames, maxFrameSize-pl.length, v)
|
pl.frames, lengthAdded = p.framer.AppendControlFrames(pl.frames, maxFrameSize-pl.length, v)
|
||||||
pl.length += lengthAdded
|
pl.length += lengthAdded
|
||||||
|
// add handlers for the control frames that were added
|
||||||
|
for i := startLen; i < len(pl.frames); i++ {
|
||||||
|
pl.frames[i].Handler = p.retransmissionQueue.AppDataAckHandler()
|
||||||
|
}
|
||||||
|
|
||||||
pl.streamFrames, lengthAdded = p.framer.AppendStreamFrames(pl.streamFrames, maxFrameSize-pl.length, v)
|
pl.streamFrames, lengthAdded = p.framer.AppendStreamFrames(pl.streamFrames, maxFrameSize-pl.length, v)
|
||||||
pl.length += lengthAdded
|
pl.length += lengthAdded
|
||||||
|
@ -696,7 +635,7 @@ func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAc
|
||||||
return pl
|
return pl
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *packetPacker) MaybePackProbePacket(encLevel protocol.EncryptionLevel, maxPacketSize protocol.ByteCount, now time.Time, v protocol.VersionNumber) (*coalescedPacket, error) {
|
func (p *packetPacker) MaybePackProbePacket(encLevel protocol.EncryptionLevel, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (*coalescedPacket, error) {
|
||||||
if encLevel == protocol.Encryption1RTT {
|
if encLevel == protocol.Encryption1RTT {
|
||||||
s, err := p.cryptoSetup.Get1RTTSealer()
|
s, err := p.cryptoSetup.Get1RTTSealer()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -712,17 +651,11 @@ func (p *packetPacker) MaybePackProbePacket(encLevel protocol.EncryptionLevel, m
|
||||||
}
|
}
|
||||||
buffer := getPacketBuffer()
|
buffer := getPacketBuffer()
|
||||||
packet := &coalescedPacket{buffer: buffer}
|
packet := &coalescedPacket{buffer: buffer}
|
||||||
ap, ack, err := p.appendShortHeaderPacket(buffer, connID, pn, pnLen, kp, pl, 0, maxPacketSize, s, false, now, v)
|
shp, err := p.appendShortHeaderPacket(buffer, connID, pn, pnLen, kp, pl, 0, maxPacketSize, s, false, v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
packet.shortHdrPacket = &shortHeaderPacket{
|
packet.shortHdrPacket = &shp
|
||||||
Packet: ap,
|
|
||||||
DestConnID: connID,
|
|
||||||
Ack: ack,
|
|
||||||
PacketNumberLen: pnLen,
|
|
||||||
KeyPhase: kp,
|
|
||||||
}
|
|
||||||
return packet, nil
|
return packet, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -768,7 +701,7 @@ func (p *packetPacker) MaybePackProbePacket(encLevel protocol.EncryptionLevel, m
|
||||||
return packet, nil
|
return packet, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *packetPacker) PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount, now time.Time, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) {
|
func (p *packetPacker) PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) {
|
||||||
pl := payload{
|
pl := payload{
|
||||||
frames: []ackhandler.Frame{ping},
|
frames: []ackhandler.Frame{ping},
|
||||||
length: ping.Frame.Length(v),
|
length: ping.Frame.Length(v),
|
||||||
|
@ -782,17 +715,8 @@ func (p *packetPacker) PackMTUProbePacket(ping ackhandler.Frame, size protocol.B
|
||||||
pn, pnLen := p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
|
pn, pnLen := p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
|
||||||
padding := size - p.shortHeaderPacketLength(connID, pnLen, pl) - protocol.ByteCount(s.Overhead())
|
padding := size - p.shortHeaderPacketLength(connID, pnLen, pl) - protocol.ByteCount(s.Overhead())
|
||||||
kp := s.KeyPhase()
|
kp := s.KeyPhase()
|
||||||
ap, ack, err := p.appendShortHeaderPacket(buffer, connID, pn, pnLen, kp, pl, padding, size, s, true, now, v)
|
packet, err := p.appendShortHeaderPacket(buffer, connID, pn, pnLen, kp, pl, padding, size, s, true, v)
|
||||||
if err != nil {
|
return packet, buffer, err
|
||||||
return shortHeaderPacket{}, nil, err
|
|
||||||
}
|
|
||||||
return shortHeaderPacket{
|
|
||||||
Packet: ap,
|
|
||||||
DestConnID: connID,
|
|
||||||
Ack: ack,
|
|
||||||
PacketNumberLen: pnLen,
|
|
||||||
KeyPhase: kp,
|
|
||||||
}, buffer, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *packetPacker) getLongHeader(encLevel protocol.EncryptionLevel, v protocol.VersionNumber) *wire.ExtendedHeader {
|
func (p *packetPacker) getLongHeader(encLevel protocol.EncryptionLevel, v protocol.VersionNumber) *wire.ExtendedHeader {
|
||||||
|
@ -864,9 +788,8 @@ func (p *packetPacker) appendShortHeaderPacket(
|
||||||
padding, maxPacketSize protocol.ByteCount,
|
padding, maxPacketSize protocol.ByteCount,
|
||||||
sealer sealer,
|
sealer sealer,
|
||||||
isMTUProbePacket bool,
|
isMTUProbePacket bool,
|
||||||
now time.Time,
|
|
||||||
v protocol.VersionNumber,
|
v protocol.VersionNumber,
|
||||||
) (*ackhandler.Packet, *wire.AckFrame, error) {
|
) (shortHeaderPacket, error) {
|
||||||
var paddingLen protocol.ByteCount
|
var paddingLen protocol.ByteCount
|
||||||
if pl.length < 4-protocol.ByteCount(pnLen) {
|
if pl.length < 4-protocol.ByteCount(pnLen) {
|
||||||
paddingLen = 4 - protocol.ByteCount(pnLen) - pl.length
|
paddingLen = 4 - protocol.ByteCount(pnLen) - pl.length
|
||||||
|
@ -877,48 +800,36 @@ func (p *packetPacker) appendShortHeaderPacket(
|
||||||
raw := buffer.Data[startLen:]
|
raw := buffer.Data[startLen:]
|
||||||
raw, err := wire.AppendShortHeader(raw, connID, pn, pnLen, kp)
|
raw, err := wire.AppendShortHeader(raw, connID, pn, pnLen, kp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return shortHeaderPacket{}, err
|
||||||
}
|
}
|
||||||
payloadOffset := protocol.ByteCount(len(raw))
|
payloadOffset := protocol.ByteCount(len(raw))
|
||||||
|
|
||||||
raw, err = p.appendPacketPayload(raw, pl, paddingLen, v)
|
raw, err = p.appendPacketPayload(raw, pl, paddingLen, v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return shortHeaderPacket{}, err
|
||||||
}
|
}
|
||||||
if !isMTUProbePacket {
|
if !isMTUProbePacket {
|
||||||
if size := protocol.ByteCount(len(raw) + sealer.Overhead()); size > maxPacketSize {
|
if size := protocol.ByteCount(len(raw) + sealer.Overhead()); size > maxPacketSize {
|
||||||
return nil, nil, fmt.Errorf("PacketPacker BUG: packet too large (%d bytes, allowed %d bytes)", size, maxPacketSize)
|
return shortHeaderPacket{}, fmt.Errorf("PacketPacker BUG: packet too large (%d bytes, allowed %d bytes)", size, maxPacketSize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
raw = p.encryptPacket(raw, sealer, pn, payloadOffset, protocol.ByteCount(pnLen))
|
raw = p.encryptPacket(raw, sealer, pn, payloadOffset, protocol.ByteCount(pnLen))
|
||||||
buffer.Data = buffer.Data[:len(buffer.Data)+len(raw)]
|
buffer.Data = buffer.Data[:len(buffer.Data)+len(raw)]
|
||||||
|
|
||||||
// create the ackhandler.Packet
|
|
||||||
largestAcked := protocol.InvalidPacketNumber
|
|
||||||
if pl.ack != nil {
|
|
||||||
largestAcked = pl.ack.LargestAcked()
|
|
||||||
}
|
|
||||||
for i := range pl.frames {
|
|
||||||
if pl.frames[i].Handler != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
pl.frames[i].Handler = p.retransmissionQueue.AppDataAckHandler()
|
|
||||||
}
|
|
||||||
|
|
||||||
ap := ackhandler.GetPacket()
|
|
||||||
ap.PacketNumber = pn
|
|
||||||
ap.LargestAcked = largestAcked
|
|
||||||
ap.Frames = pl.frames
|
|
||||||
ap.StreamFrames = pl.streamFrames
|
|
||||||
ap.Length = protocol.ByteCount(len(raw))
|
|
||||||
ap.EncryptionLevel = protocol.Encryption1RTT
|
|
||||||
ap.SendTime = now
|
|
||||||
ap.IsPathMTUProbePacket = isMTUProbePacket
|
|
||||||
|
|
||||||
if newPN := p.pnManager.PopPacketNumber(protocol.Encryption1RTT); newPN != pn {
|
if newPN := p.pnManager.PopPacketNumber(protocol.Encryption1RTT); newPN != pn {
|
||||||
return nil, nil, fmt.Errorf("packetPacker BUG: Peeked and Popped packet numbers do not match: expected %d, got %d", pn, newPN)
|
return shortHeaderPacket{}, fmt.Errorf("packetPacker BUG: Peeked and Popped packet numbers do not match: expected %d, got %d", pn, newPN)
|
||||||
}
|
}
|
||||||
return ap, pl.ack, nil
|
return shortHeaderPacket{
|
||||||
|
PacketNumber: pn,
|
||||||
|
PacketNumberLen: pnLen,
|
||||||
|
KeyPhase: kp,
|
||||||
|
StreamFrames: pl.streamFrames,
|
||||||
|
Frames: pl.frames,
|
||||||
|
Ack: pl.ack,
|
||||||
|
Length: protocol.ByteCount(len(raw)),
|
||||||
|
DestConnID: connID,
|
||||||
|
IsPathMTUProbePacket: isMTUProbePacket,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *packetPacker) appendPacketPayload(raw []byte, pl payload, paddingLen protocol.ByteCount, v protocol.VersionNumber) ([]byte, error) {
|
func (p *packetPacker) appendPacketPayload(raw []byte, pl payload, paddingLen protocol.ByteCount, v protocol.VersionNumber) ([]byte, error) {
|
||||||
|
|
|
@ -168,7 +168,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
expectAppendControlFrames()
|
expectAppendControlFrames()
|
||||||
f := &wire.StreamFrame{Data: []byte{0xde, 0xca, 0xfb, 0xad}}
|
f := &wire.StreamFrame{Data: []byte{0xde, 0xca, 0xfb, 0xad}}
|
||||||
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f})
|
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f})
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(p.longHdrPackets).To(BeEmpty())
|
Expect(p.longHdrPackets).To(BeEmpty())
|
||||||
|
@ -207,7 +207,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true)
|
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true)
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true)
|
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true)
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true)
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true)
|
||||||
p, err := packer.PackCoalescedPacket(true, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).To(BeNil())
|
Expect(p).To(BeNil())
|
||||||
})
|
})
|
||||||
|
@ -219,7 +219,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
|
sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}}
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack)
|
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack)
|
||||||
p, err := packer.PackCoalescedPacket(true, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
|
@ -236,7 +236,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
|
sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil)
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}}
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack)
|
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack)
|
||||||
p, err := packer.PackCoalescedPacket(true, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
|
@ -256,7 +256,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}}
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true)
|
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true)
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack)
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack)
|
||||||
p, err := packer.PackCoalescedPacket(true, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(p.longHdrPackets).To(BeEmpty())
|
Expect(p.longHdrPackets).To(BeEmpty())
|
||||||
|
@ -272,7 +272,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
|
sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}}
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack)
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack)
|
||||||
p, buffer, err := packer.PackAckOnlyPacket(maxPacketSize, time.Now(), protocol.Version1)
|
p, buffer, err := packer.PackAckOnlyPacket(maxPacketSize, protocol.Version1)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(p.Ack).To(Equal(ack))
|
Expect(p.Ack).To(Equal(ack))
|
||||||
|
@ -308,17 +308,19 @@ var _ = Describe("Packet packer", func() {
|
||||||
framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(frames []ackhandler.StreamFrame, _ protocol.ByteCount, _ protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) {
|
framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(frames []ackhandler.StreamFrame, _ protocol.ByteCount, _ protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) {
|
||||||
return frames, 0
|
return frames, 0
|
||||||
})
|
})
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketType0RTT))
|
Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketType0RTT))
|
||||||
Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.Encryption0RTT))
|
Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.Encryption0RTT))
|
||||||
Expect(p.longHdrPackets[0].frames).To(Equal([]ackhandler.Frame{cf}))
|
Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
|
||||||
|
Expect(p.longHdrPackets[0].frames[0].Frame).To(Equal(cf.Frame))
|
||||||
|
Expect(p.longHdrPackets[0].frames[0].Handler).ToNot(BeNil())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("doesn't add an ACK-only 0-RTT packet", func() { // ACK frames cannot be sent in 0-RTT packets
|
It("doesn't add an ACK-only 0-RTT packet", func() { // ACK frames cannot be sent in 0-RTT packets
|
||||||
p, err := packer.PackCoalescedPacket(true, protocol.MaxByteCount, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(true, protocol.MaxByteCount, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).To(BeNil())
|
Expect(p).To(BeNil())
|
||||||
})
|
})
|
||||||
|
@ -333,7 +335,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
|
sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
|
||||||
quicErr := qerr.NewLocalCryptoError(0x42, "crypto error")
|
quicErr := qerr.NewLocalCryptoError(0x42, "crypto error")
|
||||||
quicErr.FrameType = 0x1234
|
quicErr.FrameType = 0x1234
|
||||||
p, err := packer.PackConnectionClose(quicErr, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackConnectionClose(quicErr, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeHandshake))
|
Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeHandshake))
|
||||||
|
@ -353,17 +355,15 @@ var _ = Describe("Packet packer", func() {
|
||||||
sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysDropped)
|
sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysDropped)
|
||||||
sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
|
sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
|
||||||
// expect no framer.PopStreamFrames
|
// expect no framer.PopStreamFrames
|
||||||
now := time.Now()
|
|
||||||
p, err := packer.PackConnectionClose(&qerr.TransportError{
|
p, err := packer.PackConnectionClose(&qerr.TransportError{
|
||||||
ErrorCode: qerr.CryptoBufferExceeded,
|
ErrorCode: qerr.CryptoBufferExceeded,
|
||||||
ErrorMessage: "test error",
|
ErrorMessage: "test error",
|
||||||
}, maxPacketSize, now, protocol.Version1)
|
}, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.longHdrPackets).To(BeEmpty())
|
Expect(p.longHdrPackets).To(BeEmpty())
|
||||||
Expect(p.shortHdrPacket.Frames).To(HaveLen(1))
|
Expect(p.shortHdrPacket.Frames).To(HaveLen(1))
|
||||||
Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
|
Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{}))
|
||||||
ccf := p.shortHdrPacket.Frames[0].Frame.(*wire.ConnectionCloseFrame)
|
ccf := p.shortHdrPacket.Frames[0].Frame.(*wire.ConnectionCloseFrame)
|
||||||
Expect(p.shortHdrPacket.Packet.SendTime).To(Equal(now))
|
|
||||||
Expect(ccf.IsApplicationError).To(BeFalse())
|
Expect(ccf.IsApplicationError).To(BeFalse())
|
||||||
Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.CryptoBufferExceeded))
|
Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.CryptoBufferExceeded))
|
||||||
Expect(ccf.ReasonPhrase).To(Equal("test error"))
|
Expect(ccf.ReasonPhrase).To(Equal("test error"))
|
||||||
|
@ -382,7 +382,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
p, err := packer.PackApplicationClose(&qerr.ApplicationError{
|
p, err := packer.PackApplicationClose(&qerr.ApplicationError{
|
||||||
ErrorCode: 0x1337,
|
ErrorCode: 0x1337,
|
||||||
ErrorMessage: "test error",
|
ErrorMessage: "test error",
|
||||||
}, maxPacketSize, time.Now(), protocol.Version1)
|
}, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(2))
|
Expect(p.longHdrPackets).To(HaveLen(2))
|
||||||
Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeInitial))
|
Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeInitial))
|
||||||
|
@ -424,7 +424,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
p, err := packer.PackApplicationClose(&qerr.ApplicationError{
|
p, err := packer.PackApplicationClose(&qerr.ApplicationError{
|
||||||
ErrorCode: 0x1337,
|
ErrorCode: 0x1337,
|
||||||
ErrorMessage: "test error",
|
ErrorMessage: "test error",
|
||||||
}, maxPacketSize, time.Now(), protocol.Version1)
|
}, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
Expect(p.buffer.Len()).To(BeNumerically("<", protocol.MinInitialPacketSize))
|
Expect(p.buffer.Len()).To(BeNumerically("<", protocol.MinInitialPacketSize))
|
||||||
|
@ -459,7 +459,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
p, err := packer.PackApplicationClose(&qerr.ApplicationError{
|
p, err := packer.PackApplicationClose(&qerr.ApplicationError{
|
||||||
ErrorCode: 0x1337,
|
ErrorCode: 0x1337,
|
||||||
ErrorMessage: "test error",
|
ErrorMessage: "test error",
|
||||||
}, maxPacketSize, time.Now(), protocol.Version1)
|
}, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(2))
|
Expect(p.longHdrPackets).To(HaveLen(2))
|
||||||
Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
|
Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
|
||||||
|
@ -495,7 +495,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
|
sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true)
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true)
|
||||||
framer.EXPECT().HasData()
|
framer.EXPECT().HasData()
|
||||||
_, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, time.Now(), protocol.Version1)
|
_, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
|
||||||
Expect(err).To(MatchError(errNothingToPack))
|
Expect(err).To(MatchError(errNothingToPack))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -513,8 +513,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f})
|
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f})
|
||||||
buffer := getPacketBuffer()
|
buffer := getPacketBuffer()
|
||||||
buffer.Data = append(buffer.Data, []byte("foobar")...)
|
buffer.Data = append(buffer.Data, []byte("foobar")...)
|
||||||
now := time.Now()
|
p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1)
|
||||||
p, err := packer.AppendPacket(buffer, maxPacketSize, now, protocol.Version1)
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
b, err := f.Append(nil, protocol.Version1)
|
b, err := f.Append(nil, protocol.Version1)
|
||||||
|
@ -522,7 +521,6 @@ var _ = Describe("Packet packer", func() {
|
||||||
Expect(p.Frames).To(BeEmpty())
|
Expect(p.Frames).To(BeEmpty())
|
||||||
Expect(p.StreamFrames).To(HaveLen(1))
|
Expect(p.StreamFrames).To(HaveLen(1))
|
||||||
Expect(p.StreamFrames[0].Frame.StreamID).To(Equal(f.StreamID))
|
Expect(p.StreamFrames[0].Frame.StreamID).To(Equal(f.StreamID))
|
||||||
Expect(p.Packet.SendTime).To(Equal(now))
|
|
||||||
Expect(buffer.Data[:6]).To(Equal([]byte("foobar"))) // make sure the packet was actually appended
|
Expect(buffer.Data[:6]).To(Equal([]byte("foobar"))) // make sure the packet was actually appended
|
||||||
Expect(buffer.Data).To(ContainSubstring(string(b)))
|
Expect(buffer.Data).To(ContainSubstring(string(b)))
|
||||||
})
|
})
|
||||||
|
@ -534,7 +532,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
framer.EXPECT().HasData()
|
framer.EXPECT().HasData()
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack)
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack)
|
||||||
sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
|
sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
|
||||||
p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(p.Ack).To(Equal(ack))
|
Expect(p.Ack).To(Equal(ack))
|
||||||
|
@ -553,7 +551,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
expectAppendControlFrames(frames...)
|
expectAppendControlFrames(frames...)
|
||||||
expectAppendStreamFrames()
|
expectAppendStreamFrames()
|
||||||
buffer := getPacketBuffer()
|
buffer := getPacketBuffer()
|
||||||
p, err := packer.AppendPacket(buffer, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1)
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.Frames).To(HaveLen(2))
|
Expect(p.Frames).To(HaveLen(2))
|
||||||
|
@ -583,7 +581,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
|
|
||||||
framer.EXPECT().HasData()
|
framer.EXPECT().HasData()
|
||||||
buffer := getPacketBuffer()
|
buffer := getPacketBuffer()
|
||||||
p, err := packer.AppendPacket(buffer, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1)
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.Frames).To(HaveLen(1))
|
Expect(p.Frames).To(HaveLen(1))
|
||||||
|
@ -612,7 +610,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
|
|
||||||
framer.EXPECT().HasData()
|
framer.EXPECT().HasData()
|
||||||
buffer := getPacketBuffer()
|
buffer := getPacketBuffer()
|
||||||
p, err := packer.AppendPacket(buffer, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1)
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.Ack).ToNot(BeNil())
|
Expect(p.Ack).ToNot(BeNil())
|
||||||
|
@ -638,7 +636,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
return fs, 0
|
return fs, 0
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
_, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, time.Now(), protocol.Version1)
|
_, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
|
||||||
Expect(err).To(MatchError(errNothingToPack))
|
Expect(err).To(MatchError(errNothingToPack))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -652,7 +650,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
packer.retransmissionQueue.AddHandshake(&wire.PingFrame{})
|
packer.retransmissionQueue.AddHandshake(&wire.PingFrame{})
|
||||||
handshakeStream.EXPECT().HasData()
|
handshakeStream.EXPECT().HasData()
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false)
|
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false)
|
||||||
packet, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
packet, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(packet).ToNot(BeNil())
|
Expect(packet).ToNot(BeNil())
|
||||||
Expect(packet.longHdrPackets).To(HaveLen(1))
|
Expect(packet.longHdrPackets).To(HaveLen(1))
|
||||||
|
@ -696,7 +694,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
expectAppendControlFrames()
|
expectAppendControlFrames()
|
||||||
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f})
|
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f})
|
||||||
buffer := getPacketBuffer()
|
buffer := getPacketBuffer()
|
||||||
_, err := packer.AppendPacket(buffer, maxPacketSize, time.Now(), protocol.Version1)
|
_, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
// cut off the tag that the mock sealer added
|
// cut off the tag that the mock sealer added
|
||||||
buffer.Data = buffer.Data[:buffer.Len()-protocol.ByteCount(sealer.Overhead())]
|
buffer.Data = buffer.Data[:buffer.Len()-protocol.ByteCount(sealer.Overhead())]
|
||||||
|
@ -745,7 +743,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
|
||||||
expectAppendControlFrames()
|
expectAppendControlFrames()
|
||||||
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f1}, ackhandler.StreamFrame{Frame: f2}, ackhandler.StreamFrame{Frame: f3})
|
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f1}, ackhandler.StreamFrame{Frame: f2}, ackhandler.StreamFrame{Frame: f3})
|
||||||
p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.Frames).To(BeEmpty())
|
Expect(p.Frames).To(BeEmpty())
|
||||||
|
@ -765,7 +763,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}})
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}})
|
||||||
expectAppendControlFrames()
|
expectAppendControlFrames()
|
||||||
expectAppendStreamFrames()
|
expectAppendStreamFrames()
|
||||||
p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.Ack).ToNot(BeNil())
|
Expect(p.Ack).ToNot(BeNil())
|
||||||
|
@ -782,14 +780,14 @@ var _ = Describe("Packet packer", func() {
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}})
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}})
|
||||||
expectAppendControlFrames()
|
expectAppendControlFrames()
|
||||||
expectAppendStreamFrames()
|
expectAppendStreamFrames()
|
||||||
p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
var hasPing bool
|
var hasPing bool
|
||||||
for _, f := range p.Frames {
|
for _, f := range p.Frames {
|
||||||
if _, ok := f.Frame.(*wire.PingFrame); ok {
|
if _, ok := f.Frame.(*wire.PingFrame); ok {
|
||||||
hasPing = true
|
hasPing = true
|
||||||
Expect(f.Handler.OnLost).ToNot(BeNil()) // make sure the PING is not retransmitted if lost
|
Expect(f.Handler).To(BeNil()) // make sure the PING is not retransmitted if lost
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Expect(hasPing).To(BeTrue())
|
Expect(hasPing).To(BeTrue())
|
||||||
|
@ -801,7 +799,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}})
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}})
|
||||||
expectAppendControlFrames()
|
expectAppendControlFrames()
|
||||||
expectAppendStreamFrames()
|
expectAppendStreamFrames()
|
||||||
p, err = packer.AppendPacket(getPacketBuffer(), maxPacketSize, time.Now(), protocol.Version1)
|
p, err = packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.Ack).ToNot(BeNil())
|
Expect(p.Ack).ToNot(BeNil())
|
||||||
|
@ -817,7 +815,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
expectAppendControlFrames()
|
expectAppendControlFrames()
|
||||||
expectAppendStreamFrames()
|
expectAppendStreamFrames()
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
|
||||||
_, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, time.Now(), protocol.Version1)
|
_, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
|
||||||
Expect(err).To(MatchError(errNothingToPack))
|
Expect(err).To(MatchError(errNothingToPack))
|
||||||
// now add some frame to send
|
// now add some frame to send
|
||||||
expectAppendControlFrames()
|
expectAppendControlFrames()
|
||||||
|
@ -828,14 +826,14 @@ var _ = Describe("Packet packer", func() {
|
||||||
framer.EXPECT().HasData().Return(true)
|
framer.EXPECT().HasData().Return(true)
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(ack)
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(ack)
|
||||||
p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.Ack).To(Equal(ack))
|
Expect(p.Ack).To(Equal(ack))
|
||||||
var hasPing bool
|
var hasPing bool
|
||||||
for _, f := range p.Frames {
|
for _, f := range p.Frames {
|
||||||
if _, ok := f.Frame.(*wire.PingFrame); ok {
|
if _, ok := f.Frame.(*wire.PingFrame); ok {
|
||||||
hasPing = true
|
hasPing = true
|
||||||
Expect(f.Handler.OnLost).ToNot(BeNil()) // make sure the PING is not retransmitted if lost
|
Expect(f.Handler).To(BeNil()) // make sure the PING is not retransmitted if lost
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Expect(hasPing).To(BeTrue())
|
Expect(hasPing).To(BeTrue())
|
||||||
|
@ -850,7 +848,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
|
||||||
expectAppendStreamFrames()
|
expectAppendStreamFrames()
|
||||||
expectAppendControlFrames(ackhandler.Frame{Frame: &wire.MaxDataFrame{}})
|
expectAppendControlFrames(ackhandler.Frame{Frame: &wire.MaxDataFrame{}})
|
||||||
p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(p.Frames).ToNot(ContainElement(&wire.PingFrame{}))
|
Expect(p.Frames).ToNot(ContainElement(&wire.PingFrame{}))
|
||||||
|
@ -872,7 +870,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped)
|
sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped)
|
||||||
sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
|
sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil)
|
||||||
sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
|
sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
parsePacket(p.buffer.Data)
|
parsePacket(p.buffer.Data)
|
||||||
|
@ -891,7 +889,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
|
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
|
||||||
return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")}
|
return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")}
|
||||||
})
|
})
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
|
Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
|
||||||
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
||||||
|
@ -921,7 +919,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
Expect(f.Length(protocol.Version1)).To(Equal(size))
|
Expect(f.Length(protocol.Version1)).To(Equal(size))
|
||||||
return f
|
return f
|
||||||
})
|
})
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
|
Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
|
||||||
|
@ -947,7 +945,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
|
handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
|
||||||
return &wire.CryptoFrame{Offset: 0x1337, Data: []byte("handshake")}
|
return &wire.CryptoFrame{Offset: 0x1337, Data: []byte("handshake")}
|
||||||
})
|
})
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
||||||
Expect(p.longHdrPackets).To(HaveLen(2))
|
Expect(p.longHdrPackets).To(HaveLen(2))
|
||||||
|
@ -981,7 +979,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
})
|
})
|
||||||
handshakeStream.EXPECT().HasData()
|
handshakeStream.EXPECT().HasData()
|
||||||
packer.retransmissionQueue.AddHandshake(&wire.PingFrame{})
|
packer.retransmissionQueue.AddHandshake(&wire.PingFrame{})
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
||||||
Expect(p.longHdrPackets).To(HaveLen(2))
|
Expect(p.longHdrPackets).To(HaveLen(2))
|
||||||
|
@ -1012,7 +1010,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
handshakeStream.EXPECT().HasData()
|
handshakeStream.EXPECT().HasData()
|
||||||
packer.retransmissionQueue.AddInitial(&wire.PingFrame{})
|
packer.retransmissionQueue.AddInitial(&wire.PingFrame{})
|
||||||
packer.retransmissionQueue.AddHandshake(&wire.PingFrame{})
|
packer.retransmissionQueue.AddHandshake(&wire.PingFrame{})
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
||||||
Expect(p.longHdrPackets).To(HaveLen(2))
|
Expect(p.longHdrPackets).To(HaveLen(2))
|
||||||
|
@ -1046,7 +1044,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
expectAppendStreamFrames()
|
expectAppendStreamFrames()
|
||||||
framer.EXPECT().HasData().Return(true)
|
framer.EXPECT().HasData().Return(true)
|
||||||
packer.retransmissionQueue.AddAppData(&wire.PingFrame{})
|
packer.retransmissionQueue.AddAppData(&wire.PingFrame{})
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
|
@ -1082,7 +1080,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
})
|
})
|
||||||
expectAppendControlFrames()
|
expectAppendControlFrames()
|
||||||
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: &wire.StreamFrame{Data: []byte("foobar")}})
|
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: &wire.StreamFrame{Data: []byte("foobar")}})
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
|
Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
|
||||||
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
||||||
|
@ -1119,7 +1117,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
})
|
})
|
||||||
expectAppendControlFrames()
|
expectAppendControlFrames()
|
||||||
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: &wire.StreamFrame{Data: []byte("foobar")}})
|
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: &wire.StreamFrame{Data: []byte("foobar")}})
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.buffer.Len()).To(BeNumerically("<", 100))
|
Expect(p.buffer.Len()).To(BeNumerically("<", 100))
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
|
@ -1152,7 +1150,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
Expect(f.Length(protocol.Version1)).To(Equal(s))
|
Expect(f.Length(protocol.Version1)).To(Equal(s))
|
||||||
return f
|
return f
|
||||||
})
|
})
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
Expect(p.shortHdrPacket).To(BeNil())
|
Expect(p.shortHdrPacket).To(BeNil())
|
||||||
|
@ -1171,7 +1169,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
packer.retransmissionQueue.AddHandshake(&wire.PingFrame{})
|
packer.retransmissionQueue.AddHandshake(&wire.PingFrame{})
|
||||||
handshakeStream.EXPECT().HasData()
|
handshakeStream.EXPECT().HasData()
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false)
|
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false)
|
||||||
packet, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
packet, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(packet).ToNot(BeNil())
|
Expect(packet).ToNot(BeNil())
|
||||||
Expect(packet.longHdrPackets).To(HaveLen(1))
|
Expect(packet.longHdrPackets).To(HaveLen(1))
|
||||||
|
@ -1212,11 +1210,13 @@ var _ = Describe("Packet packer", func() {
|
||||||
sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
|
sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false)
|
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false)
|
||||||
initialStream.EXPECT().HasData()
|
initialStream.EXPECT().HasData()
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
|
Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial))
|
||||||
Expect(p.longHdrPackets[0].frames).To(Equal([]ackhandler.Frame{{Frame: f}}))
|
Expect(p.longHdrPackets[0].frames).To(HaveLen(1))
|
||||||
|
Expect(p.longHdrPackets[0].frames[0].Frame).To(Equal(f))
|
||||||
|
Expect(p.longHdrPackets[0].frames[0].Handler).ToNot(BeNil())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("sends an Initial packet containing only an ACK", func() {
|
It("sends an Initial packet containing only an ACK", func() {
|
||||||
|
@ -1228,7 +1228,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
|
sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
|
||||||
pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
|
pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
|
||||||
pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
|
pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
Expect(p.longHdrPackets[0].ack).To(Equal(ack))
|
Expect(p.longHdrPackets[0].ack).To(Equal(ack))
|
||||||
|
@ -1240,7 +1240,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
|
sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
|
||||||
initialStream.EXPECT().HasData()
|
initialStream.EXPECT().HasData()
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true)
|
ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true)
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).To(BeNil())
|
Expect(p).To(BeNil())
|
||||||
})
|
})
|
||||||
|
@ -1256,7 +1256,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
|
sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable)
|
||||||
pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
|
pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
|
||||||
pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
|
pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
Expect(p.longHdrPackets[0].ack).To(Equal(ack))
|
Expect(p.longHdrPackets[0].ack).To(Equal(ack))
|
||||||
|
@ -1279,7 +1279,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
initialStream.EXPECT().HasData().Return(true).Times(2)
|
initialStream.EXPECT().HasData().Return(true).Times(2)
|
||||||
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f)
|
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f)
|
||||||
packer.perspective = protocol.PerspectiveClient
|
packer.perspective = protocol.PerspectiveClient
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
|
Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize))
|
||||||
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize))
|
||||||
|
@ -1304,7 +1304,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
initialStream.EXPECT().HasData().Return(true).Times(2)
|
initialStream.EXPECT().HasData().Return(true).Times(2)
|
||||||
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f)
|
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f)
|
||||||
packer.perspective = protocol.PerspectiveClient
|
packer.perspective = protocol.PerspectiveClient
|
||||||
p, err := packer.PackCoalescedPacket(false, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
Expect(p.longHdrPackets[0].ack).To(Equal(ack))
|
Expect(p.longHdrPackets[0].ack).To(Equal(ack))
|
||||||
|
@ -1327,7 +1327,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
|
pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
|
||||||
pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
|
pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
|
||||||
|
|
||||||
p, err := packer.MaybePackProbePacket(protocol.EncryptionInitial, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.MaybePackProbePacket(protocol.EncryptionInitial, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(p.longHdrPackets).To(HaveLen(1))
|
Expect(p.longHdrPackets).To(HaveLen(1))
|
||||||
|
@ -1349,7 +1349,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1)
|
pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1)
|
||||||
pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
|
pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42))
|
||||||
|
|
||||||
p, err := packer.MaybePackProbePacket(protocol.EncryptionInitial, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.MaybePackProbePacket(protocol.EncryptionInitial, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
|
@ -1373,7 +1373,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
|
pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
|
||||||
pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
|
pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
|
||||||
|
|
||||||
p, err := packer.MaybePackProbePacket(protocol.EncryptionHandshake, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.MaybePackProbePacket(protocol.EncryptionHandshake, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
|
@ -1394,7 +1394,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
|
pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
|
||||||
pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
|
pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42))
|
||||||
|
|
||||||
p, err := packer.MaybePackProbePacket(protocol.EncryptionHandshake, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.MaybePackProbePacket(protocol.EncryptionHandshake, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
|
@ -1418,7 +1418,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
expectAppendControlFrames()
|
expectAppendControlFrames()
|
||||||
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f})
|
expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f})
|
||||||
|
|
||||||
p, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(p.longHdrPackets).To(BeEmpty())
|
Expect(p.longHdrPackets).To(BeEmpty())
|
||||||
|
@ -1444,7 +1444,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
return append(fs, ackhandler.StreamFrame{Frame: sf}), sf.Length(v)
|
return append(fs, ackhandler.StreamFrame{Frame: sf}), sf.Length(v)
|
||||||
})
|
})
|
||||||
|
|
||||||
p, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, time.Now(), protocol.Version1)
|
p, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).ToNot(BeNil())
|
Expect(p).ToNot(BeNil())
|
||||||
Expect(p.longHdrPackets).To(BeEmpty())
|
Expect(p.longHdrPackets).To(BeEmpty())
|
||||||
|
@ -1461,7 +1461,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true)
|
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true)
|
||||||
framer.EXPECT().HasData()
|
framer.EXPECT().HasData()
|
||||||
|
|
||||||
packet, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, time.Now(), protocol.Version1)
|
packet, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(packet).To(BeNil())
|
Expect(packet).To(BeNil())
|
||||||
})
|
})
|
||||||
|
@ -1472,7 +1472,7 @@ var _ = Describe("Packet packer", func() {
|
||||||
pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x43))
|
pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x43))
|
||||||
ping := ackhandler.Frame{Frame: &wire.PingFrame{}}
|
ping := ackhandler.Frame{Frame: &wire.PingFrame{}}
|
||||||
const probePacketSize = maxPacketSize + 42
|
const probePacketSize = maxPacketSize + 42
|
||||||
p, buffer, err := packer.PackMTUProbePacket(ping, probePacketSize, time.Now(), protocol.Version1)
|
p, buffer, err := packer.PackMTUProbePacket(ping, probePacketSize, protocol.Version1)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p.Length).To(BeEquivalentTo(probePacketSize))
|
Expect(p.Length).To(BeEquivalentTo(probePacketSize))
|
||||||
Expect(p.PacketNumber).To(Equal(protocol.PacketNumber(0x43)))
|
Expect(p.PacketNumber).To(Equal(protocol.PacketNumber(0x43)))
|
||||||
|
@ -1482,29 +1482,3 @@ var _ = Describe("Packet packer", func() {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
var _ = Describe("Converting to ackhandler.Packet", func() {
|
|
||||||
It("convert a packet", func() {
|
|
||||||
packet := &longHeaderPacket{
|
|
||||||
header: &wire.ExtendedHeader{Header: wire.Header{Type: protocol.PacketTypeInitial}},
|
|
||||||
frames: []ackhandler.Frame{{Frame: &wire.MaxDataFrame{}}, {Frame: &wire.PingFrame{}}},
|
|
||||||
ack: &wire.AckFrame{AckRanges: []wire.AckRange{{Largest: 100, Smallest: 80}}},
|
|
||||||
length: 42,
|
|
||||||
}
|
|
||||||
t := time.Now()
|
|
||||||
p := packet.ToAckHandlerPacket(t, nil)
|
|
||||||
Expect(p.Length).To(Equal(protocol.ByteCount(42)))
|
|
||||||
Expect(p.Frames).To(Equal(packet.frames))
|
|
||||||
Expect(p.LargestAcked).To(Equal(protocol.PacketNumber(100)))
|
|
||||||
Expect(p.SendTime).To(Equal(t))
|
|
||||||
})
|
|
||||||
|
|
||||||
It("sets the LargestAcked to invalid, if the packet doesn't have an ACK frame", func() {
|
|
||||||
packet := &longHeaderPacket{
|
|
||||||
header: &wire.ExtendedHeader{Header: wire.Header{Type: protocol.PacketTypeHandshake}},
|
|
||||||
frames: []ackhandler.Frame{{Frame: &wire.MaxDataFrame{}}, {Frame: &wire.PingFrame{}}},
|
|
||||||
}
|
|
||||||
p := packet.ToAckHandlerPacket(time.Now(), nil)
|
|
||||||
Expect(p.LargestAcked).To(Equal(protocol.InvalidPacketNumber))
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue