forked from quic-go/quic-go
implement Writing of StopWaitingFrames
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user