Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
487 lines
16 KiB
C++
487 lines
16 KiB
C++
/*++
|
|
|
|
Copyright 1997 - 1998 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
qos.h - QoS definitions for NDIS components.
|
|
|
|
Abstract:
|
|
|
|
This module defines the Quality of Service structures and types used
|
|
by Winsock applications.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef __QOS_H_
|
|
#define __QOS_H_
|
|
|
|
|
|
/*
|
|
* Definitions for Service Type for each direction of data flow.
|
|
*/
|
|
typedef ULONG SERVICETYPE;
|
|
#define SERVICETYPE_NOTRAFFIC 0x00000000 /* No data in this
|
|
* direction */
|
|
#define SERVICETYPE_BESTEFFORT 0x00000001 /* Best Effort */
|
|
#define SERVICETYPE_CONTROLLEDLOAD 0x00000002 /* Controlled Load */
|
|
#define SERVICETYPE_GUARANTEED 0x00000003 /* Guaranteed */
|
|
#define SERVICETYPE_NETWORK_UNAVAILABLE 0x00000004 /* Used to notify
|
|
* change to user */
|
|
#define SERVICETYPE_GENERAL_INFORMATION 0x00000005 /* corresponds to
|
|
* "General Parameters"
|
|
* defined by IntServ */
|
|
#define SERVICETYPE_NOCHANGE 0x00000006 /* used to indicate
|
|
* that the flow spec
|
|
* contains no change
|
|
* from any previous
|
|
* one */
|
|
|
|
/*
|
|
* to turn on immediate traffic control, OR ( | ) this flag with the
|
|
* ServiceType field in the FLOWSPEC
|
|
*/
|
|
#define SERVICE_IMMEDIATE_TRAFFIC_CONTROL 0x80000000
|
|
|
|
/*
|
|
* this flag can be used with the immediate traffic control flag above to
|
|
* prevent any rsvp signaling messages from being sent. Local traffic
|
|
* control will be invoked, but no RSVP Path messages will be sent.This flag
|
|
* can also be used in conjunction with a receiving flowspec to suppress
|
|
* the automatic generation of a Reserve message. The application would
|
|
* receive notification that a Path message had arrived and would then need
|
|
* to alter the QOS by issuing WSAIoctl( SIO_SET_QOS ), to unset this flag
|
|
* and thereby cause Reserve messages to go out.
|
|
*/
|
|
#define SERVICE_NO_QOS_SIGNALING 0x40000000
|
|
|
|
/*
|
|
* Flow Specifications for each direction of data flow.
|
|
*/
|
|
typedef struct _flowspec
|
|
{
|
|
ULONG TokenRate; /* In Bytes/sec */
|
|
ULONG TokenBucketSize; /* In Bytes */
|
|
ULONG PeakBandwidth; /* In Bytes/sec */
|
|
ULONG Latency; /* In microseconds */
|
|
ULONG DelayVariation; /* In microseconds */
|
|
SERVICETYPE ServiceType;
|
|
ULONG MaxSduSize; /* In Bytes */
|
|
ULONG MinimumPolicedSize; /* In Bytes */
|
|
|
|
} FLOWSPEC, *PFLOWSPEC, * LPFLOWSPEC;
|
|
|
|
/*
|
|
* the provider specific structure can have a number of objects in it.
|
|
* Each next structure in the
|
|
* ProviderSpecific will be the QOS_OBJECT_HDR struct that prefaces the actual
|
|
* data with a type and length for that object. This QOS_OBJECT struct can
|
|
* repeat several times if there are several objects. This list of objects
|
|
* terminates either when the buffer length has been reached ( WSABUF ) or
|
|
* an object of type QOS_END_OF_LIST is encountered.
|
|
*/
|
|
|
|
/*
|
|
* define the type of objects that can go into the ProviderSpecific buffer
|
|
* in the QOS structure
|
|
*/
|
|
|
|
typedef struct {
|
|
|
|
ULONG ObjectType;
|
|
ULONG ObjectLength; /* the length of object buffer INCLUDING
|
|
* this header */
|
|
|
|
} QOS_OBJECT_HDR, *LPQOS_OBJECT_HDR;
|
|
|
|
/*
|
|
* Definition of object Types
|
|
*
|
|
*
|
|
* define the values for ObjectType above - RSVP Objects ids start at an
|
|
* offset from zero to allow for ATM objects that might be defined in the
|
|
* lower number range.
|
|
*/
|
|
#define RSVP_OBJECT_ID_BASE 1000
|
|
#define RSVP_OBJECT_STATUS_INFO (0x00000000 + RSVP_OBJECT_ID_BASE)
|
|
/* RSVP_STATUS_INFO structure passed */
|
|
#define RSVP_OBJECT_RESERVE_INFO (0x00000001 + RSVP_OBJECT_ID_BASE)
|
|
/* RSVP_RESERVE_INFO structure passed */
|
|
#define RSVP_OBJECT_ADSPEC (0x00000002 + RSVP_OBJECT_ID_BASE)
|
|
/* RSVP_ADSPEC structure passed */
|
|
|
|
/*
|
|
* general QOS objects start at this offset from the base and have a range
|
|
* of 1000
|
|
*/
|
|
#define QOS_GENERAL_ID_BASE 2000
|
|
#define QOS_OBJECT_PRIORITY (0x00000000 + QOS_GENERAL_ID_BASE)
|
|
/* QOS_PRIORITY structure passed */
|
|
#define QOS_OBJECT_END_OF_LIST (0x00000001 + QOS_GENERAL_ID_BASE)
|
|
/* QOS_End_of_list structure passed */
|
|
#define QOS_OBJECT_SD_MODE (0x00000002 + QOS_GENERAL_ID_BASE)
|
|
/* QOS_ShapeDiscard structure passed */
|
|
#define QOS_OBJECT_TRAFFIC_CLASS (0x00000003 + QOS_GENERAL_ID_BASE)
|
|
/* QOS_Traffic class structure passed */
|
|
|
|
/*
|
|
* this value can be used in the FLOWSPEC structure to instruct the Rsvp Service
|
|
* provider to derive the appropriate default value for the parameter. Note
|
|
* that not all values in the FLOWSPEC structure can be defaults. In the
|
|
* ReceivingFlowspec, all parameters can be defaulted except the ServiceType.
|
|
* In the SendingFlowspec, the MaxSduSize and MinimumPolicedSize can be
|
|
* defaulted. Other defaults may be possible. Refer to the appropriate
|
|
* documentation.
|
|
*/
|
|
#define QOS_NOT_SPECIFIED 0xFFFFFFFF
|
|
|
|
/*
|
|
* define a value that can be used for the PeakBandwidth, which will map into
|
|
* positive infinity when the FLOWSPEC is converted into IntServ floating point
|
|
* format. We can't use (-1) because that value was previously defined to mean
|
|
* "select the default".
|
|
*/
|
|
#define POSITIVE_INFINITY_RATE 0xFFFFFFFE
|
|
|
|
/*
|
|
* IPV6 addressing for RSVP FILTERSPECS
|
|
*/
|
|
typedef union _IN_ADDR_IPV4 {
|
|
|
|
ULONG Addr;
|
|
UCHAR AddrBytes[4];
|
|
|
|
} IN_ADDR_IPV4, *LPIN_ADDR_IPV4;
|
|
|
|
/*
|
|
* IPV6 addressing for RSVP FILTERSPECS
|
|
*/
|
|
typedef struct _IN_ADDR_IPV6 {
|
|
|
|
UCHAR Addr[16]; //IPV6 address
|
|
|
|
} IN_ADDR_IPV6, *LPIN_ADDR_IPV6;
|
|
|
|
typedef const IN_ADDR_IPV6 *LPCIN_ADDR_IPV6;
|
|
|
|
/*
|
|
* IPV4 addressing for RSVP FILTERSPECS
|
|
*/
|
|
typedef struct _RSVP_FILTERSPEC_V4 {
|
|
|
|
IN_ADDR_IPV4 Address;
|
|
USHORT Unused;
|
|
USHORT Port;
|
|
|
|
} RSVP_FILTERSPEC_V4, *LPRSVP_FILTERSPEC_V4;
|
|
|
|
typedef struct _RSVP_FILTERSPEC_V6 {
|
|
|
|
IN_ADDR_IPV6 Address;
|
|
USHORT UnUsed;
|
|
USHORT Port;
|
|
|
|
} RSVP_FILTERSPEC_V6, *LPRSVP_FILTERSPEC_V6;
|
|
|
|
|
|
typedef struct _RSVP_FILTERSPEC_V6_FLOW {
|
|
|
|
IN_ADDR_IPV6 Address;
|
|
UCHAR UnUsed;
|
|
UCHAR FlowLabel[3];
|
|
|
|
} RSVP_FILTERSPEC_V6_FLOW, *LPRSVP_FILTERSPEC_V6_FLOW;
|
|
|
|
typedef struct _RSVP_FILTERSPEC_V4_GPI {
|
|
|
|
IN_ADDR_IPV4 Address;
|
|
ULONG GeneralPortId;
|
|
|
|
} RSVP_FILTERSPEC_V4_GPI, *LPRSVP_FILTERSPEC_V4_GPI;
|
|
|
|
typedef struct _RSVP_FILTERSPEC_V6_GPI {
|
|
|
|
IN_ADDR_IPV6 Address;
|
|
ULONG GeneralPortId;
|
|
|
|
} RSVP_FILTERSPEC_V6_GPI, *LPRSVP_FILTERSPEC_V6_GPI;
|
|
|
|
|
|
/*
|
|
* FILTERSPEC TYPES used in making reservations.
|
|
*/
|
|
typedef enum {
|
|
|
|
FILTERSPECV4 = 1,
|
|
FILTERSPECV6,
|
|
FILTERSPECV6_FLOW,
|
|
FILTERSPECV4_GPI,
|
|
FILTERSPECV6_GPI,
|
|
FILTERSPEC_END
|
|
|
|
} FilterType;
|
|
|
|
typedef struct _RSVP_FILTERSPEC {
|
|
|
|
FilterType Type;
|
|
|
|
union {
|
|
RSVP_FILTERSPEC_V4 FilterSpecV4;
|
|
RSVP_FILTERSPEC_V6 FilterSpecV6;
|
|
RSVP_FILTERSPEC_V6_FLOW FilterSpecV6Flow;
|
|
RSVP_FILTERSPEC_V4_GPI FilterSpecV4Gpi;
|
|
RSVP_FILTERSPEC_V6_GPI FilterSpecV6Gpi;
|
|
};
|
|
|
|
} RSVP_FILTERSPEC, *LPRSVP_FILTERSPEC;
|
|
|
|
/*
|
|
* FLOWDESCRIPTOR Structure used for specifying one or more
|
|
* Filters per Flowspec.
|
|
*/
|
|
typedef struct _FLOWDESCRIPTOR {
|
|
|
|
FLOWSPEC FlowSpec;
|
|
ULONG NumFilters;
|
|
LPRSVP_FILTERSPEC FilterList;
|
|
|
|
} FLOWDESCRIPTOR, *LPFLOWDESCRIPTOR;
|
|
|
|
/*
|
|
* RSVP_POLICY contains undefined policy data. RSVP transports this
|
|
* data on behalf of the Policy Control component.
|
|
*/
|
|
typedef struct _RSVP_POLICY {
|
|
|
|
HANDLE Type; /* Pointer to structure: TBD */
|
|
|
|
} RSVP_POLICY, *LPRSVP_POLICY;
|
|
|
|
typedef const RSVP_POLICY *LPCRSVP_POLICY;
|
|
|
|
|
|
/*
|
|
* RSVP_RESERVE_INFO Structure used for storing RSVP specific
|
|
* information for fine tuning interaction via the Winsock2
|
|
* Generic QoS API via the provider specific buffer. This structure
|
|
* includes the QOS_OBJECT_HDR structure directly
|
|
*/
|
|
|
|
typedef struct _RSVP_RESERVE_INFO {
|
|
|
|
QOS_OBJECT_HDR ObjectHdr; /* type and length of this object */
|
|
ULONG Style; /* RSVP Style (FF,WF,SE) */
|
|
ULONG ConfirmRequest; /* Non Zero for Confirm Request */
|
|
LPRSVP_POLICY Policy; /* Optional policy data */
|
|
ULONG NumFlowDesc; /* Number of FlowDesc */
|
|
LPFLOWDESCRIPTOR FlowDescList; /* FlowDesc list */
|
|
|
|
} RSVP_RESERVE_INFO, *LPRSVP_RESERVE_INFO;
|
|
|
|
typedef const RSVP_RESERVE_INFO *LPCRSVP_RESERVE_INFO;
|
|
|
|
/*
|
|
* definitions for the ulStyle in the previous structure
|
|
*/
|
|
#define RSVP_WILDCARD_STYLE 0x00000001
|
|
#define RSVP_FIXED_FILTER_STYLE 0x00000002
|
|
#define RSVP_SHARED_EXPLICIT_STYLE 0x00000003
|
|
|
|
/*
|
|
* RSVP_STATUS_INFO Structure used for storing RSVP specific
|
|
* error of status indications. This also serves as a header
|
|
* for additional objects in the provider specific buffer when
|
|
* interacting via Winsock2 Generic QoS API. This structure includes
|
|
* the QOS_OBJECT_COUNT and QOS_OBJECT_HDR structures directly It is
|
|
* expected to be the first structure in the provider specific structure
|
|
* since it includes the QOS_OBJECT_COUNT
|
|
*/
|
|
|
|
typedef struct _RSVP_STATUS_INFO {
|
|
|
|
QOS_OBJECT_HDR ObjectHdr; /* Object Hdr */
|
|
ULONG StatusCode; /* Error or Status Information see
|
|
* Winsock2.h */
|
|
ULONG ExtendedStatus1;/* Provider specific status extension */
|
|
ULONG ExtendedStatus2;/* Provider specific status extension */
|
|
|
|
} RSVP_STATUS_INFO, *LPRSVP_STATUS_INFO;
|
|
|
|
typedef const RSVP_STATUS_INFO *LPCRSVP_STATUS_INFO;
|
|
|
|
/*
|
|
* This structure defines the absolute priorty of the flow. Priorities in the
|
|
* range of 0-7 are currently defined. Receive Priority is not currently used,
|
|
* but may at some point in the future.
|
|
*/
|
|
typedef struct _QOS_PRIORITY {
|
|
|
|
QOS_OBJECT_HDR ObjectHdr;
|
|
UCHAR SendPriority; /* this gets mapped to layer 2 priority.*/
|
|
UCHAR SendFlags; /* there are none currently defined.*/
|
|
UCHAR ReceivePriority; /* this could be used to decide who
|
|
* gets forwarded up the stack first
|
|
* - not used now */
|
|
UCHAR Unused;
|
|
|
|
} QOS_PRIORITY, *LPQOS_PRIORITY;
|
|
|
|
|
|
/*
|
|
* This structure is used to define the behaviour that the traffic
|
|
* control packet shaper will apply to the flow.
|
|
*
|
|
* PS_NONCONF_BORROW - the flow will receive resources remaining
|
|
* after all higher priority flows have been serviced. If a
|
|
* TokenRate is specified, packets may be non-conforming and
|
|
* will be demoted to less than best-effort priority.
|
|
*
|
|
* PS_NONCONF_SHAPE - TokenRate must be specified. Non-conforming
|
|
* packets will be retianed in the packet shaper until they become
|
|
* conforming.
|
|
*
|
|
* PS_NONCONF_DISCARD - TokenRate must be specified. Non-conforming
|
|
* packets will be discarded.
|
|
*
|
|
*/
|
|
|
|
|
|
typedef struct _QOS_SD_MODE {
|
|
|
|
QOS_OBJECT_HDR ObjectHdr;
|
|
ULONG ShapeDiscardMode;
|
|
|
|
} QOS_SD_MODE, *LPQOS_SD_MODE;
|
|
|
|
#define TC_NONCONF_BORROW 0
|
|
#define TC_NONCONF_SHAPE 1
|
|
#define TC_NONCONF_DISCARD 2
|
|
|
|
/*
|
|
* This structure may carry an 802.1 TrafficClass parameter which
|
|
* has been provided to the host by a layer 2 network, for example,
|
|
* in an 802.1 extended RSVP RESV message. If this object is obtained
|
|
* from the network, hosts will stamp the MAC headers of corresponding
|
|
* transmitted packets, with the value in the object. Otherwise, hosts
|
|
* may select a value based on the standard Intserv mapping of
|
|
* ServiceType to 802.1 TrafficClass.
|
|
*
|
|
*/
|
|
|
|
typedef struct _QOS_TRAFFIC_CLASS {
|
|
|
|
QOS_OBJECT_HDR ObjectHdr;
|
|
ULONG TrafficClass;
|
|
|
|
} QOS_TRAFFIC_CLASS, *LPQOS_TRAFFIC_CLASS;
|
|
|
|
/*
|
|
* this structure defines the "General Characterization Parameters" contained in
|
|
* the RSVP Adspec object
|
|
*/
|
|
typedef struct _AD_GENERAL_PARAMS{
|
|
|
|
ULONG IntServAwareHopCount; /* number of hops that conform to
|
|
* Integrated Services requirements */
|
|
ULONG PathBandwidthEstimate; /* minimum bandwidth available from
|
|
* sender to receiver */
|
|
ULONG MinimumLatency; /* sum of minimum latency of the packet
|
|
* forwarding process in routers
|
|
* (in usec)*/
|
|
ULONG PathMTU; /* max transmission unit end to end that
|
|
* will not incur fragmentation */
|
|
ULONG Flags; /* used to hold break bits.*/
|
|
|
|
} AD_GENERAL_PARAMS, *LPAD_GENERAL_PARAMS;
|
|
|
|
/*
|
|
* Minimum Latency may be set to this "undefined" value
|
|
*/
|
|
#define INDETERMINATE_LATENCY 0xFFFFFFFF;
|
|
|
|
/*
|
|
* This Flag is used to indicate the existence of a network element not
|
|
* supporting QoS control services somewhere in the data path. If this bit
|
|
* is set in the specific service override then it indicates that that
|
|
* service was not supported at at least one hop.
|
|
*/
|
|
#define AD_FLAG_BREAK_BIT 0x00000001
|
|
|
|
/*
|
|
* this structure describes the Guaranteed service parameters
|
|
*/
|
|
typedef struct _AD_GUARANTEED {
|
|
|
|
ULONG CTotal;
|
|
ULONG DTotal;
|
|
ULONG CSum;
|
|
ULONG DSum;
|
|
|
|
} AD_GUARANTEED, *LPAD_GUARANTEED;
|
|
|
|
/*
|
|
* this structure describes the format of the parameter buffer that can be
|
|
* included in the Service_Type structure below. This structure allows an
|
|
* application to include any valid Int Serv service parameter in the Buffer
|
|
* value, after providing the Int Serv parameter id in the ParameterId field.
|
|
*/
|
|
typedef struct _PARAM_BUFFER {
|
|
|
|
ULONG ParameterId; /* Int Server parameter ID */
|
|
ULONG Length; /* total length of this structure
|
|
* ( 8 bytes + length of Buffer ) */
|
|
UCHAR Buffer[1]; /* Paramter itself */
|
|
|
|
} PARAM_BUFFER, *LPPARAM_BUFFER;
|
|
|
|
/*
|
|
* this structure contains the service types supported
|
|
*/
|
|
typedef struct _CONTROL_SERVICE {
|
|
|
|
/*
|
|
* the length of this entire structure including the following buffer.
|
|
* This length value can be added to the ptr to the structure to get the ptr
|
|
* to the next SERVICE_TYPE structure in the list, until the
|
|
* NumberOfServices count has been exhausted.
|
|
*/
|
|
ULONG Length;
|
|
|
|
SERVICETYPE Service;
|
|
AD_GENERAL_PARAMS Overrides;
|
|
|
|
/*
|
|
* service specific information ( controlled load has no service specific
|
|
* info here )
|
|
*/
|
|
union {
|
|
AD_GUARANTEED Guaranteed;
|
|
PARAM_BUFFER ParamBuffer[1]; /* allows for other services down
|
|
* the road */
|
|
};
|
|
|
|
} CONTROL_SERVICE, *LPCONTROL_SERVICE;
|
|
|
|
/*
|
|
* This structure defines the information which is carried in the Rsvp
|
|
* Adspec. This Rsvp object typically indicates which service types are
|
|
* available ( Controlled Load and/or Guaranteed Service ), if a non-Rsvp
|
|
* hop has been encountered by the Path message, and the minumum MTU along
|
|
* the path. The services array indicates which services are supported
|
|
*/
|
|
typedef struct _RSVP_ADSPEC {
|
|
|
|
QOS_OBJECT_HDR ObjectHdr;
|
|
AD_GENERAL_PARAMS GeneralParams; /* contains the general
|
|
* characterization paramters */
|
|
ULONG NumberOfServices; /* count of the number of services */
|
|
CONTROL_SERVICE Services[1]; /* a list of the services
|
|
* supported/requested */
|
|
|
|
} RSVP_ADSPEC, *LPRSVP_ADSPEC;
|
|
|
|
|
|
#endif /* __QOS_H_ */
|