summaryrefslogtreecommitdiffhomepage
path: root/pkg
diff options
context:
space:
mode:
authorBhasker Hariharan <bhaskerh@google.com>2018-08-07 11:48:37 -0700
committerShentubot <shentubot@google.com>2018-08-07 11:49:57 -0700
commit7d3684aadf71255d3d8442ae1ed0b0f0048f95a3 (patch)
tree21c1108e906c2db055c9ab831eed866cd45dc1a4 /pkg
parenta38f41b4643520a3b2a078e73ec012ffd3f71f54 (diff)
Adds support to dump out cubic internal state.
PiperOrigin-RevId: 207754087 Change-Id: I83abce64348ea93f8692da81a881b364dae2158b
Diffstat (limited to 'pkg')
-rw-r--r--pkg/tcpip/stack/stack.go17
-rw-r--r--pkg/tcpip/transport/tcp/endpoint.go14
2 files changed, 31 insertions, 0 deletions
diff --git a/pkg/tcpip/stack/stack.go b/pkg/tcpip/stack/stack.go
index 9cdc7b6d8..fa7aeb051 100644
--- a/pkg/tcpip/stack/stack.go
+++ b/pkg/tcpip/stack/stack.go
@@ -56,6 +56,20 @@ type transportProtocolState struct {
// passed to stack.AddTCPProbe.
type TCPProbeFunc func(s TCPEndpointState)
+// TCPCubicState is used to hold a copy of the internal cubic state when the
+// TCPProbeFunc is invoked.
+type TCPCubicState struct {
+ WLastMax float64
+ WMax float64
+ T time.Time
+ TimeSinceLastCongestion time.Duration
+ C float64
+ K float64
+ Beta float64
+ WC float64
+ WEst float64
+}
+
// TCPEndpointID is the unique 4 tuple that identifies a given endpoint.
type TCPEndpointID struct {
// LocalPort is the local port associated with the endpoint.
@@ -180,6 +194,9 @@ type TCPSenderState struct {
// FastRecovery holds the fast recovery state for the endpoint.
FastRecovery TCPFastRecoveryState
+
+ // Cubic holds the state related to CUBIC congestion control.
+ Cubic TCPCubicState
}
// TCPSACKInfo holds TCP SACK related information for a given TCP endpoint.
diff --git a/pkg/tcpip/transport/tcp/endpoint.go b/pkg/tcpip/transport/tcp/endpoint.go
index e1b71e423..3fcbf6502 100644
--- a/pkg/tcpip/transport/tcp/endpoint.go
+++ b/pkg/tcpip/transport/tcp/endpoint.go
@@ -1452,5 +1452,19 @@ func (e *endpoint) completeState() stack.TCPEndpointState {
SndWndScale: e.snd.sndWndScale,
MaxSentAck: e.snd.maxSentAck,
}
+
+ if cubic, ok := e.snd.cc.(*cubicState); ok {
+ s.Sender.Cubic = stack.TCPCubicState{
+ WMax: cubic.wMax,
+ WLastMax: cubic.wLastMax,
+ T: cubic.t,
+ TimeSinceLastCongestion: time.Since(cubic.t),
+ C: cubic.c,
+ K: cubic.k,
+ Beta: cubic.beta,
+ WC: cubic.wC,
+ WEst: cubic.wEst,
+ }
+ }
return s
}