15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Copyright 2011 Google Inc. All Rights Reserved.
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_P2P_CLIENT_CONNECTIVITYCHECKER_H_
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_P2P_CLIENT_CONNECTIVITYCHECKER_H_
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <map>
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string>
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/network.h"
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/basictypes.h"
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/messagehandler.h"
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/proxyinfo.h"
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/scoped_ptr.h"
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/sigslot.h"
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/socketaddress.h"
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/basicpacketsocketfactory.h"
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/client/httpportallocator.h"
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base {
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass AsyncHttpRequest;
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass AutoDetectProxy;
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass BasicPacketSocketFactory;
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass NetworkManager;
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass PacketSocketFactory;
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass SignalThread;
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass TestHttpPortAllocatorSession;
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass Thread;
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace cricket {
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass HttpPortAllocator;
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass Port;
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass PortAllocatorSession;
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct PortConfiguration;
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass RelayPort;
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass StunPort;
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Contains details about a discovered firewall that are of interest
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// when debugging call failures.
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct FirewallInfo {
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string brand;
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string model;
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // TODO: List of current port mappings.
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Contains details about a specific connect attempt.
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct ConnectInfo {
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConnectInfo()
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      : rtt(-1), error(0) {}
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Time when the connection was initiated. Needed for calculating
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // the round trip time.
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint32 start_time_ms;
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Round trip time in milliseconds or -1 for failed connection.
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int32 rtt;
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Error code representing low level errors like socket errors.
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int error;
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Identifier for a network interface and proxy address pair.
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct NicId {
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  NicId(const talk_base::IPAddress& ip,
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        const talk_base::SocketAddress& proxy_address)
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      : ip(ip),
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        proxy_address(proxy_address) {
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::IPAddress ip;
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::SocketAddress proxy_address;
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Comparator implementation identifying unique network interface and
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// proxy address pairs.
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass NicIdComparator {
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int compare(const NicId &first, const NicId &second) const {
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (first.ip == second.ip) {
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      // Compare proxy address.
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (first.proxy_address == second.proxy_address) {
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        return 0;
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      } else {
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        return first.proxy_address < second.proxy_address? -1 : 1;
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return first.ip < second.ip ? -1 : 1;
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool operator()(const NicId &first, const NicId &second) const {
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return (compare(first, second) < 0);
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Contains information of a network interface and proxy address pair.
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct NicInfo {
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  NicInfo() {}
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::IPAddress ip;
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::ProxyInfo proxy_info;
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::SocketAddress external_address;
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::SocketAddress stun_server_address;
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::SocketAddress media_server_address;
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConnectInfo stun;
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConnectInfo http;
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConnectInfo https;
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConnectInfo udp;
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConnectInfo tcp;
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConnectInfo ssltcp;
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  FirewallInfo firewall;
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Holds the result of the connectivity check.
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass NicMap : public std::map<NicId, NicInfo, NicIdComparator> {
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass TestHttpPortAllocatorSession : public HttpPortAllocatorSession {
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  TestHttpPortAllocatorSession(
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      HttpPortAllocator* allocator,
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::string& content_name,
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      int component,
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::string& ice_ufrag,
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::string& ice_pwd,
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::vector<talk_base::SocketAddress>& stun_hosts,
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::vector<std::string>& relay_hosts,
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::string& relay_token,
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::string& user_agent)
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      : HttpPortAllocatorSession(
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          allocator, content_name, component, ice_ufrag, ice_pwd, stun_hosts,
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          relay_hosts, relay_token, user_agent) {
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void set_proxy(const talk_base::ProxyInfo& proxy) {
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    proxy_ = proxy;
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void ConfigReady(PortConfiguration* config);
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnRequestDone(talk_base::SignalThread* data);
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal4<const std::string&, const std::string&,
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   const PortConfiguration*,
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   const talk_base::ProxyInfo&> SignalConfigReady;
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal1<talk_base::AsyncHttpRequest*> SignalRequestDone;
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::ProxyInfo proxy_;
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Runs a request/response check on all network interface and proxy
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// address combinations. The check is considered done either when all
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// checks has been successful or when the check times out.
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass ConnectivityChecker
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    : public talk_base::MessageHandler, public sigslot::has_slots<> {
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ConnectivityChecker(talk_base::Thread* worker,
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      const std::string& jid,
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      const std::string& session_id,
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      const std::string& user_agent,
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      const std::string& relay_token,
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      const std::string& connection);
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual ~ConnectivityChecker();
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Virtual for gMock.
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool Initialize();
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void Start();
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // MessageHandler implementation.
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void OnMessage(talk_base::Message *msg);
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Instruct checker to stop and wait until that's done.
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Virtual for gMock.
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void Stop() {
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    worker_->Stop();
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  const NicMap& GetResults() const {
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return nics_;
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void set_timeout_ms(uint32 timeout) {
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    timeout_ms_ = timeout;
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void set_stun_address(const talk_base::SocketAddress& stun_address) {
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    stun_address_ = stun_address;
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  const std::string& connection() const {
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return connection_;
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  const std::string& jid() const {
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return jid_;
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  const std::string& session_id() const {
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return session_id_;
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Context: Main Thread. Signalled when the connectivity check is complete.
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal1<ConnectivityChecker*> SignalCheckDone;
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected:
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Can be overridden for test.
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual talk_base::NetworkManager* CreateNetworkManager() {
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return new talk_base::BasicNetworkManager();
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual talk_base::BasicPacketSocketFactory* CreateSocketFactory(
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      talk_base::Thread* thread) {
2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return new talk_base::BasicPacketSocketFactory(thread);
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual HttpPortAllocator* CreatePortAllocator(
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      talk_base::NetworkManager* network_manager,
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::string& user_agent,
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::string& relay_token);
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual StunPort* CreateStunPort(
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::string& username, const std::string& password,
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const PortConfiguration* config, talk_base::Network* network);
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual RelayPort* CreateRelayPort(
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::string& username, const std::string& password,
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const PortConfiguration* config, talk_base::Network* network);
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void InitiateProxyDetection();
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void SetProxyInfo(const talk_base::ProxyInfo& info);
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual talk_base::ProxyInfo GetProxyInfo() const;
2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::Thread* worker() {
2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return worker_;
2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool AddNic(const talk_base::IPAddress& ip,
2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org              const talk_base::SocketAddress& proxy_address);
2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void AllocatePorts();
2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void AllocateRelayPorts();
2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void CheckNetworks();
2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void CreateRelayPorts(
2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::string& username, const std::string& password,
2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const PortConfiguration* config, const talk_base::ProxyInfo& proxy_info);
2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Must be called by the worker thread.
2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void CleanUp();
2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnRequestDone(talk_base::AsyncHttpRequest* request);
2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnRelayPortComplete(Port* port);
2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnStunPortComplete(Port* port);
2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnRelayPortError(Port* port);
2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnStunPortError(Port* port);
2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnNetworksChanged();
2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnProxyDetect(talk_base::SignalThread* thread);
2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnConfigReady(
2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::string& username, const std::string& password,
2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const PortConfiguration* config, const talk_base::ProxyInfo& proxy);
2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnConfigWithProxyReady(const PortConfiguration*);
2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void RegisterHttpStart(int port);
2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::Thread* worker_;
2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string jid_;
2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string session_id_;
2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string user_agent_;
2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string relay_token_;
2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string connection_;
2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::AutoDetectProxy* proxy_detect_;
2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<talk_base::NetworkManager> network_manager_;
2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<talk_base::BasicPacketSocketFactory> socket_factory_;
2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<HttpPortAllocator> port_allocator_;
2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  NicMap nics_;
2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::vector<Port*> ports_;
2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::vector<PortAllocatorSession*> sessions_;
2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint32 timeout_ms_;
2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::SocketAddress stun_address_;
2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::Thread* main_;
2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool started_;
2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace cricket
2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif  // TALK_P2P_CLIENT_CONNECTIVITYCHECKER_H_
275