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