From e470d71c3a4ef716f114a07edbb4975f3183b685 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 29 Oct 2018 13:34:32 +0700 Subject: [PATCH] add ACK frames to crypto packets --- packet_packer.go | 7 ++++++- packet_packer_test.go | 26 +++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/packet_packer.go b/packet_packer.go index afde1d91e..f7e75ad58 100644 --- a/packet_packer.go +++ b/packet_packer.go @@ -343,8 +343,13 @@ func (p *packetPacker) maybePackCryptoPacket() (*packedPacket, error) { return nil, err } 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) - frames := []wire.Frame{cf} + frames = append(frames, cf) raw, err := p.writeAndSealPacket(hdr, frames, sealer) if err != nil { return nil, err diff --git a/packet_packer_test.go b/packet_packer_test.go index b70a77a5a..5a707b3eb 100644 --- a/packet_packer_test.go +++ b/packet_packer_test.go @@ -664,6 +664,7 @@ var _ = Describe("Packet packer", func() { Offset: 0x1337, Data: []byte("foobar"), } + ackFramer.EXPECT().GetAckFrame() initialStream.EXPECT().HasData().Return(true) initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f) sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionInitial).Return(sealer, nil) @@ -676,6 +677,7 @@ var _ = Describe("Packet packer", func() { var f *wire.CryptoFrame packer.version = versionIETFFrames sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionHandshake).Return(sealer, nil) + ackFramer.EXPECT().GetAckFrame() initialStream.EXPECT().HasData() handshakeStream.EXPECT().HasData().Return(true) 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() { - f := &wire.CryptoFrame{ - Data: []byte("foobar"), - } + f := &wire.CryptoFrame{Data: []byte("foobar")} sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionInitial).Return(sealer, nil) + ackFramer.EXPECT().GetAckFrame() initialStream.EXPECT().HasData().Return(true) initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f) packer.version = protocol.VersionTLS @@ -714,6 +715,7 @@ var _ = Describe("Packet packer", func() { It("sets the correct payload length for an Initial packet", func() { sealingManager.EXPECT().GetSealerWithEncryptionLevel(protocol.EncryptionInitial).Return(sealer, nil) + ackFramer.EXPECT().GetAckFrame() initialStream.EXPECT().HasData().Return(true) initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(&wire.CryptoFrame{ Data: []byte("foobar"), @@ -725,6 +727,24 @@ var _ = Describe("Packet packer", func() { 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() { sf := &wire.StreamFrame{Data: []byte("foobar")}