More work on winsock stack (ping is now working)
[reactos.git] / reactos / drivers / net / afd / include / afd.h
index a4dd851..269b75e 100644 (file)
@@ -60,6 +60,7 @@ typedef struct _FsdNTRequiredFCB {
 typedef struct _AFDFCB {
     FsdNTRequiredFCB    NTRequiredFCB;
     LIST_ENTRY          ListEntry;
+    BOOL                CommandChannel;
     PDEVICE_EXTENSION   DeviceExt;
     SHARE_ACCESS        ShareAccess;
     ULONG               ReferenceCount;
@@ -72,10 +73,16 @@ typedef struct _AFDFCB {
     INT                 AddressFamily;
     INT                 SocketType;
     INT                 Protocol;
+    SOCKADDR            SocketName;
     PVOID               HelperContext;
     DWORD               NotificationEvents;
     UNICODE_STRING      TdiDeviceName;
     DWORD               State;
+    PVOID               SendBuffer;
+    LIST_ENTRY          ReceiveQueue;
+    KSPIN_LOCK          ReceiveQueueLock;
+    LIST_ENTRY          ReadRequestQueue;
+    KSPIN_LOCK          ReadRequestQueueLock;
 } AFDFCB, *PAFDFCB;
 
 /* Socket states */
@@ -83,6 +90,18 @@ typedef struct _AFDFCB {
 #define SOCKET_STATE_BOUND      1
 #define SOCKET_STATE_LISTENING  2
 
+typedef struct _AFD_BUFFER {
+  LIST_ENTRY ListEntry;
+  WSABUF Buffer;
+} AFD_BUFFER, *PAFD_BUFFER;
+
+typedef struct _AFD_READ_REQUEST {
+  LIST_ENTRY ListEntry;
+  PIRP Irp;
+  PFILE_REQUEST_RECVFROM RecvFromRequest;
+  PFILE_REPLY_RECVFROM RecvFromReply;
+} AFD_READ_REQUEST, *PAFD_READ_REQUEST;
+
 typedef struct IPSNMP_INFO {
        ULONG Forwarding;
        ULONG DefaultTTL;
@@ -126,6 +145,21 @@ typedef struct IPADDR_ENTRY {
 #define IP_MIB_ADDRTABLE_ENTRY_ID   0x102
 
 
+/* IPv4 header format */
+typedef struct IPv4_HEADER {
+    UCHAR VerIHL;                /* 4-bit version, 4-bit Internet Header Length */
+    UCHAR Tos;                   /* Type of Service */
+    USHORT TotalLength;          /* Total Length */
+    USHORT Id;                   /* Identification */
+    USHORT FlagsFragOfs;         /* 3-bit Flags, 13-bit Fragment Offset */
+    UCHAR Ttl;                   /* Time to Live */
+    UCHAR Protocol;              /* Protocol */
+    USHORT Checksum;             /* Header Checksum */
+    ULONG SrcAddr;               /* Source Address */
+    ULONG DstAddr;               /* Destination Address */
+} IPv4_HEADER, *PIPv4_HEADER;
+
+
 /* IOCTL codes */
 
 #define IOCTL_TCP_QUERY_INFORMATION_EX \
@@ -182,6 +216,10 @@ typedef struct IPADDR_ENTRY {
 #endif /* i386 */
 
 
+extern NPAGED_LOOKASIDE_LIST BufferLookasideList;
+extern NPAGED_LOOKASIDE_LIST ReadRequestLookasideList;
+
+
 /* Prototypes from dispatch.c */
 
 NTSTATUS AfdDispBind(
@@ -200,6 +238,10 @@ NTSTATUS AfdDispRecvFrom(
     PIRP Irp,
     PIO_STACK_LOCATION IrpSp);
 
+NTSTATUS AfdDispSelect(
+    PIRP Irp,
+    PIO_STACK_LOCATION IrpSp);
+
 /* Prototypes from event.c */
 
 NTSTATUS AfdRegisterEventHandlers(
@@ -210,15 +252,11 @@ NTSTATUS AfdDeregisterEventHandlers(
 
 /* Prototypes from opnclose.c */
 
-NTSTATUS AfdCreate(
-    PDEVICE_OBJECT DeviceObject,
-    PIRP Irp);
-
-NTSTATUS AfdCreateNamedPipe(
+NTSTATUS STDCALL AfdCreate(
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp);
 
-NTSTATUS AfdClose(
+NTSTATUS STDCALL AfdClose(
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp);
 
@@ -237,14 +275,40 @@ NTSTATUS AfdEventReceiveDatagramHandler(
     IN PVOID Tsdu,
     OUT PIRP * IoRequestPacket);
 
-NTSTATUS AfdRead(
+NTSTATUS STDCALL AfdRead(
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp);
 
-NTSTATUS AfdWrite(
+NTSTATUS STDCALL AfdWrite(
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp);
 
+/* Prototypes from routines.c */
+
+ULONG WSABufferSize(
+    LPWSABUF Buffers,
+    DWORD BufferCount);
+
+NTSTATUS MergeWSABuffers(
+    LPWSABUF Buffers,
+    DWORD BufferCount,
+    PVOID Destination,
+    ULONG MaxLength,
+    PULONG BytesCopied);
+
+NTSTATUS FillWSABuffers(
+    PAFDFCB FCB,
+    LPWSABUF Buffers,
+    DWORD BufferCount,
+    PULONG BytesCopied);
+
+VOID BuildIPv4Header(
+    PIPv4_HEADER IPHeader,
+    ULONG TotalSize,
+    ULONG Protocol,
+    PSOCKADDR SourceAddress,
+    PSOCKADDR DestinationAddress);
+
 /* Prototypes from tdi.c */
 
 NTSTATUS TdiCloseDevice(
@@ -257,6 +321,12 @@ NTSTATUS TdiOpenAddressFileIPv4(
     PHANDLE AddressHandle,
     PFILE_OBJECT *AddressObject);
 
+NTSTATUS TdiOpenAddressFile(
+    PUNICODE_STRING DeviceName,
+    LPSOCKADDR Name,
+    PHANDLE AddressHandle,
+    PFILE_OBJECT *AddressObject);
+
 NTSTATUS TdiSetEventHandler(
     PFILE_OBJECT FileObject,
     LONG EventType,
@@ -288,12 +358,13 @@ NTSTATUS TdiQueryAddress(
 
 NTSTATUS TdiSend(
     PFILE_OBJECT TransportObject,
-    PFILE_REQUEST_SENDTO Request);
+    PVOID Buffer,
+    ULONG BufferSize);
 
 NTSTATUS TdiSendDatagram(
     PFILE_OBJECT TransportObject,
     LPSOCKADDR Address,
-    PVOID Buffer,
+    PMDL Mdl,
     ULONG BufferSize);
 
 #endif /*__AFD_H */