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