blob: 9eeb3b705f1c3a4765d60ff58bbec2c1ebaff087 [file] [log] [blame]
Ratan Gupta82549cc2017-04-21 08:45:23 +05301#pragma once
2
Ratan Gupta3681a502017-06-17 19:20:04 +05303#include <ifaddrs.h>
William A. Kennington III0d7ce482019-01-30 17:14:23 -08004#include <netinet/in.h>
Patrick Venture189d44e2018-07-09 12:30:59 -07005#include <systemd/sd-event.h>
Ratan Gupta3681a502017-06-17 19:20:04 +05306
Patrick Venture189d44e2018-07-09 12:30:59 -07007#include <chrono>
Ratan Gupta3681a502017-06-17 19:20:04 +05308#include <memory>
William A. Kennington III3a70fa22018-09-20 18:48:20 -07009#include <sdeventplus/clock.hpp>
10#include <sdeventplus/utility/timer.hpp>
Patrick Venture189d44e2018-07-09 12:30:59 -070011#include <string>
William A. Kennington IIIdd9ef812022-10-05 02:08:02 -070012#include <unordered_map>
Willy Tuf7dce2e2022-10-07 05:48:08 +000013#include <unordered_set>
William A. Kennington III0d7ce482019-01-30 17:14:23 -080014#include <variant>
Ratan Gupta0f9dc1b2017-09-03 17:57:50 +053015
Ratan Gupta82549cc2017-04-21 08:45:23 +053016namespace phosphor
17{
18namespace network
19{
Ratan Guptae05083a2017-09-16 07:12:11 +053020
21using namespace std::chrono_literals;
Ratan Gupta16f12882017-09-22 18:26:11 +053022
William A. Kennington IIIc7cf25f2021-11-09 16:16:59 -080023// wait for three seconds before reloading systemd-networkd
24constexpr auto reloadTimeout = 3s;
Ratan Gupta16f12882017-09-22 18:26:11 +053025
William A. Kennington IIId41db382021-11-09 20:42:29 -080026// refresh the objets after four seconds as network
27// configuration takes 3-4 sec to reconfigure at most.
28constexpr auto refreshTimeout = 4s;
Ratan Guptae05083a2017-09-16 07:12:11 +053029
Ratan Gupta3681a502017-06-17 19:20:04 +053030using Addr_t = ifaddrs*;
31
32struct AddrDeleter
33{
34 void operator()(Addr_t ptr) const
35 {
36 freeifaddrs(ptr);
37 }
38};
39
40using AddrPtr = std::unique_ptr<ifaddrs, AddrDeleter>;
41
Ratan Gupta0f9dc1b2017-09-03 17:57:50 +053042/* Need a custom deleter for freeing up sd_event */
43struct EventDeleter
44{
45 void operator()(sd_event* event) const
46 {
William A. Kennington IIIdc2f1b62021-05-13 21:20:19 -070047 sd_event_unref(event);
Ratan Gupta0f9dc1b2017-09-03 17:57:50 +053048 }
49};
50using EventPtr = std::unique_ptr<sd_event, EventDeleter>;
51
William A. Kennington III0d7ce482019-01-30 17:14:23 -080052// Byte representations for common address types in network byte order
53using InAddrAny = std::variant<struct in_addr, struct in6_addr>;
William A. Kennington III0d7ce482019-01-30 17:14:23 -080054
William A. Kennington III3a70fa22018-09-20 18:48:20 -070055using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>;
56
William A. Kennington IIIdd9ef812022-10-05 02:08:02 -070057struct string_hash : public std::hash<std::string_view>
58{
59 using is_transparent = void;
60};
61template <typename V>
62using string_umap =
63 std::unordered_map<std::string, V, string_hash, std::equal_to<>>;
William A. Kennington III96444792022-10-05 15:16:22 -070064using string_uset =
65 std::unordered_set<std::string, string_hash, std::equal_to<>>;
William A. Kennington IIIdd9ef812022-10-05 02:08:02 -070066
William A. Kennington III991a8e82022-10-11 15:02:47 -070067constexpr std::size_t hash_multi()
68{
69 return 0;
70}
71
72template <typename T, typename... Args>
73constexpr std::size_t hash_multi(const T& v, Args... args)
74{
75 const std::size_t seed = hash_multi(args...);
76 return seed ^ (std::hash<T>{}(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2));
77}
78
Gunnar Mills57d9c502018-09-14 14:42:34 -050079} // namespace network
80} // namespace phosphor