11bbe3d1eSWilliam A. Kennington III #pragma once 2*f5151aa5SWilliam A. Kennington III #include <function2/function2.hpp> 3b7d6a1a7SWilliam A. Kennington III #include <stdplus/net/addr/ether.hpp> 49b2a20d3SWilliam A. Kennington III #include <stdplus/net/addr/ip.hpp> 59b2a20d3SWilliam A. Kennington III #include <stdplus/net/addr/subnet.hpp> 6b7d6a1a7SWilliam A. Kennington III 7bb0eaccbSWilliam A. Kennington III #include <array> 8de70ccf6SWilliam A. Kennington III #include <optional> 91bbe3d1eSWilliam A. Kennington III #include <string> 10dd9ef815SWilliam A. Kennington III #include <unordered_map> 111bbe3d1eSWilliam A. Kennington III 129b2a20d3SWilliam A. Kennington III namespace phosphor::network 13454a0deeSWilliam A. Kennington III { 141bbe3d1eSWilliam A. Kennington III 15*f5151aa5SWilliam A. Kennington III class DelayedExecutor 16*f5151aa5SWilliam A. Kennington III { 17*f5151aa5SWilliam A. Kennington III public: 18*f5151aa5SWilliam A. Kennington III virtual ~DelayedExecutor() = default; 19*f5151aa5SWilliam A. Kennington III 20*f5151aa5SWilliam A. Kennington III virtual void schedule() = 0; 21*f5151aa5SWilliam A. Kennington III virtual void setCallback(fu2::unique_function<void()>&& cb) = 0; 22*f5151aa5SWilliam A. Kennington III }; 23*f5151aa5SWilliam A. Kennington III 24454a0deeSWilliam A. Kennington III /** @class InterfaceInfo 25454a0deeSWilliam A. Kennington III * @brief Information about interfaces from the kernel 26454a0deeSWilliam A. Kennington III */ 27454a0deeSWilliam A. Kennington III struct InterfaceInfo 28454a0deeSWilliam A. Kennington III { 299c441fd4SWilliam A. Kennington III unsigned short type; 30454a0deeSWilliam A. Kennington III unsigned idx; 31454a0deeSWilliam A. Kennington III unsigned flags; 32454a0deeSWilliam A. Kennington III std::optional<std::string> name = std::nullopt; 33b7d6a1a7SWilliam A. Kennington III std::optional<stdplus::EtherAddr> mac = std::nullopt; 34454a0deeSWilliam A. Kennington III std::optional<unsigned> mtu = std::nullopt; 35454a0deeSWilliam A. Kennington III std::optional<unsigned> parent_idx = std::nullopt; 36454a0deeSWilliam A. Kennington III std::optional<std::string> kind = std::nullopt; 37454a0deeSWilliam A. Kennington III std::optional<uint16_t> vlan_id = std::nullopt; 38454a0deeSWilliam A. Kennington III operator ==phosphor::network::InterfaceInfo39454a0deeSWilliam A. Kennington III constexpr bool operator==(const InterfaceInfo& rhs) const noexcept 40454a0deeSWilliam A. Kennington III { 41454a0deeSWilliam A. Kennington III return idx == rhs.idx && flags == rhs.flags && name == rhs.name && 42454a0deeSWilliam A. Kennington III mac == rhs.mac && mtu == rhs.mtu && 43454a0deeSWilliam A. Kennington III parent_idx == rhs.parent_idx && kind == rhs.kind && 44454a0deeSWilliam A. Kennington III vlan_id == rhs.vlan_id; 45454a0deeSWilliam A. Kennington III } 46454a0deeSWilliam A. Kennington III }; 47454a0deeSWilliam A. Kennington III 486a92363eSWilliam A. Kennington III /** @class AddressInfo 496a92363eSWilliam A. Kennington III * @brief Information about a addresses from the kernel 506a92363eSWilliam A. Kennington III */ 516a92363eSWilliam A. Kennington III struct AddressInfo 526a92363eSWilliam A. Kennington III { 536a92363eSWilliam A. Kennington III unsigned ifidx; 549b2a20d3SWilliam A. Kennington III stdplus::SubnetAny ifaddr; 556a92363eSWilliam A. Kennington III uint8_t scope; 566a92363eSWilliam A. Kennington III uint32_t flags; 57454a0deeSWilliam A. Kennington III operator ==phosphor::network::AddressInfo58454a0deeSWilliam A. Kennington III constexpr bool operator==(const AddressInfo& rhs) const noexcept 59454a0deeSWilliam A. Kennington III { 60454a0deeSWilliam A. Kennington III return ifidx == rhs.ifidx && ifaddr == rhs.ifaddr && 61454a0deeSWilliam A. Kennington III scope == rhs.scope && flags == rhs.flags; 62454a0deeSWilliam A. Kennington III } 636a92363eSWilliam A. Kennington III }; 646a92363eSWilliam A. Kennington III 65a8426902SWilliam A. Kennington III /** @class NeighborInfo 66a8426902SWilliam A. Kennington III * @brief Information about a neighbor from the kernel 67a8426902SWilliam A. Kennington III */ 68a8426902SWilliam A. Kennington III struct NeighborInfo 69a8426902SWilliam A. Kennington III { 70a8426902SWilliam A. Kennington III unsigned ifidx; 71454a0deeSWilliam A. Kennington III uint16_t state; 729b2a20d3SWilliam A. Kennington III std::optional<stdplus::InAnyAddr> addr; 73b7d6a1a7SWilliam A. Kennington III std::optional<stdplus::EtherAddr> mac; 74454a0deeSWilliam A. Kennington III operator ==phosphor::network::NeighborInfo75454a0deeSWilliam A. Kennington III constexpr bool operator==(const NeighborInfo& rhs) const noexcept 76454a0deeSWilliam A. Kennington III { 77454a0deeSWilliam A. Kennington III return ifidx == rhs.ifidx && state == rhs.state && addr == rhs.addr && 78454a0deeSWilliam A. Kennington III mac == rhs.mac; 79454a0deeSWilliam A. Kennington III } 80a8426902SWilliam A. Kennington III }; 81a8426902SWilliam A. Kennington III 8213d665caSWilliam A. Kennington III /** @brief Contains all of the object information about the interface */ 8313d665caSWilliam A. Kennington III struct AllIntfInfo 8413d665caSWilliam A. Kennington III { 8513d665caSWilliam A. Kennington III InterfaceInfo intf; 869b2a20d3SWilliam A. Kennington III std::optional<stdplus::In4Addr> defgw4 = std::nullopt; 879b2a20d3SWilliam A. Kennington III std::optional<stdplus::In6Addr> defgw6 = std::nullopt; 889b2a20d3SWilliam A. Kennington III std::unordered_map<stdplus::SubnetAny, AddressInfo> addrs = {}; 899b2a20d3SWilliam A. Kennington III std::unordered_map<stdplus::InAnyAddr, NeighborInfo> staticNeighs = {}; 9013d665caSWilliam A. Kennington III }; 9113d665caSWilliam A. Kennington III 9213d665caSWilliam A. Kennington III } // namespace phosphor::network 93