|  | /* | 
|  | *  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__ |