simplify writing of varint transport parameters

This commit is contained in:
Marten Seemann
2019-05-08 12:53:19 +09:00
parent f847c5422d
commit 4042a8258c
2 changed files with 22 additions and 37 deletions

View File

@@ -53,13 +53,13 @@ var _ = Describe("Transport Parameters", func() {
Expect(p.String()).To(Equal("&handshake.TransportParameters{OriginalConnectionID: 0xdeadbeef, InitialMaxStreamDataBidiLocal: 0x1234, InitialMaxStreamDataBidiRemote: 0x2345, InitialMaxStreamDataUni: 0x3456, InitialMaxData: 0x4567, MaxBidiStreams: 1337, MaxUniStreams: 7331, IdleTimeout: 42s, AckDelayExponent: 14, MaxAckDelay: 37s}")) Expect(p.String()).To(Equal("&handshake.TransportParameters{OriginalConnectionID: 0xdeadbeef, InitialMaxStreamDataBidiLocal: 0x1234, InitialMaxStreamDataBidiRemote: 0x2345, InitialMaxStreamDataUni: 0x3456, InitialMaxData: 0x4567, MaxBidiStreams: 1337, MaxUniStreams: 7331, IdleTimeout: 42s, AckDelayExponent: 14, MaxAckDelay: 37s}"))
}) })
It("marshals and unmarshals", func() {
rand.Seed(GinkgoRandomSeed())
getRandomValue := func() uint64 { getRandomValue := func() uint64 {
maxVals := []int64{math.MaxUint8 / 4, math.MaxUint16 / 4, math.MaxUint32 / 4, math.MaxUint64 / 4} maxVals := []int64{math.MaxUint8 / 4, math.MaxUint16 / 4, math.MaxUint32 / 4, math.MaxUint64 / 4}
rand.Seed(GinkgoRandomSeed())
return uint64(rand.Int63n(maxVals[int(rand.Int31n(4))])) return uint64(rand.Int63n(maxVals[int(rand.Int31n(4))]))
} }
It("marshals and unmarshals", func() {
var token [16]byte var token [16]byte
rand.Read(token[:]) rand.Read(token[:])
params := &TransportParameters{ params := &TransportParameters{

View File

@@ -205,51 +205,30 @@ func (p *TransportParameters) Marshal() []byte {
b.Write([]byte{0, 0}) // length. Will be replaced later b.Write([]byte{0, 0}) // length. Will be replaced later
// initial_max_stream_data_bidi_local // initial_max_stream_data_bidi_local
utils.BigEndian.WriteUint16(b, uint16(initialMaxStreamDataBidiLocalParameterID)) p.marshalVarintParam(b, initialMaxStreamDataBidiLocalParameterID, uint64(p.InitialMaxStreamDataBidiLocal))
utils.BigEndian.WriteUint16(b, uint16(utils.VarIntLen(uint64(p.InitialMaxStreamDataBidiLocal))))
utils.WriteVarInt(b, uint64(p.InitialMaxStreamDataBidiLocal))
// initial_max_stream_data_bidi_remote // initial_max_stream_data_bidi_remote
utils.BigEndian.WriteUint16(b, uint16(initialMaxStreamDataBidiRemoteParameterID)) p.marshalVarintParam(b, initialMaxStreamDataBidiRemoteParameterID, uint64(p.InitialMaxStreamDataBidiRemote))
utils.BigEndian.WriteUint16(b, uint16(utils.VarIntLen(uint64(p.InitialMaxStreamDataBidiRemote))))
utils.WriteVarInt(b, uint64(p.InitialMaxStreamDataBidiRemote))
// initial_max_stream_data_uni // initial_max_stream_data_uni
utils.BigEndian.WriteUint16(b, uint16(initialMaxStreamDataUniParameterID)) p.marshalVarintParam(b, initialMaxStreamDataUniParameterID, uint64(p.InitialMaxStreamDataUni))
utils.BigEndian.WriteUint16(b, uint16(utils.VarIntLen(uint64(p.InitialMaxStreamDataUni))))
utils.WriteVarInt(b, uint64(p.InitialMaxStreamDataUni))
// initial_max_data // initial_max_data
utils.BigEndian.WriteUint16(b, uint16(initialMaxDataParameterID)) p.marshalVarintParam(b, initialMaxDataParameterID, uint64(p.InitialMaxData))
utils.BigEndian.WriteUint16(b, uint16(utils.VarIntLen(uint64(p.InitialMaxData))))
utils.WriteVarInt(b, uint64(p.InitialMaxData))
// initial_max_bidi_streams // initial_max_bidi_streams
utils.BigEndian.WriteUint16(b, uint16(initialMaxStreamsBidiParameterID)) p.marshalVarintParam(b, initialMaxStreamsBidiParameterID, p.MaxBidiStreams)
utils.BigEndian.WriteUint16(b, uint16(utils.VarIntLen(p.MaxBidiStreams)))
utils.WriteVarInt(b, p.MaxBidiStreams)
// initial_max_uni_streams // initial_max_uni_streams
utils.BigEndian.WriteUint16(b, uint16(initialMaxStreamsUniParameterID)) p.marshalVarintParam(b, initialMaxStreamsUniParameterID, p.MaxUniStreams)
utils.BigEndian.WriteUint16(b, uint16(utils.VarIntLen(p.MaxUniStreams)))
utils.WriteVarInt(b, p.MaxUniStreams)
// idle_timeout // idle_timeout
idleTimeout := uint64(p.IdleTimeout / time.Millisecond) p.marshalVarintParam(b, idleTimeoutParameterID, uint64(p.IdleTimeout/time.Millisecond))
utils.BigEndian.WriteUint16(b, uint16(idleTimeoutParameterID))
utils.BigEndian.WriteUint16(b, uint16(utils.VarIntLen(idleTimeout)))
utils.WriteVarInt(b, idleTimeout)
// max_packet_size // max_packet_size
utils.BigEndian.WriteUint16(b, uint16(maxPacketSizeParameterID)) p.marshalVarintParam(b, maxPacketSizeParameterID, uint64(protocol.MaxReceivePacketSize))
utils.BigEndian.WriteUint16(b, uint16(utils.VarIntLen(uint64(protocol.MaxReceivePacketSize))))
utils.WriteVarInt(b, uint64(protocol.MaxReceivePacketSize))
// max_ack_delay // max_ack_delay
// Only send it if is different from the default value. // Only send it if is different from the default value.
if p.MaxAckDelay != protocol.DefaultMaxAckDelay { if p.MaxAckDelay != protocol.DefaultMaxAckDelay {
utils.BigEndian.WriteUint16(b, uint16(maxAckDelayParameterID)) p.marshalVarintParam(b, maxAckDelayParameterID, uint64(p.MaxAckDelay/time.Millisecond))
utils.BigEndian.WriteUint16(b, uint16(utils.VarIntLen(uint64(p.MaxAckDelay/time.Millisecond))))
utils.WriteVarInt(b, uint64(p.MaxAckDelay/time.Millisecond))
} }
// ack_delay_exponent // ack_delay_exponent
// Only send it if is different from the default value. // Only send it if is different from the default value.
if p.AckDelayExponent != protocol.DefaultAckDelayExponent { if p.AckDelayExponent != protocol.DefaultAckDelayExponent {
utils.BigEndian.WriteUint16(b, uint16(ackDelayExponentParameterID)) p.marshalVarintParam(b, ackDelayExponentParameterID, uint64(p.AckDelayExponent))
utils.BigEndian.WriteUint16(b, uint16(utils.VarIntLen(uint64(p.AckDelayExponent))))
utils.WriteVarInt(b, uint64(p.AckDelayExponent))
} }
// disable_migration // disable_migration
if p.DisableMigration { if p.DisableMigration {
@@ -273,6 +252,12 @@ func (p *TransportParameters) Marshal() []byte {
return data return data
} }
func (p *TransportParameters) marshalVarintParam(b *bytes.Buffer, id transportParameterID, val uint64) {
utils.BigEndian.WriteUint16(b, uint16(id))
utils.BigEndian.WriteUint16(b, uint16(utils.VarIntLen(val)))
utils.WriteVarInt(b, val)
}
// String returns a string representation, intended for logging. // String returns a string representation, intended for logging.
func (p *TransportParameters) String() string { func (p *TransportParameters) String() string {
logString := "&handshake.TransportParameters{OriginalConnectionID: %s, InitialMaxStreamDataBidiLocal: %#x, InitialMaxStreamDataBidiRemote: %#x, InitialMaxStreamDataUni: %#x, InitialMaxData: %#x, MaxBidiStreams: %d, MaxUniStreams: %d, IdleTimeout: %s, AckDelayExponent: %d, MaxAckDelay: %s" logString := "&handshake.TransportParameters{OriginalConnectionID: %s, InitialMaxStreamDataBidiLocal: %#x, InitialMaxStreamDataBidiRemote: %#x, InitialMaxStreamDataUni: %#x, InitialMaxData: %#x, MaxBidiStreams: %d, MaxUniStreams: %d, IdleTimeout: %s, AckDelayExponent: %d, MaxAckDelay: %s"