| Index: webrtc/p2p/stunprober/stunprober.h
|
| diff --git a/webrtc/p2p/stunprober/stunprober.h b/webrtc/p2p/stunprober/stunprober.h
|
| index d773d5760ea612c2d3bda3a4caaa6780d41bc29c..56d5369d8228ff9511cf519f456bb1e051ddd65a 100644
|
| --- a/webrtc/p2p/stunprober/stunprober.h
|
| +++ b/webrtc/p2p/stunprober/stunprober.h
|
| @@ -15,20 +15,32 @@
|
| #include <string>
|
| #include <vector>
|
|
|
| +#include "webrtc/base/asyncinvoker.h"
|
| #include "webrtc/base/basictypes.h"
|
| #include "webrtc/base/bytebuffer.h"
|
| #include "webrtc/base/callback.h"
|
| #include "webrtc/base/ipaddress.h"
|
| +#include "webrtc/base/network.h"
|
| #include "webrtc/base/scoped_ptr.h"
|
| #include "webrtc/base/socketaddress.h"
|
| +#include "webrtc/base/thread.h"
|
| #include "webrtc/base/thread_checker.h"
|
| #include "webrtc/typedefs.h"
|
|
|
| +namespace rtc {
|
| +class AsyncPacketSocket;
|
| +class PacketSocketFactory;
|
| +class Thread;
|
| +class NetworkManager;
|
| +} // namespace rtc
|
| +
|
| namespace stunprober {
|
|
|
| +class StunProber;
|
| +
|
| static const int kMaxUdpBufferSize = 1200;
|
|
|
| -typedef rtc::Callback1<void, int> AsyncCallback;
|
| +typedef rtc::Callback2<void, StunProber*, int> AsyncCallback;
|
|
|
| enum NatType {
|
| NATTYPE_INVALID,
|
| @@ -38,104 +50,7 @@ enum NatType {
|
| NATTYPE_NON_SYMMETRIC // Behind a non-symmetric NAT.
|
| };
|
|
|
| -class HostNameResolverInterface {
|
| - public:
|
| - HostNameResolverInterface() {}
|
| -
|
| - // Resolve should allow re-entry as |callback| could trigger another
|
| - // Resolve().
|
| - virtual void Resolve(const rtc::SocketAddress& addr,
|
| - std::vector<rtc::SocketAddress>* addresses,
|
| - AsyncCallback callback) = 0;
|
| -
|
| - virtual ~HostNameResolverInterface() {}
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(HostNameResolverInterface);
|
| -};
|
| -
|
| -// Chrome has client and server socket. Client socket supports Connect but not
|
| -// Bind. Server is opposite.
|
| -class SocketInterface {
|
| - public:
|
| - enum {
|
| - IO_PENDING = -1,
|
| - FAILED = -2,
|
| - };
|
| - SocketInterface() {}
|
| - virtual void Close() = 0;
|
| - virtual ~SocketInterface() {}
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(SocketInterface);
|
| -};
|
| -
|
| -class ClientSocketInterface : public SocketInterface {
|
| - public:
|
| - ClientSocketInterface() {}
|
| - // Even though we have SendTo and RecvFrom, if Connect is not called first,
|
| - // getsockname will only return 0.0.0.0.
|
| - virtual int Connect(const rtc::SocketAddress& addr) = 0;
|
| -
|
| - virtual int GetLocalAddress(rtc::SocketAddress* local_address) = 0;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(ClientSocketInterface);
|
| -};
|
| -
|
| -class ServerSocketInterface : public SocketInterface {
|
| - public:
|
| - ServerSocketInterface() {}
|
| -
|
| - virtual int SendTo(const rtc::SocketAddress& addr,
|
| - char* buf,
|
| - size_t buf_len,
|
| - AsyncCallback callback) = 0;
|
| -
|
| - // If the returned value is positive, it means that buf has been
|
| - // sent. Otherwise, it should return IO_PENDING. Callback will be invoked
|
| - // after the data is successfully read into buf.
|
| - virtual int RecvFrom(char* buf,
|
| - size_t buf_len,
|
| - rtc::SocketAddress* addr,
|
| - AsyncCallback callback) = 0;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(ServerSocketInterface);
|
| -};
|
| -
|
| -class SocketFactoryInterface {
|
| - public:
|
| - SocketFactoryInterface() {}
|
| - // To provide a chance to prepare the sockets that we need. This is
|
| - // implemented for chrome renderer process as the socket needs to be ready to
|
| - // use in browser process.
|
| - virtual void Prepare(size_t total_client_socket,
|
| - size_t total_server_socket,
|
| - AsyncCallback callback) {
|
| - callback(0);
|
| - }
|
| - virtual ClientSocketInterface* CreateClientSocket() = 0;
|
| - virtual ServerSocketInterface* CreateServerSocket(
|
| - size_t send_buffer_size,
|
| - size_t receive_buffer_size) = 0;
|
| - virtual ~SocketFactoryInterface() {}
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(SocketFactoryInterface);
|
| -};
|
| -
|
| -class TaskRunnerInterface {
|
| - public:
|
| - TaskRunnerInterface() {}
|
| - virtual void PostTask(rtc::Callback0<void>, uint32_t delay_ms) = 0;
|
| - virtual ~TaskRunnerInterface() {}
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(TaskRunnerInterface);
|
| -};
|
| -
|
| -class StunProber {
|
| +class StunProber : public sigslot::has_slots<> {
|
| public:
|
| enum Status { // Used in UMA_HISTOGRAM_ENUMERATION.
|
| SUCCESS, // Successfully received bytes from the server.
|
| @@ -167,11 +82,9 @@ class StunProber {
|
| std::set<std::string> srflx_addrs;
|
| };
|
|
|
| - // StunProber is not thread safe. It's task_runner's responsibility to ensure
|
| - // all calls happen sequentially.
|
| - StunProber(HostNameResolverInterface* host_name_resolver,
|
| - SocketFactoryInterface* socket_factory,
|
| - TaskRunnerInterface* task_runner);
|
| + StunProber(rtc::PacketSocketFactory* socket_factory,
|
| + rtc::Thread* thread,
|
| + const rtc::NetworkManager::NetworkList& networks);
|
| virtual ~StunProber();
|
|
|
| // Begin performing the probe test against the |servers|. If
|
| @@ -203,16 +116,19 @@ class StunProber {
|
| // STUN servers.
|
| class Requester;
|
|
|
| - void OnServerResolved(int index, int result);
|
| + bool ResolveServerName(const rtc::SocketAddress& addr);
|
| + void OnServerResolved(rtc::AsyncResolverInterface* resolver);
|
| +
|
| + void OnSocketReady(rtc::AsyncPacketSocket* socket,
|
| + const rtc::SocketAddress& addr);
|
|
|
| bool Done() {
|
| - return num_request_sent_ >= requests_per_ip_ * all_servers_ips_.size();
|
| + return num_request_sent_ >= requests_per_ip_ * all_servers_addrs_.size();
|
| }
|
|
|
| - int GetTotalClientSockets() { return 1; }
|
| - int GetTotalServerSockets() {
|
| - return static_cast<int>(
|
| - (shared_socket_mode_ ? 1 : all_servers_ips_.size()) * requests_per_ip_);
|
| + size_t total_socket_required() {
|
| + return (shared_socket_mode_ ? 1 : all_servers_addrs_.size()) *
|
| + requests_per_ip_;
|
| }
|
|
|
| bool SendNextRequest();
|
| @@ -223,14 +139,7 @@ class StunProber {
|
|
|
| // End the probe with the given |status|. Invokes |fininsh_callback|, which
|
| // may destroy the class.
|
| - void End(StunProber::Status status, int result);
|
| -
|
| - // Create a socket, connect to the first resolved server, and return the
|
| - // result of getsockname(). All Requesters will bind to this name. We do this
|
| - // because if a socket is not bound nor connected, getsockname will return
|
| - // 0.0.0.0. We can't connect to a single STUN server IP either as that will
|
| - // fail subsequent requests in shared mode.
|
| - int GetLocalAddress(rtc::IPAddress* addr);
|
| + void End(StunProber::Status status);
|
|
|
| Requester* CreateRequester();
|
|
|
| @@ -256,19 +165,12 @@ class StunProber {
|
| // STUN server name to be resolved.
|
| std::vector<rtc::SocketAddress> servers_;
|
|
|
| - // The local address that each probing socket will be bound to.
|
| - rtc::IPAddress local_addr_;
|
| + // Weak references.
|
| + rtc::PacketSocketFactory* socket_factory_;
|
| + rtc::Thread* thread_;
|
|
|
| - // Owned pointers.
|
| - rtc::scoped_ptr<SocketFactoryInterface> socket_factory_;
|
| - rtc::scoped_ptr<HostNameResolverInterface> resolver_;
|
| - rtc::scoped_ptr<TaskRunnerInterface> task_runner_;
|
| -
|
| - // Addresses filled out by HostNameResolver for a single server.
|
| - std::vector<rtc::SocketAddress> resolved_ips_;
|
| -
|
| - // Accumulate all resolved IPs.
|
| - std::vector<rtc::SocketAddress> all_servers_ips_;
|
| + // Accumulate all resolved addresses.
|
| + std::vector<rtc::SocketAddress> all_servers_addrs_;
|
|
|
| // Caller-supplied callback executed when testing is completed, called by
|
| // End().
|
| @@ -279,6 +181,15 @@ class StunProber {
|
|
|
| rtc::ThreadChecker thread_checker_;
|
|
|
| + // Temporary storage for created sockets.
|
| + std::vector<rtc::AsyncPacketSocket*> sockets_;
|
| + // This tracks how many of the sockets are ready.
|
| + size_t total_ready_sockets_ = 0;
|
| +
|
| + rtc::AsyncInvoker invoker_;
|
| +
|
| + rtc::NetworkManager::NetworkList networks_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(StunProber);
|
| };
|
|
|
|
|