forked from quic-go/quic-go
remove the OmitConnectionID field from the Header struct
Instead, just look at the length of the destination connection ID.
This commit is contained in:
@@ -18,7 +18,6 @@ type Header struct {
|
||||
|
||||
DestConnectionID protocol.ConnectionID
|
||||
SrcConnectionID protocol.ConnectionID
|
||||
OmitConnectionID bool
|
||||
|
||||
PacketNumberLen protocol.PacketNumberLen
|
||||
PacketNumber protocol.PacketNumber
|
||||
|
||||
@@ -81,7 +81,6 @@ var _ = Describe("IETF QUIC Header", func() {
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(h.Type).To(Equal(protocol.PacketTypeInitial))
|
||||
Expect(h.IsLongHeader).To(BeTrue())
|
||||
Expect(h.OmitConnectionID).To(BeFalse())
|
||||
Expect(h.DestConnectionID).To(Equal(protocol.ConnectionID{0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37}))
|
||||
Expect(h.SrcConnectionID).To(Equal(protocol.ConnectionID{0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37}))
|
||||
Expect(h.PayloadLen).To(Equal(protocol.ByteCount(0x1337)))
|
||||
@@ -183,7 +182,6 @@ var _ = Describe("IETF QUIC Header", func() {
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(h.IsLongHeader).To(BeFalse())
|
||||
Expect(h.KeyPhase).To(Equal(0))
|
||||
Expect(h.OmitConnectionID).To(BeFalse())
|
||||
Expect(h.DestConnectionID).To(Equal(protocol.ConnectionID{0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37}))
|
||||
Expect(h.SrcConnectionID).To(BeEmpty())
|
||||
Expect(h.PacketNumber).To(Equal(protocol.PacketNumber(0x42)))
|
||||
@@ -362,9 +360,8 @@ var _ = Describe("IETF QUIC Header", func() {
|
||||
|
||||
It("writes a header with a 2 byte packet number", func() {
|
||||
err := (&Header{
|
||||
OmitConnectionID: true,
|
||||
PacketNumberLen: protocol.PacketNumberLen2,
|
||||
PacketNumber: 0x765,
|
||||
PacketNumberLen: protocol.PacketNumberLen2,
|
||||
PacketNumber: 0x765,
|
||||
}).writeHeader(buf)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
expected := []byte{0x30}
|
||||
@@ -374,9 +371,8 @@ var _ = Describe("IETF QUIC Header", func() {
|
||||
|
||||
It("writes a header with a 4 byte packet number", func() {
|
||||
err := (&Header{
|
||||
OmitConnectionID: true,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
PacketNumber: 0x123456,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
PacketNumber: 0x123456,
|
||||
}).writeHeader(buf)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
expected := []byte{0x30}
|
||||
@@ -386,19 +382,17 @@ var _ = Describe("IETF QUIC Header", func() {
|
||||
|
||||
It("errors when given an invalid packet number length", func() {
|
||||
err := (&Header{
|
||||
OmitConnectionID: true,
|
||||
PacketNumberLen: 3,
|
||||
PacketNumber: 0xdecafbad,
|
||||
PacketNumberLen: 3,
|
||||
PacketNumber: 0xdecafbad,
|
||||
}).writeHeader(buf)
|
||||
Expect(err).To(MatchError("invalid packet number length: 3"))
|
||||
})
|
||||
|
||||
It("writes the Key Phase Bit", func() {
|
||||
err := (&Header{
|
||||
KeyPhase: 1,
|
||||
OmitConnectionID: true,
|
||||
PacketNumberLen: protocol.PacketNumberLen1,
|
||||
PacketNumber: 0x42,
|
||||
KeyPhase: 1,
|
||||
PacketNumberLen: protocol.PacketNumberLen1,
|
||||
PacketNumber: 0x42,
|
||||
}).writeHeader(buf)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(buf.Bytes()).To(Equal([]byte{
|
||||
@@ -458,10 +452,7 @@ var _ = Describe("IETF QUIC Header", func() {
|
||||
})
|
||||
|
||||
It("has the right length for a short header without a connection ID", func() {
|
||||
h := &Header{
|
||||
OmitConnectionID: true,
|
||||
PacketNumberLen: protocol.PacketNumberLen1,
|
||||
}
|
||||
h := &Header{PacketNumberLen: protocol.PacketNumberLen1}
|
||||
Expect(h.getHeaderLength()).To(Equal(protocol.ByteCount(1 + 1)))
|
||||
err := h.writeHeader(buf)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
@@ -469,10 +460,7 @@ var _ = Describe("IETF QUIC Header", func() {
|
||||
})
|
||||
|
||||
It("has the right length for a short header with a 2 byte packet number", func() {
|
||||
h := &Header{
|
||||
OmitConnectionID: true,
|
||||
PacketNumberLen: protocol.PacketNumberLen2,
|
||||
}
|
||||
h := &Header{PacketNumberLen: protocol.PacketNumberLen2}
|
||||
Expect(h.getHeaderLength()).To(Equal(protocol.ByteCount(1 + 2)))
|
||||
err := h.writeHeader(buf)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
@@ -480,10 +468,7 @@ var _ = Describe("IETF QUIC Header", func() {
|
||||
})
|
||||
|
||||
It("has the right length for a short header with a 5 byte packet number", func() {
|
||||
h := &Header{
|
||||
OmitConnectionID: true,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
}
|
||||
h := &Header{PacketNumberLen: protocol.PacketNumberLen4}
|
||||
Expect(h.getHeaderLength()).To(Equal(protocol.ByteCount(1 + 4)))
|
||||
err := h.writeHeader(buf)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
@@ -13,7 +13,6 @@ import (
|
||||
|
||||
var (
|
||||
errResetAndVersionFlagSet = errors.New("PublicHeader: Reset Flag and Version Flag should not be set at the same time")
|
||||
errReceivedOmittedConnectionID = qerr.Error(qerr.InvalidPacketHeader, "receiving packets with omitted ConnectionID is not supported")
|
||||
errInvalidConnectionID = qerr.Error(qerr.InvalidPacketHeader, "connection ID cannot be 0")
|
||||
errGetLengthNotForVersionNegotiation = errors.New("PublicHeader: GetLength cannot be called for VersionNegotiation packets")
|
||||
errInvalidPacketNumberLen6 = errors.New("invalid packet number length: 6 bytes")
|
||||
@@ -30,7 +29,7 @@ func (h *Header) writePublicHeader(b *bytes.Buffer, pers protocol.Perspective, _
|
||||
if h.SrcConnectionID.Len() != 0 {
|
||||
return errors.New("PublicHeader: SrcConnectionID must not be set")
|
||||
}
|
||||
if h.DestConnectionID.Len() != 8 {
|
||||
if len(h.DestConnectionID) != 0 && len(h.DestConnectionID) != 8 {
|
||||
return fmt.Errorf("PublicHeader: wrong length for Connection ID: %d (expected 8)", len(h.DestConnectionID))
|
||||
}
|
||||
|
||||
@@ -41,7 +40,7 @@ func (h *Header) writePublicHeader(b *bytes.Buffer, pers protocol.Perspective, _
|
||||
if h.ResetFlag {
|
||||
publicFlagByte |= 0x02
|
||||
}
|
||||
if !h.OmitConnectionID {
|
||||
if h.DestConnectionID.Len() > 0 {
|
||||
publicFlagByte |= 0x08
|
||||
}
|
||||
if len(h.DiversificationNonce) > 0 {
|
||||
@@ -63,7 +62,7 @@ func (h *Header) writePublicHeader(b *bytes.Buffer, pers protocol.Perspective, _
|
||||
}
|
||||
b.WriteByte(publicFlagByte)
|
||||
|
||||
if !h.OmitConnectionID {
|
||||
if h.DestConnectionID.Len() > 0 {
|
||||
b.Write(h.DestConnectionID)
|
||||
}
|
||||
if h.VersionFlag && pers == protocol.PerspectiveClient {
|
||||
@@ -112,9 +111,9 @@ func parsePublicHeader(b *bytes.Reader, packetSentBy protocol.Perspective) (*Hea
|
||||
// return nil, errors.New("diversification nonces should only be sent by servers")
|
||||
// }
|
||||
|
||||
header.OmitConnectionID = publicFlagByte&0x08 == 0
|
||||
if header.OmitConnectionID && packetSentBy == protocol.PerspectiveClient {
|
||||
return nil, errReceivedOmittedConnectionID
|
||||
hasConnectionID := publicFlagByte&0x08 > 0
|
||||
if !hasConnectionID && packetSentBy == protocol.PerspectiveClient {
|
||||
return nil, qerr.Error(qerr.InvalidPacketHeader, "receiving packets with omitted ConnectionID is not supported")
|
||||
}
|
||||
if header.hasPacketNumber(packetSentBy) {
|
||||
switch publicFlagByte & 0x30 {
|
||||
@@ -130,12 +129,9 @@ func parsePublicHeader(b *bytes.Reader, packetSentBy protocol.Perspective) (*Hea
|
||||
}
|
||||
|
||||
// Connection ID
|
||||
if !header.OmitConnectionID {
|
||||
connID := make(protocol.ConnectionID, 8)
|
||||
if _, err := io.ReadFull(b, connID); err != nil {
|
||||
if err == io.ErrUnexpectedEOF {
|
||||
err = io.EOF
|
||||
}
|
||||
if hasConnectionID {
|
||||
connID, err := protocol.ReadConnectionID(b, 8)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if connID[0] == 0 && connID[1] == 0 && connID[2] == 0 && connID[3] == 0 && connID[4] == 0 && connID[5] == 0 && connID[6] == 0 && connID[7] == 0 {
|
||||
@@ -218,9 +214,7 @@ func (h *Header) getPublicHeaderLength(pers protocol.Perspective) (protocol.Byte
|
||||
}
|
||||
length += protocol.ByteCount(h.PacketNumberLen)
|
||||
}
|
||||
if !h.OmitConnectionID {
|
||||
length += 8 // 8 bytes for the connection ID
|
||||
}
|
||||
length += protocol.ByteCount(h.DestConnectionID.Len()) // if set, always 8 bytes
|
||||
// Version Number in packets sent by the client
|
||||
if h.VersionFlag {
|
||||
length += 4
|
||||
|
||||
@@ -38,14 +38,13 @@ var _ = Describe("Public Header", func() {
|
||||
It("does not accept an omittedd connection ID as a server", func() {
|
||||
b := bytes.NewReader([]byte{0x00, 0x01})
|
||||
_, err := parsePublicHeader(b, protocol.PerspectiveClient)
|
||||
Expect(err).To(MatchError(errReceivedOmittedConnectionID))
|
||||
Expect(err).To(MatchError("InvalidPacketHeader: receiving packets with omitted ConnectionID is not supported"))
|
||||
})
|
||||
|
||||
It("accepts an omitted connection ID as a client", func() {
|
||||
b := bytes.NewReader([]byte{0x00, 0x01})
|
||||
hdr, err := parsePublicHeader(b, protocol.PerspectiveServer)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(hdr.OmitConnectionID).To(BeTrue())
|
||||
Expect(hdr.DestConnectionID).To(BeEmpty())
|
||||
Expect(hdr.SrcConnectionID).To(BeEmpty())
|
||||
Expect(b.Len()).To(BeZero())
|
||||
@@ -232,13 +231,10 @@ var _ = Describe("Public Header", func() {
|
||||
})
|
||||
|
||||
It("omits the connection ID", func() {
|
||||
connID := protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8}
|
||||
b := &bytes.Buffer{}
|
||||
hdr := Header{
|
||||
DestConnectionID: connID,
|
||||
OmitConnectionID: true,
|
||||
PacketNumberLen: protocol.PacketNumberLen1,
|
||||
PacketNumber: 1,
|
||||
PacketNumberLen: protocol.PacketNumberLen1,
|
||||
PacketNumber: 1,
|
||||
}
|
||||
err := hdr.writePublicHeader(b, protocol.PerspectiveServer, protocol.VersionWhatever)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
@@ -372,12 +368,10 @@ var _ = Describe("Public Header", func() {
|
||||
|
||||
It("gets the lengths of a packet sent by the client with the VersionFlag set", func() {
|
||||
hdr := Header{
|
||||
DestConnectionID: connID,
|
||||
OmitConnectionID: true,
|
||||
PacketNumber: 0xdecafbad,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
VersionFlag: true,
|
||||
Version: versionBigEndian,
|
||||
PacketNumber: 0xdecafbad,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
VersionFlag: true,
|
||||
Version: versionBigEndian,
|
||||
}
|
||||
length, err := hdr.getPublicHeaderLength(protocol.PerspectiveClient)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
@@ -386,10 +380,8 @@ var _ = Describe("Public Header", func() {
|
||||
|
||||
It("gets the length of a packet with longest packet number length and omitted connectionID", func() {
|
||||
hdr := Header{
|
||||
DestConnectionID: connID,
|
||||
OmitConnectionID: true,
|
||||
PacketNumber: 0xDECAFBAD,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
PacketNumber: 0xDECAFBAD,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
}
|
||||
length, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
@@ -414,7 +406,7 @@ var _ = Describe("Public Header", func() {
|
||||
}
|
||||
length, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(length).To(Equal(protocol.ByteCount(1 + 8 + 3 + 1))) // 1 byte public flag, 8 byte connectionID, 3 byte DiversificationNonce, 1 byte PacketNumber
|
||||
Expect(length).To(Equal(protocol.ByteCount(1 + 3 + 1))) // 1 byte public flag, 3 byte DiversificationNonce, 1 byte PacketNumber
|
||||
})
|
||||
|
||||
It("gets the length of a PublicReset", func() {
|
||||
@@ -521,19 +513,17 @@ var _ = Describe("Public Header", func() {
|
||||
|
||||
It("logs a Public Header with omitted connection ID", func() {
|
||||
(&Header{
|
||||
OmitConnectionID: true,
|
||||
PacketNumber: 0x1337,
|
||||
PacketNumberLen: 6,
|
||||
Version: protocol.Version39,
|
||||
PacketNumber: 0x1337,
|
||||
PacketNumberLen: 6,
|
||||
Version: protocol.Version39,
|
||||
}).logPublicHeader(logger)
|
||||
Expect(buf.String()).To(ContainSubstring("Public Header{ConnectionID: (empty)"))
|
||||
})
|
||||
|
||||
It("logs a Public Header without a version", func() {
|
||||
(&Header{
|
||||
OmitConnectionID: true,
|
||||
PacketNumber: 0x1337,
|
||||
PacketNumberLen: 6,
|
||||
PacketNumber: 0x1337,
|
||||
PacketNumberLen: 6,
|
||||
}).logPublicHeader(logger)
|
||||
Expect(buf.String()).To(ContainSubstring("Version: (unset)"))
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user