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 _ROUTPROT_H_
7 #define _ROUTPROT_H_
8 
9 #include "stm.h"
10 
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14 
15 #define RF_ROUTING 0x00000001
16 #define RF_DEMAND_UPDATE_ROUTES 0x00000004
17 #define RF_ADD_ALL_INTERFACES 0x00000010
18 #define RF_MULTICAST 0x00000020
19 #define RF_POWER 0x00000040
20 
21 #if MPR50
22 #define MS_ROUTER_VERSION 0x00000500
23 #else
24 #error Router version not defined
25 #endif
26 
27   typedef enum _ROUTING_PROTOCOL_EVENTS {
28     ROUTER_STOPPED,SAVE_GLOBAL_CONFIG_INFO,SAVE_INTERFACE_CONFIG_INFO,UPDATE_COMPLETE
29   } ROUTING_PROTOCOL_EVENTS;
30 
31   typedef enum _NET_INTERFACE_TYPE {
32     PERMANENT,DEMAND_DIAL,LOCAL_WORKSTATION_DIAL,REMOTE_WORKSTATION_DIAL
33   } NET_INTERFACE_TYPE;
34 
35 #define IR_PROMISCUOUS 0
36 #define IR_PROMISCUOUS_MULTICAST 1
37 
38   typedef struct _SUPPORT_FUNCTIONS {
39     __C89_NAMELESS union {
40       ULONGLONG _Align8;
41       __C89_NAMELESS struct {
42 	DWORD dwVersion;
43 	DWORD dwReserved;
44       };
45     };
46     DWORD (WINAPI *DemandDialRequest)(DWORD ProtocolId,DWORD InterfaceIndex);
47     DWORD (WINAPI *SetInterfaceReceiveType)(DWORD ProtocolId,DWORD InterfaceIndex,DWORD InterfaceReceiveType,WINBOOL bActivate);
48     DWORD (WINAPI *ValidateRoute)(DWORD ProtocolId,PVOID RouteInfo,PVOID DestAddress);
49     DWORD (WINAPI *MIBEntryCreate)(DWORD dwRoutingPid,DWORD dwEntrySize,LPVOID lpEntry);
50     DWORD (WINAPI *MIBEntryDelete)(DWORD dwRoutingPid,DWORD dwEntrySize,LPVOID lpEntry);
51     DWORD (WINAPI *MIBEntrySet)(DWORD dwRoutingPid,DWORD dwEntrySize,LPVOID lpEntry);
52     DWORD (WINAPI *MIBEntryGet)(DWORD dwRoutingPid,DWORD dwInEntrySize,LPVOID lpInEntry,LPDWORD lpOutEntrySize,LPVOID lpOutEntry);
53     DWORD (WINAPI *MIBEntryGetFirst)(DWORD dwRoutingPid,DWORD dwInEntrySize,LPVOID lpInEntry,LPDWORD lpOutEntrySize,LPVOID lpOutEntry);
54     DWORD (WINAPI *MIBEntryGetNext)(DWORD dwRoutingPid,DWORD dwInEntrySize,LPVOID lpInEntry,LPDWORD lpOutEntrySize,LPVOID lpOutEntry);
55     DWORD (WINAPI *GetRouterId)(VOID);
56     WINBOOL (WINAPI *HasMulticastBoundary)(DWORD dwIfIndex,DWORD dwGroupAddress);
57   } SUPPORT_FUNCTIONS,*PSUPPORT_FUNCTIONS;
58 
59 #define PROTO_IP_OTHER 1
60 #define PROTO_IP_LOCAL 2
61 #define PROTO_IP_NETMGMT 3
62 #define PROTO_IP_ICMP 4
63 #define PROTO_IP_EGP 5
64 #define PROTO_IP_GGP 6
65 #define PROTO_IP_HELLO 7
66 #define PROTO_IP_RIP 8
67 #define PROTO_IP_IS_IS 9
68 #define PROTO_IP_ES_IS 10
69 #define PROTO_IP_CISCO 11
70 #define PROTO_IP_BBN 12
71 #define PROTO_IP_OSPF 13
72 #define PROTO_IP_BGP 14
73 
74 #define PROTO_IP_MSDP 9
75 #define PROTO_IP_IGMP 10
76 #define PROTO_IP_BGMP 11
77 
78 #define PROTO_IP_VRRP 112
79 #define PROTO_IP_BOOTP 9999
80 #define PROTO_IP_NT_AUTOSTATIC 10002
81 #define PROTO_IP_DNS_PROXY 10003
82 #define PROTO_IP_DHCP_ALLOCATOR 10004
83 #define PROTO_IP_NAT 10005
84 #define PROTO_IP_NT_STATIC 10006
85 #define PROTO_IP_NT_STATIC_NON_DOD 10007
86 #define PROTO_IP_DIFFSERV 10008
87 #define PROTO_IP_MGM 10009
88 #define PROTO_IP_ALG 10010
89 #define PROTO_IP_H323 10011
90 #define PROTO_IP_FTP 10012
91 #define PROTO_IP_DTP 10013
92 
93 #define PROTOCOL_ID(Type,VendorId,ProtocolId) (((Type & 0x03)<<30)|((VendorId & 0x3FFF)<<16)|(ProtocolId & 0xFFFF))
94 
95 #define TYPE_FROM_PROTO_ID(X) (((X) >> 30) & 0x03)
96 #define VENDOR_FROM_PROTO_ID(X) (((X) >> 16) & 0x3FFF)
97 #define PROTO_FROM_PROTO_ID(X) ((X) & 0xFFFF)
98 
99 #define PROTO_TYPE_UCAST 0
100 #define PROTO_TYPE_MCAST 1
101 #define PROTO_TYPE_MS0 2
102 #define PROTO_TYPE_MS1 3
103 
104 #define PROTO_VENDOR_MS0 0x0000
105 #define PROTO_VENDOR_MS1 0x137
106 #define PROTO_VENDOR_MS2 0x3FFF
107 
108 #define MS_IP_BOOTP PROTOCOL_ID(PROTO_TYPE_UCAST,PROTO_VENDOR_MS0,PROTO_IP_BOOTP)
109 #define MS_IP_RIP PROTOCOL_ID(PROTO_TYPE_UCAST,PROTO_VENDOR_MS0,PROTO_IP_RIP)
110 #define MS_IP_OSPF PROTOCOL_ID(PROTO_TYPE_UCAST,PROTO_VENDOR_MS0,PROTO_IP_OSPF)
111 #define MS_IP_BGP PROTOCOL_ID(PROTO_TYPE_UCAST,PROTO_VENDOR_MS1,PROTO_IP_BGP)
112 #define MS_IP_IGMP PROTOCOL_ID(PROTO_TYPE_MCAST,PROTO_VENDOR_MS1,PROTO_IP_IGMP)
113 #define MS_IP_BGMP PROTOCOL_ID(PROTO_TYPE_MCAST,PROTO_VENDOR_MS1,PROTO_IP_BGMP)
114 #define MS_IP_MSDP PROTOCOL_ID(PROTO_TYPE_MCAST,PROTO_VENDOR_MS1,PROTO_IP_MSDP)
115 #define MS_IP_DNS_PROXY PROTOCOL_ID(PROTO_TYPE_MS0,PROTO_VENDOR_MS1,PROTO_IP_DNS_PROXY)
116 #define MS_IP_DHCP_ALLOCATOR PROTOCOL_ID(PROTO_TYPE_MS0,PROTO_VENDOR_MS1,PROTO_IP_DHCP_ALLOCATOR)
117 #define MS_IP_NAT PROTOCOL_ID(PROTO_TYPE_MS0,PROTO_VENDOR_MS1,PROTO_IP_NAT)
118 #define MS_IP_DIFFSERV PROTOCOL_ID(PROTO_TYPE_MS0,PROTO_VENDOR_MS1,PROTO_IP_DIFFSERV)
119 #define MS_IP_MGM PROTOCOL_ID(PROTO_TYPE_MS0,PROTO_VENDOR_MS1,PROTO_IP_MGM)
120 #define MS_IP_VRRP PROTOCOL_ID(PROTO_TYPE_MS0,PROTO_VENDOR_MS1,PROTO_IP_VRRP)
121 #define MS_IP_DTP PROTOCOL_ID(PROTO_TYPE_MS0,PROTO_VENDOR_MS1,PROTO_IP_DTP)
122 #define MS_IP_H323 PROTOCOL_ID(PROTO_TYPE_MS0,PROTO_VENDOR_MS1,PROTO_IP_H323)
123 #define MS_IP_FTP PROTOCOL_ID(PROTO_TYPE_MS0,PROTO_VENDOR_MS1,PROTO_IP_FTP)
124 #define MS_IP_ALG PROTOCOL_ID(PROTO_TYPE_MS0,PROTO_VENDOR_MS1,PROTO_IP_ALG)
125 
126 #define IPX_PROTOCOL_BASE 0x0001ffff
127 #define IPX_PROTOCOL_RIP IPX_PROTOCOL_BASE + 1
128 #define IPX_PROTOCOL_SAP IPX_PROTOCOL_BASE + 2
129 #define IPX_PROTOCOL_NLSP IPX_PROTOCOL_BASE + 3
130 
131   typedef struct _UPDATE_COMPLETE_MESSAGE {
132     ULONG InterfaceIndex;
133     ULONG UpdateType;
134     ULONG UpdateStatus;
135   } UPDATE_COMPLETE_MESSAGE,*PUPDATE_COMPLETE_MESSAGE;
136 
137   typedef union _MESSAGE {
138     UPDATE_COMPLETE_MESSAGE UpdateCompleteMessage;
139     DWORD InterfaceIndex;
140   } MESSAGE,*PMESSAGE;
141 
142 #define RIS_INTERFACE_ADDRESS_CHANGE 0
143 #define RIS_INTERFACE_ENABLED 1
144 #define RIS_INTERFACE_DISABLED 2
145 #define RIS_INTERFACE_MEDIA_PRESENT 3
146 #define RIS_INTERFACE_MEDIA_ABSENT 4
147 
148   typedef struct IPX_ADAPTER_BINDING_INFO {
149     ULONG AdapterIndex;
150     UCHAR Network[4];
151     UCHAR LocalNode[6];
152     UCHAR RemoteNode[6];
153     ULONG MaxPacketSize;
154     ULONG LinkSpeed;
155   } IPX_ADAPTER_BINDING_INFO,*PIPX_ADAPTER_BINDING_INFO;
156 
157   typedef struct IP_LOCAL_BINDING {
158     DWORD Address;
159     DWORD Mask;
160   } IP_LOCAL_BINDING,*PIP_LOCAL_BINDING;
161 
162   typedef struct IP_ADAPTER_BINDING_INFO {
163     ULONG AddressCount;
164     DWORD RemoteAddress;
165     ULONG Mtu;
166     ULONGLONG Speed;
167     IP_LOCAL_BINDING Address[0];
168   } IP_ADAPTER_BINDING_INFO,*PIP_ADAPTER_BINDING_INFO;
169 
170 #define SIZEOF_IP_BINDING(X) (FIELD_OFFSET(IP_ADAPTER_BINDING_INFO,Address[0]) + ((X) *sizeof(IP_LOCAL_BINDING)))
171 
172   typedef DWORD (WINAPI *PSTART_PROTOCOL)(HANDLE NotificationEvent,PSUPPORT_FUNCTIONS SupportFunctions,LPVOID GlobalInfo,ULONG StructureVersion,ULONG StructureSize,ULONG StructureCount);
173   typedef DWORD (WINAPI *PSTART_COMPLETE)(VOID);
174   typedef DWORD (WINAPI *PSTOP_PROTOCOL)(VOID);
175   typedef DWORD (WINAPI *PADD_INTERFACE)(LPWSTR InterfaceName,ULONG InterfaceIndex,NET_INTERFACE_TYPE InterfaceType,DWORD MediaType,WORD AccessType,WORD ConnectionType,PVOID InterfaceInfo,ULONG StructureVersion,ULONG StructureSize,ULONG StructureCount);
176   typedef DWORD (WINAPI *PDELETE_INTERFACE)(ULONG InterfaceIndex);
177   typedef DWORD (WINAPI *PGET_EVENT_MESSAGE)(ROUTING_PROTOCOL_EVENTS *Event,MESSAGE *Result);
178   typedef DWORD (WINAPI *PGET_INTERFACE_INFO)(ULONG InterfaceIndex,PVOID InterfaceInfo,PULONG BufferSize,PULONG StructureVersion,PULONG StructureSize,PULONG StructureCount);
179   typedef DWORD (WINAPI *PSET_INTERFACE_INFO)(ULONG InterfaceIndex,PVOID InterfaceInfo,ULONG StructureVersion,ULONG StructureSize,ULONG StructureCount);
180   typedef DWORD (WINAPI *PINTERFACE_STATUS)(ULONG InterfaceIndex,WINBOOL InterfaceActive,DWORD StatusType,PVOID StatusInfo);
181   typedef DWORD (WINAPI *PQUERY_POWER)(DWORD PowerType);
182   typedef DWORD (WINAPI *PSET_POWER)(DWORD PowerType);
183   typedef DWORD (WINAPI *PGET_GLOBAL_INFO)(PVOID GlobalInfo,PULONG BufferSize,PULONG StructureVersion,PULONG StructureSize,PULONG StructureCount);
184   typedef DWORD (WINAPI *PSET_GLOBAL_INFO)(PVOID GlobalInfo,ULONG StructureVersion,ULONG StructureSize,ULONG StructureCount);
185   typedef DWORD (WINAPI *PDO_UPDATE_ROUTES)(ULONG InterfaceIndex);
186   typedef DWORD (WINAPI *PMIB_CREATE)(ULONG InputDataSize,PVOID InputData);
187   typedef DWORD (WINAPI *PMIB_DELETE)(ULONG InputDataSize,PVOID InputData);
188   typedef DWORD (WINAPI *PMIB_GET)(ULONG InputDataSize,PVOID InputData,PULONG OutputDataSize,PVOID OutputData);
189   typedef DWORD (WINAPI *PMIB_SET)(ULONG InputDataSize,PVOID InputData);
190   typedef DWORD (WINAPI *PMIB_GET_FIRST)(ULONG InputDataSize,PVOID InputData,PULONG OutputDataSize,PVOID OutputData);
191   typedef DWORD (WINAPI *PMIB_GET_NEXT)(ULONG InputDataSize,PVOID InputData,PULONG OutputDataSize,PVOID OutputData);
192   typedef DWORD (WINAPI *PMIB_SET_TRAP_INFO)(HANDLE Event,ULONG InputDataSize,PVOID InputData,PULONG OutputDataSize,PVOID OutputData);
193   typedef DWORD (WINAPI *PMIB_GET_TRAP_INFO)(ULONG InputDataSize,PVOID InputData,PULONG OutputDataSize,PVOID OutputData);
194   typedef DWORD (WINAPI *PCONNECT_CLIENT)(ULONG InterfaceIndex,PVOID ClientAddress);
195   typedef DWORD (WINAPI *PDISCONNECT_CLIENT)(ULONG InterfaceIndex,PVOID ClientAddress);
196 
197 #define MRINFO_TUNNEL_FLAG 0x01
198 #define MRINFO_PIM_FLAG 0x04
199 #define MRINFO_DOWN_FLAG 0x10
200 #define MRINFO_DISABLED_FLAG 0x20
201 #define MRINFO_QUERIER_FLAG 0x40
202 #define MRINFO_LEAF_FLAG 0x80
203 
204   typedef DWORD (WINAPI *PGET_NEIGHBORS)(DWORD InterfaceIndex,PDWORD NeighborList,PDWORD NeighborListSize,PBYTE InterfaceFlags);
205 
206 #define MFE_NO_ERROR 0
207 #define MFE_REACHED_CORE 1
208 
209 #define MFE_OIF_PRUNED 5
210 
211 #define MFE_PRUNED_UPSTREAM 4
212 #define MFE_OLD_ROUTER 11
213 
214 #define MFE_NOT_FORWARDING 2
215 #define MFE_WRONG_IF 3
216 #define MFE_BOUNDARY_REACHED 6
217 #define MFE_NO_MULTICAST 7
218 #define MFE_IIF 8
219 #define MFE_NO_ROUTE 9
220 #define MFE_NOT_LAST_HOP 10
221 #define MFE_PROHIBITED 12
222 #define MFE_NO_SPACE 13
223 
224   typedef DWORD (WINAPI *PGET_MFE_STATUS)(DWORD InterfaceIndex,DWORD GroupAddress,DWORD SourceAddress,PBYTE StatusCode);
225 
226   typedef struct _MPR50_ROUTING_CHARACTERISTICS {
227     DWORD dwVersion;
228     DWORD dwProtocolId;
229     DWORD fSupportedFunctionality;
230     PSTART_PROTOCOL pfnStartProtocol;
231     PSTART_COMPLETE pfnStartComplete;
232     PSTOP_PROTOCOL pfnStopProtocol;
233     PGET_GLOBAL_INFO pfnGetGlobalInfo;
234     PSET_GLOBAL_INFO pfnSetGlobalInfo;
235     PQUERY_POWER pfnQueryPower;
236     PSET_POWER pfnSetPower;
237     PADD_INTERFACE pfnAddInterface;
238     PDELETE_INTERFACE pfnDeleteInterface;
239     PINTERFACE_STATUS pfnInterfaceStatus;
240     PGET_INTERFACE_INFO pfnGetInterfaceInfo;
241     PSET_INTERFACE_INFO pfnSetInterfaceInfo;
242     PGET_EVENT_MESSAGE pfnGetEventMessage;
243     PDO_UPDATE_ROUTES pfnUpdateRoutes;
244     PCONNECT_CLIENT pfnConnectClient;
245     PDISCONNECT_CLIENT pfnDisconnectClient;
246     PGET_NEIGHBORS pfnGetNeighbors;
247     PGET_MFE_STATUS pfnGetMfeStatus;
248     PMIB_CREATE pfnMibCreateEntry;
249     PMIB_DELETE pfnMibDeleteEntry;
250     PMIB_GET pfnMibGetEntry;
251     PMIB_SET pfnMibSetEntry;
252     PMIB_GET_FIRST pfnMibGetFirstEntry;
253     PMIB_GET_NEXT pfnMibGetNextEntry;
254     PMIB_SET_TRAP_INFO pfnMibSetTrapInfo;
255     PMIB_GET_TRAP_INFO pfnMibGetTrapInfo;
256   } MPR50_ROUTING_CHARACTERISTICS;
257 
258 #if MPR50
259   typedef MPR50_ROUTING_CHARACTERISTICS MPR_ROUTING_CHARACTERISTICS;
260 #endif
261 
262   typedef MPR_ROUTING_CHARACTERISTICS *PMPR_ROUTING_CHARACTERISTICS;
263 
264 #define REGISTER_PROTOCOL_ENTRY_POINT RegisterProtocol
265 #define REGISTER_PROTOCOL_ENTRY_POINT_STRING "RegisterProtocol"
266 
267   typedef DWORD (WINAPI *PREGISTER_PROTOCOL) (PMPR_ROUTING_CHARACTERISTICS pRoutingChar,PMPR_SERVICE_CHARACTERISTICS pServiceChar);
268 
269 #ifdef __cplusplus
270 }
271 #endif
272 #endif
273