/*++

Copyright (c) 1997  Microsoft Corporation

Module Name:

    cluxport.h

Abstract:

    Cluster Transport definitions exposed within the Cluster Network Driver.

Author:

    Mike Massa (mikemas)           January 3, 1996

Revision History:

    Who         When        What
    --------    --------    ----------------------------------------------
    mikemas     01-03-97    created

Notes:

--*/

#ifndef _CLUXPORT_INCLUDED
#define _CLUXPORT_INCLUDED

#include <tdi.h>
#include <tdikrnl.h>
#include <clustdi.h>

//
//
// Function Prototypes
//
//

//
// Initialization/Shutdown
//
NTSTATUS
CxLoad(
    IN PUNICODE_STRING RegistryPath
    );

VOID
CxUnload(
    VOID
    );

NTSTATUS
CxInitialize(
    VOID
    );

VOID
CxShutdown(
    VOID
    );

//
// Irp Dispatch
//
NTSTATUS
CxDispatchDeviceControl(
    IN PIRP                Irp,
    IN PIO_STACK_LOCATION  IrpSp
    );


//
// Nodes
//
NTSTATUS
CxRegisterNode(
    CL_NODE_ID    NodeId
    );

NTSTATUS
CxDeregisterNode(
    CL_NODE_ID           NodeId,
    PIRP                 Irp,
    PIO_STACK_LOCATION   IrpSp
    );

NTSTATUS
CxOnlineNodeComm(
    CL_NODE_ID     NodeId
    );

NTSTATUS
CxOfflineNodeComm(
    IN CL_NODE_ID          NodeId,
    IN PIRP                Irp,
    IN PIO_STACK_LOCATION  IrpSp
    );

NTSTATUS
CxGetNodeCommState(
    IN  CL_NODE_ID                NodeId,
    OUT PCLUSNET_NODE_COMM_STATE  State
    );


//
// Networks
//
NTSTATUS
CxRegisterNetwork(
    CL_NETWORK_ID       NetworkId,
    ULONG               Priority,
    BOOLEAN             Restricted
    );

NTSTATUS
CxDeregisterNetwork(
    CL_NETWORK_ID       NetworkId,
    PIRP                Irp,
    PIO_STACK_LOCATION  IrpSp
    );

NTSTATUS
CxOnlineNetwork(
    IN  CL_NETWORK_ID       NetworkId,
    IN  PWCHAR              TdiProviderName,
    IN  ULONG               TdiProviderNameLength,
    IN  PTRANSPORT_ADDRESS  TdiBindAddress,
    IN  ULONG               TdiBindAddressLength,
    IN  PWCHAR              AdapterName,
    IN  ULONG               AdapterNameLength,
    OUT PTDI_ADDRESS_INFO   TdiBindAddressInfo,
    IN  ULONG               TdiBindAddressInfoLength,
    IN  PIRP                Irp                       OPTIONAL
    );

NTSTATUS
CxOfflineNetwork(
    CL_NETWORK_ID       NetworkId,
    PIRP                Irp,
    PIO_STACK_LOCATION  IrpSp
    );

NTSTATUS
CxGetNetworkState(
    IN  CL_NETWORK_ID           NetworkId,
    OUT PCLUSNET_NETWORK_STATE  State
    );

NTSTATUS
CxSetNetworkRestriction(
    IN CL_NETWORK_ID  NetworkId,
    IN BOOLEAN        Restricted,
    IN ULONG          NewPriority
    );

NTSTATUS
CxSetNetworkPriority(
    IN CL_NETWORK_ID  NetworkId,
    IN ULONG          Priority
    );

NTSTATUS
CxGetNetworkPriority(
    IN  CL_NETWORK_ID   NetworkId,
    OUT PULONG          Priority
    );


//
// Interfaces
//
NTSTATUS
CxRegisterInterface(
    CL_NODE_ID          NodeId,
    CL_NETWORK_ID       NetworkId,
    ULONG               Priority,
    PUWSTR              AdapterId,
    ULONG               AdapterIdLength,
    ULONG               TdiAddressLength,
    PTRANSPORT_ADDRESS  TdiAddress,
    PULONG              MediaStatus
    );

NTSTATUS
CxDeregisterInterface(
    CL_NODE_ID          NodeId,
    CL_NETWORK_ID       NetworkId
    );

NTSTATUS
CxSetInterfacePriority(
    IN CL_NODE_ID          NodeId,
    IN CL_NETWORK_ID       NetworkId,
    IN ULONG               Priority
    );

NTSTATUS
CxGetInterfacePriority(
    IN  CL_NODE_ID          NodeId,
    IN  CL_NETWORK_ID       NetworkId,
    OUT PULONG              InterfacePriority,
    OUT PULONG              NetworkPriority
    );

NTSTATUS
CxGetInterfaceState(
    IN  CL_NODE_ID                NodeId,
    IN  CL_NETWORK_ID             NetworkId,
    OUT PCLUSNET_INTERFACE_STATE  State
    );

//
// Misc. stuff
//
NTSTATUS
CxGetNodeMembershipState(
    IN  CL_NODE_ID NodeId,
    OUT PCLUSNET_NODE_STATE State
    );

NTSTATUS
CxSetNodeMembershipState(
    IN  CL_NODE_ID NodeId,
    IN  CLUSNET_NODE_STATE State
    );

NTSTATUS
CxSetOuterscreen(
    IN  ULONG Outerscreen
    );

VOID
CxRegroupFinished(
    IN  ULONG NewEpoch
    );

NTSTATUS
CxImportSecurityContext(
    IN  CL_NODE_ID NodeId,
    IN  PWCHAR PackageName,
    IN  ULONG PackageNameSize,
    IN  ULONG SignatureSize,
    IN  PVOID InboundContext,
    IN  PVOID OutboundContext
    );

VOID
CxDeleteSecurityContext(
    IN  CL_NODE_ID NodeId
    );

//
// Membership Message Interface
//
typedef
VOID
(*PCX_SEND_COMPLETE_ROUTINE) (
    IN NTSTATUS  Status,
    IN ULONG     BytesSent,
    IN PVOID     Context,
    IN PVOID     Buffer
    );

NTSTATUS
CxSendMembershipMessage(
    IN CL_NODE_ID                  DestinationNodeId,
    IN PVOID                       MessageData,
    IN USHORT                      MessageDataLength,
    IN PCX_SEND_COMPLETE_ROUTINE   CompletionRoutine,
    IN PVOID                       CompletionContext   OPTIONAL
    );

VOID
CxSendPoisonPacket(
    IN CL_NODE_ID                  DestinationNodeId,
    IN PCX_SEND_COMPLETE_ROUTINE   CompletionRoutine   OPTIONAL,
    IN PVOID                       CompletionContext   OPTIONAL,
    IN PIRP                        Irp                 OPTIONAL
    );

NTSTATUS
CxSendHeartBeatMessage(
    IN CL_NODE_ID                  DestinationNodeId,
    IN ULONG                       SeqNumber,
    IN ULONG                       AckNumber,
    IN CL_NETWORK_ID               NetworkId
    );


//
// Top-edge TDI Routines
//
NTSTATUS
CxOpenAddress(
    OUT PCN_FSCONTEXT *                CnFsContext,
    IN  TRANSPORT_ADDRESS UNALIGNED *  TransportAddress,
    IN  ULONG                          TransportAddressLength
    );

NTSTATUS
CxCloseAddress(
    IN PCN_FSCONTEXT CnFsContext
    );

NTSTATUS
CxSetEventHandler(
    IN PIRP                  Irp,
    IN PIO_STACK_LOCATION    IrpSp
    );

NTSTATUS
CxQueryInformation(
    IN PIRP                  Irp,
    IN PIO_STACK_LOCATION    IrpSp
    );

NTSTATUS
CxSendDatagram(
    IN PIRP                  Irp,
    IN PIO_STACK_LOCATION    IrpSp
    );

NTSTATUS
CxReceiveDatagram(
    IN PIRP                  Irp,
    IN PIO_STACK_LOCATION    IrpSp
    );

//
// Test APIs
//
#if DBG

NTSTATUS
CxOnlinePendingInterface(
    IN  CL_NODE_ID          NodeId,
    IN  CL_NETWORK_ID       NetworkId
    );

NTSTATUS
CxOnlineInterface(
    IN  CL_NODE_ID          NodeId,
    IN  CL_NETWORK_ID       NetworkId
    );

NTSTATUS
CxOfflineInterface(
    IN  CL_NODE_ID          NodeId,
    IN  CL_NETWORK_ID       NetworkId
    );

NTSTATUS
CxFailInterface(
    IN  CL_NODE_ID          NodeId,
    IN  CL_NETWORK_ID       NetworkId
    );

#endif // DBG


#endif // ndef _CLUXPORT_INCLUDED