Index: webrtc/base/network.h |
diff --git a/webrtc/base/network.h b/webrtc/base/network.h |
index ab3a88dc7dc0c4dd511d5da7aee4b7c035975657..ccd205e83d807cd87619732ef3dcc2527ec268ca 100644 |
--- a/webrtc/base/network.h |
+++ b/webrtc/base/network.h |
@@ -28,6 +28,9 @@ struct ifaddrs; |
namespace rtc { |
+extern const char kPublicIPv4Host[]; |
+extern const char kPublicIPv6Host[]; |
+ |
class Network; |
class NetworkMonitorInterface; |
class Thread; |
@@ -51,9 +54,17 @@ const int kDefaultNetworkIgnoreMask = ADAPTER_TYPE_LOOPBACK; |
std::string MakeNetworkKey(const std::string& name, const IPAddress& prefix, |
int prefix_length); |
+class DefaultLocalAddressProvider { |
+ public: |
+ virtual ~DefaultLocalAddressProvider() = default; |
+ // The default local address is the local address used in multi-homed endpoint |
+ // when the any address (0.0.0.0 or ::) is used as the local address. |
+ virtual bool GetDefaultLocalAddress(int family, IPAddress* ipaddr) const = 0; |
+}; |
+ |
// Generic network manager interface. It provides list of local |
// networks. |
-class NetworkManager { |
+class NetworkManager : public DefaultLocalAddressProvider { |
public: |
typedef std::vector<Network*> NetworkList; |
@@ -67,7 +78,7 @@ class NetworkManager { |
}; |
NetworkManager(); |
- virtual ~NetworkManager(); |
+ ~NetworkManager() override; |
// Called when network list is updated. |
sigslot::signal0<> SignalNetworksChanged; |
@@ -99,6 +110,8 @@ class NetworkManager { |
// TODO(guoweis): remove this body when chromium implements this. |
virtual void GetAnyAddressNetworks(NetworkList* networks) {} |
+ bool GetDefaultLocalAddress(int family, IPAddress* ipaddr) const override; |
+ |
// Dumps a list of networks available to LS_INFO. |
virtual void DumpNetworks(bool include_ignored) {} |
@@ -128,6 +141,8 @@ class NetworkManagerBase : public NetworkManager { |
EnumerationPermission enumeration_permission() const override; |
+ bool GetDefaultLocalAddress(int family, IPAddress* ipaddr) const override; |
+ |
protected: |
typedef std::map<std::string, Network*> NetworkMap; |
// Updates |networks_| with the networks listed in |list|. If |
@@ -146,6 +161,9 @@ class NetworkManagerBase : public NetworkManager { |
enumeration_permission_ = state; |
} |
+ void set_default_local_addresses(const IPAddress& ipv4, |
+ const IPAddress& ipv6); |
+ |
private: |
friend class NetworkTest; |
@@ -159,6 +177,9 @@ class NetworkManagerBase : public NetworkManager { |
rtc::scoped_ptr<rtc::Network> ipv4_any_address_network_; |
rtc::scoped_ptr<rtc::Network> ipv6_any_address_network_; |
+ |
+ IPAddress default_local_ipv4_address_; |
+ IPAddress default_local_ipv6_address_; |
}; |
// Basic implementation of the NetworkManager interface that gets list |
@@ -220,6 +241,11 @@ class BasicNetworkManager : public NetworkManagerBase, |
// based on the network's property instead of any individual IP. |
bool IsIgnoredNetwork(const Network& network) const; |
+ // This function connects a UDP socket to a public address and returns the |
+ // local address associated it. Since it binds to the "any" address |
+ // internally, it returns the default local address on a multi-homed endpoint. |
+ IPAddress QueryDefaultLocalAddress(int family) const; |
+ |
private: |
friend class NetworkTest; |
@@ -247,13 +273,26 @@ class BasicNetworkManager : public NetworkManagerBase, |
// Represents a Unix-type network interface, with a name and single address. |
class Network { |
public: |
- Network(const std::string& name, const std::string& description, |
- const IPAddress& prefix, int prefix_length); |
- |
- Network(const std::string& name, const std::string& description, |
- const IPAddress& prefix, int prefix_length, AdapterType type); |
+ Network(const std::string& name, |
+ const std::string& description, |
+ const IPAddress& prefix, |
+ int prefix_length); |
+ |
+ Network(const std::string& name, |
+ const std::string& description, |
+ const IPAddress& prefix, |
+ int prefix_length, |
+ AdapterType type); |
~Network(); |
+ const DefaultLocalAddressProvider* default_local_address_provider() { |
+ return default_local_address_provider_; |
+ } |
+ void set_default_local_address_provider( |
+ const DefaultLocalAddressProvider* provider) { |
+ default_local_address_provider_ = provider; |
+ } |
+ |
// Returns the name of the interface this network is associated wtih. |
const std::string& name() const { return name_; } |
@@ -323,6 +362,7 @@ class Network { |
std::string ToString() const; |
private: |
+ const DefaultLocalAddressProvider* default_local_address_provider_ = nullptr; |
std::string name_; |
std::string description_; |
IPAddress prefix_; |