| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "platform/base/interface_info.h" |
| |
| #include <algorithm> |
| |
| namespace openscreen { |
| |
| InterfaceInfo::InterfaceInfo() = default; |
| InterfaceInfo::InterfaceInfo(NetworkInterfaceIndex index, |
| const uint8_t hardware_address[6], |
| std::string name, |
| Type type, |
| std::vector<IPSubnet> addresses) |
| : index(index), |
| hardware_address{hardware_address[0], hardware_address[1], |
| hardware_address[2], hardware_address[3], |
| hardware_address[4], hardware_address[5]}, |
| name(std::move(name)), |
| type(type), |
| addresses(std::move(addresses)) {} |
| InterfaceInfo::~InterfaceInfo() = default; |
| |
| IPSubnet::IPSubnet() = default; |
| IPSubnet::IPSubnet(IPAddress address, uint8_t prefix_length) |
| : address(std::move(address)), prefix_length(prefix_length) {} |
| IPSubnet::~IPSubnet() = default; |
| |
| IPAddress InterfaceInfo::GetIpAddressV4() const { |
| for (const auto& address : addresses) { |
| if (address.address.IsV4()) { |
| return address.address; |
| } |
| } |
| return IPAddress{}; |
| } |
| |
| IPAddress InterfaceInfo::GetIpAddressV6() const { |
| for (const auto& address : addresses) { |
| if (address.address.IsV6()) { |
| return address.address; |
| } |
| } |
| return IPAddress{}; |
| } |
| |
| std::ostream& operator<<(std::ostream& out, const IPSubnet& subnet) { |
| if (subnet.address.IsV6()) { |
| out << '['; |
| } |
| out << subnet.address; |
| if (subnet.address.IsV6()) { |
| out << ']'; |
| } |
| return out << '/' << std::dec << static_cast<int>(subnet.prefix_length); |
| } |
| |
| std::ostream& operator<<(std::ostream& out, InterfaceInfo::Type type) { |
| switch (type) { |
| case InterfaceInfo::Type::kEthernet: |
| out << "Ethernet"; |
| break; |
| case InterfaceInfo::Type::kWifi: |
| out << "Wifi"; |
| break; |
| case InterfaceInfo::Type::kLoopback: |
| out << "Loopback"; |
| break; |
| case InterfaceInfo::Type::kOther: |
| out << "Other"; |
| break; |
| } |
| |
| return out; |
| } |
| |
| std::ostream& operator<<(std::ostream& out, const InterfaceInfo& info) { |
| out << '{' << info.index << " (a.k.a. " << info.name |
| << "); media_type=" << info.type << "; MAC=" << std::hex |
| << static_cast<int>(info.hardware_address[0]); |
| for (size_t i = 1; i < info.hardware_address.size(); ++i) { |
| out << ':' << static_cast<int>(info.hardware_address[i]); |
| } |
| for (const IPSubnet& ip : info.addresses) { |
| out << "; " << ip; |
| } |
| return out << '}'; |
| } |
| |
| } // namespace openscreen |