xref: /aosp_15_r20/external/openscreen/platform/base/interface_info.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #ifndef PLATFORM_BASE_INTERFACE_INFO_H_
6*3f982cf4SFabien Sanglard #define PLATFORM_BASE_INTERFACE_INFO_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <stdint.h>
9*3f982cf4SFabien Sanglard 
10*3f982cf4SFabien Sanglard #include <string>
11*3f982cf4SFabien Sanglard #include <vector>
12*3f982cf4SFabien Sanglard 
13*3f982cf4SFabien Sanglard #include "platform/base/ip_address.h"
14*3f982cf4SFabien Sanglard 
15*3f982cf4SFabien Sanglard namespace openscreen {
16*3f982cf4SFabien Sanglard 
17*3f982cf4SFabien Sanglard // Unique identifier, usually provided by the operating system, for identifying
18*3f982cf4SFabien Sanglard // a specific network interface. This value is used with UdpSocket to join
19*3f982cf4SFabien Sanglard // multicast groups, or to make multicast broadcasts. An implementation may
20*3f982cf4SFabien Sanglard // choose to make these values anything its UdpSocket implementation will
21*3f982cf4SFabien Sanglard // recognize.
22*3f982cf4SFabien Sanglard using NetworkInterfaceIndex = int64_t;
23*3f982cf4SFabien Sanglard enum : NetworkInterfaceIndex { kInvalidNetworkInterfaceIndex = -1 };
24*3f982cf4SFabien Sanglard 
25*3f982cf4SFabien Sanglard struct IPSubnet {
26*3f982cf4SFabien Sanglard   IPAddress address;
27*3f982cf4SFabien Sanglard 
28*3f982cf4SFabien Sanglard   // Prefix length of |address|, which is another way of specifying a subnet
29*3f982cf4SFabien Sanglard   // mask. For example, 192.168.0.10/24 is a common representation of the
30*3f982cf4SFabien Sanglard   // address 192.168.0.10 with a 24-bit prefix (this describes a range of IPv4
31*3f982cf4SFabien Sanglard   // addresses from 192.168.0.0 through 192.168.0.255). Likewise, for IPv6
32*3f982cf4SFabien Sanglard   // addresses such as 2001:db8::/96, the concept is the same (this specifies
33*3f982cf4SFabien Sanglard   // the range of addresses having the same leading 96 bits).
34*3f982cf4SFabien Sanglard   uint8_t prefix_length = 0;
35*3f982cf4SFabien Sanglard 
36*3f982cf4SFabien Sanglard   IPSubnet();
37*3f982cf4SFabien Sanglard   IPSubnet(IPAddress address, uint8_t prefix);
38*3f982cf4SFabien Sanglard   ~IPSubnet();
39*3f982cf4SFabien Sanglard };
40*3f982cf4SFabien Sanglard 
41*3f982cf4SFabien Sanglard struct InterfaceInfo {
42*3f982cf4SFabien Sanglard   enum class Type : uint32_t { kEthernet = 0, kWifi, kLoopback, kOther };
43*3f982cf4SFabien Sanglard 
44*3f982cf4SFabien Sanglard   // Interface index, typically as specified by the operating system,
45*3f982cf4SFabien Sanglard   // identifying this interface on the host machine.
46*3f982cf4SFabien Sanglard   NetworkInterfaceIndex index = kInvalidNetworkInterfaceIndex;
47*3f982cf4SFabien Sanglard 
48*3f982cf4SFabien Sanglard   // MAC address of the interface.  All 0s if unavailable.
49*3f982cf4SFabien Sanglard   std::array<uint8_t, 6> hardware_address = {};
50*3f982cf4SFabien Sanglard 
51*3f982cf4SFabien Sanglard   // Interface name (e.g. eth0) if available.
52*3f982cf4SFabien Sanglard   std::string name;
53*3f982cf4SFabien Sanglard 
54*3f982cf4SFabien Sanglard   // Hardware type of the interface.
55*3f982cf4SFabien Sanglard   Type type = Type::kOther;
56*3f982cf4SFabien Sanglard 
57*3f982cf4SFabien Sanglard   // All IP addresses associated with the interface.
58*3f982cf4SFabien Sanglard   std::vector<IPSubnet> addresses;
59*3f982cf4SFabien Sanglard 
60*3f982cf4SFabien Sanglard   // Returns an IPAddress of the given type associated with this network
61*3f982cf4SFabien Sanglard   // interface, or the false IPAddress if the associated address family is not
62*3f982cf4SFabien Sanglard   // supported on this interface.
63*3f982cf4SFabien Sanglard   IPAddress GetIpAddressV4() const;
64*3f982cf4SFabien Sanglard   IPAddress GetIpAddressV6() const;
65*3f982cf4SFabien Sanglard 
66*3f982cf4SFabien Sanglard   // Returns true if |hardware_address| is non-zero.
67*3f982cf4SFabien Sanglard   bool HasHardwareAddress() const;
68*3f982cf4SFabien Sanglard 
69*3f982cf4SFabien Sanglard   InterfaceInfo();
70*3f982cf4SFabien Sanglard   InterfaceInfo(NetworkInterfaceIndex index,
71*3f982cf4SFabien Sanglard                 const uint8_t hardware_address[6],
72*3f982cf4SFabien Sanglard                 std::string name,
73*3f982cf4SFabien Sanglard                 Type type,
74*3f982cf4SFabien Sanglard                 std::vector<IPSubnet> addresses);
75*3f982cf4SFabien Sanglard   ~InterfaceInfo();
76*3f982cf4SFabien Sanglard };
77*3f982cf4SFabien Sanglard 
78*3f982cf4SFabien Sanglard // Human-readable output (e.g., for logging).
79*3f982cf4SFabien Sanglard std::ostream& operator<<(std::ostream& out, InterfaceInfo::Type type);
80*3f982cf4SFabien Sanglard std::ostream& operator<<(std::ostream& out, const IPSubnet& subnet);
81*3f982cf4SFabien Sanglard std::ostream& operator<<(std::ostream& out, const InterfaceInfo& info);
82*3f982cf4SFabien Sanglard 
83*3f982cf4SFabien Sanglard }  // namespace openscreen
84*3f982cf4SFabien Sanglard 
85*3f982cf4SFabien Sanglard #endif  // PLATFORM_BASE_INTERFACE_INFO_H_
86