Traffic.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:12k
- /*++
- Copyright (c) Microsoft Corporation. All rights reserved.
- Module Name:
- traffic.h
- Abstract:
- This module contains API definitions for the traffic control interface.
- --*/
- #ifndef __TRAFFIC_H
- #define __TRAFFIC_H
- #if _MSC_VER > 1000
- #pragma once
- #endif
- #ifdef __cplusplus
- extern "C" {
- #endif
- //---------------------------------------------------------------------------
- //
- // Define's
- //
- #define CURRENT_TCI_VERSION 0x0002
- //
- // Definitions of notification events. These may be passed
- // to the client's notification handler, to identify the
- // notification type
- //
- //
- // A TC interface has come up
- //
- #define TC_NOTIFY_IFC_UP 1
- //
- // A TC interface has come down
- //
- #define TC_NOTIFY_IFC_CLOSE 2
- //
- // A change on a TC interface, typically a change in the
- // list of supported network addresses
- //
- #define TC_NOTIFY_IFC_CHANGE 3
- //
- // A TC parameter has changed
- //
- #define TC_NOTIFY_PARAM_CHANGED 4
- //
- // A flow has been closed by the TC interface
- // for example: after a remote call close, or the whole interface
- // is going down
- //
- #define TC_NOTIFY_FLOW_CLOSE 5
- #define TC_INVALID_HANDLE ((HANDLE)0)
- #define MAX_STRING_LENGTH 256
- //---------------------------------------------------------------------------
- //
- // Typedef's and structures
- //
- #ifndef CALLBACK
- #define CALLBACK __stdcall
- #endif
- #ifndef APIENTRY
- #define APIENTRY FAR __stdcall
- #endif
- //
- // Handlers registered by the TCI client
- //
- typedef
- VOID (CALLBACK * TCI_NOTIFY_HANDLER)(
- IN HANDLE ClRegCtx,
- IN HANDLE ClIfcCtx,
- IN ULONG Event, // See list below
- IN HANDLE SubCode,
- IN ULONG BufSize,
- IN PVOID Buffer
- );
- typedef
- VOID (CALLBACK * TCI_ADD_FLOW_COMPLETE_HANDLER)(
- IN HANDLE ClFlowCtx,
- IN ULONG Status
- );
- typedef
- VOID (CALLBACK * TCI_MOD_FLOW_COMPLETE_HANDLER)(
- IN HANDLE ClFlowCtx,
- IN ULONG Status
- );
- typedef
- VOID (CALLBACK * TCI_DEL_FLOW_COMPLETE_HANDLER)(
- IN HANDLE ClFlowCtx,
- IN ULONG Status
- );
- typedef struct _TCI_CLIENT_FUNC_LIST {
- TCI_NOTIFY_HANDLER ClNotifyHandler;
- TCI_ADD_FLOW_COMPLETE_HANDLER ClAddFlowCompleteHandler;
- TCI_MOD_FLOW_COMPLETE_HANDLER ClModifyFlowCompleteHandler;
- TCI_DEL_FLOW_COMPLETE_HANDLER ClDeleteFlowCompleteHandler;
- } TCI_CLIENT_FUNC_LIST, *PTCI_CLIENT_FUNC_LIST;
- //
- // Network address descriptor
- //
- typedef struct _ADDRESS_LIST_DESCRIPTOR {
- ULONG MediaType;
- NETWORK_ADDRESS_LIST AddressList;
- } ADDRESS_LIST_DESCRIPTOR, *PADDRESS_LIST_DESCRIPTOR;
- //
- // An interface ID that is returned by the enumerator
- //
- typedef struct _TC_IFC_DESCRIPTOR {
- ULONG Length;
- LPWSTR pInterfaceName;
- LPWSTR pInterfaceID;
- ADDRESS_LIST_DESCRIPTOR AddressListDesc;
- } TC_IFC_DESCRIPTOR, *PTC_IFC_DESCRIPTOR;
- //
- // This structure is returned by a QoS data provider in reply to
- // GUID_QOS_SUPPORTED query or with an interface UP notification
- //
- typedef struct _TC_SUPPORTED_INFO_BUFFER {
- USHORT InstanceIDLength;
- // device or interface ID
- WCHAR InstanceID[MAX_STRING_LENGTH];
- // address list
- ADDRESS_LIST_DESCRIPTOR AddrListDesc;
- } TC_SUPPORTED_INFO_BUFFER, *PTC_SUPPORTED_INFO_BUFFER;
- //
- // Filters are used to match packets. The Pattern field
- // indicates the values to which bits in corresponding
- // positions in candidate packets should be compared. The
- // Mask field indicates which bits are to be compared and
- // which bits are don't cares.
- //
- // Different filters can be submitted on the TCI interface.
- // The generic filter structure is defined to include an
- // AddressType, which indicates the specific type of filter to
- // follow.
- //
- typedef struct _TC_GEN_FILTER {
- USHORT AddressType; // IP, IPX, etc.
- ULONG PatternSize; // byte count of the pattern
- PVOID Pattern; // specific format, e.g. IP_PATTERN
- PVOID Mask; // same type as Pattern
- } TC_GEN_FILTER, *PTC_GEN_FILTER;
- //
- // A generic flow includes two flowspecs and a freeform
- // buffer which contains flow specific TC objects.
- //
- typedef struct _TC_GEN_FLOW {
-
- FLOWSPEC SendingFlowspec;
- FLOWSPEC ReceivingFlowspec;
- ULONG TcObjectsLength; // number of optional bytes
- QOS_OBJECT_HDR TcObjects[1];
- } TC_GEN_FLOW, *PTC_GEN_FLOW;
- //
- // Format of specific pattern or mask used by GPC for the IP protocol
- //
- typedef struct _IP_PATTERN {
- ULONG Reserved1;
- ULONG Reserved2;
- ULONG SrcAddr;
- ULONG DstAddr;
- union {
- struct { USHORT s_srcport,s_dstport; } S_un_ports;
- struct { UCHAR s_type,s_code; USHORT filler; } S_un_icmp;
- ULONG S_Spi;
- } S_un;
- UCHAR ProtocolId;
- UCHAR Reserved3[3];
- #define tcSrcPort S_un.S_un_ports.s_srcport
- #define tcDstPort S_un.S_un_ports.s_dstport
- #define tcIcmpType S_un.S_un_icmp.s_type
- #define tcIcmpCode S_un.S_un_icmp.s_code
- #define tcSpi S_un.S_Spi
- } IP_PATTERN, *PIP_PATTERN;
- //
- // Format of specific pattern or mask used by GPC for the IPX protocol
- //
- typedef struct _IPX_PATTERN {
- struct {
- ULONG NetworkAddress;
- UCHAR NodeAddress[6];
- USHORT Socket;
- } Src, Dest;
- } IPX_PATTERN, *PIPX_PATTERN;
- //
- // The enumeration buffer is the flow parameters + a list of filters
- //
- typedef struct _ENUMERATION_BUFFER {
- ULONG Length;
- ULONG OwnerProcessId;
- USHORT FlowNameLength;
- WCHAR FlowName[MAX_STRING_LENGTH];
- PTC_GEN_FLOW pFlow;
- ULONG NumberOfFilters;
- TC_GEN_FILTER GenericFilter[1]; // one for each filter
- } ENUMERATION_BUFFER, *PENUMERATION_BUFFER;
- //
- // QoS objects supported by traffic
- //
- #define QOS_TRAFFIC_GENERAL_ID_BASE 4000
- #define QOS_OBJECT_DS_CLASS (0x00000001 + QOS_TRAFFIC_GENERAL_ID_BASE)
- /* QOS_DS_CLASS structure passed */
- #define QOS_OBJECT_TRAFFIC_CLASS (0x00000002 + QOS_TRAFFIC_GENERAL_ID_BASE)
- /* QOS_Traffic class structure passed */
- #define QOS_OBJECT_DIFFSERV (0x00000003 + QOS_TRAFFIC_GENERAL_ID_BASE)
- /* QOS_DIFFSERV Structure */
- #define QOS_OBJECT_TCP_TRAFFIC (0x00000004 + QOS_TRAFFIC_GENERAL_ID_BASE)
- /* QOS_TCP_TRAFFIC structure */
- #define QOS_OBJECT_FRIENDLY_NAME (0x00000005 + QOS_TRAFFIC_GENERAL_ID_BASE)
- /* QOS_FRIENDLY_NAME structure */
- //
- // This structure is used to associate a friendly name with the flow
- //
- typedef struct _QOS_FRIENDLY_NAME {
- QOS_OBJECT_HDR ObjectHdr;
- WCHAR FriendlyName[MAX_STRING_LENGTH];
- } QOS_FRIENDLY_NAME, *LPQOS_FRIENDLY_NAME;
- //
- // 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 may carry an DSField parameter which has been provided to
- // the host by a layer 3 network, for example, in an extended RSVP RESV message.
- // If this object is obtained from the network, hosts will stamp the DS Field on the
- // IP header of transmitted packets, with the value in the object. Otherwise, hosts
- // may select a value based on the standard Intserv mapping of ServiceType to DS Field
- //
- typedef struct _QOS_DS_CLASS {
- QOS_OBJECT_HDR ObjectHdr;
- ULONG DSField;
- } QOS_DS_CLASS, *LPQOS_DS_CLASS;
- //
- // This structure is used to create DiffServ Flows. This creates flows in the packet scheduler
- // and allows it to classify to packets based on a particular DS field. This structure takes
- // a variable length array of QOS_DIFFSERV_RULE, where each DS field is specified by a
- // QOS_DIFFSERV_RULE
- //
- typedef struct _QOS_DIFFSERV {
- QOS_OBJECT_HDR ObjectHdr;
- ULONG DSFieldCount;
- UCHAR DiffservRule[1];
- } QOS_DIFFSERV, *LPQOS_DIFFSERV;
- //
- // The rule for a Diffserv DS codepoint.
- //
- typedef struct _QOS_DIFFSERV_RULE {
- UCHAR InboundDSField;
- UCHAR ConformingOutboundDSField;
- UCHAR NonConformingOutboundDSField;
- UCHAR ConformingUserPriority;
- UCHAR NonConformingUserPriority;
- } QOS_DIFFSERV_RULE, *LPQOS_DIFFSERV_RULE;
- //
- // This structure is passed to indicate that the IP Precedence and UserPriority mappings for the flow
- // have to be set to the system defaults for TCP traffic. If this object is passed,
- // the ServiceType ==> DSField mapping, ServiceType ==> UserPriorityMapping, QOS_OBJECT_DS_CLASS
- // and QOS_OBJECT_TRAFFIC_CLASS will be ignored.
- //
- typedef struct _QOS_TCP_TRAFFIC {
- QOS_OBJECT_HDR ObjectHdr;
- } QOS_TCP_TRAFFIC, *LPQOS_TCP_TRAFFIC;
-
- //---------------------------------------------------------------------------
- //
- // Interface Function Definitions
- //
- ULONG
- APIENTRY
- TcRegisterClient(
- IN ULONG TciVersion,
- IN HANDLE ClRegCtx,
- IN PTCI_CLIENT_FUNC_LIST ClientHandlerList,
- OUT PHANDLE pClientHandle
- );
- ULONG
- APIENTRY
- TcEnumerateInterfaces(
- IN HANDLE ClientHandle,
- IN OUT PULONG pBufferSize,
- OUT PTC_IFC_DESCRIPTOR InterfaceBuffer
- );
- ULONG
- APIENTRY
- TcOpenInterfaceA(
- IN LPSTR pInterfaceName,
- IN HANDLE ClientHandle,
- IN HANDLE ClIfcCtx,
- OUT PHANDLE pIfcHandle
- );
- ULONG
- APIENTRY
- TcOpenInterfaceW(
- IN LPWSTR pInterfaceName,
- IN HANDLE ClientHandle,
- IN HANDLE ClIfcCtx,
- OUT PHANDLE pIfcHandle
- );
- ULONG
- APIENTRY
- TcCloseInterface(
- IN HANDLE IfcHandle
- );
- ULONG
- APIENTRY
- TcQueryInterface(
- IN HANDLE IfcHandle,
- IN LPGUID pGuidParam,
- IN BOOLEAN NotifyChange,
- IN OUT PULONG pBufferSize,
- OUT PVOID Buffer
- );
- ULONG
- APIENTRY
- TcSetInterface(
- IN HANDLE IfcHandle,
- IN LPGUID pGuidParam,
- IN ULONG BufferSize,
- IN PVOID Buffer
- );
- ULONG
- APIENTRY
- TcQueryFlowA(
- IN LPSTR pFlowName,
- IN LPGUID pGuidParam,
- IN OUT PULONG pBufferSize,
- OUT PVOID Buffer
- );
- ULONG
- APIENTRY
- TcQueryFlowW(
- IN LPWSTR pFlowName,
- IN LPGUID pGuidParam,
- IN OUT PULONG pBufferSize,
- OUT PVOID Buffer
- );
- ULONG
- APIENTRY
- TcSetFlowA(
- IN LPSTR pFlowName,
- IN LPGUID pGuidParam,
- IN ULONG BufferSize,
- IN PVOID Buffer
- );
- ULONG
- APIENTRY
- TcSetFlowW(
- IN LPWSTR pFlowName,
- IN LPGUID pGuidParam,
- IN ULONG BufferSize,
- IN PVOID Buffer
- );
- ULONG
- APIENTRY
- TcAddFlow(
- IN HANDLE IfcHandle,
- IN HANDLE ClFlowCtx,
- IN ULONG Flags,
- IN PTC_GEN_FLOW pGenericFlow,
- OUT PHANDLE pFlowHandle
- );
- ULONG
- APIENTRY
- TcGetFlowNameA(
- IN HANDLE FlowHandle,
- IN ULONG StrSize,
- OUT LPSTR pFlowName
- );
- ULONG
- APIENTRY
- TcGetFlowNameW(
- IN HANDLE FlowHandle,
- IN ULONG StrSize,
- OUT LPWSTR pFlowName
- );
- ULONG
- APIENTRY
- TcModifyFlow(
- IN HANDLE FlowHandle,
- IN PTC_GEN_FLOW pGenericFlow
- );
- ULONG
- APIENTRY
- TcAddFilter(
- IN HANDLE FlowHandle,
- IN PTC_GEN_FILTER pGenericFilter,
- OUT PHANDLE pFilterHandle
- );
- ULONG
- APIENTRY
- TcDeregisterClient(
- IN HANDLE ClientHandle
- );
- ULONG
- APIENTRY
- TcDeleteFlow(
- IN HANDLE FlowHandle
- );
- ULONG
- APIENTRY
- TcDeleteFilter(
- IN HANDLE FilterHandle
- );
- ULONG
- APIENTRY
- TcEnumerateFlows(
- IN HANDLE IfcHandle,
- IN OUT PHANDLE pEnumHandle,
- IN OUT PULONG pFlowCount,
- IN OUT PULONG pBufSize,
- OUT PENUMERATION_BUFFER Buffer
- );
- #ifdef UNICODE
- #define TcOpenInterface TcOpenInterfaceW
- #define TcQueryFlow TcQueryFlowW
- #define TcSetFlow TcSetFlowW
- #define TcGetFlowName TcGetFlowNameW
- #else // UNICODE
- #define TcOpenInterface TcOpenInterfaceA
- #define TcQueryFlow TcQueryFlowA
- #define TcSetFlow TcSetFlowA
- #define TcGetFlowName TcGetFlowNameA
- #endif // UNICODE
- #ifdef __cplusplus
- }
- #endif
- #endif