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_
|
||
|
||
|