Home | History | Annotate | Download | only in include
      1 /**
      2  * This file has no copyright assigned and is placed in the Public Domain.
      3  * This file is part of the mingw-w64 runtime package.
      4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
      5  */
      6 #ifndef __TRAFFIC_H
      7 #define __TRAFFIC_H
      8 
      9 #include <_mingw_unicode.h>
     10 #include <ntddndis.h>
     11 
     12 #ifdef __cplusplus
     13 extern "C" {
     14 #endif
     15 
     16 #define CURRENT_TCI_VERSION 0x0002
     17 
     18 #define TC_NOTIFY_IFC_UP 1
     19 #define TC_NOTIFY_IFC_CLOSE 2
     20 #define TC_NOTIFY_IFC_CHANGE 3
     21 #define TC_NOTIFY_PARAM_CHANGED 4
     22 #define TC_NOTIFY_FLOW_CLOSE 5
     23 #define TC_INVALID_HANDLE ((HANDLE)0)
     24 
     25 #define MAX_STRING_LENGTH 256
     26 
     27 #ifndef CALLBACK
     28 #if defined(_ARM_)
     29 #define CALLBACK
     30 #else
     31 #define CALLBACK __stdcall
     32 #endif
     33 #endif
     34 
     35 #ifndef WINAPI
     36 #if defined(_ARM_)
     37 #define WINAPI
     38 #else
     39 #define WINAPI __stdcall
     40 #endif
     41 #endif
     42 
     43 #ifndef APIENTRY
     44 #define APIENTRY WINAPI
     45 #endif
     46 
     47   typedef VOID (CALLBACK *TCI_NOTIFY_HANDLER)(HANDLE ClRegCtx,HANDLE ClIfcCtx,ULONG Event,HANDLE SubCode,ULONG BufSize,PVOID Buffer);
     48   typedef VOID (CALLBACK *TCI_ADD_FLOW_COMPLETE_HANDLER)(HANDLE ClFlowCtx,ULONG Status);
     49   typedef VOID (CALLBACK *TCI_MOD_FLOW_COMPLETE_HANDLER)(HANDLE ClFlowCtx,ULONG Status);
     50   typedef VOID (CALLBACK *TCI_DEL_FLOW_COMPLETE_HANDLER)(HANDLE ClFlowCtx,ULONG Status);
     51 
     52   typedef struct _TCI_CLIENT_FUNC_LIST {
     53     TCI_NOTIFY_HANDLER ClNotifyHandler;
     54     TCI_ADD_FLOW_COMPLETE_HANDLER ClAddFlowCompleteHandler;
     55     TCI_MOD_FLOW_COMPLETE_HANDLER ClModifyFlowCompleteHandler;
     56     TCI_DEL_FLOW_COMPLETE_HANDLER ClDeleteFlowCompleteHandler;
     57   } TCI_CLIENT_FUNC_LIST,*PTCI_CLIENT_FUNC_LIST;
     58 
     59   typedef struct _ADDRESS_LIST_DESCRIPTOR {
     60     ULONG MediaType;
     61     NETWORK_ADDRESS_LIST AddressList;
     62   } ADDRESS_LIST_DESCRIPTOR,*PADDRESS_LIST_DESCRIPTOR;
     63 
     64   typedef struct _TC_IFC_DESCRIPTOR {
     65     ULONG Length;
     66     LPWSTR pInterfaceName;
     67     LPWSTR pInterfaceID;
     68     ADDRESS_LIST_DESCRIPTOR AddressListDesc;
     69   } TC_IFC_DESCRIPTOR,*PTC_IFC_DESCRIPTOR;
     70 
     71   typedef struct _TC_SUPPORTED_INFO_BUFFER {
     72     USHORT InstanceIDLength;
     73     WCHAR InstanceID[MAX_STRING_LENGTH];
     74     ADDRESS_LIST_DESCRIPTOR AddrListDesc;
     75   } TC_SUPPORTED_INFO_BUFFER,*PTC_SUPPORTED_INFO_BUFFER;
     76 
     77   typedef struct _TC_GEN_FILTER {
     78     USHORT AddressType;
     79     ULONG PatternSize;
     80     PVOID Pattern;
     81     PVOID Mask;
     82   } TC_GEN_FILTER,*PTC_GEN_FILTER;
     83 
     84   typedef struct _TC_GEN_FLOW {
     85     FLOWSPEC SendingFlowspec;
     86     FLOWSPEC ReceivingFlowspec;
     87     ULONG TcObjectsLength;
     88     QOS_OBJECT_HDR TcObjects[1];
     89   } TC_GEN_FLOW,*PTC_GEN_FLOW;
     90 
     91   typedef struct _IP_PATTERN {
     92     ULONG Reserved1;
     93     ULONG Reserved2;
     94     ULONG SrcAddr;
     95     ULONG DstAddr;
     96     union {
     97       struct { USHORT s_srcport,s_dstport; } S_un_ports;
     98       struct { UCHAR s_type,s_code; USHORT filler; } S_un_icmp;
     99       ULONG S_Spi;
    100     } S_un;
    101     UCHAR ProtocolId;
    102     UCHAR Reserved3[3];
    103   } IP_PATTERN,*PIP_PATTERN;
    104 
    105 #define tcSrcPort S_un.S_un_ports.s_srcport
    106 #define tcDstPort S_un.S_un_ports.s_dstport
    107 #define tcIcmpType S_un.S_un_icmp.s_type
    108 #define tcIcmpCode S_un.S_un_icmp.s_code
    109 #define tcSpi S_un.S_Spi
    110 
    111   typedef struct _IPX_PATTERN {
    112     struct {
    113       ULONG NetworkAddress;
    114       UCHAR NodeAddress[6];
    115       USHORT Socket;
    116     } Src,Dest;
    117   } IPX_PATTERN,*PIPX_PATTERN;
    118 
    119   typedef struct _ENUMERATION_BUFFER {
    120     ULONG Length;
    121     ULONG OwnerProcessId;
    122     USHORT FlowNameLength;
    123     WCHAR FlowName[MAX_STRING_LENGTH];
    124     PTC_GEN_FLOW pFlow;
    125     ULONG NumberOfFilters;
    126     TC_GEN_FILTER GenericFilter[1];
    127   } ENUMERATION_BUFFER,*PENUMERATION_BUFFER;
    128 
    129 #define QOS_TRAFFIC_GENERAL_ID_BASE 4000
    130 #define QOS_OBJECT_DS_CLASS (0x00000001 + QOS_TRAFFIC_GENERAL_ID_BASE)
    131 #define QOS_OBJECT_TRAFFIC_CLASS (0x00000002 + QOS_TRAFFIC_GENERAL_ID_BASE)
    132 #define QOS_OBJECT_DIFFSERV (0x00000003 + QOS_TRAFFIC_GENERAL_ID_BASE)
    133 #define QOS_OBJECT_TCP_TRAFFIC (0x00000004 + QOS_TRAFFIC_GENERAL_ID_BASE)
    134 #define QOS_OBJECT_FRIENDLY_NAME (0x00000005 + QOS_TRAFFIC_GENERAL_ID_BASE)
    135 
    136   typedef struct _QOS_FRIENDLY_NAME {
    137     QOS_OBJECT_HDR ObjectHdr;
    138     WCHAR FriendlyName[MAX_STRING_LENGTH];
    139   } QOS_FRIENDLY_NAME,*LPQOS_FRIENDLY_NAME;
    140 
    141   typedef struct _QOS_TRAFFIC_CLASS {
    142     QOS_OBJECT_HDR ObjectHdr;
    143     ULONG TrafficClass;
    144   } QOS_TRAFFIC_CLASS,*LPQOS_TRAFFIC_CLASS;
    145 
    146   typedef struct _QOS_DS_CLASS {
    147     QOS_OBJECT_HDR ObjectHdr;
    148     ULONG DSField;
    149   } QOS_DS_CLASS,*LPQOS_DS_CLASS;
    150 
    151   typedef struct _QOS_DIFFSERV {
    152     QOS_OBJECT_HDR ObjectHdr;
    153     ULONG DSFieldCount;
    154     UCHAR DiffservRule[1];
    155   } QOS_DIFFSERV,*LPQOS_DIFFSERV;
    156 
    157   typedef struct _QOS_DIFFSERV_RULE {
    158     UCHAR InboundDSField;
    159     UCHAR ConformingOutboundDSField;
    160     UCHAR NonConformingOutboundDSField;
    161     UCHAR ConformingUserPriority;
    162     UCHAR NonConformingUserPriority;
    163   } QOS_DIFFSERV_RULE,*LPQOS_DIFFSERV_RULE;
    164 
    165   typedef struct _QOS_TCP_TRAFFIC {
    166     QOS_OBJECT_HDR ObjectHdr;
    167   } QOS_TCP_TRAFFIC,*LPQOS_TCP_TRAFFIC;
    168 
    169 #define TcOpenInterface __MINGW_NAME_AW(TcOpenInterface)
    170 #define TcQueryFlow __MINGW_NAME_AW(TcQueryFlow)
    171 #define TcSetFlow __MINGW_NAME_AW(TcSetFlow)
    172 #define TcGetFlowName __MINGW_NAME_AW(TcGetFlowName)
    173 
    174   ULONG WINAPI TcRegisterClient(ULONG TciVersion,HANDLE ClRegCtx,PTCI_CLIENT_FUNC_LIST ClientHandlerList,PHANDLE pClientHandle);
    175   ULONG WINAPI TcEnumerateInterfaces(HANDLE ClientHandle,PULONG pBufferSize,PTC_IFC_DESCRIPTOR InterfaceBuffer);
    176   ULONG WINAPI TcOpenInterfaceA(LPSTR pInterfaceName,HANDLE ClientHandle,HANDLE ClIfcCtx,PHANDLE pIfcHandle);
    177   ULONG WINAPI TcOpenInterfaceW(LPWSTR pInterfaceName,HANDLE ClientHandle,HANDLE ClIfcCtx,PHANDLE pIfcHandle);
    178   ULONG WINAPI TcCloseInterface(HANDLE IfcHandle);
    179   ULONG WINAPI TcQueryInterface(HANDLE IfcHandle,LPGUID pGuidParam,BOOLEAN NotifyChange,PULONG pBufferSize,PVOID Buffer);
    180   ULONG WINAPI TcSetInterface(HANDLE IfcHandle,LPGUID pGuidParam,ULONG BufferSize,PVOID Buffer);
    181   ULONG WINAPI TcQueryFlowA(LPSTR pFlowName,LPGUID pGuidParam,PULONG pBufferSize,PVOID Buffer);
    182   ULONG WINAPI TcQueryFlowW(LPWSTR pFlowName,LPGUID pGuidParam,PULONG pBufferSize,PVOID Buffer);
    183   ULONG WINAPI TcSetFlowA(LPSTR pFlowName,LPGUID pGuidParam,ULONG BufferSize,PVOID Buffer);
    184   ULONG WINAPI TcSetFlowW(LPWSTR pFlowName,LPGUID pGuidParam,ULONG BufferSize,PVOID Buffer);
    185   ULONG WINAPI TcAddFlow(HANDLE IfcHandle,HANDLE ClFlowCtx,ULONG Flags,PTC_GEN_FLOW pGenericFlow,PHANDLE pFlowHandle);
    186   ULONG WINAPI TcGetFlowNameA(HANDLE FlowHandle,ULONG StrSize,LPSTR pFlowName);
    187   ULONG WINAPI TcGetFlowNameW(HANDLE FlowHandle,ULONG StrSize,LPWSTR pFlowName);
    188   ULONG WINAPI TcModifyFlow(HANDLE FlowHandle,PTC_GEN_FLOW pGenericFlow);
    189   ULONG WINAPI TcAddFilter(HANDLE FlowHandle,PTC_GEN_FILTER pGenericFilter,PHANDLE pFilterHandle);
    190   ULONG WINAPI TcDeregisterClient(HANDLE ClientHandle);
    191   ULONG WINAPI TcDeleteFlow(HANDLE FlowHandle);
    192   ULONG WINAPI TcDeleteFilter(HANDLE FilterHandle);
    193   ULONG WINAPI TcEnumerateFlows(HANDLE IfcHandle,PHANDLE pEnumHandle,PULONG pFlowCount,PULONG pBufSize,PENUMERATION_BUFFER Buffer);
    194 
    195 #ifdef __cplusplus
    196 }
    197 #endif
    198 #endif
    199