forked from quic-go/quic-go
Merge pull request #1561 from lucas-clemente/add-acks-to-crypto-packets
add ACK frames to crypto packets
This commit is contained in:
@@ -343,8 +343,13 @@ func (p *packetPacker) maybePackCryptoPacket() (*packedPacket, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var length protocol.ByteCount
|
var length protocol.ByteCount
|
||||||
|
frames := make([]wire.Frame, 0, 2)
|
||||||
|
if ack := p.acks.GetAckFrame(); ack != nil {
|
||||||
|
frames = append(frames, ack)
|
||||||
|
length += ack.Length(p.version)
|
||||||
|
}
|
||||||
cf := s.PopCryptoFrame(p.maxPacketSize - hdrLen - protocol.ByteCount(sealer.Overhead()) - length)
|
cf := s.PopCryptoFrame(p.maxPacketSize - hdrLen - protocol.ByteCount(sealer.Overhead()) - length)
|
||||||
frames := []wire.Frame{cf}
|
frames = append(frames, cf)
|
||||||
raw, err := p.writeAndSealPacket(hdr, frames, sealer)
|
raw, err := p.writeAndSealPacket(hdr, frames, sealer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -664,6 +664,7 @@ var _ = Describe("Packet packer", func() {
|
|||||||
Offset: 0x1337,
|
Offset: 0x1337,
|
||||||
Data: []byte("foobar"),
|
Data: []byte("foobar"),
|
||||||
}
|
}
|
||||||
|
ackFramer.EXPECT().GetAckFrame()
|
||||||
initialStream.EXPECT().HasData().Return(true)
|
initialStream.EXPECT().HasData().Return(true)
|
||||||
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f)
|
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f)
|
||||||
sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionInitial).Return(sealer, nil)
|
sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionInitial).Return(sealer, nil)
|
||||||
@@ -676,6 +677,7 @@ var _ = Describe("Packet packer", func() {
|
|||||||
var f *wire.CryptoFrame
|
var f *wire.CryptoFrame
|
||||||
packer.version = versionIETFFrames
|
packer.version = versionIETFFrames
|
||||||
sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionHandshake).Return(sealer, nil)
|
sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionHandshake).Return(sealer, nil)
|
||||||
|
ackFramer.EXPECT().GetAckFrame()
|
||||||
initialStream.EXPECT().HasData()
|
initialStream.EXPECT().HasData()
|
||||||
handshakeStream.EXPECT().HasData().Return(true)
|
handshakeStream.EXPECT().HasData().Return(true)
|
||||||
handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
|
handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame {
|
||||||
@@ -694,10 +696,9 @@ var _ = Describe("Packet packer", func() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
It("pads Initial packets to the required minimum packet size", func() {
|
It("pads Initial packets to the required minimum packet size", func() {
|
||||||
f := &wire.CryptoFrame{
|
f := &wire.CryptoFrame{Data: []byte("foobar")}
|
||||||
Data: []byte("foobar"),
|
|
||||||
}
|
|
||||||
sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionInitial).Return(sealer, nil)
|
sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionInitial).Return(sealer, nil)
|
||||||
|
ackFramer.EXPECT().GetAckFrame()
|
||||||
initialStream.EXPECT().HasData().Return(true)
|
initialStream.EXPECT().HasData().Return(true)
|
||||||
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f)
|
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f)
|
||||||
packer.version = protocol.VersionTLS
|
packer.version = protocol.VersionTLS
|
||||||
@@ -714,6 +715,7 @@ var _ = Describe("Packet packer", func() {
|
|||||||
|
|
||||||
It("sets the correct payload length for an Initial packet", func() {
|
It("sets the correct payload length for an Initial packet", func() {
|
||||||
sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionInitial).Return(sealer, nil)
|
sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionInitial).Return(sealer, nil)
|
||||||
|
ackFramer.EXPECT().GetAckFrame()
|
||||||
initialStream.EXPECT().HasData().Return(true)
|
initialStream.EXPECT().HasData().Return(true)
|
||||||
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(&wire.CryptoFrame{
|
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(&wire.CryptoFrame{
|
||||||
Data: []byte("foobar"),
|
Data: []byte("foobar"),
|
||||||
@@ -725,6 +727,24 @@ var _ = Describe("Packet packer", func() {
|
|||||||
checkPayloadLen(packet.raw)
|
checkPayloadLen(packet.raw)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("adds an ACK frame", func() {
|
||||||
|
f := &wire.CryptoFrame{Data: []byte("foobar")}
|
||||||
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 42, Largest: 1337}}}
|
||||||
|
sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionInitial).Return(sealer, nil)
|
||||||
|
ackFramer.EXPECT().GetAckFrame().Return(ack)
|
||||||
|
initialStream.EXPECT().HasData().Return(true)
|
||||||
|
initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f)
|
||||||
|
packer.version = protocol.VersionTLS
|
||||||
|
packer.hasSentPacket = false
|
||||||
|
packer.perspective = protocol.PerspectiveClient
|
||||||
|
packet, err := packer.PackPacket()
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(packet.header.Token).To(Equal(token))
|
||||||
|
Expect(packet.raw).To(HaveLen(protocol.MinInitialPacketSize))
|
||||||
|
Expect(packet.frames).To(HaveLen(2))
|
||||||
|
Expect(packet.frames[0]).To(Equal(ack))
|
||||||
|
})
|
||||||
|
|
||||||
Context("retransmitions", func() {
|
Context("retransmitions", func() {
|
||||||
sf := &wire.StreamFrame{Data: []byte("foobar")}
|
sf := &wire.StreamFrame{Data: []byte("foobar")}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user