11bbe3d1eSWilliam A. Kennington III #include "config.h" 21bbe3d1eSWilliam A. Kennington III 30b111d4eSWilliam A. Kennington III #ifdef SYNC_MAC_FROM_INVENTORY 40b111d4eSWilliam A. Kennington III #include "inventory_mac.hpp" 50b111d4eSWilliam A. Kennington III #endif 61bbe3d1eSWilliam A. Kennington III #include "network_manager.hpp" 71bbe3d1eSWilliam A. Kennington III #include "rtnetlink_server.hpp" 81bbe3d1eSWilliam A. Kennington III #include "types.hpp" 91bbe3d1eSWilliam A. Kennington III 104fd52ae4SWilliam A. Kennington III #include <fmt/format.h> 111bbe3d1eSWilliam A. Kennington III 12*de70ccf6SWilliam A. Kennington III #include <chrono> 131bbe3d1eSWilliam A. Kennington III #include <phosphor-logging/log.hpp> 141bbe3d1eSWilliam A. Kennington III #include <sdbusplus/bus.hpp> 151bbe3d1eSWilliam A. Kennington III #include <sdbusplus/server/manager.hpp> 16*de70ccf6SWilliam A. Kennington III #include <sdeventplus/clock.hpp> 171bbe3d1eSWilliam A. Kennington III #include <sdeventplus/event.hpp> 18217bb3fdSWilliam A. Kennington III #include <sdeventplus/source/signal.hpp> 19*de70ccf6SWilliam A. Kennington III #include <sdeventplus/utility/timer.hpp> 20217bb3fdSWilliam A. Kennington III #include <stdplus/signal.hpp> 211bbe3d1eSWilliam A. Kennington III 221bbe3d1eSWilliam A. Kennington III using phosphor::logging::level; 231bbe3d1eSWilliam A. Kennington III using phosphor::logging::log; 241bbe3d1eSWilliam A. Kennington III 251bbe3d1eSWilliam A. Kennington III constexpr char DEFAULT_OBJPATH[] = "/xyz/openbmc_project/network"; 261bbe3d1eSWilliam A. Kennington III 27*de70ccf6SWilliam A. Kennington III namespace phosphor::network 281bbe3d1eSWilliam A. Kennington III { 291bbe3d1eSWilliam A. Kennington III 30*de70ccf6SWilliam A. Kennington III class TimerExecutor : public DelayedExecutor 31*de70ccf6SWilliam A. Kennington III { 32*de70ccf6SWilliam A. Kennington III private: 33*de70ccf6SWilliam A. Kennington III using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>; 341bbe3d1eSWilliam A. Kennington III 35*de70ccf6SWilliam A. Kennington III public: 36*de70ccf6SWilliam A. Kennington III TimerExecutor(sdeventplus::Event& event, std::chrono::seconds delay) : 37*de70ccf6SWilliam A. Kennington III delay(delay), timer(event, nullptr) 38c7cf25f7SWilliam A. Kennington III { 39c7cf25f7SWilliam A. Kennington III } 40c7cf25f7SWilliam A. Kennington III 41*de70ccf6SWilliam A. Kennington III void schedule() override 421bbe3d1eSWilliam A. Kennington III { 43*de70ccf6SWilliam A. Kennington III timer.restartOnce(delay); 441bbe3d1eSWilliam A. Kennington III } 451bbe3d1eSWilliam A. Kennington III 46*de70ccf6SWilliam A. Kennington III void setCallback(fu2::unique_function<void()>&& cb) override 47*de70ccf6SWilliam A. Kennington III { 48*de70ccf6SWilliam A. Kennington III timer.set_callback([cb = std::move(cb)](Timer&) mutable { cb(); }); 49*de70ccf6SWilliam A. Kennington III } 50*de70ccf6SWilliam A. Kennington III 51*de70ccf6SWilliam A. Kennington III private: 52*de70ccf6SWilliam A. Kennington III std::chrono::seconds delay; 53*de70ccf6SWilliam A. Kennington III Timer timer; 54*de70ccf6SWilliam A. Kennington III }; 55*de70ccf6SWilliam A. Kennington III 56217bb3fdSWilliam A. Kennington III void termCb(sdeventplus::source::Signal& signal, const struct signalfd_siginfo*) 571bbe3d1eSWilliam A. Kennington III { 58217bb3fdSWilliam A. Kennington III log<level::NOTICE>("Got TERM, exiting"); 59217bb3fdSWilliam A. Kennington III signal.get_event().exit(0); 601bbe3d1eSWilliam A. Kennington III } 611bbe3d1eSWilliam A. Kennington III 62217bb3fdSWilliam A. Kennington III int main() 63217bb3fdSWilliam A. Kennington III { 64217bb3fdSWilliam A. Kennington III auto event = sdeventplus::Event::get_default(); 65217bb3fdSWilliam A. Kennington III stdplus::signal::block(SIGTERM); 66217bb3fdSWilliam A. Kennington III sdeventplus::source::Signal(event, SIGTERM, termCb).set_floating(true); 671bbe3d1eSWilliam A. Kennington III 68217bb3fdSWilliam A. Kennington III auto bus = sdbusplus::bus::new_default(); 69217bb3fdSWilliam A. Kennington III bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL); 70c38b0710SPatrick Williams sdbusplus::server::manager_t objManager(bus, DEFAULT_OBJPATH); 711bbe3d1eSWilliam A. Kennington III 72*de70ccf6SWilliam A. Kennington III TimerExecutor reload(event, std::chrono::seconds(3)); 73*de70ccf6SWilliam A. Kennington III Manager manager(bus, reload, DEFAULT_OBJPATH, "/etc/systemd/network"); 74*de70ccf6SWilliam A. Kennington III netlink::Server svr(event, manager); 751bbe3d1eSWilliam A. Kennington III 761bbe3d1eSWilliam A. Kennington III #ifdef SYNC_MAC_FROM_INVENTORY 77*de70ccf6SWilliam A. Kennington III auto runtime = inventory::watch(bus, manager); 781bbe3d1eSWilliam A. Kennington III #endif 79bd649af9SWilliam A. Kennington III 80*de70ccf6SWilliam A. Kennington III bus.request_name(DEFAULT_BUSNAME); 81217bb3fdSWilliam A. Kennington III return event.loop(); 824fd52ae4SWilliam A. Kennington III } 834fd52ae4SWilliam A. Kennington III 84*de70ccf6SWilliam A. Kennington III } // namespace phosphor::network 854fd52ae4SWilliam A. Kennington III 864fd52ae4SWilliam A. Kennington III int main(int /*argc*/, char** /*argv*/) 874fd52ae4SWilliam A. Kennington III { 884fd52ae4SWilliam A. Kennington III try 894fd52ae4SWilliam A. Kennington III { 904fd52ae4SWilliam A. Kennington III return phosphor::network::main(); 914fd52ae4SWilliam A. Kennington III } 924fd52ae4SWilliam A. Kennington III catch (const std::exception& e) 934fd52ae4SWilliam A. Kennington III { 94be1af44cSWilliam A. Kennington III fmt::print(stderr, "FAILED: {}", e.what()); 95be1af44cSWilliam A. Kennington III fflush(stderr); 964fd52ae4SWilliam A. Kennington III return 1; 974fd52ae4SWilliam A. Kennington III } 981bbe3d1eSWilliam A. Kennington III } 99