11bbe3d1eSWilliam A. Kennington III #pragma once 21bbe3d1eSWilliam A. Kennington III 31bbe3d1eSWilliam A. Kennington III #include <ifaddrs.h> 41bbe3d1eSWilliam A. Kennington III #include <netinet/in.h> 51bbe3d1eSWilliam A. Kennington III #include <systemd/sd-event.h> 61bbe3d1eSWilliam A. Kennington III 71bbe3d1eSWilliam A. Kennington III #include <chrono> 81bbe3d1eSWilliam A. Kennington III #include <memory> 91bbe3d1eSWilliam A. Kennington III #include <sdeventplus/clock.hpp> 101bbe3d1eSWilliam A. Kennington III #include <sdeventplus/utility/timer.hpp> 111bbe3d1eSWilliam A. Kennington III #include <string> 12*dd9ef815SWilliam A. Kennington III #include <unordered_map> 13f7dce2e8SWilly Tu #include <unordered_set> 141bbe3d1eSWilliam A. Kennington III #include <variant> 151bbe3d1eSWilliam A. Kennington III 161bbe3d1eSWilliam A. Kennington III namespace phosphor 171bbe3d1eSWilliam A. Kennington III { 181bbe3d1eSWilliam A. Kennington III namespace network 191bbe3d1eSWilliam A. Kennington III { 201bbe3d1eSWilliam A. Kennington III 211bbe3d1eSWilliam A. Kennington III using namespace std::chrono_literals; 221bbe3d1eSWilliam A. Kennington III 23c7cf25f7SWilliam A. Kennington III // wait for three seconds before reloading systemd-networkd 24c7cf25f7SWilliam A. Kennington III constexpr auto reloadTimeout = 3s; 251bbe3d1eSWilliam A. Kennington III 26d41db383SWilliam A. Kennington III // refresh the objets after four seconds as network 27d41db383SWilliam A. Kennington III // configuration takes 3-4 sec to reconfigure at most. 28d41db383SWilliam A. Kennington III constexpr auto refreshTimeout = 4s; 291bbe3d1eSWilliam A. Kennington III 301bbe3d1eSWilliam A. Kennington III using Addr_t = ifaddrs*; 311bbe3d1eSWilliam A. Kennington III 321bbe3d1eSWilliam A. Kennington III struct AddrDeleter 331bbe3d1eSWilliam A. Kennington III { 341bbe3d1eSWilliam A. Kennington III void operator()(Addr_t ptr) const 351bbe3d1eSWilliam A. Kennington III { 361bbe3d1eSWilliam A. Kennington III freeifaddrs(ptr); 371bbe3d1eSWilliam A. Kennington III } 381bbe3d1eSWilliam A. Kennington III }; 391bbe3d1eSWilliam A. Kennington III 401bbe3d1eSWilliam A. Kennington III using AddrPtr = std::unique_ptr<ifaddrs, AddrDeleter>; 411bbe3d1eSWilliam A. Kennington III 421bbe3d1eSWilliam A. Kennington III /* Need a custom deleter for freeing up sd_event */ 431bbe3d1eSWilliam A. Kennington III struct EventDeleter 441bbe3d1eSWilliam A. Kennington III { 451bbe3d1eSWilliam A. Kennington III void operator()(sd_event* event) const 461bbe3d1eSWilliam A. Kennington III { 471bbe3d1eSWilliam A. Kennington III sd_event_unref(event); 481bbe3d1eSWilliam A. Kennington III } 491bbe3d1eSWilliam A. Kennington III }; 501bbe3d1eSWilliam A. Kennington III using EventPtr = std::unique_ptr<sd_event, EventDeleter>; 511bbe3d1eSWilliam A. Kennington III 521bbe3d1eSWilliam A. Kennington III // Byte representations for common address types in network byte order 531bbe3d1eSWilliam A. Kennington III using InAddrAny = std::variant<struct in_addr, struct in6_addr>; 541bbe3d1eSWilliam A. Kennington III 55*dd9ef815SWilliam A. Kennington III using InterfaceList = std::unordered_set<std::string>; 561bbe3d1eSWilliam A. Kennington III 571bbe3d1eSWilliam A. Kennington III using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>; 581bbe3d1eSWilliam A. Kennington III 59*dd9ef815SWilliam A. Kennington III struct string_hash : public std::hash<std::string_view> 60*dd9ef815SWilliam A. Kennington III { 61*dd9ef815SWilliam A. Kennington III using is_transparent = void; 62*dd9ef815SWilliam A. Kennington III }; 63*dd9ef815SWilliam A. Kennington III template <typename V> 64*dd9ef815SWilliam A. Kennington III using string_umap = 65*dd9ef815SWilliam A. Kennington III std::unordered_map<std::string, V, string_hash, std::equal_to<>>; 66*dd9ef815SWilliam A. Kennington III 671bbe3d1eSWilliam A. Kennington III } // namespace network 681bbe3d1eSWilliam A. Kennington III } // namespace phosphor 69