Merge pull request #2817 from lucas-clemente/qlog-key-phase-bit

qlog the key phase bit
This commit is contained in:
Marten Seemann
2020-10-06 20:31:36 +07:00
committed by GitHub
5 changed files with 44 additions and 7 deletions

View File

@@ -3,23 +3,34 @@ package protocol
// KeyPhase is the key phase
type KeyPhase uint64
// Bit determines the key phase bit
func (p KeyPhase) Bit() KeyPhaseBit {
return p%2 == 1
if p%2 == 0 {
return KeyPhaseZero
}
return KeyPhaseOne
}
// KeyPhaseBit is the key phase bit
type KeyPhaseBit bool
type KeyPhaseBit uint8
const (
// KeyPhaseUndefined is an undefined key phase
KeyPhaseUndefined KeyPhaseBit = iota
// KeyPhaseZero is key phase 0
KeyPhaseZero KeyPhaseBit = false
KeyPhaseZero
// KeyPhaseOne is key phase 1
KeyPhaseOne KeyPhaseBit = true
KeyPhaseOne
)
func (p KeyPhaseBit) String() string {
if p == KeyPhaseZero {
//nolint:exhaustive
switch p {
case KeyPhaseZero:
return "0"
case KeyPhaseOne:
return "1"
default:
return "undefined"
}
return "1"
}

View File

@@ -6,6 +6,11 @@ import (
)
var _ = Describe("Key Phases", func() {
It("has undefined as its default value", func() {
var k KeyPhaseBit
Expect(k).To(Equal(KeyPhaseUndefined))
})
It("has the correct string representation", func() {
Expect(KeyPhaseZero.String()).To(Equal("0"))
Expect(KeyPhaseOne.String()).To(Equal("1"))

View File

@@ -22,6 +22,8 @@ type (
EncryptionLevel = protocol.EncryptionLevel
// The KeyPhase is the key phase of the 1-RTT keys.
KeyPhase = protocol.KeyPhase
// The KeyPhaseBit is the value of the key phase bit of the 1-RTT packets.
KeyPhaseBit = protocol.KeyPhaseBit
// The PacketNumber is the packet number of a packet.
PacketNumber = protocol.PacketNumber
// The Perspective is the role of a QUIC endpoint (client or server).
@@ -53,6 +55,13 @@ type (
RTTStats = utils.RTTStats
)
const (
// KeyPhaseZero is key phase bit 0
KeyPhaseZero KeyPhaseBit = protocol.KeyPhaseZero
// KeyPhaseOne is key phase bit 1
KeyPhaseOne KeyPhaseBit = protocol.KeyPhaseOne
)
const (
// PerspectiveServer is used for a QUIC server
PerspectiveServer Perspective = protocol.PerspectiveServer

View File

@@ -37,6 +37,8 @@ type packetHeader struct {
Version logging.VersionNumber
SrcConnectionID logging.ConnectionID
DestConnectionID logging.ConnectionID
KeyPhaseBit logging.KeyPhaseBit
}
func transformHeader(hdr *wire.Header) *packetHeader {
@@ -52,6 +54,7 @@ func transformHeader(hdr *wire.Header) *packetHeader {
func transformExtendedHeader(hdr *wire.ExtendedHeader) *packetHeader {
h := transformHeader(&hdr.Header)
h.PacketNumber = hdr.PacketNumber
h.KeyPhaseBit = hdr.KeyPhase
return h
}
@@ -74,4 +77,7 @@ func (h packetHeader) MarshalJSONObject(enc *gojay.Encoder) {
if h.DestConnectionID.Len() > 0 {
enc.StringKey("dcid", connectionID(h.DestConnectionID).String())
}
if h.KeyPhaseBit == logging.KeyPhaseZero || h.KeyPhaseBit == logging.KeyPhaseOne {
enc.StringKey("key_phase_bit", h.KeyPhaseBit.String())
}
}

View File

@@ -34,10 +34,14 @@ var _ = Describe("Packet Header", func() {
It("marshals a header for a 1-RTT packet", func() {
check(
&wire.ExtendedHeader{PacketNumber: 42},
&wire.ExtendedHeader{
PacketNumber: 42,
KeyPhase: protocol.KeyPhaseZero,
},
map[string]interface{}{
"packet_number": 42,
"dcil": 0,
"key_phase_bit": "0",
},
)
})
@@ -108,11 +112,13 @@ var _ = Describe("Packet Header", func() {
&wire.ExtendedHeader{
PacketNumber: 42,
Header: wire.Header{DestConnectionID: protocol.ConnectionID{0xde, 0xad, 0xbe, 0xef}},
KeyPhase: protocol.KeyPhaseOne,
},
map[string]interface{}{
"packet_number": 42,
"dcil": 4,
"dcid": "deadbeef",
"key_phase_bit": "1",
},
)
})