| /* | 
 |  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #ifndef WEBRTC_BASE_WINPING_H__ | 
 | #define WEBRTC_BASE_WINPING_H__ | 
 |  | 
 | #if defined(WEBRTC_WIN) | 
 |  | 
 | #include "webrtc/base/win32.h" | 
 | #include "webrtc/base/basictypes.h" | 
 | #include "webrtc/base/ipaddress.h" | 
 |  | 
 | namespace rtc { | 
 |  | 
 | // This class wraps a Win32 API for doing ICMP pinging.  This API, unlike the | 
 | // the normal socket APIs (as implemented on Win9x), will return an error if | 
 | // an ICMP packet with the dont-fragment bit set is too large.  This means this | 
 | // class can be used to detect the MTU to a given address. | 
 |  | 
 | typedef struct ip_option_information { | 
 |     UCHAR   Ttl;                // Time To Live | 
 |     UCHAR   Tos;                // Type Of Service | 
 |     UCHAR   Flags;              // IP header flags | 
 |     UCHAR   OptionsSize;        // Size in bytes of options data | 
 |     PUCHAR  OptionsData;        // Pointer to options data | 
 | } IP_OPTION_INFORMATION, * PIP_OPTION_INFORMATION; | 
 |  | 
 | typedef HANDLE (WINAPI *PIcmpCreateFile)(); | 
 |  | 
 | typedef BOOL (WINAPI *PIcmpCloseHandle)(HANDLE icmp_handle); | 
 |  | 
 | typedef HANDLE (WINAPI *PIcmp6CreateFile)(); | 
 |  | 
 | typedef BOOL (WINAPI *PIcmp6CloseHandle)(HANDLE icmp_handle); | 
 |  | 
 | typedef DWORD (WINAPI *PIcmpSendEcho)( | 
 |     HANDLE                   IcmpHandle, | 
 |     ULONG                    DestinationAddress, | 
 |     LPVOID                   RequestData, | 
 |     WORD                     RequestSize, | 
 |     PIP_OPTION_INFORMATION   RequestOptions, | 
 |     LPVOID                   ReplyBuffer, | 
 |     DWORD                    ReplySize, | 
 |     DWORD                    Timeout); | 
 |  | 
 | typedef DWORD (WINAPI *PIcmp6SendEcho2)( | 
 |     HANDLE IcmpHandle, | 
 |     HANDLE Event, | 
 |     FARPROC ApcRoutine, | 
 |     PVOID ApcContext, | 
 |     struct sockaddr_in6 *SourceAddress, | 
 |     struct sockaddr_in6 *DestinationAddress, | 
 |     LPVOID RequestData, | 
 |     WORD RequestSize, | 
 |     PIP_OPTION_INFORMATION RequestOptions, | 
 |     LPVOID ReplyBuffer, | 
 |     DWORD ReplySize, | 
 |     DWORD Timeout | 
 | ); | 
 |  | 
 | class WinPing { | 
 | public: | 
 |     WinPing(); | 
 |     ~WinPing(); | 
 |  | 
 |     // Determines whether the class was initialized correctly. | 
 |     bool IsValid() { return valid_; } | 
 |  | 
 |     // Attempts to send a ping with the given parameters. | 
 |     enum PingResult { PING_FAIL, PING_INVALID_PARAMS, | 
 |                       PING_TOO_LARGE, PING_TIMEOUT, PING_SUCCESS }; | 
 |     PingResult Ping(IPAddress ip, | 
 |                     uint32_t data_size, | 
 |                     uint32_t timeout_millis, | 
 |                     uint8_t ttl, | 
 |                     bool allow_fragments); | 
 |  | 
 | private: | 
 |     HMODULE dll_; | 
 |     HANDLE hping_; | 
 |     HANDLE hping6_; | 
 |     PIcmpCreateFile create_; | 
 |     PIcmpCloseHandle close_; | 
 |     PIcmpSendEcho send_; | 
 |     PIcmp6CreateFile create6_; | 
 |     PIcmp6SendEcho2 send6_; | 
 |     char* data_; | 
 |     uint32_t dlen_; | 
 |     char* reply_; | 
 |     uint32_t rlen_; | 
 |     bool valid_; | 
 | }; | 
 |  | 
 | } // namespace rtc | 
 |  | 
 | #endif // WEBRTC_WIN  | 
 |  | 
 | #endif // WEBRTC_BASE_WINPING_H__ |