178 lines
6.7 KiB
Go
178 lines
6.7 KiB
Go
|
package ndt7
|
||
|
|
||
|
// This file vendors data structures from the following repositories:
|
||
|
//
|
||
|
// - github.com/m-lab/ndt7-client-go
|
||
|
// - github.com/m-lab/ndt-server
|
||
|
// - github.com/m-lab/tcp-info
|
||
|
//
|
||
|
// It is available under the Apache License v2.0.
|
||
|
//
|
||
|
// Because m-lab uses mainly Linux as a development platform, they may
|
||
|
// unwillingly break our Windows builds. Also, they use lots of depdencies
|
||
|
// that we don't actually need. Hence, vendoring FTW.
|
||
|
//
|
||
|
// The data structures are supposed to stay constant in time or to not
|
||
|
// change dramatically, hence this vendoring shouldn't be too bad.
|
||
|
|
||
|
type (
|
||
|
// OriginKind indicates the origin of a measurement.
|
||
|
OriginKind string
|
||
|
|
||
|
// TestKind indicates the direction of a measurement.
|
||
|
TestKind string
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
// OriginClient indicates that the measurement origin is the client.
|
||
|
OriginClient = OriginKind("client")
|
||
|
|
||
|
// OriginServer indicates that the measurement origin is the server.
|
||
|
OriginServer = OriginKind("server")
|
||
|
|
||
|
// TestDownload indicates that this is a download.
|
||
|
TestDownload = TestKind("download")
|
||
|
|
||
|
// TestUpload indicates that this is an upload.
|
||
|
TestUpload = TestKind("upload")
|
||
|
)
|
||
|
|
||
|
// LinuxTCPInfo is the linux defined structure returned in RouteAttr DIAG_INFO messages.
|
||
|
// It corresponds to the struct tcp_info in include/uapi/linux/tcp.h
|
||
|
type LinuxTCPInfo struct {
|
||
|
State uint8 `csv:"TCP.State"`
|
||
|
CAState uint8 `csv:"TCP.CAState"`
|
||
|
Retransmits uint8 `csv:"TCP.Retransmits"`
|
||
|
Probes uint8 `csv:"TCP.Probes"`
|
||
|
Backoff uint8 `csv:"TCP.Backoff"`
|
||
|
Options uint8 `csv:"TCP.Options"`
|
||
|
WScale uint8 `csv:"TCP.WScale"` //snd_wscale : 4, tcpi_rcv_wscale : 4;
|
||
|
AppLimited uint8 `csv:"TCP.AppLimited"` //delivery_rate_app_limited:1;
|
||
|
|
||
|
RTO uint32 `csv:"TCP.RTO"` // offset 8
|
||
|
ATO uint32 `csv:"TCP.ATO"`
|
||
|
SndMSS uint32 `csv:"TCP.SndMSS"`
|
||
|
RcvMSS uint32 `csv:"TCP.RcvMSS"`
|
||
|
|
||
|
Unacked uint32 `csv:"TCP.Unacked"` // offset 24
|
||
|
Sacked uint32 `csv:"TCP.Sacked"`
|
||
|
Lost uint32 `csv:"TCP.Lost"`
|
||
|
Retrans uint32 `csv:"TCP.Retrans"`
|
||
|
Fackets uint32 `csv:"TCP.Fackets"`
|
||
|
|
||
|
/* Times. */
|
||
|
// These seem to be elapsed time, so they increase on almost every sample.
|
||
|
// We can probably use them to get more info about intervals between samples.
|
||
|
LastDataSent uint32 `csv:"TCP.LastDataSent"` // offset 44
|
||
|
LastAckSent uint32 `csv:"TCP.LastAckSent"` /* Not remembered, sorry. */ // offset 48
|
||
|
LastDataRecv uint32 `csv:"TCP.LastDataRecv"` // offset 52
|
||
|
LastAckRecv uint32 `csv:"TCP.LastDataRecv"` // offset 56
|
||
|
|
||
|
/* Metrics. */
|
||
|
PMTU uint32 `csv:"TCP.PMTU"`
|
||
|
RcvSsThresh uint32 `csv:"TCP.RcvSsThresh"`
|
||
|
RTT uint32 `csv:"TCP.RTT"`
|
||
|
RTTVar uint32 `csv:"TCP.RTTVar"`
|
||
|
SndSsThresh uint32 `csv:"TCP.SndSsThresh"`
|
||
|
SndCwnd uint32 `csv:"TCP.SndCwnd"`
|
||
|
AdvMSS uint32 `csv:"TCP.AdvMSS"`
|
||
|
Reordering uint32 `csv:"TCP.Reordering"`
|
||
|
|
||
|
RcvRTT uint32 `csv:"TCP.RcvRTT"`
|
||
|
RcvSpace uint32 `csv:"TCP.RcvSpace"`
|
||
|
|
||
|
TotalRetrans uint32 `csv:"TCP.TotalRetrans"`
|
||
|
|
||
|
PacingRate int64 `csv:"TCP.PacingRate"` // This is often -1, so better for it to be signed
|
||
|
MaxPacingRate int64 `csv:"TCP.MaxPacingRate"` // This is often -1, so better to be signed.
|
||
|
|
||
|
// NOTE: In linux, these are uint64, but we make them int64 here for compatibility with BigQuery
|
||
|
BytesAcked int64 `csv:"TCP.BytesAcked"` /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
|
||
|
BytesReceived int64 `csv:"TCP.BytesReceived"` /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
|
||
|
SegsOut int32 `csv:"TCP.SegsOut"` /* RFC4898 tcpEStatsPerfSegsOut */
|
||
|
SegsIn int32 `csv:"TCP.SegsIn"` /* RFC4898 tcpEStatsPerfSegsIn */
|
||
|
|
||
|
NotsentBytes uint32 `csv:"TCP.NotsentBytes"`
|
||
|
MinRTT uint32 `csv:"TCP.MinRTT"`
|
||
|
DataSegsIn uint32 `csv:"TCP.DataSegsIn"` /* RFC4898 tcpEStatsDataSegsIn */
|
||
|
DataSegsOut uint32 `csv:"TCP.DataSegsOut"` /* RFC4898 tcpEStatsDataSegsOut */
|
||
|
|
||
|
// NOTE: In linux, this is uint64, but we make it int64 here for compatibility with BigQuery
|
||
|
DeliveryRate int64 `csv:"TCP.DeliveryRate"`
|
||
|
|
||
|
BusyTime int64 `csv:"TCP.BusyTime"` /* Time (usec) busy sending data */
|
||
|
RWndLimited int64 `csv:"TCP.RWndLimited"` /* Time (usec) limited by receive window */
|
||
|
SndBufLimited int64 `csv:"TCP.SndBufLimited"` /* Time (usec) limited by send buffer */
|
||
|
|
||
|
Delivered uint32 `csv:"TCP.Delivered"`
|
||
|
DeliveredCE uint32 `csv:"TCP.DeliveredCE"`
|
||
|
|
||
|
// NOTE: In linux, these are uint64, but we make them int64 here for compatibility with BigQuery
|
||
|
BytesSent int64 `csv:"TCP.BytesSent"` /* RFC4898 tcpEStatsPerfHCDataOctetsOut */
|
||
|
BytesRetrans int64 `csv:"TCP.BytesRetrans"` /* RFC4898 tcpEStatsPerfOctetsRetrans */
|
||
|
|
||
|
DSackDups uint32 `csv:"TCP.DSackDups"` /* RFC4898 tcpEStatsStackDSACKDups */
|
||
|
ReordSeen uint32 `csv:"TCP.ReordSeen"` /* reordering events seen */
|
||
|
}
|
||
|
|
||
|
// AppInfo contains an application level measurement. This structure is
|
||
|
// described in the ndt7 specification.
|
||
|
type AppInfo struct {
|
||
|
NumBytes int64
|
||
|
ElapsedTime int64
|
||
|
}
|
||
|
|
||
|
// ConnectionInfo contains connection info. This structure is described
|
||
|
// in the ndt7 specification.
|
||
|
type ConnectionInfo struct {
|
||
|
Client string
|
||
|
Server string
|
||
|
UUID string `json:",omitempty"`
|
||
|
}
|
||
|
|
||
|
// InetDiagBBRInfo implements the struct associated with INET_DIAG_BBRINFO attribute, corresponding with
|
||
|
// linux struct tcp_bbr_info in uapi/linux/inet_diag.h.
|
||
|
type InetDiagBBRInfo struct {
|
||
|
BW int64 `csv:"BBR.BW"` // Max-filtered BW (app throughput) estimate in bytes/second
|
||
|
MinRTT uint32 `csv:"BBR.MinRTT"` // Min-filtered RTT in uSec
|
||
|
PacingGain uint32 `csv:"BBR.PacingGain"` // Pacing gain shifted left 8 bits
|
||
|
CwndGain uint32 `csv:"BBR.CwndGain"` // Cwnd gain shifted left 8 bits
|
||
|
}
|
||
|
|
||
|
// The BBRInfo struct contains information measured using BBR. This structure is
|
||
|
// an extension to the ndt7 specification. Variables here have the same
|
||
|
// measurement unit that is used by the Linux kernel.
|
||
|
type BBRInfo struct {
|
||
|
InetDiagBBRInfo
|
||
|
ElapsedTime int64
|
||
|
}
|
||
|
|
||
|
// The TCPInfo struct contains information measured using TCP_INFO. This
|
||
|
// structure is described in the ndt7 specification.
|
||
|
type TCPInfo struct {
|
||
|
LinuxTCPInfo
|
||
|
ElapsedTime int64
|
||
|
}
|
||
|
|
||
|
// The Measurement struct contains measurement results. This message is
|
||
|
// an extension of the one inside of v0.9.0 of the ndt7 spec.
|
||
|
type Measurement struct {
|
||
|
// AppInfo contains application level measurements.
|
||
|
AppInfo *AppInfo `json:",omitempty"`
|
||
|
|
||
|
// BBRInfo is the data measured using TCP BBR instrumentation.
|
||
|
BBRInfo *BBRInfo `json:",omitempty"`
|
||
|
|
||
|
// ConnectionInfo contains info on the connection.
|
||
|
ConnectionInfo *ConnectionInfo `json:",omitempty"`
|
||
|
|
||
|
// Origin indicates who performed this measurement.
|
||
|
Origin OriginKind `json:",omitempty"`
|
||
|
|
||
|
// Test contains the test name.
|
||
|
Test TestKind `json:",omitempty"`
|
||
|
|
||
|
// TCPInfo contains metrics measured using TCP_INFO instrumentation.
|
||
|
TCPInfo *TCPInfo `json:",omitempty"`
|
||
|
}
|