#pragma once

#ifdef __cplusplus
extern "C" {
#endif

typedef ULONG SERVICETYPE;

#define SERVICETYPE_NOTRAFFIC               0x00000000
#define SERVICETYPE_BESTEFFORT              0x00000001
#define SERVICETYPE_CONTROLLEDLOAD          0x00000002
#define SERVICETYPE_GUARANTEED              0x00000003
#define SERVICETYPE_NETWORK_UNAVAILABLE     0x00000004
#define SERVICETYPE_GENERAL_INFORMATION     0x00000005
#define SERVICETYPE_NOCHANGE                0x00000006
#define SERVICETYPE_NONCONFORMING           0x00000009
#define SERVICETYPE_NETWORK_CONTROL         0x0000000A
#define SERVICETYPE_QUALITATIVE             0x0000000D

#define SERVICE_BESTEFFORT                  0x80010000
#define SERVICE_CONTROLLEDLOAD              0x80020000
#define SERVICE_GUARANTEED                  0x80040000
#define SERVICE_QUALITATIVE                 0x80200000

#define SERVICE_NO_TRAFFIC_CONTROL          0x81000000

#define SERVICE_NO_QOS_SIGNALING            0x40000000

#define QOS_NOT_SPECIFIED                   0xFFFFFFFF

#define POSITIVE_INFINITY_RATE              0xFFFFFFFE

#define QOS_GENERAL_ID_BASE                 2000

#define QOS_OBJECT_END_OF_LIST              (0x00000001 + QOS_GENERAL_ID_BASE) 
#define   QOS_OBJECT_SD_MODE                (0x00000002 + QOS_GENERAL_ID_BASE) 
#define   QOS_OBJECT_SHAPING_RATE           (0x00000003 + QOS_GENERAL_ID_BASE)
#define   QOS_OBJECT_DESTADDR               (0x00000004 + QOS_GENERAL_ID_BASE)

#define TC_NONCONF_BORROW                   0
#define TC_NONCONF_SHAPE                    1
#define TC_NONCONF_DISCARD                  2
#define TC_NONCONF_BORROW_PLUS              3

typedef struct _flowspec {
  ULONG TokenRate;
  ULONG TokenBucketSize;
  ULONG PeakBandwidth;
  ULONG Latency;
  ULONG DelayVariation;
  SERVICETYPE ServiceType;
  ULONG MaxSduSize;
  ULONG MinimumPolicedSize;
} FLOWSPEC, *PFLOWSPEC, *LPFLOWSPEC;

typedef struct _QOS_OBJECT_HDR {
  ULONG ObjectType;
  ULONG ObjectLength;
} QOS_OBJECT_HDR, *LPQOS_OBJECT_HDR;

typedef struct _QOS_SD_MODE {
  QOS_OBJECT_HDR ObjectHdr;
  ULONG ShapeDiscardMode;
} QOS_SD_MODE, *LPQOS_SD_MODE;

typedef struct _QOS_SHAPING_RATE {
  QOS_OBJECT_HDR ObjectHdr;
  ULONG ShapingRate;
} QOS_SHAPING_RATE, *LPQOS_SHAPING_RATE;

#ifdef __cplusplus
}
#endif