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