xref: /openbmc/phosphor-networkd/src/types.hpp (revision 991a8e81)
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