427 lines
10 KiB
C
427 lines
10 KiB
C
/*++
|
||
|
||
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
|
||
|