From 416dc485f80fd6d1c6dd3a2614925bf6be9636bf Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Tue, 14 Apr 2020 16:39:47 +0700 Subject: [PATCH] add a qlog method to log version negotiation packets --- internal/mocks/qlog.go | 12 ++++++++++++ qlog/event.go | 13 +++++++++++++ qlog/qlog.go | 9 +++++++++ qlog/qlog_test.go | 25 +++++++++++++++++++++++++ 4 files changed, 59 insertions(+) diff --git a/internal/mocks/qlog.go b/internal/mocks/qlog.go index f8f845a8a..ba4a7474b 100644 --- a/internal/mocks/qlog.go +++ b/internal/mocks/qlog.go @@ -173,6 +173,18 @@ func (mr *MockTracerMockRecorder) ReceivedTransportParameters(arg0 interface{}) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReceivedTransportParameters", reflect.TypeOf((*MockTracer)(nil).ReceivedTransportParameters), arg0) } +// ReceivedVersionNegotiationPacket mocks base method +func (m *MockTracer) ReceivedVersionNegotiationPacket(arg0 *wire.Header) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ReceivedVersionNegotiationPacket", arg0) +} + +// ReceivedVersionNegotiationPacket indicates an expected call of ReceivedVersionNegotiationPacket +func (mr *MockTracerMockRecorder) ReceivedVersionNegotiationPacket(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReceivedVersionNegotiationPacket", reflect.TypeOf((*MockTracer)(nil).ReceivedVersionNegotiationPacket), arg0) +} + // SentPacket mocks base method func (m *MockTracer) SentPacket(arg0 *wire.ExtendedHeader, arg1 protocol.ByteCount, arg2 *wire.AckFrame, arg3 []wire.Frame) { m.ctrl.T.Helper() diff --git a/qlog/event.go b/qlog/event.go index 17eb7d24e..883664093 100644 --- a/qlog/event.go +++ b/qlog/event.go @@ -140,6 +140,19 @@ func (e eventRetryReceived) MarshalJSONObject(enc *gojay.Encoder) { enc.ObjectKey("header", e.Header) } +type eventVersionNegotiationReceived struct { + Header packetHeader +} + +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) +} + type eventStatelessResetReceived struct { Token *[16]byte } diff --git a/qlog/qlog.go b/qlog/qlog.go index 2f1f3933d..5475a2489 100644 --- a/qlog/qlog.go +++ b/qlog/qlog.go @@ -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,14 @@ func (t *tracer) ReceivedRetry(hdr *wire.Header) { t.mutex.Unlock() } +func (t *tracer) ReceivedVersionNegotiationPacket(hdr *wire.Header) { + t.mutex.Lock() + t.recordEvent(time.Now(), &eventVersionNegotiationReceived{ + Header: *transformHeader(hdr), + }) + t.mutex.Unlock() +} + func (t *tracer) ReceivedStatelessReset(token *[16]byte) { t.mutex.Lock() t.recordEvent(time.Now(), &eventStatelessResetReceived{ diff --git a/qlog/qlog_test.go b/qlog/qlog_test.go index 2a7a49320..96cd86658 100644 --- a/qlog/qlog_test.go +++ b/qlog/qlog_test.go @@ -321,6 +321,31 @@ 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{13, 37}, + }, + ) + 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")) + header := ev["header"] + Expect(header).ToNot(HaveKey("packet_number")) + Expect(header).ToNot(HaveKey("version")) + Expect(header).To(HaveKey("dcid")) + Expect(header).To(HaveKey("scid")) + Expect(ev).ToNot(HaveKey("frames")) + }) + 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()