428 lines
11 KiB
C
428 lines
11 KiB
C
|
/*++
|
|||
|
|
|||
|
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_
|
|||
|
|
|||
|
|