|
|
/*++
Copyright (c) 1996-1999 Microsoft Corporation
Module Name:
nmp.h
Abstract:
Private interface definitions for the Node Manager component.
Author:
Mike Massa (mikemas) 12-Mar-1996
Revision History:
--*/
#ifndef _NMP_INCLUDED
#define _NMP_INCLUDED
#define UNICODE 1
#include "service.h"
#include <winsock2.h>
#include <clnetcfg.h>
#include <bitset.h>
#include <madcapcl.h>
#include <time.h>
//
// Constants
//
#define LOG_CURRENT_MODULE LOG_MODULE_NM
#define NM_JOIN_TIMEOUT 60000 // 60 seconds
#define NM_MM_JOIN_TIMEOUT 3000 // 3 seconds
#define NM_CLOCK_PERIOD 300 // 300 milliseconds
#define NM_SEND_HB_RATE 4
#define NM_RECV_HB_RATE 3 // Changed 2=>3 to prolong min_stage_1 ticks from 8 to 12
//
// Common Object Flags
//
#define NM_FLAG_OM_INSERTED 0x10000000
#define NM_FLAG_DELETE_PENDING 0x80000000
//
// Miscellaneous Macros
//
#define NM_WCSLEN(_string) ((lstrlenW(_string) + 1) * sizeof(WCHAR))
//
// Common Object Management Macros
//
#define NM_OM_INSERTED(obj) ((obj)->Flags & NM_FLAG_OM_INSERTED)
#define NM_DELETE_PENDING(obj) ((obj)->Flags & NM_FLAG_DELETE_PENDING)
#define NM_FREE_OBJECT_FIELD(_object, _field) \
if ( (_object)->_field != NULL ) \ LocalFree( (_object)->_field )
#define NM_MIDL_FREE_OBJECT_FIELD(_object, _field) \
if ( (_object)->_field != NULL ) { \ MIDL_user_free( (_object)->_field ); \ (_object)->_field = NULL; \ }
//
// State of the NM component
//
// Note that the order is important. See NmpEnterApi().
//
typedef enum { NmStateOffline = 0, NmStateOfflinePending = 1, NmStateOnlinePending = 2, NmStateOnline = 3, } NM_STATE, *PNM_STATE;
//
// Node definitions
//
typedef struct { DWORD Status; DWORD LocalOnly; } NM_NODE_CREATE_CONTEXT, *PNM_NODE_CREATE_CONTEXT;
typedef struct _NM_NODE { LIST_ENTRY Linkage; DWORD NodeId; CLUSTER_NODE_STATE State; CLUSTER_NODE_STATE ExtendedState; DWORD Flags; DWORD InterfaceCount; LIST_ENTRY InterfaceList; DWORD HighestVersion; DWORD LowestVersion; RPC_BINDING_HANDLE ReportRpcBinding; // for net connectivity reports
RPC_BINDING_HANDLE IsolateRpcBinding; // for net failure isolation
SUITE_TYPE ProductSuite; DWORD DefaultRpcBindingGeneration; } NM_NODE;
#define NM_NODE_SIG 'edon'
typedef struct _NM_NODE_AUX_INFO{ DWORD dwSize; DWORD dwVer; SUITE_TYPE ProductSuite; }NM_NODE_AUX_INFO, *PNM_NODE_AUX_INFO;
typedef struct { LPCWSTR NodeId; HLOCALXSACTION Xaction; DWORD Status; } NM_EVICTION_CONTEXT, *PNM_EVICTION_CONTEXT;
#define NM_NODE_UP(node) \
( ( (node)->State == ClusterNodeUp ) || \ ( (node)->State == ClusterNodePaused ) )
//
// Network definitions
//
typedef struct _NM_STATE_WORK_ENTRY { NM_STATE_ENTRY State; DWORD ReachableCount; } NM_STATE_WORK_ENTRY, *PNM_STATE_WORK_ENTRY;
typedef PNM_STATE_WORK_ENTRY PNM_STATE_WORK_VECTOR;
typedef PNM_STATE_ENTRY PNM_CONNECTIVITY_MATRIX;
#define NM_SIZEOF_CONNECTIVITY_MATRIX(_VectorSize) \
(sizeof(NM_STATE_ENTRY) * _VectorSize *_VectorSize)
#define NM_NEXT_CONNECTIVITY_MATRIX_ROW(_CurrentRowPtr, _VectorSize) \
(_CurrentRowPtr + (_VectorSize * sizeof(NM_STATE_ENTRY)))
#define NM_GET_CONNECTIVITY_MATRIX_ROW(_MatrixPtr, _RowNumber, _VectorSize) \
(_MatrixPtr + (_RowNumber * (_VectorSize * sizeof(NM_STATE_ENTRY))))
#define NM_GET_CONNECTIVITY_MATRIX_ENTRY( \
_MatrixPtr, \ _RowNumber, \ _ColNumber, \ _VectorSize \ ) \ ( _MatrixPtr + \ (_RowNumber * (_VectorSize * sizeof(NM_STATE_ENTRY))) + \ (_ColNumber * sizeof(NM_STATE_ENTRY)) \ )
typedef struct _NM_NETWORK { LIST_ENTRY Linkage; CL_NETWORK_ID ShortId; CLUSTER_NETWORK_STATE State; DWORD Flags; CLUSTER_NETWORK_ROLE Role; DWORD Priority; LPWSTR Transport; LPWSTR Address; LPWSTR AddressMask; LPWSTR Description; LPWSTR MulticastAddress; PVOID MulticastKey; DWORD MulticastKeyLength; PVOID MulticastKeySalt; DWORD MulticastKeySaltLength; time_t MulticastLeaseObtained; time_t MulticastLeaseExpires; MCAST_CLIENT_UID MulticastLeaseRequestId; LPWSTR MulticastLeaseServer; DWORD InterfaceCount; PNM_INTERFACE LocalInterface; PNM_CONNECTIVITY_VECTOR ConnectivityVector; PNM_CONNECTIVITY_MATRIX ConnectivityMatrix; PNM_STATE_WORK_VECTOR StateWorkVector; DWORD ConnectivityReportTimer; DWORD StateRecalcTimer; DWORD FailureIsolationTimer; DWORD RegistrationRetryTimer; DWORD RegistrationRetryTimeout; DWORD McastAddressRenewTimer; DWORD McastAddressReleaseRetryTimer; DWORD McastAddressReconfigureRetryTimer; DWORD ConnectivityReportRetryCount; CLRTL_WORK_ITEM WorkItem; CLRTL_WORK_ITEM MadcapWorkItem; LIST_ENTRY McastAddressReleaseList; LIST_ENTRY InterfaceList; LIST_ENTRY InternalLinkage; } NM_NETWORK;
#define NM_NETWORK_SIG 'ten'
//
// State flags
//
#define NM_FLAG_NET_WORKER_RUNNING 0x00000001
#define NM_FLAG_NET_REGISTERED 0x00000002
#define NM_FLAG_NET_MULTICAST_ENABLED 0x00000004
#define NM_FLAG_NET_MADCAP_WORKER_RUNNING 0x00000008
//
// Work Flags
//
#define NM_FLAG_NET_REPORT_LOCAL_IF_UP 0x00000100
#define NM_FLAG_NET_REPORT_CONNECTIVITY 0x00000200
#define NM_FLAG_NET_RECALC_STATE 0x00000400
#define NM_FLAG_NET_ISOLATE_FAILURE 0x00000800
#define NM_FLAG_NET_NEED_TO_REGISTER 0x00002000
#define NM_FLAG_NET_REPORT_LOCAL_IF_FAILED 0x00004000
#define NM_FLAG_NET_RENEW_MCAST_ADDRESS 0x00008000
#define NM_FLAG_NET_RELEASE_MCAST_ADDRESS 0x00010000
#define NM_FLAG_NET_RECONFIGURE_MCAST 0x00020000
#define NM_NET_WORK_FLAGS \
(NM_FLAG_NET_ISOLATE_FAILURE | \ NM_FLAG_NET_RECALC_STATE | \ NM_FLAG_NET_NEED_TO_REGISTER)
#define NM_NET_IF_WORK_FLAGS \
(NM_FLAG_NET_REPORT_LOCAL_IF_UP | \ NM_FLAG_NET_REPORT_LOCAL_IF_FAILED) #define NM_NET_MADCAP_WORK_FLAGS \
(NM_FLAG_NET_RENEW_MCAST_ADDRESS | \ NM_FLAG_NET_RELEASE_MCAST_ADDRESS | \ NM_FLAG_NET_RECONFIGURE_MCAST)
#define NmpIsNetworkRegistered(_network) \
((_network)->Flags & NM_FLAG_NET_REGISTERED)
#define NmpIsNetworkForInternalUse(_network) \
((_network)->Role & ClusterNetworkRoleInternalUse)
#define NmpIsNetworkForClientAccess(_network) \
((_network)->Role & ClusterNetworkRoleClientAccess)
#define NmpIsNetworkForInternalAndClientUse(_network) \
((_network)->Role == ClusterNetworkRoleInternalAndClient)
#define NmpIsNetworkDisabledForUse(_network) \
((_network)->Role == ClusterNetworkRoleNone)
#define NmpIsNetworkEnabledForUse(_network) \
((_network)->Role != ClusterNetworkRoleNone) #define NmpIsNetworkMulticastEnabled(_network) \
((_network)->Flags & NM_FLAG_NET_MULTICAST_ENABLED)
//
// Network deferred-work timers.
//
// The timer fires every 300ms. One heartbeat (HB) period is 1200ms.
//
// An interface is declared unreachable by ClusNet after two missed HBs.
// On average, an interface will fail in the middle of a ClusNet HB period.
// So, the avg time for ClusNet to detect and report an interface failure
// is 600 + 2400 = 3000ms. The worst case is 1200 + 2400 = 3600ms.
// The best case is 2400ms.
//
// If there are >2 nodes active on a network, it is desirable to
// aggregate interface failure reports when an entire network fails;
// however, we do not know how long it took for ClusNet to make the first
// report. Thus, we assume that the first interface failure was detected
// in the avg time and wait the for the worst case time before reporting.
//
// In the 2 node case, there is no aggregation to be performed so we report
// failures immediately. We always report InterfaceUp and InterfaceFailed
// events immediately. We also report immediately after a NodeDown event.
//
// State recalculation should be performed only after all nodes have reported
// their connectivity changes after a failure. There is spread of 1200ms
// between the best and worst case reporting times. Arbitrary scheduling and
// communication delays can widen the spread even more in the worst case.
// The best we can do is make a good guess. Once in a while, we will
// recalculate too soon. This isn't a disaster since the state calculation
// algorithm will abort if it has partial information. Further, we wait an
// additional period before trying to isolate any connectivity failures that
// were detected. We do this in order to avoid inducing unnecessary
// cluster resource failures.
//
// Note that since we invalidate the connectivity vectors for dead nodes
// after regroup, we only need to delay long enough for each of the nodes
// to process the node down event and fire off a connectivity report.
//
#define NM_NET_CONNECTIVITY_REPORT_TIMEOUT 600 // 3600 - 3000
#define NM_NET_STATE_RECALC_TIMEOUT 2400 // 3600 - 2400 + 1200
#define NM_NET_STATE_RECALC_TIMEOUT_AFTER_REGROUP 900
#define NM_NET_STATE_FAILURE_ISOLATION_TIMEOUT 3600
#define NM_NET_STATE_FAILURE_ISOLATION_POLL 60000 // Change Default to 1 min after testing
#define NM_NET_STATE_INTERFACE_FAILURE_TIMEOUT 3600
#define NmpIsNetworkWorkerRunning(_network) \
((_network)->Flags & NM_FLAG_NET_WORKER_RUNNING)
#define NmpIsNetworkMadcapWorkerRunning(_network) \
((_network)->Flags & NM_FLAG_NET_MADCAP_WORKER_RUNNING)
#define NM_CONNECTIVITY_REPORT_RETRY_LIMIT 20 // 10 seconds
#define NM_NET_MIN_REGISTRATION_RETRY_TIMEOUT 500 // half a second
#define NM_NET_MAX_REGISTRATION_RETRY_TIMEOUT (10*60*1000) // 10 minutes
//
// Network interface definitions
//
typedef struct _NM_INTERFACE { LIST_ENTRY Linkage; DWORD NetIndex; DWORD Flags; CLUSTER_NETINTERFACE_STATE State; PNM_NODE Node; PNM_NETWORK Network; LPWSTR AdapterName; LPWSTR AdapterId; LPWSTR Address; ULONG BinaryAddress; LPWSTR ClusnetEndpoint; LPWSTR Description; LIST_ENTRY NetworkLinkage; LIST_ENTRY NodeLinkage; } NM_INTERFACE;
#define NM_INTERFACE_SIG ' fi'
#define NM_FLAG_IF_REGISTERED 0x00000002
#define NmpIsInterfaceRegistered(_interface) \
((_interface)->Flags & NM_FLAG_IF_REGISTERED)
//
// This structure is used to hook changes in the node leadership.
//
typedef struct _NM_LEADER_CHANGE_WAIT_ENTRY { LIST_ENTRY Linkage; HANDLE LeaderChangeEvent; } NM_LEADER_CHANGE_WAIT_ENTRY, *PNM_LEADER_CHANGE_WAIT_ENTRY;
//
// This structure is used for asynchronous network connectivity reports.
//
typedef struct _NM_CONNECTIVITY_REPORT_CONTEXT { NM_LEADER_CHANGE_WAIT_ENTRY LeaderChangeWaitEntry; HANDLE ConnectivityReportEvent; } NM_CONNECTIVITY_REPORT_CONTEXT, *PNM_CONNECTIVITY_REPORT_CONTEXT;
// the fixup callback record stored by nm on behalf of other components to perform
//form or join fixups.
typedef struct _NM_FIXUP_CB_RECORD{ NM_FIXUP_NOTIFYCB pfnFixupNotifyCb; DWORD dwFixupMask; }NM_FIXUP_CB_RECORD,*PNM_FIXUP_CB_RECORD;
//the fixup callback functions for updating in-memory structure after
//updatinbg the registry
typedef DWORD (WINAPI *NM_POST_FIXUP_CB)(VOID);
// fixup callback record used to pass argumnets to NmUpdatePerformFixups2
// update type handler
typedef struct _NM_FIXUP_CB_RECORD2{ NM_FIXUP_NOTIFYCB pfnFixupNotifyCb; // pointer to fn that builds up the fixup property list
DWORD dwFixupMask; PRESUTIL_PROPERTY_ITEM pPropertyTable; // Property table for this key
} NM_FIXUP_CB_RECORD2,*PNM_FIXUP_CB_RECORD2;
//
// Global Data
//
extern CRITICAL_SECTION NmpLock; extern HANDLE NmpMutex; extern NM_STATE NmpState; extern DWORD NmpActiveThreadCount; extern HANDLE NmpShutdownEvent; extern LIST_ENTRY NmpNodeList; extern PNM_NODE * NmpIdArray; extern BOOLEAN NmpNodeCleanupOk; extern LIST_ENTRY NmpNetworkList; extern LIST_ENTRY NmpInternalNetworkList; extern LIST_ENTRY NmpDeletedNetworkList; extern DWORD NmpNetworkCount; extern DWORD NmpInternalNetworkCount; extern DWORD NmpClientNetworkCount; extern LIST_ENTRY NmpInterfaceList; extern LIST_ENTRY NmpDeletedInterfaceList; extern RESUTIL_PROPERTY_ITEM NmpNetworkProperties[]; extern RESUTIL_PROPERTY_ITEM NmpInterfaceProperties[]; extern CL_NODE_ID NmpJoinerNodeId; extern CL_NODE_ID NmpSponsorNodeId; extern DWORD NmpJoinTimer; extern BOOLEAN NmpJoinAbortPending; extern DWORD NmpJoinSequence; extern BOOLEAN NmpJoinerUp; extern BOOLEAN NmpJoinBeginInProgress; extern BOOLEAN NmpJoinerOutOfSynch; extern WCHAR NmpInvalidJoinerIdString[]; extern WCHAR NmpUnknownString[]; extern LPWSTR NmpClusnetEndpoint; extern NM_STATE NmpState; extern CL_NODE_ID NmpLeaderNodeId; extern BITSET NmpUpNodeSet; extern WCHAR NmpNullString[]; extern CLUSTER_NETWORK_ROLE NmpDefaultNetworkRole; extern BOOL NmpCleanupIfJoinAborted; extern DWORD NmpAddNodeId; extern LIST_ENTRY NmpLeaderChangeWaitList; extern LIST_ENTRY * NmpIntraClusterRpcArr; extern CRITICAL_SECTION NmpRPCLock; extern BOOL NmpLastNodeEvicted; extern DWORD NmpNodeCount; extern BOOLEAN NmpIsNT5NodeInCluster; extern LPWSTR NmpClusterInstanceId;
#if DBG
extern DWORD NmpRpcTimer;
#endif //DBG
//
// Synchronization macros
//
#define NmpAcquireLock() EnterCriticalSection(&NmpLock)
#define NmpReleaseLock() LeaveCriticalSection(&NmpLock)
#define NmpAcquireMutex() \
{ \ DWORD _status = WaitForSingleObject(NmpMutex, INFINITE); \ CL_ASSERT(_status == WAIT_OBJECT_0); \ } \
#define NmpReleaseMutex() ReleaseMutex(NmpMutex);
//
// Node Intracluster RPC record/cancellation routines.
// Useful to terminate outstanding RPCs to failed nodes.
//
#define NM_RPC_TIMEOUT 45000 // 45 secs
typedef struct _NM_INTRACLUSTER_RPC_THREAD { LIST_ENTRY Linkage; BOOLEAN Cancelled; HANDLE Thread; DWORD ThreadId; }NM_INTRACLUSTER_RPC_THREAD, *PNM_INTRACLUSTER_RPC_THREAD;
#define NmpAcquireRPCLock() EnterCriticalSection(&NmpRPCLock);
#define NmpReleaseRPCLock() LeaveCriticalSection(&NmpRPCLock);
VOID NmpTerminateRpcsToNode( DWORD NodeId );
VOID NmpRpcTimerTick( DWORD MsTickInterval );
//
// IsolationPollTimerValue read routine
//
DWORD NmpGetIsolationPollTimerValue( VOID );
//
// Miscellaneous Routines
//
BOOLEAN NmpLockedEnterApi( NM_STATE RequiredState );
BOOLEAN NmpEnterApi( NM_STATE RequiredState );
VOID NmpLeaveApi( VOID );
VOID NmpLockedLeaveApi( VOID );
LPWSTR NmpLoadString( IN UINT StringId );
VOID NmpDbgPrint( IN ULONG LogLevel, IN PCHAR FormatString, ... );
DWORD NmpCleanseRegistry( IN LPCWSTR NodeId, IN HLOCALXSACTION Xaction );
DWORD NmpQueryString( IN HDMKEY Key, IN LPCWSTR ValueName, IN DWORD ValueType, IN LPWSTR *StringBuffer, IN OUT LPDWORD StringBufferSize, OUT LPDWORD StringSize );
BOOL NmpCleanseResTypeCallback( IN PNM_EVICTION_CONTEXT Context, IN PVOID Context2, IN PFM_RESTYPE pResType, IN LPCWSTR pszResTypeName );
BOOL NmpCleanseResourceCallback( IN PNM_EVICTION_CONTEXT Context, IN PVOID Context2, IN PFM_RESOURCE Resource, IN LPCWSTR ResourceName );
BOOL NmpCleanseGroupCallback( IN PNM_EVICTION_CONTEXT Context, IN PVOID Context2, IN PFM_GROUP Group, IN LPCWSTR GroupName );
VOID NmpIssueClusterPropertyChangeEvent( VOID );
DWORD NmpMarshallObjectInfo( IN const PRESUTIL_PROPERTY_ITEM PropertyTable, IN PVOID ObjectInfo, OUT PVOID * PropertyList, OUT LPDWORD PropertyListSize );
BOOLEAN NmpVerifyNodeConnectivity( PNM_NODE Node1, PNM_NODE Node2, PNM_NETWORK ExcludedNetwork );
BOOLEAN NmpVerifyConnectivity( PNM_NETWORK ExcludedNetwork );
BOOLEAN NmpVerifyJoinerConnectivity( IN PNM_NODE JoiningNode, OUT PNM_NODE * UnreachableNode );
//
// Node Management Routines
//
DWORD NmpInitNodes( VOID );
VOID NmpCleanupNodes( VOID );
DWORD NmpGetNodeDefinition( IN OUT PNM_NODE_INFO2 NodeInfo );
DWORD NmpEnumNodeDefinitions( PNM_NODE_ENUM2 * NodeEnum );
DWORD NmpCreateNodeObjects( IN PNM_NODE_ENUM2 NodeEnum2 );
DWORD NmpRefreshNodeObjects( );
DWORD NmpCreateLocalNodeObject( IN PNM_NODE_INFO2 NodeInfo2 );
PNM_NODE NmpCreateNodeObject( IN PNM_NODE_INFO2 NodeInfo );
DWORD NmpGetNodeObjectInfo( IN PNM_NODE Node, IN OUT PNM_NODE_INFO2 NodeInfo );
VOID NmpDeleteNodeObject( IN PNM_NODE Node, IN BOOLEAN IssueEvent );
BOOL NmpDestroyNodeObject( PNM_NODE Node );
DWORD NmpEnumNodeObjects( PNM_NODE_ENUM2 * NodeEnum );
VOID NmpNodeFailureHandler( CL_NODE_ID NodeId, LPVOID NodeFailureContext );
DWORD NmpSetNodeInterfacePriority( IN PNM_NODE Node, IN DWORD Priority, IN PNM_INTERFACE TargetInterface OPTIONAL, IN DWORD TargetInterfacePriority OPTIONAL );
DWORD NmpEnumNodeObjects( PNM_NODE_ENUM2 * NodeEnum2 );
DWORD NmpAddNode( IN LPCWSTR NewNodeName, IN DWORD NewNodeHighestVersion, IN DWORD NewNodeLowestVersion, IN DWORD NewNodeProductSuite, IN DWORD RegistryNodeLimit );
BOOLEAN NmpIsAddNodeAllowed( IN DWORD NewNodeProductSuite, IN DWORD RegistryNodeLimit, OUT LPDWORD EffectiveNodeLimit OPTIONAL );
VOID NmpAdviseNodeFailure( IN PNM_NODE Node, IN DWORD ErrorCode );
//
// PnP Management Routines
//
DWORD NmpInitializePnp( VOID );
VOID NmpShutdownPnp( VOID );
VOID NmpCleanupPnp( VOID );
VOID NmpWatchForPnpEvents( VOID );
DWORD NmpEnablePnpEvents( VOID );
DWORD NmpPostPnpNotification( BOOLEAN IsPnpLockHeld );
DWORD NmpConfigureNetworks( IN RPC_BINDING_HANDLE JoinSponsorBinding, IN LPWSTR LocalNodeId, IN LPWSTR LocalNodeName, IN PNM_NETWORK_ENUM * NetworkEnum, IN PNM_INTERFACE_ENUM2 * InterfaceEnum, IN LPWSTR DefaultEndpoint, IN OUT LPDWORD MatchedNetworkCount, IN OUT LPDWORD NewNetworkCount, IN BOOL RenameConnectoids );
//
// Network Management Routines
//
DWORD NmpInitializeNetworks( VOID );
VOID NmpCleanupNetworks( VOID );
DWORD NmpSetNetworkRole( PNM_NETWORK Network, CLUSTER_NETWORK_ROLE NewRole, HLOCALXSACTION Xaction, HDMKEY NetworkKey );
DWORD NmpCreateNetwork( IN RPC_BINDING_HANDLE JoinSponsorBinding, IN PNM_NETWORK_INFO NetworkInfo, IN PNM_INTERFACE_INFO2 InterfaceInfo );
DWORD NmpGlobalCreateNetwork( IN PNM_NETWORK_INFO NetworkInfo, IN PNM_INTERFACE_INFO2 InterfaceInfo );
DWORD NmpCreateNetworkDefinition( IN PNM_NETWORK_INFO NetworkInfo, IN HLOCALXSACTION Xaction );
DWORD NmpSetNetworkNameDefinition( IN PNM_NETWORK_INFO NetworkInfo, IN HLOCALXSACTION Xaction );
DWORD NmpGetNetworkDefinition( IN LPWSTR NetworkId, OUT PNM_NETWORK_INFO NetworkInfo );
DWORD NmpEnumNetworkDefinitions( OUT PNM_NETWORK_ENUM * NetworkEnum );
DWORD NmpCreateNetworkObjects( IN PNM_NETWORK_ENUM NetworkEnum );
PNM_NETWORK NmpCreateNetworkObject( IN PNM_NETWORK_INFO NetworkInfo );
DWORD NmpGetNetworkObjectInfo( IN PNM_NETWORK Network, OUT PNM_NETWORK_INFO NetworkInfo );
VOID NmpDeleteNetworkObject( IN PNM_NETWORK Network, IN BOOLEAN IssueEvent );
BOOL NmpDestroyNetworkObject( PNM_NETWORK Network );
DWORD NmpEnumNetworkObjects( OUT PNM_NETWORK_ENUM * NetworkEnum );
DWORD NmpRegisterNetwork( IN PNM_NETWORK Network, IN BOOLEAN RetryOnFailure );
VOID NmpDeregisterNetwork( IN PNM_NETWORK Network );
VOID NmpInsertInternalNetwork( PNM_NETWORK Network );
DWORD NmpValidateNetworkRoleChange( PNM_NETWORK Network, CLUSTER_NETWORK_ROLE NewRole );
DWORD NmpNetworkValidateCommonProperties( IN PNM_NETWORK Network, IN PVOID InBuffer, IN DWORD InBufferSize, OUT PNM_NETWORK_INFO NetworkInfo OPTIONAL );
DWORD NmpSetNetworkName( IN PNM_NETWORK_INFO NetworkInfo );
DWORD NmpGlobalSetNetworkName( IN PNM_NETWORK_INFO NetworkInfo );
VOID NmpRecomputeNT5NetworkAndInterfaceStates( VOID );
BOOLEAN NmpComputeNetworkAndInterfaceStates( PNM_NETWORK Network, BOOLEAN IsolateFailure, CLUSTER_NETWORK_STATE * NewNetworkState );
VOID NmpStartNetworkConnectivityReportTimer( PNM_NETWORK Network );
VOID NmpStartNetworkStateRecalcTimer( PNM_NETWORK Network, DWORD Timeout );
VOID NmpStartNetworkFailureIsolationTimer( PNM_NETWORK Network, DWORD Timeout );
VOID NmpStartNetworkRegistrationRetryTimer( PNM_NETWORK Network );
VOID NmpScheduleNetworkConnectivityReport( PNM_NETWORK Network );
VOID NmpScheduleNetworkStateRecalc( PNM_NETWORK Network );
VOID NmpScheduleNetworkRegistration( PNM_NETWORK Network );
DWORD NmpScheduleConnectivityReportWorker( VOID );
DWORD NmpScheduleNetworkWorker( PNM_NETWORK Network );
VOID NmpConnectivityReportWorker( IN PCLRTL_WORK_ITEM WorkItem, IN DWORD Status, IN DWORD BytesTransferred, IN ULONG_PTR IoContext );
VOID NmpNetworkWorker( IN PCLRTL_WORK_ITEM WorkItem, IN DWORD Status, IN DWORD BytesTransferred, IN ULONG_PTR IoContext );
VOID NmpNetworkTimerTick( IN DWORD MsTickInterval );
VOID NmpSetNetworkAndInterfaceStates( IN PNM_NETWORK Network, IN CLUSTER_NETWORK_STATE NewNetworkState, IN PNM_STATE_ENTRY InterfaceStateVector, IN DWORD VectorSize );
VOID NmpUpdateNetworkConnectivityForDownNode( PNM_NODE Node );
DWORD NmpEnumNetworkObjectStates( OUT PNM_NETWORK_STATE_ENUM * NetworkStateEnum );
VOID NmpFreeNetworkStateEnum( PNM_NETWORK_STATE_ENUM NetworkStateEnum );
DWORD NmpReportNetworkConnectivity( IN PNM_NETWORK Network );
DWORD NmpGlobalSetNetworkAndInterfaceStates( PNM_NETWORK Network, CLUSTER_NETWORK_STATE NewNetworkState );
VOID NmpReferenceNetwork( PNM_NETWORK Network );
VOID NmpDereferenceNetwork( PNM_NETWORK Network );
PNM_NETWORK NmpReferenceNetworkByAddress( LPWSTR NetworkAddress );
DWORD NmpEnumInternalNetworks( OUT LPDWORD NetworkCount, OUT PNM_NETWORK * NetworkList[] );
DWORD NmpSetNetworkPriorityOrder( IN DWORD NetworkCount, IN PNM_NETWORK * NetworkList, IN HLOCALXSACTION Xaction );
DWORD NmpGetNetworkInterfaceFailureTimerValue( IN LPCWSTR NetworkId );
BOOLEAN NmpCheckForNetwork( VOID );
//
// Network Multicast Management Routines
//
DWORD NmpCleanupMulticast( VOID );
DWORD NmpRefreshMulticastConfiguration( IN PNM_NETWORK Network );
DWORD NmpRefreshClusterMulticastConfiguration( VOID );
DWORD NmpMulticastRegenerateKey( IN PNM_NETWORK Network );
DWORD NmpMulticastValidatePrivateProperties( IN PNM_NETWORK Network, IN HDMKEY RegistryKey, IN PVOID InBuffer, IN DWORD InBufferSize );
VOID NmpScheduleMulticastAddressRenewal( PNM_NETWORK Network );
VOID NmpScheduleMulticastAddressRelease( PNM_NETWORK Network );
VOID NmpFreeMulticastAddressReleaseList( IN PNM_NETWORK Network );
DWORD NmpMulticastManualConfigChange( IN PNM_NETWORK Network, IN HDMKEY NetworkKey, IN HDMKEY NetworkParametersKey, IN PVOID InBuffer, IN DWORD InBufferSize, OUT BOOLEAN * SetProperties );
DWORD NmpUpdateSetNetworkMulticastConfiguration( IN BOOL SourceNode, IN LPWSTR NetworkId, IN PVOID UpdateBuffer, IN PVOID PropBuffer, IN LPDWORD PropBufferSize );
DWORD NmpStartMulticast( IN PNM_NETWORK Network OPTIONAL );
DWORD NmpStopMulticast( IN PNM_NETWORK Network OPTIONAL );
VOID NmpMulticastInitialize( VOID );
BOOLEAN NmpIsClusterMulticastReady( IN BOOLEAN CheckNodeCount );
VOID NmpMulticastProcessClusterVersionChange( VOID );
//
// Interface Management Routines
//
DWORD NmpInitializeInterfaces( VOID );
VOID NmpCleanupInterfaces( VOID );
DWORD NmpCreateInterface( IN RPC_BINDING_HANDLE JoinSponsorBinding, IN PNM_INTERFACE_INFO2 InterfaceInfo );
DWORD NmpGlobalCreateInterface( IN PNM_INTERFACE_INFO2 InterfaceInfo );
DWORD NmpSetInterfaceInfo( IN RPC_BINDING_HANDLE JoinSponsorBinding, IN PNM_INTERFACE_INFO2 InterfaceInfo );
DWORD NmpLocalSetInterfaceInfo( IN PNM_INTERFACE Interface, IN PNM_INTERFACE_INFO2 InterfaceInfo, IN HLOCALXSACTION Xaction );
DWORD NmpGlobalSetInterfaceInfo( IN PNM_INTERFACE_INFO2 InterfaceInfo );
DWORD NmpDeleteInterface( IN RPC_BINDING_HANDLE JoinSponsorBinding, IN LPWSTR InterfaceId, IN LPWSTR NetworkId, IN OUT PBOOLEAN NetworkDeleted );
DWORD NmpGlobalDeleteInterface( IN LPWSTR InterfaceId, IN OUT PBOOLEAN NetworkDeleted );
DWORD NmpInterfaceValidateCommonProperties( IN PNM_INTERFACE Interface, IN PVOID InBuffer, IN DWORD InBufferSize, OUT PNM_INTERFACE_INFO2 InterfaceInfo OPTIONAL );
DWORD NmpCreateInterfaceDefinition( IN PNM_INTERFACE_INFO2 InterfaceInfo, IN HLOCALXSACTION Xaction );
DWORD NmpGetInterfaceDefinition( IN LPWSTR InterfaceId, OUT PNM_INTERFACE_INFO2 InterfaceInfo );
DWORD NmpSetInterfaceDefinition( IN PNM_INTERFACE_INFO2 InterfaceInfo, IN HLOCALXSACTION Xaction );
DWORD NmpEnumInterfaceDefinitions( OUT PNM_INTERFACE_ENUM2 * InterfaceEnum );
DWORD NmpCreateInterfaceObjects( IN PNM_INTERFACE_ENUM2 InterfaceEnum );
PNM_INTERFACE NmpCreateInterfaceObject( IN PNM_INTERFACE_INFO2 InterfaceInfo, IN BOOLEAN RetryOnFailure
);
DWORD NmpGetInterfaceObjectInfo1( IN PNM_INTERFACE Interface, IN OUT PNM_INTERFACE_INFO InterfaceInfo1 );
DWORD NmpGetInterfaceObjectInfo( IN PNM_INTERFACE Interface, IN OUT PNM_INTERFACE_INFO2 InterfaceInfo );
VOID NmpDeleteInterfaceObject( IN PNM_INTERFACE Interface, IN BOOLEAN IssueEvent );
BOOL NmpDestroyInterfaceObject( PNM_INTERFACE Interface );
DWORD NmpEnumInterfaceObjects1( OUT PNM_INTERFACE_ENUM * InterfaceEnum1 );
DWORD NmpEnumInterfaceObjects( OUT PNM_INTERFACE_ENUM2 * InterfaceEnum );
DWORD NmpRegisterInterface( IN PNM_INTERFACE Interface, IN BOOLEAN RetryOnFailure );
VOID NmpDeregisterInterface( IN PNM_INTERFACE Interface );
DWORD NmpPrepareToCreateInterface( IN PNM_INTERFACE_INFO2 InterfaceInfo, OUT PNM_NETWORK * Network, OUT PNM_NODE * Node );
PNM_INTERFACE NmpGetInterfaceForNodeAndNetworkById( IN CL_NODE_ID NodeId, IN CL_NETWORK_ID NetworkId );
VOID NmpFreeInterfaceStateEnum( PNM_INTERFACE_STATE_ENUM InterfaceStateEnum );
DWORD NmpEnumInterfaceObjectStates( OUT PNM_INTERFACE_STATE_ENUM * InterfaceStateEnum );
VOID NmpProcessLocalInterfaceStateEvent( IN PNM_INTERFACE Interface, IN CLUSTER_NETINTERFACE_STATE NewState );
DWORD NmpReportInterfaceConnectivity( IN RPC_BINDING_HANDLE RpcBinding, IN LPWSTR InterfaceId, IN PNM_CONNECTIVITY_VECTOR ConnectivityVector, IN LPWSTR NetworkId );
VOID NmpProcessInterfaceConnectivityReport( IN PNM_INTERFACE SourceInterface, IN PNM_CONNECTIVITY_VECTOR ConnectivityVector );
DWORD NmpInterfaceCheckThread( LPDWORD Context );
VOID NmpReportLocalInterfaceStateEvent( IN CL_NODE_ID NodeId, IN CL_NETWORK_ID NetworkId, IN DWORD NewState );
DWORD NmpConvertPropertyListToInterfaceInfo( IN PVOID InterfacePropertyList, IN DWORD InterfacePropertyListSize, PNM_INTERFACE_INFO2 InterfaceInfo );
VOID NmpSetInterfaceConnectivityData( PNM_NETWORK Network, DWORD InterfaceNetIndex, CLUSTER_NETINTERFACE_STATE State );
DWORD NmpTestInterfaceConnectivity( PNM_INTERFACE Interface1, PBOOLEAN Interface1HasConnectivity, PNM_INTERFACE Interface2, PBOOLEAN Interfacet2HasConnectivity );
DWORD NmpBuildInterfaceOnlineAddressEnum( PNM_INTERFACE Interface, PNM_ADDRESS_ENUM * OnlineAddressEnum );
DWORD NmpBuildInterfacePingAddressEnum( PNM_INTERFACE Interface, PNM_ADDRESS_ENUM OnlineAddressEnum, PNM_ADDRESS_ENUM * PingAddressEnum );
BOOLEAN NmpVerifyLocalInterfaceConnected( IN PNM_INTERFACE Interface );
//
// Membership Management Routines
//
DWORD NmpMembershipInit( VOID );
VOID NmpMembershipShutdown( VOID );
VOID NmpMarkNodeUp( CL_NODE_ID NodeId );
VOID NmpNodeUpEventHandler( IN PNM_NODE Node );
VOID NmpNodeDownEventHandler( IN PNM_NODE Node );
DWORD NmpMultiNodeDownEventHandler( IN BITSET DownedNodeSet );
DWORD NmpNodeChange( DWORD NodeId, NODESTATUS newstatus );
BOOL NmpCheckQuorumEventHandler( VOID );
VOID NmpHoldIoEventHandler( VOID );
VOID NmpResumeIoEventHandler( VOID );
VOID NmpHaltEventHandler( IN DWORD HaltCode );
VOID NmpJoinAbort( DWORD AbortStatus, PNM_NODE JoinerNode );
//
// Routines for joining nodes to a cluster
//
DWORD NmpCreateJoinerRpcBindings( IN PNM_NODE JoinerNode, IN PNM_INTERFACE JoinerInterface );
//
// Gum update message types.
//
// The first entries in this list are auto-marshalled through Gum...Ex.
// Any updates that are not auto-marshalled must come after NmUpdateMaxAuto
//
typedef enum { NmUpdateCreateNode = 0, NmUpdatePauseNode, NmUpdateResumeNode, NmUpdateEvictNode, NmUpdateCreateNetwork, NmUpdateSetNetworkName, NmUpdateSetNetworkPriorityOrder, NmUpdateSetNetworkCommonProperties, NmUpdateCreateInterface, NmUpdateSetInterfaceInfo, NmUpdateSetInterfaceCommonProperties, NmUpdateDeleteInterface, NmUpdateJoinBegin, NmUpdateJoinAbort, //
// Version 2 (NT 5.0) extensions that are understood by
// NT4 SP4 4.
//
NmUpdateJoinBegin2, NmUpdateSetNetworkAndInterfaceStates, NmUpdatePerformFixups, NmUpdatePerformFixups2, //
// Version 2 (NT 5.0) extensions that are not understood
// by NT4 SP4. These may not be issued in a mixed NT4/NT5 cluster.
//
NmUpdateAddNode, NmUpdateExtendedNodeState, //
// NT 5.1 extensions that are not understood by NT5 and
// earlier. NT5 nodes will ignore these updates without
// error.
//
NmUpdateSetNetworkMulticastConfiguration, //
// Max handled automatically by GUM
//
NmUpdateMaxAuto = 0x10000,
NmUpdateJoinComplete,
NmUpdateMaximum } NM_GUM_MESSAGE_TYPES;
#pragma warning( disable: 4200 )
typedef struct _NM_JOIN_UPDATE { DWORD JoinSequence; DWORD IsPaused; WCHAR NodeId[0]; } NM_JOIN_UPDATE, *PNM_JOIN_UPDATE; #pragma warning( default: 4200 )
DWORD NmpGumUpdateHandler( IN DWORD Context, IN BOOL SourceNode, IN DWORD BufferLength, IN PVOID Buffer );
DWORD NmpUpdateAddNode( IN BOOL SourceNode, IN LPDWORD NewNodeId, IN LPCWSTR NewNodeName, IN LPDWORD NewNodeHighestVersion, IN LPDWORD NewNodeLowestVersion, IN LPDWORD NewNodeProductSuite );
DWORD NmpUpdateCreateNode( IN BOOL SourceNode, IN LPDWORD NodeId );
DWORD NmpUpdatePauseNode( IN BOOL SourceNode, IN LPWSTR NodeName );
DWORD NmpUpdateResumeNode( IN BOOL SourceNode, IN LPWSTR NodeName );
DWORD NmpUpdateEvictNode( IN BOOL SourceNode, IN LPWSTR NodeName );
DWORD NmpUpdateCreateNetwork( IN BOOL IsSourceNode, IN PVOID NetworkPropertyList, IN LPDWORD NetworkPropertyListSize, IN PVOID InterfacePropertyList, IN LPDWORD InterfacePropertyListSize );
DWORD NmpUpdateSetNetworkName( IN BOOL IsSourceNode, IN LPWSTR NetworkId, IN LPWSTR Name );
DWORD NmpUpdateSetNetworkPriorityOrder( IN BOOL IsSourceNode, IN LPCWSTR NetworkIdList );
DWORD NmpUpdateSetNetworkCommonProperties( IN BOOL IsSourceNode, IN LPWSTR NetworkId, IN UCHAR * PropertyList, IN LPDWORD PropertyListLength );
DWORD NmpUpdateCreateInterface( IN BOOL IsSourceNode, IN PVOID InterfacePropertyList, IN LPDWORD InterfacePropertyListSize );
DWORD NmpUpdateSetInterfaceInfo( IN BOOL SourceNode, IN PVOID InterfacePropertyList, IN LPDWORD InterfacePropertyListSize );
DWORD NmpUpdateSetInterfaceCommonProperties( IN BOOL IsSourceNode, IN LPWSTR InterfaceId, IN UCHAR * PropertyList, IN LPDWORD PropertyListLength );
DWORD NmpUpdateDeleteInterface( IN BOOL IsSourceNode, IN LPWSTR InterfaceId );
DWORD NmpUpdateJoinBegin( IN BOOL SourceNode, IN LPWSTR JoinerNodeId, IN LPWSTR JoinerNodeName, IN LPWSTR SponsorNodeId );
DWORD NmpUpdateJoinComplete( IN PNM_JOIN_UPDATE JoinUpdate );
DWORD NmpUpdateJoinAbort( IN BOOL SourceNode, IN LPDWORD JoinSequence, IN LPWSTR JoinerNodeId );
DWORD NmpUpdateJoinBegin2( IN BOOL SourceNode, IN LPWSTR JoinerNodeId, IN LPWSTR JoinerNodeName, IN LPWSTR SponsorNodeId, IN LPDWORD JoinerHighestVersion, IN LPDWORD JoinerLowestVersion );
DWORD NmpUpdateSetNetworkAndInterfaceStates( IN BOOL IsSourceNode, IN LPWSTR NetworkId, IN CLUSTER_NETWORK_STATE * NewNetworkState, IN PNM_STATE_ENTRY InterfaceStateVector, IN LPDWORD InterfaceStateVectorSize );
DWORD NmpDoInterfacePing( IN PNM_INTERFACE Interface, IN PNM_ADDRESS_ENUM PingAddressEnum, OUT BOOLEAN * PingSucceeded );
//versioning functions
VOID NmpResetClusterVersion( BOOL ProcessChanges );
DWORD NmpValidateNodeVersion( IN LPCWSTR NodeId, IN DWORD dwHighestVersion, IN DWORD dwLowestVersion );
DWORD NmpFormFixupNodeVersion( IN LPCWSTR NodeId, IN DWORD dwHighestVersion, IN DWORD dwLowestVersion );
DWORD NmpJoinFixupNodeVersion( IN HLOCALXSACTION hXsaction, IN LPCWSTR NodeId, IN DWORD dwHighestVersion, IN DWORD dwLowestVersion );
DWORD NmpIsNodeVersionAllowed( IN DWORD dwExcludeNodeId, IN DWORD NodeHighestVersion, IN DWORD NodeLowestVersion, IN BOOL bJoin );
DWORD NmpCalcClusterVersion( IN DWORD dwExcludeNodeId, OUT LPDWORD pdwClusterHighestVersion, OUT LPDWORD pdwClusterLowestVersion );
DWORD NmpUpdatePerformFixups( IN BOOL IsSourceNode, IN PVOID PropertyList, IN LPDWORD PropertyListSize );
DWORD NmpUpdatePerformFixups2( IN BOOL IsSourceNode, IN PVOID PropertyList, IN LPDWORD PropertyListSize, IN LPDWORD lpdwFixupNum, IN PVOID lpKeyName, IN PVOID pPropertyBuffer );
DWORD NmpUpdateExtendedNodeState( IN BOOL SourceNode, IN LPWSTR NodeId, IN CLUSTER_NODE_STATE* ExtendedState );
VOID NmpProcessClusterVersionChange( VOID );
VOID NmpResetClusterNodeLimit( );
// Fixup routine for updating the node version info, used by nmperformfixups
DWORD NmpBuildVersionInfo( IN DWORD dwFixUpType, OUT PVOID * ppPropertyList, OUT LPDWORD pdwPropertyListSize, OUT LPWSTR * lpszKeyName );
//
// connectoid advise sink functions
//
HRESULT NmpInitializeConnectoidAdviseSink( VOID );
//
// Routines that must be supplied by users of the ClNet package.
//
VOID ClNetPrint( IN ULONG LogLevel, IN PCHAR FormatString, ... );
VOID ClNetLogEvent( IN DWORD LogLevel, IN DWORD MessageId );
VOID ClNetLogEvent1( IN DWORD LogLevel, IN DWORD MessageId, IN LPCWSTR Arg1 );
VOID ClNetLogEvent2( IN DWORD LogLevel, IN DWORD MessageId, IN LPCWSTR Arg1, IN LPCWSTR Arg2 );
VOID ClNetLogEvent3( IN DWORD LogLevel, IN DWORD MessageId, IN LPCWSTR Arg1, IN LPCWSTR Arg2, IN LPCWSTR Arg3 );
//
// Shared key management routines.
//
DWORD NmpGetClusterKey( OUT PVOID KeyBuffer, IN OUT DWORD * KeyBufferLength );
DWORD NmpRegenerateClusterKey( VOID );
VOID NmpFreeClusterKey( VOID );
#endif // _NMP_INCLUDED
|