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> 12dd9ef815SWilliam 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 551bbe3d1eSWilliam A. Kennington III using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>; 561bbe3d1eSWilliam A. Kennington III 57dd9ef815SWilliam A. Kennington III struct string_hash : public std::hash<std::string_view> 58dd9ef815SWilliam A. Kennington III { 59dd9ef815SWilliam A. Kennington III using is_transparent = void; 60dd9ef815SWilliam A. Kennington III }; 61dd9ef815SWilliam A. Kennington III template <typename V> 62dd9ef815SWilliam A. Kennington III using string_umap = 63dd9ef815SWilliam A. Kennington III std::unordered_map<std::string, V, string_hash, std::equal_to<>>; 6496444795SWilliam A. Kennington III using string_uset = 6596444795SWilliam A. Kennington III std::unordered_set<std::string, string_hash, std::equal_to<>>; 66dd9ef815SWilliam A. Kennington III 67*991a8e81SWilliam A. Kennington III constexpr std::size_t hash_multi() 68*991a8e81SWilliam A. Kennington III { 69*991a8e81SWilliam A. Kennington III return 0; 70*991a8e81SWilliam A. Kennington III } 71*991a8e81SWilliam A. Kennington III 72*991a8e81SWilliam A. Kennington III template <typename T, typename... Args> 73*991a8e81SWilliam A. Kennington III constexpr std::size_t hash_multi(const T& v, Args... args) 74*991a8e81SWilliam A. Kennington III { 75*991a8e81SWilliam A. Kennington III const std::size_t seed = hash_multi(args...); 76*991a8e81SWilliam A. Kennington III return seed ^ (std::hash<T>{}(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2)); 77*991a8e81SWilliam A. Kennington III } 78*991a8e81SWilliam A. Kennington III 791bbe3d1eSWilliam A. Kennington III } // namespace network 801bbe3d1eSWilliam A. Kennington III } // namespace phosphor 81