488 lines
10 KiB
C
488 lines
10 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1996 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
cxp.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Common definitions for the Cluster Transport.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Mike Massa (mikemas) July 29, 1996
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
Who When What
|
|||
|
-------- -------- ----------------------------------------------
|
|||
|
mikemas 07-29-96 created
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _CXP_INCLUDED_
|
|||
|
#define _CXP_INCLUDED_
|
|||
|
|
|||
|
|
|||
|
#include <clusnet.h>
|
|||
|
#include <ntddtcp.h>
|
|||
|
#include <ntddndis.h>
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Tdi Definitions
|
|||
|
//
|
|||
|
//
|
|||
|
// TDI Address Object
|
|||
|
//
|
|||
|
// This structure represents a cluster transport address opened by a
|
|||
|
// TDI client. It is also used as an endpoint for datagram communication.
|
|||
|
// One such structure exists for each port address opened on the local node.
|
|||
|
//
|
|||
|
// Address objects are stored in a bucket hash table. The table is
|
|||
|
// hashed by port number.
|
|||
|
//
|
|||
|
typedef struct {
|
|||
|
CN_FSCONTEXT FsContext;
|
|||
|
LIST_ENTRY AOTableLinkage;
|
|||
|
CN_LOCK Lock;
|
|||
|
CN_IRQL Irql;
|
|||
|
ULONG Flags;
|
|||
|
USHORT LocalPort;
|
|||
|
LIST_ENTRY ReceiveQueue;
|
|||
|
PTDI_IND_ERROR ErrorHandler;
|
|||
|
PVOID ErrorContext;
|
|||
|
PTDI_IND_RECEIVE_DATAGRAM ReceiveDatagramHandler;
|
|||
|
PVOID ReceiveDatagramContext;
|
|||
|
PTDI_IND_CHAINED_RECEIVE_DATAGRAM ChainedReceiveDatagramHandler;
|
|||
|
PVOID ChainedReceiveDatagramContext;
|
|||
|
} CX_ADDROBJ, *PCX_ADDROBJ;
|
|||
|
|
|||
|
#define CX_ADDROBJ_SIG 'rdda'
|
|||
|
|
|||
|
#define CX_ADDROBJ_TABLE_SIZE 7
|
|||
|
|
|||
|
#define CX_ADDROBJ_TABLE_HASH(_port) \
|
|||
|
((ULONG) ((_port) % CX_ADDROBJ_TABLE_SIZE))
|
|||
|
|
|||
|
|
|||
|
#define CX_AO_FLAG_DELETING 0x00000001
|
|||
|
#define CX_AO_FLAG_CHECKSTATE 0x00000002
|
|||
|
|
|||
|
|
|||
|
extern LIST_ENTRY CxAddrObjTable[CX_ADDROBJ_TABLE_SIZE];
|
|||
|
extern CN_LOCK CxAddrObjTableLock;
|
|||
|
|
|||
|
extern HANDLE CxTdiRegistrationHandle;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Packet header structures need to be packed.
|
|||
|
//
|
|||
|
#include <packon.h>
|
|||
|
|
|||
|
//
|
|||
|
// CNP Header
|
|||
|
//
|
|||
|
typedef struct {
|
|||
|
UCHAR Version;
|
|||
|
UCHAR NextHeader;
|
|||
|
USHORT PayloadLength;
|
|||
|
ULONG SourceAddress;
|
|||
|
ULONG DestinationAddress;
|
|||
|
} CNP_HEADER, *PCNP_HEADER;
|
|||
|
|
|||
|
//
|
|||
|
// CDP Header
|
|||
|
//
|
|||
|
typedef struct {
|
|||
|
USHORT SourcePort;
|
|||
|
USHORT DestinationPort;
|
|||
|
USHORT PayloadLength;
|
|||
|
USHORT Checksum;
|
|||
|
} CDP_HEADER, *PCDP_HEADER;
|
|||
|
|
|||
|
//
|
|||
|
// Node info structure for heartbeats.
|
|||
|
//
|
|||
|
typedef struct _CX_HB_NODE_INFO {
|
|||
|
ULONG SeqNumber;
|
|||
|
ULONG AckNumber;
|
|||
|
} CX_HB_NODE_INFO, *PCX_HB_NODE_INFO;
|
|||
|
|
|||
|
//
|
|||
|
// Multicast signature data.
|
|||
|
//
|
|||
|
typedef struct {
|
|||
|
UCHAR Version;
|
|||
|
UCHAR Reserved;
|
|||
|
USHORT PayloadOffset;
|
|||
|
CL_NETWORK_ID NetworkId;
|
|||
|
ULONG ClusterNetworkBrand;
|
|||
|
USHORT SigBufferLen;
|
|||
|
UCHAR SigBuffer[1]; // dynamic
|
|||
|
} CNP_SIGNATURE, *PCNP_SIGNATURE;
|
|||
|
|
|||
|
|
|||
|
#include <packoff.h>
|
|||
|
|
|||
|
//
|
|||
|
// Protocol constants
|
|||
|
//
|
|||
|
#define CNP_VERSION_1 0x1 // original CNP
|
|||
|
#define CNP_VERSION_2 0x2 // original CNP + multicast
|
|||
|
|
|||
|
#define CNP_VERSION_UNICAST CNP_VERSION_1
|
|||
|
#define CNP_VERSION_MULTICAST CNP_VERSION_2
|
|||
|
|
|||
|
#define PROTOCOL_CCMP 1
|
|||
|
#define PROTOCOL_CDP 2
|
|||
|
|
|||
|
#define CNP_SIG_VERSION_1 0x1
|
|||
|
|
|||
|
//
|
|||
|
// Size of CNP multicast signature data.
|
|||
|
//
|
|||
|
#define CNP_SIGHDR_LENGTH \
|
|||
|
(FIELD_OFFSET(CNP_SIGNATURE, SigBuffer[0]))
|
|||
|
|
|||
|
#define CNP_SIG_LENGTH(_SignatureSize) \
|
|||
|
(CNP_SIGHDR_LENGTH + (_SignatureSize))
|
|||
|
|
|||
|
#define MAX_UDP_SEND_SIZE ( 0xFFFF - 68 )
|
|||
|
|
|||
|
#define CDP_MAX_SEND_SIZE(_SignatureSize) \
|
|||
|
(MAX_UDP_SEND_SIZE \
|
|||
|
- sizeof(CNP_HEADER) \
|
|||
|
- CNP_SIG_LENGTH(_SignatureSize)) \
|
|||
|
- sizeof(CDP_HEADER)
|
|||
|
|
|||
|
//
|
|||
|
// CNP Receive Flags
|
|||
|
//
|
|||
|
#define CNP_RECV_FLAG_NODE_STATE_CHECK_PASSED 0x00000001
|
|||
|
#define CNP_RECV_FLAG_MULTICAST 0x00000002
|
|||
|
#define CNP_RECV_FLAG_CURRENT_MULTICAST_GROUP 0x00000004
|
|||
|
#define CNP_RECV_FLAG_SIGNATURE_VERIFIED 0x00000008
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// put here for kdcn
|
|||
|
//
|
|||
|
|
|||
|
typedef enum {
|
|||
|
CcmpInvalidMsgType = 0,
|
|||
|
CcmpHeartbeatMsgType = 1,
|
|||
|
CcmpPoisonMsgType = 2,
|
|||
|
CcmpMembershipMsgType = 3,
|
|||
|
CcmpMcastHeartbeatMsgType = 4
|
|||
|
} CCMP_MSG_TYPE;
|
|||
|
|
|||
|
//
|
|||
|
// From MM in clussvc:
|
|||
|
//
|
|||
|
// The data type "cluster_t" is a bit array of size equal to the maximum
|
|||
|
// number of nodes in the cluster. The bit array is implemented as an
|
|||
|
// array of uint8s.
|
|||
|
//
|
|||
|
// Given a node#, its bit position in the bit array is computed by first
|
|||
|
// locating the byte in the array (node# / BYTEL) and then the bit in
|
|||
|
// the byte. Bits in the byte are numbered 0..7 (from left to right).
|
|||
|
// Thus, node 0 is placed in byte 0, bit 0, which is the left-most bit
|
|||
|
// in the bit array.
|
|||
|
//
|
|||
|
//
|
|||
|
// The cluster type sizing defines and manipulation routines are copied
|
|||
|
// from MM so there is some notion of how the mask is managed.
|
|||
|
//
|
|||
|
|
|||
|
#define MAX_CLUSTER_SIZE ClusterDefaultMaxNodes
|
|||
|
|
|||
|
#define BYTEL 8 // number of bits in a uint8
|
|||
|
#define BYTES_IN_CLUSTER ((MAX_CLUSTER_SIZE + BYTEL - 1) / BYTEL)
|
|||
|
|
|||
|
#define BYTE(cluster, node) ( (cluster)[(node) / BYTEL] ) // byte# in array
|
|||
|
#define BIT(node) ( (node) % BYTEL ) // bit# in byte
|
|||
|
|
|||
|
typedef UCHAR cluster_t [BYTES_IN_CLUSTER];
|
|||
|
typedef SHORT node_t;
|
|||
|
|
|||
|
typedef union _CX_CLUSTERSCREEN {
|
|||
|
ULONG UlongScreen;
|
|||
|
cluster_t ClusterScreen;
|
|||
|
} CX_CLUSTERSCREEN;
|
|||
|
|
|||
|
//
|
|||
|
// converts external node number to internal
|
|||
|
//
|
|||
|
#define LOWEST_NODENUM ((node_t)ClusterMinNodeId) // starting node number
|
|||
|
#define INT_NODE(ext_node) ((node_t)(ext_node - LOWEST_NODENUM))
|
|||
|
|
|||
|
#define CnpClusterScreenMember(c, i) \
|
|||
|
((BOOLEAN)((BYTE(c,i) >> (BYTEL-1-BIT(i))) & 1))
|
|||
|
|
|||
|
#define CnpClusterScreenInsert(c, i) \
|
|||
|
(BYTE(c, i) |= (1 << (BYTEL-1-BIT(i))))
|
|||
|
|
|||
|
#define CnpClusterScreenDelete(c, i) \
|
|||
|
(BYTE(c, i) &= ~(1 << (BYTEL-1-BIT(i))))
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// CNP Receive Request structures and routines
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Receive Request Pool
|
|||
|
//
|
|||
|
typedef struct {
|
|||
|
ULONG UpperProtocolContextSize;
|
|||
|
} CNP_RECEIVE_REQUEST_POOL_CONTEXT, *PCNP_RECEIVE_REQUEST_POOL_CONTEXT;
|
|||
|
|
|||
|
//
|
|||
|
// Receive Request Structure
|
|||
|
//
|
|||
|
typedef struct {
|
|||
|
CN_RESOURCE CnResource;
|
|||
|
PIRP Irp;
|
|||
|
PVOID DataBuffer;
|
|||
|
PVOID UpperProtocolContext;
|
|||
|
} CNP_RECEIVE_REQUEST, *PCNP_RECEIVE_REQUEST;
|
|||
|
|
|||
|
|
|||
|
PCN_RESOURCE_POOL
|
|||
|
CnpCreateReceiveRequestPool(
|
|||
|
IN ULONG UpperProtocolContextSize,
|
|||
|
IN USHORT PoolDepth
|
|||
|
);
|
|||
|
|
|||
|
#define CnpDeleteReceiveRequestPool(_pool) \
|
|||
|
{ \
|
|||
|
CnDrainResourcePool(_pool); \
|
|||
|
CnFreePool(_pool); \
|
|||
|
}
|
|||
|
|
|||
|
PCNP_RECEIVE_REQUEST
|
|||
|
CnpAllocateReceiveRequest(
|
|||
|
IN PCN_RESOURCE_POOL RequestPool,
|
|||
|
IN PVOID Network,
|
|||
|
IN ULONG BytesToReceive,
|
|||
|
IN PVOID CompletionRoutine
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CnpFreeReceiveRequest(
|
|||
|
PCNP_RECEIVE_REQUEST Request
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
//
|
|||
|
// Function Prototypes
|
|||
|
//
|
|||
|
//
|
|||
|
|
|||
|
VOID
|
|||
|
CxTdiAddAddressHandler(
|
|||
|
IN PTA_ADDRESS TaAddress,
|
|||
|
IN PUNICODE_STRING DeviceName,
|
|||
|
IN PTDI_PNP_CONTEXT Context
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CxTdiDelAddressHandler(
|
|||
|
IN PTA_ADDRESS TaAddress,
|
|||
|
IN PUNICODE_STRING DeviceName,
|
|||
|
IN PTDI_PNP_CONTEXT Context
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CxWmiPnpLoad(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CxWmiPnpUnload(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CxWmiPnpInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CxWmiPnpShutdown(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CxReconnectLocalInterface(
|
|||
|
IN CL_NETWORK_ID NetworkId
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CxQueryMediaStatus(
|
|||
|
IN HANDLE AdapterDeviceHandle,
|
|||
|
IN CL_NETWORK_ID NetworkId,
|
|||
|
OUT PULONG MediaStatus
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CxBuildTdiAddress(
|
|||
|
PVOID Buffer,
|
|||
|
CL_NODE_ID Node,
|
|||
|
USHORT Port,
|
|||
|
BOOLEAN Verified
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CxParseTransportAddress(
|
|||
|
IN TRANSPORT_ADDRESS UNALIGNED *AddrList,
|
|||
|
IN ULONG AddressListLength,
|
|||
|
OUT CL_NODE_ID * Node,
|
|||
|
OUT PUSHORT Port
|
|||
|
);
|
|||
|
|
|||
|
PCX_ADDROBJ
|
|||
|
CxFindAddressObject(
|
|||
|
IN USHORT Port
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CnpLoadNodes(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CnpInitializeNodes(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CnpShutdownNodes(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CnpLoadNetworks(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CnpInitializeNetworks(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CnpShutdownNetworks(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CnpLoad(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CnpUnload(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CcmpLoad(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CcmpUnload(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CdpLoad(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CdpUnload(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CdpReceivePacketHandler(
|
|||
|
IN PVOID Network,
|
|||
|
IN CL_NODE_ID SourceNodeId,
|
|||
|
IN ULONG CnpReceiveFlags,
|
|||
|
IN ULONG TdiReceiveDatagramFlags,
|
|||
|
IN ULONG BytesIndicated,
|
|||
|
IN ULONG BytesAvailable,
|
|||
|
OUT PULONG BytesTaken,
|
|||
|
IN PVOID Tsdu,
|
|||
|
OUT PIRP * Irp
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CxInitializeHeartBeat(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CxUnloadHeartBeat(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CnpStartHeartBeats(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CnpStopHeartBeats(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CxReserveClusnetEndpoint(
|
|||
|
IN USHORT Port
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CxUnreserveClusnetEndpoint(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CxSendMcastHeartBeatMessage(
|
|||
|
IN CL_NETWORK_ID NetworkId,
|
|||
|
IN PVOID McastGroup,
|
|||
|
IN CX_CLUSTERSCREEN McastTargetNodes,
|
|||
|
IN CX_HB_NODE_INFO NodeInfo[],
|
|||
|
IN PCX_SEND_COMPLETE_ROUTINE CompletionRoutine, OPTIONAL
|
|||
|
IN PVOID CompletionContext OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CxConfigureMulticast(
|
|||
|
IN CL_NETWORK_ID NetworkId,
|
|||
|
IN ULONG MulticastNetworkBrand,
|
|||
|
IN PTRANSPORT_ADDRESS TdiMcastBindAddress,
|
|||
|
IN ULONG TdiMcastBindAddressLength,
|
|||
|
IN PVOID Key,
|
|||
|
IN ULONG KeyLength,
|
|||
|
IN PVOID Salt,
|
|||
|
IN ULONG SaltLength,
|
|||
|
IN PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CxGetMulticastReachableSet(
|
|||
|
IN CL_NETWORK_ID NetworkId,
|
|||
|
OUT ULONG * NodeScreen
|
|||
|
);
|
|||
|
|
|||
|
#endif // ifndef _CXP_INCLUDED_
|
|||
|
|