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