/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef _INC_TCPESTATS
#define _INC_TCPESTATS

#if (_WIN32_WINNT >= 0x0600)

#ifdef __cplusplus
extern "C" {
#endif

typedef struct _TCP_ESTATS_BANDWIDTH_ROD_v0 {
  ULONG64 OutboundBandwidth;
  ULONG64 InboundBandwidth;
  ULONG64 OutboundInstability;
  ULONG64 InboundInstability;
  BOOLEAN OutboundBandwidthPeaked;
  BOOLEAN InboundBandwidthPeaked;
} TCP_ESTATS_BANDWIDTH_ROD_v0, *PTCP_ESTATS_BANDWIDTH_ROD_v0;

typedef enum _TCP_BOOLEAN_OPTIONAL {
  TcpBoolOptDisabled    = 0,
  TcpBoolOptEnabled     = 1,
  TcpBoolOptUnchanged   = -1 
} TCP_BOOLEAN_OPTIONAL;

typedef struct _TCP_ESTATS_BANDWIDTH_RW_v0 {
  TCP_BOOLEAN_OPTIONAL EnableCollectionOutbound;
  TCP_BOOLEAN_OPTIONAL EnableCollectionInbound;
} TCP_ESTATS_BANDWIDTH_RW_v0, *PTCP_ESTATS_BANDWIDTH_RW_v0;

typedef struct _TCP_ESTATS_DATA_ROD_v0 {
  ULONG64 DataBytesOut;
  ULONG64 DataSegsOut;
  ULONG64 DataBytesIn;
  ULONG64 DataSegsIn;
  ULONG64 SegsOut;
  ULONG64 SegsIn;
  ULONG   SoftErrors;
  ULONG   SoftErrorReason;
  ULONG   SndUna;
  ULONG   SndNxt;
  ULONG   SndMax;
  ULONG64 ThruBytesAcked;
  ULONG   RcvNxt;
  ULONG64 ThruBytesReceived;
} TCP_ESTATS_DATA_ROD_v0, *PTCP_ESTATS_DATA_ROD_v0;

typedef struct _TCP_ESTATS_DATA_RW_v0 {
  BOOLEAN EnableCollection;
} TCP_ESTATS_DATA_RW_v0, *PTCP_ESTATS_DATA_RW_v0;

typedef struct _TCP_ESTATS_FINE_RTT_ROD_v0 {
  ULONG RttVar;
  ULONG MaxRtt;
  ULONG MinRtt;
  ULONG SumRtt;
} TCP_ESTATS_FINE_RTT_ROD_v0, *PTCP_ESTATS_FINE_RTT_ROD_v0;

typedef struct _TCP_ESTATS_FINE_RTT_RW_v0 {
  BOOLEAN EnableCollection;
} TCP_ESTATS_FINE_RTT_RW_v0, *PTCP_ESTATS_FINE_RTT_RW_v0;

typedef struct _TCP_ESTATS_OBS_REC_ROD_v0 {
  ULONG CurRwinRcvd;
  ULONG MaxRwinRcvd;
  ULONG MinRwinRcvd;
  UCHAR WinScaleRcvd;
} TCP_ESTATS_OBS_REC_ROD_v0, *PTCP_ESTATS_OBS_REC_ROD_v0;

typedef struct _TCP_ESTATS_OBS_REC_RW_v0 {
  BOOLEAN EnableCollection;
} TCP_ESTATS_OBS_REC_RW_v0, *PTCP_ESTATS_OBS_REC_RW_v0;

typedef struct _TCP_ESTATS_PATH_ROD_v0 {
  ULONG FastRetran;
  ULONG Timeouts;
  ULONG SubsequentTimeouts;
  ULONG CurTimeoutCount;
  ULONG AbruptTimeouts;
  ULONG PktsRetrans;
  ULONG BytesRetrans;
  ULONG DupAcksIn;
  ULONG SacksRcvd;
  ULONG SackBlocksRcvd;
  ULONG CongSignals;
  ULONG PreCongSumCwnd;
  ULONG PreCongSumRtt;
  ULONG PostCongSumRtt;
  ULONG PostCongCountRtt;
  ULONG EcnSignals;
  ULONG EceRcvd;
  ULONG SendStall;
  ULONG QuenchRcvd;
  ULONG RetranThresh;
  ULONG SndDupAckEpisodes;
  ULONG SumBytesReordered;
  ULONG NonRecovDa;
  ULONG NonRecovDaEpisodes;
  ULONG AckAfterFr;
  ULONG DsackDups;
  ULONG SampleRtt;
  ULONG SmoothedRtt;
  ULONG RttVar;
  ULONG MaxRtt;
  ULONG MinRtt;
  ULONG SumRtt;
  ULONG CountRtt;
  ULONG CurRto;
  ULONG MaxRto;
  ULONG MinRto;
  ULONG CurMss;
  ULONG MaxMss;
  ULONG MinMss;
  ULONG SpuriousRtoDetections;
} TCP_ESTATS_PATH_ROD_v0, *PTCP_ESTATS_PATH_ROD_v0;

typedef struct _TCP_ESTATS_PATH_RW_v0 {
  BOOLEAN EnableCollection;
} TCP_ESTATS_PATH_RW_v0, *PTCP_ESTATS_PATH_RW_v0;

typedef struct _TCP_ESTATS_REC_ROD_v0 {
  ULONG  CurRwinSent;
  ULONG  MaxRwinSent;
  ULONG  MinRwinSent;
  ULONG  LimRwin;
  ULONG  DupAckEpisodes;
  ULONG  DupAcksOut;
  ULONG  CeRcvd;
  ULONG  EcnSent;
  ULONG  EcnNoncesRcvd;
  ULONG  CurReasmQueue;
  ULONG  MaxReasmQueue;
  SIZE_T CurAppRQueue;
  SIZE_T MaxAppRQueue;
  UCHAR  WinScaleSent;
} TCP_ESTATS_REC_ROD_v0, *PTCP_ESTATS_REC_ROD_v0;

typedef struct _TCP_ESTATS_REC_RW_v0 {
  BOOLEAN EnableCollection;
} TCP_ESTATS_REC_RW_v0, *PTCP_ESTATS_REC_RW_v0;

typedef struct _TCP_ESTATS_SEND_BUFF_ROD_v0 {
  SIZE_T CurRetxQueue;
  SIZE_T MaxRetxQueue;
  SIZE_T CurAppWQueue;
  SIZE_T MaxAppWQueue;
} TCP_ESTATS_SEND_BUFF_ROD_v0, *PTCP_ESTATS_SEND_BUFF_ROD_v0;

typedef struct _TCP_ESTATS_SEND_BUFF_RW_v0 {
  BOOLEAN EnableCollection;
} TCP_ESTATS_SEND_BUFF_RW_v0, *PTCP_ESTATS_SEND_BUFF_RW_v0;

typedef struct _TCP_ESTATS_SND_CONG_ROD_v0 {
  ULONG  SndLimTransRwin;
  ULONG  SndLimTimeRwin;
  SIZE_T SndLimBytesRwin;
  ULONG  SndLimTransCwnd;
  ULONG  SndLimTimeCwnd;
  SIZE_T SndLimBytesCwnd;
  ULONG  SndLimTransSnd;
  ULONG  SndLimTimeSnd;
  SIZE_T SndLimBytesSnd;
  ULONG  SlowStart;
  ULONG  CongAvoid;
  ULONG  OtherReductions;
  ULONG  CurCwnd;
  ULONG  MaxSsCwnd;
  ULONG  MaxCaCwnd;
  ULONG  CurSsthresh;
  ULONG  MaxSsthresh;
  ULONG  MinSsthresh;
} TCP_ESTATS_SND_CONG_ROD_v0, *PTCP_ESTATS_SND_CONG_ROD_v0;

typedef struct _TCP_ESTATS_SND_CONG_ROS_v0 {
  ULONG LimCwnd;
} TCP_ESTATS_SND_CONG_ROS_v0, *PTCP_ESTATS_SND_CONG_ROS_v0;

typedef struct _TCP_ESTATS_SND_CONG_RW_v0 {
  BOOLEAN EnableCollection;
} TCP_ESTATS_SND_CONG_RW_v0, *PTCP_ESTATS_SND_CONG_RW_v0;

typedef struct _TCP_ESTATS_SYN_OPTS_ROS_v0 {
  BOOLEAN ActiveOpen;
  ULONG   MssRcvd;
  ULONG   MssSent;
} TCP_ESTATS_SYN_OPTS_ROS_v0, *PTCP_ESTATS_SYN_OPTS_ROS_v0;

typedef enum _TCP_ESTATS_TYPE {
  TcpConnectionEstatsSynOpts,
  TcpConnectionEstatsData,
  TcpConnectionEstatsSndCong,
  TcpConnectionEstatsPath,
  TcpConnectionEstatsSendBuff,
  TcpConnectionEstatsRec,
  TcpConnectionEstatsObsRec,
  TcpConnectionEstatsBandwidth,
  TcpConnectionEstatsFineRtt,
  TcpConnectionEstatsMaximum 
} TCP_ESTATS_TYPE;

#ifdef __cplusplus
}
#endif

#endif /*(_WIN32_WINNT >= 0x0600)*/

#endif /*_INC_TCPESTATS*/