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