2017-05-27 14:30:11 -05:00
package quic
import (
"bytes"
"errors"
"fmt"
2018-03-25 23:37:41 -05:00
"net"
2018-04-18 16:48:08 -05:00
"time"
2017-05-27 14:30:11 -05:00
2018-02-17 00:29:53 -05:00
"github.com/lucas-clemente/quic-go/internal/ackhandler"
"github.com/lucas-clemente/quic-go/internal/handshake"
"github.com/lucas-clemente/quic-go/internal/protocol"
2018-03-25 23:37:41 -05:00
"github.com/lucas-clemente/quic-go/internal/utils"
2018-02-17 00:29:53 -05:00
"github.com/lucas-clemente/quic-go/internal/wire"
2017-05-27 14:30:11 -05:00
)
2019-01-16 23:38:10 -05:00
type packer interface {
PackPacket ( ) ( * packedPacket , error )
MaybePackAckPacket ( ) ( * packedPacket , error )
PackRetransmission ( packet * ackhandler . Packet ) ( [ ] * packedPacket , error )
PackConnectionClose ( * wire . ConnectionCloseFrame ) ( * packedPacket , error )
HandleTransportParameters ( * handshake . TransportParameters )
ChangeDestConnectionID ( protocol . ConnectionID )
}
2017-05-27 14:30:11 -05:00
type packedPacket struct {
2018-02-17 00:29:53 -05:00
header * wire . Header
2017-05-27 14:30:11 -05:00
raw [ ] byte
2018-02-17 00:29:53 -05:00
frames [ ] wire . Frame
2017-05-27 14:30:11 -05:00
encryptionLevel protocol . EncryptionLevel
}
2018-03-25 23:37:41 -05:00
func ( p * packedPacket ) ToAckHandlerPacket ( ) * ackhandler . Packet {
return & ackhandler . Packet {
PacketNumber : p . header . PacketNumber ,
PacketType : p . header . Type ,
Frames : p . frames ,
Length : protocol . ByteCount ( len ( p . raw ) ) ,
EncryptionLevel : p . encryptionLevel ,
2018-04-18 16:48:08 -05:00
SendTime : time . Now ( ) ,
2018-03-25 23:37:41 -05:00
}
}
2019-01-16 23:38:10 -05:00
func getMaxPacketSize ( addr net . Addr ) protocol . ByteCount {
maxSize := protocol . ByteCount ( protocol . MinInitialPacketSize )
// If this is not a UDP address, we don't know anything about the MTU.
// Use the minimum size of an Initial packet as the max packet size.
if udpAddr , ok := addr . ( * net . UDPAddr ) ; ok {
// If ip is not an IPv4 address, To4 returns nil.
// Note that there might be some corner cases, where this is not correct.
// See https://stackoverflow.com/questions/22751035/golang-distinguish-ipv4-ipv6.
if udpAddr . IP . To4 ( ) == nil {
maxSize = protocol . MaxPacketSizeIPv6
} else {
maxSize = protocol . MaxPacketSizeIPv4
}
}
return maxSize
}
2018-04-18 16:48:08 -05:00
type sealingManager interface {
GetSealer ( ) ( protocol . EncryptionLevel , handshake . Sealer )
GetSealerForCryptoStream ( ) ( protocol . EncryptionLevel , handshake . Sealer )
GetSealerWithEncryptionLevel ( protocol . EncryptionLevel ) ( handshake . Sealer , error )
}
2019-01-16 23:38:10 -05:00
type frameSource interface {
AppendStreamFrames ( [ ] wire . Frame , protocol . ByteCount ) [ ] wire . Frame
AppendControlFrames ( [ ] wire . Frame , protocol . ByteCount ) ( [ ] wire . Frame , protocol . ByteCount )
}
type ackFrameSource interface {
GetAckFrame ( ) * wire . AckFrame
GetStopWaitingFrame ( bool ) * wire . StopWaitingFrame
2018-02-17 00:29:53 -05:00
}
2017-05-27 14:30:11 -05:00
type packetPacker struct {
2018-09-02 16:18:54 -05:00
destConnID protocol . ConnectionID
srcConnID protocol . ConnectionID
perspective protocol . Perspective
version protocol . VersionNumber
cryptoSetup sealingManager
2019-01-16 23:38:10 -05:00
token [ ] byte
2017-05-27 14:30:11 -05:00
packetNumberGenerator * packetNumberGenerator
2018-03-25 23:37:41 -05:00
getPacketNumberLen func ( protocol . PacketNumber ) protocol . PacketNumberLen
2019-01-16 23:38:10 -05:00
cryptoStream cryptoStream
framer frameSource
acks ackFrameSource
2017-05-27 14:30:11 -05:00
2018-03-25 23:37:41 -05:00
maxPacketSize protocol . ByteCount
2018-02-17 00:29:53 -05:00
hasSentPacket bool // has the packetPacker already sent a packet
numNonRetransmittableAcks int
2017-05-27 14:30:11 -05:00
}
2019-01-16 23:38:10 -05:00
var _ packer = & packetPacker { }
2018-09-02 16:18:54 -05:00
func newPacketPacker (
destConnID protocol . ConnectionID ,
srcConnID protocol . ConnectionID ,
2018-02-17 00:29:53 -05:00
initialPacketNumber protocol . PacketNumber ,
2018-03-25 23:37:41 -05:00
getPacketNumberLen func ( protocol . PacketNumber ) protocol . PacketNumberLen ,
remoteAddr net . Addr , // only used for determining the max packet size
2018-09-02 16:18:54 -05:00
token [ ] byte ,
2019-01-16 23:38:10 -05:00
cryptoStream cryptoStream ,
2018-04-18 16:48:08 -05:00
cryptoSetup sealingManager ,
2019-01-16 23:38:10 -05:00
framer frameSource ,
acks ackFrameSource ,
2017-07-27 17:11:56 -05:00
perspective protocol . Perspective ,
version protocol . VersionNumber ,
) * packetPacker {
2017-05-27 14:30:11 -05:00
return & packetPacker {
2019-01-16 23:38:10 -05:00
cryptoStream : cryptoStream ,
2017-05-27 14:30:11 -05:00
cryptoSetup : cryptoSetup ,
2018-09-02 16:18:54 -05:00
token : token ,
destConnID : destConnID ,
srcConnID : srcConnID ,
2017-05-27 14:30:11 -05:00
perspective : perspective ,
version : version ,
2019-01-16 23:38:10 -05:00
framer : framer ,
acks : acks ,
2018-03-25 23:37:41 -05:00
getPacketNumberLen : getPacketNumberLen ,
2018-02-17 00:29:53 -05:00
packetNumberGenerator : newPacketNumberGenerator ( initialPacketNumber , protocol . SkipPacketAveragePeriodLength ) ,
2019-01-16 23:38:10 -05:00
maxPacketSize : getMaxPacketSize ( remoteAddr ) ,
2017-05-27 14:30:11 -05:00
}
}
// PackConnectionClose packs a packet that ONLY contains a ConnectionCloseFrame
2018-02-17 00:29:53 -05:00
func ( p * packetPacker ) PackConnectionClose ( ccf * wire . ConnectionCloseFrame ) ( * packedPacket , error ) {
frames := [ ] wire . Frame { ccf }
2017-07-27 17:11:56 -05:00
encLevel , sealer := p . cryptoSetup . GetSealer ( )
2018-02-17 00:29:53 -05:00
header := p . getHeader ( encLevel )
raw , err := p . writeAndSealPacket ( header , frames , sealer )
2017-07-27 17:11:56 -05:00
return & packedPacket {
2018-02-17 00:29:53 -05:00
header : header ,
2017-07-27 17:11:56 -05:00
raw : raw ,
frames : frames ,
encryptionLevel : encLevel ,
} , err
}
2019-01-16 23:38:10 -05:00
func ( p * packetPacker ) MaybePackAckPacket ( ) ( * packedPacket , error ) {
ack := p . acks . GetAckFrame ( )
if ack == nil {
return nil , nil
2017-07-27 17:11:56 -05:00
}
encLevel , sealer := p . cryptoSetup . GetSealer ( )
2018-02-17 00:29:53 -05:00
header := p . getHeader ( encLevel )
2019-01-16 23:38:10 -05:00
frames := [ ] wire . Frame { ack }
2018-02-17 00:29:53 -05:00
raw , err := p . writeAndSealPacket ( header , frames , sealer )
2017-07-27 17:11:56 -05:00
return & packedPacket {
2018-02-17 00:29:53 -05:00
header : header ,
2017-07-27 17:11:56 -05:00
raw : raw ,
frames : frames ,
encryptionLevel : encLevel ,
} , err
2017-05-27 14:30:11 -05:00
}
2018-03-25 23:37:41 -05:00
// PackRetransmission packs a retransmission
// For packets sent after completion of the handshake, it might happen that 2 packets have to be sent.
// This can happen e.g. when a longer packet number is used in the header.
func ( p * packetPacker ) PackRetransmission ( packet * ackhandler . Packet ) ( [ ] * packedPacket , error ) {
if packet . EncryptionLevel != protocol . EncryptionForwardSecure {
p , err := p . packHandshakeRetransmission ( packet )
return [ ] * packedPacket { p } , err
}
var controlFrames [ ] wire . Frame
var streamFrames [ ] * wire . StreamFrame
for _ , f := range packet . Frames {
if sf , ok := f . ( * wire . StreamFrame ) ; ok {
sf . DataLenPresent = true
streamFrames = append ( streamFrames , sf )
} else {
controlFrames = append ( controlFrames , f )
}
}
var packets [ ] * packedPacket
encLevel , sealer := p . cryptoSetup . GetSealer ( )
for len ( controlFrames ) > 0 || len ( streamFrames ) > 0 {
var frames [ ] wire . Frame
2019-01-16 23:38:10 -05:00
var length protocol . ByteCount
2018-03-25 23:37:41 -05:00
header := p . getHeader ( encLevel )
2018-09-02 16:18:54 -05:00
headerLength , err := header . GetLength ( p . version )
2018-03-25 23:37:41 -05:00
if err != nil {
return nil , err
}
maxSize := p . maxPacketSize - protocol . ByteCount ( sealer . Overhead ( ) ) - headerLength
for len ( controlFrames ) > 0 {
frame := controlFrames [ 0 ]
2019-01-16 23:38:10 -05:00
frameLen := frame . Length ( p . version )
if length + frameLen > maxSize {
2018-03-25 23:37:41 -05:00
break
}
2019-01-16 23:38:10 -05:00
length += frameLen
2018-03-25 23:37:41 -05:00
frames = append ( frames , frame )
controlFrames = controlFrames [ 1 : ]
}
2019-01-16 23:38:10 -05:00
for len ( streamFrames ) > 0 && length + protocol . MinStreamFrameSize < maxSize {
2018-03-25 23:37:41 -05:00
frame := streamFrames [ 0 ]
2019-01-16 23:38:10 -05:00
frame . DataLenPresent = false
2018-03-25 23:37:41 -05:00
frameToAdd := frame
2019-01-16 23:38:10 -05:00
sf , err := frame . MaybeSplitOffFrame ( maxSize - length , p . version )
2018-03-25 23:37:41 -05:00
if err != nil {
return nil , err
}
if sf != nil {
frameToAdd = sf
} else {
streamFrames = streamFrames [ 1 : ]
}
2019-01-16 23:38:10 -05:00
frame . DataLenPresent = true
length += frameToAdd . Length ( p . version )
2018-03-25 23:37:41 -05:00
frames = append ( frames , frameToAdd )
}
if sf , ok := frames [ len ( frames ) - 1 ] . ( * wire . StreamFrame ) ; ok {
sf . DataLenPresent = false
}
raw , err := p . writeAndSealPacket ( header , frames , sealer )
if err != nil {
return nil , err
}
packets = append ( packets , & packedPacket {
header : header ,
raw : raw ,
frames : frames ,
encryptionLevel : encLevel ,
} )
2017-05-27 14:30:11 -05:00
}
2018-03-25 23:37:41 -05:00
return packets , nil
}
// packHandshakeRetransmission retransmits a handshake packet, that was sent with less than forward-secure encryption
func ( p * packetPacker ) packHandshakeRetransmission ( packet * ackhandler . Packet ) ( * packedPacket , error ) {
2017-07-27 17:11:56 -05:00
sealer , err := p . cryptoSetup . GetSealerWithEncryptionLevel ( packet . EncryptionLevel )
if err != nil {
return nil , err
}
2018-03-25 23:37:41 -05:00
// make sure that the retransmission for an Initial packet is sent as an Initial packet
if packet . PacketType == protocol . PacketTypeInitial {
p . hasSentPacket = false
}
2018-02-17 00:29:53 -05:00
header := p . getHeader ( packet . EncryptionLevel )
2018-03-25 23:37:41 -05:00
header . Type = packet . PacketType
2019-01-16 23:38:10 -05:00
raw , err := p . writeAndSealPacket ( header , packet . Frames , sealer )
2017-07-27 17:11:56 -05:00
return & packedPacket {
2018-02-17 00:29:53 -05:00
header : header ,
2017-07-27 17:11:56 -05:00
raw : raw ,
2019-01-16 23:38:10 -05:00
frames : packet . Frames ,
2017-07-27 17:11:56 -05:00
encryptionLevel : packet . EncryptionLevel ,
} , err
2017-05-27 14:30:11 -05:00
}
// PackPacket packs a new packet
// 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
2017-07-27 17:11:56 -05:00
func ( p * packetPacker ) PackPacket ( ) ( * packedPacket , error ) {
2019-01-16 23:38:10 -05:00
packet , err := p . maybePackCryptoPacket ( )
if err != nil {
return nil , err
}
if packet != nil {
return packet , nil
}
2018-02-17 00:29:53 -05:00
// if this is the first packet to be send, make sure it contains stream data
2019-01-16 23:38:10 -05:00
if ! p . hasSentPacket && packet == nil {
2018-02-17 00:29:53 -05:00
return nil , nil
}
2017-05-27 14:30:11 -05:00
2017-07-27 17:11:56 -05:00
encLevel , sealer := p . cryptoSetup . GetSealer ( )
2017-05-27 14:30:11 -05:00
2018-02-17 00:29:53 -05:00
header := p . getHeader ( encLevel )
2018-09-02 16:18:54 -05:00
headerLength , err := header . GetLength ( p . version )
2017-05-27 14:30:11 -05:00
if err != nil {
return nil , err
}
2018-03-25 23:37:41 -05:00
maxSize := p . maxPacketSize - protocol . ByteCount ( sealer . Overhead ( ) ) - headerLength
2019-01-16 23:38:10 -05:00
frames , err := p . composeNextPacket ( maxSize , p . canSendData ( encLevel ) )
2017-07-27 17:11:56 -05:00
if err != nil {
return nil , err
2017-05-27 14:30:11 -05:00
}
// Check if we have enough frames to send
2019-01-16 23:38:10 -05:00
if len ( frames ) == 0 {
2017-05-27 14:30:11 -05:00
return nil , nil
}
2019-01-16 23:38:10 -05:00
// check if this packet only contains an ACK
if ! ackhandler . HasRetransmittableFrames ( frames ) {
if p . numNonRetransmittableAcks >= protocol . MaxNonRetransmittableAcks {
frames = append ( frames , & wire . PingFrame { } )
2018-02-17 00:29:53 -05:00
p . numNonRetransmittableAcks = 0
2019-01-16 23:38:10 -05:00
} else {
p . numNonRetransmittableAcks ++
2018-02-17 00:29:53 -05:00
}
2019-01-16 23:38:10 -05:00
} else {
p . numNonRetransmittableAcks = 0
2018-02-17 00:29:53 -05:00
}
2017-05-27 14:30:11 -05:00
2019-01-16 23:38:10 -05:00
raw , err := p . writeAndSealPacket ( header , frames , sealer )
2017-07-27 17:11:56 -05:00
if err != nil {
2017-05-27 14:30:11 -05:00
return nil , err
}
2017-07-27 17:11:56 -05:00
return & packedPacket {
2018-02-17 00:29:53 -05:00
header : header ,
2017-07-27 17:11:56 -05:00
raw : raw ,
2019-01-16 23:38:10 -05:00
frames : frames ,
2017-07-27 17:11:56 -05:00
encryptionLevel : encLevel ,
} , nil
}
2017-05-27 14:30:11 -05:00
2019-01-16 23:38:10 -05:00
func ( p * packetPacker ) maybePackCryptoPacket ( ) ( * packedPacket , error ) {
if ! p . cryptoStream . hasData ( ) {
return nil , nil
}
2017-07-27 17:11:56 -05:00
encLevel , sealer := p . cryptoSetup . GetSealerForCryptoStream ( )
2018-02-17 00:29:53 -05:00
header := p . getHeader ( encLevel )
2018-09-02 16:18:54 -05:00
headerLength , err := header . GetLength ( p . version )
2017-07-27 17:11:56 -05:00
if err != nil {
return nil , err
2017-05-27 14:30:11 -05:00
}
2018-03-25 23:37:41 -05:00
maxLen := p . maxPacketSize - protocol . ByteCount ( sealer . Overhead ( ) ) - protocol . NonForwardSecurePacketSizeReduction - headerLength
2019-01-16 23:38:10 -05:00
sf , _ := p . cryptoStream . popStreamFrame ( maxLen )
2018-02-17 00:29:53 -05:00
sf . DataLenPresent = false
frames := [ ] wire . Frame { sf }
raw , err := p . writeAndSealPacket ( header , frames , sealer )
2017-07-27 17:11:56 -05:00
if err != nil {
return nil , err
2017-05-27 14:30:11 -05:00
}
return & packedPacket {
2018-02-17 00:29:53 -05:00
header : header ,
2017-05-27 14:30:11 -05:00
raw : raw ,
2017-07-27 17:11:56 -05:00
frames : frames ,
2017-05-27 14:30:11 -05:00
encryptionLevel : encLevel ,
} , nil
}
2017-07-27 17:11:56 -05:00
func ( p * packetPacker ) composeNextPacket (
maxFrameSize protocol . ByteCount ,
canSendStreamFrames bool ,
2018-02-17 00:29:53 -05:00
) ( [ ] wire . Frame , error ) {
2019-01-16 23:38:10 -05:00
var length protocol . ByteCount
var frames [ ] wire . Frame
2017-05-27 14:30:11 -05:00
2019-01-16 23:38:10 -05:00
// ACKs need to go first, so that the sentPacketHandler will recognize them
if ack := p . acks . GetAckFrame ( ) ; ack != nil {
frames = append ( frames , ack )
length += ack . Length ( p . version )
2017-05-27 14:30:11 -05:00
}
2019-01-16 23:38:10 -05:00
var lengthAdded protocol . ByteCount
frames , lengthAdded = p . framer . AppendControlFrames ( frames , maxFrameSize - length )
length += lengthAdded
2017-07-27 17:11:56 -05:00
if ! canSendStreamFrames {
2019-01-16 23:38:10 -05:00
return frames , nil
2017-07-27 17:11:56 -05:00
}
2018-02-17 00:29:53 -05:00
// temporarily increase the maxFrameSize by the (minimum) length of the DataLen field
2019-01-16 23:38:10 -05:00
// this leads to a properly sized packet in all cases, since we do all the packet length calculations with STREAM frames that have the DataLen set
2018-03-25 23:37:41 -05:00
// however, for the last STREAM frame in the packet, we can omit the DataLen, thus yielding a packet of exactly the correct size
2019-01-16 23:38:10 -05:00
// the length is encoded to either 1 or 2 bytes
maxFrameSize ++
2017-05-27 14:30:11 -05:00
2019-01-16 23:38:10 -05:00
frames = p . framer . AppendStreamFrames ( frames , maxFrameSize - length )
if len ( frames ) > 0 {
lastFrame := frames [ len ( frames ) - 1 ]
if sf , ok := lastFrame . ( * wire . StreamFrame ) ; ok {
sf . DataLenPresent = false
}
2017-07-27 17:11:56 -05:00
}
2019-01-16 23:38:10 -05:00
return frames , nil
2017-07-27 17:11:56 -05:00
}
2018-02-17 00:29:53 -05:00
func ( p * packetPacker ) getHeader ( encLevel protocol . EncryptionLevel ) * wire . Header {
2017-07-27 17:11:56 -05:00
pnum := p . packetNumberGenerator . Peek ( )
2018-03-25 23:37:41 -05:00
packetNumberLen := p . getPacketNumberLen ( pnum )
2017-07-27 17:11:56 -05:00
2018-02-17 00:29:53 -05:00
header := & wire . Header {
2019-01-16 23:38:10 -05:00
PacketNumber : pnum ,
PacketNumberLen : packetNumberLen ,
Version : p . version ,
DestConnectionID : p . destConnID ,
2017-07-27 17:11:56 -05:00
}
2018-02-17 00:29:53 -05:00
2019-01-16 23:38:10 -05:00
if encLevel != protocol . EncryptionForwardSecure {
2018-02-17 00:29:53 -05:00
header . IsLongHeader = true
2018-09-02 16:18:54 -05:00
header . SrcConnectionID = p . srcConnID
// Set the payload len to maximum size.
// Since it is encoded as a varint, this guarantees us that the header will end up at most as big as GetLength() returns.
header . PayloadLen = p . maxPacketSize
2018-02-17 00:29:53 -05:00
if ! p . hasSentPacket && p . perspective == protocol . PerspectiveClient {
header . Type = protocol . PacketTypeInitial
2018-09-02 16:18:54 -05:00
header . Token = p . token
2018-02-17 00:29:53 -05:00
} else {
header . Type = protocol . PacketTypeHandshake
}
2017-07-27 17:11:56 -05:00
}
2018-02-17 00:29:53 -05:00
return header
2017-07-27 17:11:56 -05:00
}
func ( p * packetPacker ) writeAndSealPacket (
2018-02-17 00:29:53 -05:00
header * wire . Header ,
2019-01-16 23:38:10 -05:00
frames [ ] wire . Frame ,
2017-07-27 17:11:56 -05:00
sealer handshake . Sealer ,
) ( [ ] byte , error ) {
2018-03-25 23:37:41 -05:00
raw := * getPacketBuffer ( )
buffer := bytes . NewBuffer ( raw [ : 0 ] )
2017-07-27 17:11:56 -05:00
2018-09-02 16:18:54 -05:00
// the payload length is only needed for Long Headers
if header . IsLongHeader {
if header . Type == protocol . PacketTypeInitial {
headerLen , _ := header . GetLength ( p . version )
header . PayloadLen = protocol . ByteCount ( protocol . MinInitialPacketSize ) - headerLen
} else {
payloadLen := protocol . ByteCount ( sealer . Overhead ( ) )
2019-01-16 23:38:10 -05:00
for _ , frame := range frames {
2018-09-02 16:18:54 -05:00
payloadLen += frame . Length ( p . version )
}
header . PayloadLen = payloadLen
}
}
2018-02-17 00:29:53 -05:00
if err := header . Write ( buffer , p . perspective , p . version ) ; err != nil {
2017-07-27 17:11:56 -05:00
return nil , err
}
payloadStartIndex := buffer . Len ( )
2018-02-17 00:29:53 -05:00
// the Initial packet needs to be padded, so the last STREAM frame must have the data length present
if header . Type == protocol . PacketTypeInitial {
2019-01-16 23:38:10 -05:00
lastFrame := frames [ len ( frames ) - 1 ]
2018-02-17 00:29:53 -05:00
if sf , ok := lastFrame . ( * wire . StreamFrame ) ; ok {
sf . DataLenPresent = true
}
}
2019-01-16 23:38:10 -05:00
for _ , frame := range frames {
2018-02-17 00:29:53 -05:00
if err := frame . Write ( buffer , p . version ) ; err != nil {
2017-07-27 17:11:56 -05:00
return nil , err
}
}
2019-01-16 23:38:10 -05:00
// if this is an Initial packet, we need to pad it to fulfill the minimum size requirement
2018-02-17 00:29:53 -05:00
if header . Type == protocol . PacketTypeInitial {
paddingLen := protocol . MinInitialPacketSize - sealer . Overhead ( ) - buffer . Len ( )
if paddingLen > 0 {
buffer . Write ( bytes . Repeat ( [ ] byte { 0 } , paddingLen ) )
}
}
2018-03-25 23:37:41 -05:00
if size := protocol . ByteCount ( buffer . Len ( ) + sealer . Overhead ( ) ) ; size > p . maxPacketSize {
return nil , fmt . Errorf ( "PacketPacker BUG: packet too large (%d bytes, allowed %d bytes)" , size , p . maxPacketSize )
2017-07-27 17:11:56 -05:00
}
raw = raw [ 0 : buffer . Len ( ) ]
2018-02-17 00:29:53 -05:00
_ = sealer . Seal ( raw [ payloadStartIndex : payloadStartIndex ] , raw [ payloadStartIndex : ] , header . PacketNumber , raw [ : payloadStartIndex ] )
raw = raw [ 0 : buffer . Len ( ) + sealer . Overhead ( ) ]
2017-07-27 17:11:56 -05:00
num := p . packetNumberGenerator . Pop ( )
2018-02-17 00:29:53 -05:00
if num != header . PacketNumber {
2017-07-27 17:11:56 -05:00
return nil , errors . New ( "packetPacker BUG: Peeked and Popped packet numbers do not match" )
}
2018-02-17 00:29:53 -05:00
p . hasSentPacket = true
2017-07-27 17:11:56 -05:00
return raw , nil
}
func ( p * packetPacker ) canSendData ( encLevel protocol . EncryptionLevel ) bool {
if p . perspective == protocol . PerspectiveClient {
return encLevel >= protocol . EncryptionSecure
}
return encLevel == protocol . EncryptionForwardSecure
2017-05-27 14:30:11 -05:00
}
2018-09-02 16:18:54 -05:00
func ( p * packetPacker ) ChangeDestConnectionID ( connID protocol . ConnectionID ) {
p . destConnID = connID
}
2019-01-16 23:38:10 -05:00
func ( p * packetPacker ) HandleTransportParameters ( params * handshake . TransportParameters ) {
if params . MaxPacketSize != 0 {
p . maxPacketSize = utils . MinByteCount ( p . maxPacketSize , params . MaxPacketSize )
}
2018-03-25 23:37:41 -05:00
}