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:
parent
26b08605e2
commit
d04d3d73eb
webrtc/p2p/stunprober
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user