home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / include / qos.h < prev    next >
C/C++ Source or Header  |  1998-04-25  |  17KB  |  487 lines

  1. /*++
  2.  
  3. Copyright 1997 - 1998 Microsoft Corporation
  4.  
  5. Module Name:
  6.  
  7.     qos.h - QoS definitions for NDIS components.
  8.  
  9. Abstract:
  10.  
  11.     This module defines the Quality of Service structures and types used
  12.     by Winsock applications.
  13.  
  14. Revision History:
  15.  
  16. --*/
  17.  
  18. #ifndef __QOS_H_
  19. #define __QOS_H_
  20.  
  21.  
  22. /*
  23.  *  Definitions for Service Type for each direction of data flow.
  24.  */
  25. typedef ULONG   SERVICETYPE;
  26. #define SERVICETYPE_NOTRAFFIC               0x00000000  /* No data in this
  27.                                                          * direction */
  28. #define SERVICETYPE_BESTEFFORT              0x00000001  /* Best Effort */
  29. #define SERVICETYPE_CONTROLLEDLOAD          0x00000002  /* Controlled Load */
  30. #define SERVICETYPE_GUARANTEED              0x00000003  /* Guaranteed */
  31. #define SERVICETYPE_NETWORK_UNAVAILABLE     0x00000004  /* Used to notify 
  32.                                                          * change to user */
  33. #define SERVICETYPE_GENERAL_INFORMATION     0x00000005  /* corresponds to 
  34.                                                          * "General Parameters"
  35.                                                          * defined by IntServ */
  36. #define SERVICETYPE_NOCHANGE                0x00000006  /* used to indicate
  37.                                                          * that the flow spec
  38.                                                          * contains no change
  39.                                                          * from any previous
  40.                                                          * one */
  41.  
  42. /*
  43.  * to turn on immediate traffic control, OR ( | ) this flag with the 
  44.  * ServiceType field in the FLOWSPEC
  45.  */
  46. #define SERVICE_IMMEDIATE_TRAFFIC_CONTROL   0x80000000
  47.  
  48. /*
  49.  * this flag can be used with the immediate traffic control flag above to
  50.  * prevent any rsvp signaling messages from being sent. Local traffic 
  51.  * control will be invoked, but no RSVP Path messages will be sent.This flag
  52.  * can also be used in conjunction with a receiving flowspec to suppress 
  53.  * the automatic generation of a Reserve message.  The application would 
  54.  * receive notification that a Path  message had arrived and would then need
  55.  * to alter the QOS by issuing WSAIoctl( SIO_SET_QOS ), to unset this flag 
  56.  * and thereby cause Reserve messages to go out.
  57.  */
  58. #define SERVICE_NO_QOS_SIGNALING   0x40000000
  59.  
  60. /*
  61.  *  Flow Specifications for each direction of data flow.
  62.  */
  63. typedef struct _flowspec
  64. {
  65.     ULONG       TokenRate;              /* In Bytes/sec */
  66.     ULONG       TokenBucketSize;        /* In Bytes */
  67.     ULONG       PeakBandwidth;          /* In Bytes/sec */
  68.     ULONG       Latency;                /* In microseconds */
  69.     ULONG       DelayVariation;         /* In microseconds */
  70.     SERVICETYPE ServiceType;
  71.     ULONG       MaxSduSize;             /* In Bytes */
  72.     ULONG       MinimumPolicedSize;     /* In Bytes */
  73.  
  74. } FLOWSPEC, *PFLOWSPEC, * LPFLOWSPEC;
  75.  
  76. /*
  77.  * the provider specific structure can have a number of objects in it.
  78.  * Each next structure in the
  79.  * ProviderSpecific will be the QOS_OBJECT_HDR struct that prefaces the actual
  80.  * data with a type and length for that object.  This QOS_OBJECT struct can 
  81.  * repeat several times if there are several objects.  This list of objects
  82.  * terminates either when the buffer length has been reached ( WSABUF ) or
  83.  * an object of type QOS_END_OF_LIST is encountered.
  84.  */
  85.  
  86. /*
  87.  * define the type of objects that can go into the ProviderSpecific buffer 
  88.  * in the QOS structure
  89.  */
  90.  
  91. typedef struct  {
  92.  
  93.     ULONG   ObjectType;
  94.     ULONG   ObjectLength;  /* the length of object buffer INCLUDING 
  95.                             * this header */
  96.  
  97. } QOS_OBJECT_HDR, *LPQOS_OBJECT_HDR;
  98.  
  99. /*
  100.  * Definition of object Types
  101.  *
  102.  *
  103.  * define the values for ObjectType above - RSVP Objects ids start at an 
  104.  * offset from zero to allow for ATM objects that might be defined in the 
  105.  * lower number range.
  106.  */
  107. #define   RSVP_OBJECT_ID_BASE         1000
  108. #define   RSVP_OBJECT_STATUS_INFO     (0x00000000 + RSVP_OBJECT_ID_BASE)
  109.           /* RSVP_STATUS_INFO structure passed */
  110. #define   RSVP_OBJECT_RESERVE_INFO    (0x00000001 + RSVP_OBJECT_ID_BASE)
  111.           /* RSVP_RESERVE_INFO structure passed */
  112. #define   RSVP_OBJECT_ADSPEC          (0x00000002 + RSVP_OBJECT_ID_BASE)
  113.           /* RSVP_ADSPEC structure passed */
  114.  
  115. /*
  116.  * general QOS objects start at this offset from the base and have a range 
  117.  * of 1000
  118.  */
  119. #define   QOS_GENERAL_ID_BASE         2000
  120. #define   QOS_OBJECT_PRIORITY         (0x00000000 + QOS_GENERAL_ID_BASE)
  121.           /* QOS_PRIORITY structure passed */
  122. #define   QOS_OBJECT_END_OF_LIST      (0x00000001 + QOS_GENERAL_ID_BASE) 
  123.           /* QOS_End_of_list structure passed */
  124. #define   QOS_OBJECT_SD_MODE          (0x00000002 + QOS_GENERAL_ID_BASE) 
  125.           /* QOS_ShapeDiscard structure passed */
  126. #define   QOS_OBJECT_TRAFFIC_CLASS    (0x00000003 + QOS_GENERAL_ID_BASE) 
  127.           /* QOS_Traffic class structure passed */
  128.  
  129. /*
  130.  * this value can be used in the FLOWSPEC structure to instruct the Rsvp Service 
  131.  * provider to derive the appropriate default value for the parameter.  Note 
  132.  * that not all values in the FLOWSPEC structure can be defaults. In the
  133.  * ReceivingFlowspec, all parameters can be defaulted except the ServiceType.  
  134.  * In the SendingFlowspec, the MaxSduSize and MinimumPolicedSize can be
  135.  * defaulted. Other defaults may be possible. Refer to the appropriate
  136.  * documentation.
  137.  */
  138. #define QOS_NOT_SPECIFIED     0xFFFFFFFF
  139.  
  140. /*
  141.  * define a value that can be used for the PeakBandwidth, which will map into 
  142.  * positive infinity when the FLOWSPEC is converted into IntServ floating point 
  143.  * format.  We can't use (-1) because that value was previously defined to mean
  144.  * "select the default".
  145.  */
  146. #define   POSITIVE_INFINITY_RATE     0xFFFFFFFE
  147.  
  148. /* 
  149.  * IPV6 addressing for RSVP FILTERSPECS
  150.  */
  151. typedef union _IN_ADDR_IPV4 {
  152.  
  153.     ULONG  Addr;
  154.     UCHAR  AddrBytes[4];
  155.  
  156. } IN_ADDR_IPV4, *LPIN_ADDR_IPV4;
  157.  
  158. /*
  159.  * IPV6 addressing for RSVP FILTERSPECS
  160.  */
  161. typedef struct _IN_ADDR_IPV6 {
  162.  
  163.     UCHAR  Addr[16];               //IPV6 address
  164.  
  165. } IN_ADDR_IPV6, *LPIN_ADDR_IPV6;
  166.  
  167. typedef const IN_ADDR_IPV6  *LPCIN_ADDR_IPV6;
  168.  
  169. /*
  170.  * IPV4 addressing for RSVP FILTERSPECS
  171.  */
  172. typedef struct _RSVP_FILTERSPEC_V4 {
  173.  
  174.     IN_ADDR_IPV4    Address;
  175.     USHORT          Unused;
  176.     USHORT          Port;
  177.  
  178. } RSVP_FILTERSPEC_V4, *LPRSVP_FILTERSPEC_V4;
  179.  
  180. typedef struct _RSVP_FILTERSPEC_V6 {
  181.  
  182.     IN_ADDR_IPV6    Address;
  183.     USHORT          UnUsed;
  184.     USHORT          Port;
  185.  
  186. } RSVP_FILTERSPEC_V6, *LPRSVP_FILTERSPEC_V6;
  187.  
  188.  
  189. typedef struct _RSVP_FILTERSPEC_V6_FLOW {
  190.  
  191.     IN_ADDR_IPV6    Address;
  192.     UCHAR           UnUsed;
  193.     UCHAR           FlowLabel[3];
  194.  
  195. } RSVP_FILTERSPEC_V6_FLOW, *LPRSVP_FILTERSPEC_V6_FLOW;
  196.  
  197. typedef struct _RSVP_FILTERSPEC_V4_GPI {
  198.  
  199.     IN_ADDR_IPV4    Address;
  200.     ULONG           GeneralPortId;
  201.  
  202. } RSVP_FILTERSPEC_V4_GPI, *LPRSVP_FILTERSPEC_V4_GPI;
  203.  
  204. typedef struct _RSVP_FILTERSPEC_V6_GPI {
  205.  
  206.     IN_ADDR_IPV6    Address;
  207.     ULONG           GeneralPortId;
  208.  
  209. } RSVP_FILTERSPEC_V6_GPI, *LPRSVP_FILTERSPEC_V6_GPI;
  210.  
  211.  
  212. /*
  213.  * FILTERSPEC TYPES used in making reservations.
  214.  */
  215. typedef enum {
  216.  
  217.         FILTERSPECV4 = 1,
  218.         FILTERSPECV6,
  219.         FILTERSPECV6_FLOW,
  220.         FILTERSPECV4_GPI,
  221.         FILTERSPECV6_GPI,
  222.         FILTERSPEC_END
  223.  
  224. } FilterType;
  225.  
  226. typedef struct _RSVP_FILTERSPEC {
  227.  
  228.     FilterType   Type;
  229.  
  230.     union {
  231.         RSVP_FILTERSPEC_V4      FilterSpecV4;
  232.         RSVP_FILTERSPEC_V6      FilterSpecV6;
  233.         RSVP_FILTERSPEC_V6_FLOW FilterSpecV6Flow;
  234.         RSVP_FILTERSPEC_V4_GPI  FilterSpecV4Gpi;
  235.         RSVP_FILTERSPEC_V6_GPI  FilterSpecV6Gpi;
  236.     };
  237.  
  238. } RSVP_FILTERSPEC, *LPRSVP_FILTERSPEC;
  239.  
  240. /*
  241.  * FLOWDESCRIPTOR Structure used for specifying one or more
  242.  * Filters per Flowspec.
  243.  */
  244. typedef struct _FLOWDESCRIPTOR {
  245.  
  246.     FLOWSPEC            FlowSpec;
  247.     ULONG               NumFilters;
  248.     LPRSVP_FILTERSPEC   FilterList;
  249.  
  250. } FLOWDESCRIPTOR, *LPFLOWDESCRIPTOR;
  251.  
  252. /*
  253.  * RSVP_POLICY contains undefined policy data.  RSVP transports this
  254.  * data on behalf of the Policy Control component.
  255.  */
  256. typedef struct _RSVP_POLICY {
  257.  
  258.     HANDLE       Type;              /* Pointer to structure: TBD */
  259.  
  260. } RSVP_POLICY, *LPRSVP_POLICY;
  261.  
  262. typedef const RSVP_POLICY *LPCRSVP_POLICY;
  263.  
  264.  
  265. /*
  266.  * RSVP_RESERVE_INFO Structure used for storing RSVP specific
  267.  * information for fine tuning interaction via the Winsock2
  268.  * Generic QoS API via the provider specific buffer. This structure
  269.  * includes the QOS_OBJECT_HDR structure directly
  270.  */
  271.  
  272. typedef struct _RSVP_RESERVE_INFO {
  273.  
  274.     QOS_OBJECT_HDR      ObjectHdr;            /* type and length of this object */
  275.     ULONG               Style;                /* RSVP Style (FF,WF,SE) */
  276.     ULONG               ConfirmRequest;       /* Non Zero for Confirm Request */
  277.     LPRSVP_POLICY       Policy;               /* Optional policy data */
  278.     ULONG               NumFlowDesc;          /* Number of FlowDesc */
  279.     LPFLOWDESCRIPTOR    FlowDescList;         /* FlowDesc list */
  280.  
  281. } RSVP_RESERVE_INFO, *LPRSVP_RESERVE_INFO;
  282.  
  283. typedef const RSVP_RESERVE_INFO *LPCRSVP_RESERVE_INFO;
  284.  
  285. /*
  286.  * definitions for the ulStyle in the previous structure
  287.  */
  288. #define RSVP_WILDCARD_STYLE           0x00000001
  289. #define RSVP_FIXED_FILTER_STYLE       0x00000002
  290. #define RSVP_SHARED_EXPLICIT_STYLE    0x00000003
  291.  
  292. /*
  293.  * RSVP_STATUS_INFO Structure used for storing RSVP specific
  294.  * error of status indications.  This also serves as a header
  295.  * for additional objects in the provider specific buffer when
  296.  * interacting via Winsock2 Generic QoS API. This structure includes
  297.  * the QOS_OBJECT_COUNT and QOS_OBJECT_HDR structures directly It is
  298.  * expected to be the first structure in the provider specific structure
  299.  * since it includes the QOS_OBJECT_COUNT
  300.  */
  301.  
  302. typedef struct _RSVP_STATUS_INFO {
  303.  
  304.     QOS_OBJECT_HDR      ObjectHdr;      /* Object Hdr */
  305.     ULONG               StatusCode;     /* Error or Status Information see 
  306.                                          * Winsock2.h */
  307.     ULONG               ExtendedStatus1;/* Provider specific status extension */
  308.     ULONG               ExtendedStatus2;/* Provider specific status extension */
  309.  
  310. } RSVP_STATUS_INFO, *LPRSVP_STATUS_INFO;
  311.  
  312. typedef const RSVP_STATUS_INFO *LPCRSVP_STATUS_INFO;
  313.  
  314. /*
  315.  * This structure defines the absolute priorty of the flow.  Priorities in the 
  316.  * range of 0-7 are currently defined. Receive Priority is not currently used, 
  317.  * but may at some point in the future.
  318.  */
  319. typedef struct _QOS_PRIORITY {
  320.  
  321.     QOS_OBJECT_HDR  ObjectHdr;
  322.     UCHAR           SendPriority;     /* this gets mapped to layer 2 priority.*/
  323.     UCHAR           SendFlags;        /* there are none currently defined.*/
  324.     UCHAR           ReceivePriority;  /* this could be used to decide who 
  325.                                        * gets forwarded up the stack first 
  326.                                        * - not used now */
  327.     UCHAR           Unused;
  328.  
  329. } QOS_PRIORITY, *LPQOS_PRIORITY;
  330.  
  331.  
  332. /*
  333.  * This structure is used to define the behaviour that the traffic
  334.  * control packet shaper will apply to the flow.
  335.  *
  336.  * PS_NONCONF_BORROW - the flow will receive resources remaining 
  337.  *  after all higher priority flows have been serviced. If a 
  338.  *  TokenRate is specified, packets may be non-conforming and
  339.  *  will be demoted to less than best-effort priority.
  340.  *  
  341.  * PS_NONCONF_SHAPE - TokenRate must be specified. Non-conforming
  342.  *  packets will be retianed in the packet shaper until they become
  343.  *  conforming.
  344.  *
  345.  * PS_NONCONF_DISCARD - TokenRate must be specified. Non-conforming
  346.  *  packets will be discarded.
  347.  *
  348.  */
  349.  
  350.  
  351. typedef struct _QOS_SD_MODE {
  352.  
  353.     QOS_OBJECT_HDR ObjectHdr;
  354.     ULONG   ShapeDiscardMode;
  355.  
  356. } QOS_SD_MODE, *LPQOS_SD_MODE;
  357.  
  358. #define TC_NONCONF_BORROW   0
  359. #define TC_NONCONF_SHAPE    1
  360. #define TC_NONCONF_DISCARD  2
  361.  
  362. /*
  363.  * This structure may carry an 802.1 TrafficClass parameter which 
  364.  * has been provided to the host by a layer 2 network, for example, 
  365.  * in an 802.1 extended RSVP RESV message. If this object is obtained
  366.  * from the network, hosts will stamp the MAC headers of corresponding
  367.  * transmitted packets, with the value in the object. Otherwise, hosts
  368.  * may select a value based on the standard Intserv mapping of 
  369.  * ServiceType to 802.1 TrafficClass.
  370.  *
  371.  */
  372.  
  373. typedef struct _QOS_TRAFFIC_CLASS {
  374.  
  375.     QOS_OBJECT_HDR ObjectHdr;
  376.     ULONG   TrafficClass;
  377.  
  378. } QOS_TRAFFIC_CLASS, *LPQOS_TRAFFIC_CLASS;
  379.  
  380. /*
  381.  * this structure defines the "General Characterization Parameters" contained in
  382.  * the RSVP Adspec object
  383.  */
  384. typedef struct _AD_GENERAL_PARAMS{
  385.  
  386.     ULONG       IntServAwareHopCount;   /* number of hops that conform to
  387.                                          * Integrated Services requirements */
  388.     ULONG       PathBandwidthEstimate;  /* minimum bandwidth available from 
  389.                                          * sender to receiver */
  390.     ULONG       MinimumLatency;         /* sum of minimum latency of the packet
  391.                                          * forwarding process in routers 
  392.                                          * (in usec)*/
  393.     ULONG       PathMTU;                /* max transmission unit end to end that
  394.                                          * will not incur fragmentation */
  395.     ULONG       Flags;                  /* used to hold break bits.*/
  396.  
  397. } AD_GENERAL_PARAMS, *LPAD_GENERAL_PARAMS;
  398.  
  399. /*
  400.  * Minimum Latency may be set to this "undefined" value
  401.  */
  402. #define INDETERMINATE_LATENCY   0xFFFFFFFF;
  403.  
  404. /*
  405.  * This Flag is used to indicate the existence of a network element not 
  406.  * supporting  QoS control services somewhere in the data path. If this bit 
  407.  * is set in the specific service override then it indicates that that
  408.  * service was not supported at at least one hop.
  409.  */
  410. #define AD_FLAG_BREAK_BIT    0x00000001
  411.  
  412. /*
  413.  * this structure describes the Guaranteed service parameters
  414.  */
  415. typedef struct _AD_GUARANTEED {
  416.  
  417.     ULONG       CTotal;
  418.     ULONG       DTotal;
  419.     ULONG       CSum;
  420.     ULONG       DSum;
  421.  
  422. } AD_GUARANTEED, *LPAD_GUARANTEED;
  423.  
  424. /*
  425.  * this structure describes the format of the parameter buffer that can be
  426.  * included in the Service_Type structure below.  This structure allows an
  427.  * application to include any valid Int Serv service parameter in the Buffer 
  428.  * value, after providing the Int Serv parameter id in the ParameterId field.
  429.  */
  430. typedef struct _PARAM_BUFFER {
  431.  
  432.     ULONG   ParameterId;    /* Int Server parameter ID */
  433.     ULONG   Length;         /* total length of this structure 
  434.                              * ( 8 bytes + length of Buffer ) */
  435.     UCHAR   Buffer[1];      /* Paramter itself */
  436.  
  437. } PARAM_BUFFER, *LPPARAM_BUFFER;
  438.  
  439. /*
  440.  * this structure contains the service types supported
  441.  */
  442. typedef struct _CONTROL_SERVICE {
  443.  
  444.     /*
  445.      * the length of this entire structure including the following buffer.  
  446.      * This length value can be added to the ptr to the structure to get the ptr
  447.      * to the next SERVICE_TYPE structure in the list, until the
  448.      * NumberOfServices count has been exhausted.
  449.      */
  450.     ULONG               Length;
  451.  
  452.     SERVICETYPE         Service;
  453.     AD_GENERAL_PARAMS   Overrides;
  454.  
  455.     /*
  456.      * service specific information ( controlled load has no service specific 
  457.      * info here )
  458.      */
  459.     union {
  460.         AD_GUARANTEED   Guaranteed;
  461.         PARAM_BUFFER    ParamBuffer[1];     /* allows for other services down 
  462.                                              * the road */
  463.     };
  464.  
  465. } CONTROL_SERVICE, *LPCONTROL_SERVICE;
  466.  
  467. /*
  468.  * This structure defines the information which is carried in the Rsvp 
  469.  * Adspec.  This Rsvp object typically indicates which service types are 
  470.  * available ( Controlled Load and/or Guaranteed Service ), if a non-Rsvp
  471.  * hop has been encountered by the Path message, and the minumum MTU along 
  472.  * the path. The services array indicates which services are supported
  473.  */
  474. typedef struct _RSVP_ADSPEC  {
  475.  
  476.     QOS_OBJECT_HDR     ObjectHdr;
  477.     AD_GENERAL_PARAMS  GeneralParams;      /* contains the general 
  478.                                             * characterization paramters */
  479.     ULONG              NumberOfServices;   /* count of the number of services */
  480.     CONTROL_SERVICE    Services[1];        /* a list of the services 
  481.                                             * supported/requested */
  482.  
  483. } RSVP_ADSPEC, *LPRSVP_ADSPEC;
  484.  
  485.  
  486. #endif  /* __QOS_H_ */
  487.