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