forked from quic-go/quic-go
only add an ECN control message if ECN is supported
This commit is contained in:
@@ -37,14 +37,48 @@ func (t PacketType) String() string {
|
||||
type ECN uint8
|
||||
|
||||
const (
|
||||
ECNNon ECN = iota // 00
|
||||
ECT1 // 01
|
||||
ECT0 // 10
|
||||
ECNCE // 11
|
||||
ECNUnsupported ECN = iota
|
||||
ECNNon // 00
|
||||
ECT1 // 01
|
||||
ECT0 // 10
|
||||
ECNCE // 11
|
||||
)
|
||||
|
||||
func ParseECNHeaderBits(bits byte) ECN {
|
||||
switch bits {
|
||||
case 0:
|
||||
return ECNNon
|
||||
case 0b00000010:
|
||||
return ECT0
|
||||
case 0b00000001:
|
||||
return ECT1
|
||||
case 0b00000011:
|
||||
return ECNCE
|
||||
default:
|
||||
panic("invalid ECN bits")
|
||||
}
|
||||
}
|
||||
|
||||
func (e ECN) ToHeaderBits() byte {
|
||||
//nolint:exhaustive // There are only 4 values.
|
||||
switch e {
|
||||
case ECNNon:
|
||||
return 0
|
||||
case ECT0:
|
||||
return 0b00000010
|
||||
case ECT1:
|
||||
return 0b00000001
|
||||
case ECNCE:
|
||||
return 0b00000011
|
||||
default:
|
||||
panic("ECN unsupported")
|
||||
}
|
||||
}
|
||||
|
||||
func (e ECN) String() string {
|
||||
switch e {
|
||||
case ECNUnsupported:
|
||||
return "ECN unsupported"
|
||||
case ECNNon:
|
||||
return "Not-ECT"
|
||||
case ECT1:
|
||||
|
||||
@@ -17,13 +17,22 @@ var _ = Describe("Protocol", func() {
|
||||
})
|
||||
|
||||
It("converts ECN bits from the IP header wire to the correct types", func() {
|
||||
Expect(ECN(0)).To(Equal(ECNNon))
|
||||
Expect(ECN(0b00000010)).To(Equal(ECT0))
|
||||
Expect(ECN(0b00000001)).To(Equal(ECT1))
|
||||
Expect(ECN(0b00000011)).To(Equal(ECNCE))
|
||||
Expect(ParseECNHeaderBits(0)).To(Equal(ECNNon))
|
||||
Expect(ParseECNHeaderBits(0b00000010)).To(Equal(ECT0))
|
||||
Expect(ParseECNHeaderBits(0b00000001)).To(Equal(ECT1))
|
||||
Expect(ParseECNHeaderBits(0b00000011)).To(Equal(ECNCE))
|
||||
Expect(func() { ParseECNHeaderBits(0b1010101) }).To(Panic())
|
||||
})
|
||||
|
||||
It("converts to IP header bits", func() {
|
||||
for _, v := range [...]ECN{ECNNon, ECT0, ECT1, ECNCE} {
|
||||
Expect(ParseECNHeaderBits(v.ToHeaderBits())).To(Equal(v))
|
||||
}
|
||||
Expect(func() { ECN(42).ToHeaderBits() }).To(Panic())
|
||||
})
|
||||
|
||||
It("has a string representation for ECN", func() {
|
||||
Expect(ECNUnsupported.String()).To(Equal("ECN unsupported"))
|
||||
Expect(ECNNon.String()).To(Equal("Not-ECT"))
|
||||
Expect(ECT0.String()).To(Equal("ECT(0)"))
|
||||
Expect(ECT1.String()).To(Equal("ECT(1)"))
|
||||
|
||||
Reference in New Issue
Block a user