10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Copyright 2011 Google Inc. All Rights Reserved. 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_P2P_CLIENT_CONNECTIVITYCHECKER_H_ 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_P2P_CLIENT_CONNECTIVITYCHECKER_H_ 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <map> 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 10cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/basicpacketsocketfactory.h" 11cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/client/httpportallocator.h" 122a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/basictypes.h" 132a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/messagehandler.h" 14cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/network.h" 152a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/proxyinfo.h" 162a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/scoped_ptr.h" 172a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/sigslot.h" 182a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/socketaddress.h" 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 202a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgnamespace rtc { 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass AsyncHttpRequest; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass AutoDetectProxy; 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass BasicPacketSocketFactory; 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass NetworkManager; 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass PacketSocketFactory; 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass SignalThread; 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass TestHttpPortAllocatorSession; 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass Thread; 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket { 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass HttpPortAllocator; 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass Port; 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass PortAllocatorSession; 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct PortConfiguration; 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass RelayPort; 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass StunPort; 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Contains details about a discovered firewall that are of interest 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// when debugging call failures. 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct FirewallInfo { 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string brand; 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string model; 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO: List of current port mappings. 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Contains details about a specific connect attempt. 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct ConnectInfo { 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ConnectInfo() 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : rtt(-1), error(0) {} 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Time when the connection was initiated. Needed for calculating 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // the round trip time. 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 start_time_ms; 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Round trip time in milliseconds or -1 for failed connection. 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int32 rtt; 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Error code representing low level errors like socket errors. 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int error; 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Identifier for a network interface and proxy address pair. 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct NicId { 632a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org NicId(const rtc::IPAddress& ip, 642a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::SocketAddress& proxy_address) 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : ip(ip), 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org proxy_address(proxy_address) { 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 682a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::IPAddress ip; 692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress proxy_address; 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Comparator implementation identifying unique network interface and 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// proxy address pairs. 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass NicIdComparator { 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int compare(const NicId &first, const NicId &second) const { 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (first.ip == second.ip) { 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Compare proxy address. 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (first.proxy_address == second.proxy_address) { 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return 0; 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } else { 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return first.proxy_address < second.proxy_address? -1 : 1; 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return first.ip < second.ip ? -1 : 1; 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool operator()(const NicId &first, const NicId &second) const { 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return (compare(first, second) < 0); 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Contains information of a network interface and proxy address pair. 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct NicInfo { 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org NicInfo() {} 962a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::IPAddress ip; 972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::ProxyInfo proxy_info; 982a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress external_address; 99459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org ServerAddresses stun_server_addresses; 1002a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress media_server_address; 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ConnectInfo stun; 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ConnectInfo http; 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ConnectInfo https; 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ConnectInfo udp; 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ConnectInfo tcp; 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ConnectInfo ssltcp; 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org FirewallInfo firewall; 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Holds the result of the connectivity check. 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass NicMap : public std::map<NicId, NicInfo, NicIdComparator> { 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass TestHttpPortAllocatorSession : public HttpPortAllocatorSession { 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestHttpPortAllocatorSession( 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org HttpPortAllocator* allocator, 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& content_name, 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int component, 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& ice_ufrag, 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& ice_pwd, 1222a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const std::vector<rtc::SocketAddress>& stun_hosts, 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::vector<std::string>& relay_hosts, 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& relay_token, 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& user_agent) 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : HttpPortAllocatorSession( 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org allocator, content_name, component, ice_ufrag, ice_pwd, stun_hosts, 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org relay_hosts, relay_token, user_agent) { 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void set_proxy(const rtc::ProxyInfo& proxy) { 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org proxy_ = proxy; 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void ConfigReady(PortConfiguration* config); 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1362a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void OnRequestDone(rtc::SignalThread* data); 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal4<const std::string&, const std::string&, 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const PortConfiguration*, 1402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::ProxyInfo&> SignalConfigReady; 1412a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org sigslot::signal1<rtc::AsyncHttpRequest*> SignalRequestDone; 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 1442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::ProxyInfo proxy_; 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Runs a request/response check on all network interface and proxy 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// address combinations. The check is considered done either when all 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// checks has been successful or when the check times out. 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass ConnectivityChecker 1512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org : public rtc::MessageHandler, public sigslot::has_slots<> { 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 1532a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ConnectivityChecker(rtc::Thread* worker, 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& jid, 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& session_id, 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& user_agent, 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& relay_token, 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& connection); 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual ~ConnectivityChecker(); 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Virtual for gMock. 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool Initialize(); 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void Start(); 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // MessageHandler implementation. 1662a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual void OnMessage(rtc::Message *msg); 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Instruct checker to stop and wait until that's done. 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Virtual for gMock. 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void Stop() { 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org worker_->Stop(); 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const NicMap& GetResults() const { 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return nics_; 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void set_timeout_ms(uint32 timeout) { 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org timeout_ms_ = timeout; 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1822a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void set_stun_address(const rtc::SocketAddress& stun_address) { 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stun_address_ = stun_address; 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& connection() const { 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return connection_; 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& jid() const { 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return jid_; 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& session_id() const { 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return session_id_; 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Context: Main Thread. Signalled when the connectivity check is complete. 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<ConnectivityChecker*> SignalCheckDone; 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Can be overridden for test. 2032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual rtc::NetworkManager* CreateNetworkManager() { 2042a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org return new rtc::BasicNetworkManager(); 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2062a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual rtc::BasicPacketSocketFactory* CreateSocketFactory( 2072a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* thread) { 2082a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org return new rtc::BasicPacketSocketFactory(thread); 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual HttpPortAllocator* CreatePortAllocator( 2112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::NetworkManager* network_manager, 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& user_agent, 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& relay_token); 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual StunPort* CreateStunPort( 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& username, const std::string& password, 2162a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const PortConfiguration* config, rtc::Network* network); 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual RelayPort* CreateRelayPort( 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& username, const std::string& password, 2192a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const PortConfiguration* config, rtc::Network* network); 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void InitiateProxyDetection(); 2212a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual void SetProxyInfo(const rtc::ProxyInfo& info); 2222a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual rtc::ProxyInfo GetProxyInfo() const; 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* worker() { 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return worker_; 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 2292a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org bool AddNic(const rtc::IPAddress& ip, 2302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::SocketAddress& proxy_address); 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AllocatePorts(); 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AllocateRelayPorts(); 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CheckNetworks(); 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CreateRelayPorts( 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& username, const std::string& password, 2362a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const PortConfiguration* config, const rtc::ProxyInfo& proxy_info); 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Must be called by the worker thread. 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CleanUp(); 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2412a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void OnRequestDone(rtc::AsyncHttpRequest* request); 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnRelayPortComplete(Port* port); 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnStunPortComplete(Port* port); 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnRelayPortError(Port* port); 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnStunPortError(Port* port); 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnNetworksChanged(); 2472a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void OnProxyDetect(rtc::SignalThread* thread); 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnConfigReady( 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& username, const std::string& password, 2502a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const PortConfiguration* config, const rtc::ProxyInfo& proxy); 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnConfigWithProxyReady(const PortConfiguration*); 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void RegisterHttpStart(int port); 2532a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* worker_; 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string jid_; 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string session_id_; 2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string user_agent_; 2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string relay_token_; 2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string connection_; 2592a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::AutoDetectProxy* proxy_detect_; 2602a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<rtc::NetworkManager> network_manager_; 2612a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<rtc::BasicPacketSocketFactory> socket_factory_; 2622a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<HttpPortAllocator> port_allocator_; 2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org NicMap nics_; 2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<Port*> ports_; 2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<PortAllocatorSession*> sessions_; 2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 timeout_ms_; 2672a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress stun_address_; 2682a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* main_; 2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool started_; 2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace cricket 2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif // TALK_P2P_CLIENT_CONNECTIVITYCHECKER_H_ 275