packet_packer.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914
  1. package quic
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "net"
  7. "time"
  8. "github.com/Psiphon-Labs/quic-go/internal/ackhandler"
  9. "github.com/Psiphon-Labs/quic-go/internal/handshake"
  10. "github.com/Psiphon-Labs/quic-go/internal/protocol"
  11. "github.com/Psiphon-Labs/quic-go/internal/qerr"
  12. "github.com/Psiphon-Labs/quic-go/internal/utils"
  13. "github.com/Psiphon-Labs/quic-go/internal/wire"
  14. )
  15. type packer interface {
  16. PackCoalescedPacket() (*coalescedPacket, error)
  17. PackPacket() (*packedPacket, error)
  18. MaybePackProbePacket(protocol.EncryptionLevel) (*packedPacket, error)
  19. MaybePackAckPacket(handshakeConfirmed bool) (*packedPacket, error)
  20. PackConnectionClose(*qerr.TransportError) (*coalescedPacket, error)
  21. PackApplicationClose(*qerr.ApplicationError) (*coalescedPacket, error)
  22. SetMaxPacketSize(protocol.ByteCount)
  23. PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount) (*packedPacket, error)
  24. HandleTransportParameters(*wire.TransportParameters)
  25. SetToken([]byte)
  26. }
  27. type sealer interface {
  28. handshake.LongHeaderSealer
  29. }
  30. type payload struct {
  31. frames []ackhandler.Frame
  32. ack *wire.AckFrame
  33. length protocol.ByteCount
  34. }
  35. type packedPacket struct {
  36. buffer *packetBuffer
  37. *packetContents
  38. }
  39. type packetContents struct {
  40. header *wire.ExtendedHeader
  41. ack *wire.AckFrame
  42. frames []ackhandler.Frame
  43. length protocol.ByteCount
  44. isMTUProbePacket bool
  45. }
  46. type coalescedPacket struct {
  47. buffer *packetBuffer
  48. packets []*packetContents
  49. }
  50. func (p *packetContents) EncryptionLevel() protocol.EncryptionLevel {
  51. if !p.header.IsLongHeader {
  52. return protocol.Encryption1RTT
  53. }
  54. //nolint:exhaustive // Will never be called for Retry packets (and they don't have encrypted data).
  55. switch p.header.Type {
  56. case protocol.PacketTypeInitial:
  57. return protocol.EncryptionInitial
  58. case protocol.PacketTypeHandshake:
  59. return protocol.EncryptionHandshake
  60. case protocol.PacketType0RTT:
  61. return protocol.Encryption0RTT
  62. default:
  63. panic("can't determine encryption level")
  64. }
  65. }
  66. func (p *packetContents) IsAckEliciting() bool {
  67. return ackhandler.HasAckElicitingFrames(p.frames)
  68. }
  69. func (p *packetContents) ToAckHandlerPacket(now time.Time, q *retransmissionQueue) *ackhandler.Packet {
  70. largestAcked := protocol.InvalidPacketNumber
  71. if p.ack != nil {
  72. largestAcked = p.ack.LargestAcked()
  73. }
  74. encLevel := p.EncryptionLevel()
  75. for i := range p.frames {
  76. if p.frames[i].OnLost != nil {
  77. continue
  78. }
  79. switch encLevel {
  80. case protocol.EncryptionInitial:
  81. p.frames[i].OnLost = q.AddInitial
  82. case protocol.EncryptionHandshake:
  83. p.frames[i].OnLost = q.AddHandshake
  84. case protocol.Encryption0RTT, protocol.Encryption1RTT:
  85. p.frames[i].OnLost = q.AddAppData
  86. }
  87. }
  88. return &ackhandler.Packet{
  89. PacketNumber: p.header.PacketNumber,
  90. LargestAcked: largestAcked,
  91. Frames: p.frames,
  92. Length: p.length,
  93. EncryptionLevel: encLevel,
  94. SendTime: now,
  95. IsPathMTUProbePacket: p.isMTUProbePacket,
  96. }
  97. }
  98. func getMaxPacketSize(addr net.Addr, maxPacketSizeAdustment int) protocol.ByteCount {
  99. maxSize := protocol.ByteCount(protocol.MinInitialPacketSize)
  100. // If this is not a UDP address, we don't know anything about the MTU.
  101. // Use the minimum size of an Initial packet as the max packet size.
  102. if udpAddr, ok := addr.(*net.UDPAddr); ok {
  103. if utils.IsIPv4(udpAddr.IP) {
  104. maxSize = protocol.InitialPacketSizeIPv4
  105. } else {
  106. maxSize = protocol.InitialPacketSizeIPv6
  107. }
  108. // [Psiphon]
  109. //
  110. // Adjust the max packet size to allow for obfuscation overhead. This
  111. // is a best-effort operation. In practice, maxPacketSizeAdustment
  112. // will be tens of bytes and maxSize is over 1200 bytes; the
  113. // condition here is a sanity check guard to prevent negative sizes
  114. // and possible panics. We don't expect to need to make the largest
  115. // adustment that would be possible when the condition is false.
  116. //
  117. // TODO: internal/congestion.cubicSender continues to use
  118. // initialMaxDatagramSize = protocol.InitialPacketSizeIPv4
  119. if maxSize > protocol.ByteCount(maxPacketSizeAdustment) {
  120. maxSize -= protocol.ByteCount(maxPacketSizeAdustment)
  121. }
  122. }
  123. return maxSize
  124. }
  125. type packetNumberManager interface {
  126. PeekPacketNumber(protocol.EncryptionLevel) (protocol.PacketNumber, protocol.PacketNumberLen)
  127. PopPacketNumber(protocol.EncryptionLevel) protocol.PacketNumber
  128. }
  129. type sealingManager interface {
  130. GetInitialSealer() (handshake.LongHeaderSealer, error)
  131. GetHandshakeSealer() (handshake.LongHeaderSealer, error)
  132. Get0RTTSealer() (handshake.LongHeaderSealer, error)
  133. Get1RTTSealer() (handshake.ShortHeaderSealer, error)
  134. }
  135. type frameSource interface {
  136. HasData() bool
  137. AppendStreamFrames([]ackhandler.Frame, protocol.ByteCount) ([]ackhandler.Frame, protocol.ByteCount)
  138. AppendControlFrames([]ackhandler.Frame, protocol.ByteCount) ([]ackhandler.Frame, protocol.ByteCount)
  139. }
  140. type ackFrameSource interface {
  141. GetAckFrame(encLevel protocol.EncryptionLevel, onlyIfQueued bool) *wire.AckFrame
  142. }
  143. type packetPacker struct {
  144. srcConnID protocol.ConnectionID
  145. getDestConnID func() protocol.ConnectionID
  146. perspective protocol.Perspective
  147. version protocol.VersionNumber
  148. cryptoSetup sealingManager
  149. initialStream cryptoStream
  150. handshakeStream cryptoStream
  151. token []byte
  152. pnManager packetNumberManager
  153. framer frameSource
  154. acks ackFrameSource
  155. datagramQueue *datagramQueue
  156. retransmissionQueue *retransmissionQueue
  157. maxPacketSize protocol.ByteCount
  158. numNonAckElicitingAcks int
  159. }
  160. var _ packer = &packetPacker{}
  161. func newPacketPacker(
  162. srcConnID protocol.ConnectionID,
  163. getDestConnID func() protocol.ConnectionID,
  164. initialStream cryptoStream,
  165. handshakeStream cryptoStream,
  166. packetNumberManager packetNumberManager,
  167. retransmissionQueue *retransmissionQueue,
  168. remoteAddr net.Addr, // only used for determining the max packet size
  169. // [Psiphon]
  170. maxPacketSizeAdustment int,
  171. cryptoSetup sealingManager,
  172. framer frameSource,
  173. acks ackFrameSource,
  174. datagramQueue *datagramQueue,
  175. perspective protocol.Perspective,
  176. version protocol.VersionNumber,
  177. ) *packetPacker {
  178. return &packetPacker{
  179. cryptoSetup: cryptoSetup,
  180. getDestConnID: getDestConnID,
  181. srcConnID: srcConnID,
  182. initialStream: initialStream,
  183. handshakeStream: handshakeStream,
  184. retransmissionQueue: retransmissionQueue,
  185. datagramQueue: datagramQueue,
  186. perspective: perspective,
  187. version: version,
  188. framer: framer,
  189. acks: acks,
  190. pnManager: packetNumberManager,
  191. maxPacketSize: getMaxPacketSize(remoteAddr, maxPacketSizeAdustment),
  192. }
  193. }
  194. // PackConnectionClose packs a packet that closes the connection with a transport error.
  195. func (p *packetPacker) PackConnectionClose(e *qerr.TransportError) (*coalescedPacket, error) {
  196. var reason string
  197. // don't send details of crypto errors
  198. if !e.ErrorCode.IsCryptoError() {
  199. reason = e.ErrorMessage
  200. }
  201. return p.packConnectionClose(false, uint64(e.ErrorCode), e.FrameType, reason)
  202. }
  203. // PackApplicationClose packs a packet that closes the connection with an application error.
  204. func (p *packetPacker) PackApplicationClose(e *qerr.ApplicationError) (*coalescedPacket, error) {
  205. return p.packConnectionClose(true, uint64(e.ErrorCode), 0, e.ErrorMessage)
  206. }
  207. func (p *packetPacker) packConnectionClose(
  208. isApplicationError bool,
  209. errorCode uint64,
  210. frameType uint64,
  211. reason string,
  212. ) (*coalescedPacket, error) {
  213. var sealers [4]sealer
  214. var hdrs [4]*wire.ExtendedHeader
  215. var payloads [4]*payload
  216. var size protocol.ByteCount
  217. var numPackets uint8
  218. encLevels := [4]protocol.EncryptionLevel{protocol.EncryptionInitial, protocol.EncryptionHandshake, protocol.Encryption0RTT, protocol.Encryption1RTT}
  219. for i, encLevel := range encLevels {
  220. if p.perspective == protocol.PerspectiveServer && encLevel == protocol.Encryption0RTT {
  221. continue
  222. }
  223. ccf := &wire.ConnectionCloseFrame{
  224. IsApplicationError: isApplicationError,
  225. ErrorCode: errorCode,
  226. FrameType: frameType,
  227. ReasonPhrase: reason,
  228. }
  229. // don't send application errors in Initial or Handshake packets
  230. if isApplicationError && (encLevel == protocol.EncryptionInitial || encLevel == protocol.EncryptionHandshake) {
  231. ccf.IsApplicationError = false
  232. ccf.ErrorCode = uint64(qerr.ApplicationErrorErrorCode)
  233. ccf.ReasonPhrase = ""
  234. }
  235. payload := &payload{
  236. frames: []ackhandler.Frame{{Frame: ccf}},
  237. length: ccf.Length(p.version),
  238. }
  239. var sealer sealer
  240. var err error
  241. var keyPhase protocol.KeyPhaseBit // only set for 1-RTT
  242. switch encLevel {
  243. case protocol.EncryptionInitial:
  244. sealer, err = p.cryptoSetup.GetInitialSealer()
  245. case protocol.EncryptionHandshake:
  246. sealer, err = p.cryptoSetup.GetHandshakeSealer()
  247. case protocol.Encryption0RTT:
  248. sealer, err = p.cryptoSetup.Get0RTTSealer()
  249. case protocol.Encryption1RTT:
  250. var s handshake.ShortHeaderSealer
  251. s, err = p.cryptoSetup.Get1RTTSealer()
  252. if err == nil {
  253. keyPhase = s.KeyPhase()
  254. }
  255. sealer = s
  256. }
  257. if err == handshake.ErrKeysNotYetAvailable || err == handshake.ErrKeysDropped {
  258. continue
  259. }
  260. if err != nil {
  261. return nil, err
  262. }
  263. sealers[i] = sealer
  264. var hdr *wire.ExtendedHeader
  265. if encLevel == protocol.Encryption1RTT {
  266. hdr = p.getShortHeader(keyPhase)
  267. } else {
  268. hdr = p.getLongHeader(encLevel)
  269. }
  270. hdrs[i] = hdr
  271. payloads[i] = payload
  272. size += p.packetLength(hdr, payload) + protocol.ByteCount(sealer.Overhead())
  273. numPackets++
  274. }
  275. contents := make([]*packetContents, 0, numPackets)
  276. buffer := getPacketBuffer()
  277. for i, encLevel := range encLevels {
  278. if sealers[i] == nil {
  279. continue
  280. }
  281. var paddingLen protocol.ByteCount
  282. if encLevel == protocol.EncryptionInitial {
  283. paddingLen = p.initialPaddingLen(payloads[i].frames, size)
  284. }
  285. c, err := p.appendPacket(buffer, hdrs[i], payloads[i], paddingLen, encLevel, sealers[i], false)
  286. if err != nil {
  287. return nil, err
  288. }
  289. contents = append(contents, c)
  290. }
  291. return &coalescedPacket{buffer: buffer, packets: contents}, nil
  292. }
  293. // packetLength calculates the length of the serialized packet.
  294. // It takes into account that packets that have a tiny payload need to be padded,
  295. // such that len(payload) + packet number len >= 4 + AEAD overhead
  296. func (p *packetPacker) packetLength(hdr *wire.ExtendedHeader, payload *payload) protocol.ByteCount {
  297. var paddingLen protocol.ByteCount
  298. pnLen := protocol.ByteCount(hdr.PacketNumberLen)
  299. if payload.length < 4-pnLen {
  300. paddingLen = 4 - pnLen - payload.length
  301. }
  302. return hdr.GetLength(p.version) + payload.length + paddingLen
  303. }
  304. func (p *packetPacker) MaybePackAckPacket(handshakeConfirmed bool) (*packedPacket, error) {
  305. var encLevel protocol.EncryptionLevel
  306. var ack *wire.AckFrame
  307. if !handshakeConfirmed {
  308. ack = p.acks.GetAckFrame(protocol.EncryptionInitial, true)
  309. if ack != nil {
  310. encLevel = protocol.EncryptionInitial
  311. } else {
  312. ack = p.acks.GetAckFrame(protocol.EncryptionHandshake, true)
  313. if ack != nil {
  314. encLevel = protocol.EncryptionHandshake
  315. }
  316. }
  317. }
  318. if ack == nil {
  319. ack = p.acks.GetAckFrame(protocol.Encryption1RTT, true)
  320. if ack == nil {
  321. return nil, nil
  322. }
  323. encLevel = protocol.Encryption1RTT
  324. }
  325. payload := &payload{
  326. ack: ack,
  327. length: ack.Length(p.version),
  328. }
  329. sealer, hdr, err := p.getSealerAndHeader(encLevel)
  330. if err != nil {
  331. return nil, err
  332. }
  333. return p.writeSinglePacket(hdr, payload, encLevel, sealer)
  334. }
  335. // size is the expected size of the packet, if no padding was applied.
  336. func (p *packetPacker) initialPaddingLen(frames []ackhandler.Frame, size protocol.ByteCount) protocol.ByteCount {
  337. // For the server, only ack-eliciting Initial packets need to be padded.
  338. if p.perspective == protocol.PerspectiveServer && !ackhandler.HasAckElicitingFrames(frames) {
  339. return 0
  340. }
  341. if size >= p.maxPacketSize {
  342. return 0
  343. }
  344. return p.maxPacketSize - size
  345. }
  346. // PackCoalescedPacket packs a new packet.
  347. // It packs an Initial / Handshake if there is data to send in these packet number spaces.
  348. // It should only be called before the handshake is confirmed.
  349. func (p *packetPacker) PackCoalescedPacket() (*coalescedPacket, error) {
  350. maxPacketSize := p.maxPacketSize
  351. if p.perspective == protocol.PerspectiveClient {
  352. maxPacketSize = protocol.MinInitialPacketSize
  353. }
  354. var initialHdr, handshakeHdr, appDataHdr *wire.ExtendedHeader
  355. var initialPayload, handshakePayload, appDataPayload *payload
  356. var numPackets int
  357. // Try packing an Initial packet.
  358. initialSealer, err := p.cryptoSetup.GetInitialSealer()
  359. if err != nil && err != handshake.ErrKeysDropped {
  360. return nil, err
  361. }
  362. var size protocol.ByteCount
  363. if initialSealer != nil {
  364. initialHdr, initialPayload = p.maybeGetCryptoPacket(maxPacketSize-protocol.ByteCount(initialSealer.Overhead()), size, protocol.EncryptionInitial)
  365. if initialPayload != nil {
  366. size += p.packetLength(initialHdr, initialPayload) + protocol.ByteCount(initialSealer.Overhead())
  367. numPackets++
  368. }
  369. }
  370. // Add a Handshake packet.
  371. var handshakeSealer sealer
  372. if size < maxPacketSize-protocol.MinCoalescedPacketSize {
  373. var err error
  374. handshakeSealer, err = p.cryptoSetup.GetHandshakeSealer()
  375. if err != nil && err != handshake.ErrKeysDropped && err != handshake.ErrKeysNotYetAvailable {
  376. return nil, err
  377. }
  378. if handshakeSealer != nil {
  379. handshakeHdr, handshakePayload = p.maybeGetCryptoPacket(maxPacketSize-size-protocol.ByteCount(handshakeSealer.Overhead()), size, protocol.EncryptionHandshake)
  380. if handshakePayload != nil {
  381. s := p.packetLength(handshakeHdr, handshakePayload) + protocol.ByteCount(handshakeSealer.Overhead())
  382. size += s
  383. numPackets++
  384. }
  385. }
  386. }
  387. // Add a 0-RTT / 1-RTT packet.
  388. var appDataSealer sealer
  389. appDataEncLevel := protocol.Encryption1RTT
  390. if size < maxPacketSize-protocol.MinCoalescedPacketSize {
  391. var err error
  392. appDataSealer, appDataHdr, appDataPayload = p.maybeGetAppDataPacket(maxPacketSize-size, size)
  393. if err != nil {
  394. return nil, err
  395. }
  396. if appDataHdr != nil {
  397. if appDataHdr.IsLongHeader {
  398. appDataEncLevel = protocol.Encryption0RTT
  399. }
  400. if appDataPayload != nil {
  401. size += p.packetLength(appDataHdr, appDataPayload) + protocol.ByteCount(appDataSealer.Overhead())
  402. numPackets++
  403. }
  404. }
  405. }
  406. if numPackets == 0 {
  407. return nil, nil
  408. }
  409. buffer := getPacketBuffer()
  410. packet := &coalescedPacket{
  411. buffer: buffer,
  412. packets: make([]*packetContents, 0, numPackets),
  413. }
  414. if initialPayload != nil {
  415. padding := p.initialPaddingLen(initialPayload.frames, size)
  416. cont, err := p.appendPacket(buffer, initialHdr, initialPayload, padding, protocol.EncryptionInitial, initialSealer, false)
  417. if err != nil {
  418. return nil, err
  419. }
  420. packet.packets = append(packet.packets, cont)
  421. }
  422. if handshakePayload != nil {
  423. cont, err := p.appendPacket(buffer, handshakeHdr, handshakePayload, 0, protocol.EncryptionHandshake, handshakeSealer, false)
  424. if err != nil {
  425. return nil, err
  426. }
  427. packet.packets = append(packet.packets, cont)
  428. }
  429. if appDataPayload != nil {
  430. cont, err := p.appendPacket(buffer, appDataHdr, appDataPayload, 0, appDataEncLevel, appDataSealer, false)
  431. if err != nil {
  432. return nil, err
  433. }
  434. packet.packets = append(packet.packets, cont)
  435. }
  436. return packet, nil
  437. }
  438. // PackPacket packs a packet in the application data packet number space.
  439. // It should be called after the handshake is confirmed.
  440. func (p *packetPacker) PackPacket() (*packedPacket, error) {
  441. sealer, hdr, payload := p.maybeGetAppDataPacket(p.maxPacketSize, 0)
  442. if payload == nil {
  443. return nil, nil
  444. }
  445. buffer := getPacketBuffer()
  446. encLevel := protocol.Encryption1RTT
  447. if hdr.IsLongHeader {
  448. encLevel = protocol.Encryption0RTT
  449. }
  450. cont, err := p.appendPacket(buffer, hdr, payload, 0, encLevel, sealer, false)
  451. if err != nil {
  452. return nil, err
  453. }
  454. return &packedPacket{
  455. buffer: buffer,
  456. packetContents: cont,
  457. }, nil
  458. }
  459. func (p *packetPacker) maybeGetCryptoPacket(maxPacketSize, currentSize protocol.ByteCount, encLevel protocol.EncryptionLevel) (*wire.ExtendedHeader, *payload) {
  460. var s cryptoStream
  461. var hasRetransmission bool
  462. //nolint:exhaustive // Initial and Handshake are the only two encryption levels here.
  463. switch encLevel {
  464. case protocol.EncryptionInitial:
  465. s = p.initialStream
  466. hasRetransmission = p.retransmissionQueue.HasInitialData()
  467. case protocol.EncryptionHandshake:
  468. s = p.handshakeStream
  469. hasRetransmission = p.retransmissionQueue.HasHandshakeData()
  470. }
  471. hasData := s.HasData()
  472. var ack *wire.AckFrame
  473. if encLevel == protocol.EncryptionInitial || currentSize == 0 {
  474. ack = p.acks.GetAckFrame(encLevel, !hasRetransmission && !hasData)
  475. }
  476. if !hasData && !hasRetransmission && ack == nil {
  477. // nothing to send
  478. return nil, nil
  479. }
  480. var payload payload
  481. if ack != nil {
  482. payload.ack = ack
  483. payload.length = ack.Length(p.version)
  484. maxPacketSize -= payload.length
  485. }
  486. hdr := p.getLongHeader(encLevel)
  487. maxPacketSize -= hdr.GetLength(p.version)
  488. if hasRetransmission {
  489. for {
  490. var f wire.Frame
  491. //nolint:exhaustive // 0-RTT packets can't contain any retransmission.s
  492. switch encLevel {
  493. case protocol.EncryptionInitial:
  494. f = p.retransmissionQueue.GetInitialFrame(maxPacketSize)
  495. case protocol.EncryptionHandshake:
  496. f = p.retransmissionQueue.GetHandshakeFrame(maxPacketSize)
  497. }
  498. if f == nil {
  499. break
  500. }
  501. payload.frames = append(payload.frames, ackhandler.Frame{Frame: f})
  502. frameLen := f.Length(p.version)
  503. payload.length += frameLen
  504. maxPacketSize -= frameLen
  505. }
  506. } else if s.HasData() {
  507. cf := s.PopCryptoFrame(maxPacketSize)
  508. payload.frames = []ackhandler.Frame{{Frame: cf}}
  509. payload.length += cf.Length(p.version)
  510. }
  511. return hdr, &payload
  512. }
  513. func (p *packetPacker) maybeGetAppDataPacket(maxPacketSize, currentSize protocol.ByteCount) (sealer, *wire.ExtendedHeader, *payload) {
  514. var sealer sealer
  515. var encLevel protocol.EncryptionLevel
  516. var hdr *wire.ExtendedHeader
  517. oneRTTSealer, err := p.cryptoSetup.Get1RTTSealer()
  518. if err == nil {
  519. encLevel = protocol.Encryption1RTT
  520. sealer = oneRTTSealer
  521. hdr = p.getShortHeader(oneRTTSealer.KeyPhase())
  522. } else {
  523. // 1-RTT sealer not yet available
  524. if p.perspective != protocol.PerspectiveClient {
  525. return nil, nil, nil
  526. }
  527. sealer, err = p.cryptoSetup.Get0RTTSealer()
  528. if sealer == nil || err != nil {
  529. return nil, nil, nil
  530. }
  531. encLevel = protocol.Encryption0RTT
  532. hdr = p.getLongHeader(protocol.Encryption0RTT)
  533. }
  534. maxPayloadSize := maxPacketSize - hdr.GetLength(p.version) - protocol.ByteCount(sealer.Overhead())
  535. payload := p.maybeGetAppDataPacketWithEncLevel(maxPayloadSize, encLevel == protocol.Encryption1RTT && currentSize == 0)
  536. return sealer, hdr, payload
  537. }
  538. func (p *packetPacker) maybeGetAppDataPacketWithEncLevel(maxPayloadSize protocol.ByteCount, ackAllowed bool) *payload {
  539. payload := p.composeNextPacket(maxPayloadSize, ackAllowed)
  540. // check if we have anything to send
  541. if len(payload.frames) == 0 {
  542. if payload.ack == nil {
  543. return nil
  544. }
  545. // the packet only contains an ACK
  546. if p.numNonAckElicitingAcks >= protocol.MaxNonAckElicitingAcks {
  547. ping := &wire.PingFrame{}
  548. // don't retransmit the PING frame when it is lost
  549. payload.frames = append(payload.frames, ackhandler.Frame{Frame: ping, OnLost: func(wire.Frame) {}})
  550. payload.length += ping.Length(p.version)
  551. p.numNonAckElicitingAcks = 0
  552. } else {
  553. p.numNonAckElicitingAcks++
  554. }
  555. } else {
  556. p.numNonAckElicitingAcks = 0
  557. }
  558. return payload
  559. }
  560. func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, ackAllowed bool) *payload {
  561. payload := &payload{frames: make([]ackhandler.Frame, 0, 1)}
  562. var hasDatagram bool
  563. if p.datagramQueue != nil {
  564. if datagram := p.datagramQueue.Get(); datagram != nil {
  565. payload.frames = append(payload.frames, ackhandler.Frame{
  566. Frame: datagram,
  567. // set it to a no-op. Then we won't set the default callback, which would retransmit the frame.
  568. OnLost: func(wire.Frame) {},
  569. })
  570. payload.length += datagram.Length(p.version)
  571. hasDatagram = true
  572. }
  573. }
  574. var ack *wire.AckFrame
  575. hasData := p.framer.HasData()
  576. hasRetransmission := p.retransmissionQueue.HasAppData()
  577. // TODO: make sure ACKs are sent when a lot of DATAGRAMs are queued
  578. if !hasDatagram && ackAllowed {
  579. ack = p.acks.GetAckFrame(protocol.Encryption1RTT, !hasRetransmission && !hasData)
  580. if ack != nil {
  581. payload.ack = ack
  582. payload.length += ack.Length(p.version)
  583. }
  584. }
  585. if ack == nil && !hasData && !hasRetransmission {
  586. return payload
  587. }
  588. if hasRetransmission {
  589. for {
  590. remainingLen := maxFrameSize - payload.length
  591. if remainingLen < protocol.MinStreamFrameSize {
  592. break
  593. }
  594. f := p.retransmissionQueue.GetAppDataFrame(remainingLen)
  595. if f == nil {
  596. break
  597. }
  598. payload.frames = append(payload.frames, ackhandler.Frame{Frame: f})
  599. payload.length += f.Length(p.version)
  600. }
  601. }
  602. if hasData {
  603. var lengthAdded protocol.ByteCount
  604. payload.frames, lengthAdded = p.framer.AppendControlFrames(payload.frames, maxFrameSize-payload.length)
  605. payload.length += lengthAdded
  606. payload.frames, lengthAdded = p.framer.AppendStreamFrames(payload.frames, maxFrameSize-payload.length)
  607. payload.length += lengthAdded
  608. }
  609. return payload
  610. }
  611. func (p *packetPacker) MaybePackProbePacket(encLevel protocol.EncryptionLevel) (*packedPacket, error) {
  612. var hdr *wire.ExtendedHeader
  613. var payload *payload
  614. var sealer sealer
  615. //nolint:exhaustive // Probe packets are never sent for 0-RTT.
  616. switch encLevel {
  617. case protocol.EncryptionInitial:
  618. var err error
  619. sealer, err = p.cryptoSetup.GetInitialSealer()
  620. if err != nil {
  621. return nil, err
  622. }
  623. hdr, payload = p.maybeGetCryptoPacket(p.maxPacketSize-protocol.ByteCount(sealer.Overhead()), 0, protocol.EncryptionInitial)
  624. case protocol.EncryptionHandshake:
  625. var err error
  626. sealer, err = p.cryptoSetup.GetHandshakeSealer()
  627. if err != nil {
  628. return nil, err
  629. }
  630. hdr, payload = p.maybeGetCryptoPacket(p.maxPacketSize-protocol.ByteCount(sealer.Overhead()), 0, protocol.EncryptionHandshake)
  631. case protocol.Encryption1RTT:
  632. oneRTTSealer, err := p.cryptoSetup.Get1RTTSealer()
  633. if err != nil {
  634. return nil, err
  635. }
  636. sealer = oneRTTSealer
  637. hdr = p.getShortHeader(oneRTTSealer.KeyPhase())
  638. payload = p.maybeGetAppDataPacketWithEncLevel(p.maxPacketSize-protocol.ByteCount(sealer.Overhead())-hdr.GetLength(p.version), true)
  639. default:
  640. panic("unknown encryption level")
  641. }
  642. if payload == nil {
  643. return nil, nil
  644. }
  645. size := p.packetLength(hdr, payload) + protocol.ByteCount(sealer.Overhead())
  646. var padding protocol.ByteCount
  647. if encLevel == protocol.EncryptionInitial {
  648. padding = p.initialPaddingLen(payload.frames, size)
  649. }
  650. buffer := getPacketBuffer()
  651. cont, err := p.appendPacket(buffer, hdr, payload, padding, encLevel, sealer, false)
  652. if err != nil {
  653. return nil, err
  654. }
  655. return &packedPacket{
  656. buffer: buffer,
  657. packetContents: cont,
  658. }, nil
  659. }
  660. func (p *packetPacker) PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount) (*packedPacket, error) {
  661. payload := &payload{
  662. frames: []ackhandler.Frame{ping},
  663. length: ping.Length(p.version),
  664. }
  665. buffer := getPacketBuffer()
  666. sealer, err := p.cryptoSetup.Get1RTTSealer()
  667. if err != nil {
  668. return nil, err
  669. }
  670. hdr := p.getShortHeader(sealer.KeyPhase())
  671. padding := size - p.packetLength(hdr, payload) - protocol.ByteCount(sealer.Overhead())
  672. contents, err := p.appendPacket(buffer, hdr, payload, padding, protocol.Encryption1RTT, sealer, true)
  673. if err != nil {
  674. return nil, err
  675. }
  676. contents.isMTUProbePacket = true
  677. return &packedPacket{
  678. buffer: buffer,
  679. packetContents: contents,
  680. }, nil
  681. }
  682. func (p *packetPacker) getSealerAndHeader(encLevel protocol.EncryptionLevel) (sealer, *wire.ExtendedHeader, error) {
  683. switch encLevel {
  684. case protocol.EncryptionInitial:
  685. sealer, err := p.cryptoSetup.GetInitialSealer()
  686. if err != nil {
  687. return nil, nil, err
  688. }
  689. hdr := p.getLongHeader(protocol.EncryptionInitial)
  690. return sealer, hdr, nil
  691. case protocol.Encryption0RTT:
  692. sealer, err := p.cryptoSetup.Get0RTTSealer()
  693. if err != nil {
  694. return nil, nil, err
  695. }
  696. hdr := p.getLongHeader(protocol.Encryption0RTT)
  697. return sealer, hdr, nil
  698. case protocol.EncryptionHandshake:
  699. sealer, err := p.cryptoSetup.GetHandshakeSealer()
  700. if err != nil {
  701. return nil, nil, err
  702. }
  703. hdr := p.getLongHeader(protocol.EncryptionHandshake)
  704. return sealer, hdr, nil
  705. case protocol.Encryption1RTT:
  706. sealer, err := p.cryptoSetup.Get1RTTSealer()
  707. if err != nil {
  708. return nil, nil, err
  709. }
  710. hdr := p.getShortHeader(sealer.KeyPhase())
  711. return sealer, hdr, nil
  712. default:
  713. return nil, nil, fmt.Errorf("unexpected encryption level: %s", encLevel)
  714. }
  715. }
  716. func (p *packetPacker) getShortHeader(kp protocol.KeyPhaseBit) *wire.ExtendedHeader {
  717. pn, pnLen := p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
  718. hdr := &wire.ExtendedHeader{}
  719. hdr.PacketNumber = pn
  720. hdr.PacketNumberLen = pnLen
  721. hdr.DestConnectionID = p.getDestConnID()
  722. hdr.KeyPhase = kp
  723. return hdr
  724. }
  725. func (p *packetPacker) getLongHeader(encLevel protocol.EncryptionLevel) *wire.ExtendedHeader {
  726. pn, pnLen := p.pnManager.PeekPacketNumber(encLevel)
  727. hdr := &wire.ExtendedHeader{
  728. PacketNumber: pn,
  729. PacketNumberLen: pnLen,
  730. }
  731. hdr.IsLongHeader = true
  732. hdr.Version = p.version
  733. hdr.SrcConnectionID = p.srcConnID
  734. hdr.DestConnectionID = p.getDestConnID()
  735. //nolint:exhaustive // 1-RTT packets are not long header packets.
  736. switch encLevel {
  737. case protocol.EncryptionInitial:
  738. hdr.Type = protocol.PacketTypeInitial
  739. hdr.Token = p.token
  740. case protocol.EncryptionHandshake:
  741. hdr.Type = protocol.PacketTypeHandshake
  742. case protocol.Encryption0RTT:
  743. hdr.Type = protocol.PacketType0RTT
  744. }
  745. return hdr
  746. }
  747. // writeSinglePacket packs a single packet.
  748. func (p *packetPacker) writeSinglePacket(
  749. hdr *wire.ExtendedHeader,
  750. payload *payload,
  751. encLevel protocol.EncryptionLevel,
  752. sealer sealer,
  753. ) (*packedPacket, error) {
  754. buffer := getPacketBuffer()
  755. var paddingLen protocol.ByteCount
  756. if encLevel == protocol.EncryptionInitial {
  757. paddingLen = p.initialPaddingLen(payload.frames, hdr.GetLength(p.version)+payload.length+protocol.ByteCount(sealer.Overhead()))
  758. }
  759. contents, err := p.appendPacket(buffer, hdr, payload, paddingLen, encLevel, sealer, false)
  760. if err != nil {
  761. return nil, err
  762. }
  763. return &packedPacket{
  764. buffer: buffer,
  765. packetContents: contents,
  766. }, nil
  767. }
  768. func (p *packetPacker) appendPacket(buffer *packetBuffer, header *wire.ExtendedHeader, payload *payload, padding protocol.ByteCount, encLevel protocol.EncryptionLevel, sealer sealer, isMTUProbePacket bool) (*packetContents, error) {
  769. var paddingLen protocol.ByteCount
  770. pnLen := protocol.ByteCount(header.PacketNumberLen)
  771. if payload.length < 4-pnLen {
  772. paddingLen = 4 - pnLen - payload.length
  773. }
  774. paddingLen += padding
  775. if header.IsLongHeader {
  776. header.Length = pnLen + protocol.ByteCount(sealer.Overhead()) + payload.length + paddingLen
  777. }
  778. hdrOffset := buffer.Len()
  779. buf := bytes.NewBuffer(buffer.Data)
  780. if err := header.Write(buf, p.version); err != nil {
  781. return nil, err
  782. }
  783. payloadOffset := buf.Len()
  784. if payload.ack != nil {
  785. if err := payload.ack.Write(buf, p.version); err != nil {
  786. return nil, err
  787. }
  788. }
  789. if paddingLen > 0 {
  790. buf.Write(make([]byte, paddingLen))
  791. }
  792. for _, frame := range payload.frames {
  793. if err := frame.Write(buf, p.version); err != nil {
  794. return nil, err
  795. }
  796. }
  797. if payloadSize := protocol.ByteCount(buf.Len()-payloadOffset) - paddingLen; payloadSize != payload.length {
  798. return nil, fmt.Errorf("PacketPacker BUG: payload size inconsistent (expected %d, got %d bytes)", payload.length, payloadSize)
  799. }
  800. if !isMTUProbePacket {
  801. if size := protocol.ByteCount(buf.Len() + sealer.Overhead()); size > p.maxPacketSize {
  802. return nil, fmt.Errorf("PacketPacker BUG: packet too large (%d bytes, allowed %d bytes)", size, p.maxPacketSize)
  803. }
  804. }
  805. raw := buffer.Data
  806. // encrypt the packet
  807. raw = raw[:buf.Len()]
  808. _ = sealer.Seal(raw[payloadOffset:payloadOffset], raw[payloadOffset:], header.PacketNumber, raw[hdrOffset:payloadOffset])
  809. raw = raw[0 : buf.Len()+sealer.Overhead()]
  810. // apply header protection
  811. pnOffset := payloadOffset - int(header.PacketNumberLen)
  812. sealer.EncryptHeader(raw[pnOffset+4:pnOffset+4+16], &raw[hdrOffset], raw[pnOffset:payloadOffset])
  813. buffer.Data = raw
  814. num := p.pnManager.PopPacketNumber(encLevel)
  815. if num != header.PacketNumber {
  816. return nil, errors.New("packetPacker BUG: Peeked and Popped packet numbers do not match")
  817. }
  818. return &packetContents{
  819. header: header,
  820. ack: payload.ack,
  821. frames: payload.frames,
  822. length: buffer.Len() - hdrOffset,
  823. }, nil
  824. }
  825. func (p *packetPacker) SetToken(token []byte) {
  826. p.token = token
  827. }
  828. // When a higher MTU is discovered, use it.
  829. func (p *packetPacker) SetMaxPacketSize(s protocol.ByteCount) {
  830. p.maxPacketSize = s
  831. }
  832. // If the peer sets a max_packet_size that's smaller than the size we're currently using,
  833. // we need to reduce the size of packets we send.
  834. func (p *packetPacker) HandleTransportParameters(params *wire.TransportParameters) {
  835. if params.MaxUDPPayloadSize != 0 {
  836. p.maxPacketSize = utils.Min(p.maxPacketSize, params.MaxUDPPayloadSize)
  837. }
  838. }