|
|
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
asp.h
Abstract:
This module contains definitions for the server side ASP code.
Author:
Jameel Hyder (jameelh@microsoft.com) Nikhil Kamkolkar (nikhilk@microsoft.com)
Revision History: 19 Jun 1992 Initial Version
Notes: Tab stop: 4 --*/
#ifndef _ASP_
#define _ASP_
// This defines only the server side ASP protocol solely for the consumption of the
// AFP Server. Hence any functionality not needed by the AFP Server is missing here
// ASP command type bytes:
#define ASP_CLOSE_SESSION 1
#define ASP_CMD 2
#define ASP_GET_STATUS 3
#define ASP_OPEN_SESSION 4
#define ASP_TICKLE 5
#define ASP_WRITE 6
#define ASP_WRITE_DATA 7
#define ASP_ATTENTION 8
// ASP version:
#define ASP_VERSION "\001\000"
// Asp error codes that are visible on the wire
#define ASP_BAD_VERSION (USHORT)-1066
#define ASP_BUFFER_TOO_SMALL (USHORT)-1067
#define ASP_NO_MORE_SESSIONS (USHORT)-1068
#define ASP_NO_SERVERS (USHORT)-1069
#define ASP_PARAM_ERROR (USHORT)-1070
#define ASP_SERVER_BUSY (USHORT)-1071
#define ASP_SIZE_ERROR (USHORT)-1073
#define ASP_TOO_MANY_CLIENTS (USHORT)-1074
#define ASP_NO_ACK (USHORT)-1075
// Offsets into the ATP user bytes for finding various fields:
#define ASP_CMD_OFF 0
#define ASP_CMD_RESULT_OFF 0
#define ASP_SSS_OFF 0
#define ASP_SESSIONID_OFF 1
#define ASP_WSS_OFF 1
#define ASP_VERSION_OFF 2
#define ASP_ERRORCODE_OFF 2
#define ASP_ATTN_WORD_OFF 2
#define ASP_SEQUENCE_NUM_OFF 2
#define ASP_CMD_RESULT_SIZE 4
// ASP timer values:
#define ATP_MAX_INTERVAL_FOR_ASP 20 // In 100ms units
#define ATP_MIN_INTERVAL_FOR_ASP 3 // In 100ms units
#define ATP_INITIAL_INTERVAL_FOR_ASP 3
#define ASP_TICKLE_INTERVAL 300 // In 100ms units
#define ASP_MAX_SESSION_IDLE_TIME 1200 // In 100ms units. How long before we kill it
#define ASP_SESSION_MAINTENANCE_TIMER 1200 // In 100ms units. How often the timer runs
#define ASP_SESSION_TIMER_STAGGER 50 // In 100ms units. How are different queues staggered
#define ATP_RETRIES_FOR_ASP 10 // For open, status, close;
// infinite for others.
#define ASP_WRITE_DATA_SIZE 2 // WriteData command has two
// bytes of data with it.
// Session status size:
#define ASP_MAX_STATUS_SIZE ATP_MAX_TOTAL_RESPONSE_SIZE
#define MAX_WRITE_REQ_SIZE 20
#define ASP_CONN_HASH_BUCKETS 37 // Hashed by NodeAddr
#define HASH_SRCADDR(pSrcAddr) \
((((pSrcAddr)->ata_Node >> 2) + \ ((pSrcAddr)->ata_Network & 0xFF)) % ASP_CONN_HASH_BUCKETS)
// For resolving forward references
struct _AspAddress; struct _AspConnxn; struct _AspRequest;
#define ASPAO_CLOSING 0x8000
#define ASPAO_SIGNATURE *(PULONG)"ASAO"
#if DBG
#define VALID_ASPAO(pAspAddr) (((pAspAddr) != NULL) && \
((pAspAddr)->aspao_Signature == ASPAO_SIGNATURE)) #else
#define VALID_ASPAO(pAspAddr) ((pAspAddr) != NULL)
#endif
typedef struct _AspAddress { #if DBG
ULONG aspao_Signature; #endif
LONG aspao_RefCount; // References to the address obj
ULONG aspao_Flags; PATP_ADDROBJ aspao_pSlsAtpAddr; // Sls Atp Socket
PATP_ADDROBJ aspao_pSssAtpAddr; // Sss Atp Socket
struct _AspConnxn * aspao_pSessions[ASP_CONN_HASH_BUCKETS]; // List of open sessions
PBYTE aspao_pStatusBuf; // Status buffer
USHORT aspao_StsBufSize; // Size of the status buffer
BYTE aspao_NextSessionId;// Id of the next session that comes in
BOOLEAN aspao_EnableNewConnections; GENERIC_COMPLETION aspao_CloseCompletion; PVOID aspao_CloseContext; ASP_CLIENT_ENTRIES aspao_ClientEntries;// Entry points from the client
ATALK_SPIN_LOCK aspao_Lock; } ASP_ADDROBJ, *PASP_ADDROBJ;
#define ASPCO_ACTIVE 0x0001
#define ASPCO_TICKLING 0x0002
#define ASPCO_CLEANING_UP 0x0010
#define ASPCO_LOCAL_CLOSE 0x0020
#define ASPCO_REMOTE_CLOSE 0x0040
#define ASPCO_DROPPED 0x0080
#define ASPCO_SHUTDOWN 0x0100
#define ASPCO_CLOSING 0x8000
#define ASPCO_SIGNATURE *(PULONG)"ASCO"
#if DBG
#define VALID_ASPCO(pAspConn) (((pAspConn) != NULL) && \
((pAspConn)->aspco_Signature == ASPCO_SIGNATURE)) #else
#define VALID_ASPCO(pAspConn) ((pAspConn) != NULL)
#endif
typedef struct _AspConnxn { #if DBG
ULONG aspco_Signature; #endif
struct _AspConnxn * aspco_NextOverflow; // Overflow link for hash bucket
// These is non NULL only when on
// active list
struct _AspConnxn * aspco_NextSession; // Linked to active session list
struct _AspConnxn ** aspco_PrevSession; // Linked to active session list
LONG aspco_RefCount; // References to the conn obj
struct _AspAddress * aspco_pAspAddr; // Back pointer to the listener
struct _AspRequest * aspco_pActiveReqs; // List of requests being processed
struct _AspRequest * aspco_pFreeReqs; // Free requests
PVOID aspco_ConnContext; // User context associated with this conn.
LONG aspco_LastContactTime; ATALK_ADDR aspco_WssRemoteAddr;// This is the remote addr which
// issues the commands/writes
BYTE aspco_SessionId; BYTE aspco_cReqsInProcess;// Count of requests in process
USHORT aspco_Flags; // ASPCO_xxx values
USHORT aspco_NextExpectedSeqNum; USHORT aspco_TickleXactId; // Transaction id for tickles
RT aspco_RT; // Used for adaptive round-trip time calculation
PVOID aspco_CloseContext; CLIENT_CLOSE_COMPLETION aspco_CloseCompletion; PVOID aspco_AttentionContext; ATALK_SPIN_LOCK aspco_Lock; } ASP_CONNOBJ, *PASP_CONNOBJ;
#define ASPRQ_WRTCONT 0x01 // Set if we are doing a write continue
#define ASPRQ_WRTCONT_CANCELLED 0x10 // Set if a write continue was cancelled
#define ASPRQ_REPLY 0x02 // Set if a reply is being processed
#define ASPRQ_REPLY_CANCELLED 0x20 // Set if a reply is cancelled
#define ASPRQ_REPLY_ABORTED 0x40 // Reply aborted due to a closing session
// The request gets created when an incoming request arrives.
#define ASPRQ_SIGNATURE *(PULONG)"ASRQ"
#if DBG
#define VALID_ASPRQ(pAspReq) (((pAspReq) != NULL) && \
((pAspReq)->asprq_Signature == ASPRQ_SIGNATURE)) #else
#define VALID_ASPRQ(pAspReq) ((pAspReq) != NULL)
#endif
typedef struct _AspRequest { #if DBG
ULONG asprq_Signature; #endif
struct _AspRequest * asprq_Next; // Link to next request
struct _AspConnxn * asprq_pAspConn; // Owning connection
USHORT asprq_SeqNum; // As generated by the wksta end
USHORT asprq_WCXactId; // Transaction Id of the write
// continue in progress
PATP_RESP asprq_pAtpResp; // Used by PostResp/Cancel
BYTE asprq_ReqType; // Cmd/WrtCont
BYTE asprq_Flags; // Various ASPRQ_xxx values
ATALK_ADDR asprq_RemoteAddr;// This address is used for
// future communications but only
// for this request
REQUEST asprq_Request; // Request parameters
UCHAR asprq_ReqBuf[MAX_WRITE_REQ_SIZE]; // The request is copied here during a
// write request
BYTE asprq_WrtContRespBuf[ASP_WRITE_DATA_SIZE]; } ASP_REQUEST, *PASP_REQUEST;
// MACROS
#define AtalkAspGetDdpAddress(pAspAddr) \
AtalkAtpGetDdpAddress((pAspAddr)->aspao_pSlsAtpAddr)
extern VOID AtalkInitAspInitialize( VOID );
extern ATALK_ERROR AtalkAspCreateAddress( OUT PASP_ADDROBJ * ppAspAddr );
extern ATALK_ERROR AtalkAspCloseAddress( IN PASP_ADDROBJ pAspAddr, IN GENERIC_COMPLETION CompletionRoutine, IN PVOID CloseContext );
extern ATALK_ERROR AtalkAspBind( IN PASP_ADDROBJ pAspAddr, IN PASP_BIND_PARAMS pBindParms, IN PACTREQ pActReq );
NTSTATUS FASTCALL AtalkAspWriteContinue( IN PREQUEST pRequest );
ATALK_ERROR FASTCALL AtalkAspReply( IN PREQUEST pRequest, IN PBYTE pResultCode // Pointer to the 4-byte result
);
extern NTSTATUS AtalkAspSetStatus( IN PASP_ADDROBJ pAspAddr, IN PUCHAR pStatusBuf, IN USHORT StsBufSize );
extern NTSTATUS FASTCALL AtalkAspListenControl( IN PASP_ADDROBJ pAspAddr, IN BOOLEAN Enable );
extern PASP_ADDROBJ FASTCALL AtalkAspReferenceAddr( IN PASP_ADDROBJ pAspAddr );
extern VOID FASTCALL AtalkAspDereferenceAddr( IN PASP_ADDROBJ pAspAddr );
extern ATALK_ERROR AtalkAspCleanupConnection( IN PASP_CONNOBJ pAspConn );
extern ATALK_ERROR AtalkAspCloseConnection( IN PASP_CONNOBJ pAspConn );
extern ATALK_ERROR AtalkAspFreeConnection( IN PASP_CONNOBJ pAspConn );
extern NTSTATUS AtalkAspSendAttention( IN PASP_CONNOBJ pAspConn, IN USHORT AttentionWord, IN PVOID pContext );
extern VOID FASTCALL AtalkAspDereferenceConn( IN PASP_CONNOBJ pAspConn );
// This is a list of all active connections. This is scanned by the session
// maintenance timer.
#define NUM_ASP_CONN_LISTS 4
typedef struct { PASP_CONNOBJ ascm_ConnList; TIMERLIST ascm_SMTTimer; } ASP_CONN_MAINT, *PASP_CONN_MAINT; extern ASP_CONN_MAINT atalkAspConnMaint[NUM_ASP_CONN_LISTS];
extern ATALK_SPIN_LOCK atalkAspLock;
typedef struct { PATP_RESP aps_pAtpResp; PAMDL aps_pAMdl; } ASP_POSTSTAT_CTX, *PASP_POSTSTAT_CTX;
LOCAL ATALK_ERROR FASTCALL atalkAspPostWriteContinue( IN PASP_REQUEST pAspReq );
LOCAL PASP_CONNOBJ atalkAspReferenceConnBySrcAddr( IN PASP_ADDROBJ pAspAddr, IN PATALK_ADDR pSrcAddr, IN BYTE SessionId );
LOCAL VOID atalkAspSlsXHandler( IN ATALK_ERROR ErrorCode, IN PASP_ADDROBJ pAspAddr, // 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 atalkAspSssXHandler( IN ATALK_ERROR ErrorCode, IN PASP_ADDROBJ pAspAddr, // 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 FASTCALL atalkAspReplyRelease( IN ATALK_ERROR Error, IN PASP_REQUEST pAspReq );
LOCAL VOID atalkAspWriteContinueResp( IN ATALK_ERROR Error, IN PASP_REQUEST pAspReq, IN PAMDL pReqAMdl, IN PAMDL pRespAMdl, IN USHORT RespSize, IN PBYTE RespUserBytes );
LOCAL VOID atalkAspSendAttentionResp( IN ATALK_ERROR Error, IN PVOID pContext, IN PAMDL pReqAMdl, IN PAMDL pRespAMdl, IN USHORT RespSize, IN PBYTE RespUserBytes );
LOCAL VOID atalkAspSessionClose( IN PASP_CONNOBJ pAspConn );
LOCAL LONG FASTCALL atalkAspSessionMaintenanceTimer( IN PTIMERLIST pTimer, IN BOOLEAN TimerShuttingDown );
LOCAL VOID FASTCALL atalkAspRespComplete( IN ATALK_ERROR Error, IN PASP_POSTSTAT_CTX pStsCtx );
LOCAL VOID atalkAspCloseComplete( IN ATALK_ERROR Status, IN PASP_ADDROBJ pAspAddr );
LOCAL VOID atalkAspReturnResp( IN PATP_RESP pAtpResp, IN PATALK_ADDR pDstAddr, IN BYTE Byte0, IN BYTE Byte1, IN USHORT Word2 );
#endif // _ASP_
|