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 1249f9d255SJagpal Singh Gill #include <phosphor-logging/lg2.hpp> 131bbe3d1eSWilliam A. Kennington III #include <sdbusplus/bus.hpp> 141bbe3d1eSWilliam A. Kennington III #include <sdbusplus/server/manager.hpp> 15de70ccf6SWilliam A. Kennington III #include <sdeventplus/clock.hpp> 161bbe3d1eSWilliam A. Kennington III #include <sdeventplus/event.hpp> 17217bb3fdSWilliam A. Kennington III #include <sdeventplus/source/signal.hpp> 1852d70915SWilliam A. Kennington III #include <sdeventplus/utility/sdbus.hpp> 19de70ccf6SWilliam A. Kennington III #include <sdeventplus/utility/timer.hpp> 209ede1b74SWilliam A. Kennington III #include <stdplus/pinned.hpp> 21217bb3fdSWilliam A. Kennington III #include <stdplus/signal.hpp> 221bbe3d1eSWilliam A. Kennington III 2389d734b9SPatrick Williams #include <chrono> 2489d734b9SPatrick Williams 251bbe3d1eSWilliam A. Kennington III constexpr char DEFAULT_OBJPATH[] = "/xyz/openbmc_project/network"; 261bbe3d1eSWilliam A. Kennington III 27de70ccf6SWilliam A. Kennington III namespace phosphor::network 281bbe3d1eSWilliam A. Kennington III { 291bbe3d1eSWilliam A. Kennington III 30de70ccf6SWilliam A. Kennington III class TimerExecutor : public DelayedExecutor 31de70ccf6SWilliam A. Kennington III { 32de70ccf6SWilliam A. Kennington III private: 33de70ccf6SWilliam A. Kennington III using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>; 341bbe3d1eSWilliam A. Kennington III 35de70ccf6SWilliam A. Kennington III public: 36*f5151aa5SWilliam A. Kennington III TimerExecutor(sdeventplus::Event& event, std::chrono::milliseconds delay) : 37de70ccf6SWilliam A. Kennington III delay(delay), timer(event, nullptr) 3889d734b9SPatrick Williams {} 39c7cf25f7SWilliam A. Kennington III 40de70ccf6SWilliam A. Kennington III void schedule() override 411bbe3d1eSWilliam A. Kennington III { 42de70ccf6SWilliam A. Kennington III timer.restartOnce(delay); 431bbe3d1eSWilliam A. Kennington III } 441bbe3d1eSWilliam A. Kennington III 45de70ccf6SWilliam A. Kennington III void setCallback(fu2::unique_function<void()>&& cb) override 46de70ccf6SWilliam A. Kennington III { 47de70ccf6SWilliam A. Kennington III timer.set_callback([cb = std::move(cb)](Timer&) mutable { cb(); }); 48de70ccf6SWilliam A. Kennington III } 49de70ccf6SWilliam A. Kennington III 50de70ccf6SWilliam A. Kennington III private: 51*f5151aa5SWilliam A. Kennington III std::chrono::milliseconds delay; 52de70ccf6SWilliam A. Kennington III Timer timer; 53de70ccf6SWilliam A. Kennington III }; 54de70ccf6SWilliam A. Kennington III 55217bb3fdSWilliam A. Kennington III void termCb(sdeventplus::source::Signal& signal, const struct signalfd_siginfo*) 561bbe3d1eSWilliam A. Kennington III { 5749f9d255SJagpal Singh Gill lg2::notice("Received request to terminate, exiting"); 58217bb3fdSWilliam A. Kennington III signal.get_event().exit(0); 591bbe3d1eSWilliam A. Kennington III } 601bbe3d1eSWilliam A. Kennington III 61217bb3fdSWilliam A. Kennington III int main() 62217bb3fdSWilliam A. Kennington III { 63217bb3fdSWilliam A. Kennington III auto event = sdeventplus::Event::get_default(); 64217bb3fdSWilliam A. Kennington III stdplus::signal::block(SIGTERM); 65217bb3fdSWilliam A. Kennington III sdeventplus::source::Signal(event, SIGTERM, termCb).set_floating(true); 661bbe3d1eSWilliam A. Kennington III 679ede1b74SWilliam A. Kennington III stdplus::Pinned bus = sdbusplus::bus::new_default(); 68c38b0710SPatrick Williams sdbusplus::server::manager_t objManager(bus, DEFAULT_OBJPATH); 691bbe3d1eSWilliam A. Kennington III 709ede1b74SWilliam A. Kennington III stdplus::Pinned<TimerExecutor> reload(event, std::chrono::seconds(3)); 71de70ccf6SWilliam A. Kennington III Manager manager(bus, reload, DEFAULT_OBJPATH, "/etc/systemd/network"); 72de70ccf6SWilliam A. Kennington III netlink::Server svr(event, manager); 731bbe3d1eSWilliam A. Kennington III 741bbe3d1eSWilliam A. Kennington III #ifdef SYNC_MAC_FROM_INVENTORY 75de70ccf6SWilliam A. Kennington III auto runtime = inventory::watch(bus, manager); 761bbe3d1eSWilliam A. Kennington III #endif 77bd649af9SWilliam A. Kennington III 78de70ccf6SWilliam A. Kennington III bus.request_name(DEFAULT_BUSNAME); 7952d70915SWilliam A. Kennington III return sdeventplus::utility::loopWithBus(event, bus); 804fd52ae4SWilliam A. Kennington III } 814fd52ae4SWilliam A. Kennington III 82de70ccf6SWilliam A. Kennington III } // namespace phosphor::network 834fd52ae4SWilliam A. Kennington III 844fd52ae4SWilliam A. Kennington III int main(int /*argc*/, char** /*argv*/) 854fd52ae4SWilliam A. Kennington III { 864fd52ae4SWilliam A. Kennington III try 874fd52ae4SWilliam A. Kennington III { 884fd52ae4SWilliam A. Kennington III return phosphor::network::main(); 894fd52ae4SWilliam A. Kennington III } 904fd52ae4SWilliam A. Kennington III catch (const std::exception& e) 914fd52ae4SWilliam A. Kennington III { 92be1af44cSWilliam A. Kennington III fmt::print(stderr, "FAILED: {}", e.what()); 93be1af44cSWilliam A. Kennington III fflush(stderr); 944fd52ae4SWilliam A. Kennington III return 1; 954fd52ae4SWilliam A. Kennington III } 961bbe3d1eSWilliam A. Kennington III } 97