packet_packer.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  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/utils"
  12. "github.com/Psiphon-Labs/quic-go/internal/wire"
  13. )
  14. type packer interface {
  15. PackPacket() (*packedPacket, error)
  16. MaybePackProbePacket(protocol.EncryptionLevel) (*packedPacket, error)
  17. MaybePackAckPacket() (*packedPacket, error)
  18. PackConnectionClose(*wire.ConnectionCloseFrame) (*packedPacket, error)
  19. HandleTransportParameters(*handshake.TransportParameters)
  20. SetToken([]byte)
  21. }
  22. type sealer interface {
  23. handshake.LongHeaderSealer
  24. }
  25. type payload struct {
  26. frames []ackhandler.Frame
  27. ack *wire.AckFrame
  28. length protocol.ByteCount
  29. }
  30. type packedPacket struct {
  31. header *wire.ExtendedHeader
  32. raw []byte
  33. ack *wire.AckFrame
  34. frames []ackhandler.Frame
  35. buffer *packetBuffer
  36. }
  37. func (p *packedPacket) EncryptionLevel() protocol.EncryptionLevel {
  38. if !p.header.IsLongHeader {
  39. return protocol.Encryption1RTT
  40. }
  41. switch p.header.Type {
  42. case protocol.PacketTypeInitial:
  43. return protocol.EncryptionInitial
  44. case protocol.PacketTypeHandshake:
  45. return protocol.EncryptionHandshake
  46. default:
  47. return protocol.EncryptionUnspecified
  48. }
  49. }
  50. func (p *packedPacket) IsAckEliciting() bool {
  51. return ackhandler.HasAckElicitingFrames(p.frames)
  52. }
  53. func (p *packedPacket) ToAckHandlerPacket(q *retransmissionQueue) *ackhandler.Packet {
  54. largestAcked := protocol.InvalidPacketNumber
  55. if p.ack != nil {
  56. largestAcked = p.ack.LargestAcked()
  57. }
  58. encLevel := p.EncryptionLevel()
  59. for i := range p.frames {
  60. if p.frames[i].OnLost != nil {
  61. continue
  62. }
  63. switch encLevel {
  64. case protocol.EncryptionInitial:
  65. p.frames[i].OnLost = q.AddInitial
  66. case protocol.EncryptionHandshake:
  67. p.frames[i].OnLost = q.AddHandshake
  68. case protocol.Encryption1RTT:
  69. p.frames[i].OnLost = q.AddAppData
  70. }
  71. }
  72. return &ackhandler.Packet{
  73. PacketNumber: p.header.PacketNumber,
  74. LargestAcked: largestAcked,
  75. Frames: p.frames,
  76. Length: protocol.ByteCount(len(p.raw)),
  77. EncryptionLevel: encLevel,
  78. SendTime: time.Now(),
  79. }
  80. }
  81. func getMaxPacketSize(addr net.Addr) protocol.ByteCount {
  82. maxSize := protocol.ByteCount(protocol.MinInitialPacketSize)
  83. // If this is not a UDP address, we don't know anything about the MTU.
  84. // Use the minimum size of an Initial packet as the max packet size.
  85. if udpAddr, ok := addr.(*net.UDPAddr); ok {
  86. // If ip is not an IPv4 address, To4 returns nil.
  87. // Note that there might be some corner cases, where this is not correct.
  88. // See https://stackoverflow.com/questions/22751035/golang-distinguish-ipv4-ipv6.
  89. if udpAddr.IP.To4() == nil {
  90. maxSize = protocol.MaxPacketSizeIPv6
  91. } else {
  92. maxSize = protocol.MaxPacketSizeIPv4
  93. }
  94. }
  95. return maxSize
  96. }
  97. type packetNumberManager interface {
  98. PeekPacketNumber(protocol.EncryptionLevel) (protocol.PacketNumber, protocol.PacketNumberLen)
  99. PopPacketNumber(protocol.EncryptionLevel) protocol.PacketNumber
  100. }
  101. type sealingManager interface {
  102. GetInitialSealer() (handshake.LongHeaderSealer, error)
  103. GetHandshakeSealer() (handshake.LongHeaderSealer, error)
  104. Get1RTTSealer() (handshake.ShortHeaderSealer, error)
  105. }
  106. type frameSource interface {
  107. AppendStreamFrames([]ackhandler.Frame, protocol.ByteCount) ([]ackhandler.Frame, protocol.ByteCount)
  108. AppendControlFrames([]ackhandler.Frame, protocol.ByteCount) ([]ackhandler.Frame, protocol.ByteCount)
  109. }
  110. type ackFrameSource interface {
  111. GetAckFrame(protocol.EncryptionLevel) *wire.AckFrame
  112. }
  113. type packetPacker struct {
  114. srcConnID protocol.ConnectionID
  115. getDestConnID func() protocol.ConnectionID
  116. perspective protocol.Perspective
  117. version protocol.VersionNumber
  118. cryptoSetup sealingManager
  119. // Once both Initial and Handshake keys are dropped, we only send 1-RTT packets.
  120. droppedInitial bool
  121. droppedHandshake bool
  122. initialStream cryptoStream
  123. handshakeStream cryptoStream
  124. token []byte
  125. pnManager packetNumberManager
  126. framer frameSource
  127. acks ackFrameSource
  128. retransmissionQueue *retransmissionQueue
  129. maxPacketSize protocol.ByteCount
  130. numNonAckElicitingAcks int
  131. }
  132. var _ packer = &packetPacker{}
  133. func newPacketPacker(
  134. srcConnID protocol.ConnectionID,
  135. getDestConnID func() protocol.ConnectionID,
  136. initialStream cryptoStream,
  137. handshakeStream cryptoStream,
  138. packetNumberManager packetNumberManager,
  139. retransmissionQueue *retransmissionQueue,
  140. remoteAddr net.Addr, // only used for determining the max packet size
  141. cryptoSetup sealingManager,
  142. framer frameSource,
  143. acks ackFrameSource,
  144. perspective protocol.Perspective,
  145. version protocol.VersionNumber,
  146. ) *packetPacker {
  147. return &packetPacker{
  148. cryptoSetup: cryptoSetup,
  149. getDestConnID: getDestConnID,
  150. srcConnID: srcConnID,
  151. initialStream: initialStream,
  152. handshakeStream: handshakeStream,
  153. retransmissionQueue: retransmissionQueue,
  154. perspective: perspective,
  155. version: version,
  156. framer: framer,
  157. acks: acks,
  158. pnManager: packetNumberManager,
  159. maxPacketSize: getMaxPacketSize(remoteAddr),
  160. }
  161. }
  162. func (p *packetPacker) handshakeConfirmed() bool {
  163. return p.droppedInitial && p.droppedHandshake
  164. }
  165. // PackConnectionClose packs a packet that ONLY contains a ConnectionCloseFrame
  166. func (p *packetPacker) PackConnectionClose(ccf *wire.ConnectionCloseFrame) (*packedPacket, error) {
  167. payload := payload{
  168. frames: []ackhandler.Frame{{Frame: ccf}},
  169. length: ccf.Length(p.version),
  170. }
  171. // send the CONNECTION_CLOSE frame with the highest available encryption level
  172. var err error
  173. var hdr *wire.ExtendedHeader
  174. var sealer sealer
  175. encLevel := protocol.Encryption1RTT
  176. s, err := p.cryptoSetup.Get1RTTSealer()
  177. if err != nil {
  178. encLevel = protocol.EncryptionHandshake
  179. sealer, err = p.cryptoSetup.GetHandshakeSealer()
  180. if err != nil {
  181. encLevel = protocol.EncryptionInitial
  182. sealer, err = p.cryptoSetup.GetInitialSealer()
  183. if err != nil {
  184. return nil, err
  185. }
  186. hdr = p.getLongHeader(protocol.EncryptionInitial)
  187. } else {
  188. hdr = p.getLongHeader(protocol.EncryptionHandshake)
  189. }
  190. } else {
  191. sealer = s
  192. hdr = p.getShortHeader(s.KeyPhase())
  193. }
  194. return p.writeAndSealPacket(hdr, payload, encLevel, sealer)
  195. }
  196. func (p *packetPacker) MaybePackAckPacket() (*packedPacket, error) {
  197. var encLevel protocol.EncryptionLevel
  198. var ack *wire.AckFrame
  199. if !p.handshakeConfirmed() {
  200. ack = p.acks.GetAckFrame(protocol.EncryptionInitial)
  201. if ack != nil {
  202. encLevel = protocol.EncryptionInitial
  203. } else {
  204. ack = p.acks.GetAckFrame(protocol.EncryptionHandshake)
  205. if ack != nil {
  206. encLevel = protocol.EncryptionHandshake
  207. }
  208. }
  209. }
  210. if ack == nil {
  211. ack = p.acks.GetAckFrame(protocol.Encryption1RTT)
  212. if ack == nil {
  213. return nil, nil
  214. }
  215. encLevel = protocol.Encryption1RTT
  216. }
  217. if ack == nil {
  218. return nil, nil
  219. }
  220. payload := payload{
  221. ack: ack,
  222. length: ack.Length(p.version),
  223. }
  224. sealer, hdr, err := p.getSealerAndHeader(encLevel)
  225. if err != nil {
  226. return nil, err
  227. }
  228. return p.writeAndSealPacket(hdr, payload, encLevel, sealer)
  229. }
  230. // PackPacket packs a new packet
  231. // the other controlFrames are sent in the next packet, but might be queued and sent in the next packet if the packet would overflow MaxPacketSize otherwise
  232. func (p *packetPacker) PackPacket() (*packedPacket, error) {
  233. if !p.handshakeConfirmed() {
  234. packet, err := p.maybePackCryptoPacket()
  235. if err != nil {
  236. return nil, err
  237. }
  238. if packet != nil {
  239. return packet, nil
  240. }
  241. }
  242. return p.maybePackAppDataPacket()
  243. }
  244. func (p *packetPacker) maybePackCryptoPacket() (*packedPacket, error) {
  245. // Try packing an Initial packet.
  246. packet, err := p.maybePackInitialPacket()
  247. if err == handshake.ErrKeysDropped {
  248. p.droppedInitial = true
  249. } else if err != nil || packet != nil {
  250. return packet, err
  251. }
  252. // No Initial was packed. Try packing a Handshake packet.
  253. packet, err = p.maybePackHandshakePacket()
  254. if err == handshake.ErrKeysDropped {
  255. p.droppedHandshake = true
  256. return nil, nil
  257. }
  258. if err == handshake.ErrKeysNotYetAvailable {
  259. return nil, nil
  260. }
  261. return packet, err
  262. }
  263. func (p *packetPacker) maybePackInitialPacket() (*packedPacket, error) {
  264. sealer, err := p.cryptoSetup.GetInitialSealer()
  265. if err != nil {
  266. return nil, err
  267. }
  268. hasRetransmission := p.retransmissionQueue.HasInitialData()
  269. ack := p.acks.GetAckFrame(protocol.EncryptionInitial)
  270. if !p.initialStream.HasData() && !hasRetransmission && ack == nil {
  271. // nothing to send
  272. return nil, nil
  273. }
  274. return p.packCryptoPacket(protocol.EncryptionInitial, sealer, ack, hasRetransmission)
  275. }
  276. func (p *packetPacker) maybePackHandshakePacket() (*packedPacket, error) {
  277. sealer, err := p.cryptoSetup.GetHandshakeSealer()
  278. if err != nil {
  279. return nil, err
  280. }
  281. hasRetransmission := p.retransmissionQueue.HasHandshakeData()
  282. ack := p.acks.GetAckFrame(protocol.EncryptionHandshake)
  283. if !p.handshakeStream.HasData() && !hasRetransmission && ack == nil {
  284. // nothing to send
  285. return nil, nil
  286. }
  287. return p.packCryptoPacket(protocol.EncryptionHandshake, sealer, ack, hasRetransmission)
  288. }
  289. func (p *packetPacker) packCryptoPacket(
  290. encLevel protocol.EncryptionLevel,
  291. sealer handshake.LongHeaderSealer,
  292. ack *wire.AckFrame,
  293. hasRetransmission bool,
  294. ) (*packedPacket, error) {
  295. s := p.initialStream
  296. if encLevel == protocol.EncryptionHandshake {
  297. s = p.handshakeStream
  298. }
  299. var payload payload
  300. if ack != nil {
  301. payload.ack = ack
  302. payload.length = ack.Length(p.version)
  303. }
  304. hdr := p.getLongHeader(encLevel)
  305. hdrLen := hdr.GetLength(p.version)
  306. if hasRetransmission {
  307. for {
  308. var f wire.Frame
  309. switch encLevel {
  310. case protocol.EncryptionInitial:
  311. remainingLen := protocol.MinInitialPacketSize - hdrLen - protocol.ByteCount(sealer.Overhead()) - payload.length
  312. f = p.retransmissionQueue.GetInitialFrame(remainingLen)
  313. case protocol.EncryptionHandshake:
  314. remainingLen := p.maxPacketSize - hdrLen - protocol.ByteCount(sealer.Overhead()) - payload.length
  315. f = p.retransmissionQueue.GetHandshakeFrame(remainingLen)
  316. }
  317. if f == nil {
  318. break
  319. }
  320. payload.frames = append(payload.frames, ackhandler.Frame{Frame: f})
  321. payload.length += f.Length(p.version)
  322. }
  323. } else if s.HasData() {
  324. cf := s.PopCryptoFrame(p.maxPacketSize - hdrLen - protocol.ByteCount(sealer.Overhead()) - payload.length)
  325. payload.frames = []ackhandler.Frame{{Frame: cf}}
  326. payload.length += cf.Length(p.version)
  327. }
  328. return p.writeAndSealPacket(hdr, payload, encLevel, sealer)
  329. }
  330. func (p *packetPacker) maybePackAppDataPacket() (*packedPacket, error) {
  331. sealer, err := p.cryptoSetup.Get1RTTSealer()
  332. if err != nil {
  333. // sealer not yet available
  334. return nil, nil
  335. }
  336. header := p.getShortHeader(sealer.KeyPhase())
  337. headerLen := header.GetLength(p.version)
  338. maxSize := p.maxPacketSize - protocol.ByteCount(sealer.Overhead()) - headerLen
  339. payload := p.composeNextPacket(maxSize)
  340. // check if we have anything to send
  341. if len(payload.frames) == 0 && payload.ack == nil {
  342. return nil, nil
  343. }
  344. if len(payload.frames) == 0 { // the packet only contains an ACK
  345. if p.numNonAckElicitingAcks >= protocol.MaxNonAckElicitingAcks {
  346. ping := &wire.PingFrame{}
  347. payload.frames = append(payload.frames, ackhandler.Frame{Frame: ping})
  348. payload.length += ping.Length(p.version)
  349. p.numNonAckElicitingAcks = 0
  350. } else {
  351. p.numNonAckElicitingAcks++
  352. }
  353. } else {
  354. p.numNonAckElicitingAcks = 0
  355. }
  356. return p.writeAndSealPacket(header, payload, protocol.Encryption1RTT, sealer)
  357. }
  358. func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount) payload {
  359. var payload payload
  360. if ack := p.acks.GetAckFrame(protocol.Encryption1RTT); ack != nil {
  361. payload.ack = ack
  362. payload.length += ack.Length(p.version)
  363. }
  364. for {
  365. remainingLen := maxFrameSize - payload.length
  366. if remainingLen < protocol.MinStreamFrameSize {
  367. break
  368. }
  369. f := p.retransmissionQueue.GetAppDataFrame(remainingLen)
  370. if f == nil {
  371. break
  372. }
  373. payload.frames = append(payload.frames, ackhandler.Frame{Frame: f})
  374. payload.length += f.Length(p.version)
  375. }
  376. var lengthAdded protocol.ByteCount
  377. payload.frames, lengthAdded = p.framer.AppendControlFrames(payload.frames, maxFrameSize-payload.length)
  378. payload.length += lengthAdded
  379. payload.frames, lengthAdded = p.framer.AppendStreamFrames(payload.frames, maxFrameSize-payload.length)
  380. payload.length += lengthAdded
  381. return payload
  382. }
  383. func (p *packetPacker) MaybePackProbePacket(encLevel protocol.EncryptionLevel) (*packedPacket, error) {
  384. switch encLevel {
  385. case protocol.EncryptionInitial:
  386. return p.maybePackInitialPacket()
  387. case protocol.EncryptionHandshake:
  388. return p.maybePackHandshakePacket()
  389. case protocol.Encryption1RTT:
  390. return p.maybePackAppDataPacket()
  391. default:
  392. panic("unknown encryption level")
  393. }
  394. }
  395. func (p *packetPacker) getSealerAndHeader(encLevel protocol.EncryptionLevel) (sealer, *wire.ExtendedHeader, error) {
  396. switch encLevel {
  397. case protocol.EncryptionInitial:
  398. sealer, err := p.cryptoSetup.GetInitialSealer()
  399. if err != nil {
  400. return nil, nil, err
  401. }
  402. hdr := p.getLongHeader(protocol.EncryptionInitial)
  403. return sealer, hdr, nil
  404. case protocol.EncryptionHandshake:
  405. sealer, err := p.cryptoSetup.GetHandshakeSealer()
  406. if err != nil {
  407. return nil, nil, err
  408. }
  409. hdr := p.getLongHeader(protocol.EncryptionHandshake)
  410. return sealer, hdr, nil
  411. case protocol.Encryption1RTT:
  412. sealer, err := p.cryptoSetup.Get1RTTSealer()
  413. if err != nil {
  414. return nil, nil, err
  415. }
  416. hdr := p.getShortHeader(sealer.KeyPhase())
  417. return sealer, hdr, nil
  418. default:
  419. return nil, nil, fmt.Errorf("unexpected encryption level: %s", encLevel)
  420. }
  421. }
  422. func (p *packetPacker) getShortHeader(kp protocol.KeyPhaseBit) *wire.ExtendedHeader {
  423. pn, pnLen := p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
  424. hdr := &wire.ExtendedHeader{}
  425. hdr.PacketNumber = pn
  426. hdr.PacketNumberLen = pnLen
  427. hdr.DestConnectionID = p.getDestConnID()
  428. hdr.KeyPhase = kp
  429. return hdr
  430. }
  431. func (p *packetPacker) getLongHeader(encLevel protocol.EncryptionLevel) *wire.ExtendedHeader {
  432. pn, pnLen := p.pnManager.PeekPacketNumber(encLevel)
  433. hdr := &wire.ExtendedHeader{}
  434. hdr.PacketNumber = pn
  435. hdr.PacketNumberLen = pnLen
  436. hdr.DestConnectionID = p.getDestConnID()
  437. switch encLevel {
  438. case protocol.EncryptionInitial:
  439. hdr.Type = protocol.PacketTypeInitial
  440. hdr.Token = p.token
  441. case protocol.EncryptionHandshake:
  442. hdr.Type = protocol.PacketTypeHandshake
  443. }
  444. hdr.Version = p.version
  445. hdr.IsLongHeader = true
  446. // Always send Initial and Handshake packets with the maximum packet number length.
  447. // This simplifies retransmissions: Since the header can't get any larger,
  448. // we don't need to split CRYPTO frames.
  449. hdr.PacketNumberLen = protocol.PacketNumberLen4
  450. hdr.SrcConnectionID = p.srcConnID
  451. // Set the length to the maximum packet size.
  452. // Since it is encoded as a varint, this guarantees us that the header will end up at most as big as GetLength() returns.
  453. hdr.Length = p.maxPacketSize
  454. return hdr
  455. }
  456. func (p *packetPacker) writeAndSealPacket(
  457. header *wire.ExtendedHeader,
  458. payload payload,
  459. encLevel protocol.EncryptionLevel,
  460. sealer sealer,
  461. ) (*packedPacket, error) {
  462. var paddingLen protocol.ByteCount
  463. pnLen := protocol.ByteCount(header.PacketNumberLen)
  464. if encLevel != protocol.Encryption1RTT {
  465. if p.perspective == protocol.PerspectiveClient && header.Type == protocol.PacketTypeInitial {
  466. headerLen := header.GetLength(p.version)
  467. header.Length = pnLen + protocol.MinInitialPacketSize - headerLen
  468. paddingLen = protocol.ByteCount(protocol.MinInitialPacketSize-sealer.Overhead()) - headerLen - payload.length
  469. } else {
  470. header.Length = pnLen + protocol.ByteCount(sealer.Overhead()) + payload.length
  471. }
  472. } else if payload.length < 4-pnLen {
  473. paddingLen = 4 - pnLen - payload.length
  474. }
  475. return p.writeAndSealPacketWithPadding(header, payload, paddingLen, encLevel, sealer)
  476. }
  477. func (p *packetPacker) writeAndSealPacketWithPadding(
  478. header *wire.ExtendedHeader,
  479. payload payload,
  480. paddingLen protocol.ByteCount,
  481. encLevel protocol.EncryptionLevel,
  482. sealer sealer,
  483. ) (*packedPacket, error) {
  484. packetBuffer := getPacketBuffer()
  485. buffer := bytes.NewBuffer(packetBuffer.Slice[:0])
  486. if err := header.Write(buffer, p.version); err != nil {
  487. return nil, err
  488. }
  489. payloadOffset := buffer.Len()
  490. if payload.ack != nil {
  491. if err := payload.ack.Write(buffer, p.version); err != nil {
  492. return nil, err
  493. }
  494. }
  495. if paddingLen > 0 {
  496. buffer.Write(bytes.Repeat([]byte{0}, int(paddingLen)))
  497. }
  498. for _, frame := range payload.frames {
  499. if err := frame.Write(buffer, p.version); err != nil {
  500. return nil, err
  501. }
  502. }
  503. if payloadSize := protocol.ByteCount(buffer.Len()-payloadOffset) - paddingLen; payloadSize != payload.length {
  504. fmt.Printf("%#v\n", payload)
  505. return nil, fmt.Errorf("PacketPacker BUG: payload size inconsistent (expected %d, got %d bytes)", payload.length, payloadSize)
  506. }
  507. if size := protocol.ByteCount(buffer.Len() + sealer.Overhead()); size > p.maxPacketSize {
  508. return nil, fmt.Errorf("PacketPacker BUG: packet too large (%d bytes, allowed %d bytes)", size, p.maxPacketSize)
  509. }
  510. raw := buffer.Bytes()
  511. _ = sealer.Seal(raw[payloadOffset:payloadOffset], raw[payloadOffset:], header.PacketNumber, raw[:payloadOffset])
  512. raw = raw[0 : buffer.Len()+sealer.Overhead()]
  513. pnOffset := payloadOffset - int(header.PacketNumberLen)
  514. sealer.EncryptHeader(
  515. raw[pnOffset+4:pnOffset+4+16],
  516. &raw[0],
  517. raw[pnOffset:payloadOffset],
  518. )
  519. num := p.pnManager.PopPacketNumber(encLevel)
  520. if num != header.PacketNumber {
  521. return nil, errors.New("packetPacker BUG: Peeked and Popped packet numbers do not match")
  522. }
  523. return &packedPacket{
  524. header: header,
  525. raw: raw,
  526. ack: payload.ack,
  527. frames: payload.frames,
  528. buffer: packetBuffer,
  529. }, nil
  530. }
  531. func (p *packetPacker) SetToken(token []byte) {
  532. p.token = token
  533. }
  534. func (p *packetPacker) HandleTransportParameters(params *handshake.TransportParameters) {
  535. if params.MaxPacketSize != 0 {
  536. p.maxPacketSize = utils.MinByteCount(p.maxPacketSize, params.MaxPacketSize)
  537. }
  538. }