Merge pull request #2493 from lucas-clemente/qlog-version-negotiation

qlog version negotiation packets
This commit is contained in:
Marten Seemann
2020-04-16 15:51:49 +07:00
committed by GitHub
6 changed files with 195 additions and 52 deletions

View File

@@ -47,6 +47,15 @@ func (e event) MarshalJSONArray(enc *gojay.Encoder) {
enc.Object(e.eventDetails)
}
type versions []versionNumber
func (v versions) IsNil() bool { return false }
func (v versions) MarshalJSONArray(enc *gojay.Encoder) {
for _, e := range v {
enc.AddString(e.String())
}
}
type eventConnectionStarted struct {
SrcAddr *net.UDPAddr
DestAddr *net.UDPAddr
@@ -140,6 +149,21 @@ func (e eventRetryReceived) MarshalJSONObject(enc *gojay.Encoder) {
enc.ObjectKey("header", e.Header)
}
type eventVersionNegotiationReceived struct {
Header packetHeader
SupportedVersions []versionNumber
}
func (e eventVersionNegotiationReceived) Category() category { return categoryTransport }
func (e eventVersionNegotiationReceived) Name() string { return "packet_received" }
func (e eventVersionNegotiationReceived) IsNil() bool { return false }
func (e eventVersionNegotiationReceived) MarshalJSONObject(enc *gojay.Encoder) {
enc.StringKey("packet_type", PacketTypeVersionNegotiation.String())
enc.ObjectKey("header", e.Header)
enc.ArrayKey("supported_versions", versions(e.SupportedVersions))
}
type eventStatelessResetReceived struct {
Token *[16]byte
}

View File

@@ -24,6 +24,7 @@ type Tracer interface {
SentTransportParameters(*wire.TransportParameters)
ReceivedTransportParameters(*wire.TransportParameters)
SentPacket(hdr *wire.ExtendedHeader, packetSize protocol.ByteCount, ack *wire.AckFrame, frames []wire.Frame)
ReceivedVersionNegotiationPacket(*wire.Header)
ReceivedRetry(*wire.Header)
ReceivedPacket(hdr *wire.ExtendedHeader, packetSize protocol.ByteCount, frames []wire.Frame)
ReceivedStatelessReset(token *[16]byte)
@@ -230,6 +231,19 @@ func (t *tracer) ReceivedRetry(hdr *wire.Header) {
t.mutex.Unlock()
}
func (t *tracer) ReceivedVersionNegotiationPacket(hdr *wire.Header) {
versions := make([]versionNumber, len(hdr.SupportedVersions))
for i, v := range hdr.SupportedVersions {
versions[i] = versionNumber(v)
}
t.mutex.Lock()
t.recordEvent(time.Now(), &eventVersionNegotiationReceived{
Header: *transformHeader(hdr),
SupportedVersions: versions,
})
t.mutex.Unlock()
}
func (t *tracer) ReceivedStatelessReset(token *[16]byte) {
t.mutex.Lock()
t.recordEvent(time.Now(), &eventStatelessResetReceived{

View File

@@ -321,6 +321,33 @@ var _ = Describe("Tracer", func() {
Expect(ev).ToNot(HaveKey("frames"))
})
It("records a received Version Negotiation packet", func() {
tracer.ReceivedVersionNegotiationPacket(
&wire.Header{
IsLongHeader: true,
Type: protocol.PacketTypeRetry,
DestConnectionID: protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8},
SrcConnectionID: protocol.ConnectionID{4, 3, 2, 1},
SupportedVersions: []protocol.VersionNumber{0xdeadbeef, 0xdecafbad},
},
)
entry := exportAndParseSingle()
Expect(entry.Time).To(BeTemporally("~", time.Now(), 10*time.Millisecond))
Expect(entry.Category).To(Equal("transport"))
Expect(entry.Name).To(Equal("packet_received"))
ev := entry.Event
Expect(ev).To(HaveKeyWithValue("packet_type", "version_negotiation"))
Expect(ev).To(HaveKey("header"))
Expect(ev).ToNot(HaveKey("frames"))
Expect(ev).To(HaveKey("supported_versions"))
Expect(ev["supported_versions"].([]interface{})).To(Equal([]interface{}{"deadbeef", "decafbad"}))
header := ev["header"]
Expect(header).ToNot(HaveKey("packet_number"))
Expect(header).ToNot(HaveKey("version"))
Expect(header).To(HaveKey("dcid"))
Expect(header).To(HaveKey("scid"))
})
It("records a received Retry packet", func() {
tracer.ReceivedStatelessReset(&[16]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff})
entry := exportAndParseSingle()