|
|
/*++
Copyright (c) 1989-1993 Microsoft Corporation
Module Name:
spxaddr.h
Abstract:
Author:
Adam Barr (adamba ) Original Version Nikhil Kamkolkar (nikhilk) 11-November-1993
Environment:
Kernel mode
Revision History:
--*/
#define DYNSKT_RANGE_START 0x4000
#define DYNSKT_RANGE_END 0x7FFF
#define SOCKET_UNIQUENESS 1
// This structure is pointed to by the FsContext field in the FILE_OBJECT
// for this Address. This structure is the base for all activities on
// the open file object within the transport provider. All active connections
// on the address point to this structure, although no queues exist here to do
// work from. This structure also maintains a reference to an ADDRESS
// structure, which describes the address that it is bound to.
#define AFREF_CREATE 0
#define AFREF_VERIFY 1
#define AFREF_INDICATION 2
#define AFREF_CONN_ASSOC 3
#define AFREF_TOTAL 4
typedef struct _SPX_ADDR_FILE {
#if DBG
ULONG saf_RefTypes[AFREF_TOTAL]; #endif
CSHORT saf_Type; CSHORT saf_Size;
// number of references to this object.
ULONG saf_RefCount;
// Linkage in address list.
struct _SPX_ADDR_FILE * saf_Next; struct _SPX_ADDR_FILE * saf_GlobalNext;
// List of associated connection/active or otherwise
struct _SPX_CONN_FILE * saf_AssocConnList;
// the current state of the address file structure; this is either open or
// closing
USHORT saf_Flags;
// address to which we are bound, pointer to its lock.
struct _SPX_ADDR * saf_Addr; CTELock * saf_AddrLock;
#ifdef ISN_NT
// easy backlink to file object.
PFILE_OBJECT saf_FileObject; #endif
// device to which we are attached.
struct _DEVICE * saf_Device;
// This holds the request used to close this address file,
// for pended completion.
PREQUEST saf_CloseReq;
// This function pointer points to a connection indication handler for this
// Address. Any time a connect request is received on the address, this
// routine is invoked.
PTDI_IND_CONNECT saf_ConnHandler; PVOID saf_ConnHandlerCtx;
// The following function pointer always points to a TDI_IND_DISCONNECT
// handler for the address.
PTDI_IND_DISCONNECT saf_DiscHandler; PVOID saf_DiscHandlerCtx;
// The following function pointer always points to a TDI_IND_RECEIVE
// event handler for connections on this address.
PTDI_IND_RECEIVE saf_RecvHandler; PVOID saf_RecvHandlerCtx;
// Send possible handler
PTDI_IND_SEND_POSSIBLE saf_SendPossibleHandler; PVOID saf_SendPossibleHandlerCtx;
// !!!We do not do datagrams or expedited data!!!
// The following function pointer always points to a TDI_IND_ERROR
// handler for the address.
PTDI_IND_ERROR saf_ErrHandler; PVOID saf_ErrHandlerCtx; PVOID saf_ErrHandlerOwner;
} SPX_ADDR_FILE, *PSPX_ADDR_FILE;
#define SPX_ADDRFILE_OPENING 0x0000 // not yet open for business
#define SPX_ADDRFILE_OPEN 0x0001 // open for business
#define SPX_ADDRFILE_CLOSING 0x0002 // closing
#define SPX_ADDRFILE_STREAM 0x0004 // Opened for stream mode operation
#define SPX_ADDRFILE_CONNIND 0x0008 // Connect ind in progress
#define SPX_ADDRFILE_SPX2 0x0010 // Attempt SPX2 address file
#define SPX_ADDRFILE_NOACKWAIT 0x0020 // Dont delay acks on assoc connections
#define SPX_ADDRFILE_IPXHDR 0x0040 // Pass ipx hdr on all assoc connections
// ***STOP*** ***STOP*** ***STOP*** ***STOP*** ***STOP*** ***STOP*** ***STOP***
// If you are adding any more states to this beyond 0x0080, MAKE SURE to go
// in code and change statements like (Flags & SPX_***) to
// ((Flags & SPX_**) != 0)!!! I dont want to make that change that at this stage.
// ***STOP*** ***STOP*** ***STOP*** ***STOP*** ***STOP*** ***STOP*** ***STOP***
// This structure defines an ADDRESS, or active transport address,
// maintained by the transport provider. It contains all the visible
// components of the address (such as the TSAP and network name components),
// and it also contains other maintenance parts, such as a reference count,
// ACL, and so on.
#define AREF_ADDR_FILE 0
#define AREF_LOOKUP 1
#define AREF_RECEIVE 2
#define AREF_TOTAL 4
typedef struct _SPX_ADDR {
#if DBG
ULONG sa_RefTypes[AREF_TOTAL]; #endif
USHORT sa_Size; CSHORT sa_Type;
// number of references to this object.
ULONG sa_RefCount;
// next address/this device object.
struct _SPX_ADDR * sa_Next;
// The following fields are used to maintain state about this address.
// attributes of the address.
ULONG sa_Flags;
// Next addressfile for this address
struct _SPX_ADDR_FILE * sa_AddrFileList;
// List of inactive connections and active connections on this address file.
struct _SPX_CONN_FILE * sa_InactiveConnList; struct _SPX_CONN_FILE * sa_ActiveConnList;
// This is the list of connections which have a POST_LISTEN on them. They
// do not have a local connection id at this point. But will, when they move
// from here to the ActiveConnList, when the listen is satisfied (no matter
// if the accept has not been posted yet, in the case of non-autoaccept listens)
struct _SPX_CONN_FILE * sa_ListenConnList;
CTELock sa_Lock;
// the socket this address corresponds to.
USHORT sa_Socket;
// device context to which we are attached.
struct _DEVICE * sa_Device; CTELock * sa_DeviceLock;
#ifdef ISN_NT
// These two can be a union because they are not used
// concurrently.
union {
// This structure is used for checking share access.
SHARE_ACCESS sa_ShareAccess;
// Used for delaying NbfDestroyAddress to a thread so
// we can access the security descriptor.
WORK_QUEUE_ITEM sa_DestroyAddrQueueItem;
} u;
// This structure is used to hold ACLs on the address.
PSECURITY_DESCRIPTOR sa_SecurityDescriptor;
#endif
} SPX_ADDR, *PSPX_ADDR;
#define SPX_ADDR_CLOSING 0x00000001
// ROUTINE PROTOTYPES
VOID SpxAddrRef( IN PSPX_ADDR Address);
VOID SpxAddrLockRef( IN PSPX_ADDR Address);
VOID SpxAddrDeref( IN PSPX_ADDR Address);
VOID SpxAddrFileRef( IN PSPX_ADDR_FILE pAddrFile);
VOID SpxAddrFileLockRef( IN PSPX_ADDR_FILE pAddrFile);
VOID SpxAddrFileDeref( IN PSPX_ADDR_FILE pAddrFile);
PSPX_ADDR SpxAddrCreate( IN PDEVICE Device, IN USHORT Socket);
NTSTATUS SpxAddrFileCreate( IN PDEVICE Device, IN PREQUEST Request, OUT PSPX_ADDR_FILE * ppAddrFile);
NTSTATUS SpxAddrOpen( IN PDEVICE Device, IN PREQUEST Request);
NTSTATUS SpxAddrSetEventHandler( IN PDEVICE Device, IN PREQUEST pRequest);
NTSTATUS SpxAddrFileVerify( IN PSPX_ADDR_FILE pAddrFile);
NTSTATUS SpxAddrFileStop( IN PSPX_ADDR_FILE pAddrFile, IN PSPX_ADDR Address);
NTSTATUS SpxAddrFileCleanup( IN PDEVICE Device, IN PREQUEST Request);
NTSTATUS SpxAddrFileClose( IN PDEVICE Device, IN PREQUEST Request);
PSPX_ADDR SpxAddrLookup( IN PDEVICE Device, IN USHORT Socket);
NTSTATUS SpxAddrConnByRemoteIdAddrLock( IN PSPX_ADDR pSpxAddr, IN USHORT SrcConnId, IN PBYTE SrcIpxAddr, OUT struct _SPX_CONN_FILE **ppSpxConnFile);
NTSTATUS SpxAddrFileDestroy( IN PSPX_ADDR_FILE pAddrFile);
VOID SpxAddrDestroy( IN PVOID Parameter);
USHORT SpxAddrAssignSocket( IN PDEVICE Device);
BOOLEAN SpxAddrExists( IN PDEVICE Device, IN USHORT Socket);
NTSTATUS spxAddrRemoveFromGlobalList( IN PSPX_ADDR_FILE pSpxAddrFile);
VOID spxAddrInsertIntoGlobalList( IN PSPX_ADDR_FILE pSpxAddrFile);
#if DBG
#define SpxAddrReference(_Address, _Type) \
{ \ (VOID)SPX_ADD_ULONG ( \ &(_Address)->sa_RefTypes[_Type],\ 1, \ &SpxGlobalInterlock); \ SpxAddrRef (_Address); \ }
#define SpxAddrLockReference(_Address, _Type) \
{ \ (VOID)SPX_ADD_ULONG ( \ &(_Address)->sa_RefTypes[_Type], \ 1, \ &SpxGlobalInterlock); \ SpxAddrLockRef (_Address); \ }
#define SpxAddrDereference(_Address, _Type) \
{ \ (VOID)SPX_ADD_ULONG ( \ &(_Address)->sa_RefTypes[_Type], \ (ULONG)-1, \ &SpxGlobalInterlock); \ if (SPX_ADD_ULONG( \ &(_Address)->sa_RefCount, \ (ULONG)-1, \ &(_Address)->sa_Lock) == 1) { \ SpxAddrDestroy (_Address); \ }\ }
#define SpxAddrFileReference(_AddressFile, _Type) \
{ \ (VOID)SPX_ADD_ULONG ( \ &(_AddressFile)->saf_RefTypes[_Type], \ 1, \ &SpxGlobalInterlock); \ SpxAddrFileRef (_AddressFile); \ }
#define SpxAddrFileLockReference(_AddressFile, _Type) \
{ \ (VOID)SPX_ADD_ULONG ( \ &(_AddressFile)->saf_RefTypes[_Type], \ 1, \ &SpxGlobalInterlock); \ SpxAddrFileLockRef (_AddressFile); \ }
#define SpxAddrFileDereference(_AddressFile, _Type) \
{ \ (VOID)SPX_ADD_ULONG ( \ &(_AddressFile)->saf_RefTypes[_Type], \ (ULONG)-1, \ &SpxGlobalInterlock); \ SpxAddrFileDeref (_AddressFile); \ }
#define SpxAddrFileTransferReference(_AddressFile, _OldType, _NewType) \
{ \ (VOID)SPX_ADD_ULONG ( \ &(_AddressFile)->saf_RefTypes[_NewType], \ 1, \ &SpxGlobalInterlock); \ (VOID)SPX_ADD_ULONG ( \ &(_AddressFile)->saf_RefTypes[_OldType], \ (ULONG)-1, \ &SpxGlobalInterlock); \ }
#else // DBG
#define SpxAddrReference(_Address, _Type) \
SPX_ADD_ULONG( \ &(_Address)->sa_RefCount, \ 1, \ (_Address)->sa_DeviceLock)
#define SpxAddrLockReference(_Address, _Type) \
SPX_ADD_ULONG( \ &(_Address)->sa_RefCount, \ 1, \ (_Address)->sa_DeviceLock);
#define SpxAddrDereference(_Address, _Type) \
if (SPX_ADD_ULONG( \ &(_Address)->sa_RefCount, \ (ULONG)-1, \ &(_Address)->sa_Lock) == 1) { \ SpxAddrDestroy (_Address); \ }
#define SpxAddrFileReference(_AddressFile, _Type) \
SPX_ADD_ULONG( \ &(_AddressFile)->saf_RefCount, \ 1, \ (_AddressFile)->saf_AddrLock)
#define SpxAddrFileLockReference(_AddressFile, _Type) \
SPX_ADD_ULONG( \ &(_AddressFile)->saf_RefCount, \ 1, \ (_AddressFile)->saf_AddrLock);
#define SpxAddrFileDereference(_AddressFile, _Type) \
if (SPX_ADD_ULONG( \ &(_AddressFile)->saf_RefCount, \ (ULONG)-1, \ (_AddressFile)->saf_AddrLock) == 1) { \ SpxAddrFileDestroy (_AddressFile); \ }
#define SpxAddrFileTransferReference(_AddressFile, _OldType, _NewType)
#endif // DBG
|