packet_packer_test.go 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079
  1. package quic
  2. import (
  3. "bytes"
  4. "net"
  5. "github.com/golang/mock/gomock"
  6. "github.com/lucas-clemente/quic-go/internal/ackhandler"
  7. "github.com/lucas-clemente/quic-go/internal/handshake"
  8. "github.com/lucas-clemente/quic-go/internal/protocol"
  9. "github.com/lucas-clemente/quic-go/internal/wire"
  10. . "github.com/onsi/ginkgo"
  11. . "github.com/onsi/gomega"
  12. )
  13. type mockSealer struct{}
  14. func (s *mockSealer) Seal(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) []byte {
  15. return append(src, bytes.Repeat([]byte{0}, 12)...)
  16. }
  17. func (s *mockSealer) Overhead() int { return 12 }
  18. var _ handshake.Sealer = &mockSealer{}
  19. type mockCryptoSetup struct {
  20. handleErr error
  21. encLevelSeal protocol.EncryptionLevel
  22. encLevelSealCrypto protocol.EncryptionLevel
  23. divNonce []byte
  24. }
  25. var _ handshake.CryptoSetup = &mockCryptoSetup{}
  26. func (m *mockCryptoSetup) HandleCryptoStream() error {
  27. return m.handleErr
  28. }
  29. func (m *mockCryptoSetup) Open(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) ([]byte, protocol.EncryptionLevel, error) {
  30. return nil, protocol.EncryptionUnspecified, nil
  31. }
  32. func (m *mockCryptoSetup) GetSealer() (protocol.EncryptionLevel, handshake.Sealer) {
  33. return m.encLevelSeal, &mockSealer{}
  34. }
  35. func (m *mockCryptoSetup) GetSealerForCryptoStream() (protocol.EncryptionLevel, handshake.Sealer) {
  36. return m.encLevelSealCrypto, &mockSealer{}
  37. }
  38. func (m *mockCryptoSetup) GetSealerWithEncryptionLevel(protocol.EncryptionLevel) (handshake.Sealer, error) {
  39. return &mockSealer{}, nil
  40. }
  41. func (m *mockCryptoSetup) SetDiversificationNonce(divNonce []byte) error {
  42. m.divNonce = divNonce
  43. return nil
  44. }
  45. func (m *mockCryptoSetup) ConnectionState() ConnectionState { panic("not implemented") }
  46. var _ = Describe("Packet packer", func() {
  47. const maxPacketSize protocol.ByteCount = 1357
  48. var (
  49. packer *packetPacker
  50. publicHeaderLen protocol.ByteCount
  51. maxFrameSize protocol.ByteCount
  52. mockStreamFramer *MockStreamFrameSource
  53. divNonce []byte
  54. token []byte
  55. )
  56. checkPayloadLen := func(data []byte) {
  57. r := bytes.NewReader(data)
  58. iHdr, err := wire.ParseInvariantHeader(r, 0)
  59. Expect(err).ToNot(HaveOccurred())
  60. hdr, err := iHdr.Parse(r, protocol.PerspectiveServer, versionIETFFrames)
  61. Expect(err).ToNot(HaveOccurred())
  62. ExpectWithOffset(0, hdr.PayloadLen).To(BeEquivalentTo(r.Len()))
  63. }
  64. BeforeEach(func() {
  65. version := versionGQUICFrames
  66. mockSender := NewMockStreamSender(mockCtrl)
  67. mockSender.EXPECT().onHasStreamData(gomock.Any()).AnyTimes()
  68. mockStreamFramer = NewMockStreamFrameSource(mockCtrl)
  69. divNonce = bytes.Repeat([]byte{'e'}, 32)
  70. token = []byte("initial token")
  71. packer = newPacketPacker(
  72. protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8},
  73. protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8},
  74. 1,
  75. func(protocol.PacketNumber) protocol.PacketNumberLen { return protocol.PacketNumberLen2 },
  76. &net.TCPAddr{},
  77. token, // token
  78. divNonce,
  79. &mockCryptoSetup{encLevelSeal: protocol.EncryptionForwardSecure},
  80. mockStreamFramer,
  81. protocol.PerspectiveServer,
  82. version,
  83. )
  84. publicHeaderLen = 1 + 8 + 2 // 1 flag byte, 8 connection ID, 2 packet number
  85. maxFrameSize = maxPacketSize - protocol.ByteCount((&mockSealer{}).Overhead()) - publicHeaderLen
  86. packer.hasSentPacket = true
  87. packer.version = version
  88. packer.maxPacketSize = maxPacketSize
  89. })
  90. Context("determining the maximum packet size", func() {
  91. connID := protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8}
  92. It("uses the minimum initial size, if it can't determine if the remote address is IPv4 or IPv6", func() {
  93. remoteAddr := &net.TCPAddr{}
  94. packer = newPacketPacker(connID, connID, 1, nil, remoteAddr, nil, nil, nil, nil, protocol.PerspectiveServer, protocol.VersionWhatever)
  95. Expect(packer.maxPacketSize).To(BeEquivalentTo(protocol.MinInitialPacketSize))
  96. })
  97. It("uses the maximum IPv4 packet size, if the remote address is IPv4", func() {
  98. remoteAddr := &net.UDPAddr{IP: net.IPv4(11, 12, 13, 14), Port: 1337}
  99. packer = newPacketPacker(connID, connID, 1, nil, remoteAddr, nil, nil, nil, nil, protocol.PerspectiveServer, protocol.VersionWhatever)
  100. Expect(packer.maxPacketSize).To(BeEquivalentTo(protocol.MaxPacketSizeIPv4))
  101. })
  102. It("uses the maximum IPv6 packet size, if the remote address is IPv6", func() {
  103. ip := net.ParseIP("2001:0db8:85a3:0000:0000:8a2e:0370:7334")
  104. remoteAddr := &net.UDPAddr{IP: ip, Port: 1337}
  105. packer = newPacketPacker(connID, connID, 1, nil, remoteAddr, nil, nil, nil, nil, protocol.PerspectiveServer, protocol.VersionWhatever)
  106. Expect(packer.maxPacketSize).To(BeEquivalentTo(protocol.MaxPacketSizeIPv6))
  107. })
  108. })
  109. It("returns nil when no packet is queued", func() {
  110. mockStreamFramer.EXPECT().HasCryptoStreamData()
  111. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any())
  112. p, err := packer.PackPacket()
  113. Expect(p).To(BeNil())
  114. Expect(err).ToNot(HaveOccurred())
  115. })
  116. It("packs single packets", func() {
  117. mockStreamFramer.EXPECT().HasCryptoStreamData()
  118. f := &wire.StreamFrame{
  119. StreamID: 5,
  120. Data: []byte{0xDE, 0xCA, 0xFB, 0xAD},
  121. }
  122. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).Return([]*wire.StreamFrame{f})
  123. p, err := packer.PackPacket()
  124. Expect(err).ToNot(HaveOccurred())
  125. Expect(p).ToNot(BeNil())
  126. b := &bytes.Buffer{}
  127. f.Write(b, packer.version)
  128. Expect(p.frames).To(Equal([]wire.Frame{f}))
  129. Expect(p.raw).To(ContainSubstring(b.String()))
  130. })
  131. It("stores the encryption level a packet was sealed with", func() {
  132. mockStreamFramer.EXPECT().HasCryptoStreamData()
  133. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).Return([]*wire.StreamFrame{{
  134. StreamID: 5,
  135. Data: []byte("foobar"),
  136. }})
  137. packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionForwardSecure
  138. p, err := packer.PackPacket()
  139. Expect(err).ToNot(HaveOccurred())
  140. Expect(p.encryptionLevel).To(Equal(protocol.EncryptionForwardSecure))
  141. })
  142. Context("generating a packet header", func() {
  143. const (
  144. versionPublicHeader = protocol.Version39 // a QUIC version that uses the Public Header format
  145. versionIETFHeader = protocol.VersionTLS // a QUIC version that uses the IETF Header format
  146. )
  147. Context("Public Header (for gQUIC)", func() {
  148. BeforeEach(func() {
  149. packer.version = versionPublicHeader
  150. })
  151. It("doesn't set the source connection ID", func() {
  152. ph := packer.getHeader(protocol.EncryptionForwardSecure)
  153. Expect(ph.SrcConnectionID).To(BeEmpty())
  154. })
  155. It("it omits the connection ID for forward-secure packets", func() {
  156. packer.version = protocol.Version43
  157. ph := packer.getHeader(protocol.EncryptionForwardSecure)
  158. Expect(ph.DestConnectionID.Len()).ToNot(BeZero())
  159. packer.SetOmitConnectionID()
  160. ph = packer.getHeader(protocol.EncryptionForwardSecure)
  161. Expect(ph.DestConnectionID.Len()).To(BeZero())
  162. })
  163. It("doesn't omit the connection ID for non-forward-secure packets", func() {
  164. packer.SetOmitConnectionID()
  165. ph := packer.getHeader(protocol.EncryptionSecure)
  166. Expect(ph.DestConnectionID.Len()).ToNot(BeZero())
  167. })
  168. It("adds the Version Flag to the Public Header before the crypto handshake is finished", func() {
  169. packer.perspective = protocol.PerspectiveClient
  170. ph := packer.getHeader(protocol.EncryptionSecure)
  171. Expect(ph.VersionFlag).To(BeTrue())
  172. })
  173. It("doesn't add the Version Flag to the Public Header for forward-secure packets", func() {
  174. packer.perspective = protocol.PerspectiveClient
  175. ph := packer.getHeader(protocol.EncryptionForwardSecure)
  176. Expect(ph.VersionFlag).To(BeFalse())
  177. })
  178. Context("diversificaton nonces", func() {
  179. It("doesn't include a div nonce, when sending a packet with initial encryption", func() {
  180. ph := packer.getHeader(protocol.EncryptionUnencrypted)
  181. Expect(ph.DiversificationNonce).To(BeEmpty())
  182. })
  183. It("includes a div nonce, when sending a packet with secure encryption", func() {
  184. ph := packer.getHeader(protocol.EncryptionSecure)
  185. Expect(ph.DiversificationNonce).To(Equal(divNonce))
  186. })
  187. It("doesn't include a div nonce, when sending a packet with forward-secure encryption", func() {
  188. ph := packer.getHeader(protocol.EncryptionForwardSecure)
  189. Expect(ph.DiversificationNonce).To(BeEmpty())
  190. })
  191. It("doesn't send a div nonce as a client", func() {
  192. packer.perspective = protocol.PerspectiveClient
  193. ph := packer.getHeader(protocol.EncryptionSecure)
  194. Expect(ph.DiversificationNonce).To(BeEmpty())
  195. })
  196. })
  197. })
  198. Context("Header (for gQUIC 44)", func() {
  199. BeforeEach(func() {
  200. packer.version = protocol.Version44
  201. })
  202. It("sends an Initial packet as the first packets, for the client", func() {
  203. packer.perspective = protocol.PerspectiveClient
  204. packer.hasSentPacket = false
  205. h := packer.getHeader(protocol.EncryptionUnencrypted)
  206. Expect(h.IsLongHeader).To(BeTrue())
  207. Expect(h.Type).To(Equal(protocol.PacketTypeInitial))
  208. Expect(h.Version).To(Equal(protocol.Version44))
  209. Expect(h.DestConnectionID).To(Equal(packer.destConnID))
  210. Expect(h.SrcConnectionID).To(Equal(packer.srcConnID))
  211. Expect(h.PacketNumberLen).To(Equal(protocol.PacketNumberLen4))
  212. })
  213. It("sends a Handshake for non-forward-secure packets, for the server", func() {
  214. packer.perspective = protocol.PerspectiveServer
  215. h := packer.getHeader(protocol.EncryptionUnencrypted)
  216. Expect(h.IsLongHeader).To(BeTrue())
  217. Expect(h.Type).To(Equal(protocol.PacketTypeHandshake))
  218. Expect(h.Version).To(Equal(protocol.Version44))
  219. Expect(h.DestConnectionID).To(Equal(packer.destConnID))
  220. Expect(h.SrcConnectionID).To(Equal(packer.srcConnID))
  221. Expect(h.PacketNumberLen).To(Equal(protocol.PacketNumberLen4))
  222. })
  223. It("sets the Diversification Nonce for secure packets", func() {
  224. packer.perspective = protocol.PerspectiveServer
  225. Expect(divNonce).ToNot(BeEmpty())
  226. h := packer.getHeader(protocol.EncryptionSecure)
  227. Expect(h.IsLongHeader).To(BeTrue())
  228. Expect(h.Version).To(Equal(protocol.Version44))
  229. Expect(h.Type).To(Equal(protocol.PacketType0RTT))
  230. Expect(h.DiversificationNonce).To(Equal(divNonce))
  231. })
  232. It("uses the Short Header for forward-secure packets", func() {
  233. h := packer.getHeader(protocol.EncryptionForwardSecure)
  234. Expect(h.IsLongHeader).To(BeFalse())
  235. Expect(h.IsPublicHeader).To(BeFalse())
  236. Expect(h.DestConnectionID).To(Equal(packer.destConnID))
  237. })
  238. })
  239. Context("Header (for IETF draft QUIC)", func() {
  240. BeforeEach(func() {
  241. packer.version = versionIETFHeader
  242. })
  243. It("uses the Long Header format for non-forward-secure packets", func() {
  244. h := packer.getHeader(protocol.EncryptionSecure)
  245. Expect(h.IsLongHeader).To(BeTrue())
  246. Expect(h.Version).To(Equal(versionIETFHeader))
  247. })
  248. It("sets source and destination connection ID", func() {
  249. srcConnID := protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8}
  250. destConnID := protocol.ConnectionID{8, 7, 6, 5, 4, 3, 2, 1}
  251. packer.srcConnID = srcConnID
  252. packer.destConnID = destConnID
  253. h := packer.getHeader(protocol.EncryptionSecure)
  254. Expect(h.SrcConnectionID).To(Equal(srcConnID))
  255. Expect(h.DestConnectionID).To(Equal(destConnID))
  256. })
  257. It("changes the destination connection ID", func() {
  258. srcConnID := protocol.ConnectionID{1, 1, 1, 1, 1, 1, 1, 1}
  259. packer.srcConnID = srcConnID
  260. dest1 := protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8}
  261. dest2 := protocol.ConnectionID{8, 7, 6, 5, 4, 3, 2, 1}
  262. packer.ChangeDestConnectionID(dest1)
  263. h := packer.getHeader(protocol.EncryptionUnencrypted)
  264. Expect(h.SrcConnectionID).To(Equal(srcConnID))
  265. Expect(h.DestConnectionID).To(Equal(dest1))
  266. packer.ChangeDestConnectionID(dest2)
  267. h = packer.getHeader(protocol.EncryptionUnencrypted)
  268. Expect(h.SrcConnectionID).To(Equal(srcConnID))
  269. Expect(h.DestConnectionID).To(Equal(dest2))
  270. })
  271. It("uses the Short Header format for forward-secure packets", func() {
  272. h := packer.getHeader(protocol.EncryptionForwardSecure)
  273. Expect(h.IsLongHeader).To(BeFalse())
  274. Expect(h.PacketNumberLen).To(BeNumerically(">", 0))
  275. })
  276. })
  277. })
  278. It("sets the payload length for packets containing crypto data", func() {
  279. packer.version = versionIETFFrames
  280. f := &wire.StreamFrame{
  281. StreamID: packer.version.CryptoStreamID(),
  282. Offset: 0x1337,
  283. Data: []byte("foobar"),
  284. }
  285. mockStreamFramer.EXPECT().HasCryptoStreamData().Return(true)
  286. mockStreamFramer.EXPECT().PopCryptoStreamFrame(gomock.Any()).Return(f)
  287. p, err := packer.PackPacket()
  288. Expect(err).ToNot(HaveOccurred())
  289. checkPayloadLen(p.raw)
  290. })
  291. It("packs a CONNECTION_CLOSE", func() {
  292. ccf := wire.ConnectionCloseFrame{
  293. ErrorCode: 0x1337,
  294. ReasonPhrase: "foobar",
  295. }
  296. p, err := packer.PackConnectionClose(&ccf)
  297. Expect(err).ToNot(HaveOccurred())
  298. Expect(p.frames).To(HaveLen(1))
  299. Expect(p.frames[0]).To(Equal(&ccf))
  300. })
  301. It("doesn't send any other frames when sending a CONNECTION_CLOSE", func() {
  302. // expect no mockStreamFramer.PopStreamFrames
  303. ccf := &wire.ConnectionCloseFrame{
  304. ErrorCode: 0x1337,
  305. ReasonPhrase: "foobar",
  306. }
  307. packer.controlFrames = []wire.Frame{&wire.MaxStreamDataFrame{StreamID: 37}}
  308. p, err := packer.PackConnectionClose(ccf)
  309. Expect(err).ToNot(HaveOccurred())
  310. Expect(p.frames).To(Equal([]wire.Frame{ccf}))
  311. })
  312. It("packs only control frames", func() {
  313. mockStreamFramer.EXPECT().HasCryptoStreamData()
  314. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any())
  315. packer.QueueControlFrame(&wire.RstStreamFrame{})
  316. packer.QueueControlFrame(&wire.MaxDataFrame{})
  317. p, err := packer.PackPacket()
  318. Expect(p).ToNot(BeNil())
  319. Expect(err).ToNot(HaveOccurred())
  320. Expect(p.frames).To(HaveLen(2))
  321. Expect(p.raw).NotTo(BeEmpty())
  322. })
  323. It("increases the packet number", func() {
  324. mockStreamFramer.EXPECT().HasCryptoStreamData().Times(2)
  325. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).Times(2)
  326. packer.QueueControlFrame(&wire.RstStreamFrame{})
  327. p1, err := packer.PackPacket()
  328. Expect(err).ToNot(HaveOccurred())
  329. Expect(p1).ToNot(BeNil())
  330. packer.QueueControlFrame(&wire.RstStreamFrame{})
  331. p2, err := packer.PackPacket()
  332. Expect(err).ToNot(HaveOccurred())
  333. Expect(p2).ToNot(BeNil())
  334. Expect(p2.header.PacketNumber).To(BeNumerically(">", p1.header.PacketNumber))
  335. })
  336. It("packs a STOP_WAITING frame first", func() {
  337. mockStreamFramer.EXPECT().HasCryptoStreamData()
  338. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any())
  339. packer.packetNumberGenerator.next = 15
  340. swf := &wire.StopWaitingFrame{LeastUnacked: 10}
  341. packer.QueueControlFrame(&wire.RstStreamFrame{})
  342. packer.QueueControlFrame(swf)
  343. p, err := packer.PackPacket()
  344. Expect(err).ToNot(HaveOccurred())
  345. Expect(p).ToNot(BeNil())
  346. Expect(p.frames).To(HaveLen(2))
  347. Expect(p.frames[0]).To(Equal(swf))
  348. })
  349. It("sets the LeastUnackedDelta length of a STOP_WAITING frame", func() {
  350. mockStreamFramer.EXPECT().HasCryptoStreamData()
  351. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any())
  352. packer.packetNumberGenerator.next = 0x1337
  353. swf := &wire.StopWaitingFrame{LeastUnacked: 0x1337 - 0x100}
  354. packer.QueueControlFrame(&wire.RstStreamFrame{})
  355. packer.QueueControlFrame(swf)
  356. p, err := packer.PackPacket()
  357. Expect(err).ToNot(HaveOccurred())
  358. Expect(p.frames[0].(*wire.StopWaitingFrame).PacketNumberLen).To(Equal(protocol.PacketNumberLen2))
  359. })
  360. It("does not pack a packet containing only a STOP_WAITING frame", func() {
  361. mockStreamFramer.EXPECT().HasCryptoStreamData()
  362. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any())
  363. swf := &wire.StopWaitingFrame{LeastUnacked: 10}
  364. packer.QueueControlFrame(swf)
  365. p, err := packer.PackPacket()
  366. Expect(p).To(BeNil())
  367. Expect(err).ToNot(HaveOccurred())
  368. })
  369. It("packs a packet if it has queued control frames, but no new control frames", func() {
  370. mockStreamFramer.EXPECT().HasCryptoStreamData()
  371. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any())
  372. packer.controlFrames = []wire.Frame{&wire.BlockedFrame{}}
  373. p, err := packer.PackPacket()
  374. Expect(err).ToNot(HaveOccurred())
  375. Expect(p).ToNot(BeNil())
  376. })
  377. It("refuses to send a packet that doesn't contain crypto stream data, if it has never sent a packet before", func() {
  378. mockStreamFramer.EXPECT().HasCryptoStreamData()
  379. packer.hasSentPacket = false
  380. packer.controlFrames = []wire.Frame{&wire.BlockedFrame{}}
  381. p, err := packer.PackPacket()
  382. Expect(err).ToNot(HaveOccurred())
  383. Expect(p).To(BeNil())
  384. })
  385. It("packs many control frames into 1 packets", func() {
  386. f := &wire.AckFrame{AckRanges: []wire.AckRange{{Largest: 1, Smallest: 1}}}
  387. b := &bytes.Buffer{}
  388. err := f.Write(b, packer.version)
  389. Expect(err).ToNot(HaveOccurred())
  390. maxFramesPerPacket := int(maxFrameSize) / b.Len()
  391. var controlFrames []wire.Frame
  392. for i := 0; i < maxFramesPerPacket; i++ {
  393. controlFrames = append(controlFrames, f)
  394. }
  395. packer.controlFrames = controlFrames
  396. payloadFrames, err := packer.composeNextPacket(maxFrameSize, false)
  397. Expect(err).ToNot(HaveOccurred())
  398. Expect(payloadFrames).To(HaveLen(maxFramesPerPacket))
  399. payloadFrames, err = packer.composeNextPacket(maxFrameSize, false)
  400. Expect(err).ToNot(HaveOccurred())
  401. Expect(payloadFrames).To(BeEmpty())
  402. })
  403. It("packs a lot of control frames into 2 packets if they don't fit into one", func() {
  404. blockedFrame := &wire.BlockedFrame{}
  405. maxFramesPerPacket := int(maxFrameSize) / int(blockedFrame.Length(packer.version))
  406. var controlFrames []wire.Frame
  407. for i := 0; i < maxFramesPerPacket+10; i++ {
  408. controlFrames = append(controlFrames, blockedFrame)
  409. }
  410. packer.controlFrames = controlFrames
  411. payloadFrames, err := packer.composeNextPacket(maxFrameSize, false)
  412. Expect(err).ToNot(HaveOccurred())
  413. Expect(payloadFrames).To(HaveLen(maxFramesPerPacket))
  414. payloadFrames, err = packer.composeNextPacket(maxFrameSize, false)
  415. Expect(err).ToNot(HaveOccurred())
  416. Expect(payloadFrames).To(HaveLen(10))
  417. })
  418. It("only increases the packet number when there is an actual packet to send", func() {
  419. mockStreamFramer.EXPECT().HasCryptoStreamData().Times(2)
  420. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any())
  421. packer.packetNumberGenerator.nextToSkip = 1000
  422. p, err := packer.PackPacket()
  423. Expect(p).To(BeNil())
  424. Expect(err).ToNot(HaveOccurred())
  425. Expect(packer.packetNumberGenerator.Peek()).To(Equal(protocol.PacketNumber(1)))
  426. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).Return([]*wire.StreamFrame{{
  427. StreamID: 5,
  428. Data: []byte{0xDE, 0xCA, 0xFB, 0xAD},
  429. }})
  430. p, err = packer.PackPacket()
  431. Expect(err).ToNot(HaveOccurred())
  432. Expect(p).ToNot(BeNil())
  433. Expect(p.header.PacketNumber).To(Equal(protocol.PacketNumber(1)))
  434. Expect(packer.packetNumberGenerator.Peek()).To(Equal(protocol.PacketNumber(2)))
  435. })
  436. Context("making ACK packets retransmittable", func() {
  437. sendMaxNumNonRetransmittableAcks := func() {
  438. mockStreamFramer.EXPECT().HasCryptoStreamData().Times(protocol.MaxNonRetransmittableAcks)
  439. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).Times(protocol.MaxNonRetransmittableAcks)
  440. for i := 0; i < protocol.MaxNonRetransmittableAcks; i++ {
  441. packer.QueueControlFrame(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}})
  442. p, err := packer.PackPacket()
  443. Expect(p).ToNot(BeNil())
  444. Expect(err).ToNot(HaveOccurred())
  445. Expect(p.frames).To(HaveLen(1))
  446. }
  447. }
  448. It("adds a PING frame when it's supposed to send a retransmittable packet", func() {
  449. sendMaxNumNonRetransmittableAcks()
  450. mockStreamFramer.EXPECT().HasCryptoStreamData().Times(2)
  451. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).Times(2)
  452. packer.QueueControlFrame(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}})
  453. p, err := packer.PackPacket()
  454. Expect(p).ToNot(BeNil())
  455. Expect(err).ToNot(HaveOccurred())
  456. Expect(p.frames).To(ContainElement(&wire.PingFrame{}))
  457. // make sure the next packet doesn't contain another PING
  458. packer.QueueControlFrame(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}})
  459. p, err = packer.PackPacket()
  460. Expect(p).ToNot(BeNil())
  461. Expect(err).ToNot(HaveOccurred())
  462. Expect(p.frames).To(HaveLen(1))
  463. })
  464. It("waits until there's something to send before adding a PING frame", func() {
  465. sendMaxNumNonRetransmittableAcks()
  466. mockStreamFramer.EXPECT().HasCryptoStreamData().Times(2)
  467. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).Times(2)
  468. p, err := packer.PackPacket()
  469. Expect(err).ToNot(HaveOccurred())
  470. Expect(p).To(BeNil())
  471. packer.QueueControlFrame(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}})
  472. p, err = packer.PackPacket()
  473. Expect(err).ToNot(HaveOccurred())
  474. Expect(p.frames).To(HaveLen(2))
  475. Expect(p.frames).To(ContainElement(&wire.PingFrame{}))
  476. })
  477. It("doesn't send a PING if it already sent another retransmittable frame", func() {
  478. sendMaxNumNonRetransmittableAcks()
  479. mockStreamFramer.EXPECT().HasCryptoStreamData()
  480. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any())
  481. packer.QueueControlFrame(&wire.MaxDataFrame{})
  482. packer.QueueControlFrame(&wire.StopWaitingFrame{})
  483. p, err := packer.PackPacket()
  484. Expect(p).ToNot(BeNil())
  485. Expect(err).ToNot(HaveOccurred())
  486. Expect(p.frames).To(HaveLen(2))
  487. Expect(p.frames).ToNot(ContainElement(&wire.PingFrame{}))
  488. })
  489. })
  490. Context("STREAM frame handling", func() {
  491. It("does not splits a STREAM frame with maximum size, for gQUIC frames", func() {
  492. mockStreamFramer.EXPECT().HasCryptoStreamData().Times(2)
  493. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).DoAndReturn(func(maxSize protocol.ByteCount) []*wire.StreamFrame {
  494. f := &wire.StreamFrame{
  495. Offset: 1,
  496. StreamID: 5,
  497. DataLenPresent: true,
  498. }
  499. f.Data = bytes.Repeat([]byte{'f'}, int(maxSize-f.Length(packer.version)))
  500. return []*wire.StreamFrame{f}
  501. })
  502. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any())
  503. p, err := packer.PackPacket()
  504. Expect(err).ToNot(HaveOccurred())
  505. Expect(p.frames).To(HaveLen(1))
  506. Expect(p.raw).To(HaveLen(int(maxPacketSize)))
  507. Expect(p.frames[0].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
  508. p, err = packer.PackPacket()
  509. Expect(err).ToNot(HaveOccurred())
  510. Expect(p).To(BeNil())
  511. })
  512. It("does not splits a STREAM frame with maximum size, for IETF draft style frame", func() {
  513. packer.version = versionIETFFrames
  514. mockStreamFramer.EXPECT().HasCryptoStreamData().Times(2)
  515. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).DoAndReturn(func(maxSize protocol.ByteCount) []*wire.StreamFrame {
  516. f := &wire.StreamFrame{
  517. Offset: 1,
  518. StreamID: 5,
  519. DataLenPresent: true,
  520. }
  521. f.Data = bytes.Repeat([]byte{'f'}, int(maxSize-f.Length(packer.version)))
  522. return []*wire.StreamFrame{f}
  523. })
  524. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any())
  525. p, err := packer.PackPacket()
  526. Expect(err).ToNot(HaveOccurred())
  527. Expect(p.frames).To(HaveLen(1))
  528. Expect(p.raw).To(HaveLen(int(maxPacketSize)))
  529. Expect(p.frames[0].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
  530. p, err = packer.PackPacket()
  531. Expect(err).ToNot(HaveOccurred())
  532. Expect(p).To(BeNil())
  533. })
  534. It("packs multiple small STREAM frames into single packet", func() {
  535. f1 := &wire.StreamFrame{
  536. StreamID: 5,
  537. Data: []byte("frame 1"),
  538. DataLenPresent: true,
  539. }
  540. f2 := &wire.StreamFrame{
  541. StreamID: 5,
  542. Data: []byte("frame 2"),
  543. DataLenPresent: true,
  544. }
  545. f3 := &wire.StreamFrame{
  546. StreamID: 3,
  547. Data: []byte("frame 3"),
  548. DataLenPresent: true,
  549. }
  550. mockStreamFramer.EXPECT().HasCryptoStreamData()
  551. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).Return([]*wire.StreamFrame{f1, f2, f3})
  552. p, err := packer.PackPacket()
  553. Expect(p).ToNot(BeNil())
  554. Expect(err).ToNot(HaveOccurred())
  555. Expect(p.frames).To(HaveLen(3))
  556. Expect(p.frames[0].(*wire.StreamFrame).Data).To(Equal([]byte("frame 1")))
  557. Expect(p.frames[1].(*wire.StreamFrame).Data).To(Equal([]byte("frame 2")))
  558. Expect(p.frames[2].(*wire.StreamFrame).Data).To(Equal([]byte("frame 3")))
  559. Expect(p.frames[0].(*wire.StreamFrame).DataLenPresent).To(BeTrue())
  560. Expect(p.frames[1].(*wire.StreamFrame).DataLenPresent).To(BeTrue())
  561. Expect(p.frames[2].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
  562. })
  563. It("refuses to send unencrypted stream data on a data stream", func() {
  564. mockStreamFramer.EXPECT().HasCryptoStreamData()
  565. // don't expect a call to mockStreamFramer.PopStreamFrames
  566. packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionUnencrypted
  567. p, err := packer.PackPacket()
  568. Expect(err).NotTo(HaveOccurred())
  569. Expect(p).To(BeNil())
  570. })
  571. It("sends non forward-secure data as the client", func() {
  572. f := &wire.StreamFrame{
  573. StreamID: 5,
  574. Data: []byte("foobar"),
  575. }
  576. mockStreamFramer.EXPECT().HasCryptoStreamData()
  577. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).Return([]*wire.StreamFrame{f})
  578. packer.perspective = protocol.PerspectiveClient
  579. packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionSecure
  580. p, err := packer.PackPacket()
  581. Expect(err).ToNot(HaveOccurred())
  582. Expect(p.encryptionLevel).To(Equal(protocol.EncryptionSecure))
  583. Expect(p.frames).To(Equal([]wire.Frame{f}))
  584. })
  585. It("does not send non forward-secure data as the server", func() {
  586. mockStreamFramer.EXPECT().HasCryptoStreamData()
  587. // don't expect a call to mockStreamFramer.PopStreamFrames
  588. packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionSecure
  589. p, err := packer.PackPacket()
  590. Expect(err).ToNot(HaveOccurred())
  591. Expect(p).To(BeNil())
  592. })
  593. It("packs a maximum size crypto packet", func() {
  594. var f *wire.StreamFrame
  595. packer.version = versionIETFFrames
  596. mockStreamFramer.EXPECT().HasCryptoStreamData().Return(true)
  597. mockStreamFramer.EXPECT().PopCryptoStreamFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.StreamFrame {
  598. f = &wire.StreamFrame{
  599. StreamID: packer.version.CryptoStreamID(),
  600. Offset: 0x1337,
  601. }
  602. f.Data = bytes.Repeat([]byte{'f'}, int(size-f.Length(packer.version)))
  603. return f
  604. })
  605. p, err := packer.PackPacket()
  606. Expect(err).ToNot(HaveOccurred())
  607. Expect(p.frames).To(HaveLen(1))
  608. expectedPacketLen := packer.maxPacketSize - protocol.NonForwardSecurePacketSizeReduction
  609. Expect(p.raw).To(HaveLen(int(expectedPacketLen)))
  610. Expect(p.header.IsLongHeader).To(BeTrue())
  611. checkPayloadLen(p.raw)
  612. })
  613. It("sends unencrypted stream data on the crypto stream", func() {
  614. f := &wire.StreamFrame{
  615. StreamID: packer.version.CryptoStreamID(),
  616. Data: []byte("foobar"),
  617. }
  618. mockStreamFramer.EXPECT().HasCryptoStreamData().Return(true)
  619. mockStreamFramer.EXPECT().PopCryptoStreamFrame(gomock.Any()).Return(f)
  620. packer.cryptoSetup.(*mockCryptoSetup).encLevelSealCrypto = protocol.EncryptionUnencrypted
  621. p, err := packer.PackPacket()
  622. Expect(err).ToNot(HaveOccurred())
  623. Expect(p.frames).To(Equal([]wire.Frame{f}))
  624. Expect(p.encryptionLevel).To(Equal(protocol.EncryptionUnencrypted))
  625. })
  626. It("sends encrypted stream data on the crypto stream", func() {
  627. f := &wire.StreamFrame{
  628. StreamID: packer.version.CryptoStreamID(),
  629. Data: []byte("foobar"),
  630. }
  631. mockStreamFramer.EXPECT().HasCryptoStreamData().Return(true)
  632. mockStreamFramer.EXPECT().PopCryptoStreamFrame(gomock.Any()).Return(f)
  633. packer.cryptoSetup.(*mockCryptoSetup).encLevelSealCrypto = protocol.EncryptionSecure
  634. p, err := packer.PackPacket()
  635. Expect(err).ToNot(HaveOccurred())
  636. Expect(p.frames).To(Equal([]wire.Frame{f}))
  637. Expect(p.encryptionLevel).To(Equal(protocol.EncryptionSecure))
  638. })
  639. It("does not pack STREAM frames if not allowed", func() {
  640. mockStreamFramer.EXPECT().HasCryptoStreamData()
  641. // don't expect a call to mockStreamFramer.PopStreamFrames
  642. packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionUnencrypted
  643. ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Largest: 10, Smallest: 1}}}
  644. packer.QueueControlFrame(ack)
  645. p, err := packer.PackPacket()
  646. Expect(err).ToNot(HaveOccurred())
  647. Expect(p.frames).To(Equal([]wire.Frame{ack}))
  648. })
  649. })
  650. It("packs a single ACK", func() {
  651. mockStreamFramer.EXPECT().HasCryptoStreamData()
  652. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any())
  653. ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Largest: 42, Smallest: 1}}}
  654. packer.QueueControlFrame(ack)
  655. p, err := packer.PackPacket()
  656. Expect(err).NotTo(HaveOccurred())
  657. Expect(p).ToNot(BeNil())
  658. Expect(p.frames[0]).To(Equal(ack))
  659. })
  660. It("does not return nil if we only have a single ACK but request it to be sent", func() {
  661. mockStreamFramer.EXPECT().HasCryptoStreamData()
  662. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any())
  663. ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}
  664. packer.QueueControlFrame(ack)
  665. p, err := packer.PackPacket()
  666. Expect(err).NotTo(HaveOccurred())
  667. Expect(p).ToNot(BeNil())
  668. })
  669. Context("retransmitting of handshake packets", func() {
  670. swf := &wire.StopWaitingFrame{LeastUnacked: 1}
  671. sf := &wire.StreamFrame{
  672. StreamID: 1,
  673. Data: []byte("foobar"),
  674. }
  675. BeforeEach(func() {
  676. packer.QueueControlFrame(swf)
  677. })
  678. It("packs a retransmission for a packet sent with no encryption", func() {
  679. packet := &ackhandler.Packet{
  680. PacketType: protocol.PacketTypeHandshake,
  681. EncryptionLevel: protocol.EncryptionUnencrypted,
  682. Frames: []wire.Frame{sf},
  683. }
  684. p, err := packer.PackRetransmission(packet)
  685. Expect(err).ToNot(HaveOccurred())
  686. Expect(p).To(HaveLen(1))
  687. Expect(p[0].header.Type).To(Equal(protocol.PacketTypeHandshake))
  688. Expect(p[0].frames).To(Equal([]wire.Frame{swf, sf}))
  689. Expect(p[0].encryptionLevel).To(Equal(protocol.EncryptionUnencrypted))
  690. })
  691. It("doesn't add a STOP_WAITING frame for IETF QUIC", func() {
  692. packer.version = versionIETFFrames
  693. packet := &ackhandler.Packet{
  694. EncryptionLevel: protocol.EncryptionUnencrypted,
  695. Frames: []wire.Frame{sf},
  696. }
  697. p, err := packer.PackRetransmission(packet)
  698. Expect(err).ToNot(HaveOccurred())
  699. Expect(p).To(HaveLen(1))
  700. Expect(p[0].frames).To(Equal([]wire.Frame{sf}))
  701. Expect(p[0].encryptionLevel).To(Equal(protocol.EncryptionUnencrypted))
  702. })
  703. It("packs a retransmission for a packet sent with initial encryption", func() {
  704. packet := &ackhandler.Packet{
  705. EncryptionLevel: protocol.EncryptionSecure,
  706. Frames: []wire.Frame{sf},
  707. }
  708. p, err := packer.PackRetransmission(packet)
  709. Expect(err).ToNot(HaveOccurred())
  710. Expect(p).To(HaveLen(1))
  711. Expect(p[0].frames).To(Equal([]wire.Frame{swf, sf}))
  712. Expect(p[0].encryptionLevel).To(Equal(protocol.EncryptionSecure))
  713. // a packet sent by the server with initial encryption contains the SHLO
  714. // it needs to have a diversification nonce
  715. Expect(p[0].raw).To(ContainSubstring(string(divNonce)))
  716. })
  717. It("includes the diversification nonce on packets sent with initial encryption", func() {
  718. packet := &ackhandler.Packet{
  719. EncryptionLevel: protocol.EncryptionSecure,
  720. Frames: []wire.Frame{sf},
  721. }
  722. p, err := packer.PackRetransmission(packet)
  723. Expect(err).ToNot(HaveOccurred())
  724. Expect(p).To(HaveLen(1))
  725. Expect(p[0].encryptionLevel).To(Equal(protocol.EncryptionSecure))
  726. })
  727. // this should never happen, since non forward-secure packets are limited to a size smaller than MaxPacketSize, such that it is always possible to retransmit them without splitting the StreamFrame
  728. // (note that the retransmitted packet needs to have enough space for the StopWaitingFrame)
  729. It("refuses to send a packet larger than MaxPacketSize", func() {
  730. packet := &ackhandler.Packet{
  731. EncryptionLevel: protocol.EncryptionSecure,
  732. Frames: []wire.Frame{
  733. &wire.StreamFrame{
  734. StreamID: 1,
  735. Data: bytes.Repeat([]byte{'f'}, int(maxPacketSize-5)),
  736. },
  737. },
  738. }
  739. _, err := packer.PackRetransmission(packet)
  740. Expect(err).To(HaveOccurred())
  741. Expect(err.Error()).To(ContainSubstring("PacketPacker BUG: packet too large"))
  742. })
  743. It("pads Initial packets to the required minimum packet size", func() {
  744. f := &wire.StreamFrame{
  745. StreamID: packer.version.CryptoStreamID(),
  746. Data: []byte("foobar"),
  747. }
  748. mockStreamFramer.EXPECT().HasCryptoStreamData().Return(true)
  749. mockStreamFramer.EXPECT().PopCryptoStreamFrame(gomock.Any()).Return(f)
  750. packer.version = protocol.VersionTLS
  751. packer.hasSentPacket = false
  752. packer.perspective = protocol.PerspectiveClient
  753. packer.cryptoSetup.(*mockCryptoSetup).encLevelSealCrypto = protocol.EncryptionUnencrypted
  754. packet, err := packer.PackPacket()
  755. Expect(err).ToNot(HaveOccurred())
  756. Expect(packet.header.Token).To(Equal(token))
  757. Expect(packet.raw).To(HaveLen(protocol.MinInitialPacketSize))
  758. Expect(packet.frames).To(HaveLen(1))
  759. sf := packet.frames[0].(*wire.StreamFrame)
  760. Expect(sf.Data).To(Equal([]byte("foobar")))
  761. Expect(sf.DataLenPresent).To(BeTrue())
  762. })
  763. It("set the correct payload length for an Initial packet", func() {
  764. mockStreamFramer.EXPECT().HasCryptoStreamData().Return(true)
  765. mockStreamFramer.EXPECT().PopCryptoStreamFrame(gomock.Any()).Return(&wire.StreamFrame{
  766. StreamID: packer.version.CryptoStreamID(),
  767. Data: []byte("foobar"),
  768. })
  769. packer.version = protocol.VersionTLS
  770. packer.hasSentPacket = false
  771. packer.perspective = protocol.PerspectiveClient
  772. packer.cryptoSetup.(*mockCryptoSetup).encLevelSealCrypto = protocol.EncryptionUnencrypted
  773. packet, err := packer.PackPacket()
  774. Expect(err).ToNot(HaveOccurred())
  775. checkPayloadLen(packet.raw)
  776. })
  777. It("packs a retransmission for an Initial packet", func() {
  778. packer.version = versionIETFFrames
  779. packer.perspective = protocol.PerspectiveClient
  780. packet := &ackhandler.Packet{
  781. PacketType: protocol.PacketTypeInitial,
  782. EncryptionLevel: protocol.EncryptionUnencrypted,
  783. Frames: []wire.Frame{sf},
  784. }
  785. p, err := packer.PackRetransmission(packet)
  786. Expect(err).ToNot(HaveOccurred())
  787. Expect(p).To(HaveLen(1))
  788. Expect(p[0].frames).To(Equal([]wire.Frame{sf}))
  789. Expect(p[0].encryptionLevel).To(Equal(protocol.EncryptionUnencrypted))
  790. Expect(p[0].header.Type).To(Equal(protocol.PacketTypeInitial))
  791. Expect(p[0].header.Token).To(Equal(token))
  792. })
  793. It("refuses to retransmit packets without a STOP_WAITING Frame", func() {
  794. packer.stopWaiting = nil
  795. _, err := packer.PackRetransmission(&ackhandler.Packet{
  796. EncryptionLevel: protocol.EncryptionSecure,
  797. })
  798. Expect(err).To(MatchError("PacketPacker BUG: Handshake retransmissions must contain a STOP_WAITING frame"))
  799. })
  800. })
  801. Context("retransmission of forward-secure packets", func() {
  802. BeforeEach(func() {
  803. packer.packetNumberGenerator.next = 15
  804. packer.stopWaiting = &wire.StopWaitingFrame{LeastUnacked: 7}
  805. })
  806. It("retransmits a small packet", func() {
  807. frames := []wire.Frame{
  808. &wire.MaxDataFrame{ByteOffset: 0x1234},
  809. &wire.StreamFrame{StreamID: 42, Data: []byte("foobar")},
  810. }
  811. packets, err := packer.PackRetransmission(&ackhandler.Packet{
  812. EncryptionLevel: protocol.EncryptionForwardSecure,
  813. Frames: frames,
  814. })
  815. Expect(err).ToNot(HaveOccurred())
  816. Expect(packets).To(HaveLen(1))
  817. p := packets[0]
  818. Expect(p.encryptionLevel).To(Equal(protocol.EncryptionForwardSecure))
  819. Expect(p.frames).To(HaveLen(3))
  820. Expect(p.frames[0]).To(BeAssignableToTypeOf(&wire.StopWaitingFrame{}))
  821. Expect(p.frames[0].(*wire.StopWaitingFrame).LeastUnacked).To(Equal(protocol.PacketNumber(7)))
  822. Expect(p.frames[0].(*wire.StopWaitingFrame).PacketNumber).To(Equal(p.header.PacketNumber))
  823. Expect(p.frames[0].(*wire.StopWaitingFrame).PacketNumberLen).To(Equal(p.header.PacketNumberLen))
  824. Expect(p.frames[1:]).To(Equal(frames))
  825. })
  826. It("refuses to retransmit packets without a STOP_WAITING Frame", func() {
  827. packer.stopWaiting = nil
  828. _, err := packer.PackRetransmission(&ackhandler.Packet{
  829. EncryptionLevel: protocol.EncryptionForwardSecure,
  830. Frames: []wire.Frame{&wire.MaxDataFrame{ByteOffset: 0x1234}},
  831. })
  832. Expect(err).To(MatchError("PacketPacker BUG: Handshake retransmissions must contain a STOP_WAITING frame"))
  833. })
  834. It("packs two packets for retransmission if the original packet contained many control frames", func() {
  835. var frames []wire.Frame
  836. var totalLen protocol.ByteCount
  837. // pack a bunch of control frames, such that the packet is way bigger than a single packet
  838. for i := 0; totalLen < maxPacketSize*3/2; i++ {
  839. f := &wire.MaxStreamDataFrame{StreamID: protocol.StreamID(i), ByteOffset: protocol.ByteCount(i)}
  840. frames = append(frames, f)
  841. totalLen += f.Length(packer.version)
  842. }
  843. packets, err := packer.PackRetransmission(&ackhandler.Packet{
  844. EncryptionLevel: protocol.EncryptionForwardSecure,
  845. Frames: frames,
  846. })
  847. Expect(err).ToNot(HaveOccurred())
  848. Expect(packets).To(HaveLen(2))
  849. Expect(len(packets[0].frames) + len(packets[1].frames)).To(Equal(len(frames) + 2)) // all frames, plus 2 STOP_WAITING frames
  850. Expect(packets[0].frames[0]).To(BeAssignableToTypeOf(&wire.StopWaitingFrame{}))
  851. Expect(packets[1].frames[0]).To(BeAssignableToTypeOf(&wire.StopWaitingFrame{}))
  852. Expect(packets[0].frames[1:]).To(Equal(frames[:len(packets[0].frames)-1]))
  853. Expect(packets[1].frames[1:]).To(Equal(frames[len(packets[0].frames)-1:]))
  854. // check that the first packet was filled up as far as possible:
  855. // if the first frame (after the STOP_WAITING) was packed into the first packet, it would have overflown the MaxPacketSize
  856. Expect(len(packets[0].raw) + int(packets[1].frames[1].Length(packer.version))).To(BeNumerically(">", maxPacketSize))
  857. })
  858. It("splits a STREAM frame that doesn't fit", func() {
  859. packets, err := packer.PackRetransmission(&ackhandler.Packet{
  860. EncryptionLevel: protocol.EncryptionForwardSecure,
  861. Frames: []wire.Frame{&wire.StreamFrame{
  862. StreamID: 42,
  863. Offset: 1337,
  864. Data: bytes.Repeat([]byte{'a'}, int(maxPacketSize)*3/2),
  865. }},
  866. })
  867. Expect(err).ToNot(HaveOccurred())
  868. Expect(packets).To(HaveLen(2))
  869. Expect(packets[0].frames[0]).To(BeAssignableToTypeOf(&wire.StopWaitingFrame{}))
  870. Expect(packets[1].frames[0]).To(BeAssignableToTypeOf(&wire.StopWaitingFrame{}))
  871. Expect(packets[0].frames[1]).To(BeAssignableToTypeOf(&wire.StreamFrame{}))
  872. Expect(packets[1].frames[1]).To(BeAssignableToTypeOf(&wire.StreamFrame{}))
  873. sf1 := packets[0].frames[1].(*wire.StreamFrame)
  874. sf2 := packets[1].frames[1].(*wire.StreamFrame)
  875. Expect(sf1.StreamID).To(Equal(protocol.StreamID(42)))
  876. Expect(sf1.Offset).To(Equal(protocol.ByteCount(1337)))
  877. Expect(sf1.DataLenPresent).To(BeFalse())
  878. Expect(sf2.StreamID).To(Equal(protocol.StreamID(42)))
  879. Expect(sf2.Offset).To(Equal(protocol.ByteCount(1337) + sf1.DataLen()))
  880. Expect(sf2.DataLenPresent).To(BeFalse())
  881. Expect(sf1.DataLen() + sf2.DataLen()).To(Equal(maxPacketSize * 3 / 2))
  882. Expect(packets[0].raw).To(HaveLen(int(maxPacketSize)))
  883. })
  884. It("packs two packets for retransmission if the original packet contained many STREAM frames", func() {
  885. var frames []wire.Frame
  886. var totalLen protocol.ByteCount
  887. // pack a bunch of control frames, such that the packet is way bigger than a single packet
  888. for i := 0; totalLen < maxPacketSize*3/2; i++ {
  889. f := &wire.StreamFrame{
  890. StreamID: protocol.StreamID(i),
  891. Data: []byte("foobar"),
  892. DataLenPresent: true,
  893. }
  894. frames = append(frames, f)
  895. totalLen += f.Length(packer.version)
  896. }
  897. packets, err := packer.PackRetransmission(&ackhandler.Packet{
  898. EncryptionLevel: protocol.EncryptionForwardSecure,
  899. Frames: frames,
  900. })
  901. Expect(err).ToNot(HaveOccurred())
  902. Expect(packets).To(HaveLen(2))
  903. Expect(len(packets[0].frames) + len(packets[1].frames)).To(Equal(len(frames) + 2)) // all frames, plus 2 STOP_WAITING frames
  904. Expect(packets[0].frames[0]).To(BeAssignableToTypeOf(&wire.StopWaitingFrame{}))
  905. Expect(packets[1].frames[0]).To(BeAssignableToTypeOf(&wire.StopWaitingFrame{}))
  906. Expect(packets[0].frames[1:]).To(Equal(frames[:len(packets[0].frames)-1]))
  907. Expect(packets[1].frames[1:]).To(Equal(frames[len(packets[0].frames)-1:]))
  908. // check that the first packet was filled up as far as possible:
  909. // if the first frame (after the STOP_WAITING) was packed into the first packet, it would have overflown the MaxPacketSize
  910. Expect(len(packets[0].raw) + int(packets[1].frames[1].Length(packer.version))).To(BeNumerically(">", maxPacketSize-protocol.MinStreamFrameSize))
  911. })
  912. It("correctly sets the DataLenPresent on STREAM frames", func() {
  913. frames := []wire.Frame{
  914. &wire.StreamFrame{StreamID: 4, Data: []byte("foobar"), DataLenPresent: true},
  915. &wire.StreamFrame{StreamID: 5, Data: []byte("barfoo")},
  916. }
  917. packets, err := packer.PackRetransmission(&ackhandler.Packet{
  918. EncryptionLevel: protocol.EncryptionForwardSecure,
  919. Frames: frames,
  920. })
  921. Expect(err).ToNot(HaveOccurred())
  922. Expect(packets).To(HaveLen(1))
  923. p := packets[0]
  924. Expect(p.frames).To(HaveLen(3))
  925. Expect(p.frames[1]).To(BeAssignableToTypeOf(&wire.StreamFrame{}))
  926. Expect(p.frames[2]).To(BeAssignableToTypeOf(&wire.StreamFrame{}))
  927. sf1 := p.frames[1].(*wire.StreamFrame)
  928. sf2 := p.frames[2].(*wire.StreamFrame)
  929. Expect(sf1.StreamID).To(Equal(protocol.StreamID(4)))
  930. Expect(sf1.DataLenPresent).To(BeTrue())
  931. Expect(sf2.StreamID).To(Equal(protocol.StreamID(5)))
  932. Expect(sf2.DataLenPresent).To(BeFalse())
  933. })
  934. })
  935. Context("packing ACK packets", func() {
  936. It("packs ACK packets", func() {
  937. packer.QueueControlFrame(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}})
  938. p, err := packer.PackAckPacket()
  939. Expect(err).NotTo(HaveOccurred())
  940. Expect(p.frames).To(HaveLen(1))
  941. Expect(p.frames[0]).To(BeAssignableToTypeOf(&wire.AckFrame{}))
  942. ack := p.frames[0].(*wire.AckFrame)
  943. Expect(ack.LargestAcked()).To(Equal(protocol.PacketNumber(10)))
  944. })
  945. It("packs ACK packets with STOP_WAITING frames", func() {
  946. packer.QueueControlFrame(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}})
  947. packer.QueueControlFrame(&wire.StopWaitingFrame{})
  948. p, err := packer.PackAckPacket()
  949. Expect(err).NotTo(HaveOccurred())
  950. Expect(p.frames).To(HaveLen(2))
  951. Expect(p.frames[0]).To(BeAssignableToTypeOf(&wire.AckFrame{}))
  952. Expect(p.frames[1]).To(Equal(&wire.StopWaitingFrame{PacketNumber: 1, PacketNumberLen: 2}))
  953. })
  954. })
  955. Context("max packet size", func() {
  956. It("sets the maximum packet size", func() {
  957. for i := 0; i < 10*int(maxPacketSize); i++ {
  958. packer.QueueControlFrame(&wire.PingFrame{})
  959. }
  960. mockStreamFramer.EXPECT().HasCryptoStreamData().AnyTimes()
  961. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).AnyTimes()
  962. p, err := packer.PackPacket()
  963. Expect(err).ToNot(HaveOccurred())
  964. Expect(p.raw).To(HaveLen(int(maxPacketSize)))
  965. // now reduce the maxPacketSize
  966. packer.SetMaxPacketSize(maxPacketSize - 10)
  967. p, err = packer.PackPacket()
  968. Expect(err).ToNot(HaveOccurred())
  969. Expect(p.raw).To(HaveLen(int(maxPacketSize) - 10))
  970. })
  971. It("doesn't increase the max packet size", func() {
  972. for i := 0; i < 10*int(maxPacketSize); i++ {
  973. packer.QueueControlFrame(&wire.PingFrame{})
  974. }
  975. mockStreamFramer.EXPECT().HasCryptoStreamData().AnyTimes()
  976. mockStreamFramer.EXPECT().PopStreamFrames(gomock.Any()).AnyTimes()
  977. p, err := packer.PackPacket()
  978. Expect(err).ToNot(HaveOccurred())
  979. Expect(p.raw).To(HaveLen(int(maxPacketSize)))
  980. // now try to increase the maxPacketSize
  981. packer.SetMaxPacketSize(maxPacketSize + 10)
  982. p, err = packer.PackPacket()
  983. Expect(err).ToNot(HaveOccurred())
  984. Expect(p.raw).To(HaveLen(int(maxPacketSize)))
  985. })
  986. })
  987. })