/*++ 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_ */