mirror of
https://github.com/reactos/reactos.git
synced 2024-09-25 12:10:42 +00:00
28bfa5fcdd
Fixed address pass-through in afd. Fixed some address cruft in udp and datagram regarding incoming datagrams. svn path=/trunk/; revision=11671
297 lines
7.7 KiB
C
297 lines
7.7 KiB
C
/* $Id: afd.h,v 1.23 2004/11/15 18:24:57 arty Exp $
|
|
*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS kernel
|
|
* FILE: drivers/net/afd/include/afd.h
|
|
* PURPOSE: Ancillary functions driver -- constants and structures
|
|
* PROGRAMMER: Art Yerkes (ayerkes@speakeasy.net)
|
|
* UPDATE HISTORY:
|
|
* 20040630 Created
|
|
*/
|
|
|
|
#ifndef _AFD_H
|
|
#define _AFD_H
|
|
|
|
#include <ntddk.h>
|
|
#include <tdi.h>
|
|
#include <tdikrnl.h>
|
|
#include <tdiinfo.h>
|
|
#include <string.h>
|
|
#include <ndis.h>
|
|
#include <shared.h>
|
|
|
|
#ifndef _MSC_VER
|
|
#include <roscfg.h>
|
|
#include <rosrtl/string.h>
|
|
#include <winsock2.h>
|
|
#include <ddk/tdi.h>
|
|
#include <ddk/ndis.h>
|
|
#include <tcpmisc.h>
|
|
#include <tcpioctl.h>
|
|
#else
|
|
#include <ntdef.h>
|
|
#define STDCALL
|
|
#endif
|
|
|
|
#ifndef MIN
|
|
#define MIN(x,y) (((x)<(y))?(x):(y))
|
|
#endif
|
|
|
|
#define SOCKET_STATE_INVALID_TRANSITION ((DWORD)-1)
|
|
#define SOCKET_STATE_CREATED 0
|
|
#define SOCKET_STATE_BOUND 1
|
|
#define SOCKET_STATE_CONNECTING 2
|
|
#define SOCKET_STATE_CONNECTED 3
|
|
#define SOCKET_STATE_LISTENING 4
|
|
#define SOCKET_STATE_MASK 0x0000ffff
|
|
#define SOCKET_STATE_LOCKED 0x40000000
|
|
#define SOCKET_STATE_NEW 0x80000000
|
|
#define SOCKET_STATE_CLOSED 0x00000100
|
|
|
|
#define FUNCTION_CONNECT 0
|
|
#define FUNCTION_RECV 1
|
|
#define FUNCTION_SEND 2
|
|
#define FUNCTION_CLOSE 3
|
|
#define MAX_FUNCTIONS 4
|
|
|
|
#define IN_FLIGHT_REQUESTS 3
|
|
|
|
#define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed
|
|
* for ancillary data on packet
|
|
* requests. */
|
|
|
|
#define DEFAULT_SEND_WINDOW_SIZE 16384
|
|
#define DEFAULT_RECEIVE_WINDOW_SIZE 16384
|
|
|
|
#define SGID_CONNECTIONLESS 1 /* XXX Find this flag */
|
|
|
|
typedef struct _AFD_MAPBUF {
|
|
PVOID BufferAddress;
|
|
PMDL Mdl;
|
|
} AFD_MAPBUF, *PAFD_MAPBUF;
|
|
|
|
typedef struct _AFD_DEVICE_EXTENSION {
|
|
PDEVICE_OBJECT DeviceObject;
|
|
LIST_ENTRY Polls;
|
|
KSPIN_LOCK Lock;
|
|
} AFD_DEVICE_EXTENSION, *PAFD_DEVICE_EXTENSION;
|
|
|
|
typedef struct _AFD_ACTIVE_POLL {
|
|
LIST_ENTRY ListEntry;
|
|
PIRP Irp;
|
|
PAFD_DEVICE_EXTENSION DeviceExt;
|
|
KDPC TimeoutDpc;
|
|
KTIMER Timer;
|
|
} AFD_ACTIVE_POLL, *PAFD_ACTIVE_POLL;
|
|
|
|
typedef struct _IRP_LIST {
|
|
LIST_ENTRY ListEntry;
|
|
PIRP Irp;
|
|
} IRP_LIST, *PIRP_LIST;
|
|
|
|
typedef struct _AFD_TDI_OBJECT {
|
|
PFILE_OBJECT Object;
|
|
HANDLE Handle;
|
|
} AFD_TDI_OBJECT, *PAFD_TDI_OBJECT;
|
|
|
|
typedef struct _AFD_IN_FLIGHT_REQUEST {
|
|
PIRP InFlightRequest;
|
|
IO_STATUS_BLOCK Iosb;
|
|
PTDI_CONNECTION_INFORMATION ConnectionInfo;
|
|
} AFD_IN_FLIGHT_REQUEST, *PAFD_IN_FLIGHT_REQUEST;
|
|
|
|
typedef struct _AFD_DATA_WINDOW {
|
|
PCHAR Window;
|
|
UINT BytesUsed, Size, Content;
|
|
} AFD_DATA_WINDOW, *PAFD_DATA_WINDOW;
|
|
|
|
typedef struct _AFD_STORED_DATAGRAM {
|
|
LIST_ENTRY ListEntry;
|
|
UINT Len;
|
|
PTRANSPORT_ADDRESS Address;
|
|
CHAR Buffer[1];
|
|
} AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
|
|
|
|
typedef struct _AFD_FCB {
|
|
BOOLEAN Locked, Critical;
|
|
UINT State, Flags;
|
|
KIRQL OldIrql;
|
|
UINT LockCount;
|
|
PVOID CurrentThread;
|
|
KSPIN_LOCK SpinLock;
|
|
PFILE_OBJECT FileObject;
|
|
PAFD_DEVICE_EXTENSION DeviceExt;
|
|
BOOLEAN DelayedAccept;
|
|
PTRANSPORT_ADDRESS LocalAddress, RemoteAddress;
|
|
PTDI_CONNECTION_INFORMATION AddressFrom;
|
|
AFD_TDI_OBJECT AddressFile, Connection;
|
|
AFD_IN_FLIGHT_REQUEST ListenIrp, ReceiveIrp, SendIrp;
|
|
AFD_DATA_WINDOW Send, Recv;
|
|
FAST_MUTEX Mutex;
|
|
KEVENT StateLockedEvent;
|
|
UNICODE_STRING TdiDeviceName;
|
|
PVOID Context;
|
|
DWORD PollState;
|
|
UINT ContextSize;
|
|
PIRP PendingTdiIrp;
|
|
LIST_ENTRY PendingIrpList[MAX_FUNCTIONS];
|
|
LIST_ENTRY DatagramList;
|
|
} AFD_FCB, *PAFD_FCB;
|
|
|
|
/* bind.c */
|
|
|
|
NTSTATUS WarmSocketForBind( PAFD_FCB FCB );
|
|
NTSTATUS STDCALL
|
|
AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|
PIO_STACK_LOCATION IrpSp);
|
|
|
|
/* connect.c */
|
|
|
|
NTSTATUS WarmSocketForConnection( PAFD_FCB FCB );
|
|
NTSTATUS STDCALL
|
|
AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|
PIO_STACK_LOCATION IrpSp);
|
|
|
|
/* context.c */
|
|
|
|
NTSTATUS STDCALL
|
|
AfdGetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|
PIO_STACK_LOCATION IrpSp );
|
|
NTSTATUS STDCALL
|
|
AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|
PIO_STACK_LOCATION IrpSp );
|
|
|
|
/* info.c */
|
|
|
|
NTSTATUS STDCALL
|
|
AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|
PIO_STACK_LOCATION IrpSp );
|
|
|
|
/* listen.c */
|
|
|
|
NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|
PIO_STACK_LOCATION IrpSp);
|
|
|
|
/* lock.c */
|
|
|
|
PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
|
|
PVOID AddressBuf, PINT AddressLen,
|
|
BOOLEAN Write, BOOLEAN LockAddress );
|
|
VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address );
|
|
UINT SocketAcquireStateLock( PAFD_FCB FCB );
|
|
NTSTATUS DDKAPI UnlockAndMaybeComplete
|
|
( PAFD_FCB FCB, NTSTATUS Status, PIRP Irp,
|
|
UINT Information,
|
|
PIO_COMPLETION_ROUTINE Completion,
|
|
BOOL ShouldUnlockIrp );
|
|
VOID SocketStateUnlock( PAFD_FCB FCB );
|
|
NTSTATUS LostSocket( PIRP Irp, BOOL ShouldUnlockIrp );
|
|
PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
|
|
VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
|
|
VOID SocketCalloutEnter( PAFD_FCB FCB );
|
|
VOID SocketCalloutLeave( PAFD_FCB FCB );
|
|
|
|
/* main.c */
|
|
|
|
VOID OskitDumpBuffer( PCHAR Buffer, UINT Len );
|
|
NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function );
|
|
VOID DestroySocket( PAFD_FCB FCB );
|
|
|
|
/* read.c */
|
|
|
|
NTSTATUS DDKAPI ReceiveComplete
|
|
( PDEVICE_OBJECT DeviceObject,
|
|
PIRP Irp,
|
|
PVOID Context );
|
|
|
|
NTSTATUS DDKAPI PacketSocketRecvComplete
|
|
( PDEVICE_OBJECT DeviceObject,
|
|
PIRP Irp,
|
|
PVOID Context );
|
|
|
|
NTSTATUS STDCALL
|
|
AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|
PIO_STACK_LOCATION IrpSp, BOOLEAN Short);
|
|
NTSTATUS STDCALL
|
|
AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|
PIO_STACK_LOCATION IrpSp );
|
|
|
|
/* select.c */
|
|
|
|
NTSTATUS STDCALL
|
|
AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|
PIO_STACK_LOCATION IrpSp );
|
|
VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceObject, PFILE_OBJECT FileObject );
|
|
|
|
/* tdi.c */
|
|
|
|
NTSTATUS TdiOpenAddressFile(
|
|
PUNICODE_STRING DeviceName,
|
|
PTRANSPORT_ADDRESS Name,
|
|
PHANDLE AddressHandle,
|
|
PFILE_OBJECT *AddressObject);
|
|
|
|
NTSTATUS TdiAssociateAddressFile(
|
|
HANDLE AddressHandle,
|
|
PFILE_OBJECT ConnectionObject);
|
|
|
|
NTSTATUS TdiListen
|
|
( PIRP *Irp,
|
|
PFILE_OBJECT ConnectionObject,
|
|
PTDI_CONNECTION_INFORMATION *RequestConnectionInfo,
|
|
PIO_STATUS_BLOCK Iosb,
|
|
PIO_COMPLETION_ROUTINE CompletionRoutine,
|
|
PVOID CompletionContext);
|
|
|
|
NTSTATUS TdiReceive
|
|
( PIRP *Irp,
|
|
PFILE_OBJECT ConnectionObject,
|
|
USHORT Flags,
|
|
PCHAR Buffer,
|
|
UINT BufferLength,
|
|
PIO_STATUS_BLOCK Iosb,
|
|
PIO_COMPLETION_ROUTINE CompletionRoutine,
|
|
PVOID CompletionContext);
|
|
|
|
NTSTATUS TdiSend
|
|
( PIRP *Irp,
|
|
PFILE_OBJECT ConnectionObject,
|
|
USHORT Flags,
|
|
PCHAR Buffer,
|
|
UINT BufferLength,
|
|
PIO_STATUS_BLOCK Iosb,
|
|
PIO_COMPLETION_ROUTINE CompletionRoutine,
|
|
PVOID CompletionContext);
|
|
|
|
NTSTATUS TdiReceiveDatagram(
|
|
PIRP *Irp,
|
|
PFILE_OBJECT TransportObject,
|
|
USHORT Flags,
|
|
PCHAR Buffer,
|
|
UINT BufferLength,
|
|
PTDI_CONNECTION_INFORMATION From,
|
|
PIO_STATUS_BLOCK Iosb,
|
|
PIO_COMPLETION_ROUTINE CompletionRoutine,
|
|
PVOID CompletionContext);
|
|
|
|
NTSTATUS TdiSendDatagram(
|
|
PIRP *Irp,
|
|
PFILE_OBJECT TransportObject,
|
|
PCHAR Buffer,
|
|
UINT BufferLength,
|
|
PTDI_CONNECTION_INFORMATION To,
|
|
PIO_STATUS_BLOCK Iosb,
|
|
PIO_COMPLETION_ROUTINE CompletionRoutine,
|
|
PVOID CompletionContext);
|
|
|
|
/* write.c */
|
|
|
|
NTSTATUS STDCALL
|
|
AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|
PIO_STACK_LOCATION IrpSp, BOOLEAN Short);
|
|
NTSTATUS STDCALL
|
|
AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|
PIO_STACK_LOCATION IrpSp);
|
|
|
|
#endif/*_AFD_H*/
|