windows-nt/Source/XPSP1/NT/base/cluster/clusnet/xport/cxp.h
2020-09-26 16:20:57 +08:00

488 lines
10 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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_