set LeastUnackedDelta length in StopWaitingFrame

fixes #79
This commit is contained in:
Marten Seemann
2016-05-12 13:05:42 +07:00
parent aaf4b0ae9e
commit 33c0f3a5df
15 changed files with 187 additions and 51 deletions

View File

@@ -10,10 +10,16 @@ import (
// A StopWaitingFrame in QUIC
type StopWaitingFrame struct {
Entropy byte
LeastUnacked protocol.PacketNumber
LeastUnacked protocol.PacketNumber
Entropy byte
PacketNumberLen protocol.PacketNumberLen
}
var (
errLeastUnackedHigherThanPacketNumber = errors.New("StopWaitingFrame: LeastUnacked can't be greater than the packet number")
errPacketNumberLenNotSet = errors.New("StopWaitingFrame: PacketNumberLen not set")
)
func (f *StopWaitingFrame) Write(b *bytes.Buffer, packetNumber protocol.PacketNumber, version protocol.VersionNumber) error {
// packetNumber is the packet number of the packet that this StopWaitingFrame will be sent with
typeByte := uint8(0x06)
@@ -22,17 +28,33 @@ func (f *StopWaitingFrame) Write(b *bytes.Buffer, packetNumber protocol.PacketNu
b.WriteByte(f.Entropy)
if f.LeastUnacked > packetNumber {
return errors.New("StopWaitingFrame: LeastUnacked can't be greater than the packet number")
return errLeastUnackedHigherThanPacketNumber
}
leastUnackedDelta := uint64(packetNumber - f.LeastUnacked)
utils.WriteUint48(b, leastUnackedDelta)
switch f.PacketNumberLen {
case protocol.PacketNumberLen1:
b.WriteByte(uint8(leastUnackedDelta))
case protocol.PacketNumberLen2:
utils.WriteUint16(b, uint16(leastUnackedDelta))
case protocol.PacketNumberLen4:
utils.WriteUint32(b, uint32(leastUnackedDelta))
case protocol.PacketNumberLen6:
utils.WriteUint48(b, leastUnackedDelta)
default:
return errPacketNumberLenNotSet
}
return nil
}
// MinLength of a written frame
func (f *StopWaitingFrame) MinLength() protocol.ByteCount {
return 1 + 1 + 6
func (f *StopWaitingFrame) MinLength() (protocol.ByteCount, error) {
if f.PacketNumberLen == protocol.PacketNumberLenInvalid {
return 0, errPacketNumberLenNotSet
}
return protocol.ByteCount(1 + 1 + f.PacketNumberLen), nil
}
// ParseStopWaitingFrame parses a StopWaiting frame