455 lines
9.7 KiB
C
455 lines
9.7 KiB
C
#ifndef _COMMASSOC_
|
||
#define _COMMASSOC_
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/*++
|
||
|
||
Copyright (c) 1989 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
assoc.c
|
||
|
||
Abstract:
|
||
|
||
|
||
This is the header file to be included for calling assoc.c functions
|
||
|
||
|
||
Author:
|
||
|
||
Pradeep Bahl (PradeepB) Dec-1992
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
/*
|
||
includes
|
||
*/
|
||
#include <wins.h>
|
||
#include "winsock2.h"
|
||
#include "comm.h"
|
||
|
||
/*
|
||
|
||
defines
|
||
*/
|
||
|
||
#define COMMASSOC_UDP_BUFFER_HEAP_SIZE 10000
|
||
#define COMMASSOC_UDP_DLG_HEAP_SIZE 5000
|
||
#define COMMASSOC_DLG_DS_SZ sizeof(COMMASSOC_DLG_CTX_T)
|
||
#define COMMASSOC_ASSOC_DS_SZ sizeof(COMMASSOC_ASSOC_CTX_T)
|
||
|
||
|
||
/*
|
||
*
|
||
* size of header put by RtlInsertElementGenericTable.
|
||
*/
|
||
FUTURES("Gary Kimura (2/13) said that he would provide a macro for the size")
|
||
FUTURES("Use that when it is available")
|
||
|
||
#define COMMASSOC_TBL_HDR_SIZE (sizeof(RTL_SPLAY_LINKS) + sizeof(LIST_ENTRY))
|
||
|
||
/*
|
||
Size of memory block to allocate for sending any of association set up
|
||
messages. We use the largest of the sizes of the various assoc. set up
|
||
messages so that we can reuse a buffer. The buffer size is kept a multiple
|
||
of 16.
|
||
*/
|
||
|
||
#define COMMASSOC_START_REQ_ASSOC_MSG_SIZE (32 + sizeof(COMM_HEADER_T))
|
||
#define COMMASSOC_START_RSP_ASSOC_MSG_SIZE (16 + sizeof(COMM_HEADER_T))
|
||
#define COMMASSOC_STOP_REQ_ASSOC_MSG_SIZE (16 + sizeof(COMM_HEADER_T))
|
||
|
||
#define COMMASSOC_ASSOC_MSG_SIZE COMMASSOC_START_REQ_ASSOC_MSG_SIZE
|
||
|
||
#if SUPPORT612WINS > 0
|
||
#define COMMASSOC_POST_BETA1_ASSOC_MSG_SIZE (COMMASSOC_ASSOC_MSG_SIZE + 1)
|
||
#endif
|
||
|
||
/*
|
||
Initial memory sizes for heaps used for allocating assoc. and dlg ctx blocks
|
||
*/
|
||
|
||
#define COMMASSOC_ASSOC_BLKS_HEAP_SIZE 1000
|
||
#define COMMASSOC_DLG_BLKS_HEAP_SIZE 4000
|
||
#define COMMASSOC_TCP_MSG_HEAP_SIZE 10000
|
||
|
||
|
||
|
||
//
|
||
// defines to access the next and prev assoc. in the list
|
||
//
|
||
#define NEXT_ASSOC_M(pAssocCtx) ((PCOMMASSOC_ASSOC_CTX_T) \
|
||
((pAssocCtx)->Top.Head.Flink))
|
||
#define PREV_ASSOC_M(pAssocCtx) ((PCOMMASSOC_ASSOC_CTX_T) \
|
||
((pAssocCtx)->Top.Head.Blink))
|
||
|
||
//
|
||
// Macro to unlink an association from the table of responder associations
|
||
// Called by CommStopMonDlg in commapi.c and by CommAssocDeleteAssocInTbl
|
||
//
|
||
#define COMMASSOC_UNLINK_RSP_ASSOC_M(pAssocCtx) { \
|
||
NEXT_ASSOC_M(PREV_ASSOC_M((pAssocCtx))) = NEXT_ASSOC_M((pAssocCtx)); \
|
||
PREV_ASSOC_M(NEXT_ASSOC_M((pAssocCtx))) = PREV_ASSOC_M((pAssocCtx)); \
|
||
}
|
||
/*
|
||
Macros
|
||
*/
|
||
//
|
||
// Sets up Communication data structures (assoc and dlg ctx blocks)
|
||
//
|
||
#define COMMASSOC_SETUP_COMM_DS_M(mpDlgCtx, mpAssocCtx, mType_e, mRole_e) \
|
||
{ \
|
||
(mpAssocCtx)->DlgHdl.SeqNo = (mpDlgCtx)->Top.SeqNo; \
|
||
(mpAssocCtx)->DlgHdl.pEnt = (mpDlgCtx); \
|
||
(mpAssocCtx)->State_e = COMMASSOC_ASSOC_E_ACTIVE; \
|
||
(mpAssocCtx)->Typ_e = (mType_e); \
|
||
\
|
||
(mpDlgCtx)->AssocHdl.SeqNo = (mpAssocCtx)->Top.SeqNo; \
|
||
(mpDlgCtx)->AssocHdl.pEnt = (mpAssocCtx); \
|
||
(mpDlgCtx)->Role_e = (mRole_e); \
|
||
(mpDlgCtx)->Typ_e = (mType_e); \
|
||
}
|
||
|
||
/*
|
||
externs
|
||
*/
|
||
|
||
/*
|
||
Handles to the heaps created for allocating assoc. ctx blocks and
|
||
Dlg Ctx blocks
|
||
*/
|
||
extern HANDLE CommAssocAssocHeapHdl;
|
||
extern HANDLE CommAssocDlgHeapHdl;
|
||
extern HANDLE CommAssocTcpMsgHeapHdl;
|
||
|
||
/*
|
||
typedefs
|
||
*/
|
||
|
||
typedef DWORD IP_ADDRESS;
|
||
typedef IP_ADDRESS HOST_ADDRESS;
|
||
|
||
|
||
|
||
|
||
|
||
typedef enum _COMMASSOC_ASSOC_STOP_RSN_E {
|
||
COMMASSOC_E_USER_INITIATED = 0,
|
||
COMMASSOC_E_AUTH_FAILURE,
|
||
COMMASSOC_E_INCOMP_VERS,
|
||
COMMASSOC_E_BUG_CHECK,
|
||
COMMASSOC_E_MSG_ERR //some error in message format
|
||
} COMMASSOC_STP_RSN_E, *PCOMMASSOC_STP_RSN_E;
|
||
|
||
/*
|
||
ASSOC_ROLE_E -- Enumerator for the different roles
|
||
*/
|
||
|
||
typedef enum _COMMASSOC_ASSOC_ROLE_E {
|
||
COMMASSOC_ASSOC_E_INITIATOR = 0,
|
||
COMMASSOC_ASSOC_E_RESPONDER
|
||
} COMMASSOC_ASSOC_ROLE_E, *PCOMMASSOC_ASSOC_ROLE_E;
|
||
|
||
/*
|
||
COMMASSOC_DLG_ROLE_E -- Enumerator for the different roles
|
||
*/
|
||
|
||
typedef enum _COMMASSOC_DLG_ROLE_E {
|
||
COMMASSOC_DLG_E_IMPLICIT = 0,
|
||
COMMASSOC_DLG_E_EXPLICIT
|
||
} COMMASSOC_DLG_ROLE_E, *PCOMMASSOC_PDLG_ROLE_E;
|
||
|
||
|
||
|
||
|
||
|
||
/*
|
||
ASSOC_MSG_TYP_E - different assoc. messages
|
||
*/
|
||
|
||
typedef enum _COMMASSOC_ASSOC_MSG_TYP_E{
|
||
COMMASSOC_ASSOC_E_START_REQ = 0,
|
||
COMMASSOC_ASSOC_E_STOP_REQ,
|
||
COMMASSOC_ASSOC_E_START_RESP
|
||
} COMMASSOC_MSG_TYP_E, *PCOMMASSOC_MSG_TYP_E;
|
||
|
||
/*
|
||
DLG_STATE_E - states of a dialogue
|
||
*/
|
||
|
||
typedef enum _COMMASSOC_DLG_STATE_E {
|
||
COMMASSOC_DLG_E_INACTIVE = 0,
|
||
COMMASSOC_DLG_E_ACTIVE,
|
||
COMMASSOC_DLG_E_DYING
|
||
} COMMASSOC_DLG_STATE_E, *PCOMMASSOC_DLG_STATE_E;
|
||
|
||
|
||
/*
|
||
|
||
DLG_HDL_T - Dialogue Context Block
|
||
|
||
The ctx block must have COMM_TOP_T structure at the top (used by DeallocEnt in
|
||
assoc.c)
|
||
*/
|
||
|
||
typedef struct _COMMASSOC_DLG_CTX_T {
|
||
COMM_TOP_T Top;
|
||
COMM_HDL_T AssocHdl; //ptr to the Assoc ctx block
|
||
COMMASSOC_DLG_STATE_E State_e; // state of the dialogue
|
||
COMM_TYP_E Typ_e; // type of the dialogue
|
||
COMMASSOC_DLG_ROLE_E Role_e; //Role - IMPLICIT/EXPLICIT
|
||
FUTURES("There is no need to store pMsg and MsgLen in dlg ctx block")
|
||
FUTURES("since now I am storing FirstWrdOfMsg in it. Make sure that this")
|
||
FUTURES("assertion is indeed true")
|
||
MSG_T pMsg; //ptr to datagram received on
|
||
//UDP port
|
||
MSG_LEN_T MsgLen; //msg Length of datagram
|
||
DWORD FirstWrdOfMsg; //first word of message received
|
||
struct sockaddr_in FromAdd; //address of sender of datagram
|
||
CHECK("Is this needed")
|
||
DWORD QuesNameSecLen; //Length of question section
|
||
//in name req
|
||
DWORD RspLen; //length of the response packet
|
||
SOCKET SockNo; //sock. # of connection
|
||
//created when simulating an
|
||
//nbt node (to send a name
|
||
//reg request to a remote WINS)
|
||
//see ClastAtReplUniqueR
|
||
} COMMASSOC_DLG_CTX_T, *PCOMMASSOC_DLG_CTX_T;
|
||
|
||
|
||
|
||
/*
|
||
ASSOC_STATE_E -- Enumerator for the different states of an Association
|
||
*/
|
||
typedef enum _COMMASSOC_ASSOC_STATE_E {
|
||
COMMASSOC_ASSOC_E_NON_EXISTENT = 0,
|
||
COMMASSOC_ASSOC_E_STARTING,
|
||
COMMASSOC_ASSOC_E_ACTIVE,
|
||
COMMASSOC_ASSOC_E_STOPPING,
|
||
COMMASSOC_ASSOC_E_DISCONNECTED
|
||
} COMMASSOC_ASSOC_STATE_E, *PCOMMASSOC_ASSOC_STATE_E;
|
||
|
||
|
||
typedef COMMASSOC_DLG_CTX_T DLG_CTX_T;
|
||
typedef COMM_HDL_T COMMASSOC_DLG_HDL_T;
|
||
typedef COMM_HDL_T COMMASSOC_ASSOC_HDL_T;
|
||
|
||
|
||
|
||
|
||
|
||
/*
|
||
ASSOC_CTX - Association Context Block
|
||
|
||
The ctx block must have COMM_TOP_T structure at the top (used by DeallocEnt in
|
||
assoc.c)
|
||
|
||
*/
|
||
typedef struct _COMMASSOC_ASSOC_CTX_T {
|
||
COMM_TOP_T Top;
|
||
COMM_HDL_T DlgHdl; //ptr to the Assoc ctx block
|
||
SOCKET SockNo; /*handle to TCP/UDP socket*/
|
||
ULONG uRemAssocCtx; /*remote assoc ctx block*/
|
||
DWORD MajVersNo;
|
||
DWORD MinVersNo;
|
||
COMMASSOC_ASSOC_STATE_E State_e; /* state */
|
||
COMM_TYP_E Typ_e; /* type */
|
||
COMMASSOC_ASSOC_ROLE_E Role_e; /*Role -- Initiator/responder*/
|
||
COMM_ADD_TYP_E AddTyp_e;
|
||
union {
|
||
struct sockaddr_in RemoteAdd; //Address of remote node
|
||
struct sockaddr_in RemoteAddIpx; //Address of remote node
|
||
};
|
||
ULONG nTag; // 32bit tag to be used in replication protocol
|
||
} COMMASSOC_ASSOC_CTX_T, *PCOMMASSOC_ASSOC_CTX_T;
|
||
|
||
|
||
/*
|
||
ASSOC_TAG - Mapping between (64bit) pointers and 32bit values.
|
||
This has to be used in order to locate the local COMMASSOC_ASSOC_CTX_T structure from the
|
||
32bit value handed by the partner through the replication protocol.
|
||
*/
|
||
|
||
#define COMMASSOC_TAG_CHUNK 64
|
||
|
||
typedef struct _COMMASSOC_TAG_POOL_T {
|
||
CRITICAL_SECTION crtSection; // mutual exclusion guard
|
||
LPVOID *ppStorage; // array of (64bit) pointer values
|
||
ULONG *pTagPool; // array of 32bit tags
|
||
ULONG nIdxLimit; // number of entries available in both arrays above
|
||
ULONG nMaxIdx; // maximum number of free tags
|
||
} COMMASSOC_TAG_POOL_T, *PCOMMASSOC_TAG_POOL_T;
|
||
|
||
extern COMMASSOC_TAG_POOL_T sTagAssoc; //32bit ULONG -> LPVOID mapping
|
||
|
||
/*
|
||
function prototypes
|
||
*/
|
||
|
||
extern
|
||
VOID
|
||
CommAssocSetUpAssoc(
|
||
PCOMM_HDL_T pDlgHdl,
|
||
PCOMM_ADD_T pAdd,
|
||
COMM_TYP_E CommTyp_e,
|
||
PCOMMASSOC_ASSOC_CTX_T *ppAssocCtx
|
||
);
|
||
|
||
extern
|
||
VOID
|
||
CommAssocFrmStartAssocReq(
|
||
PCOMMASSOC_ASSOC_CTX_T pAssocCtx,
|
||
MSG_T pMsg,
|
||
MSG_LEN_T MsgLen
|
||
);
|
||
|
||
extern
|
||
VOID
|
||
CommAssocUfmStartAssocReq(
|
||
IN MSG_T pMsg,
|
||
OUT PCOMM_TYP_E pAssocTyp_e,
|
||
OUT LPDWORD pMajorVer,
|
||
OUT LPDWORD pMinorVer,
|
||
OUT ULONG *puRemAssocCtx
|
||
);
|
||
|
||
|
||
extern
|
||
VOID
|
||
CommAssocFrmStartAssocRsp(
|
||
PCOMMASSOC_ASSOC_CTX_T pAssocCtx,
|
||
MSG_T pMsg,
|
||
MSG_LEN_T MsgLen
|
||
);
|
||
|
||
extern
|
||
VOID
|
||
CommAssocUfmStartAssocRsp(
|
||
IN MSG_T pMsg,
|
||
OUT LPDWORD pMajorVer,
|
||
OUT LPDWORD pMinorVer,
|
||
IN ULONG *puRemAssocCtx
|
||
);
|
||
|
||
|
||
|
||
extern
|
||
VOID
|
||
CommAssocFrmStopAssocReq(
|
||
PCOMMASSOC_ASSOC_CTX_T pAssocCtx,
|
||
MSG_T pMsg,
|
||
MSG_LEN_T MsgLen,
|
||
COMMASSOC_STP_RSN_E StopRsn_e
|
||
);
|
||
|
||
extern
|
||
VOID
|
||
CommAssocUfmStopAssocReq(
|
||
MSG_T pMsg,
|
||
PCOMMASSOC_STP_RSN_E pStopRsn_e
|
||
);
|
||
|
||
|
||
extern
|
||
VOID
|
||
CommAssocDeallocAssoc(
|
||
LPVOID pAssocCtx
|
||
);
|
||
|
||
extern
|
||
VOID
|
||
CommAssocDeallocDlg(
|
||
LPVOID pDlgCtx
|
||
);
|
||
|
||
extern
|
||
LPVOID
|
||
CommAssocAllocAssoc(
|
||
VOID
|
||
);
|
||
|
||
extern
|
||
LPVOID
|
||
CommAssocAllocDlg(
|
||
VOID
|
||
);
|
||
|
||
extern
|
||
VOID
|
||
CommAssocInit(
|
||
VOID
|
||
);
|
||
|
||
|
||
|
||
extern
|
||
PCOMMASSOC_DLG_CTX_T
|
||
CommAssocInsertUdpDlgInTbl(
|
||
IN PCOMMASSOC_DLG_CTX_T pCtx,
|
||
OUT LPBOOL pfNewElem
|
||
);
|
||
|
||
extern
|
||
VOID
|
||
CommAssocDeleteUdpDlgInTbl(
|
||
IN PCOMMASSOC_DLG_CTX_T pDlgCtx
|
||
);
|
||
|
||
|
||
extern
|
||
LPVOID
|
||
CommAssocCreateAssocInTbl(
|
||
SOCKET SockNo
|
||
);
|
||
|
||
extern
|
||
VOID
|
||
CommAssocDeleteAssocInTbl(
|
||
PCOMMASSOC_ASSOC_CTX_T pAssocCtx
|
||
);
|
||
extern
|
||
LPVOID
|
||
CommAssocLookupAssoc(
|
||
SOCKET SockNo
|
||
);
|
||
|
||
extern
|
||
VOID
|
||
CommAssocInsertAssocInTbl(
|
||
PCOMMASSOC_ASSOC_CTX_T pAssocCtx
|
||
);
|
||
|
||
extern
|
||
ULONG
|
||
CommAssocTagAlloc(
|
||
PCOMMASSOC_TAG_POOL_T pTag,
|
||
LPVOID pPtrValue
|
||
);
|
||
|
||
extern
|
||
VOID
|
||
CommAssocTagFree(
|
||
PCOMMASSOC_TAG_POOL_T pTag,
|
||
ULONG nTag
|
||
);
|
||
|
||
extern
|
||
LPVOID
|
||
CommAssocTagMap(
|
||
PCOMMASSOC_TAG_POOL_T pTag,
|
||
ULONG nTag
|
||
);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif
|
||
|