147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_NETWORK_H_ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_NETWORK_H_ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <deque> 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <map> 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <string> 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <vector> 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/basictypes.h" 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/ipaddress.h" 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/messagehandler.h" 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/sigslot.h" 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX) 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstruct ifaddrs; 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // defined(WEBRTC_POSIX) 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Network; 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Thread; 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgenum AdapterType { 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // This enum resembles the one in Chromium net::ConnectionType. 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ADAPTER_TYPE_UNKNOWN = 0, 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ADAPTER_TYPE_ETHERNET = 1, 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ADAPTER_TYPE_WIFI = 2, 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ADAPTER_TYPE_CELLULAR = 3, 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ADAPTER_TYPE_VPN = 4 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Makes a string key for this network. Used in the network manager's maps. 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Network objects are keyed on interface name, network prefix and the 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// length of that prefix. 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstd::string MakeNetworkKey(const std::string& name, const IPAddress& prefix, 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int prefix_length); 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Generic network manager interface. It provides list of local 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// networks. 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass NetworkManager { 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org typedef std::vector<Network*> NetworkList; 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org NetworkManager(); 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~NetworkManager(); 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Called when network list is updated. 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org sigslot::signal0<> SignalNetworksChanged; 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Indicates a failure when getting list of network interfaces. 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org sigslot::signal0<> SignalError; 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Start/Stop monitoring of network interfaces 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // list. SignalNetworksChanged or SignalError is emitted immidiately 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // after StartUpdating() is called. After that SignalNetworksChanged 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // is emitted wheneven list of networks changes. 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void StartUpdating() = 0; 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void StopUpdating() = 0; 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the current list of networks available on this machine. 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // UpdateNetworks() must be called before this method is called. 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // It makes sure that repeated calls return the same object for a 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // given network, so that quality is tracked appropriately. Does not 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // include ignored networks. 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void GetNetworks(NetworkList* networks) const = 0; 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Dumps a list of networks available to LS_INFO. 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void DumpNetworks(bool include_ignored) {} 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Base class for NetworkManager implementations. 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass NetworkManagerBase : public NetworkManager { 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org NetworkManagerBase(); 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~NetworkManagerBase(); 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void GetNetworks(std::vector<Network*>* networks) const; 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool ipv6_enabled() const { return ipv6_enabled_; } 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void set_ipv6_enabled(bool enabled) { ipv6_enabled_ = enabled; } 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org typedef std::map<std::string, Network*> NetworkMap; 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Updates |networks_| with the networks listed in |list|. If 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // |network_map_| already has a Network object for a network listed 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // in the |list| then it is reused. Accept ownership of the Network 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // objects in the |list|. |changed| will be set to true if there is 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // any change in the network list. 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void MergeNetworkList(const NetworkList& list, bool* changed); 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org friend class NetworkTest; 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void DoUpdateNetworks(); 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org NetworkList networks_; 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org NetworkMap networks_map_; 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool ipv6_enabled_; 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Basic implementation of the NetworkManager interface that gets list 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// of networks using OS APIs. 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass BasicNetworkManager : public NetworkManagerBase, 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public MessageHandler { 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org BasicNetworkManager(); 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~BasicNetworkManager(); 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void StartUpdating(); 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void StopUpdating(); 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Logs the available networks. 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void DumpNetworks(bool include_ignored); 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // MessageHandler interface. 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnMessage(Message* msg); 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool started() { return start_count_ > 0; } 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Sets the network ignore list, which is empty by default. Any network on 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // the ignore list will be filtered from network enumeration results. 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void set_network_ignore_list(const std::vector<std::string>& list) { 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org network_ignore_list_ = list; 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_LINUX) 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Sets the flag for ignoring non-default routes. 13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void set_ignore_non_default_routes(bool value) { 13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ignore_non_default_routes_ = true; 13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX) 14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Separated from CreateNetworks for tests. 14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void ConvertIfAddrs(ifaddrs* interfaces, 14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool include_ignored, 14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org NetworkList* networks) const; 14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // defined(WEBRTC_POSIX) 14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Creates a network object for each network available on the machine. 14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool CreateNetworks(bool include_ignored, NetworkList* networks) const; 14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Determines if a network should be ignored. 15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool IsIgnoredNetwork(const Network& network) const; 15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org friend class NetworkTest; 15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void DoUpdateNetworks(); 15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Thread* thread_; 15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool sent_first_update_; 16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int start_count_; 16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::vector<std::string> network_ignore_list_; 16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool ignore_non_default_routes_; 16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Represents a Unix-type network interface, with a name and single address. 16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Network { 16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Network(const std::string& name, const std::string& description, 16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const IPAddress& prefix, int prefix_length); 17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Network(const std::string& name, const std::string& description, 17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const IPAddress& prefix, int prefix_length, AdapterType type); 17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the name of the interface this network is associated wtih. 17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const std::string& name() const { return name_; } 17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the OS-assigned name for this network. This is useful for 17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // debugging but should not be sent over the wire (for privacy reasons). 17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const std::string& description() const { return description_; } 18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the prefix for this network. 18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const IPAddress& prefix() const { return prefix_; } 18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the length, in bits, of this network's prefix. 18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int prefix_length() const { return prefix_length_; } 18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // |key_| has unique value per network interface. Used in sorting network 18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // interfaces. Key is derived from interface name and it's prefix. 18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string key() const { return key_; } 18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the Network's current idea of the 'best' IP it has. 1912738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // Or return an unset IP if this network has no active addresses. 1922738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // Here is the rule on how we mark the IPv6 address as ignorable for WebRTC. 193b1e61452eb85d3e61b80c556f3548f03f1a04674guoweis@webrtc.org // 1) return all global temporary dynamic and non-deprecrated ones. 1942738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // 2) if #1 not available, return global ones. 1952738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // 3) if #2 not available, use ULA ipv6 as last resort. (ULA stands 1962738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // for unique local address, which is not route-able in open 1972738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // internet but might be useful for a close WebRTC deployment. 1982738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org 1992738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // TODO(guoweis): rule #3 actually won't happen at current 2002738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // implementation. The reason being that ULA address starting with 2012738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // 0xfc 0r 0xfd will be grouped into its own Network. The result of 2022738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // that is WebRTC will have one extra Network to generate candidates 2032738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // but the lack of rule #3 shouldn't prevent turning on IPv6 since 2042738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // ULA should only be tried in a close deployment anyway. 2052738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org 206b1e61452eb85d3e61b80c556f3548f03f1a04674guoweis@webrtc.org // Note that when not specifying any flag, it's treated as case global 2072738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // IPv6 address 2082738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org IPAddress GetBestIP() const; 2092738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org 2102738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // Keep the original function here for now. 2112738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org // TODO(guoweis): Remove this when all callers are migrated to GetBestIP(). 2122738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org IPAddress ip() const { return GetBestIP(); } 213b1e61452eb85d3e61b80c556f3548f03f1a04674guoweis@webrtc.org 21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Adds an active IP address to this network. Does not check for duplicates. 215b1e61452eb85d3e61b80c556f3548f03f1a04674guoweis@webrtc.org void AddIP(const InterfaceAddress& ip) { ips_.push_back(ip); } 21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Sets the network's IP address list. Returns true if new IP addresses were 21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // detected. Passing true to already_changed skips this check. 219b1e61452eb85d3e61b80c556f3548f03f1a04674guoweis@webrtc.org bool SetIPs(const std::vector<InterfaceAddress>& ips, bool already_changed); 22047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Get the list of IP Addresses associated with this network. 221b1e61452eb85d3e61b80c556f3548f03f1a04674guoweis@webrtc.org const std::vector<InterfaceAddress>& GetIPs() const { return ips_;} 22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Clear the network's list of addresses. 22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void ClearIPs() { ips_.clear(); } 22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the scope-id of the network's address. 22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Should only be relevant for link-local IPv6 addresses. 22747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int scope_id() const { return scope_id_; } 22847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void set_scope_id(int id) { scope_id_ = id; } 22947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 23047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Indicates whether this network should be ignored, perhaps because 23147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // the IP is 0, or the interface is one we know is invalid. 23247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool ignored() const { return ignored_; } 23347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void set_ignored(bool ignored) { ignored_ = ignored; } 23447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 23547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AdapterType type() const { return type_; } 23647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int preference() const { return preference_; } 23747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void set_preference(int preference) { preference_ = preference; } 23847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 23947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Debugging description of this network 24047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string ToString() const; 24147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 24247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 24347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string name_; 24447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string description_; 24547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org IPAddress prefix_; 24647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int prefix_length_; 24747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string key_; 248b1e61452eb85d3e61b80c556f3548f03f1a04674guoweis@webrtc.org std::vector<InterfaceAddress> ips_; 24947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int scope_id_; 25047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool ignored_; 25147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AdapterType type_; 25247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int preference_; 25347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 25447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org friend class NetworkManager; 25547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 25647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 25747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 25847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 25947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_NETWORK_H_ 260