xref: /aosp_15_r20/external/cronet/net/base/network_interfaces.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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