552 lines
12 KiB
C
552 lines
12 KiB
C
|
/*++
|
||
|
|
||
|
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
|
||
|
|