implement Writing of StopWaitingFrames

This commit is contained in:
Marten Seemann
2016-04-25 15:29:19 +07:00
parent bf7875426a
commit 47d7f98383
4 changed files with 70 additions and 14 deletions

View File

@@ -2,6 +2,7 @@ package frames
import (
"bytes"
"errors"
"github.com/lucas-clemente/quic-go/protocol"
"github.com/lucas-clemente/quic-go/utils"
@@ -9,21 +10,33 @@ import (
// A StopWaitingFrame in QUIC
type StopWaitingFrame struct {
Entropy byte
LeastUnackedDelta uint64
Entropy byte
LeastUnacked protocol.PacketNumber
}
func (f *StopWaitingFrame) Write(b *bytes.Buffer, packetNumber protocol.PacketNumber, packetNumberLen uint8) error {
panic("StopWaitingFrame: Write not yet implemented")
// packetNumber is the packet number of the packet that this StopWaitingFrame will be sent with
typeByte := uint8(0x06)
b.WriteByte(typeByte)
b.WriteByte(f.Entropy)
if f.LeastUnacked > packetNumber {
return errors.New("StopWaitingFrame: LeastUnacked can't be greater than the packet number")
}
leastUnackedDelta := uint64(packetNumber - f.LeastUnacked)
utils.WriteUint48(b, leastUnackedDelta)
return nil
}
// MaxLength of a written frame
func (f *StopWaitingFrame) MaxLength() int {
panic("StopWaitingFrame: Write not yet implemented")
return 1 + 1 + 6
}
// ParseStopWaitingFrame parses a StopWaiting frame
func ParseStopWaitingFrame(r *bytes.Reader, packetNumberLen uint8) (*StopWaitingFrame, error) {
func ParseStopWaitingFrame(r *bytes.Reader, packetNumber protocol.PacketNumber, packetNumberLen uint8) (*StopWaitingFrame, error) {
frame := &StopWaitingFrame{}
// read the TypeByte
@@ -37,10 +50,16 @@ func ParseStopWaitingFrame(r *bytes.Reader, packetNumberLen uint8) (*StopWaiting
return nil, err
}
frame.LeastUnackedDelta, err = utils.ReadUintN(r, packetNumberLen)
leastUnackedDelta, err := utils.ReadUintN(r, packetNumberLen)
if err != nil {
return nil, err
}
if leastUnackedDelta > uint64(packetNumber) {
return nil, errors.New("StopWaitingFrame: Invalid LeastUnackedDelta")
}
frame.LeastUnacked = protocol.PacketNumber(uint64(packetNumber) - leastUnackedDelta)
return frame, nil
}