simplify the signature of the version selection

This commit is contained in:
Marten Seemann
2017-04-29 22:50:49 +07:00
parent 16ca3012e9
commit 55fa713eac
3 changed files with 17 additions and 23 deletions

View File

@@ -205,20 +205,20 @@ func (c *client) handlePacketWithVersionFlag(hdr *PublicHeader) error {
}
}
ok, highestSupportedVersion := protocol.HighestSupportedVersion(c.config.Versions, hdr.SupportedVersions)
if !ok {
newVersion := protocol.ChooseSupportedVersion(c.config.Versions, hdr.SupportedVersions)
if newVersion == protocol.VersionUnsupported {
return qerr.InvalidVersion
}
// switch to negotiated version
c.version = highestSupportedVersion
c.version = newVersion
c.connState = ConnStateVersionNegotiated
var err error
c.connectionID, err = utils.GenerateConnectionID()
if err != nil {
return err
}
utils.Infof("Switching to QUIC version %d. New connection ID: %x", highestSupportedVersion, c.connectionID)
utils.Infof("Switching to QUIC version %d. New connection ID: %x", newVersion, c.connectionID)
c.session.Close(errCloseSessionForNewVersion)
err = c.createNewSession(hdr.SupportedVersions)

View File

@@ -39,15 +39,17 @@ func IsSupportedVersion(supported []VersionNumber, v VersionNumber) bool {
return false
}
// HighestSupportedVersion finds the highest version number that is both present in other and in SupportedVersions
// it returns true and the version number, if there is one, otherwise false
func HighestSupportedVersion(ours, theirs []VersionNumber) (bool, VersionNumber) {
// ChooseSupportedVersion finds the best version in the overlap of ours and theirs
// ours is a slice of versions that we support, sorted by our preference (descending)
// theirs is a slice of versions offered by the peer. The order does not matter
// if no suitable version is found, it returns VersionUnsupported
func ChooseSupportedVersion(ours, theirs []VersionNumber) VersionNumber {
for _, ourVer := range ours {
for _, theirVer := range theirs {
if ourVer == theirVer {
return true, ourVer
return ourVer
}
}
}
return false, VersionUnsupported
return VersionUnsupported
}

View File

@@ -30,30 +30,22 @@ var _ = Describe("Version", func() {
It("finds the supported version", func() {
supportedVersions := []VersionNumber{1, 2, 3}
other := []VersionNumber{6, 5, 4, 3}
found, ver := HighestSupportedVersion(supportedVersions, other)
Expect(found).To(BeTrue())
Expect(ver).To(Equal(VersionNumber(3)))
Expect(ChooseSupportedVersion(supportedVersions, other)).To(Equal(VersionNumber(3)))
})
It("picks the preferred version", func() {
supportedVersions := []VersionNumber{2, 1, 3}
other := []VersionNumber{3, 6, 1, 8, 2, 10}
found, ver := HighestSupportedVersion(supportedVersions, other)
Expect(found).To(BeTrue())
Expect(ver).To(Equal(VersionNumber(2)))
Expect(ChooseSupportedVersion(supportedVersions, other)).To(Equal(VersionNumber(2)))
})
It("handles empty inputs", func() {
supportedVersions := []VersionNumber{102, 101}
found, _ := HighestSupportedVersion(supportedVersions, nil)
Expect(found).To(BeFalse())
found, _ = HighestSupportedVersion(supportedVersions, []VersionNumber{})
Expect(found).To(BeFalse())
Expect(ChooseSupportedVersion(supportedVersions, nil)).To(Equal(VersionUnsupported))
Expect(ChooseSupportedVersion(supportedVersions, []VersionNumber{})).To(Equal(VersionUnsupported))
supportedVersions = []VersionNumber{}
found, _ = HighestSupportedVersion(supportedVersions, []VersionNumber{1, 2})
Expect(found).To(BeFalse())
found, _ = HighestSupportedVersion(supportedVersions, []VersionNumber{})
Expect(found).To(BeFalse())
Expect(ChooseSupportedVersion(supportedVersions, []VersionNumber{1, 2})).To(Equal(VersionUnsupported))
Expect(ChooseSupportedVersion(supportedVersions, []VersionNumber{})).To(Equal(VersionUnsupported))
})
})
})