/*++ Copyright (c) 1996 Microsoft Corporation. All Rights Reserved. Module Name: cntest.c Abstract: Test program for managing the cluster transport. --*/ #include #include #include #include #include #include #include #include #include #include #include #include // // Local prototypes // PWCHAR ConvertStringToUnicode( PUCHAR String ); PTRANSPORT_ADDRESS BuildTdiAddressForIp( IN ULONG Address, IN USHORT Port, OUT PULONG TdiAddressLength ); DWORD Initialize( IN char ** argv, IN int argc ); DWORD RegisterNode( IN char ** argv, IN int argc ); DWORD DeregisterNode( IN char ** argv, IN int argc ); DWORD RegisterNetwork( IN char ** argv, IN int argc ); DWORD DeregisterNetwork( IN char ** argv, IN int argc ); DWORD RegisterInterface( IN char ** argv, IN int argc ); DWORD DeregisterInterface( IN char ** argv, IN int argc ); DWORD GetNetworkPriority( IN char ** argv, IN int argc ); DWORD OnlineNodeComm( IN char ** argv, IN int argc ); DWORD OfflineNodeComm( IN char ** argv, IN int argc ); DWORD OnlineNetwork( IN char ** argv, IN int argc ); DWORD OfflineNetwork( IN char ** argv, IN int argc ); DWORD SetNetworkPriority( IN char ** argv, IN int argc ); DWORD GetInterfacePriority( IN char ** argv, IN int argc ); DWORD SetInterfacePriority( IN char ** argv, IN int argc ); DWORD GetNodeCommState( IN char ** argv, IN int argc ); DWORD GetNetworkState( IN char ** argv, IN int argc ); DWORD GetInterfaceState( IN char ** argv, IN int argc ); DWORD TestEvents( IN char ** argv, IN int argc ); DWORD SetMemLogging( IN char ** argv, IN int argc ); DWORD SendPoisonPacket( IN char ** argv, IN int argc ); DWORD GetMulticastReachableSet( IN char ** argv, IN int argc ); #if DBG DWORD SetDebugMask( IN char ** argv, IN int argc ); DWORD OnlinePendingInterface( IN char ** argv, IN int argc ); DWORD OnlineInterface( IN char ** argv, IN int argc ); DWORD OfflineInterface( IN char ** argv, IN int argc ); DWORD FailInterface( IN char ** argv, IN int argc ); DWORD SendMmMsg( IN char ** argv, IN int argc ); DWORD MMgrForm( IN char ** argv, IN int argc ); DWORD MMgrJoin( IN char ** argv, IN int argc ); DWORD MMgrLeave( IN char ** argv, IN int argc ); DWORD MMgrGetMembershipState( IN char ** argv, IN int argc ); DWORD MMgrEject( IN char ** argv, IN int argc ); #endif // DBG // // Local Types // typedef enum { OpcodeInvalid = 0, OpcodeInit, OpcodeShutdown, OpcodeSetDebugMask, OpcodeAdd, OpcodeDelete, OpcodeOnlinePending, OpcodeOnline, OpcodeOffline, OpcodeFail, OpcodeGetPriority, OpcodeSetPriority, OpcodeGetState, OpcodeSendMmMsg, #ifdef MM_IN_CLUSNET OpcodeMMgrForm, OpcodeMMgrJoin, OpcodeMMgrLeave, OpcodeMMgrGetMembershipState, OpcodeMMgrEject, #endif OpcodeTestEvents, OpcodeSetMemLogging, OpcodeSendPoisonPacket, OpcodeGetMulticastReachableSet } CN_OPCODE; typedef enum { ObjTypeInvalid = 0, ObjTypeNode, ObjTypeNetwork, ObjTypeInterface } CN_OBJTYPE; HANDLE Handle = NULL; // // Local Prototypes // void Usage( void ); // // Main Function // int _cdecl main(int argc, char **argv) { DWORD status = ERROR_INVALID_PARAMETER; CN_OPCODE opcode = OpcodeInvalid; CN_OBJTYPE objtype = ObjTypeInvalid; BOOLEAN objTypeRequired = TRUE; if (argc < 2) { Usage(); return(status); } // // Crack the operation. // if (strcmp(argv[1], "init") == 0) { opcode = OpcodeInit; objTypeRequired = FALSE; } else if (strcmp(argv[1], "shutdown") == 0) { opcode = OpcodeShutdown; objTypeRequired = FALSE; } else if (strcmp(argv[1], "setdebug") == 0) { opcode = OpcodeSetDebugMask; objTypeRequired = FALSE; } else if (strcmp(argv[1], "add") == 0) { opcode = OpcodeAdd; } else if (strcmp(argv[1], "del") == 0) { opcode = OpcodeDelete; } else if (strcmp(argv[1], "onpend") == 0) { opcode = OpcodeOnlinePending; } else if (strcmp(argv[1], "online") == 0) { opcode = OpcodeOnline; } else if (strcmp(argv[1], "offline") == 0) { opcode = OpcodeOffline; } else if (strcmp(argv[1], "fail") == 0) { opcode = OpcodeFail; } else if (strcmp(argv[1], "getpri") == 0) { opcode = OpcodeGetPriority; } else if (strcmp(argv[1], "setpri") == 0) { opcode = OpcodeSetPriority; } else if (strcmp(argv[1], "getstate") == 0) { opcode = OpcodeGetState; } else if (strcmp(argv[1], "send") == 0) { opcode = OpcodeSendMmMsg; objTypeRequired = FALSE; } #ifdef MM_IN_CLUSNET else if (strcmp(argv[1], "mmform") == 0) { opcode = OpcodeMMgrForm; objTypeRequired = FALSE; } else if (strcmp(argv[1], "mmjoin") == 0) { opcode = OpcodeMMgrJoin; objTypeRequired = FALSE; } else if (strcmp(argv[1], "mmleave") == 0) { opcode = OpcodeMMgrLeave; objTypeRequired = FALSE; } else if (strcmp(argv[1], "mmgetstate") == 0) { opcode = OpcodeMMgrGetMembershipState; objTypeRequired = FALSE; } else if (strcmp(argv[1], "mmeject") == 0) { opcode = OpcodeMMgrEject; objTypeRequired = FALSE; } #endif else if (strcmp(argv[1], "events") == 0) { opcode = OpcodeTestEvents; objTypeRequired = FALSE; } else if (strcmp(argv[1], "memlog") == 0) { opcode = OpcodeSetMemLogging; objTypeRequired = FALSE; } else if (strcmp(argv[1], "poison") == 0) { opcode = OpcodeSendPoisonPacket; objTypeRequired = FALSE; } else if (strcmp(argv[1], "getmcast") == 0) { opcode = OpcodeGetMulticastReachableSet; objTypeRequired = FALSE; } else { printf("invalid command %s\n", argv[1]); Usage(); return(status); } // // Crack the object type // if (objTypeRequired) { if (strcmp(argv[2], "node") == 0) { objtype = ObjTypeNode; } else if (strcmp(argv[2], "network") == 0) { objtype = ObjTypeNetwork; } else if (strcmp(argv[2], "interface") == 0) { objtype = ObjTypeInterface; } else { printf("invalid object type %s\n", argv[2]); Usage(); return(status); } } // // Open the driver // Handle = ClusnetOpenControlChannel(FILE_SHARE_READ); if (Handle == NULL) { printf("Unable to open driver, status %08X\n", GetLastError()); return(GetLastError()); } // // Gather remaining params and dispatch // switch (opcode) { case OpcodeInit: status = Initialize(argv + 2, argc - 2); break; case OpcodeShutdown: status = ClusnetShutdown(Handle); break; #if DBG case OpcodeSetDebugMask: status = SetDebugMask(argv + 2, argc - 2); break; #endif // DBG case OpcodeAdd: switch(objtype) { case ObjTypeNode: status = RegisterNode(argv + 3, argc - 3); break; case ObjTypeNetwork: status = RegisterNetwork(argv + 3, argc - 3); break; case ObjTypeInterface: status = RegisterInterface(argv + 3, argc - 3); break; default: break; } break; case OpcodeDelete: switch(objtype) { case ObjTypeNode: status = DeregisterNode(argv + 3, argc - 3); break; case ObjTypeNetwork: status = DeregisterNetwork(argv + 3, argc - 3); break; case ObjTypeInterface: status = DeregisterInterface(argv + 3, argc - 3); break; default: break; } break; #if DBG case OpcodeOnlinePending: switch(objtype) { case ObjTypeInterface: status = OnlinePendingInterface(argv + 3, argc - 3); break; default: break; } break; #endif // DBG case OpcodeOnline: switch(objtype) { case ObjTypeNode: status = OnlineNodeComm(argv + 3, argc - 3); break; case ObjTypeNetwork: status = OnlineNetwork(argv + 3, argc - 3); break; #if DBG case ObjTypeInterface: status = OnlineInterface(argv + 3, argc - 3); break; #endif // DBG default: break; } break; case OpcodeOffline: switch(objtype) { case ObjTypeNode: status = OfflineNodeComm(argv + 3, argc - 3); break; case ObjTypeNetwork: status = OfflineNetwork(argv + 3, argc - 3); break; #if DBG case ObjTypeInterface: status = OfflineInterface(argv + 3, argc - 3); break; #endif // DBG default: break; } break; #if DBG case OpcodeFail: switch(objtype) { case ObjTypeInterface: status = FailInterface(argv + 3, argc - 3); break; default: break; } break; #endif // DBG case OpcodeGetPriority: switch(objtype) { case ObjTypeNetwork: status = GetNetworkPriority(argv + 3, argc - 3); break; case ObjTypeInterface: status = GetInterfacePriority(argv + 3, argc - 3); break; default: break; } break; case OpcodeSetPriority: switch(objtype) { case ObjTypeNetwork: status = SetNetworkPriority(argv + 3, argc - 3); break; case ObjTypeInterface: status = SetInterfacePriority(argv + 3, argc - 3); break; default: break; } break; case OpcodeGetState: switch(objtype) { case ObjTypeNode: status = GetNodeCommState(argv + 3, argc - 3); break; case ObjTypeNetwork: status = GetNetworkState(argv + 3, argc - 3); break; case ObjTypeInterface: status = GetInterfaceState(argv + 3, argc - 3); break; default: break; } break; #if DBG case OpcodeSendMmMsg: status = SendMmMsg(argv + 2, argc - 2); break; #ifdef MM_IN_CLUSNET case OpcodeMMgrForm: status = MMgrForm(argv + 2, argc - 2); break; case OpcodeMMgrJoin: status = MMgrJoin(argv + 2, argc - 2); break; case OpcodeMMgrLeave: status = MMgrLeave(argv + 2, argc - 2); break; case OpcodeMMgrGetMembershipState: status = MMgrGetMembershipState(argv + 2, argc - 2); break; case OpcodeMMgrEject: status = MMgrEject(argv + 2, argc - 2); break; #endif // MM_IN_CLUSNET #endif // DBG case OpcodeTestEvents: status = TestEvents(argv + 2, argc - 2); break; case OpcodeSetMemLogging: status = SetMemLogging(argv + 2, argc - 2); break; case OpcodeSendPoisonPacket: status = SendPoisonPacket(argv + 2, argc - 2); break; case OpcodeGetMulticastReachableSet: status = GetMulticastReachableSet(argv + 2, argc - 2); break; default: break; } ClusnetCloseControlChannel(Handle); if (status != ERROR_SUCCESS) { if (status == ERROR_INVALID_PARAMETER) { Usage(); } else { printf("Operation failed, status 0x%08X\n", status); } } return(status); } // // Support functions // void Usage( void ) { printf("\n"); printf("Usage: cntest \n"); printf("\n"); printf("Operations:\n"); printf(" init \n"); printf(" shutdown\n"); printf(" add node \n"); printf(" del node \n"); printf(" add network \n"); printf(" del network \n"); printf(" add interface []\n"); printf(" del interface \n"); printf(" online node \n"); printf(" offline node \n"); printf(" online network \n"); printf(" offline network \n"); printf(" getpri network \n"); printf(" setpri network \n"); printf(" getpri interface \n"); printf(" setpri interface \n"); printf(" getstate node \n"); printf(" getstate network \n"); printf(" getstate interface \n"); printf(" memlog <# of entries - zero turns off logging>\n"); #if DBG printf(" setdebug \n"); printf(" onpend interface \n"); printf(" online interface \n"); printf(" offline interface \n"); printf(" fail interface \n"); printf(" send <4 byte hex pattern>\n"); printf(" events \n"); #ifdef MM_IN_CLUSNET printf(" mmform \n"); printf(" mmjoin \n"); printf(" mmleave\n"); printf(" mmgetstate \n"); printf(" mmeject \n"); #endif #endif // DBG printf(" poison [number of poison packets]\n"); printf(" getmcast \n"); } DWORD Initialize( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID localNodeId; ULONG maxNodes; if (argc < 2) { return(ERROR_INVALID_PARAMETER); } localNodeId = strtoul(argv[0], NULL, 10); maxNodes = strtoul(argv[1], NULL, 10); status = ClusnetInitialize( Handle, localNodeId, maxNodes, NULL, NULL, NULL, NULL, NULL, NULL ); return(status); } DWORD RegisterNode( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; BOOLEAN isLocal; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); status = ClusnetRegisterNode(Handle, nodeId); return(status); } DWORD DeregisterNode( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); status = ClusnetDeregisterNode(Handle, nodeId); return(status); } DWORD RegisterNetwork( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NETWORK_ID networkId; ULONG priority; if (argc < 2) { return(ERROR_INVALID_PARAMETER); } networkId = strtoul(argv[0], NULL, 10); priority = strtoul(argv[1], NULL, 10); status = ClusnetRegisterNetwork(Handle, networkId, priority, FALSE); return(status); } DWORD DeregisterNetwork( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NETWORK_ID networkId; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } networkId = strtoul(argv[0], NULL, 10); status = ClusnetDeregisterNetwork(Handle, networkId); return(status); } DWORD RegisterInterface( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; HANDLE handle; CL_NODE_ID nodeId; CL_NETWORK_ID networkId; ULONG ipAddress; USHORT udpPort; ULONG tempPort; ULONG priority; WCHAR adapterId[256]; PTRANSPORT_ADDRESS tdiAddress = NULL; ULONG tdiAddressLength; ULONG mediaStatus; if (argc < 5) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); networkId = strtoul(argv[1], NULL, 10); priority = strtoul(argv[2], NULL, 10); ipAddress = inet_addr(argv[3]); if (ipAddress == INADDR_NONE) { return(ERROR_INVALID_PARAMETER); } tempPort = strtoul(argv[4], NULL, 10); if (tempPort > 0xFFFF) { return(ERROR_INVALID_PARAMETER); } udpPort = htons((USHORT) tempPort); tdiAddress = BuildTdiAddressForIp( ipAddress, udpPort, &tdiAddressLength ); if (tdiAddress == NULL) { status = ERROR_NOT_ENOUGH_MEMORY; goto error_exit; } if (argc < 6 || strlen(argv[5]) > 255) { swprintf(adapterId, L"{11111111-1111-1111-1111-111111111111}"); } else { swprintf(adapterId, L"%S", argv[5]); } status = ClusnetRegisterInterface( Handle, nodeId, networkId, priority, adapterId, wcslen(adapterId) * sizeof(WCHAR), tdiAddress, tdiAddressLength, &mediaStatus ); error_exit: if (tdiAddress != NULL) { LocalFree(tdiAddress); } return(status); } DWORD DeregisterInterface( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; CL_NETWORK_ID networkId; if (argc < 2) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); networkId = strtoul(argv[1], NULL, 10); status = ClusnetDeregisterInterface(Handle, nodeId, networkId); return(status); } DWORD OnlineNodeComm( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); status = ClusnetOnlineNodeComm(Handle, nodeId); return(status); } DWORD OfflineNodeComm( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); status = ClusnetOfflineNodeComm(Handle, nodeId); return(status); } DWORD OnlineNetwork( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NETWORK_ID networkId; PWCHAR tdiProviderName = NULL; ULONG ipAddress; USHORT udpPort; ULONG tempPort; PTRANSPORT_ADDRESS tdiBindAddress = NULL; ULONG tdiBindAddressLength; PWCHAR adapterName = NULL; PUCHAR TdiAddressInfo[1024]; ULONG TdiAddressInfoSize = sizeof( TdiAddressInfo ); if (argc < 5) { return(ERROR_INVALID_PARAMETER); } networkId = strtoul(argv[0], NULL, 10); tdiProviderName = ConvertStringToUnicode(argv[1]); if (tdiProviderName == NULL) { return(ERROR_NOT_ENOUGH_MEMORY); } ipAddress = inet_addr(argv[2]); if (ipAddress == INADDR_NONE) { return(ERROR_INVALID_PARAMETER); } tempPort = strtoul(argv[3], NULL, 10); if (tempPort > 0xFFFF) { return(ERROR_INVALID_PARAMETER); } udpPort = htons((USHORT) tempPort); adapterName = ConvertStringToUnicode(argv[4]); if (adapterName == NULL) { return(ERROR_NOT_ENOUGH_MEMORY); } tdiBindAddress = BuildTdiAddressForIp( ipAddress, udpPort, &tdiBindAddressLength ); if (tdiBindAddress == NULL) { status = ERROR_NOT_ENOUGH_MEMORY; goto error_exit; } status = ClusnetOnlineNetwork( Handle, networkId, tdiProviderName, tdiBindAddress, tdiBindAddressLength, adapterName, TdiAddressInfo, &TdiAddressInfoSize ); error_exit: if (tdiProviderName != NULL) { LocalFree(tdiProviderName); } if (tdiBindAddress != NULL) { LocalFree(tdiBindAddress); } return(status); } DWORD OfflineNetwork( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NETWORK_ID networkId; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } networkId = strtoul(argv[0], NULL, 10); status = ClusnetOfflineNetwork(Handle, networkId); return(status); } DWORD GetNetworkPriority( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NETWORK_ID networkId; ULONG priority; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } networkId = strtoul(argv[0], NULL, 10); status = ClusnetGetNetworkPriority(Handle, networkId, &priority); if (status == ERROR_SUCCESS) { printf("Network priority = %u\n", priority); } return(status); } DWORD SetNetworkPriority( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NETWORK_ID networkId; ULONG priority; if (argc < 2) { return(ERROR_INVALID_PARAMETER); } networkId = strtoul(argv[0], NULL, 10); priority = strtoul(argv[1], NULL, 10); status = ClusnetSetNetworkPriority(Handle, networkId, priority); return(status); } DWORD GetInterfacePriority( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; CL_NETWORK_ID networkId; ULONG networkPriority; ULONG interfacePriority; if (argc < 2) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); networkId = strtoul(argv[1], NULL, 10); status = ClusnetGetInterfacePriority( Handle, nodeId, networkId, &interfacePriority, &networkPriority ); if (status == ERROR_SUCCESS) { printf("Interface priority = %u\n", interfacePriority); printf("Network priority = %u\n", networkPriority); } return(status); } DWORD SetInterfacePriority( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; CL_NETWORK_ID networkId; ULONG priority; if (argc < 3) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); networkId = strtoul(argv[1], NULL, 10); priority = strtoul(argv[2], NULL, 10); status = ClusnetSetInterfacePriority(Handle, nodeId, networkId, priority); return(status); } DWORD GetNodeCommState( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; CLUSNET_NODE_COMM_STATE state; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); status = ClusnetGetNodeCommState( Handle, nodeId, &state ); if (status == ERROR_SUCCESS) { printf("State = "); switch(state) { case ClusnetNodeCommStateOffline: printf("Offline\n"); break; case ClusnetNodeCommStateOfflinePending: printf("Offline Pending\n"); break; case ClusnetNodeCommStateOnlinePending: printf("Online Pending\n"); break; case ClusnetNodeCommStateOnline: printf("Online\n"); break; case ClusnetNodeCommStateUnreachable: printf("Unreachable\n"); break; default: printf("Unknown %u)\n", state); break; } } return(status); } DWORD GetNetworkState( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NETWORK_ID networkId; CLUSNET_NETWORK_STATE state; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } networkId = strtoul(argv[0], NULL, 10); status = ClusnetGetNetworkState( Handle, networkId, &state ); if (status == ERROR_SUCCESS) { printf("State = "); switch(state) { case ClusnetNetworkStateOffline: printf("Offline\n"); break; case ClusnetNetworkStateOfflinePending: printf("Offline pending\n"); break; case ClusnetNetworkStateOnlinePending: printf("Online pending\n"); break; case ClusnetNetworkStateOnline: printf("Online\n"); break; default: printf("Unknown %u)\n", state); break; } } return(status); } DWORD GetInterfaceState( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; CL_NETWORK_ID networkId; CLUSNET_INTERFACE_STATE state; if (argc < 2) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); networkId = strtoul(argv[1], NULL, 10); status = ClusnetGetInterfaceState( Handle, nodeId, networkId, &state ); if (status == ERROR_SUCCESS) { printf("State = "); switch(state) { case ClusnetInterfaceStateOffline: printf("Offline\n"); break; case ClusnetInterfaceStateOfflinePending: printf("Offline pending\n"); break; case ClusnetInterfaceStateOnlinePending: printf("Online pending\n"); break; case ClusnetInterfaceStateOnline: printf("Online\n"); break; case ClusnetInterfaceStateUnreachable: printf("Unreachable\n"); break; default: printf("Unknown %u)\n", state); break; } } return(status); } DWORD TestEvents( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; DWORD Mask; CLUSNET_EVENT Event; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } Mask = strtoul(argv[0], NULL, 16); status = ClusnetSetEventMask( Handle, Mask ); if ( status == ERROR_SUCCESS ) { while ( 1 ) { status = ClusnetGetNextEvent( Handle, &Event, NULL ); printf( "Status = %d, Event Type = %d, Node Id = %d, Network Id = %d\n", status, Event.EventType, Event.NodeId, Event.NetworkId ); } } return(status); } DWORD SetMemLogging( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; DWORD NumEntries; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } NumEntries = strtoul(argv[0], NULL, 10); status = ClusnetSetMemLogging( Handle, NumEntries ); return(status); } #if DBG DWORD SetDebugMask( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; ULONG mask; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } mask = strtoul(argv[0], NULL, 16); status = ClusnetSetDebugMask(Handle, mask); return(status); } DWORD OnlinePendingInterface( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; CL_NETWORK_ID networkId; if (argc < 2) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); networkId = strtoul(argv[1], NULL, 10); status = ClusnetOnlinePendingInterface(Handle, nodeId, networkId); return(status); } DWORD OnlineInterface( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; CL_NETWORK_ID networkId; if (argc < 2) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); networkId = strtoul(argv[1], NULL, 10); status = ClusnetOnlineInterface(Handle, nodeId, networkId); return(status); } DWORD OfflineInterface( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; CL_NETWORK_ID networkId; if (argc < 2) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); networkId = strtoul(argv[1], NULL, 10); status = ClusnetOfflineInterface(Handle, nodeId, networkId); return(status); } DWORD FailInterface( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; CL_NETWORK_ID networkId; if (argc < 2) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); networkId = strtoul(argv[1], NULL, 10); status = ClusnetFailInterface(Handle, nodeId, networkId); return(status); } DWORD SendMmMsg( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; ULONG pattern; if (argc < 2) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); pattern = strtoul(argv[1], NULL, 16); status = ClusnetSendMmMsg(Handle, nodeId, pattern); return(status); } #ifdef MM_IN_CLUSNET DWORD MMgrForm( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; ULONG ClockPeriod; ULONG SendHBRate; ULONG RecvHBRate; if (argc < 4) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); ClockPeriod = strtoul(argv[1], NULL, 10); SendHBRate = strtoul(argv[2], NULL, 10); RecvHBRate = strtoul(argv[3], NULL, 10); status = ClusnetFormCluster(Handle, ClockPeriod, SendHBRate, RecvHBRate ); return(status); } DWORD MMgrJoin( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; ULONG Phase; ULONG JoinTimeout; if (argc < 3) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); Phase = strtoul(argv[1], NULL, 10); JoinTimeout = strtoul(argv[2], NULL, 10); #if 0 status = ClusnetJoinCluster( Handle, nodeId, Phase, JoinTimeout ); #else status = ERROR_CALL_NOT_IMPLEMENTED; #endif return(status); } DWORD MMgrLeave( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; status = ClusnetLeaveCluster( Handle ); return(status); } DWORD MMgrGetMembershipState( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; CLUSTER_NODE_STATE State; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); status = ClusnetGetNodeMembershipState( Handle, nodeId, &State ); printf("Node state = "); switch ( State ) { case ClusterNodeUnavailable: printf( "Unavailable" ); break; case ClusterNodeUp: printf( "Up" ); break; case ClusterNodeDown: printf( "Down" ); break; case ClusterNodePaused: printf( "Paused" ); break; case ClusterNodeJoining: printf( "Joining" ); break; default: printf( "Unknown" ); } printf( "\n" ); return(status); } DWORD MMgrEject( IN char ** argv, IN int argc ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; CL_NODE_ID nodeId; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); status = ClusnetEvictNode( Handle, nodeId ); return(status); } #endif // MM_IN_CLUSNET #endif // DBG DWORD SendPoisonPacket( IN char ** argv, IN int argc ) { DWORD status; CL_NODE_ID nodeId; DWORD packets = 1, i; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } nodeId = strtoul(argv[0], NULL, 10); if (argc > 1) { packets = strtoul(argv[1], NULL, 10); packets = (packets > 100) ? 100 : packets; } for (i = 0; i < packets; i++) { status = ClusnetSendPoisonPacket(Handle, nodeId); // ignore status } return(status); } DWORD GetMulticastReachableSet( IN char ** argv, IN int argc ) { DWORD status; CL_NETWORK_ID networkId; DWORD nodeScreen; if (argc < 1) { return(ERROR_INVALID_PARAMETER); } networkId = strtoul(argv[0], NULL, 10); status = ClusnetGetMulticastReachableSet(Handle, networkId, &nodeScreen); if (status == ERROR_SUCCESS) { printf("Multicast reachable screen for network %u: %4x.\n", networkId, nodeScreen ); } return(status); } PWCHAR ConvertStringToUnicode( PUCHAR String ) { ANSI_STRING ansiString; UNICODE_STRING unicodeString; DWORD status; RtlInitAnsiString(&ansiString, String); RtlInitUnicodeString(&unicodeString, NULL); status = RtlAnsiStringToUnicodeString(&unicodeString, &ansiString, TRUE); if (!NT_SUCCESS(status)) { return(NULL); } return(unicodeString.Buffer); } PTRANSPORT_ADDRESS BuildTdiAddressForIp( IN ULONG Address, IN USHORT Port, OUT PULONG TdiAddressLength ) /*++ Routine Description: Arguments: Return Value: ERROR_SUCCESS if the operation was successful. A Windows error code otherwise. --*/ { DWORD status; PTA_IP_ADDRESS taIpAddress; taIpAddress = LocalAlloc(LMEM_FIXED, sizeof(TA_IP_ADDRESS)); if (taIpAddress == NULL) { return(NULL); } ZeroMemory(taIpAddress, sizeof(TA_IP_ADDRESS)); taIpAddress->TAAddressCount = 1; taIpAddress->Address[0].AddressLength = sizeof(TDI_ADDRESS_IP); taIpAddress->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; taIpAddress->Address[0].Address[0].in_addr = Address; taIpAddress->Address[0].Address[0].sin_port = Port; *TdiAddressLength = sizeof(TA_IP_ADDRESS); return((PTRANSPORT_ADDRESS) taIpAddress); }