1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_BASE_NETWORK_INTERFACES_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_BASE_NETWORK_INTERFACES_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <array> 11*6777b538SAndroid Build Coastguard Worker #include <memory> 12*6777b538SAndroid Build Coastguard Worker #include <optional> 13*6777b538SAndroid Build Coastguard Worker #include <string> 14*6777b538SAndroid Build Coastguard Worker #include <vector> 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_address.h" 17*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 18*6777b538SAndroid Build Coastguard Worker #include "net/base/network_change_notifier.h" 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace net { 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker // A subset of IP address attributes which are actionable by the 23*6777b538SAndroid Build Coastguard Worker // application layer. Currently unimplemented for all hosts; 24*6777b538SAndroid Build Coastguard Worker // IP_ADDRESS_ATTRIBUTE_NONE is always returned. 25*6777b538SAndroid Build Coastguard Worker enum IPAddressAttributes { 26*6777b538SAndroid Build Coastguard Worker IP_ADDRESS_ATTRIBUTE_NONE = 0, 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker // A temporary address is dynamic by nature and will not contain MAC 29*6777b538SAndroid Build Coastguard Worker // address. Presence of MAC address in IPv6 addresses can be used to 30*6777b538SAndroid Build Coastguard Worker // track an endpoint and cause privacy concern. Please refer to 31*6777b538SAndroid Build Coastguard Worker // RFC4941. 32*6777b538SAndroid Build Coastguard Worker IP_ADDRESS_ATTRIBUTE_TEMPORARY = 1 << 0, 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker // A temporary address could become deprecated once the preferred 35*6777b538SAndroid Build Coastguard Worker // lifetime is reached. It is still valid but shouldn't be used to 36*6777b538SAndroid Build Coastguard Worker // create new connections. 37*6777b538SAndroid Build Coastguard Worker IP_ADDRESS_ATTRIBUTE_DEPRECATED = 1 << 1, 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker // Anycast address. 40*6777b538SAndroid Build Coastguard Worker IP_ADDRESS_ATTRIBUTE_ANYCAST = 1 << 2, 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker // Tentative address. 43*6777b538SAndroid Build Coastguard Worker IP_ADDRESS_ATTRIBUTE_TENTATIVE = 1 << 3, 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker // DAD detected duplicate. 46*6777b538SAndroid Build Coastguard Worker IP_ADDRESS_ATTRIBUTE_DUPLICATED = 1 << 4, 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // May be detached from the link. 49*6777b538SAndroid Build Coastguard Worker IP_ADDRESS_ATTRIBUTE_DETACHED = 1 << 5, 50*6777b538SAndroid Build Coastguard Worker }; 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker using Eui48MacAddress = std::array<uint8_t, 6>; 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker // struct that is used by GetNetworkList() to represent a network 55*6777b538SAndroid Build Coastguard Worker // interface. 56*6777b538SAndroid Build Coastguard Worker struct NET_EXPORT NetworkInterface { 57*6777b538SAndroid Build Coastguard Worker NetworkInterface(); 58*6777b538SAndroid Build Coastguard Worker NetworkInterface(const std::string& name, 59*6777b538SAndroid Build Coastguard Worker const std::string& friendly_name, 60*6777b538SAndroid Build Coastguard Worker uint32_t interface_index, 61*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifier::ConnectionType type, 62*6777b538SAndroid Build Coastguard Worker const IPAddress& address, 63*6777b538SAndroid Build Coastguard Worker uint32_t prefix_length, 64*6777b538SAndroid Build Coastguard Worker int ip_address_attributes, 65*6777b538SAndroid Build Coastguard Worker std::optional<Eui48MacAddress> mac_address = std::nullopt); 66*6777b538SAndroid Build Coastguard Worker NetworkInterface(const NetworkInterface& other); 67*6777b538SAndroid Build Coastguard Worker ~NetworkInterface(); 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker bool operator==(const NetworkInterface& that) const = default; 70*6777b538SAndroid Build Coastguard Worker bool operator!=(const NetworkInterface& that) const = default; 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker std::string name; 73*6777b538SAndroid Build Coastguard Worker std::string friendly_name; // Same as |name| on non-Windows. 74*6777b538SAndroid Build Coastguard Worker uint32_t interface_index; // Always 0 on Android. 75*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifier::ConnectionType type; 76*6777b538SAndroid Build Coastguard Worker IPAddress address; 77*6777b538SAndroid Build Coastguard Worker uint32_t prefix_length; 78*6777b538SAndroid Build Coastguard Worker int ip_address_attributes; // Combination of |IPAddressAttributes|. 79*6777b538SAndroid Build Coastguard Worker std::optional<Eui48MacAddress> mac_address; 80*6777b538SAndroid Build Coastguard Worker }; 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker typedef std::vector<NetworkInterface> NetworkInterfaceList; 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker // Policy settings to include/exclude network interfaces. 85*6777b538SAndroid Build Coastguard Worker enum HostAddressSelectionPolicy { 86*6777b538SAndroid Build Coastguard Worker INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES = 0x0, 87*6777b538SAndroid Build Coastguard Worker EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES = 0x1, 88*6777b538SAndroid Build Coastguard Worker }; 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker // Returns list of network interfaces except loopback interface. If an 91*6777b538SAndroid Build Coastguard Worker // interface has more than one address, a separate entry is added to 92*6777b538SAndroid Build Coastguard Worker // the list for each address. 93*6777b538SAndroid Build Coastguard Worker // Can be called only on a thread that allows IO. 94*6777b538SAndroid Build Coastguard Worker NET_EXPORT bool GetNetworkList(NetworkInterfaceList* networks, 95*6777b538SAndroid Build Coastguard Worker int policy); 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Worker // Gets the SSID of the currently associated WiFi access point if there is one, 98*6777b538SAndroid Build Coastguard Worker // and it is available. SSID may not be available if the app does not have 99*6777b538SAndroid Build Coastguard Worker // permissions to access it. On Android M+, the app accessing SSID needs to have 100*6777b538SAndroid Build Coastguard Worker // ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION. If there is no WiFi access 101*6777b538SAndroid Build Coastguard Worker // point or its SSID is unavailable, an empty string is returned. 102*6777b538SAndroid Build Coastguard Worker // Currently only implemented on Linux, ChromeOS, Android and Windows. 103*6777b538SAndroid Build Coastguard Worker NET_EXPORT std::string GetWifiSSID(); 104*6777b538SAndroid Build Coastguard Worker 105*6777b538SAndroid Build Coastguard Worker // General category of the IEEE 802.11 (wifi) physical layer operating mode. 106*6777b538SAndroid Build Coastguard Worker enum WifiPHYLayerProtocol { 107*6777b538SAndroid Build Coastguard Worker // No wifi support or no associated AP. 108*6777b538SAndroid Build Coastguard Worker WIFI_PHY_LAYER_PROTOCOL_NONE, 109*6777b538SAndroid Build Coastguard Worker // An obsolete modes introduced by the original 802.11, e.g. IR, FHSS. 110*6777b538SAndroid Build Coastguard Worker WIFI_PHY_LAYER_PROTOCOL_ANCIENT, 111*6777b538SAndroid Build Coastguard Worker // 802.11a, OFDM-based rates. 112*6777b538SAndroid Build Coastguard Worker WIFI_PHY_LAYER_PROTOCOL_A, 113*6777b538SAndroid Build Coastguard Worker // 802.11b, DSSS or HR DSSS. 114*6777b538SAndroid Build Coastguard Worker WIFI_PHY_LAYER_PROTOCOL_B, 115*6777b538SAndroid Build Coastguard Worker // 802.11g, same rates as 802.11a but compatible with 802.11b. 116*6777b538SAndroid Build Coastguard Worker WIFI_PHY_LAYER_PROTOCOL_G, 117*6777b538SAndroid Build Coastguard Worker // 802.11n, HT rates. 118*6777b538SAndroid Build Coastguard Worker WIFI_PHY_LAYER_PROTOCOL_N, 119*6777b538SAndroid Build Coastguard Worker // Unclassified mode or failure to identify. 120*6777b538SAndroid Build Coastguard Worker WIFI_PHY_LAYER_PROTOCOL_UNKNOWN, 121*6777b538SAndroid Build Coastguard Worker // 802.11ac 122*6777b538SAndroid Build Coastguard Worker WIFI_PHY_LAYER_PROTOCOL_AC, 123*6777b538SAndroid Build Coastguard Worker // 802.11ad 124*6777b538SAndroid Build Coastguard Worker WIFI_PHY_LAYER_PROTOCOL_AD, 125*6777b538SAndroid Build Coastguard Worker // 802.11ax 126*6777b538SAndroid Build Coastguard Worker WIFI_PHY_LAYER_PROTOCOL_AX 127*6777b538SAndroid Build Coastguard Worker }; 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker // Characterize the PHY mode of the currently associated access point. 130*6777b538SAndroid Build Coastguard Worker // Currently only available on Windows. 131*6777b538SAndroid Build Coastguard Worker NET_EXPORT WifiPHYLayerProtocol GetWifiPHYLayerProtocol(); 132*6777b538SAndroid Build Coastguard Worker 133*6777b538SAndroid Build Coastguard Worker enum WifiOptions { 134*6777b538SAndroid Build Coastguard Worker // Disables background SSID scans. 135*6777b538SAndroid Build Coastguard Worker WIFI_OPTIONS_DISABLE_SCAN = 1 << 0, 136*6777b538SAndroid Build Coastguard Worker // Enables media streaming mode. 137*6777b538SAndroid Build Coastguard Worker WIFI_OPTIONS_MEDIA_STREAMING_MODE = 1 << 1 138*6777b538SAndroid Build Coastguard Worker }; 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker class NET_EXPORT ScopedWifiOptions { 141*6777b538SAndroid Build Coastguard Worker public: 142*6777b538SAndroid Build Coastguard Worker ScopedWifiOptions() = default; 143*6777b538SAndroid Build Coastguard Worker ScopedWifiOptions(const ScopedWifiOptions&) = delete; 144*6777b538SAndroid Build Coastguard Worker ScopedWifiOptions& operator=(const ScopedWifiOptions&) = delete; 145*6777b538SAndroid Build Coastguard Worker virtual ~ScopedWifiOptions(); 146*6777b538SAndroid Build Coastguard Worker }; 147*6777b538SAndroid Build Coastguard Worker 148*6777b538SAndroid Build Coastguard Worker // Set temporary options on all wifi interfaces. 149*6777b538SAndroid Build Coastguard Worker // |options| is an ORed bitfield of WifiOptions. 150*6777b538SAndroid Build Coastguard Worker // Options are automatically disabled when the scoped pointer 151*6777b538SAndroid Build Coastguard Worker // is freed. Currently only available on Windows. 152*6777b538SAndroid Build Coastguard Worker NET_EXPORT std::unique_ptr<ScopedWifiOptions> SetWifiOptions(int options); 153*6777b538SAndroid Build Coastguard Worker 154*6777b538SAndroid Build Coastguard Worker // Returns the hostname of the current system. Returns empty string on failure. 155*6777b538SAndroid Build Coastguard Worker NET_EXPORT std::string GetHostName(); 156*6777b538SAndroid Build Coastguard Worker 157*6777b538SAndroid Build Coastguard Worker } // namespace net 158*6777b538SAndroid Build Coastguard Worker 159*6777b538SAndroid Build Coastguard Worker #endif // NET_BASE_NETWORK_INTERFACES_H_ 160