determine if a received packet is retransmittable

This commit is contained in:
Marten Seemann
2017-01-08 19:30:50 +07:00
parent d541472101
commit 7fc9d59381
3 changed files with 73 additions and 4 deletions

View File

@@ -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
View 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
View 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())
})
})