windows-nt/Source/XPSP1/NT/base/cluster/clusrtl/ipaddr.c
2020-09-26 16:20:57 +08:00

124 lines
2.6 KiB
C

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
ipaddr.c
Abstract:
Ip Address validation routines.
Author:
Sunita Shrivastava (sunitas) July 19, 1997
Revision History:
Who When What
-------- -------- ----------------------------------------------
sunitas 07-19-97 created
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <llinfo.h>
#include <wchar.h>
#include <ipexport.h>
#include <cluster.h>
#include <icmpapi.h>
#include <llinfo.h>
#include <ipinfo.h>
//
// Define IP Address ping test data
//
#define ICMP_TTL 128
#define ICMP_TOS 0
#define ICMP_TIMEOUT 500
#define ICMP_TRY_COUNT 4
#define ICMP_BUFFER_SIZE (sizeof(ICMP_ECHO_REPLY) + 8)
BOOL
ClRtlIsDuplicateTcpipAddress(
IN IPAddr IpAddr
)
/*++
Routine Description:
This routine checks whether a give IP Address already exists on the
network.
Arguments:
IpAddr - The IP Address to check for.
Return Value:
TRUE if the specified address exists on the network.
FALSE otherwise.
--*/
{
DWORD status;
IP_OPTION_INFORMATION icmpOptionInfo;
HANDLE icmpHandle;
DWORD numberOfReplies;
DWORD i;
UCHAR icmpBuffer[ICMP_BUFFER_SIZE];
PICMP_ECHO_REPLY reply;
icmpHandle = IcmpCreateFile();
if (icmpHandle != INVALID_HANDLE_VALUE) {
icmpOptionInfo.OptionsData = NULL;
icmpOptionInfo.OptionsSize = 0;
icmpOptionInfo.Ttl = ICMP_TTL;
icmpOptionInfo.Tos = ICMP_TOS;
icmpOptionInfo.Flags = 0;
for (i=0; i<ICMP_TRY_COUNT; i++) {
numberOfReplies = IcmpSendEcho(
icmpHandle,
IpAddr,
NULL,
0,
&icmpOptionInfo,
icmpBuffer,
ICMP_BUFFER_SIZE,
ICMP_TIMEOUT
);
reply = (PICMP_ECHO_REPLY) icmpBuffer;
while (numberOfReplies != 0) {
if (reply->Status == IP_SUCCESS) {
IcmpCloseHandle( icmpHandle );
return(TRUE);
}
reply++;
numberOfReplies--;
}
}
IcmpCloseHandle( icmpHandle );
}
return(FALSE);
} // ClRtlIsDuplicateTcpipAddress