#ifndef _NMS_
#define _NMS_
#ifdef __cplusplus
extern "C" {
#endif
/*++

Copyright (c) 1989  Microsoft Corporation

Module Name:

	nms.h

Abstract:

  This is the header file for the name space manager component of the
  Name Server.



Author:

	Pradeep Bahl	(PradeepB)	Dec-1992

Revision History:

--*/

/*
 includes
*/


#include "wins.h"
#include "comm.h"

/*
  defines
*/

#ifdef WINSDBG

FUTURES("Put all in a structure")
extern DWORD   NmsGenHeapAlloc;
extern DWORD   NmsDlgHeapAlloc;
extern DWORD   NmsUdpDlgHeapAlloc;
extern DWORD   NmsTcpMsgHeapAlloc;
extern DWORD   NmsUdpHeapAlloc;
extern DWORD   NmsQueHeapAlloc;
extern DWORD   NmsAssocHeapAlloc;
extern DWORD   NmsRpcHeapAlloc;
extern DWORD   NmsRplWrkItmHeapAlloc;
extern DWORD   NmsChlHeapAlloc;
extern DWORD   NmsTmmHeapAlloc;
extern DWORD   NmsCatchAllHeapAlloc;

extern DWORD   NmsHeapAllocForList;

extern DWORD   NmsGenHeapFree;
extern DWORD   NmsDlgHeapFree;
extern DWORD   NmsUdpDlgHeapFree;
extern DWORD   NmsTcpMsgHeapFree;
extern DWORD   NmsUdpHeapFree;
extern DWORD   NmsQueHeapFree;
extern DWORD   NmsAssocHeapFree;
extern DWORD   NmsRpcHeapFree;
extern DWORD   NmsRplWrkItmHeapFree;
extern DWORD   NmsChlHeapFree;
extern DWORD   NmsTmmHeapFree;
extern DWORD   NmsCatchAllHeapFree;

extern DWORD   NmsHeapCreate;
extern DWORD   NmsHeapDestroy;

//
// Count of updates (to version number) made by WINS.
//
extern DWORD   NmsRplUpd; 
extern DWORD   NmsRplGUpd; 
extern DWORD   NmsNmhUpd; 
extern DWORD   NmsNmhGUpd; 
extern DWORD   NmsNmhRelUpd; 
extern DWORD   NmsNmhRelGUpd; 
extern DWORD   NmsScvUpd; 
extern DWORD   NmsScvGUpd; 
extern DWORD   NmsChlUpd; 
extern DWORD   NmsChlGUpd; 
extern DWORD   NmsRpcUpd; 
extern DWORD   NmsRpcGUpd; 
extern DWORD   NmsOthUpd; 
extern DWORD   NmsOthGUpd; 


#if DBG
//
// No of reg/ref/rel requests dropped because of WINS hitting the threshold
// of max. requets on its queue.  Used by InsertOtherNbtWorkItem
//
extern volatile DWORD  NmsRegReqQDropped;
#endif

//
// NmsUpdCtrs[Client][TypeOfUpd][TypeOfRec][StateOfNewRec][VersNoInc]
//
extern DWORD NmsUpdCtrs[WINS_NO_OF_CLIENTS][2][4][3][2];
extern CRITICAL_SECTION NmsHeapCrtSec;
#endif

#define NMS_OPCODE_MASK	  0x78	     /*to weed out the 4 bits of the 3rd byte
				     * of the name packet	
				     */
#define NMS_RESPONSE_MASK 0x80	     /*to weed out the bit that indicates
				      * whether the datagram is a request or 
				      * a response
				      */
/*
  macros
*/

/*
 * NMSISNBT_M -- Is this an nbt request message
 *
 * Examines the third byte of the message to determine this
*/
#define NMSISNBT_M(pMsg) \
	(((*(pMsg + 2) & NMS_OPCODE_MASK) >> 3) != WINS_IS_NOT_NBT)  

/*
* NMSISRPL_M -- Is this a replicator message
*
* Examines the third byte of the message to determine this
*/
#define NMSISRPL_MSG_M(pMsg ) \
	(((*(pMsg + 2) & NMS_OPCODE_MASK) >> 3) == WINS_IS_NOT_NBT)  



/*
  GEN_INIT_BUFF_HEAP_SIZE -- This is the initial size of the heap 
			     for allocating queue items for the various
			     queues, TLS storage,  for reading in a file,etc.  
			     Keep it 1000 
*/
#define GEN_INIT_BUFF_HEAP_SIZE		1000


//
// RPC_INIT_BUFF_HEAP_SIZE -- This is the initial size of the heap for
//			      use by rpc
//
#define RPC_INIT_BUFF_HEAP_SIZE		1000


#define RPL_WRKITM_BUFF_HEAP_SIZE	1000    	//1000 bytes


//
// Initial heap size for timer work items
//
#define   TMM_INIT_HEAP_SIZE	1000

//
// The maximum number of concurrent RPC calls allowed
//
FUTURES("Move these defines to winsthd.h")
#define   NMS_MAX_RPC_CALLS	 15 
#define   NMS_MAX_BROWSER_RPC_CALLS   (NMS_MAX_RPC_CALLS - 4)

//
// Minimum number of RPC call threads
//
#define   NMS_MIN_RPC_CALL_THDS 2

//
// This is the amount of time the service controller is asked to wait
//
#define MSECS_WAIT_WHEN_DEL_WINS          120000   //from ReadOwnAddTbl

/* 
 structure definitions
*/

/*
 QUERY_RSP -- structure used to hold the information that needs to be sent
	      in a positive name query response message
*/

typedef struct
 	{
	DWORD	CountOfIPAdd;   //it is a DWORD for alignment
        DWORD   IPAdd[1];    	//one or more IP addresses start here.
	} QUERY_RSP;

#ifdef WINSDBG
typedef struct _PUSH_CTRS_T {
          DWORD NoUpdNtfAcc;
          DWORD NoUpdNtfRej;
          DWORD NoSndEntReq;
          DWORD NoAddVersReq;
          DWORD NoUpdNtfReq;
          DWORD NoUpdVersReq;
          DWORD NoInvReq;
         } PUSH_CTRS_T, *PPUSH_CTRS_T;

typedef struct _PULL_CTRS_T {
         DWORD  PH;
         } PULL_CTRS_T, *PPULL_CTRS_T; 
         
typedef struct _NMS_CTRS_T {
       PUSH_CTRS_T  RplPushCtrs;     
       PULL_CTRS_T  RplPullCtrs;     
       } NMS_CTRS_T, *PNMS_CTRS_T;
#endif
 
/*
 externs
*/
#ifdef WINSDBG
extern  NMS_CTRS_T  NmsCtrs;
#endif

extern HANDLE 		NmsMainTermEvt;
extern HANDLE 		NmsTermEvt;
extern CRITICAL_SECTION NmsTermCrtSec;
extern HANDLE		NmsCrDelNbtThdEvt;
extern DWORD		NmsNoOfNbtThds;
extern DWORD		NmsTotalTrmThdCnt;

extern BOOL         fNmsThdOutOfReck;


extern VERS_NO_T         NmsRangeSize;
extern VERS_NO_T         NmsHalfRangeSize;
extern VERS_NO_T         NmsVersNoToStartFromNextTime;
extern VERS_NO_T         NmsHighWaterMarkVersNo;

extern DWORD             NmsNoOfRpcCallsToDb;
//
// required for security checking.  The types are defined in ntseapi.h
//
extern GENERIC_MAPPING	   NmsInfoMapping;
extern PSECURITY_DESCRIPTOR pNmsSecurityDescriptor;


FUTURES("move to winsque.h")
extern HANDLE	  GenBuffHeapHdl;  //handle to heap for use for general 
				   //allocation
extern HANDLE	  NmsRpcHeapHdl;  //handle to heap for use for allocation 
				      //by rpc


extern COMM_ADD_T	NmsLocalAdd;  //WINS's Address
extern BOOL		fNmsAbruptTerm;
extern BOOL		fNmsMainSessionActive;

#ifdef TEST_DATA
extern HANDLE NmsFileHdl;
#endif
#ifdef DBGSVC
extern HANDLE NmsDbgFileHdl;
//extern FILE *pNmsDbgFile;
#endif

extern CRITICAL_SECTION WinsIntfNoOfUsersCrtSec;
/* 
 function definitions
*/

//
// Handler used for interfacing with the service controller
//
extern
VOID
NmsServiceControlHandler(
    IN DWORD Opcode
    );

extern
VOID
ENmsHandleMsg(
	PCOMM_HDL_T pDlgHdl, 
	MSG_T 	 	     pMsg,  
	MSG_LEN_T            MsgLen 
	); 

extern
VOID
ENmsWinsUpdateStatus(
    DWORD MSecsToWait
	); 

#ifdef WINSDBG
extern
VOID
NmsPrintCtrs(
 VOID
);
#endif

#ifndef WINS_INTERACTIVE
extern
VOID
NmsChkDbgFileSz(
    VOID
    );
#endif
#ifdef __cplusplus
}
#endif

#endif //_NMS_