summaryrefslogtreecommitdiff
path: root/ace/Ping_Socket.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ace/Ping_Socket.cpp')
-rw-r--r--ace/Ping_Socket.cpp365
1 files changed, 0 insertions, 365 deletions
diff --git a/ace/Ping_Socket.cpp b/ace/Ping_Socket.cpp
deleted file mode 100644
index 9d1254a1bc3..00000000000
--- a/ace/Ping_Socket.cpp
+++ /dev/null
@@ -1,365 +0,0 @@
-// $Id$
-
-#include "ace/Ping_Socket.h"
-
-#if defined (ACE_HAS_ICMP_SUPPORT) && (ACE_HAS_ICMP_SUPPORT == 1)
-
-#include "ace/INET_Addr.h"
-#include "ace/Log_Msg.h"
-#include "ace/OS_NS_string.h"
-#include "ace/OS_NS_sys_time.h"
-#include "ace/OS_NS_sys_socket.h"
-
-#if !defined (__ACE_INLINE__)
-# include "ace/Ping_Socket.inl"
-#endif /* !__ACE_INLINE__ */
-
-
-ACE_RCSID (ace,
- Ping_Socket,
- "$Id$")
-
-ACE_ALLOC_HOOK_DEFINE (ACE_Ping_Socket)
-
-//---------------------------------------------------------------------------
-// Better to arrange some os_include/netinet/ip.h and
-// os_include/netinet/icmp.h files ?
-//---------------------------------------------------------------------------
-
-#if !defined (ACE_WIN32)
-
-/*
- * This is where ICMP-related stuff is defined on any sane system...
- */
-#include /**/ <netinet/in_systm.h>
-#include /**/ <netinet/ip.h>
-#include /**/ <netinet/ip_icmp.h>
-
-#else /* #if ! defined (ACE_WIN32) */
-
-/*
- * This was a surpise to me... This stuff is not defined anywhere under MSVC.
- * These values have only been checked for NT4 and Win2K. They were taken from
- * the MSDN ping.c program and modified.
- */
-
-#define ICMP_ECHO 8
-#define ICMP_ECHOREPLY 0
-
-struct ip
-{
- unsigned int ip_hl:4; // length of the header
- unsigned int version:4; // Version of IP
- unsigned char tos; // Type of service
- unsigned short total_len; // total length of the packet
- unsigned short ident; // unique identifier
- unsigned short frag_and_flags; // flags
- unsigned char ip_ttl; // Time to live
- unsigned char proto; // protocol (TCP, UDP etc)
- unsigned short checksum; // IP checksum
- unsigned int sourceIP;
- unsigned int destIP;
-};
-
-struct icmp
-{
- unsigned char icmp_type;
- unsigned char icmp_code; // type sub code
- unsigned short icmp_cksum;
- unsigned short icmp_id;
- unsigned short icmp_seq;
- unsigned long icmp_data; // time data
-};
-
-#endif /* #if ! defined (ACE_WIN32) */
-
-
-int const ICMP_MIN = 8; // Minimal size of ICMP packet, header only
-int const ICMP_DATA_LENGTH = 56; // For ICMP data with Echo request
-ACE_Time_Value const ACE_Ping_Socket::time_default_ (0, 500000);
-
-
-void
-ACE_Ping_Socket::dump (void) const
-{
- ACE_TRACE ("ACE_Ping_Socket::dump");
-}
-
-ACE_Ping_Socket::ACE_Ping_Socket (void)
-{
- ACE_TRACE ("ACE_Ping_Socket::ACE_Ping_Socket");
-}
-
-ACE_Ping_Socket::ACE_Ping_Socket (ACE_Addr const & local,
- int protocol,
- int reuse_addr)
- : sequence_number_ (0),
- connected_socket_ (0)
-{
- ACE_TRACE ("ACE_Ping_Socket::ACE_Ping_Socket");
-
- ACE_OS::memset (icmp_send_buff_, 0, sizeof (icmp_send_buff_));
- ACE_OS::memset (icmp_recv_buff_, 0, sizeof (icmp_recv_buff_));
-
- if (this->open (local, protocol, reuse_addr) == -1)
- {
- ACE_DEBUG ((LM_DEBUG,
- ACE_LIB_TEXT ("ACE_Ping_Socket::ACE_Ping_Socket: %p\n"),
- ACE_LIB_TEXT ("open")));
- return;
- }
-
- // trying to increase the size of socket receive buffer - some
- // protection from multiple responces e.g., when falling to the
- // multi-cast address
- int size = 64 * 1024;
- ACE_SOCK::set_option (SOL_SOCKET,
- SO_RCVBUF,
- (void *) &size,
- sizeof (size));
-}
-
-ACE_Ping_Socket::~ACE_Ping_Socket (void)
-{
- ACE_TRACE ("ACE_Ping_Socket::~ACE_Ping_Socket");
-}
-
-int
-ACE_Ping_Socket::open (ACE_Addr const & local,
- int protocol,
- int reuse_addr)
-{
- ACE_TRACE ("ACE_Ping_Socket::open");
- return inherited::open (local, protocol, reuse_addr);
-}
-
-int
-ACE_Ping_Socket::receive_echo_reply (ACE_Time_Value const * timeout)
-{
- ACE_TRACE ("ACE_Ping_Socket::receive_echo_reply");
-
- ACE_Time_Value before = ACE_OS::gettimeofday ();
- ACE_Time_Value after;
- ACE_Time_Value time_left;
- ACE_Time_Value *wait_time = const_cast<ACE_Time_Value *> (timeout);
- const ACE_Time_Value half_millisec (0, 500);
-
- ACE_OS::memset (icmp_recv_buff_, 0, sizeof icmp_recv_buff_);
-
- do
- {
- int rval_recv = inherited::recv (icmp_recv_buff_,
- sizeof icmp_recv_buff_,
- 0,
- wait_time);
- if (rval_recv < 0)
- {
- if (errno == EINTR)
- {
- after = ACE_OS::gettimeofday ();
- time_left = *timeout - after + before;
-
- // If more than .5 ms left, wait on select()
- if (time_left > half_millisec)
- {
- wait_time = &time_left; // coming back to wait on select()
- continue;
- }
- else
- {
- break;
- }
- }
- return -1;
- }
- else if (!this->process_incoming_dgram (icmp_recv_buff_, rval_recv))
- {
- return 0; //= success
- }
- else
- {
- after = ACE_OS::gettimeofday ();
- if ((after - before) >= *timeout)
- {
- errno = ETIMEDOUT;
- break;
- }
- // new timeout, we are coming back to sit on select
- *wait_time = *timeout - after + before;
- }
- } while (*wait_time >= half_millisec);
-
- errno = ETIMEDOUT;
- return -1;
-}
-
-int
-ACE_Ping_Socket::process_incoming_dgram (char * ptr, ssize_t len)
-{
- unsigned char hlen1;
- int icmplen;
- struct ip * ip;
- struct icmp * icmp;
-
- ip = (struct ip *) ptr; // start of IP header
-
- // Warning... using knowledge of IP header layout. This avoids a maze of
- // #if blocks for various systems. The first byte of the header has the
- // IP version in the left-most 4 bits and the length in the other 4 bits.
-#if 0
- hlen1 = ip->ip_hl; // length of IP header
-#else
- hlen1 = static_cast<unsigned char>(*ptr);
- hlen1 <<= 4; // Bump the version off
- hlen1 >>= 4; // Zero-extended length remains
-#endif
- hlen1 <<= 2; // Now it counts bytes, not words
-
- icmp = (struct icmp *) (ptr + hlen1); // start of ICMP header
-
- if ((icmplen = len - hlen1) < ICMP_MIN)
- {
- ACE_DEBUG
- ((LM_DEBUG,
- ACE_LIB_TEXT ("(%P|%t) ACE_Ping_Socket::process_incoming_dgram")
- ACE_LIB_TEXT (" - ICMP length is %d < 8.\n"),
- icmplen));
- ACE_ERROR_RETURN
- ((LM_ERROR,
- ACE_LIB_TEXT ("(%P|%t) ACE_Ping_Socket::process_incoming_dgram - ")
- ACE_LIB_TEXT ("The ICMP header either not received or is corrupted.")),
- -1);
- }
-
- if (icmp->icmp_type == ICMP_ECHOREPLY)
- {
- ACE_DEBUG
- ((LM_DEBUG,
- ACE_LIB_TEXT ("(%P|%t) ACE_Ping_Socket::process_incoming_dgram")
- ACE_LIB_TEXT (" - ICMP_ECHOREPLY received.\n")));
-
- if (icmp->icmp_id != getpid ())
- {
- ACE_ERROR_RETURN
- ((LM_ERROR,
- ACE_LIB_TEXT ("(%P|%t) ACE_Ping_Socket::")
- ACE_LIB_TEXT ("process_incoming_dgram ")
- ACE_LIB_TEXT ("- The ICMP header received is a reply")
- ACE_LIB_TEXT (" to request of another process.")),
- -1);
- }
- if (icmplen < 16)
- {
- ACE_ERROR_RETURN
- ((LM_ERROR,
- ACE_LIB_TEXT ("(%P|%t) ACE_Ping_Socket::")
- ACE_LIB_TEXT ("process_incoming_dgram - ICMP length ")
- ACE_LIB_TEXT ("is %d < 16."),
- icmplen),
- -1);
- }
-
- ACE_DEBUG
- ((LM_DEBUG,
- ACE_LIB_TEXT ("(%P|%t) ACE::Ping_Socket::process_incoming_dgram - ")
- ACE_LIB_TEXT ("received ")
- ACE_LIB_TEXT ("ICMP datagram with length of %d bytes (not counting ")
- ACE_LIB_TEXT ("IP-header): seq=%u, ttl=%d.\n"),
- icmplen, icmp->icmp_seq, ip->ip_ttl));
-
- return 0; //= success
- }
-
- ACE_DEBUG
- ((LM_DEBUG,
- ACE_LIB_TEXT ("(%P|%t) ACE::Ping_Socket::process_incoming_dgram - ")
- ACE_LIB_TEXT ("received datagram that is not ICMP_ECHOREPLY.\n")));
-
- return -1;
-}
-
-int
-ACE_Ping_Socket::send_echo_check (ACE_INET_Addr &remote_addr,
- int to_connect)
-{
- if (this->get_handle () == ACE_INVALID_HANDLE)
- {
- errno = EBADF;
- return -1;
- }
-
- sockaddr_in *addr_connect = 0;
- addr_connect = (sockaddr_in *) remote_addr.get_addr ();
-
- /*
- * Nulling port field to prevent strange behavior, when a raw
- * socket is "connected" to a sockaddr_in with a non-nulled port.
- */
- ACE_OS::memset ((void*) &addr_connect->sin_port,
- 0,
- sizeof (addr_connect->sin_port));
-
- // to connect the socket
- if (to_connect && !this->connected_socket_)
- {
- if (ACE_OS::connect (this->get_handle (),
- (sockaddr*) addr_connect,
- remote_addr.get_size ()) == -1)
- {
- if (errno != EINTR)
- return -1;
- }
- this->connected_socket_ = 1;
- }
-
- ACE_OS::memset (this->icmp_send_buff_, 0, sizeof this->icmp_send_buff_);
- int datalen = ICMP_DATA_LENGTH;
- struct icmp *_icmp;
-
- _icmp = (struct icmp *) this->icmp_send_buff_;
- _icmp->icmp_type = ICMP_ECHO;
- _icmp->icmp_code = 0;
- _icmp->icmp_id = getpid ();
- _icmp->icmp_seq = sequence_number_++;
-
-#if defined (ACE_WIN32)
- _icmp->icmp_data = GetTickCount ();
-#else /* #if defined (ACE_WIN32) */
- gettimeofday ((struct timeval *) &_icmp->icmp_data, 0);
-#endif /* #if defined (ACE_WIN32) */
-
- int length_icmp = ICMP_MIN + datalen; // checksum ICMP header and data.
- _icmp->icmp_cksum = 0;
- _icmp->icmp_cksum = inherited::calculate_checksum ((u_short *) _icmp,
- length_icmp);
- int rval_send = -1;
-
- if ((rval_send = send ((void const *) icmp_send_buff_,
- length_icmp,
- remote_addr)) != length_icmp)
- {
- return -1;
- }
- return 0;
-}
-
-int
-ACE_Ping_Socket::make_echo_check (ACE_INET_Addr & remote_addr,
- int to_connect,
- ACE_Time_Value const * timeout)
-{
- int rval_send = -1;
-
- if ((rval_send = this->send_echo_check (remote_addr,
- to_connect)) == -1)
- return -1;
-
- ACE_DEBUG
- ((LM_DEBUG,
- ACE_LIB_TEXT ("(%P|%t) ACE_Ping_Socket::make_echo_check - sent %d.\n"),
- rval_send));
-
- return this->receive_echo_reply (timeout);
-}
-
-#endif /* ACE_HAS_ICMP_SUPPORT == 1 */