xref: /openbmc/phosphor-networkd/src/types.hpp (revision d41db383)
11bbe3d1eSWilliam A. Kennington III #pragma once
21bbe3d1eSWilliam A. Kennington III 
31bbe3d1eSWilliam A. Kennington III #include "ipaddress.hpp"
41bbe3d1eSWilliam A. Kennington III 
51bbe3d1eSWilliam A. Kennington III #include <ifaddrs.h>
61bbe3d1eSWilliam A. Kennington III #include <netinet/in.h>
71bbe3d1eSWilliam A. Kennington III #include <systemd/sd-event.h>
81bbe3d1eSWilliam A. Kennington III 
91bbe3d1eSWilliam A. Kennington III #include <array>
101bbe3d1eSWilliam A. Kennington III #include <chrono>
111bbe3d1eSWilliam A. Kennington III #include <cstddef>
121bbe3d1eSWilliam A. Kennington III #include <functional>
131bbe3d1eSWilliam A. Kennington III #include <list>
141bbe3d1eSWilliam A. Kennington III #include <map>
151bbe3d1eSWilliam A. Kennington III #include <memory>
161bbe3d1eSWilliam A. Kennington III #include <sdeventplus/clock.hpp>
171bbe3d1eSWilliam A. Kennington III #include <sdeventplus/utility/timer.hpp>
181bbe3d1eSWilliam A. Kennington III #include <set>
191bbe3d1eSWilliam A. Kennington III #include <string>
201bbe3d1eSWilliam A. Kennington III #include <variant>
211bbe3d1eSWilliam A. Kennington III #include <vector>
221bbe3d1eSWilliam A. Kennington III 
231bbe3d1eSWilliam A. Kennington III namespace phosphor
241bbe3d1eSWilliam A. Kennington III {
251bbe3d1eSWilliam A. Kennington III namespace network
261bbe3d1eSWilliam A. Kennington III {
271bbe3d1eSWilliam A. Kennington III 
281bbe3d1eSWilliam A. Kennington III using namespace std::chrono_literals;
291bbe3d1eSWilliam A. Kennington III 
30c7cf25f7SWilliam A. Kennington III // wait for three seconds before reloading systemd-networkd
31c7cf25f7SWilliam A. Kennington III constexpr auto reloadTimeout = 3s;
321bbe3d1eSWilliam A. Kennington III 
33*d41db383SWilliam A. Kennington III // refresh the objets after four seconds as network
34*d41db383SWilliam A. Kennington III // configuration takes 3-4 sec to reconfigure at most.
35*d41db383SWilliam A. Kennington III constexpr auto refreshTimeout = 4s;
361bbe3d1eSWilliam A. Kennington III 
371bbe3d1eSWilliam A. Kennington III namespace systemd
381bbe3d1eSWilliam A. Kennington III {
391bbe3d1eSWilliam A. Kennington III namespace config
401bbe3d1eSWilliam A. Kennington III {
411bbe3d1eSWilliam A. Kennington III 
421bbe3d1eSWilliam A. Kennington III constexpr auto networkFilePrefix = "00-bmc-";
431bbe3d1eSWilliam A. Kennington III constexpr auto networkFileSuffix = ".network";
441bbe3d1eSWilliam A. Kennington III constexpr auto deviceFileSuffix = ".netdev";
451bbe3d1eSWilliam A. Kennington III 
461bbe3d1eSWilliam A. Kennington III } // namespace config
471bbe3d1eSWilliam A. Kennington III } // namespace systemd
481bbe3d1eSWilliam A. Kennington III 
491bbe3d1eSWilliam A. Kennington III using IntfName = std::string;
501bbe3d1eSWilliam A. Kennington III 
511bbe3d1eSWilliam A. Kennington III struct AddrInfo
521bbe3d1eSWilliam A. Kennington III {
531bbe3d1eSWilliam A. Kennington III     uint8_t addrType;
541bbe3d1eSWilliam A. Kennington III     std::string ipaddress;
551bbe3d1eSWilliam A. Kennington III     uint16_t prefix;
561bbe3d1eSWilliam A. Kennington III };
571bbe3d1eSWilliam A. Kennington III 
581bbe3d1eSWilliam A. Kennington III using Addr_t = ifaddrs*;
591bbe3d1eSWilliam A. Kennington III 
601bbe3d1eSWilliam A. Kennington III struct AddrDeleter
611bbe3d1eSWilliam A. Kennington III {
621bbe3d1eSWilliam A. Kennington III     void operator()(Addr_t ptr) const
631bbe3d1eSWilliam A. Kennington III     {
641bbe3d1eSWilliam A. Kennington III         freeifaddrs(ptr);
651bbe3d1eSWilliam A. Kennington III     }
661bbe3d1eSWilliam A. Kennington III };
671bbe3d1eSWilliam A. Kennington III 
681bbe3d1eSWilliam A. Kennington III using AddrPtr = std::unique_ptr<ifaddrs, AddrDeleter>;
691bbe3d1eSWilliam A. Kennington III 
701bbe3d1eSWilliam A. Kennington III /* Need a custom deleter for freeing up sd_event */
711bbe3d1eSWilliam A. Kennington III struct EventDeleter
721bbe3d1eSWilliam A. Kennington III {
731bbe3d1eSWilliam A. Kennington III     void operator()(sd_event* event) const
741bbe3d1eSWilliam A. Kennington III     {
751bbe3d1eSWilliam A. Kennington III         sd_event_unref(event);
761bbe3d1eSWilliam A. Kennington III     }
771bbe3d1eSWilliam A. Kennington III };
781bbe3d1eSWilliam A. Kennington III using EventPtr = std::unique_ptr<sd_event, EventDeleter>;
791bbe3d1eSWilliam A. Kennington III 
801bbe3d1eSWilliam A. Kennington III template <typename T>
811bbe3d1eSWilliam A. Kennington III using UniquePtr = std::unique_ptr<T, std::function<void(T*)>>;
821bbe3d1eSWilliam A. Kennington III 
831bbe3d1eSWilliam A. Kennington III // Byte representations for common address types in network byte order
841bbe3d1eSWilliam A. Kennington III using InAddrAny = std::variant<struct in_addr, struct in6_addr>;
851bbe3d1eSWilliam A. Kennington III 
861bbe3d1eSWilliam A. Kennington III using AddrList = std::list<AddrInfo>;
871bbe3d1eSWilliam A. Kennington III using IntfAddrMap = std::map<IntfName, AddrList>;
881bbe3d1eSWilliam A. Kennington III using InterfaceList = std::set<IntfName>;
891bbe3d1eSWilliam A. Kennington III 
901bbe3d1eSWilliam A. Kennington III using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>;
911bbe3d1eSWilliam A. Kennington III 
921bbe3d1eSWilliam A. Kennington III } // namespace network
931bbe3d1eSWilliam A. Kennington III } // namespace phosphor
94