windows-nt/Source/XPSP1/NT/net/sfm/atalk/sys/asp.h

428 lines
11 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
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_