| Index: webrtc/p2p/base/turnport.cc
|
| diff --git a/webrtc/p2p/base/turnport.cc b/webrtc/p2p/base/turnport.cc
|
| index 94f54dc0a2525092183e7831ab31f271a2e9dfeb..2828feac3f8d9f243be9f7eb3e763a8366592a7a 100644
|
| --- a/webrtc/p2p/base/turnport.cc
|
| +++ b/webrtc/p2p/base/turnport.cc
|
| @@ -10,6 +10,7 @@
|
|
|
| #include "webrtc/p2p/base/turnport.h"
|
|
|
| +#include <algorithm>
|
| #include <functional>
|
|
|
| #include "webrtc/p2p/base/common.h"
|
| @@ -194,7 +195,6 @@ TurnPort::TurnPort(rtc::Thread* thread,
|
| RELAY_PORT_TYPE,
|
| factory,
|
| network,
|
| - socket->GetLocalAddress().ipaddr(),
|
| username,
|
| password),
|
| server_address_(server_address),
|
| @@ -214,7 +214,6 @@ TurnPort::TurnPort(rtc::Thread* thread,
|
| TurnPort::TurnPort(rtc::Thread* thread,
|
| rtc::PacketSocketFactory* factory,
|
| rtc::Network* network,
|
| - const rtc::IPAddress& ip,
|
| uint16_t min_port,
|
| uint16_t max_port,
|
| const std::string& username,
|
| @@ -227,7 +226,6 @@ TurnPort::TurnPort(rtc::Thread* thread,
|
| RELAY_PORT_TYPE,
|
| factory,
|
| network,
|
| - ip,
|
| min_port,
|
| max_port,
|
| username,
|
| @@ -293,7 +291,7 @@ void TurnPort::PrepareAddress() {
|
| if (!IsCompatibleAddress(server_address_.address)) {
|
| LOG(LS_ERROR) << "IP address family does not match: "
|
| << "server: " << server_address_.address.family()
|
| - << " local: " << ip().family();
|
| + << " local: " << Network()->GetBestIP().family();
|
| OnAllocateError();
|
| return;
|
| }
|
| @@ -322,7 +320,7 @@ bool TurnPort::CreateTurnClientSocket() {
|
|
|
| if (server_address_.proto == PROTO_UDP && !SharedSocket()) {
|
| socket_ = socket_factory()->CreateUdpSocket(
|
| - rtc::SocketAddress(ip(), 0), min_port(), max_port());
|
| + rtc::SocketAddress(Network()->GetBestIP(), 0), min_port(), max_port());
|
| } else if (server_address_.proto == PROTO_TCP ||
|
| server_address_.proto == PROTO_TLS) {
|
| RTC_DCHECK(!SharedSocket());
|
| @@ -339,7 +337,7 @@ bool TurnPort::CreateTurnClientSocket() {
|
| }
|
|
|
| socket_ = socket_factory()->CreateClientTcpSocket(
|
| - rtc::SocketAddress(ip(), 0), server_address_.address,
|
| + rtc::SocketAddress(Network()->GetBestIP(), 0), server_address_.address,
|
| proxy(), user_agent(), opts);
|
| }
|
|
|
| @@ -381,33 +379,43 @@ void TurnPort::OnSocketConnect(rtc::AsyncPacketSocket* socket) {
|
| RTC_DCHECK(server_address_.proto == PROTO_TCP ||
|
| server_address_.proto == PROTO_TLS);
|
|
|
| - // Do not use this port if the socket bound to a different address than
|
| - // the one we asked for. This is seen in Chrome, where TCP sockets cannot be
|
| - // given a binding address, and the platform is expected to pick the
|
| - // correct local address.
|
| -
|
| + // Do not use this port if the socket bound to an address not associated with
|
| + // the desired network interface. This is seen in Chrome, where TCP sockets
|
| + // cannot be given a binding address, and the platform is expected to pick
|
| + // the correct local address.
|
| + //
|
| // However, there are two situations in which we allow the bound address to
|
| - // differ from the requested address: 1. The bound address is the loopback
|
| - // address. This happens when a proxy forces TCP to bind to only the
|
| - // localhost address (see issue 3927). 2. The bound address is the "any
|
| - // address". This happens when multiple_routes is disabled (see issue 4780).
|
| - if (socket->GetLocalAddress().ipaddr() != ip()) {
|
| + // not be one of the addresses of the requested interface:
|
| + // 1. The bound address is the loopback address. This happens when a proxy
|
| + // forces TCP to bind to only the localhost address (see issue 3927).
|
| + // 2. The bound address is the "any address". This happens when
|
| + // multiple_routes is disabled (see issue 4780).
|
| + //
|
| + // Note that, aside from minor differences in log statements, this logic is
|
| + // identical to that in TcpPort.
|
| + const rtc::SocketAddress& socket_address = socket->GetLocalAddress();
|
| + const std::vector<rtc::InterfaceAddress>& desired_addresses =
|
| + Network()->GetIPs();
|
| + if (std::find(desired_addresses.begin(), desired_addresses.end(),
|
| + socket_address.ipaddr()) == desired_addresses.end()) {
|
| if (socket->GetLocalAddress().IsLoopbackIP()) {
|
| - LOG(LS_WARNING) << "Socket is bound to a different address:"
|
| - << socket->GetLocalAddress().ipaddr().ToString()
|
| - << ", rather then the local port:" << ip().ToString()
|
| + LOG(LS_WARNING) << "Socket is bound to the address:"
|
| + << socket_address.ipaddr().ToString()
|
| + << ", rather then an address associated with network:"
|
| + << Network()->ToString()
|
| << ". Still allowing it since it's localhost.";
|
| - } else if (IPIsAny(ip())) {
|
| - LOG(LS_WARNING) << "Socket is bound to a different address:"
|
| - << socket->GetLocalAddress().ipaddr().ToString()
|
| - << ", rather then the local port:" << ip().ToString()
|
| - << ". Still allowing it since it's any address"
|
| + } else if (IPIsAny(Network()->GetBestIP())) {
|
| + LOG(LS_WARNING) << "Socket is bound to the address:"
|
| + << socket_address.ipaddr().ToString()
|
| + << ", rather then an address associated with network:"
|
| + << Network()->ToString()
|
| + << ". Still allowing it since it's the 'any' address"
|
| << ", possibly caused by multiple_routes being disabled.";
|
| } else {
|
| - LOG(LS_WARNING) << "Socket is bound to a different address:"
|
| - << socket->GetLocalAddress().ipaddr().ToString()
|
| - << ", rather then the local port:" << ip().ToString()
|
| - << ". Discarding TURN port.";
|
| + LOG(LS_WARNING) << "Socket is bound to the address:"
|
| + << socket_address.ipaddr().ToString()
|
| + << ", rather then an address associated with network:"
|
| + << Network()->ToString() << ". Discarding TURN port.";
|
| OnAllocateError();
|
| return;
|
| }
|
| @@ -701,7 +709,8 @@ void TurnPort::OnResolveResult(rtc::AsyncResolverInterface* resolver) {
|
| // sockets we need hostname along with resolved address.
|
| rtc::SocketAddress resolved_address = server_address_.address;
|
| if (resolver_->GetError() != 0 ||
|
| - !resolver_->GetResolvedAddress(ip().family(), &resolved_address)) {
|
| + !resolver_->GetResolvedAddress(Network()->GetBestIP().family(),
|
| + &resolved_address)) {
|
| LOG_J(LS_WARNING, this) << "TURN host lookup received error "
|
| << resolver_->GetError();
|
| error_ = resolver_->GetError();
|
|
|