f6e2291e350fd930b1612ac7bcafb12dbb27e7ba
[reactos.git] / drivers / net / afd / include / afd.h
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS Ancillary Function Driver
4  * FILE:        include/afd.h
5  * PURPOSE:     Main driver header
6  */
7 #ifndef __AFD_H
8 #define __AFD_H
9
10 #include <winsock2.h>
11 #include <ddk/ntddk.h>
12 #include <net/tdikrnl.h>
13 #include <net/tdiinfo.h>
14 #include <afd/shared.h>
15 #include <debug.h>
16
17 /* Forward declarations */
18 struct _AFDFCB;
19
20 typedef struct _DEVICE_EXTENSION {
21     PDEVICE_OBJECT StorageDevice;
22     KSPIN_LOCK FCBListLock;
23     LIST_ENTRY FCBListHead;
24 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
25
26 /* Context Control Block structure */
27 typedef struct _AFDCCB {
28         struct _AFDFCB *FCB;
29         LIST_ENTRY      ListEntry;
30         PFILE_OBJECT    FileObject;
31         ULONG           Flags;
32         LARGE_INTEGER   CurrentByteOffset;
33 } AFDCCB, *PAFDCCB;
34
35 /* Flags for CCB structure */
36 #define CCB_CLEANED     0x00000001
37
38 typedef struct _FsdNTRequiredFCB {
39     FSRTL_COMMON_FCB_HEADER CommonFCBHeader;
40     SECTION_OBJECT_POINTERS SectionObject;
41     ERESOURCE               MainResource;
42     ERESOURCE               PagingIoResource;
43 } FsdNTRequiredFCB, *PFsdNTRequiredFCB;
44
45 typedef struct _AFDFCB {
46     FsdNTRequiredFCB    NTRequiredFCB;
47     LIST_ENTRY          ListEntry;
48     BOOL                CommandChannel;
49     PDEVICE_EXTENSION   DeviceExt;
50     SHARE_ACCESS        ShareAccess;
51     ULONG               ReferenceCount;
52     ULONG               OpenHandleCount;
53     HANDLE              TdiAddressObjectHandle;
54     PFILE_OBJECT        TdiAddressObject;
55     HANDLE              TdiConnectionObjectHandle;
56     PFILE_OBJECT        TdiConnectionObject;
57     LIST_ENTRY          CCBListHead;
58     INT                 AddressFamily;
59     INT                 SocketType;
60     INT                 Protocol;
61     SOCKADDR            SocketName;
62     PVOID               HelperContext;
63     DWORD               NotificationEvents;
64     UNICODE_STRING      TdiDeviceName;
65     DWORD               State;
66     PVOID               SendBuffer;
67     LIST_ENTRY          ReceiveQueue;
68     KSPIN_LOCK          ReceiveQueueLock;
69     LIST_ENTRY          ReadRequestQueue;
70     KSPIN_LOCK          ReadRequestQueueLock;
71     /* For WSAEventSelect() */
72     WSANETWORKEVENTS    NetworkEvents;
73     WSAEVENT            EventObjects[FD_MAX_EVENTS];
74 } AFDFCB, *PAFDFCB;
75
76 /* Socket states */
77 #define SOCKET_STATE_CREATED    0
78 #define SOCKET_STATE_BOUND      1
79 #define SOCKET_STATE_LISTENING  2
80 #define SOCKET_STATE_CONNECTED  3
81
82 typedef struct _AFD_BUFFER {
83   LIST_ENTRY ListEntry;
84   WSABUF Buffer;
85 } AFD_BUFFER, *PAFD_BUFFER;
86
87 typedef struct _AFD_READ_REQUEST {
88   LIST_ENTRY ListEntry;
89   PIRP Irp;
90   PFILE_REQUEST_RECVFROM RecvFromRequest;
91   PFILE_REPLY_RECVFROM RecvFromReply;
92 } AFD_READ_REQUEST, *PAFD_READ_REQUEST;
93
94 typedef struct IPSNMP_INFO {
95         ULONG Forwarding;
96         ULONG DefaultTTL;
97         ULONG InReceives;
98         ULONG InHdrErrors;
99         ULONG InAddrErrors;
100         ULONG ForwDatagrams;
101         ULONG InUnknownProtos;
102         ULONG InDiscards;
103         ULONG InDelivers;
104         ULONG OutRequests;
105         ULONG RoutingDiscards;
106         ULONG OutDiscards;
107         ULONG OutNoRoutes;
108         ULONG ReasmTimeout;
109         ULONG ReasmReqds;
110         ULONG ReasmOks;
111         ULONG ReasmFails;
112         ULONG FragOks;
113         ULONG FragFails;
114         ULONG FragCreates;
115         ULONG NumIf;
116         ULONG NumAddr;
117         ULONG NumRoutes;
118 } IPSNMP_INFO, *PIPSNMP_INFO;
119
120 typedef struct IPADDR_ENTRY {
121         ULONG  Addr;
122         ULONG  Index;
123         ULONG  Mask;
124         ULONG  BcastAddr;
125         ULONG  ReasmSize;
126         USHORT Context;
127         USHORT Pad;
128 } IPADDR_ENTRY, *PIPADDR_ENTRY;
129
130
131 #define TL_INSTANCE 0
132
133 #define IP_MIB_STATS_ID             0x1
134 #define IP_MIB_ADDRTABLE_ENTRY_ID   0x102
135
136
137 /* IPv4 header format */
138 typedef struct IPv4_HEADER {
139     UCHAR VerIHL;                /* 4-bit version, 4-bit Internet Header Length */
140     UCHAR Tos;                   /* Type of Service */
141     USHORT TotalLength;          /* Total Length */
142     USHORT Id;                   /* Identification */
143     USHORT FlagsFragOfs;         /* 3-bit Flags, 13-bit Fragment Offset */
144     UCHAR Ttl;                   /* Time to Live */
145     UCHAR Protocol;              /* Protocol */
146     USHORT Checksum;             /* Header Checksum */
147     ULONG SrcAddr;               /* Source Address */
148     ULONG DstAddr;               /* Destination Address */
149 } IPv4_HEADER, *PIPv4_HEADER;
150
151
152 /* IOCTL codes */
153
154 #define IOCTL_TCP_QUERY_INFORMATION_EX \
155             CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
156
157 #define IOCTL_TCP_SET_INFORMATION_EX  \
158             CTL_CODE(FILE_DEVICE_NETWORK, 1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
159
160
161 #ifdef i386
162
163 /* DWORD network to host byte order conversion for i386 */
164 #define DN2H(dw) \
165     ((((dw) & 0xFF000000L) >> 24) | \
166          (((dw) & 0x00FF0000L) >> 8) | \
167          (((dw) & 0x0000FF00L) << 8) | \
168          (((dw) & 0x000000FFL) << 24))
169
170 /* DWORD host to network byte order conversion for i386 */
171 #define DH2N(dw) \
172         ((((dw) & 0xFF000000L) >> 24) | \
173          (((dw) & 0x00FF0000L) >> 8) | \
174          (((dw) & 0x0000FF00L) << 8) | \
175          (((dw) & 0x000000FFL) << 24))
176
177 /* WORD network to host order conversion for i386 */
178 #define WN2H(w) \
179         ((((w) & 0xFF00) >> 8) | \
180          (((w) & 0x00FF) << 8))
181
182 /* WORD host to network byte order conversion for i386 */
183 #define WH2N(w) \
184         ((((w) & 0xFF00) >> 8) | \
185          (((w) & 0x00FF) << 8))
186
187 #else /* i386 */
188
189 /* DWORD network to host byte order conversion for other architectures */
190 #define DN2H(dw) \
191     (dw)
192
193 /* DWORD host to network byte order conversion for other architectures */
194 #define DH2N(dw) \
195     (dw)
196
197 /* WORD network to host order conversion for other architectures */
198 #define WN2H(w) \
199     (w)
200
201 /* WORD host to network byte order conversion for other architectures */
202 #define WH2N(w) \
203     (w)
204
205 #endif /* i386 */
206
207
208 extern NPAGED_LOOKASIDE_LIST BufferLookasideList;
209 extern NPAGED_LOOKASIDE_LIST ReadRequestLookasideList;
210
211
212 /* Prototypes from dispatch.c */
213
214 NTSTATUS AfdDispBind(
215     PIRP Irp,
216     PIO_STACK_LOCATION IrpSp);
217
218 NTSTATUS AfdDispListen(
219     PIRP Irp,
220     PIO_STACK_LOCATION IrpSp);
221
222 NTSTATUS AfdDispSendTo(
223     PIRP Irp,
224     PIO_STACK_LOCATION IrpSp);
225
226 NTSTATUS AfdDispRecvFrom(
227     PIRP Irp,
228     PIO_STACK_LOCATION IrpSp);
229
230 NTSTATUS AfdDispSelect(
231     PIRP Irp,
232     PIO_STACK_LOCATION IrpSp);
233
234 NTSTATUS AfdDispEventSelect(
235   PIRP Irp,
236   PIO_STACK_LOCATION IrpSp);
237
238 NTSTATUS AfdDispEnumNetworkEvents(
239     PIRP Irp,
240     PIO_STACK_LOCATION IrpSp);
241
242 NTSTATUS AfdDispRecv(
243     PIRP Irp,
244     PIO_STACK_LOCATION IrpSp);
245
246 NTSTATUS AfdDispSend(
247     PIRP Irp,
248     PIO_STACK_LOCATION IrpSp);
249
250 NTSTATUS AfdDispConnect(
251   PIRP Irp,
252   PIO_STACK_LOCATION IrpSp);
253
254 /* Prototypes from event.c */
255
256 NTSTATUS AfdRegisterEventHandlers(
257     PAFDFCB FCB);
258
259 NTSTATUS AfdDeregisterEventHandlers(
260     PAFDFCB FCB);
261
262 /* Prototypes from opnclose.c */
263
264 NTSTATUS STDCALL AfdCreate(
265     PDEVICE_OBJECT DeviceObject,
266     PIRP Irp);
267
268 NTSTATUS STDCALL AfdClose(
269     PDEVICE_OBJECT DeviceObject,
270     PIRP Irp);
271
272 /* Prototypes from rdwr.c */
273
274 NTSTATUS AfdEventReceiveDatagramHandler(
275     IN PVOID TdiEventContext,
276     IN LONG SourceAddressLength,
277     IN PVOID SourceAddress,
278     IN LONG OptionsLength,
279     IN PVOID Options,
280     IN ULONG ReceiveDatagramFlags,
281     IN ULONG BytesIndicated,
282     IN ULONG BytesAvailable,
283     OUT ULONG * BytesTaken,
284     IN PVOID Tsdu,
285     OUT PIRP * IoRequestPacket);
286
287 NTSTATUS STDCALL AfdRead(
288     PDEVICE_OBJECT DeviceObject,
289     PIRP Irp);
290
291 NTSTATUS STDCALL AfdWrite(
292     PDEVICE_OBJECT DeviceObject,
293     PIRP Irp);
294
295 /* Prototypes from routines.c */
296
297 ULONG WSABufferSize(
298     LPWSABUF Buffers,
299     DWORD BufferCount);
300
301 NTSTATUS MergeWSABuffers(
302     LPWSABUF Buffers,
303     DWORD BufferCount,
304     PVOID Destination,
305     ULONG MaxLength,
306     PULONG BytesCopied);
307
308 NTSTATUS FillWSABuffers(
309     PAFDFCB FCB,
310     LPWSABUF Buffers,
311     DWORD BufferCount,
312     PULONG BytesCopied);
313
314 VOID BuildIPv4Header(
315     PIPv4_HEADER IPHeader,
316     ULONG TotalSize,
317     ULONG Protocol,
318     PSOCKADDR SourceAddress,
319     PSOCKADDR DestinationAddress);
320
321 /* Prototypes from tdi.c */
322
323 NTSTATUS TdiCloseDevice(
324   HANDLE Handle,
325   PFILE_OBJECT FileObject);
326
327 NTSTATUS TdiOpenAddressFileIPv4(
328   PUNICODE_STRING DeviceName,
329   LPSOCKADDR Name,
330   PHANDLE AddressHandle,
331   PFILE_OBJECT *AddressObject);
332
333 NTSTATUS TdiOpenAddressFile(
334   PUNICODE_STRING DeviceName,
335   LPSOCKADDR Name,
336   PHANDLE AddressHandle,
337   PFILE_OBJECT *AddressObject);
338
339 NTSTATUS TdiOpenConnectionEndpointFile(
340   PUNICODE_STRING DeviceName,
341   PHANDLE ConnectionHandle,
342   PFILE_OBJECT *ConnectionObject);
343
344 NTSTATUS TdiConnect(
345   PFILE_OBJECT ConnectionObject,
346   LPSOCKADDR RemoteAddress);
347
348 NTSTATUS TdiAssociateAddressFile(
349   HANDLE AddressHandle,
350   PFILE_OBJECT ConnectionObject);
351
352 NTSTATUS TdiSetEventHandler(
353   PFILE_OBJECT FileObject,
354   LONG EventType,
355   PVOID Handler,
356   PVOID Context);
357
358 NTSTATUS TdiQueryDeviceControl(
359   PFILE_OBJECT FileObject,
360   ULONG IoControlCode,
361   PVOID InputBuffer,
362   ULONG InputBufferLength,
363   PVOID OutputBuffer,
364   ULONG OutputBufferLength,
365   PULONG Return);
366
367 NTSTATUS TdiQueryInformationEx(
368   PFILE_OBJECT FileObject,
369   ULONG Entity,
370   ULONG Instance,
371   ULONG Class,
372   ULONG Type,
373   ULONG Id,
374   PVOID OutputBuffer,
375   PULONG OutputLength);
376
377 NTSTATUS TdiQueryAddress(
378   PFILE_OBJECT FileObject,
379   PULONG Address);
380
381 NTSTATUS TdiSend(
382   PFILE_OBJECT TransportObject,
383   PVOID Buffer,
384   ULONG BufferSize);
385
386 NTSTATUS TdiSendDatagram(
387   PFILE_OBJECT TransportObject,
388   LPSOCKADDR Address,
389   PMDL Mdl,
390   ULONG BufferSize);
391
392 #endif /*__AFD_H */
393
394 /* EOF */