forked from quic-go/quic-go
implement the original_connection_id transport parameter
This commit is contained in:
@@ -22,8 +22,9 @@ var _ = Describe("Transport Parameters", func() {
|
|||||||
MaxBidiStreams: 1337,
|
MaxBidiStreams: 1337,
|
||||||
MaxUniStreams: 7331,
|
MaxUniStreams: 7331,
|
||||||
IdleTimeout: 42 * time.Second,
|
IdleTimeout: 42 * time.Second,
|
||||||
|
OriginalConnectionID: protocol.ConnectionID{0xde, 0xad, 0xbe, 0xef},
|
||||||
}
|
}
|
||||||
Expect(p.String()).To(Equal("&handshake.TransportParameters{InitialMaxStreamDataBidiLocal: 0x1234, InitialMaxStreamDataBidiRemote: 0x2345, InitialMaxStreamDataUni: 0x3456, InitialMaxData: 0x4567, MaxBidiStreams: 1337, MaxUniStreams: 7331, IdleTimeout: 42s}"))
|
Expect(p.String()).To(Equal("&handshake.TransportParameters{OriginalConnectionID: 0xdeadbeef, InitialMaxStreamDataBidiLocal: 0x1234, InitialMaxStreamDataBidiRemote: 0x2345, InitialMaxStreamDataUni: 0x3456, InitialMaxData: 0x4567, MaxBidiStreams: 1337, MaxUniStreams: 7331, IdleTimeout: 42s}"))
|
||||||
})
|
})
|
||||||
|
|
||||||
getRandomValue := func() uint64 {
|
getRandomValue := func() uint64 {
|
||||||
@@ -43,6 +44,7 @@ var _ = Describe("Transport Parameters", func() {
|
|||||||
MaxUniStreams: getRandomValue(),
|
MaxUniStreams: getRandomValue(),
|
||||||
DisableMigration: true,
|
DisableMigration: true,
|
||||||
StatelessResetToken: bytes.Repeat([]byte{100}, 16),
|
StatelessResetToken: bytes.Repeat([]byte{100}, 16),
|
||||||
|
OriginalConnectionID: protocol.ConnectionID{0xde, 0xad, 0xbe, 0xef},
|
||||||
}
|
}
|
||||||
b := &bytes.Buffer{}
|
b := &bytes.Buffer{}
|
||||||
params.marshal(b)
|
params.marshal(b)
|
||||||
@@ -58,6 +60,7 @@ var _ = Describe("Transport Parameters", func() {
|
|||||||
Expect(p.IdleTimeout).To(Equal(params.IdleTimeout))
|
Expect(p.IdleTimeout).To(Equal(params.IdleTimeout))
|
||||||
Expect(p.DisableMigration).To(Equal(params.DisableMigration))
|
Expect(p.DisableMigration).To(Equal(params.DisableMigration))
|
||||||
Expect(p.StatelessResetToken).To(Equal(params.StatelessResetToken))
|
Expect(p.StatelessResetToken).To(Equal(params.StatelessResetToken))
|
||||||
|
Expect(p.OriginalConnectionID).To(Equal(protocol.ConnectionID{0xde, 0xad, 0xbe, 0xef}))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("errors when the stateless_reset_token has the wrong length", func() {
|
It("errors when the stateless_reset_token has the wrong length", func() {
|
||||||
@@ -167,4 +170,14 @@ var _ = Describe("Transport Parameters", func() {
|
|||||||
p := &TransportParameters{}
|
p := &TransportParameters{}
|
||||||
Expect(p.unmarshal(b.Bytes(), protocol.PerspectiveClient)).To(MatchError("client sent a stateless_reset_token"))
|
Expect(p.unmarshal(b.Bytes(), protocol.PerspectiveClient)).To(MatchError("client sent a stateless_reset_token"))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("errors if the client sent a stateless_reset_token", func() {
|
||||||
|
params := &TransportParameters{
|
||||||
|
OriginalConnectionID: protocol.ConnectionID{0xca, 0xfe},
|
||||||
|
}
|
||||||
|
b := &bytes.Buffer{}
|
||||||
|
params.marshal(b)
|
||||||
|
p := &TransportParameters{}
|
||||||
|
Expect(p.unmarshal(b.Bytes(), protocol.PerspectiveClient)).To(MatchError("client sent an original_connection_id"))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import (
|
|||||||
type transportParameterID uint16
|
type transportParameterID uint16
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
originalConnectionIDParameterID transportParameterID = 0x0
|
||||||
idleTimeoutParameterID transportParameterID = 0x1
|
idleTimeoutParameterID transportParameterID = 0x1
|
||||||
statelessResetTokenParameterID transportParameterID = 0x2
|
statelessResetTokenParameterID transportParameterID = 0x2
|
||||||
maxPacketSizeParameterID transportParameterID = 0x3
|
maxPacketSizeParameterID transportParameterID = 0x3
|
||||||
@@ -39,9 +40,11 @@ type TransportParameters struct {
|
|||||||
MaxUniStreams uint64
|
MaxUniStreams uint64
|
||||||
MaxBidiStreams uint64
|
MaxBidiStreams uint64
|
||||||
|
|
||||||
IdleTimeout time.Duration
|
IdleTimeout time.Duration
|
||||||
DisableMigration bool
|
DisableMigration bool
|
||||||
StatelessResetToken []byte
|
|
||||||
|
StatelessResetToken []byte
|
||||||
|
OriginalConnectionID protocol.ConnectionID
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *TransportParameters) unmarshal(data []byte, sentBy protocol.Perspective) error {
|
func (p *TransportParameters) unmarshal(data []byte, sentBy protocol.Perspective) error {
|
||||||
@@ -86,6 +89,11 @@ func (p *TransportParameters) unmarshal(data []byte, sentBy protocol.Perspective
|
|||||||
b := make([]byte, 16)
|
b := make([]byte, 16)
|
||||||
r.Read(b)
|
r.Read(b)
|
||||||
p.StatelessResetToken = b
|
p.StatelessResetToken = b
|
||||||
|
case originalConnectionIDParameterID:
|
||||||
|
if sentBy == protocol.PerspectiveClient {
|
||||||
|
return errors.New("client sent an original_connection_id")
|
||||||
|
}
|
||||||
|
p.OriginalConnectionID, _ = protocol.ReadConnectionID(r, int(paramLen))
|
||||||
default:
|
default:
|
||||||
r.Seek(int64(paramLen), io.SeekCurrent)
|
r.Seek(int64(paramLen), io.SeekCurrent)
|
||||||
}
|
}
|
||||||
@@ -188,9 +196,15 @@ func (p *TransportParameters) marshal(b *bytes.Buffer) {
|
|||||||
utils.BigEndian.WriteUint16(b, uint16(len(p.StatelessResetToken))) // should always be 16 bytes
|
utils.BigEndian.WriteUint16(b, uint16(len(p.StatelessResetToken))) // should always be 16 bytes
|
||||||
b.Write(p.StatelessResetToken)
|
b.Write(p.StatelessResetToken)
|
||||||
}
|
}
|
||||||
|
// original_connection_id
|
||||||
|
if p.OriginalConnectionID.Len() > 0 {
|
||||||
|
utils.BigEndian.WriteUint16(b, uint16(originalConnectionIDParameterID))
|
||||||
|
utils.BigEndian.WriteUint16(b, uint16(p.OriginalConnectionID.Len()))
|
||||||
|
b.Write(p.OriginalConnectionID.Bytes())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns a string representation, intended for logging.
|
// String returns a string representation, intended for logging.
|
||||||
func (p *TransportParameters) String() string {
|
func (p *TransportParameters) String() string {
|
||||||
return fmt.Sprintf("&handshake.TransportParameters{InitialMaxStreamDataBidiLocal: %#x, InitialMaxStreamDataBidiRemote: %#x, InitialMaxStreamDataUni: %#x, InitialMaxData: %#x, MaxBidiStreams: %d, MaxUniStreams: %d, IdleTimeout: %s}", p.InitialMaxStreamDataBidiLocal, p.InitialMaxStreamDataBidiRemote, p.InitialMaxStreamDataUni, p.InitialMaxData, p.MaxBidiStreams, p.MaxUniStreams, p.IdleTimeout)
|
return fmt.Sprintf("&handshake.TransportParameters{OriginalConnectionID: %s, InitialMaxStreamDataBidiLocal: %#x, InitialMaxStreamDataBidiRemote: %#x, InitialMaxStreamDataUni: %#x, InitialMaxData: %#x, MaxBidiStreams: %d, MaxUniStreams: %d, IdleTimeout: %s}", p.OriginalConnectionID, p.InitialMaxStreamDataBidiLocal, p.InitialMaxStreamDataBidiRemote, p.InitialMaxStreamDataUni, p.InitialMaxData, p.MaxBidiStreams, p.MaxUniStreams, p.IdleTimeout)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user