153 lines
6.3 KiB
C
153 lines
6.3 KiB
C
|
/********************************************************************/
|
||
|
/** Microsoft LAN Manager **/
|
||
|
/** Copyright(c) Microsoft Corp., 1990-2000 **/
|
||
|
/********************************************************************/
|
||
|
/* :ts=4 */
|
||
|
|
||
|
//** TCPCONN.H - TCP connection related definitions.
|
||
|
//
|
||
|
// This file contains the definitions for connection related structures,
|
||
|
// such as the TCPConnReq structure.
|
||
|
//
|
||
|
|
||
|
#define INVALID_CONN_INDEX 0xffffff
|
||
|
|
||
|
//* Structure used for tracking Connect/Listen/Accept/Disconnect requests.
|
||
|
|
||
|
#define tcr_signature 0x20524354 // 'TCR '
|
||
|
|
||
|
typedef struct TCPConnReq {
|
||
|
struct TCPReq tcr_req; // General request structure.
|
||
|
#if DBG
|
||
|
ulong tcr_sig;
|
||
|
#endif
|
||
|
struct _TDI_CONNECTION_INFORMATION *tcr_conninfo; // Where to return info.
|
||
|
struct _TDI_CONNECTION_INFORMATION *tcr_addrinfo;
|
||
|
ushort tcr_flags; // Flags for this request.
|
||
|
ushort tcr_timeout; // Timeout value for this request.
|
||
|
} TCPConnReq;
|
||
|
|
||
|
|
||
|
#define TCR_FLAG_QUERY_ACCEPT 0x0001 // Consult client before accepting
|
||
|
// connections.
|
||
|
|
||
|
|
||
|
typedef void (*ConnDoneRtn)(struct TCPConn *, CTELockHandle);
|
||
|
|
||
|
//* Structure of a TCB Connection. A TCP Connection points to a TCP and an
|
||
|
// address object.
|
||
|
|
||
|
|
||
|
#define MAX_CONN_PER_BLOCK 256
|
||
|
// Structure of a ConnTable.
|
||
|
|
||
|
typedef struct TCPConnBlock {
|
||
|
DEFINE_LOCK_STRUCTURE(cb_lock)
|
||
|
#if DBG
|
||
|
uchar *module;
|
||
|
uint line;
|
||
|
#endif
|
||
|
uint cb_freecons;
|
||
|
uint cb_nextfree;
|
||
|
uint cb_blockid;
|
||
|
uint cb_conninst;
|
||
|
void *cb_conn[MAX_CONN_PER_BLOCK];
|
||
|
} TCPConnBlock;
|
||
|
|
||
|
|
||
|
#define tc_signature 0x20204354 // 'TC '
|
||
|
|
||
|
typedef struct TCPConn {
|
||
|
#if DBG
|
||
|
ulong tc_sig;
|
||
|
#endif
|
||
|
Queue tc_q; // Linkage on AO.
|
||
|
struct TCB *tc_tcb; // Pointer to TCB for connection.
|
||
|
struct AddrObj *tc_ao; // Back pointer to AddrObj.
|
||
|
uchar tc_inst; // Instance number.
|
||
|
uchar tc_flags; // Flags for connection.
|
||
|
ushort tc_refcnt; // Count of TCBs which reference this connection.
|
||
|
void *tc_context; // User's context.
|
||
|
CTEReqCmpltRtn tc_rtn; // Completion routine.
|
||
|
void *tc_rtncontext; // User context for completion routine.
|
||
|
ConnDoneRtn tc_donertn; // Routine to call when refcnt goes to 0.
|
||
|
uint tc_tcbflags; // Flags for TCB when it comes in.
|
||
|
ulong tc_owningpid; // Owning process id
|
||
|
uint tc_tcbkatime; // Initial keep alive time value for this conn.
|
||
|
uint tc_tcbkainterval; // Keep alive interval for this conn.
|
||
|
uint tc_window; // Default window for TCB.
|
||
|
struct TCB *tc_LastTCB;
|
||
|
TCPConnBlock *tc_ConnBlock; //Back pointer to the conn block
|
||
|
uint tc_connid;
|
||
|
} TCPConn;
|
||
|
|
||
|
#define CONN_CLOSING 1 // Connection is closing.
|
||
|
#define CONN_DISACC 2 // Conn. is disassociating.
|
||
|
#define CONN_WINSET 4 // Window explictly set.
|
||
|
#define CONN_INVALID (CONN_CLOSING | CONN_DISACC)
|
||
|
|
||
|
|
||
|
#define CONN_INDEX(c) ((c) & 0xff)
|
||
|
#define CONN_BLOCKID(c) (((c) & 0xffff00) >> 8 )
|
||
|
#define CONN_INST(c) ((uchar)((c) >> 24))
|
||
|
#define MAKE_CONN_ID(index,block,instance) ((((uint)(instance)) << 24) | (((uint)(block)) << 8) | ((uint)(index)))
|
||
|
#define INVALID_CONN_ID 0xffffffff
|
||
|
|
||
|
#define DEFAULT_CONN_BLOCKS 2;
|
||
|
|
||
|
typedef struct TCPAddrCheck {
|
||
|
IPAddr SourceAddress;
|
||
|
uint TickCount;
|
||
|
} TCPAddrCheckElement;
|
||
|
|
||
|
extern TCPAddrCheckElement *AddrCheckTable;
|
||
|
|
||
|
//* External definitions for TDI entry points.
|
||
|
extern TDI_STATUS TdiOpenConnection(PTDI_REQUEST Request, PVOID Context);
|
||
|
extern TDI_STATUS TdiCloseConnection(PTDI_REQUEST Request);
|
||
|
extern TDI_STATUS TdiAssociateAddress(PTDI_REQUEST Request, HANDLE AddrHandle);
|
||
|
extern TDI_STATUS TdiDisAssociateAddress(PTDI_REQUEST Request);
|
||
|
extern TDI_STATUS TdiConnect(PTDI_REQUEST Request, void *Timeout,
|
||
|
PTDI_CONNECTION_INFORMATION RequestAddr,
|
||
|
PTDI_CONNECTION_INFORMATION ReturnAddr);
|
||
|
extern TDI_STATUS TdiListen(PTDI_REQUEST Request, ushort Flags,
|
||
|
PTDI_CONNECTION_INFORMATION AcceptableAddr,
|
||
|
PTDI_CONNECTION_INFORMATION ConnectedAddr);
|
||
|
extern TDI_STATUS TdiAccept(PTDI_REQUEST Request,
|
||
|
PTDI_CONNECTION_INFORMATION AcceptInfo,
|
||
|
PTDI_CONNECTION_INFORMATION ConnectedInfo);
|
||
|
extern TDI_STATUS TdiDisconnect(PTDI_REQUEST Request, void *TO, ushort Flags,
|
||
|
PTDI_CONNECTION_INFORMATION DiscConnInfo,
|
||
|
PTDI_CONNECTION_INFORMATION ReturnInfo);
|
||
|
|
||
|
|
||
|
extern void FreeConn(TCPConn *Conn);
|
||
|
extern TCPConn *GetConn(void);
|
||
|
extern struct TCPConnReq *GetConnReq(void);
|
||
|
extern void FreeConnReq(struct TCPConnReq *FreedReq);
|
||
|
extern void DerefTCB(struct TCB *DoneTCB, CTELockHandle Handle);
|
||
|
extern void DerefSynTCB(struct SYNTCB *DoneTCB, CTELockHandle Handle);
|
||
|
extern void InitRCE(struct TCB *NewTCB);
|
||
|
extern void AcceptConn(struct TCB *AcceptTCB, CTELockHandle Handle);
|
||
|
extern void FreeConnID(TCPConn *Conn);
|
||
|
extern void NotifyOfDisc(struct TCB *DiscTCB, struct IPOptInfo *DiscInfo,
|
||
|
TDI_STATUS Status);
|
||
|
extern TCPConn *GetConnFromConnID(uint ConnID, CTELockHandle *Handle);
|
||
|
|
||
|
extern void TryToCloseTCB(struct TCB *ClosedTCB, uchar Reason,
|
||
|
CTELockHandle Handle);
|
||
|
extern TDI_STATUS InitTCBFromConn(struct TCPConn *Conn, struct TCB *NewTCB,
|
||
|
PTDI_CONNECTION_INFORMATION Addr, uint AOLocked);
|
||
|
|
||
|
extern void PushData(struct TCB *PushTCB);
|
||
|
extern TDI_STATUS MapIPError(IP_STATUS IPError, TDI_STATUS Default);
|
||
|
extern void GracefulClose(struct TCB *CloseTCB, uint ToTimeWait, uint Notify,
|
||
|
CTELockHandle Handle);
|
||
|
extern void RemoveTCBFromConn(struct TCB *RemovedTCB);
|
||
|
extern void InitAddrChecks();
|
||
|
extern int ConnCheckPassed(IPAddr Src, ulong Prt);
|
||
|
extern void EnumerateConnectionList(uchar *Buffer, ulong BufferSize,
|
||
|
ulong *EntriesReturned, ulong *EntriesAvailable);
|
||
|
extern void ValidateMSS(TCB* MssTCB);
|
||
|
|