blob: a78253c9d97b15f535f53e62b13fbe51987f730b [file] [log] [blame]
Ratan Gupta82549cc2017-04-21 08:45:23 +05301#pragma once
William A. Kennington III0d7ce482019-01-30 17:14:23 -08002#include <netinet/in.h>
Patrick Venture189d44e2018-07-09 12:30:59 -07003#include <systemd/sd-event.h>
Ratan Gupta3681a502017-06-17 19:20:04 +05304
Patrick Venture189d44e2018-07-09 12:30:59 -07005#include <chrono>
Ratan Gupta3681a502017-06-17 19:20:04 +05306#include <memory>
William A. Kennington III3a70fa22018-09-20 18:48:20 -07007#include <sdeventplus/clock.hpp>
8#include <sdeventplus/utility/timer.hpp>
Patrick Venture189d44e2018-07-09 12:30:59 -07009#include <string>
William A. Kennington IIIdd9ef812022-10-05 02:08:02 -070010#include <unordered_map>
Willy Tuf7dce2e2022-10-07 05:48:08 +000011#include <unordered_set>
William A. Kennington III0d7ce482019-01-30 17:14:23 -080012#include <variant>
Ratan Gupta0f9dc1b2017-09-03 17:57:50 +053013
Ratan Gupta82549cc2017-04-21 08:45:23 +053014namespace phosphor
15{
16namespace network
17{
Ratan Guptae05083a2017-09-16 07:12:11 +053018
19using namespace std::chrono_literals;
Ratan Gupta16f12882017-09-22 18:26:11 +053020
William A. Kennington IIIc7cf25f2021-11-09 16:16:59 -080021// wait for three seconds before reloading systemd-networkd
22constexpr auto reloadTimeout = 3s;
Ratan Gupta16f12882017-09-22 18:26:11 +053023
William A. Kennington IIId41db382021-11-09 20:42:29 -080024// refresh the objets after four seconds as network
25// configuration takes 3-4 sec to reconfigure at most.
26constexpr auto refreshTimeout = 4s;
Ratan Guptae05083a2017-09-16 07:12:11 +053027
Ratan Gupta0f9dc1b2017-09-03 17:57:50 +053028/* Need a custom deleter for freeing up sd_event */
29struct EventDeleter
30{
31 void operator()(sd_event* event) const
32 {
William A. Kennington IIIdc2f1b62021-05-13 21:20:19 -070033 sd_event_unref(event);
Ratan Gupta0f9dc1b2017-09-03 17:57:50 +053034 }
35};
36using EventPtr = std::unique_ptr<sd_event, EventDeleter>;
37
William A. Kennington III0d7ce482019-01-30 17:14:23 -080038// Byte representations for common address types in network byte order
39using InAddrAny = std::variant<struct in_addr, struct in6_addr>;
William A. Kennington III0d7ce482019-01-30 17:14:23 -080040
William A. Kennington III3a70fa22018-09-20 18:48:20 -070041using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>;
42
William A. Kennington IIIdd9ef812022-10-05 02:08:02 -070043struct string_hash : public std::hash<std::string_view>
44{
45 using is_transparent = void;
46};
47template <typename V>
48using string_umap =
49 std::unordered_map<std::string, V, string_hash, std::equal_to<>>;
William A. Kennington III96444792022-10-05 15:16:22 -070050using string_uset =
51 std::unordered_set<std::string, string_hash, std::equal_to<>>;
William A. Kennington IIIdd9ef812022-10-05 02:08:02 -070052
William A. Kennington III3e471c52022-10-27 19:46:07 -070053constexpr std::size_t hash_multi() noexcept
William A. Kennington III991a8e82022-10-11 15:02:47 -070054{
55 return 0;
56}
57
58template <typename T, typename... Args>
William A. Kennington III3e471c52022-10-27 19:46:07 -070059constexpr std::size_t hash_multi(const T& v, Args... args) noexcept
William A. Kennington III991a8e82022-10-11 15:02:47 -070060{
61 const std::size_t seed = hash_multi(args...);
62 return seed ^ (std::hash<T>{}(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2));
63}
64
Gunnar Mills57d9c502018-09-14 14:42:34 -050065} // namespace network
66} // namespace phosphor
William A. Kennington III3e471c52022-10-27 19:46:07 -070067
68template <typename... Ts>
69struct std::hash<std::tuple<Ts...>>
70{
71 constexpr auto operator()(const std::tuple<Ts...>& t) const noexcept
72 {
73 return std::apply(phosphor::network::hash_multi<Ts...>, t);
74 }
75};