set if a stream contributes to connection flow control

This depends on the version. In gQUIC, stream 1 and 3 don't contribute,
in IETF QUIC only stream 0 doesn't contribute.
This commit is contained in:
Marten Seemann
2017-11-01 14:32:03 +07:00
parent f662822486
commit 1f644debd4
3 changed files with 27 additions and 6 deletions

View File

@@ -68,6 +68,17 @@ func (vn VersionNumber) CryptoStreamID() StreamID {
return 0 return 0
} }
// StreamContributesToConnectionFlowControl says if a stream contributes to connection-level flow control
func (vn VersionNumber) StreamContributesToConnectionFlowControl(id StreamID) bool {
if id == vn.CryptoStreamID() {
return false
}
if vn.isGQUIC() && id == 3 {
return false
}
return true
}
func (vn VersionNumber) isGQUIC() bool { func (vn VersionNumber) isGQUIC() bool {
return vn > gquicVersion0 && vn <= maxGquicVersion return vn > gquicVersion0 && vn <= maxGquicVersion
} }

View File

@@ -52,6 +52,21 @@ var _ = Describe("Version", func() {
Expect(VersionTLS.CryptoStreamID()).To(Equal(StreamID(0))) Expect(VersionTLS.CryptoStreamID()).To(Equal(StreamID(0)))
}) })
It("says if a stream contributes to connection-level flowcontrol, for gQUIC", func() {
Expect(Version39.StreamContributesToConnectionFlowControl(1)).To(BeFalse())
Expect(Version39.StreamContributesToConnectionFlowControl(2)).To(BeTrue())
Expect(Version39.StreamContributesToConnectionFlowControl(3)).To(BeFalse())
Expect(Version39.StreamContributesToConnectionFlowControl(4)).To(BeTrue())
Expect(Version39.StreamContributesToConnectionFlowControl(5)).To(BeTrue())
})
It("says if a stream contributes to connection-level flowcontrol, for TLS", func() {
Expect(VersionTLS.StreamContributesToConnectionFlowControl(0)).To(BeFalse())
Expect(VersionTLS.StreamContributesToConnectionFlowControl(1)).To(BeTrue())
Expect(VersionTLS.StreamContributesToConnectionFlowControl(2)).To(BeTrue())
Expect(VersionTLS.StreamContributesToConnectionFlowControl(3)).To(BeTrue())
})
It("recognizes supported versions", func() { It("recognizes supported versions", func() {
Expect(IsSupportedVersion(SupportedVersions, 0)).To(BeFalse()) Expect(IsSupportedVersion(SupportedVersions, 0)).To(BeFalse())
Expect(IsSupportedVersion(SupportedVersions, SupportedVersions[0])).To(BeTrue()) Expect(IsSupportedVersion(SupportedVersions, SupportedVersions[0])).To(BeTrue())

View File

@@ -818,18 +818,13 @@ func (s *session) queueResetStreamFrame(id protocol.StreamID, offset protocol.By
} }
func (s *session) newStream(id protocol.StreamID) streamI { func (s *session) newStream(id protocol.StreamID) streamI {
// TODO: find a better solution for determining which streams contribute to connection level flow control
var contributesToConnection bool
if id != 0 && id != 1 && id != 3 {
contributesToConnection = true
}
var initialSendWindow protocol.ByteCount var initialSendWindow protocol.ByteCount
if s.peerParams != nil { if s.peerParams != nil {
initialSendWindow = s.peerParams.StreamFlowControlWindow initialSendWindow = s.peerParams.StreamFlowControlWindow
} }
flowController := flowcontrol.NewStreamFlowController( flowController := flowcontrol.NewStreamFlowController(
id, id,
contributesToConnection, s.version.StreamContributesToConnectionFlowControl(id),
s.connFlowController, s.connFlowController,
protocol.ReceiveStreamFlowControlWindow, protocol.ReceiveStreamFlowControlWindow,
protocol.ByteCount(s.config.MaxReceiveStreamFlowControlWindow), protocol.ByteCount(s.config.MaxReceiveStreamFlowControlWindow),