github.com/mikelsr/quic-go@v0.36.1-0.20230701132136-1d9415b66898/packet_packer_test.go (about) 1 package quic 2 3 import ( 4 "bytes" 5 "fmt" 6 "math/rand" 7 "net" 8 "time" 9 10 "github.com/mikelsr/quic-go/internal/ackhandler" 11 "github.com/mikelsr/quic-go/internal/handshake" 12 "github.com/mikelsr/quic-go/internal/mocks" 13 mockackhandler "github.com/mikelsr/quic-go/internal/mocks/ackhandler" 14 "github.com/mikelsr/quic-go/internal/protocol" 15 "github.com/mikelsr/quic-go/internal/qerr" 16 "github.com/mikelsr/quic-go/internal/utils" 17 "github.com/mikelsr/quic-go/internal/wire" 18 19 "github.com/golang/mock/gomock" 20 21 . "github.com/onsi/ginkgo/v2" 22 . "github.com/onsi/gomega" 23 ) 24 25 var _ = Describe("Packet packer", func() { 26 const maxPacketSize protocol.ByteCount = 1357 27 const version = protocol.Version1 28 29 var ( 30 packer *packetPacker 31 retransmissionQueue *retransmissionQueue 32 datagramQueue *datagramQueue 33 framer *MockFrameSource 34 ackFramer *MockAckFrameSource 35 initialStream *MockCryptoStream 36 handshakeStream *MockCryptoStream 37 sealingManager *MockSealingManager 38 pnManager *mockackhandler.MockSentPacketHandler 39 ) 40 connID := protocol.ParseConnectionID([]byte{1, 2, 3, 4, 5, 6, 7, 8}) 41 42 parsePacket := func(data []byte) (hdrs []*wire.ExtendedHeader, more []byte) { 43 for len(data) > 0 { 44 if !wire.IsLongHeaderPacket(data[0]) { 45 break 46 } 47 hdr, _, more, err := wire.ParsePacket(data) 48 Expect(err).ToNot(HaveOccurred()) 49 r := bytes.NewReader(data) 50 extHdr, err := hdr.ParseExtended(r, version) 51 Expect(err).ToNot(HaveOccurred()) 52 ExpectWithOffset(1, extHdr.Length).To(BeEquivalentTo(r.Len() - len(more) + int(extHdr.PacketNumberLen))) 53 ExpectWithOffset(1, extHdr.Length+protocol.ByteCount(extHdr.PacketNumberLen)).To(BeNumerically(">=", 4)) 54 data = more 55 hdrs = append(hdrs, extHdr) 56 } 57 return hdrs, data 58 } 59 60 parseShortHeaderPacket := func(data []byte) { 61 l, _, pnLen, _, err := wire.ParseShortHeader(data, connID.Len()) 62 ExpectWithOffset(1, err).ToNot(HaveOccurred()) 63 ExpectWithOffset(1, len(data)-l+int(pnLen)).To(BeNumerically(">=", 4)) 64 } 65 66 expectAppendStreamFrames := func(frames ...ackhandler.StreamFrame) { 67 framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(fs []ackhandler.StreamFrame, _ protocol.ByteCount, v protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) { 68 var length protocol.ByteCount 69 for _, f := range frames { 70 length += f.Frame.Length(v) 71 } 72 return append(fs, frames...), length 73 }) 74 } 75 76 expectAppendControlFrames := func(frames ...ackhandler.Frame) { 77 framer.EXPECT().AppendControlFrames(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(fs []ackhandler.Frame, _ protocol.ByteCount, v protocol.VersionNumber) ([]ackhandler.Frame, protocol.ByteCount) { 78 var length protocol.ByteCount 79 for _, f := range frames { 80 length += f.Frame.Length(v) 81 } 82 return append(fs, frames...), length 83 }) 84 } 85 86 BeforeEach(func() { 87 rand.Seed(GinkgoRandomSeed()) 88 retransmissionQueue = newRetransmissionQueue() 89 mockSender := NewMockStreamSender(mockCtrl) 90 mockSender.EXPECT().onHasStreamData(gomock.Any()).AnyTimes() 91 initialStream = NewMockCryptoStream(mockCtrl) 92 handshakeStream = NewMockCryptoStream(mockCtrl) 93 framer = NewMockFrameSource(mockCtrl) 94 ackFramer = NewMockAckFrameSource(mockCtrl) 95 sealingManager = NewMockSealingManager(mockCtrl) 96 pnManager = mockackhandler.NewMockSentPacketHandler(mockCtrl) 97 datagramQueue = newDatagramQueue(func() {}, utils.DefaultLogger) 98 99 packer = newPacketPacker(protocol.ParseConnectionID([]byte{1, 2, 3, 4, 5, 6, 7, 8}), func() protocol.ConnectionID { return connID }, initialStream, handshakeStream, pnManager, retransmissionQueue, sealingManager, framer, ackFramer, datagramQueue, protocol.PerspectiveServer) 100 }) 101 102 Context("determining the maximum packet size", func() { 103 It("uses the minimum initial size, if it can't determine if the remote address is IPv4 or IPv6", func() { 104 Expect(getMaxPacketSize(&net.TCPAddr{})).To(BeEquivalentTo(protocol.MinInitialPacketSize)) 105 }) 106 107 It("uses the maximum IPv4 packet size, if the remote address is IPv4", func() { 108 addr := &net.UDPAddr{IP: net.IPv4(11, 12, 13, 14), Port: 1337} 109 Expect(getMaxPacketSize(addr)).To(BeEquivalentTo(protocol.InitialPacketSizeIPv4)) 110 }) 111 112 It("uses the maximum IPv6 packet size, if the remote address is IPv6", func() { 113 ip := net.ParseIP("2001:0db8:85a3:0000:0000:8a2e:0370:7334") 114 addr := &net.UDPAddr{IP: ip, Port: 1337} 115 Expect(getMaxPacketSize(addr)).To(BeEquivalentTo(protocol.InitialPacketSizeIPv6)) 116 }) 117 }) 118 119 Context("generating a packet header", func() { 120 It("uses the Long Header format", func() { 121 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen3) 122 h := packer.getLongHeader(protocol.EncryptionHandshake, protocol.Version1) 123 Expect(h.PacketNumber).To(Equal(protocol.PacketNumber(0x42))) 124 Expect(h.PacketNumberLen).To(Equal(protocol.PacketNumberLen3)) 125 Expect(h.Version).To(Equal(protocol.Version1)) 126 }) 127 128 It("sets source and destination connection ID", func() { 129 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 130 srcConnID := protocol.ParseConnectionID([]byte{1, 2, 3, 4, 5, 6, 7, 8}) 131 destConnID := protocol.ParseConnectionID([]byte{8, 7, 6, 5, 4, 3, 2, 1}) 132 packer.srcConnID = srcConnID 133 packer.getDestConnID = func() protocol.ConnectionID { return destConnID } 134 h := packer.getLongHeader(protocol.EncryptionHandshake, protocol.Version1) 135 Expect(h.SrcConnectionID).To(Equal(srcConnID)) 136 Expect(h.DestConnectionID).To(Equal(destConnID)) 137 }) 138 }) 139 140 Context("encrypting packets", func() { 141 It("encrypts a packet", func() { 142 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x1337), protocol.PacketNumberLen2) 143 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x1337)) 144 sealer := mocks.NewMockShortHeaderSealer(mockCtrl) 145 sealer.EXPECT().Overhead().Return(4).AnyTimes() 146 var hdrRaw []byte 147 gomock.InOrder( 148 sealer.EXPECT().KeyPhase().Return(protocol.KeyPhaseOne), 149 sealer.EXPECT().Seal(gomock.Any(), gomock.Any(), protocol.PacketNumber(0x1337), gomock.Any()).DoAndReturn(func(_, src []byte, _ protocol.PacketNumber, aad []byte) []byte { 150 hdrRaw = append([]byte{}, aad...) 151 return append(src, []byte{0xde, 0xca, 0xfb, 0xad}...) 152 }), 153 sealer.EXPECT().EncryptHeader(gomock.Any(), gomock.Any(), gomock.Any()).Do(func(sample []byte, firstByte *byte, pnBytes []byte) { 154 Expect(firstByte).To(Equal(&hdrRaw[0])) 155 Expect(pnBytes).To(Equal(hdrRaw[len(hdrRaw)-2:])) 156 *firstByte ^= 0xff // invert the first byte 157 // invert the packet number bytes 158 for i := range pnBytes { 159 pnBytes[i] ^= 0xff 160 } 161 }), 162 ) 163 framer.EXPECT().HasData().Return(true) 164 sealingManager.EXPECT().GetInitialSealer().Return(nil, nil) 165 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, nil) 166 sealingManager.EXPECT().Get1RTTSealer().Return(sealer, nil) 167 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 168 expectAppendControlFrames() 169 f := &wire.StreamFrame{Data: []byte{0xde, 0xca, 0xfb, 0xad}} 170 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f}) 171 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 172 Expect(err).ToNot(HaveOccurred()) 173 Expect(p).ToNot(BeNil()) 174 Expect(p.longHdrPackets).To(BeEmpty()) 175 Expect(p.shortHdrPacket).ToNot(BeNil()) 176 Expect(p.shortHdrPacket.Frames).To(BeEmpty()) 177 Expect(p.shortHdrPacket.StreamFrames).To(HaveLen(1)) 178 Expect(p.shortHdrPacket.StreamFrames[0].Frame).To(Equal(f)) 179 hdrRawEncrypted := append([]byte{}, hdrRaw...) 180 hdrRawEncrypted[0] ^= 0xff 181 hdrRawEncrypted[len(hdrRaw)-2] ^= 0xff 182 hdrRawEncrypted[len(hdrRaw)-1] ^= 0xff 183 Expect(p.buffer.Data[0:len(hdrRaw)]).To(Equal(hdrRawEncrypted)) 184 Expect(p.buffer.Data[p.buffer.Len()-4:]).To(Equal([]byte{0xde, 0xca, 0xfb, 0xad})) 185 }) 186 }) 187 188 Context("packing packets", func() { 189 // getSealer gets a sealer that's expected to seal exactly one packet 190 getSealer := func() *mocks.MockShortHeaderSealer { 191 sealer := mocks.NewMockShortHeaderSealer(mockCtrl) 192 sealer.EXPECT().KeyPhase().Return(protocol.KeyPhaseOne).AnyTimes() 193 sealer.EXPECT().Overhead().Return(7).AnyTimes() 194 sealer.EXPECT().EncryptHeader(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() 195 sealer.EXPECT().Seal(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(dst, src []byte, pn protocol.PacketNumber, associatedData []byte) []byte { 196 return append(src, bytes.Repeat([]byte{'s'}, sealer.Overhead())...) 197 }).AnyTimes() 198 return sealer 199 } 200 201 Context("packing ACK packets", func() { 202 It("doesn't pack a packet if there's no ACK to send", func() { 203 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 204 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 205 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 206 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 207 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true) 208 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true) 209 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true) 210 p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1) 211 Expect(err).ToNot(HaveOccurred()) 212 Expect(p).To(BeNil()) 213 }) 214 215 It("packs Initial ACK-only packets, and pads them (for the client)", func() { 216 packer.perspective = protocol.PerspectiveClient 217 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 218 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 219 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 220 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}} 221 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack) 222 p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1) 223 Expect(err).NotTo(HaveOccurred()) 224 Expect(p).ToNot(BeNil()) 225 Expect(p.longHdrPackets).To(HaveLen(1)) 226 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 227 Expect(p.longHdrPackets[0].ack).To(Equal(ack)) 228 Expect(p.longHdrPackets[0].frames).To(BeEmpty()) 229 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 230 parsePacket(p.buffer.Data) 231 }) 232 233 It("packs Initial ACK-only packets, and doesn't pads them (for the server)", func() { 234 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 235 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 236 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 237 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}} 238 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack) 239 p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1) 240 Expect(err).NotTo(HaveOccurred()) 241 Expect(p).ToNot(BeNil()) 242 Expect(p.longHdrPackets).To(HaveLen(1)) 243 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 244 Expect(p.longHdrPackets[0].ack).To(Equal(ack)) 245 Expect(p.longHdrPackets[0].frames).To(BeEmpty()) 246 Expect(p.buffer.Len()).To(BeNumerically("<", 100)) 247 parsePacket(p.buffer.Data) 248 }) 249 250 It("packs 1-RTT ACK-only packets, before handshake confirmation", func() { 251 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 252 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 253 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 254 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 255 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 256 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}} 257 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true) 258 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack) 259 p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1) 260 Expect(err).NotTo(HaveOccurred()) 261 Expect(p).ToNot(BeNil()) 262 Expect(p.longHdrPackets).To(BeEmpty()) 263 Expect(p.shortHdrPacket).ToNot(BeNil()) 264 Expect(p.shortHdrPacket.Ack).To(Equal(ack)) 265 Expect(p.shortHdrPacket.Frames).To(BeEmpty()) 266 parsePacket(p.buffer.Data) 267 }) 268 269 It("packs 1-RTT ACK-only packets, after handshake confirmation", func() { 270 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 271 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 272 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 273 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}} 274 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack) 275 p, buffer, err := packer.PackAckOnlyPacket(maxPacketSize, protocol.Version1) 276 Expect(err).NotTo(HaveOccurred()) 277 Expect(p).ToNot(BeNil()) 278 Expect(p.Ack).To(Equal(ack)) 279 Expect(p.Frames).To(BeEmpty()) 280 parsePacket(buffer.Data) 281 }) 282 }) 283 284 Context("packing 0-RTT packets", func() { 285 BeforeEach(func() { 286 packer.perspective = protocol.PerspectiveClient 287 sealingManager.EXPECT().GetInitialSealer().Return(nil, nil).AnyTimes() 288 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, nil).AnyTimes() 289 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable).AnyTimes() 290 initialStream.EXPECT().HasData().AnyTimes() 291 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).AnyTimes() 292 handshakeStream.EXPECT().HasData().AnyTimes() 293 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true).AnyTimes() 294 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).AnyTimes() 295 }) 296 297 It("packs a 0-RTT packet", func() { 298 sealingManager.EXPECT().Get0RTTSealer().Return(getSealer(), nil).AnyTimes() 299 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 300 pnManager.EXPECT().PopPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(0x42)) 301 cf := ackhandler.Frame{Frame: &wire.MaxDataFrame{MaximumData: 0x1337}} 302 framer.EXPECT().HasData().Return(true) 303 framer.EXPECT().AppendControlFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(frames []ackhandler.Frame, _ protocol.ByteCount, v protocol.VersionNumber) ([]ackhandler.Frame, protocol.ByteCount) { 304 Expect(frames).To(BeEmpty()) 305 return append(frames, cf), cf.Frame.Length(v) 306 }) 307 // TODO: check sizes 308 framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(frames []ackhandler.StreamFrame, _ protocol.ByteCount, _ protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) { 309 return frames, 0 310 }) 311 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 312 Expect(p).ToNot(BeNil()) 313 Expect(err).ToNot(HaveOccurred()) 314 Expect(p.longHdrPackets).To(HaveLen(1)) 315 Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketType0RTT)) 316 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.Encryption0RTT)) 317 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 318 Expect(p.longHdrPackets[0].frames[0].Frame).To(Equal(cf.Frame)) 319 Expect(p.longHdrPackets[0].frames[0].Handler).ToNot(BeNil()) 320 }) 321 322 It("doesn't add an ACK-only 0-RTT packet", func() { // ACK frames cannot be sent in 0-RTT packets 323 p, err := packer.PackCoalescedPacket(true, protocol.MaxByteCount, protocol.Version1) 324 Expect(err).ToNot(HaveOccurred()) 325 Expect(p).To(BeNil()) 326 }) 327 }) 328 329 Context("packing CONNECTION_CLOSE", func() { 330 It("clears the reason phrase for crypto errors", func() { 331 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 332 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 333 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 334 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 335 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 336 quicErr := qerr.NewLocalCryptoError(0x42, "crypto error") 337 quicErr.FrameType = 0x1234 338 p, err := packer.PackConnectionClose(quicErr, maxPacketSize, protocol.Version1) 339 Expect(err).ToNot(HaveOccurred()) 340 Expect(p.longHdrPackets).To(HaveLen(1)) 341 Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeHandshake)) 342 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 343 Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 344 ccf := p.longHdrPackets[0].frames[0].Frame.(*wire.ConnectionCloseFrame) 345 Expect(ccf.IsApplicationError).To(BeFalse()) 346 Expect(ccf.ErrorCode).To(BeEquivalentTo(0x100 + 0x42)) 347 Expect(ccf.FrameType).To(BeEquivalentTo(0x1234)) 348 Expect(ccf.ReasonPhrase).To(BeEmpty()) 349 }) 350 351 It("packs a CONNECTION_CLOSE in 1-RTT", func() { 352 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 353 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 354 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 355 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysDropped) 356 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 357 // expect no framer.PopStreamFrames 358 p, err := packer.PackConnectionClose(&qerr.TransportError{ 359 ErrorCode: qerr.CryptoBufferExceeded, 360 ErrorMessage: "test error", 361 }, maxPacketSize, protocol.Version1) 362 Expect(err).ToNot(HaveOccurred()) 363 Expect(p.longHdrPackets).To(BeEmpty()) 364 Expect(p.shortHdrPacket.Frames).To(HaveLen(1)) 365 Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 366 ccf := p.shortHdrPacket.Frames[0].Frame.(*wire.ConnectionCloseFrame) 367 Expect(ccf.IsApplicationError).To(BeFalse()) 368 Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.CryptoBufferExceeded)) 369 Expect(ccf.ReasonPhrase).To(Equal("test error")) 370 }) 371 372 It("packs a CONNECTION_CLOSE in all available encryption levels, and replaces application errors in Initial and Handshake", func() { 373 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(1), protocol.PacketNumberLen2) 374 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(1)) 375 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(2), protocol.PacketNumberLen2) 376 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(2)) 377 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(3), protocol.PacketNumberLen2) 378 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(3)) 379 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 380 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 381 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 382 p, err := packer.PackApplicationClose(&qerr.ApplicationError{ 383 ErrorCode: 0x1337, 384 ErrorMessage: "test error", 385 }, maxPacketSize, protocol.Version1) 386 Expect(err).ToNot(HaveOccurred()) 387 Expect(p.longHdrPackets).To(HaveLen(2)) 388 Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeInitial)) 389 Expect(p.longHdrPackets[0].header.PacketNumber).To(Equal(protocol.PacketNumber(1))) 390 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 391 Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 392 ccf := p.longHdrPackets[0].frames[0].Frame.(*wire.ConnectionCloseFrame) 393 Expect(ccf.IsApplicationError).To(BeFalse()) 394 Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.ApplicationErrorErrorCode)) 395 Expect(ccf.ReasonPhrase).To(BeEmpty()) 396 Expect(p.longHdrPackets[1].header.Type).To(Equal(protocol.PacketTypeHandshake)) 397 Expect(p.longHdrPackets[1].header.PacketNumber).To(Equal(protocol.PacketNumber(2))) 398 Expect(p.longHdrPackets[1].frames).To(HaveLen(1)) 399 Expect(p.longHdrPackets[1].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 400 ccf = p.longHdrPackets[1].frames[0].Frame.(*wire.ConnectionCloseFrame) 401 Expect(ccf.IsApplicationError).To(BeFalse()) 402 Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.ApplicationErrorErrorCode)) 403 Expect(ccf.ReasonPhrase).To(BeEmpty()) 404 Expect(p.shortHdrPacket).ToNot(BeNil()) 405 Expect(p.shortHdrPacket.PacketNumber).To(Equal(protocol.PacketNumber(3))) 406 Expect(p.shortHdrPacket.Frames).To(HaveLen(1)) 407 Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 408 ccf = p.shortHdrPacket.Frames[0].Frame.(*wire.ConnectionCloseFrame) 409 Expect(ccf.IsApplicationError).To(BeTrue()) 410 Expect(ccf.ErrorCode).To(BeEquivalentTo(0x1337)) 411 Expect(ccf.ReasonPhrase).To(Equal("test error")) 412 }) 413 414 It("packs a CONNECTION_CLOSE in all available encryption levels, as a client", func() { 415 packer.perspective = protocol.PerspectiveClient 416 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(1), protocol.PacketNumberLen2) 417 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(1)) 418 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(2), protocol.PacketNumberLen2) 419 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(2)) 420 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 421 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 422 sealingManager.EXPECT().Get0RTTSealer().Return(nil, handshake.ErrKeysDropped) 423 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 424 p, err := packer.PackApplicationClose(&qerr.ApplicationError{ 425 ErrorCode: 0x1337, 426 ErrorMessage: "test error", 427 }, maxPacketSize, protocol.Version1) 428 Expect(err).ToNot(HaveOccurred()) 429 Expect(p.longHdrPackets).To(HaveLen(1)) 430 Expect(p.buffer.Len()).To(BeNumerically("<", protocol.MinInitialPacketSize)) 431 Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeHandshake)) 432 Expect(p.longHdrPackets[0].header.PacketNumber).To(Equal(protocol.PacketNumber(1))) 433 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 434 Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 435 ccf := p.longHdrPackets[0].frames[0].Frame.(*wire.ConnectionCloseFrame) 436 Expect(ccf.IsApplicationError).To(BeFalse()) 437 Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.ApplicationErrorErrorCode)) 438 Expect(ccf.ReasonPhrase).To(BeEmpty()) 439 Expect(p.shortHdrPacket).ToNot(BeNil()) 440 Expect(p.shortHdrPacket.PacketNumber).To(Equal(protocol.PacketNumber(2))) 441 Expect(p.shortHdrPacket.Frames).To(HaveLen(1)) 442 Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 443 ccf = p.shortHdrPacket.Frames[0].Frame.(*wire.ConnectionCloseFrame) 444 Expect(ccf.IsApplicationError).To(BeTrue()) 445 Expect(ccf.ErrorCode).To(BeEquivalentTo(0x1337)) 446 Expect(ccf.ReasonPhrase).To(Equal("test error")) 447 }) 448 449 It("packs a CONNECTION_CLOSE in all available encryption levels and pads, as a client", func() { 450 packer.perspective = protocol.PerspectiveClient 451 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(1), protocol.PacketNumberLen2) 452 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(1)) 453 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(2), protocol.PacketNumberLen2) 454 pnManager.EXPECT().PopPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(2)) 455 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 456 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 457 sealingManager.EXPECT().Get0RTTSealer().Return(getSealer(), nil) 458 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 459 p, err := packer.PackApplicationClose(&qerr.ApplicationError{ 460 ErrorCode: 0x1337, 461 ErrorMessage: "test error", 462 }, maxPacketSize, protocol.Version1) 463 Expect(err).ToNot(HaveOccurred()) 464 Expect(p.longHdrPackets).To(HaveLen(2)) 465 Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize)) 466 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 467 Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeInitial)) 468 Expect(p.longHdrPackets[0].header.PacketNumber).To(Equal(protocol.PacketNumber(1))) 469 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 470 Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 471 ccf := p.longHdrPackets[0].frames[0].Frame.(*wire.ConnectionCloseFrame) 472 Expect(ccf.IsApplicationError).To(BeFalse()) 473 Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.ApplicationErrorErrorCode)) 474 Expect(ccf.ReasonPhrase).To(BeEmpty()) 475 Expect(p.longHdrPackets[1].header.Type).To(Equal(protocol.PacketType0RTT)) 476 Expect(p.longHdrPackets[1].header.PacketNumber).To(Equal(protocol.PacketNumber(2))) 477 Expect(p.longHdrPackets[1].frames).To(HaveLen(1)) 478 Expect(p.longHdrPackets[1].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 479 ccf = p.longHdrPackets[1].frames[0].Frame.(*wire.ConnectionCloseFrame) 480 Expect(ccf.IsApplicationError).To(BeTrue()) 481 Expect(ccf.ErrorCode).To(BeEquivalentTo(0x1337)) 482 Expect(ccf.ReasonPhrase).To(Equal("test error")) 483 hdrs, more := parsePacket(p.buffer.Data) 484 Expect(hdrs).To(HaveLen(2)) 485 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 486 Expect(hdrs[1].Type).To(Equal(protocol.PacketType0RTT)) 487 Expect(more).To(BeEmpty()) 488 }) 489 }) 490 491 Context("packing normal packets", func() { 492 It("returns nil when no packet is queued", func() { 493 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 494 // don't expect any calls to PopPacketNumber 495 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 496 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true) 497 framer.EXPECT().HasData() 498 _, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 499 Expect(err).To(MatchError(errNothingToPack)) 500 }) 501 502 It("appends single packets", func() { 503 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 504 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 505 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 506 framer.EXPECT().HasData().Return(true) 507 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 508 expectAppendControlFrames() 509 f := &wire.StreamFrame{ 510 StreamID: 5, 511 Data: []byte{0xde, 0xca, 0xfb, 0xad}, 512 } 513 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f}) 514 buffer := getPacketBuffer() 515 buffer.Data = append(buffer.Data, []byte("foobar")...) 516 p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1) 517 Expect(err).ToNot(HaveOccurred()) 518 Expect(p).ToNot(BeNil()) 519 b, err := f.Append(nil, protocol.Version1) 520 Expect(err).ToNot(HaveOccurred()) 521 Expect(p.Frames).To(BeEmpty()) 522 Expect(p.StreamFrames).To(HaveLen(1)) 523 Expect(p.StreamFrames[0].Frame.StreamID).To(Equal(f.StreamID)) 524 Expect(buffer.Data[:6]).To(Equal([]byte("foobar"))) // make sure the packet was actually appended 525 Expect(buffer.Data).To(ContainSubstring(string(b))) 526 }) 527 528 It("packs a single ACK", func() { 529 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 530 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 531 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Largest: 42, Smallest: 1}}} 532 framer.EXPECT().HasData() 533 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack) 534 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 535 p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 536 Expect(err).NotTo(HaveOccurred()) 537 Expect(p).ToNot(BeNil()) 538 Expect(p.Ack).To(Equal(ack)) 539 }) 540 541 It("packs control frames", func() { 542 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 543 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 544 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 545 framer.EXPECT().HasData().Return(true) 546 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 547 frames := []ackhandler.Frame{ 548 {Frame: &wire.ResetStreamFrame{}}, 549 {Frame: &wire.MaxDataFrame{}}, 550 } 551 expectAppendControlFrames(frames...) 552 expectAppendStreamFrames() 553 buffer := getPacketBuffer() 554 p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1) 555 Expect(p).ToNot(BeNil()) 556 Expect(err).ToNot(HaveOccurred()) 557 Expect(p.Frames).To(HaveLen(2)) 558 for i, f := range p.Frames { 559 Expect(f).To(BeAssignableToTypeOf(frames[i])) 560 } 561 Expect(buffer.Len()).ToNot(BeZero()) 562 }) 563 564 It("packs DATAGRAM frames", func() { 565 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true) 566 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 567 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 568 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 569 f := &wire.DatagramFrame{ 570 DataLenPresent: true, 571 Data: []byte("foobar"), 572 } 573 done := make(chan struct{}) 574 go func() { 575 defer GinkgoRecover() 576 defer close(done) 577 datagramQueue.AddAndWait(f) 578 }() 579 // make sure the DATAGRAM has actually been queued 580 time.Sleep(scaleDuration(20 * time.Millisecond)) 581 582 framer.EXPECT().HasData() 583 buffer := getPacketBuffer() 584 p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1) 585 Expect(p).ToNot(BeNil()) 586 Expect(err).ToNot(HaveOccurred()) 587 Expect(p.Frames).To(HaveLen(1)) 588 Expect(p.Frames[0].Frame).To(Equal(f)) 589 Expect(buffer.Data).ToNot(BeEmpty()) 590 Eventually(done).Should(BeClosed()) 591 }) 592 593 It("doesn't pack a DATAGRAM frame if the ACK frame is too large", func() { 594 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Largest: 100}}}) 595 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 596 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 597 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 598 f := &wire.DatagramFrame{ 599 DataLenPresent: true, 600 Data: make([]byte, maxPacketSize-10), 601 } 602 done := make(chan struct{}) 603 go func() { 604 defer GinkgoRecover() 605 defer close(done) 606 datagramQueue.AddAndWait(f) 607 }() 608 // make sure the DATAGRAM has actually been queued 609 time.Sleep(scaleDuration(20 * time.Millisecond)) 610 611 framer.EXPECT().HasData() 612 buffer := getPacketBuffer() 613 p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1) 614 Expect(p).ToNot(BeNil()) 615 Expect(err).ToNot(HaveOccurred()) 616 Expect(p.Ack).ToNot(BeNil()) 617 Expect(p.Frames).To(BeEmpty()) 618 Expect(buffer.Data).ToNot(BeEmpty()) 619 datagramQueue.CloseWithError(nil) 620 Eventually(done).Should(BeClosed()) 621 }) 622 623 It("accounts for the space consumed by control frames", func() { 624 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 625 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 626 framer.EXPECT().HasData().Return(true) 627 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 628 var maxSize protocol.ByteCount 629 gomock.InOrder( 630 framer.EXPECT().AppendControlFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(fs []ackhandler.Frame, maxLen protocol.ByteCount, _ protocol.VersionNumber) ([]ackhandler.Frame, protocol.ByteCount) { 631 maxSize = maxLen 632 return fs, 444 633 }), 634 framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), protocol.Version1).Do(func(fs []ackhandler.StreamFrame, maxLen protocol.ByteCount, _ protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) { 635 Expect(maxLen).To(Equal(maxSize - 444)) 636 return fs, 0 637 }), 638 ) 639 _, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 640 Expect(err).To(MatchError(errNothingToPack)) 641 }) 642 643 It("pads if payload length + packet number length is smaller than 4, for Long Header packets", func() { 644 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 645 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 646 sealer := getSealer() 647 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 648 sealingManager.EXPECT().GetHandshakeSealer().Return(sealer, nil) 649 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 650 packer.retransmissionQueue.addHandshake(&wire.PingFrame{}) 651 handshakeStream.EXPECT().HasData() 652 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 653 packet, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 654 Expect(err).ToNot(HaveOccurred()) 655 Expect(packet).ToNot(BeNil()) 656 Expect(packet.longHdrPackets).To(HaveLen(1)) 657 // cut off the tag that the mock sealer added 658 // packet.buffer.Data = packet.buffer.Data[:packet.buffer.Len()-protocol.ByteCount(sealer.Overhead())] 659 hdr, _, _, err := wire.ParsePacket(packet.buffer.Data) 660 Expect(err).ToNot(HaveOccurred()) 661 data := packet.buffer.Data 662 r := bytes.NewReader(data) 663 extHdr, err := hdr.ParseExtended(r, protocol.Version1) 664 Expect(err).ToNot(HaveOccurred()) 665 Expect(extHdr.PacketNumberLen).To(Equal(protocol.PacketNumberLen1)) 666 Expect(r.Len()).To(Equal(4 - 1 /* packet number length */ + sealer.Overhead())) 667 // the first bytes of the payload should be a 2 PADDING frames... 668 firstPayloadByte, err := r.ReadByte() 669 Expect(err).ToNot(HaveOccurred()) 670 Expect(firstPayloadByte).To(Equal(byte(0))) 671 secondPayloadByte, err := r.ReadByte() 672 Expect(err).ToNot(HaveOccurred()) 673 Expect(secondPayloadByte).To(Equal(byte(0))) 674 // ... followed by the PING 675 frameParser := wire.NewFrameParser(false) 676 l, frame, err := frameParser.ParseNext(data[len(data)-r.Len():], protocol.Encryption1RTT, protocol.Version1) 677 Expect(err).ToNot(HaveOccurred()) 678 Expect(frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 679 Expect(r.Len() - l).To(Equal(sealer.Overhead())) 680 }) 681 682 It("pads if payload length + packet number length is smaller than 4", func() { 683 f := &wire.StreamFrame{ 684 StreamID: 0x10, // small stream ID, such that only a single byte is consumed 685 Fin: true, 686 } 687 Expect(f.Length(protocol.Version1)).To(BeEquivalentTo(2)) 688 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 689 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 690 sealer := getSealer() 691 sealingManager.EXPECT().Get1RTTSealer().Return(sealer, nil) 692 framer.EXPECT().HasData().Return(true) 693 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 694 expectAppendControlFrames() 695 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f}) 696 buffer := getPacketBuffer() 697 _, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1) 698 Expect(err).ToNot(HaveOccurred()) 699 // cut off the tag that the mock sealer added 700 buffer.Data = buffer.Data[:buffer.Len()-protocol.ByteCount(sealer.Overhead())] 701 data := buffer.Data 702 l, _, pnLen, _, err := wire.ParseShortHeader(data, connID.Len()) 703 Expect(err).ToNot(HaveOccurred()) 704 r := bytes.NewReader(data[l:]) 705 Expect(pnLen).To(Equal(protocol.PacketNumberLen1)) 706 Expect(r.Len()).To(Equal(4 - 1 /* packet number length */)) 707 // the first byte of the payload should be a PADDING frame... 708 firstPayloadByte, err := r.ReadByte() 709 Expect(err).ToNot(HaveOccurred()) 710 Expect(firstPayloadByte).To(Equal(byte(0))) 711 // ... followed by the STREAM frame 712 frameParser := wire.NewFrameParser(true) 713 l, frame, err := frameParser.ParseNext(buffer.Data[len(data)-r.Len():], protocol.Encryption1RTT, protocol.Version1) 714 Expect(err).ToNot(HaveOccurred()) 715 Expect(frame).To(BeAssignableToTypeOf(&wire.StreamFrame{})) 716 sf := frame.(*wire.StreamFrame) 717 Expect(sf.StreamID).To(Equal(f.StreamID)) 718 Expect(sf.Fin).To(Equal(f.Fin)) 719 Expect(sf.Data).To(BeEmpty()) 720 Expect(r.Len() - l).To(BeZero()) 721 }) 722 723 It("packs multiple small STREAM frames into single packet", func() { 724 f1 := &wire.StreamFrame{ 725 StreamID: 5, 726 Data: []byte("frame 1"), 727 DataLenPresent: true, 728 } 729 f2 := &wire.StreamFrame{ 730 StreamID: 5, 731 Data: []byte("frame 2"), 732 DataLenPresent: true, 733 } 734 f3 := &wire.StreamFrame{ 735 StreamID: 3, 736 Data: []byte("frame 3"), 737 DataLenPresent: true, 738 } 739 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 740 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 741 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 742 framer.EXPECT().HasData().Return(true) 743 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 744 expectAppendControlFrames() 745 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f1}, ackhandler.StreamFrame{Frame: f2}, ackhandler.StreamFrame{Frame: f3}) 746 p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 747 Expect(p).ToNot(BeNil()) 748 Expect(err).ToNot(HaveOccurred()) 749 Expect(p.Frames).To(BeEmpty()) 750 Expect(p.StreamFrames).To(HaveLen(3)) 751 Expect(p.StreamFrames[0].Frame.Data).To(Equal([]byte("frame 1"))) 752 Expect(p.StreamFrames[1].Frame.Data).To(Equal([]byte("frame 2"))) 753 Expect(p.StreamFrames[2].Frame.Data).To(Equal([]byte("frame 3"))) 754 }) 755 756 Context("making ACK packets ack-eliciting", func() { 757 sendMaxNumNonAckElicitingAcks := func() { 758 for i := 0; i < protocol.MaxNonAckElicitingAcks; i++ { 759 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 760 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 761 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 762 framer.EXPECT().HasData().Return(true) 763 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}) 764 expectAppendControlFrames() 765 expectAppendStreamFrames() 766 p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 767 Expect(p).ToNot(BeNil()) 768 Expect(err).ToNot(HaveOccurred()) 769 Expect(p.Ack).ToNot(BeNil()) 770 Expect(p.Frames).To(BeEmpty()) 771 } 772 } 773 774 It("adds a PING frame when it's supposed to send a ack-eliciting packet", func() { 775 sendMaxNumNonAckElicitingAcks() 776 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 777 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 778 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 779 framer.EXPECT().HasData().Return(true) 780 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}) 781 expectAppendControlFrames() 782 expectAppendStreamFrames() 783 p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 784 Expect(p).ToNot(BeNil()) 785 Expect(err).ToNot(HaveOccurred()) 786 var hasPing bool 787 for _, f := range p.Frames { 788 if _, ok := f.Frame.(*wire.PingFrame); ok { 789 hasPing = true 790 Expect(f.Handler).To(BeNil()) // make sure the PING is not retransmitted if lost 791 } 792 } 793 Expect(hasPing).To(BeTrue()) 794 // make sure the next packet doesn't contain another PING 795 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 796 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 797 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 798 framer.EXPECT().HasData().Return(true) 799 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}) 800 expectAppendControlFrames() 801 expectAppendStreamFrames() 802 p, err = packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 803 Expect(p).ToNot(BeNil()) 804 Expect(err).ToNot(HaveOccurred()) 805 Expect(p.Ack).ToNot(BeNil()) 806 Expect(p.Frames).To(BeEmpty()) 807 }) 808 809 It("waits until there's something to send before adding a PING frame", func() { 810 sendMaxNumNonAckElicitingAcks() 811 // nothing to send 812 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 813 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 814 framer.EXPECT().HasData().Return(true) 815 expectAppendControlFrames() 816 expectAppendStreamFrames() 817 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 818 _, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 819 Expect(err).To(MatchError(errNothingToPack)) 820 // now add some frame to send 821 expectAppendControlFrames() 822 expectAppendStreamFrames() 823 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 824 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 825 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 826 framer.EXPECT().HasData().Return(true) 827 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}} 828 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(ack) 829 p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 830 Expect(err).ToNot(HaveOccurred()) 831 Expect(p.Ack).To(Equal(ack)) 832 var hasPing bool 833 for _, f := range p.Frames { 834 if _, ok := f.Frame.(*wire.PingFrame); ok { 835 hasPing = true 836 Expect(f.Handler).To(BeNil()) // make sure the PING is not retransmitted if lost 837 } 838 } 839 Expect(hasPing).To(BeTrue()) 840 }) 841 842 It("doesn't send a PING if it already sent another ack-eliciting frame", func() { 843 sendMaxNumNonAckElicitingAcks() 844 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 845 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 846 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 847 framer.EXPECT().HasData().Return(true) 848 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 849 expectAppendStreamFrames() 850 expectAppendControlFrames(ackhandler.Frame{Frame: &wire.MaxDataFrame{}}) 851 p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 852 Expect(err).ToNot(HaveOccurred()) 853 Expect(p).ToNot(BeNil()) 854 Expect(p.Frames).ToNot(ContainElement(&wire.PingFrame{})) 855 }) 856 }) 857 }) 858 859 Context("packing crypto packets", func() { 860 It("sets the length", func() { 861 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 862 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 863 f := &wire.CryptoFrame{ 864 Offset: 0x1337, 865 Data: []byte("foobar"), 866 } 867 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 868 handshakeStream.EXPECT().HasData().Return(true).AnyTimes() 869 handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f) 870 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 871 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 872 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 873 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 874 Expect(err).ToNot(HaveOccurred()) 875 Expect(p).ToNot(BeNil()) 876 parsePacket(p.buffer.Data) 877 }) 878 879 It("packs an Initial packet and pads it", func() { 880 packer.perspective = protocol.PerspectiveClient 881 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen1) 882 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24)) 883 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 884 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 885 sealingManager.EXPECT().Get0RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 886 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 887 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 888 initialStream.EXPECT().HasData().Return(true).Times(2) 889 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 890 return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")} 891 }) 892 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 893 Expect(err).ToNot(HaveOccurred()) 894 Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize)) 895 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 896 Expect(p.longHdrPackets).To(HaveLen(1)) 897 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 898 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 899 Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial"))) 900 hdrs, more := parsePacket(p.buffer.Data) 901 Expect(hdrs).To(HaveLen(1)) 902 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 903 Expect(more).To(BeEmpty()) 904 }) 905 906 It("packs a maximum size Handshake packet", func() { 907 var f *wire.CryptoFrame 908 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 909 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 910 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 911 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 912 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true) 913 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 914 initialStream.EXPECT().HasData() 915 handshakeStream.EXPECT().HasData().Return(true).Times(2) 916 handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 917 f = &wire.CryptoFrame{Offset: 0x1337} 918 f.Data = bytes.Repeat([]byte{'f'}, int(size-f.Length(protocol.Version1)-1)) 919 Expect(f.Length(protocol.Version1)).To(Equal(size)) 920 return f 921 }) 922 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 923 Expect(err).ToNot(HaveOccurred()) 924 Expect(p.longHdrPackets).To(HaveLen(1)) 925 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 926 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 927 parsePacket(p.buffer.Data) 928 }) 929 930 It("packs a coalesced packet with Initial / Handshake, and pads it", func() { 931 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2) 932 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24)) 933 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 934 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 935 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 936 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 937 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 938 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 939 // don't EXPECT any calls for a Handshake ACK frame 940 initialStream.EXPECT().HasData().Return(true).Times(2) 941 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 942 return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")} 943 }) 944 handshakeStream.EXPECT().HasData().Return(true).Times(2) 945 handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 946 return &wire.CryptoFrame{Offset: 0x1337, Data: []byte("handshake")} 947 }) 948 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 949 Expect(err).ToNot(HaveOccurred()) 950 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 951 Expect(p.longHdrPackets).To(HaveLen(2)) 952 Expect(p.shortHdrPacket).To(BeNil()) 953 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 954 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 955 Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial"))) 956 Expect(p.longHdrPackets[1].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 957 Expect(p.longHdrPackets[1].frames).To(HaveLen(1)) 958 Expect(p.longHdrPackets[1].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("handshake"))) 959 hdrs, more := parsePacket(p.buffer.Data) 960 Expect(hdrs).To(HaveLen(2)) 961 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 962 Expect(hdrs[1].Type).To(Equal(protocol.PacketTypeHandshake)) 963 Expect(more).To(BeEmpty()) 964 }) 965 966 It("packs a coalesced packet with Initial / super short Handshake, and pads it", func() { 967 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2) 968 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24)) 969 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 970 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 971 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 972 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 973 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 974 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 975 // don't EXPECT any calls for a Handshake ACK frame 976 initialStream.EXPECT().HasData().Return(true).Times(2) 977 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 978 return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")} 979 }) 980 handshakeStream.EXPECT().HasData() 981 packer.retransmissionQueue.addHandshake(&wire.PingFrame{}) 982 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 983 Expect(err).ToNot(HaveOccurred()) 984 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 985 Expect(p.longHdrPackets).To(HaveLen(2)) 986 Expect(p.shortHdrPacket).To(BeNil()) 987 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 988 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 989 Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial"))) 990 Expect(p.longHdrPackets[1].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 991 Expect(p.longHdrPackets[1].frames).To(HaveLen(1)) 992 Expect(p.longHdrPackets[1].frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 993 hdrs, more := parsePacket(p.buffer.Data) 994 Expect(hdrs).To(HaveLen(2)) 995 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 996 Expect(hdrs[1].Type).To(Equal(protocol.PacketTypeHandshake)) 997 Expect(more).To(BeEmpty()) 998 }) 999 1000 It("packs a coalesced packet with super short Initial / super short Handshake, and pads it", func() { 1001 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen1) 1002 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24)) 1003 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 1004 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 1005 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1006 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1007 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1008 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, gomock.Any()) 1009 initialStream.EXPECT().HasData() 1010 handshakeStream.EXPECT().HasData() 1011 packer.retransmissionQueue.addInitial(&wire.PingFrame{}) 1012 packer.retransmissionQueue.addHandshake(&wire.PingFrame{}) 1013 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1014 Expect(err).ToNot(HaveOccurred()) 1015 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1016 Expect(p.longHdrPackets).To(HaveLen(2)) 1017 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1018 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1019 Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 1020 Expect(p.longHdrPackets[1].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 1021 Expect(p.longHdrPackets[1].frames).To(HaveLen(1)) 1022 Expect(p.longHdrPackets[1].frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 1023 hdrs, more := parsePacket(p.buffer.Data) 1024 Expect(hdrs).To(HaveLen(2)) 1025 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 1026 Expect(hdrs[1].Type).To(Equal(protocol.PacketTypeHandshake)) 1027 Expect(more).To(BeEmpty()) 1028 }) 1029 1030 It("packs a coalesced packet with Initial / super short 1-RTT, and pads it", func() { 1031 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2) 1032 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24)) 1033 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 1034 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 1035 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1036 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1037 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 1038 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1039 initialStream.EXPECT().HasData().Return(true).Times(2) 1040 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 1041 return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")} 1042 }) 1043 expectAppendControlFrames() 1044 expectAppendStreamFrames() 1045 framer.EXPECT().HasData().Return(true) 1046 packer.retransmissionQueue.addAppData(&wire.PingFrame{}) 1047 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1048 Expect(err).ToNot(HaveOccurred()) 1049 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1050 Expect(p.longHdrPackets).To(HaveLen(1)) 1051 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1052 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1053 Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial"))) 1054 Expect(p.shortHdrPacket).ToNot(BeNil()) 1055 Expect(p.shortHdrPacket.Frames).To(HaveLen(1)) 1056 Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 1057 hdrs, more := parsePacket(p.buffer.Data) 1058 Expect(hdrs).To(HaveLen(1)) 1059 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 1060 Expect(more).ToNot(BeEmpty()) 1061 parseShortHeaderPacket(more) 1062 }) 1063 1064 It("packs a coalesced packet with Initial / 0-RTT, and pads it", func() { 1065 packer.perspective = protocol.PerspectiveClient 1066 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2) 1067 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24)) 1068 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1069 pnManager.EXPECT().PopPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(0x42)) 1070 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1071 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1072 sealingManager.EXPECT().Get0RTTSealer().Return(getSealer(), nil) 1073 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1074 framer.EXPECT().HasData().Return(true) 1075 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1076 // don't EXPECT any calls for a Handshake ACK frame 1077 initialStream.EXPECT().HasData().Return(true).Times(2) 1078 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 1079 return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")} 1080 }) 1081 expectAppendControlFrames() 1082 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: &wire.StreamFrame{Data: []byte("foobar")}}) 1083 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1084 Expect(err).ToNot(HaveOccurred()) 1085 Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize)) 1086 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1087 Expect(p.longHdrPackets).To(HaveLen(2)) 1088 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1089 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1090 Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial"))) 1091 Expect(p.longHdrPackets[0].streamFrames).To(BeEmpty()) 1092 Expect(p.longHdrPackets[1].EncryptionLevel()).To(Equal(protocol.Encryption0RTT)) 1093 Expect(p.longHdrPackets[1].frames).To(BeEmpty()) 1094 Expect(p.longHdrPackets[1].streamFrames).To(HaveLen(1)) 1095 Expect(p.longHdrPackets[1].streamFrames[0].Frame.Data).To(Equal([]byte("foobar"))) 1096 hdrs, more := parsePacket(p.buffer.Data) 1097 Expect(hdrs).To(HaveLen(2)) 1098 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 1099 Expect(hdrs[1].Type).To(Equal(protocol.PacketType0RTT)) 1100 Expect(more).To(BeEmpty()) 1101 }) 1102 1103 It("packs a coalesced packet with Handshake / 1-RTT", func() { 1104 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2) 1105 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x24)) 1106 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1107 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 1108 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 1109 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1110 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 1111 framer.EXPECT().HasData().Return(true) 1112 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 1113 // don't EXPECT any calls for a 1-RTT ACK frame 1114 handshakeStream.EXPECT().HasData().Return(true).Times(2) 1115 handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 1116 return &wire.CryptoFrame{Offset: 0x1337, Data: []byte("handshake")} 1117 }) 1118 expectAppendControlFrames() 1119 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: &wire.StreamFrame{Data: []byte("foobar")}}) 1120 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1121 Expect(err).ToNot(HaveOccurred()) 1122 Expect(p.buffer.Len()).To(BeNumerically("<", 100)) 1123 Expect(p.longHdrPackets).To(HaveLen(1)) 1124 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 1125 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1126 Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("handshake"))) 1127 Expect(p.shortHdrPacket).ToNot(BeNil()) 1128 Expect(p.shortHdrPacket.Frames).To(BeEmpty()) 1129 Expect(p.shortHdrPacket.StreamFrames).To(HaveLen(1)) 1130 Expect(p.shortHdrPacket.StreamFrames[0].Frame.Data).To(Equal([]byte("foobar"))) 1131 hdrs, more := parsePacket(p.buffer.Data) 1132 Expect(hdrs).To(HaveLen(1)) 1133 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeHandshake)) 1134 Expect(more).ToNot(BeEmpty()) 1135 parseShortHeaderPacket(more) 1136 }) 1137 1138 It("doesn't add a coalesced packet if the remaining size is smaller than MaxCoalescedPacketSize", func() { 1139 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2) 1140 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x24)) 1141 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 1142 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1143 // don't EXPECT any calls to GetHandshakeSealer and Get1RTTSealer 1144 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 1145 handshakeStream.EXPECT().HasData().Return(true).Times(2) 1146 handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 1147 s := size - protocol.MinCoalescedPacketSize 1148 f := &wire.CryptoFrame{Offset: 0x1337} 1149 f.Data = bytes.Repeat([]byte{'f'}, int(s-f.Length(protocol.Version1)-1)) 1150 Expect(f.Length(protocol.Version1)).To(Equal(s)) 1151 return f 1152 }) 1153 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1154 Expect(err).ToNot(HaveOccurred()) 1155 Expect(p.longHdrPackets).To(HaveLen(1)) 1156 Expect(p.shortHdrPacket).To(BeNil()) 1157 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 1158 Expect(len(p.buffer.Data)).To(BeEquivalentTo(maxPacketSize - protocol.MinCoalescedPacketSize)) 1159 parsePacket(p.buffer.Data) 1160 }) 1161 1162 It("pads if payload length + packet number length is smaller than 4, for Long Header packets", func() { 1163 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 1164 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 1165 sealer := getSealer() 1166 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 1167 sealingManager.EXPECT().GetHandshakeSealer().Return(sealer, nil) 1168 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1169 packer.retransmissionQueue.addHandshake(&wire.PingFrame{}) 1170 handshakeStream.EXPECT().HasData() 1171 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 1172 packet, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1173 Expect(err).ToNot(HaveOccurred()) 1174 Expect(packet).ToNot(BeNil()) 1175 Expect(packet.longHdrPackets).To(HaveLen(1)) 1176 Expect(packet.shortHdrPacket).To(BeNil()) 1177 // cut off the tag that the mock sealer added 1178 // packet.buffer.Data = packet.buffer.Data[:packet.buffer.Len()-protocol.ByteCount(sealer.Overhead())] 1179 hdr, _, _, err := wire.ParsePacket(packet.buffer.Data) 1180 Expect(err).ToNot(HaveOccurred()) 1181 data := packet.buffer.Data 1182 r := bytes.NewReader(data) 1183 extHdr, err := hdr.ParseExtended(r, protocol.Version1) 1184 Expect(err).ToNot(HaveOccurred()) 1185 Expect(extHdr.PacketNumberLen).To(Equal(protocol.PacketNumberLen1)) 1186 Expect(r.Len()).To(Equal(4 - 1 /* packet number length */ + sealer.Overhead())) 1187 // the first bytes of the payload should be a 2 PADDING frames... 1188 firstPayloadByte, err := r.ReadByte() 1189 Expect(err).ToNot(HaveOccurred()) 1190 Expect(firstPayloadByte).To(Equal(byte(0))) 1191 secondPayloadByte, err := r.ReadByte() 1192 Expect(err).ToNot(HaveOccurred()) 1193 Expect(secondPayloadByte).To(Equal(byte(0))) 1194 // ... followed by the PING 1195 frameParser := wire.NewFrameParser(false) 1196 l, frame, err := frameParser.ParseNext(data[len(data)-r.Len():], protocol.Encryption1RTT, protocol.Version1) 1197 Expect(err).ToNot(HaveOccurred()) 1198 Expect(frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 1199 Expect(r.Len() - l).To(Equal(sealer.Overhead())) 1200 }) 1201 1202 It("adds retransmissions", func() { 1203 f := &wire.CryptoFrame{Data: []byte("Initial")} 1204 retransmissionQueue.addInitial(f) 1205 retransmissionQueue.addHandshake(&wire.CryptoFrame{Data: []byte("Handshake")}) 1206 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1207 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 1208 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1209 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1210 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1211 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1212 initialStream.EXPECT().HasData() 1213 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1214 Expect(err).ToNot(HaveOccurred()) 1215 Expect(p.longHdrPackets).To(HaveLen(1)) 1216 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1217 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1218 Expect(p.longHdrPackets[0].frames[0].Frame).To(Equal(f)) 1219 Expect(p.longHdrPackets[0].frames[0].Handler).ToNot(BeNil()) 1220 }) 1221 1222 It("sends an Initial packet containing only an ACK", func() { 1223 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 20}}} 1224 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack) 1225 initialStream.EXPECT().HasData().Times(2) 1226 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1227 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1228 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1229 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1230 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 1231 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1232 Expect(err).ToNot(HaveOccurred()) 1233 Expect(p.longHdrPackets).To(HaveLen(1)) 1234 Expect(p.longHdrPackets[0].ack).To(Equal(ack)) 1235 }) 1236 1237 It("doesn't pack anything if there's nothing to send at Initial and Handshake keys are not yet available", func() { 1238 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1239 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1240 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1241 initialStream.EXPECT().HasData() 1242 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true) 1243 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1244 Expect(err).ToNot(HaveOccurred()) 1245 Expect(p).To(BeNil()) 1246 }) 1247 1248 It("sends a Handshake packet containing only an ACK", func() { 1249 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 20}}} 1250 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true) 1251 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true).Return(ack) 1252 initialStream.EXPECT().HasData() 1253 handshakeStream.EXPECT().HasData().Times(2) 1254 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1255 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1256 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1257 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1258 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 1259 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1260 Expect(err).ToNot(HaveOccurred()) 1261 Expect(p.longHdrPackets).To(HaveLen(1)) 1262 Expect(p.longHdrPackets[0].ack).To(Equal(ack)) 1263 }) 1264 1265 for _, pers := range []protocol.Perspective{protocol.PerspectiveServer, protocol.PerspectiveClient} { 1266 perspective := pers 1267 1268 It(fmt.Sprintf("pads Initial packets to the required minimum packet size, for the %s", perspective), func() { 1269 token := []byte("initial token") 1270 packer.SetToken(token) 1271 f := &wire.CryptoFrame{Data: []byte("foobar")} 1272 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1273 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 1274 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1275 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1276 sealingManager.EXPECT().Get0RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1277 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1278 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1279 initialStream.EXPECT().HasData().Return(true).Times(2) 1280 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f) 1281 packer.perspective = protocol.PerspectiveClient 1282 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1283 Expect(err).ToNot(HaveOccurred()) 1284 Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize)) 1285 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1286 Expect(p.longHdrPackets).To(HaveLen(1)) 1287 Expect(p.longHdrPackets[0].header.Token).To(Equal(token)) 1288 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1289 cf := p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame) 1290 Expect(cf.Data).To(Equal([]byte("foobar"))) 1291 }) 1292 } 1293 1294 It("adds an ACK frame", func() { 1295 f := &wire.CryptoFrame{Data: []byte("foobar")} 1296 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 42, Largest: 1337}}} 1297 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1298 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 1299 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1300 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1301 sealingManager.EXPECT().Get0RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1302 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1303 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false).Return(ack) 1304 initialStream.EXPECT().HasData().Return(true).Times(2) 1305 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f) 1306 packer.perspective = protocol.PerspectiveClient 1307 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1308 Expect(err).ToNot(HaveOccurred()) 1309 Expect(p.longHdrPackets).To(HaveLen(1)) 1310 Expect(p.longHdrPackets[0].ack).To(Equal(ack)) 1311 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1312 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1313 }) 1314 }) 1315 1316 Context("packing probe packets", func() { 1317 for _, pers := range []protocol.Perspective{protocol.PerspectiveServer, protocol.PerspectiveClient} { 1318 perspective := pers 1319 1320 It(fmt.Sprintf("packs an Initial probe packet and pads it, for the %s", perspective), func() { 1321 packer.perspective = perspective 1322 f := &wire.CryptoFrame{Data: []byte("Initial")} 1323 retransmissionQueue.addInitial(f) 1324 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1325 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1326 initialStream.EXPECT().HasData() 1327 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1328 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 1329 1330 p, err := packer.MaybePackProbePacket(protocol.EncryptionInitial, maxPacketSize, protocol.Version1) 1331 Expect(err).ToNot(HaveOccurred()) 1332 Expect(p).ToNot(BeNil()) 1333 Expect(p.longHdrPackets).To(HaveLen(1)) 1334 packet := p.longHdrPackets[0] 1335 Expect(packet.EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1336 Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize)) 1337 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1338 Expect(packet.frames).To(HaveLen(1)) 1339 Expect(packet.frames[0].Frame).To(Equal(f)) 1340 parsePacket(p.buffer.Data) 1341 }) 1342 1343 It(fmt.Sprintf("packs an Initial probe packet with 1 byte payload, for the %s", perspective), func() { 1344 packer.perspective = perspective 1345 retransmissionQueue.addInitial(&wire.PingFrame{}) 1346 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1347 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1348 initialStream.EXPECT().HasData() 1349 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 1350 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 1351 1352 p, err := packer.MaybePackProbePacket(protocol.EncryptionInitial, maxPacketSize, protocol.Version1) 1353 Expect(err).ToNot(HaveOccurred()) 1354 Expect(err).ToNot(HaveOccurred()) 1355 Expect(p).ToNot(BeNil()) 1356 Expect(p.longHdrPackets).To(HaveLen(1)) 1357 packet := p.longHdrPackets[0] 1358 Expect(packet.EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1359 Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize)) 1360 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1361 Expect(packet.frames).To(HaveLen(1)) 1362 Expect(packet.frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 1363 parsePacket(p.buffer.Data) 1364 }) 1365 } 1366 1367 It("packs a Handshake probe packet", func() { 1368 f := &wire.CryptoFrame{Data: []byte("Handshake")} 1369 retransmissionQueue.addHandshake(f) 1370 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1371 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 1372 handshakeStream.EXPECT().HasData() 1373 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1374 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 1375 1376 p, err := packer.MaybePackProbePacket(protocol.EncryptionHandshake, maxPacketSize, protocol.Version1) 1377 Expect(err).ToNot(HaveOccurred()) 1378 Expect(err).ToNot(HaveOccurred()) 1379 Expect(p).ToNot(BeNil()) 1380 Expect(p.longHdrPackets).To(HaveLen(1)) 1381 packet := p.longHdrPackets[0] 1382 Expect(packet.EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 1383 Expect(packet.frames).To(HaveLen(1)) 1384 Expect(packet.frames[0].Frame).To(Equal(f)) 1385 parsePacket(p.buffer.Data) 1386 }) 1387 1388 It("packs a full size Handshake probe packet", func() { 1389 f := &wire.CryptoFrame{Data: make([]byte, 2000)} 1390 retransmissionQueue.addHandshake(f) 1391 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1392 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 1393 handshakeStream.EXPECT().HasData() 1394 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1395 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 1396 1397 p, err := packer.MaybePackProbePacket(protocol.EncryptionHandshake, maxPacketSize, protocol.Version1) 1398 Expect(err).ToNot(HaveOccurred()) 1399 Expect(err).ToNot(HaveOccurred()) 1400 Expect(p).ToNot(BeNil()) 1401 Expect(p.longHdrPackets).To(HaveLen(1)) 1402 packet := p.longHdrPackets[0] 1403 Expect(packet.EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 1404 Expect(packet.frames).To(HaveLen(1)) 1405 Expect(packet.frames[0].Frame).To(BeAssignableToTypeOf(&wire.CryptoFrame{})) 1406 Expect(packet.length).To(Equal(maxPacketSize)) 1407 parsePacket(p.buffer.Data) 1408 }) 1409 1410 It("packs a 1-RTT probe packet", func() { 1411 f := &wire.StreamFrame{Data: []byte("1-RTT")} 1412 retransmissionQueue.addInitial(f) 1413 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 1414 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 1415 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1416 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 1417 framer.EXPECT().HasData().Return(true) 1418 expectAppendControlFrames() 1419 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f}) 1420 1421 p, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, protocol.Version1) 1422 Expect(err).ToNot(HaveOccurred()) 1423 Expect(p).ToNot(BeNil()) 1424 Expect(p.longHdrPackets).To(BeEmpty()) 1425 Expect(p.shortHdrPacket).ToNot(BeNil()) 1426 packet := p.shortHdrPacket 1427 Expect(packet.Frames).To(BeEmpty()) 1428 Expect(packet.StreamFrames).To(HaveLen(1)) 1429 Expect(packet.StreamFrames[0].Frame).To(Equal(f)) 1430 }) 1431 1432 It("packs a full size 1-RTT probe packet", func() { 1433 f := &wire.StreamFrame{Data: make([]byte, 2000)} 1434 retransmissionQueue.addInitial(f) 1435 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 1436 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 1437 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1438 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 1439 framer.EXPECT().HasData().Return(true) 1440 expectAppendControlFrames() 1441 framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(fs []ackhandler.StreamFrame, maxSize protocol.ByteCount, v protocol.VersionNumber) ([]ackhandler.StreamFrame, protocol.ByteCount) { 1442 sf, split := f.MaybeSplitOffFrame(maxSize, v) 1443 Expect(split).To(BeTrue()) 1444 return append(fs, ackhandler.StreamFrame{Frame: sf}), sf.Length(v) 1445 }) 1446 1447 p, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, protocol.Version1) 1448 Expect(err).ToNot(HaveOccurred()) 1449 Expect(p).ToNot(BeNil()) 1450 Expect(p.longHdrPackets).To(BeEmpty()) 1451 Expect(p.shortHdrPacket).ToNot(BeNil()) 1452 packet := p.shortHdrPacket 1453 Expect(packet.Frames).To(BeEmpty()) 1454 Expect(packet.StreamFrames).To(HaveLen(1)) 1455 Expect(packet.Length).To(Equal(maxPacketSize)) 1456 }) 1457 1458 It("returns nil if there's no probe data to send", func() { 1459 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 1460 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1461 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true) 1462 framer.EXPECT().HasData() 1463 1464 packet, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, protocol.Version1) 1465 Expect(err).ToNot(HaveOccurred()) 1466 Expect(packet).To(BeNil()) 1467 }) 1468 1469 It("packs an MTU probe packet", func() { 1470 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 1471 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x43), protocol.PacketNumberLen2) 1472 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x43)) 1473 ping := ackhandler.Frame{Frame: &wire.PingFrame{}} 1474 const probePacketSize = maxPacketSize + 42 1475 p, buffer, err := packer.PackMTUProbePacket(ping, probePacketSize, protocol.Version1) 1476 Expect(err).ToNot(HaveOccurred()) 1477 Expect(p.Length).To(BeEquivalentTo(probePacketSize)) 1478 Expect(p.PacketNumber).To(Equal(protocol.PacketNumber(0x43))) 1479 Expect(buffer.Data).To(HaveLen(int(probePacketSize))) 1480 Expect(p.IsPathMTUProbePacket).To(BeTrue()) 1481 }) 1482 }) 1483 }) 1484 })