forked from quic-go/quic-go
determine if a received packet is retransmittable
This commit is contained in:
@@ -11,10 +11,6 @@ import (
|
||||
"github.com/lucas-clemente/quic-go/qerr"
|
||||
)
|
||||
|
||||
type unpackedPacket struct {
|
||||
frames []frames.Frame
|
||||
}
|
||||
|
||||
type packetUnpacker struct {
|
||||
version protocol.VersionNumber
|
||||
aead crypto.AEAD
|
||||
|
||||
27
unpacked_packet.go
Normal file
27
unpacked_packet.go
Normal file
@@ -0,0 +1,27 @@
|
||||
package quic
|
||||
|
||||
import "github.com/lucas-clemente/quic-go/frames"
|
||||
|
||||
type unpackedPacket struct {
|
||||
frames []frames.Frame
|
||||
}
|
||||
|
||||
func (u *unpackedPacket) IsRetransmittable() bool {
|
||||
for _, f := range u.frames {
|
||||
switch f.(type) {
|
||||
case *frames.StreamFrame:
|
||||
return true
|
||||
case *frames.RstStreamFrame:
|
||||
return true
|
||||
case *frames.WindowUpdateFrame:
|
||||
return true
|
||||
case *frames.BlockedFrame:
|
||||
return true
|
||||
case *frames.PingFrame:
|
||||
return true
|
||||
case *frames.GoawayFrame:
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
46
unpacked_packet_test.go
Normal file
46
unpacked_packet_test.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package quic
|
||||
|
||||
import (
|
||||
"github.com/lucas-clemente/quic-go/frames"
|
||||
. "github.com/onsi/ginkgo"
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
var _ = Describe("Unpacked packet", func() {
|
||||
var packet *unpackedPacket
|
||||
BeforeEach(func() {
|
||||
packet = &unpackedPacket{}
|
||||
})
|
||||
|
||||
It("says that an empty packet is not retransmittable", func() {
|
||||
Expect(packet.IsRetransmittable()).To(BeFalse())
|
||||
})
|
||||
|
||||
It("detects the frame types", func() {
|
||||
packet.frames = []frames.Frame{&frames.AckFrame{}}
|
||||
Expect(packet.IsRetransmittable()).To(BeFalse())
|
||||
packet.frames = []frames.Frame{&frames.BlockedFrame{}}
|
||||
Expect(packet.IsRetransmittable()).To(BeTrue())
|
||||
packet.frames = []frames.Frame{&frames.GoawayFrame{}}
|
||||
Expect(packet.IsRetransmittable()).To(BeTrue())
|
||||
packet.frames = []frames.Frame{&frames.PingFrame{}}
|
||||
Expect(packet.IsRetransmittable()).To(BeTrue())
|
||||
packet.frames = []frames.Frame{&frames.StreamFrame{}}
|
||||
Expect(packet.IsRetransmittable()).To(BeTrue())
|
||||
packet.frames = []frames.Frame{&frames.RstStreamFrame{}}
|
||||
Expect(packet.IsRetransmittable()).To(BeTrue())
|
||||
packet.frames = []frames.Frame{&frames.StopWaitingFrame{}}
|
||||
Expect(packet.IsRetransmittable()).To(BeFalse())
|
||||
packet.frames = []frames.Frame{&frames.WindowUpdateFrame{}}
|
||||
Expect(packet.IsRetransmittable()).To(BeTrue())
|
||||
})
|
||||
|
||||
It("says that a packet is retransmittable if it contains one retransmittable frame", func() {
|
||||
packet.frames = []frames.Frame{
|
||||
&frames.AckFrame{},
|
||||
&frames.WindowUpdateFrame{},
|
||||
&frames.StopWaitingFrame{},
|
||||
}
|
||||
Expect(packet.IsRetransmittable()).To(BeTrue())
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user