Add SocketFactoryInterface::Prepare and fix how symmetric NAT is determined.

Also remove Bind from ServerSocket interface as it's not needed anymore.

BUG=4576
R=pthatcher@webrtc.org

Review URL: https://codereview.webrtc.org/1162263012

Cr-Commit-Position: refs/heads/master@{#9371}
This commit is contained in:
Guo-wei Shieh 2015-06-04 15:20:02 -07:00
parent 26b08605e2
commit d04d3d73eb
3 changed files with 27 additions and 28 deletions

@ -74,28 +74,11 @@ void StunProber::Requester::SendStunRequest() {
auto addr = server_ips_[num_request_sent_]; auto addr = server_ips_[num_request_sent_];
request.server_addr = addr.ipaddr(); request.server_addr = addr.ipaddr();
int rv = 0;
// Only bind to the interface at the first request.
if (num_request_sent_ == 0) {
rtc::IPAddress local_addr;
rv = prober_->GetLocalAddress(&local_addr);
if (rv != 0) {
prober_->End(GENERIC_FAILURE, rv);
return;
}
rv = socket_->Bind(rtc::SocketAddress(local_addr, 0));
if (rv < 0) {
prober_->End(GENERIC_FAILURE, rv);
return;
}
}
// The write must succeed immediately. Otherwise, the calculating of the STUN // The write must succeed immediately. Otherwise, the calculating of the STUN
// request timing could become too complicated. Callback is ignored by passing // request timing could become too complicated. Callback is ignored by passing
// empty AsyncCallback. // empty AsyncCallback.
rv = socket_->SendTo(addr, const_cast<char*>(request_packet->Data()), int rv = socket_->SendTo(addr, const_cast<char*>(request_packet->Data()),
request_packet->Length(), AsyncCallback()); request_packet->Length(), AsyncCallback());
if (rv < 0) { if (rv < 0) {
prober_->End(WRITE_FAILED, rv); prober_->End(WRITE_FAILED, rv);
return; return;
@ -279,7 +262,12 @@ void StunProber::OnServerResolved(int index, int result) {
return; return;
} }
MaybeScheduleStunRequests(); socket_factory_->Prepare(GetTotalClientSockets(), GetTotalServerSockets(),
[this](int result) {
if (result == 0) {
this->MaybeScheduleStunRequests();
}
});
} }
int StunProber::GetLocalAddress(rtc::IPAddress* addr) { int StunProber::GetLocalAddress(rtc::IPAddress* addr) {
@ -440,6 +428,8 @@ bool StunProber::GetStats(StunProber::Stats* prob_stats) {
stats.num_request_sent = num_sent; stats.num_request_sent = num_sent;
stats.num_response_received = num_received; stats.num_response_received = num_received;
stats.target_request_interval_ns = interval_ms_ * 1000; stats.target_request_interval_ns = interval_ms_ * 1000;
stats.symmetric_nat =
stats.srflx_addrs.size() > static_cast<size_t>(GetTotalServerSockets());
if (num_sent) { if (num_sent) {
stats.success_percent = static_cast<int>(100 * num_received / num_sent); stats.success_percent = static_cast<int>(100 * num_received / num_sent);

@ -55,7 +55,6 @@ class SocketInterface {
FAILED = -2, FAILED = -2,
}; };
SocketInterface() {} SocketInterface() {}
virtual int GetLocalAddress(rtc::SocketAddress* local_address) = 0;
virtual void Close() = 0; virtual void Close() = 0;
virtual ~SocketInterface() {} virtual ~SocketInterface() {}
@ -70,6 +69,8 @@ class ClientSocketInterface : public SocketInterface {
// getsockname will only return 0.0.0.0. // getsockname will only return 0.0.0.0.
virtual int Connect(const rtc::SocketAddress& addr) = 0; virtual int Connect(const rtc::SocketAddress& addr) = 0;
virtual int GetLocalAddress(rtc::SocketAddress* local_address) = 0;
private: private:
DISALLOW_COPY_AND_ASSIGN(ClientSocketInterface); DISALLOW_COPY_AND_ASSIGN(ClientSocketInterface);
}; };
@ -77,7 +78,6 @@ class ClientSocketInterface : public SocketInterface {
class ServerSocketInterface : public SocketInterface { class ServerSocketInterface : public SocketInterface {
public: public:
ServerSocketInterface() {} ServerSocketInterface() {}
virtual int Bind(const rtc::SocketAddress& addr) = 0;
virtual int SendTo(const rtc::SocketAddress& addr, virtual int SendTo(const rtc::SocketAddress& addr,
char* buf, char* buf,
@ -99,6 +99,14 @@ class ServerSocketInterface : public SocketInterface {
class SocketFactoryInterface { class SocketFactoryInterface {
public: public:
SocketFactoryInterface() {} 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 ClientSocketInterface* CreateClientSocket() = 0;
virtual ServerSocketInterface* CreateServerSocket( virtual ServerSocketInterface* CreateServerSocket(
size_t send_buffer_size, size_t send_buffer_size,
@ -134,6 +142,7 @@ class StunProber {
int num_request_sent = 0; int num_request_sent = 0;
int num_response_received = 0; int num_response_received = 0;
bool behind_nat = false; bool behind_nat = false;
bool symmetric_nat = false;
int average_rtt_ms = -1; int average_rtt_ms = -1;
int success_percent = 0; int success_percent = 0;
int target_request_interval_ns = 0; int target_request_interval_ns = 0;
@ -148,8 +157,6 @@ class StunProber {
// If the srflx_addrs has more than 1 element, the NAT is symmetric. // If the srflx_addrs has more than 1 element, the NAT is symmetric.
std::set<std::string> srflx_addrs; std::set<std::string> srflx_addrs;
bool symmetric_nat() { return srflx_addrs.size() > 1; }
}; };
// StunProber is not thread safe. It's task_runner's responsibility to ensure // StunProber is not thread safe. It's task_runner's responsibility to ensure
@ -265,6 +272,12 @@ class StunProber {
return num_request_sent_ >= requests_per_ip_ * all_servers_ips_.size(); return num_request_sent_ >= requests_per_ip_ * all_servers_ips_.size();
} }
int GetTotalClientSockets() { return 1; }
int GetTotalServerSockets() {
return (shared_socket_mode_ ? 1 : all_servers_ips_.size()) *
requests_per_ip_;
}
bool SendNextRequest(); bool SendNextRequest();
// Will be invoked in 1ms intervals and schedule the next request from the // Will be invoked in 1ms intervals and schedule the next request from the

@ -35,10 +35,6 @@ class Socket : public ClientSocketInterface,
return MapResult(socket_->Connect(addr)); return MapResult(socket_->Connect(addr));
} }
int Bind(const rtc::SocketAddress& addr) override {
return MapResult(socket_->Bind(addr));
}
int SendTo(const rtc::SocketAddress& addr, int SendTo(const rtc::SocketAddress& addr,
char* buf, char* buf,
size_t buf_len, size_t buf_len,