From 05c870ff6f2acf18e92557a4f7795aac20363379 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 5 Dec 2016 18:29:01 +0700 Subject: [PATCH] ignore delayed version negotiation packets --- client.go | 11 ++++++++--- client_test.go | 11 +++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/client.go b/client.go index 28e31dbe8..f58a04903 100644 --- a/client.go +++ b/client.go @@ -20,8 +20,9 @@ type Client struct { conn *net.UDPConn hostname string - connectionID protocol.ConnectionID - version protocol.VersionNumber + connectionID protocol.ConnectionID + version protocol.VersionNumber + versionNegotiated bool session packetHandler } @@ -123,7 +124,10 @@ func (c *Client) handlePacket(packet []byte) error { } hdr.Raw = packet[:len(packet)-r.Len()] - // TODO: ignore delayed / duplicated version negotiation packets + // ignore delayed / duplicated version negotiation packets + if c.versionNegotiated && hdr.VersionFlag { + return nil + } if hdr.VersionFlag { // check if the server sent the offered version in supported versions @@ -140,6 +144,7 @@ func (c *Client) handlePacket(packet []byte) error { utils.Infof("Switching to QUIC version %d", highestSupportedVersion) c.version = highestSupportedVersion + c.versionNegotiated = true c.session.Close(errCloseSessionForNewVersion) err = c.createNewSession() if err != nil { diff --git a/client_test.go b/client_test.go index 6ba4b2885..cc770e010 100644 --- a/client_test.go +++ b/client_test.go @@ -150,6 +150,7 @@ var _ = Describe("Client", func() { Expect(session.packetCount).To(BeZero()) err := client.handlePacket(getVersionNegotiation([]protocol.VersionNumber{newVersion})) Expect(client.version).To(Equal(newVersion)) + Expect(client.versionNegotiated).To(BeTrue()) // it swapped the sessions Expect(client.session).ToNot(Equal(session)) Expect(err).ToNot(HaveOccurred()) @@ -165,6 +166,16 @@ var _ = Describe("Client", func() { Expect(err).To(MatchError(qerr.VersionNegotiationMismatch)) }) + It("ignores delayed version negotiation packets", func() { + // if the version was not yet negotiated, handlePacket would return a VersionNegotiationMismatch error, see above test + client.versionNegotiated = true + Expect(session.packetCount).To(BeZero()) + err := client.handlePacket(getVersionNegotiation([]protocol.VersionNumber{1})) + Expect(err).ToNot(HaveOccurred()) + Expect(client.versionNegotiated).To(BeTrue()) + Expect(session.packetCount).To(BeZero()) + }) + It("errors if the server should have accepted the offered version", func() { err := client.handlePacket(getVersionNegotiation([]protocol.VersionNumber{client.version})) Expect(err).To(MatchError(errInvalidVersionNegotiation))