Merge pull request #1959 from lucas-clemente/optimize-crypto-packet-sending

optimize sending of crypto packets
This commit is contained in:
Marten Seemann
2019-06-29 00:03:12 +08:00
committed by GitHub
3 changed files with 109 additions and 51 deletions

View File

@@ -119,6 +119,9 @@ type packetPacker struct {
version protocol.VersionNumber
cryptoSetup sealingManager
// Once the handshake is confirmed, we only need to send 1-RTT packets.
handshakeConfirmed bool
initialStream cryptoStream
handshakeStream cryptoStream
@@ -313,12 +316,14 @@ func (p *packetPacker) PackRetransmission(packet *ackhandler.Packet) ([]*packedP
// 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
func (p *packetPacker) PackPacket() (*packedPacket, error) {
packet, err := p.maybePackCryptoPacket()
if err != nil {
return nil, err
}
if packet != nil {
return packet, nil
if !p.handshakeConfirmed {
packet, err := p.maybePackCryptoPacket()
if err != nil {
return nil, err
}
if packet != nil {
return packet, nil
}
}
sealer, err := p.cryptoSetup.Get1RTTSealer()
@@ -359,26 +364,36 @@ func (p *packetPacker) maybePackCryptoPacket() (*packedPacket, error) {
var s cryptoStream
var encLevel protocol.EncryptionLevel
initialSealer, errInitialSealer := p.cryptoSetup.GetInitialSealer()
handshakeSealer, errHandshakeSealer := p.cryptoSetup.GetHandshakeSealer()
if errInitialSealer == handshake.ErrKeysDropped &&
errHandshakeSealer == handshake.ErrKeysDropped {
p.handshakeConfirmed = true
}
hasData := p.initialStream.HasData()
ack := p.acks.GetAckFrame(protocol.EncryptionInitial)
var sealer handshake.LongHeaderSealer
var err error
if hasData || ack != nil {
s = p.initialStream
encLevel = protocol.EncryptionInitial
sealer, err = p.cryptoSetup.GetInitialSealer()
sealer = initialSealer
if errInitialSealer != nil {
return nil, fmt.Errorf("PacketPacker BUG: no Initial sealer: %s", errInitialSealer)
}
} else {
hasData = p.handshakeStream.HasData()
ack = p.acks.GetAckFrame(protocol.EncryptionHandshake)
if hasData || ack != nil {
s = p.handshakeStream
encLevel = protocol.EncryptionHandshake
sealer, err = p.cryptoSetup.GetHandshakeSealer()
sealer = handshakeSealer
if errHandshakeSealer != nil {
return nil, fmt.Errorf("PacketPacker BUG: no Handshake sealer: %s", errHandshakeSealer)
}
}
}
if err != nil {
return nil, err
}
if s == nil {
return nil, nil
}