319 lines
7.6 KiB
C
319 lines
7.6 KiB
C
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
socket.h
|
|
|
|
Abstract:
|
|
|
|
Contains macros, prototypes and structures for socket.c
|
|
|
|
Author:
|
|
|
|
Richard L Firth (rfirth) 25-Oct-1993
|
|
|
|
Revision History:
|
|
|
|
25-Oct-1993 rfirth
|
|
Created
|
|
|
|
--*/
|
|
|
|
#define ARBITRARY_CONNECTION_NUMBER 0x6c8e
|
|
|
|
//
|
|
// forward declarations
|
|
//
|
|
|
|
typedef struct _FIFO *LPFIFO;
|
|
typedef struct _XECB *LPXECB;
|
|
typedef struct _XECB_QUEUE *LPXECB_QUEUE;
|
|
typedef struct _SOCKET_INFO* LPSOCKET_INFO;
|
|
typedef struct _CONNECTION_INFO *LPCONNECTION_INFO;
|
|
|
|
//
|
|
// FIFO - standard single-linked FIFO queue structure
|
|
//
|
|
|
|
typedef struct _FIFO {
|
|
LPVOID Head;
|
|
LPVOID Tail;
|
|
} FIFO;
|
|
|
|
//
|
|
// function type for cancelling XECB/ECB
|
|
//
|
|
|
|
typedef BYTE (*ECB_CANCEL_ROUTINE)(LPXECB);
|
|
|
|
//
|
|
// QUEUE_ID - indicator of which queue an ECB is on
|
|
//
|
|
|
|
typedef enum {
|
|
NO_QUEUE = 0x10cadd1e,
|
|
ASYNC_COMPLETION_QUEUE = 0xCC5055C0, // arbitrary numbers make life interesting
|
|
TIMER_QUEUE,
|
|
SOCKET_LISTEN_QUEUE,
|
|
SOCKET_SEND_QUEUE,
|
|
SOCKET_HEADER_QUEUE, // special queue for small ECBs that cannot hold data
|
|
CONNECTION_CONNECT_QUEUE,
|
|
CONNECTION_ACCEPT_QUEUE,
|
|
CONNECTION_SEND_QUEUE,
|
|
CONNECTION_LISTEN_QUEUE
|
|
} QUEUE_ID;
|
|
|
|
//
|
|
// XECB - our copy of the ECB (IPX or AES)
|
|
//
|
|
|
|
typedef struct _XECB {
|
|
LPXECB Next;
|
|
LPECB Ecb; // points to ECB in DOS memory
|
|
ECB_ADDRESS EcbAddress; // segmented address of ECB in DOS memory
|
|
ESR_ADDRESS EsrAddress; // Event Service Routine in DOS memory
|
|
LPBYTE Buffer; // address of 32-bit buffer
|
|
LPBYTE Data; // moveable data pointer
|
|
WORD FrameLength; // actual size of frame (from IPX/SPX header)
|
|
WORD ActualLength; // same as FrameLength. Not decremented
|
|
WORD Length; // length of 32-bit buffer
|
|
WORD Ticks; // for AES
|
|
WORD SocketNumber; // number of owning socket
|
|
WORD Owner; // owning DOS Task ID
|
|
DWORD TaskId; // owning Windows Task ID
|
|
DWORD Flags; // see below
|
|
QUEUE_ID QueueId; // identifies the queue for quick location
|
|
LPVOID OwningObject; // which SOCKET_INFO or CONNECTION_INFO the queue is on
|
|
DWORD RefCount; // the dreaded reference count
|
|
} XECB;
|
|
|
|
//
|
|
// XECB flags
|
|
//
|
|
|
|
#define XECB_FLAG_AES 0x00000000
|
|
#define XECB_FLAG_IPX 0x00000001
|
|
#define XECB_FLAG_TEMPORARY_SOCKET 0x00000002
|
|
#define XECB_FLAG_BUFFER_ALLOCATED 0x00000004
|
|
#define XECB_FLAG_LISTEN 0x00000008
|
|
#define XECB_FLAG_SEND 0x00000010
|
|
#define XECB_FLAG_TIMER 0x00000020
|
|
#define XECB_FLAG_ASYNC 0x00000040
|
|
#define XECB_FLAG_FIRST_RECEIVE 0x00000080
|
|
#define XECB_FLAG_SPX 0x00000100
|
|
#define XECB_FLAG_PROTMODE 0x00000200
|
|
|
|
#define IS_PROT_MODE(p) (((p)->Flags & XECB_FLAG_PROTMODE) ? TRUE : FALSE)
|
|
|
|
//
|
|
// XECB_QUEUE - queue of XECBs
|
|
//
|
|
|
|
typedef struct _XECB_QUEUE {
|
|
LPXECB Head;
|
|
LPXECB Tail;
|
|
} XECB_QUEUE;
|
|
|
|
//
|
|
// SOCKET_INFO - maintains info about IPX sockets
|
|
//
|
|
|
|
typedef struct _SOCKET_INFO {
|
|
LPSOCKET_INFO Next;
|
|
WORD SocketNumber; // big-endian socket (bound port)
|
|
WORD Owner; // DOS PDB
|
|
DWORD TaskId; // Windows owner
|
|
SOCKET Socket; // the WinSock socket handle
|
|
DWORD Flags;
|
|
|
|
//
|
|
// BUGBUG: these next 2 fields can be flags
|
|
//
|
|
|
|
BOOL LongLived; // TRUE if keep-alive when app dies
|
|
BOOL SpxSocket; // TRUE if socket opened for SPX
|
|
|
|
//
|
|
// BUGBUG: these next 2 fields can we WORD or even BYTE (do we even need
|
|
// them - only used to tell AES if pending requests - it can look at the
|
|
// queue heads?
|
|
//
|
|
|
|
DWORD PendingSends; // used by cancel
|
|
DWORD PendingListens; // used by cancel
|
|
|
|
//
|
|
// ListenQueue is used for IPXListenForPacket and SPXListenForSequencedPacket
|
|
//
|
|
|
|
XECB_QUEUE ListenQueue; // pool of listening ECBs against this socket
|
|
|
|
//
|
|
// SendQueue is used by IPX for IPXSendPacket
|
|
//
|
|
|
|
XECB_QUEUE SendQueue; // queue of pending send ECBs against this socket
|
|
|
|
//
|
|
// HeaderQueue is used to hold small ECBs that can only take header info.
|
|
// We have this separate queue to make sure that we do not put ECBs that
|
|
// really cant accept any data into the Listen Queue.
|
|
//
|
|
|
|
XECB_QUEUE HeaderQueue; // pool of header ECBs against this socket
|
|
|
|
LPCONNECTION_INFO Connections;
|
|
} SOCKET_INFO;
|
|
|
|
#define SOCKET_FLAG_LISTENING 0x00000001
|
|
#define SOCKET_FLAG_SENDING 0x00000002
|
|
#define SOCKET_FLAG_TEMPORARY 0x80000000
|
|
|
|
//
|
|
// CONNECTION_INFO - maintains info about SPX sockets
|
|
//
|
|
|
|
typedef struct _CONNECTION_INFO {
|
|
LPCONNECTION_INFO Next; // next CONNECTION_INFO by OwningSocket
|
|
LPCONNECTION_INFO List; // all CONNECTION_INFO are linked together
|
|
LPSOCKET_INFO OwningSocket; // back-pointer to SOCKET_INFO
|
|
SOCKET Socket; // handle to socket
|
|
DWORD TaskId; // identifies windows task/owner
|
|
WORD ConnectionId; // analogous to SocketNumber
|
|
BYTE Flags;
|
|
BYTE State;
|
|
XECB_QUEUE ConnectQueue; // outgoing connections being made
|
|
XECB_QUEUE AcceptQueue; // waiting for incoming connections
|
|
XECB_QUEUE SendQueue; // packet sends on this connection
|
|
XECB_QUEUE ListenQueue; // partially complete receive
|
|
BYTE RemoteNode[6];
|
|
WORD RemoteConnectionId;
|
|
} CONNECTION_INFO;
|
|
|
|
//
|
|
// CONNECTION_INFO Flag field values
|
|
//
|
|
|
|
#define CF_1ST_RECEIVE 0x80 // hack-o-rama till NWLink timing problem fixed
|
|
|
|
//
|
|
// CONNECTION_INFO State field values
|
|
//
|
|
|
|
#define CI_WAITING 0x01
|
|
#define CI_STARTING 0x02
|
|
#define CI_ESTABLISHED 0x03
|
|
#define CI_TERMINATING 0x04
|
|
|
|
//
|
|
// one-line function macros
|
|
//
|
|
|
|
#define AllocateSocket() (LPSOCKET_INFO)LocalAlloc(LPTR, sizeof(SOCKET_INFO))
|
|
#define DeallocateSocket(p) FREE_OBJECT(p)
|
|
|
|
//
|
|
// SocketType parameter for CreateSocket
|
|
//
|
|
|
|
typedef enum {
|
|
SOCKET_TYPE_IPX,
|
|
SOCKET_TYPE_SPX
|
|
} SOCKET_TYPE;
|
|
|
|
//
|
|
// function prototypes
|
|
//
|
|
|
|
int
|
|
CreateSocket(
|
|
IN SOCKET_TYPE SocketType,
|
|
IN OUT ULPWORD pSocketNumber,
|
|
OUT SOCKET* pSocket
|
|
);
|
|
|
|
LPSOCKET_INFO
|
|
AllocateTemporarySocket(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
QueueSocket(
|
|
IN LPSOCKET_INFO pSocketInfo
|
|
);
|
|
|
|
LPSOCKET_INFO
|
|
DequeueSocket(
|
|
IN LPSOCKET_INFO pSocketInfo
|
|
);
|
|
|
|
LPSOCKET_INFO
|
|
FindSocket(
|
|
IN WORD SocketNumber
|
|
);
|
|
|
|
LPSOCKET_INFO
|
|
FindActiveSocket(
|
|
IN LPSOCKET_INFO pSocketInfo
|
|
);
|
|
|
|
int
|
|
ReopenSocket(
|
|
LPSOCKET_INFO pSocketInfo
|
|
);
|
|
|
|
VOID
|
|
KillSocket(
|
|
IN LPSOCKET_INFO pSocketInfo
|
|
);
|
|
|
|
VOID
|
|
KillShortLivedSockets(
|
|
IN WORD Owner
|
|
);
|
|
|
|
LPCONNECTION_INFO
|
|
AllocateConnection(
|
|
LPSOCKET_INFO pSocketInfo
|
|
);
|
|
|
|
VOID
|
|
DeallocateConnection(
|
|
IN LPCONNECTION_INFO pConnectionInfo
|
|
);
|
|
|
|
LPCONNECTION_INFO
|
|
FindConnection(
|
|
IN WORD ConnectionId
|
|
);
|
|
|
|
VOID
|
|
QueueConnection(
|
|
IN LPSOCKET_INFO pSocketInfo,
|
|
IN LPCONNECTION_INFO pConnectionInfo
|
|
);
|
|
|
|
LPCONNECTION_INFO
|
|
DequeueConnection(
|
|
IN LPSOCKET_INFO pSocketInfo,
|
|
IN LPCONNECTION_INFO pConnectionInfo
|
|
);
|
|
|
|
VOID
|
|
KillConnection(
|
|
IN LPCONNECTION_INFO pConnectionInfo
|
|
);
|
|
|
|
VOID
|
|
AbortOrTerminateConnection(
|
|
IN LPCONNECTION_INFO pConnectionInfo,
|
|
IN BYTE CompletionCode
|
|
);
|
|
|
|
VOID
|
|
CheckPendingSpxRequests(
|
|
BOOL *pfOperationPerformed
|
|
);
|