474 lines
12 KiB
C
474 lines
12 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1992 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
aspc.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains definitions for the client side ASP code.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jameel Hyder (jameelh@microsoft.com)
|
|||
|
|
|||
|
Revision History:
|
|||
|
19 Jun 1992 Initial Version
|
|||
|
|
|||
|
Notes: Tab stop: 4
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _ASPC_
|
|||
|
#define _ASPC_
|
|||
|
|
|||
|
#define ASPC_CONN_HASH_BUCKETS 13 // Hashed by NodeAddr
|
|||
|
|
|||
|
#define HASH_ASPC_SRCADDR(pSrcAddr) \
|
|||
|
((((pSrcAddr)->ata_Node >> 2) + \
|
|||
|
((pSrcAddr)->ata_Network & 0xFF)) % ASPC_CONN_HASH_BUCKETS)
|
|||
|
|
|||
|
// For resolving forward references
|
|||
|
struct _AspCAddress;
|
|||
|
struct _AspCConnxn;
|
|||
|
struct _AspCRequest;
|
|||
|
|
|||
|
#define ASP_MIN_REQ_INTERVAL 5 // In 100ms units
|
|||
|
#define ASP_MAX_REQ_INTERVAL 20 // In 100ms units
|
|||
|
#define ASP_INIT_REQ_INTERVAL 5 // In 100ms units
|
|||
|
|
|||
|
#define ASPCAO_CLOSING 0x8000
|
|||
|
#define ASPCAO_SIGNATURE *(PULONG)"ACAO"
|
|||
|
|
|||
|
#define VALID_ASPCAO(pAspCAddr) (((pAspCAddr) != NULL) && \
|
|||
|
(((struct _AspCAddress *)(pAspCAddr))->aspcao_Signature == ASPCAO_SIGNATURE))
|
|||
|
|
|||
|
// Also known as the listener.
|
|||
|
typedef struct _AspCAddress
|
|||
|
{
|
|||
|
ULONG aspcao_Signature;
|
|||
|
struct _AspCAddress * aspcao_Next; // Links to global list
|
|||
|
struct _AspCAddress ** aspcao_Prev;
|
|||
|
LONG aspcao_RefCount; // References to the address obj
|
|||
|
ULONG aspcao_Flags;
|
|||
|
|
|||
|
PATP_ADDROBJ aspcao_pAtpAddr; // Atp Socket for this asp conn
|
|||
|
GENERIC_COMPLETION aspcao_CloseCompletion;
|
|||
|
PVOID aspcao_CloseContext;
|
|||
|
PTDI_IND_DISCONNECT aspcao_DisconnectHandler;
|
|||
|
PVOID aspcao_DisconnectHandlerCtx;
|
|||
|
PTDI_IND_RECEIVE_EXPEDITED aspcao_ExpRecvHandler; // Used to indicate attention
|
|||
|
PVOID aspcao_ExpRecvHandlerCtx;
|
|||
|
ATALK_SPIN_LOCK aspcao_Lock;
|
|||
|
} ASPC_ADDROBJ, *PASPC_ADDROBJ;
|
|||
|
|
|||
|
#define ASPCCO_ASSOCIATED 0x0001
|
|||
|
#define ASPCCO_ACTIVE 0x0002
|
|||
|
#define ASPCCO_TICKLING 0x0004
|
|||
|
#define ASPCCO_CONNECTING 0x0008
|
|||
|
#define ASPCCO_CLEANING_UP 0x0010
|
|||
|
#define ASPCCO_LOCAL_CLOSE 0x0020
|
|||
|
#define ASPCCO_REMOTE_CLOSE 0x0040
|
|||
|
#define ASPCCO_DROPPED 0x0080
|
|||
|
#define ASPCCO_ATTN_PENDING 0x0100
|
|||
|
#define ASPCCO_DISCONNECTING 0x0200
|
|||
|
#define ASPCCO_CLOSING 0x8000
|
|||
|
#define ASPCCO_SIGNATURE *(PULONG)"ACCO"
|
|||
|
#define MAX_ASPC_ATTNS 8
|
|||
|
|
|||
|
#define VALID_ASPCCO(pAspConn) (((pAspConn) != NULL) && \
|
|||
|
(((struct _AspCConnxn *)(pAspConn))->aspcco_Signature == ASPCCO_SIGNATURE))
|
|||
|
|
|||
|
typedef struct _AspCConnxn
|
|||
|
{
|
|||
|
ULONG aspcco_Signature;
|
|||
|
|
|||
|
struct _AspCConnxn * aspcco_Next; // Links to global list
|
|||
|
struct _AspCConnxn ** aspcco_Prev;
|
|||
|
LONG aspcco_RefCount; // References to the conn obj
|
|||
|
struct _AspCAddress * aspcco_pAspCAddr; // Back pointer to the address
|
|||
|
|
|||
|
struct _AspCRequest * aspcco_pActiveReqs; // List of requests being processed
|
|||
|
PATP_ADDROBJ aspcco_pAtpAddr; // Atp Socket for this asp conn
|
|||
|
// Copy of aspcao_pAtpAddr for efficiency
|
|||
|
LONG aspcco_LastContactTime;
|
|||
|
ATALK_ADDR aspcco_ServerSlsAddr;//This is the server addr to which we send
|
|||
|
// the tickles/open/getstatus
|
|||
|
ATALK_ADDR aspcco_ServerSssAddr;//This is the server addr to which we send
|
|||
|
// the commands/writes
|
|||
|
BYTE aspcco_SessionId;
|
|||
|
BYTE aspcco_cReqsInProcess;// Count of requests in process
|
|||
|
USHORT aspcco_Flags; // aspcco_xxx values
|
|||
|
USHORT aspcco_NextSeqNum;
|
|||
|
USHORT aspcco_OpenSessTid;
|
|||
|
USHORT aspcco_TickleTid;
|
|||
|
union
|
|||
|
{
|
|||
|
USHORT aspcco_TickleXactId;// Transaction id for tickles
|
|||
|
USHORT aspcco_OpenSessId; // Transaction id for open-session request
|
|||
|
};
|
|||
|
|
|||
|
// We keep a circular buffer for storing attentions. If full further attention
|
|||
|
// bytes overwrite it
|
|||
|
USHORT aspcco_AttnBuf[MAX_ASPC_ATTNS];
|
|||
|
USHORT aspcco_AttnInPtr;
|
|||
|
USHORT aspcco_AttnOutPtr;
|
|||
|
|
|||
|
RT aspcco_RT; // Used for adaptive round-trip time calculation
|
|||
|
|
|||
|
PVOID aspcco_ConnCtx;
|
|||
|
|
|||
|
// Read (GetAttn) Completion routine
|
|||
|
GENERIC_READ_COMPLETION aspcco_ReadCompletion;
|
|||
|
PVOID aspcco_ReadCtx;
|
|||
|
|
|||
|
// Connect inform routine
|
|||
|
GENERIC_COMPLETION aspcco_ConnectCompletion;
|
|||
|
PVOID aspcco_ConnectCtx;
|
|||
|
|
|||
|
// Disconnect inform routine
|
|||
|
GENERIC_COMPLETION aspcco_DisconnectInform;
|
|||
|
PVOID aspcco_DisconnectInformCtx;
|
|||
|
|
|||
|
// Disconnect request completion
|
|||
|
ATALK_ERROR aspcco_DisconnectStatus;
|
|||
|
GENERIC_COMPLETION aspcco_DisconnectCompletion;
|
|||
|
PVOID aspcco_DisconnectCtx;
|
|||
|
|
|||
|
// Completion routine to be called when socket is cleaned-up
|
|||
|
GENERIC_COMPLETION aspcco_CleanupComp;
|
|||
|
PVOID aspcco_CleanupCtx;
|
|||
|
|
|||
|
// Completion routine to be called when socket is closed
|
|||
|
GENERIC_COMPLETION aspcco_CloseComp;
|
|||
|
PVOID aspcco_CloseCtx;
|
|||
|
|
|||
|
PATALK_DEV_CTX aspcco_pDevCtx;
|
|||
|
ATALK_SPIN_LOCK aspcco_Lock;
|
|||
|
} ASPC_CONNOBJ, *PASPC_CONNOBJ;
|
|||
|
|
|||
|
#define ASPCRQ_COMMAND 0x0001 // Asp Command
|
|||
|
#define ASPCRQ_WRITE 0x0002 // Asp Write
|
|||
|
#define ASPCRQ_WRTCONT 0x0004 // Write continue recvd. and replied
|
|||
|
|
|||
|
// The request gets created when a Command or Write is posted
|
|||
|
#define ASPCRQ_SIGNATURE *(PULONG)"ACRQ"
|
|||
|
#if DBG
|
|||
|
#define VALID_ASPCRQ(pAspCReq) (((pAspCReq) != NULL) && \
|
|||
|
((pAspCReq)->aspcrq_Signature == ASPRQ_SIGNATURE))
|
|||
|
#else
|
|||
|
#define VALID_ASPCRQ(pAspCReq) ((pAspCReq) != NULL)
|
|||
|
#endif
|
|||
|
|
|||
|
typedef struct _AspCRequest
|
|||
|
{
|
|||
|
#if DBG
|
|||
|
ULONG aspcrq_Signature;
|
|||
|
#endif
|
|||
|
struct _AspCRequest * aspcrq_Next; // Link to next request
|
|||
|
LONG aspcrq_RefCount;// Reference Count
|
|||
|
struct _AspCConnxn * aspcrq_pAspConn;// Owning connection
|
|||
|
PATP_RESP aspcrq_pAtpResp;// Used to reply to a wrtcont request
|
|||
|
PACTREQ aspcrq_pActReq; // Request completion
|
|||
|
union
|
|||
|
{
|
|||
|
PAMDL aspcrq_pReplyMdl;
|
|||
|
PAMDL aspcrq_pWriteMdl;
|
|||
|
};
|
|||
|
USHORT aspcrq_SeqNum;
|
|||
|
USHORT aspcrq_ReqXactId;// Transaction Id of the request/command
|
|||
|
USHORT aspcrq_Flags; // Various ASPRQ_xxx values
|
|||
|
union
|
|||
|
{
|
|||
|
USHORT aspcrq_ReplySize;
|
|||
|
USHORT aspcrq_WriteSize;
|
|||
|
};
|
|||
|
|
|||
|
ATALK_SPIN_LOCK aspcrq_Lock; // Spin-lock
|
|||
|
} ASPC_REQUEST, *PASPC_REQUEST;
|
|||
|
|
|||
|
// MACROS
|
|||
|
#define AtalkAspCGetDdpAddress(pAspAddr) \
|
|||
|
AtalkAtpGetDdpAddress((pAspAddr)->aspcao_pAtpAddr)
|
|||
|
|
|||
|
extern
|
|||
|
VOID
|
|||
|
AtalkInitAspCInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCCreateAddress(
|
|||
|
IN PATALK_DEV_CTX pDevCtx OPTIONAL,
|
|||
|
OUT PASPC_ADDROBJ * ppAspAddr
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCCleanupAddress(
|
|||
|
IN PASPC_ADDROBJ pAspAddr
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCCloseAddress(
|
|||
|
IN PASPC_ADDROBJ pAspAddr,
|
|||
|
IN GENERIC_COMPLETION CompletionRoutine,
|
|||
|
IN PVOID CloseContext
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCCreateConnection(
|
|||
|
IN PVOID ConnCtx,
|
|||
|
IN PATALK_DEV_CTX pDevCtx OPTIONAL,
|
|||
|
OUT PASPC_CONNOBJ * ppAspConn
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCCleanupConnection(
|
|||
|
IN PASPC_CONNOBJ pAspConn
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCCloseConnection(
|
|||
|
IN PASPC_CONNOBJ pAspConn,
|
|||
|
IN GENERIC_COMPLETION CompletionRoutine,
|
|||
|
IN PVOID CloseContext
|
|||
|
);
|
|||
|
|
|||
|
// MACROS
|
|||
|
#define AtalkAspCAddrReferenceNonInterlock(_pAspAddr, _pError) \
|
|||
|
{ \
|
|||
|
if (((_pAspAddr)->aspcao_Flags & ASPCAO_CLOSING) == 0) \
|
|||
|
{ \
|
|||
|
ASSERT((_pAspAddr)->aspcao_RefCount >= 1); \
|
|||
|
(_pAspAddr)->aspcao_RefCount++; \
|
|||
|
*(_pError) = ATALK_NO_ERROR; \
|
|||
|
} \
|
|||
|
else \
|
|||
|
{ \
|
|||
|
*(_pError) = ATALK_ASPC_ADDR_CLOSING; \
|
|||
|
} \
|
|||
|
if (ATALK_SUCCESS(*(_pError))) \
|
|||
|
{ \
|
|||
|
DBGPRINT(DBG_COMP_ASP, DBG_LEVEL_REFASPADDR, \
|
|||
|
("RefAddr %lx at %s(%d) = %d\n", \
|
|||
|
_pAspAddr, __FILE__, __LINE__, \
|
|||
|
((_pAspAddr)->aspcao_RefCount))); \
|
|||
|
} \
|
|||
|
}
|
|||
|
|
|||
|
#define AtalkAspCAddrReference(_pAspAddr, _pError) \
|
|||
|
{ \
|
|||
|
KIRQL OldIrql; \
|
|||
|
\
|
|||
|
ACQUIRE_SPIN_LOCK(&(_pAspAddr)->aspcao_Lock, &OldIrql); \
|
|||
|
AtalkAspCAddrReferenceNonInterlock(_pAspAddr, _pError); \
|
|||
|
RELEASE_SPIN_LOCK(&(_pAspAddr)->aspcao_Lock, OldIrql); \
|
|||
|
}
|
|||
|
|
|||
|
#define AtalkAspCConnReferenceByPtrNonInterlock(_pAspConn, _pError) \
|
|||
|
{ \
|
|||
|
if (((_pAspConn)->aspcco_Flags & ASPCCO_CLOSING) == 0) \
|
|||
|
{ \
|
|||
|
ASSERT((_pAspConn)->aspcco_RefCount >= 1); \
|
|||
|
(_pAspConn)->aspcco_RefCount++; \
|
|||
|
*(_pError) = ATALK_NO_ERROR; \
|
|||
|
} \
|
|||
|
else \
|
|||
|
{ \
|
|||
|
*(_pError) = ATALK_ASPC_ADDR_CLOSING; \
|
|||
|
} \
|
|||
|
}
|
|||
|
|
|||
|
#define AtalkAspCConnReference(_pAspConn, _pError) \
|
|||
|
{ \
|
|||
|
KIRQL OldIrql; \
|
|||
|
\
|
|||
|
ACQUIRE_SPIN_LOCK(&(_pAspConn)->aspcco_Lock, &OldIrql); \
|
|||
|
AtalkAspCConnReferenceByPtrNonInterlock(_pAspConn, _pError);\
|
|||
|
RELEASE_SPIN_LOCK(&(_pAspConn)->aspcco_Lock, OldIrql); \
|
|||
|
}
|
|||
|
|
|||
|
extern
|
|||
|
VOID FASTCALL
|
|||
|
AtalkAspCAddrDereference(
|
|||
|
IN PASPC_ADDROBJ pAspAddr
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
VOID FASTCALL
|
|||
|
AtalkAspCConnDereference(
|
|||
|
IN PASPC_CONNOBJ pAspConn
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCAssociateAddress(
|
|||
|
IN PASPC_ADDROBJ pAspAddr,
|
|||
|
IN PASPC_CONNOBJ pAspConn
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCDissociateAddress(
|
|||
|
IN PASPC_CONNOBJ pAspConn
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCPostConnect(
|
|||
|
IN PASPC_CONNOBJ pAspConn,
|
|||
|
IN PATALK_ADDR pRemoteAddr,
|
|||
|
IN PVOID pConnectCtx,
|
|||
|
IN GENERIC_COMPLETION CompletionRoutine
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCDisconnect(
|
|||
|
IN PASPC_CONNOBJ pAspConn,
|
|||
|
IN ATALK_DISCONNECT_TYPE DisconnectType,
|
|||
|
IN PVOID pDisconnectCtx,
|
|||
|
IN GENERIC_COMPLETION CompletionRoutine
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCGetStatus(
|
|||
|
IN PASPC_ADDROBJ pAspAddr,
|
|||
|
IN PATALK_ADDR pRemoteAddr,
|
|||
|
IN PAMDL pStatusAmdl,
|
|||
|
IN USHORT AmdlSize,
|
|||
|
IN PACTREQ pActReq
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCGetAttn(
|
|||
|
IN PASPC_CONNOBJ pAspConn,
|
|||
|
IN PAMDL pReadBuf,
|
|||
|
IN USHORT ReadBufLen,
|
|||
|
IN ULONG ReadFlags,
|
|||
|
IN PVOID pReadCtx,
|
|||
|
IN GENERIC_READ_COMPLETION CompletionRoutine
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
ATALK_ERROR
|
|||
|
AtalkAspCCmdOrWrite(
|
|||
|
IN PASPC_CONNOBJ pAspConn,
|
|||
|
IN PAMDL pCmdMdl,
|
|||
|
IN USHORT CmdSize,
|
|||
|
IN PAMDL pReplyMdl,
|
|||
|
IN USHORT ReplySize,
|
|||
|
IN BOOLEAN fWrite, // If TRUE, its a write else command
|
|||
|
IN PACTREQ pActReq
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
AtalkAspCConnectionIsValid(
|
|||
|
IN PASPC_CONNOBJ pAspConn
|
|||
|
);
|
|||
|
|
|||
|
// This is a list of all active connections. This is scanned by the session
|
|||
|
// maintenance timer.
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
PASP_CONNOBJ ascm_ConnList;
|
|||
|
TIMERLIST ascm_SMTTimer;
|
|||
|
} ASPC_CONN_MAINT, *PASPC_CONN_MAINT;
|
|||
|
|
|||
|
extern ASPC_CONN_MAINT atalkAspCConnMaint;
|
|||
|
|
|||
|
extern ATALK_SPIN_LOCK atalkAspCLock;
|
|||
|
extern PASPC_ADDROBJ atalkAspCAddrList;
|
|||
|
extern PASPC_CONNOBJ atalkAspCConnList;
|
|||
|
|
|||
|
LOCAL VOID
|
|||
|
atalkAspCCloseSession(
|
|||
|
IN PASPC_CONNOBJ pAspConn
|
|||
|
);
|
|||
|
|
|||
|
LOCAL VOID
|
|||
|
atalkAspCHandler(
|
|||
|
IN ATALK_ERROR ErrorCode,
|
|||
|
IN PASPC_CONNOBJ pAspConn, // Listener (our context)
|
|||
|
IN PATP_RESP RespCtxt, // Used by PostResp/CancelResp
|
|||
|
IN PATALK_ADDR pSrcAddr, // Address of requestor
|
|||
|
IN USHORT PktLen,
|
|||
|
IN PBYTE pPkt,
|
|||
|
IN PBYTE pUserBytes
|
|||
|
);
|
|||
|
|
|||
|
LOCAL VOID
|
|||
|
atalkAspCIncomingOpenReply(
|
|||
|
IN ATALK_ERROR ErrorCode,
|
|||
|
IN PASPC_CONNOBJ pAspConn, // Our context
|
|||
|
IN PAMDL pReqAmdl,
|
|||
|
IN PAMDL pReadAmdl,
|
|||
|
IN USHORT ReadLen,
|
|||
|
IN PBYTE ReadUserBytes
|
|||
|
);
|
|||
|
|
|||
|
LOCAL VOID
|
|||
|
atalkAspCIncomingStatus(
|
|||
|
IN ATALK_ERROR ErrorCode,
|
|||
|
IN PACTREQ pActReq, // Our Ctx
|
|||
|
IN PAMDL pReqAmdl,
|
|||
|
IN PAMDL pStatusAmdl,
|
|||
|
IN USHORT StatusLen,
|
|||
|
IN PBYTE ReadUserBytes
|
|||
|
);
|
|||
|
|
|||
|
LOCAL VOID
|
|||
|
atalkAspCIncomingCmdReply(
|
|||
|
IN ATALK_ERROR Error,
|
|||
|
IN PASPC_REQUEST pAspReq,
|
|||
|
IN PAMDL pReqAMdl,
|
|||
|
IN PAMDL pRespAMdl,
|
|||
|
IN USHORT RespSize,
|
|||
|
IN PBYTE RespUserBytes
|
|||
|
);
|
|||
|
|
|||
|
LOCAL LONG FASTCALL
|
|||
|
atalkAspCSessionMaintenanceTimer(
|
|||
|
IN PTIMERLIST pTimer,
|
|||
|
IN BOOLEAN TimerShuttingDown
|
|||
|
);
|
|||
|
|
|||
|
LOCAL VOID FASTCALL
|
|||
|
atalkAspCGenericRespComplete(
|
|||
|
IN ATALK_ERROR ErrorCode,
|
|||
|
IN PATP_RESP pAtpResp
|
|||
|
);
|
|||
|
|
|||
|
LOCAL VOID
|
|||
|
atalkAspCQueueAddrGlobalList(
|
|||
|
IN PASPC_ADDROBJ pAspCAddr
|
|||
|
);
|
|||
|
|
|||
|
LOCAL VOID
|
|||
|
atalkAspCDeQueueAddrGlobalList(
|
|||
|
IN PASPC_ADDROBJ pAspCAddr
|
|||
|
);
|
|||
|
|
|||
|
LOCAL VOID
|
|||
|
atalkAspCQueueConnGlobalList(
|
|||
|
IN PASPC_CONNOBJ pAspConn
|
|||
|
);
|
|||
|
|
|||
|
LOCAL VOID
|
|||
|
atalkAspCDeQueueConnGlobalList(
|
|||
|
IN PASPC_CONNOBJ pAspCConn
|
|||
|
);
|
|||
|
|
|||
|
#endif // _ASPC_
|
|||
|
|
|||
|
|