| Index: webrtc/p2p/base/stunport.cc
|
| diff --git a/webrtc/p2p/base/stunport.cc b/webrtc/p2p/base/stunport.cc
|
| index 86eaf65a21e785c93ebfbaf475276198534cea8a..ab8b2bff182999209b24887521d56cadea1df3e1 100644
|
| --- a/webrtc/p2p/base/stunport.cc
|
| +++ b/webrtc/p2p/base/stunport.cc
|
| @@ -13,6 +13,7 @@
|
| #include "webrtc/p2p/base/common.h"
|
| #include "webrtc/p2p/base/portallocator.h"
|
| #include "webrtc/p2p/base/stun.h"
|
| +#include "webrtc/base/checks.h"
|
| #include "webrtc/base/common.h"
|
| #include "webrtc/base/helpers.h"
|
| #include "webrtc/base/ipaddress.h"
|
| @@ -169,15 +170,19 @@ UDPPort::UDPPort(rtc::Thread* thread,
|
| const std::string& username,
|
| const std::string& password,
|
| const std::string& origin,
|
| - bool emit_localhost_for_anyaddress)
|
| - : Port(thread, factory, network, socket->GetLocalAddress().ipaddr(),
|
| - username, password),
|
| + bool emit_local_for_anyaddress)
|
| + : Port(thread,
|
| + factory,
|
| + network,
|
| + socket->GetLocalAddress().ipaddr(),
|
| + username,
|
| + password),
|
| requests_(thread),
|
| socket_(socket),
|
| error_(0),
|
| ready_(false),
|
| stun_keepalive_delay_(KEEPALIVE_DELAY),
|
| - emit_localhost_for_anyaddress_(emit_localhost_for_anyaddress) {
|
| + emit_local_for_anyaddress_(emit_local_for_anyaddress) {
|
| requests_.set_origin(origin);
|
| }
|
|
|
| @@ -190,7 +195,7 @@ UDPPort::UDPPort(rtc::Thread* thread,
|
| const std::string& username,
|
| const std::string& password,
|
| const std::string& origin,
|
| - bool emit_localhost_for_anyaddress)
|
| + bool emit_local_for_anyaddress)
|
| : Port(thread,
|
| LOCAL_PORT_TYPE,
|
| factory,
|
| @@ -205,7 +210,7 @@ UDPPort::UDPPort(rtc::Thread* thread,
|
| error_(0),
|
| ready_(false),
|
| stun_keepalive_delay_(KEEPALIVE_DELAY),
|
| - emit_localhost_for_anyaddress_(emit_localhost_for_anyaddress) {
|
| + emit_local_for_anyaddress_(emit_local_for_anyaddress) {
|
| requests_.set_origin(origin);
|
| }
|
|
|
| @@ -297,13 +302,11 @@ int UDPPort::GetError() {
|
| void UDPPort::OnLocalAddressReady(rtc::AsyncPacketSocket* socket,
|
| const rtc::SocketAddress& address) {
|
| // When adapter enumeration is disabled and binding to the any address, the
|
| - // loopback address will be issued as a candidate instead if
|
| - // |emit_localhost_for_anyaddress| is true. This is to allow connectivity on
|
| - // demo pages without STUN/TURN to work.
|
| + // default local address will be issued as a candidate instead if
|
| + // |emit_local_for_anyaddress| is true. This is to allow connectivity for
|
| + // applications which absolutely requires a HOST candidate.
|
| rtc::SocketAddress addr = address;
|
| - if (addr.IsAnyIP() && emit_localhost_for_anyaddress_) {
|
| - addr.SetIP(rtc::GetLoopbackIP(addr.family()));
|
| - }
|
| + MaybeSetDefaultLocalAddress(&addr);
|
|
|
| AddAddress(addr, addr, rtc::SocketAddress(), UDP_PROTOCOL_NAME, "", "",
|
| LOCAL_PORT_TYPE, ICE_TYPE_PREFERENCE_HOST, 0, false);
|
| @@ -401,6 +404,19 @@ void UDPPort::SendStunBindingRequest(const rtc::SocketAddress& stun_addr) {
|
| }
|
| }
|
|
|
| +void UDPPort::MaybeSetDefaultLocalAddress(rtc::SocketAddress* addr) const {
|
| + if (!addr->IsAnyIP() || !emit_local_for_anyaddress_ ||
|
| + !Network()->default_local_address_provider()) {
|
| + return;
|
| + }
|
| + rtc::IPAddress default_address;
|
| + bool result =
|
| + Network()->default_local_address_provider()->GetDefaultLocalAddress(
|
| + addr->family(), &default_address);
|
| + RTC_DCHECK(result && !default_address.IsNil());
|
| + addr->SetIP(default_address);
|
| +}
|
| +
|
| void UDPPort::OnStunBindingRequestSucceeded(
|
| const rtc::SocketAddress& stun_server_addr,
|
| const rtc::SocketAddress& stun_reflected_addr) {
|
| @@ -418,6 +434,7 @@ void UDPPort::OnStunBindingRequestSucceeded(
|
| !HasCandidateWithAddress(stun_reflected_addr)) {
|
|
|
| rtc::SocketAddress related_address = socket_->GetLocalAddress();
|
| + MaybeSetDefaultLocalAddress(&related_address);
|
| if (!(candidate_filter() & CF_HOST)) {
|
| // If candidate filter doesn't have CF_HOST specified, empty raddr to
|
| // avoid local address leakage.
|
|
|