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 // KeyPhase is the key phase
type KeyPhase uint64 type KeyPhase uint64
// Bit determines the key phase bit
func (p KeyPhase) Bit() KeyPhaseBit { func (p KeyPhase) Bit() KeyPhaseBit {
return p%2 == 1 if p%2 == 0 {
return KeyPhaseZero
}
return KeyPhaseOne
} }
// KeyPhaseBit is the key phase bit // KeyPhaseBit is the key phase bit
type KeyPhaseBit bool type KeyPhaseBit uint8
const ( const (
// KeyPhaseUndefined is an undefined key phase
KeyPhaseUndefined KeyPhaseBit = iota
// KeyPhaseZero is key phase 0 // KeyPhaseZero is key phase 0
KeyPhaseZero KeyPhaseBit = false KeyPhaseZero
// KeyPhaseOne is key phase 1 // KeyPhaseOne is key phase 1
KeyPhaseOne KeyPhaseBit = true KeyPhaseOne
) )
func (p KeyPhaseBit) String() string { func (p KeyPhaseBit) String() string {
if p == KeyPhaseZero { //nolint:exhaustive
switch p {
case KeyPhaseZero:
return "0" return "0"
case KeyPhaseOne:
return "1"
default:
return "undefined"
} }
return "1"
} }

View File

@@ -6,6 +6,11 @@ import (
) )
var _ = Describe("Key Phases", func() { 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() { It("has the correct string representation", func() {
Expect(KeyPhaseZero.String()).To(Equal("0")) Expect(KeyPhaseZero.String()).To(Equal("0"))
Expect(KeyPhaseOne.String()).To(Equal("1")) Expect(KeyPhaseOne.String()).To(Equal("1"))

View File

@@ -22,6 +22,8 @@ type (
EncryptionLevel = protocol.EncryptionLevel EncryptionLevel = protocol.EncryptionLevel
// The KeyPhase is the key phase of the 1-RTT keys. // The KeyPhase is the key phase of the 1-RTT keys.
KeyPhase = protocol.KeyPhase 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. // The PacketNumber is the packet number of a packet.
PacketNumber = protocol.PacketNumber PacketNumber = protocol.PacketNumber
// The Perspective is the role of a QUIC endpoint (client or server). // The Perspective is the role of a QUIC endpoint (client or server).
@@ -53,6 +55,13 @@ type (
RTTStats = utils.RTTStats 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 ( const (
// PerspectiveServer is used for a QUIC server // PerspectiveServer is used for a QUIC server
PerspectiveServer Perspective = protocol.PerspectiveServer PerspectiveServer Perspective = protocol.PerspectiveServer

View File

@@ -37,6 +37,8 @@ type packetHeader struct {
Version logging.VersionNumber Version logging.VersionNumber
SrcConnectionID logging.ConnectionID SrcConnectionID logging.ConnectionID
DestConnectionID logging.ConnectionID DestConnectionID logging.ConnectionID
KeyPhaseBit logging.KeyPhaseBit
} }
func transformHeader(hdr *wire.Header) *packetHeader { func transformHeader(hdr *wire.Header) *packetHeader {
@@ -52,6 +54,7 @@ func transformHeader(hdr *wire.Header) *packetHeader {
func transformExtendedHeader(hdr *wire.ExtendedHeader) *packetHeader { func transformExtendedHeader(hdr *wire.ExtendedHeader) *packetHeader {
h := transformHeader(&hdr.Header) h := transformHeader(&hdr.Header)
h.PacketNumber = hdr.PacketNumber h.PacketNumber = hdr.PacketNumber
h.KeyPhaseBit = hdr.KeyPhase
return h return h
} }
@@ -74,4 +77,7 @@ func (h packetHeader) MarshalJSONObject(enc *gojay.Encoder) {
if h.DestConnectionID.Len() > 0 { if h.DestConnectionID.Len() > 0 {
enc.StringKey("dcid", connectionID(h.DestConnectionID).String()) 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() { It("marshals a header for a 1-RTT packet", func() {
check( check(
&wire.ExtendedHeader{PacketNumber: 42}, &wire.ExtendedHeader{
PacketNumber: 42,
KeyPhase: protocol.KeyPhaseZero,
},
map[string]interface{}{ map[string]interface{}{
"packet_number": 42, "packet_number": 42,
"dcil": 0, "dcil": 0,
"key_phase_bit": "0",
}, },
) )
}) })
@@ -108,11 +112,13 @@ var _ = Describe("Packet Header", func() {
&wire.ExtendedHeader{ &wire.ExtendedHeader{
PacketNumber: 42, PacketNumber: 42,
Header: wire.Header{DestConnectionID: protocol.ConnectionID{0xde, 0xad, 0xbe, 0xef}}, Header: wire.Header{DestConnectionID: protocol.ConnectionID{0xde, 0xad, 0xbe, 0xef}},
KeyPhase: protocol.KeyPhaseOne,
}, },
map[string]interface{}{ map[string]interface{}{
"packet_number": 42, "packet_number": 42,
"dcil": 4, "dcil": 4,
"dcid": "deadbeef", "dcid": "deadbeef",
"key_phase_bit": "1",
}, },
) )
}) })