Skip to content

Commit

Permalink
QLog fix for flow control, time resolution is now µs
Browse files Browse the repository at this point in the history
  • Loading branch information
mpiraux committed Mar 30, 2020
1 parent 0c3ec10 commit aa881ba
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 14 deletions.
20 changes: 10 additions & 10 deletions agents/flow_control_agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,12 +196,12 @@ func (a *FlowControlAgent) Run(conn *Connection) { // TODO: Report violation of
// First check that the stream can be opened
if IsBidiClient(args.StreamId) && !bidiStreamsBlocked && (a.RemoteFC.StreamsBidi == 0 || GetMaxBidiClient(a.RemoteFC.StreamsBidi) < args.StreamId) {
bidiStreamsBlocked = true
conn.FrameQueue.Submit(QueuedFrame{StreamsBlockedFrame{BidiStreams, a.RemoteFC.StreamsBidi}, EncryptionLevelBestAppData})
conn.FrameQueue.Submit(QueuedFrame{&StreamsBlockedFrame{BidiStreams, a.RemoteFC.StreamsBidi}, EncryptionLevelBestAppData})
a.creditsReserved <- 0
break
} else if IsUniClient(args.StreamId) && !uniStreamsBlocked && (a.RemoteFC.StreamsUni == 0 || GetMaxUniClient(a.RemoteFC.StreamsUni) < args.StreamId) {
uniStreamsBlocked = false
conn.FrameQueue.Submit(QueuedFrame{StreamsBlockedFrame{UniStreams, a.RemoteFC.StreamsUni}, EncryptionLevelBestAppData})
conn.FrameQueue.Submit(QueuedFrame{&StreamsBlockedFrame{UniStreams, a.RemoteFC.StreamsUni}, EncryptionLevelBestAppData})
a.creditsReserved <- 0
break
}
Expand All @@ -226,12 +226,12 @@ func (a *FlowControlAgent) Run(conn *Connection) { // TODO: Report violation of

if !blockedStreams[args.StreamId] && (stream.WriteReserved >= stream.WriteLimit || (creditReserved < args.Credit)) {
blockedStreams[args.StreamId] = true
conn.FrameQueue.Submit(QueuedFrame{StreamDataBlockedFrame{args.StreamId, stream.WriteLimit}, EncryptionLevelBestAppData})
conn.FrameQueue.Submit(QueuedFrame{&StreamDataBlockedFrame{args.StreamId, stream.WriteLimit}, EncryptionLevelBestAppData})
}

if !dataBlocked && dataReserved >= a.LocalFC.MaxData {
dataBlocked = true
conn.FrameQueue.Submit(QueuedFrame{DataBlockedFrame{stream.WriteLimit}, EncryptionLevelBestAppData})
conn.FrameQueue.Submit(QueuedFrame{&DataBlockedFrame{stream.WriteLimit}, EncryptionLevelBestAppData})
}

a.creditsReserved <- creditReserved
Expand All @@ -242,24 +242,24 @@ func (a *FlowControlAgent) Run(conn *Connection) { // TODO: Report violation of
}
var allFrames []Frame
if dataLimitsChanged {
allFrames = append(allFrames, MaxDataFrame{a.LocalFC.MaxData})
allFrames = append(allFrames, &MaxDataFrame{a.LocalFC.MaxData})
dataLimitsChanged = false
}
for streamId, limit := range streamsDataLimits {
allFrames = append(allFrames, MaxStreamDataFrame{streamId, limit})
allFrames = append(allFrames, &MaxStreamDataFrame{streamId, limit})
delete(streamsDataLimits, streamId)
}
if dataBlocked {
allFrames = append(allFrames, DataBlockedFrame{a.RemoteFC.MaxData})
allFrames = append(allFrames, &DataBlockedFrame{a.RemoteFC.MaxData})
}
if bidiStreamsBlocked {
allFrames = append(allFrames, StreamsBlockedFrame{BidiStreams, a.RemoteFC.StreamsBidi})
allFrames = append(allFrames, &StreamsBlockedFrame{BidiStreams, a.RemoteFC.StreamsBidi})
}
if uniStreamsBlocked {
allFrames = append(allFrames, StreamsBlockedFrame{UniStreams, a.RemoteFC.StreamsUni})
allFrames = append(allFrames, &StreamsBlockedFrame{UniStreams, a.RemoteFC.StreamsUni})
}
for streamId, _ := range blockedStreams {
allFrames = append(allFrames, StreamDataBlockedFrame{streamId, conn.Streams.Get(streamId).WriteLimit})
allFrames = append(allFrames, &StreamDataBlockedFrame{streamId, conn.Streams.Get(streamId).WriteLimit})
}

var frames []Frame
Expand Down
4 changes: 2 additions & 2 deletions qlog/qlog.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import (
)

const (
TimeUnits = time.Millisecond
TimeUnitsString = "ms"
TimeUnits = time.Microsecond
TimeUnitsString = "us"
)

type StreamType string
Expand Down
10 changes: 10 additions & 0 deletions qlog/qt2qlog/qt2qlog.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ func convertFrames(frames []Frame) []interface{} {
qf = &qlog.PingFrame{"ping"}
case *AckFrame:
qf = ackFrameToQLog(ft)
case *AckECNFrame:
qf = ackECNFrameToQLog(ft)
case *StreamFrame:
qf = &qlog.StreamFrame{
FrameType: "stream",
Expand Down Expand Up @@ -179,6 +181,14 @@ func ackFrameToQLog(a *AckFrame) *qlog.AckFrame {
return &q
}

func ackECNFrameToQLog(a *AckECNFrame) *qlog.AckFrame {
q := ackFrameToQLog(&a.AckFrame)
q.ECT0 = a.ECT0Count
q.ECT1 = a.ECT1Count
q.CE = a.ECTCECount
return q
}

func maxStreamsToQLog(m *MaxStreamsFrame) *qlog.MaxStreamsFrame {
sType := qlog.StreamTypeBidi
if m.StreamsType == UniStreams {
Expand Down
4 changes: 2 additions & 2 deletions scenarii/flow_control.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ forLoop:
if readOffset == uint64(conn.TLSTPHandler.MaxStreamDataBidiLocal) && !shouldResume {
conn.TLSTPHandler.MaxData *= 2
conn.TLSTPHandler.MaxStreamDataBidiLocal *= 2
conn.FrameQueue.Submit(qt.QueuedFrame{qt.MaxDataFrame{uint64(conn.TLSTPHandler.MaxData)}, qt.EncryptionLevel1RTT})
conn.FrameQueue.Submit(qt.QueuedFrame{qt.MaxStreamDataFrame{0, uint64(conn.TLSTPHandler.MaxStreamDataBidiLocal)}, qt.EncryptionLevel1RTT})
conn.FrameQueue.Submit(qt.QueuedFrame{&qt.MaxDataFrame{uint64(conn.TLSTPHandler.MaxData)}, qt.EncryptionLevel1RTT})
conn.FrameQueue.Submit(qt.QueuedFrame{&qt.MaxStreamDataFrame{0, uint64(conn.TLSTPHandler.MaxStreamDataBidiLocal)}, qt.EncryptionLevel1RTT})
shouldResume = true
}
case <-conn.ConnectionClosed:
Expand Down

0 comments on commit aa881ba

Please sign in to comment.