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 12de70ccf6SWilliam A. Kennington III #include <chrono> 13*49f9d255SJagpal Singh Gill #include <phosphor-logging/lg2.hpp> 141bbe3d1eSWilliam A. Kennington III #include <sdbusplus/bus.hpp> 151bbe3d1eSWilliam A. Kennington III #include <sdbusplus/server/manager.hpp> 16de70ccf6SWilliam A. Kennington III #include <sdeventplus/clock.hpp> 171bbe3d1eSWilliam A. Kennington III #include <sdeventplus/event.hpp> 18217bb3fdSWilliam A. Kennington III #include <sdeventplus/source/signal.hpp> 1952d70915SWilliam A. Kennington III #include <sdeventplus/utility/sdbus.hpp> 20de70ccf6SWilliam A. Kennington III #include <sdeventplus/utility/timer.hpp> 219ede1b74SWilliam A. Kennington III #include <stdplus/pinned.hpp> 22217bb3fdSWilliam A. Kennington III #include <stdplus/signal.hpp> 231bbe3d1eSWilliam A. Kennington III 241bbe3d1eSWilliam A. Kennington III constexpr char DEFAULT_OBJPATH[] = "/xyz/openbmc_project/network"; 251bbe3d1eSWilliam A. Kennington III 26de70ccf6SWilliam A. Kennington III namespace phosphor::network 271bbe3d1eSWilliam A. Kennington III { 281bbe3d1eSWilliam A. Kennington III 29de70ccf6SWilliam A. Kennington III class TimerExecutor : public DelayedExecutor 30de70ccf6SWilliam A. Kennington III { 31de70ccf6SWilliam A. Kennington III private: 32de70ccf6SWilliam A. Kennington III using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>; 331bbe3d1eSWilliam A. Kennington III 34de70ccf6SWilliam A. Kennington III public: 35de70ccf6SWilliam A. Kennington III TimerExecutor(sdeventplus::Event& event, std::chrono::seconds delay) : 36de70ccf6SWilliam A. Kennington III delay(delay), timer(event, nullptr) 37c7cf25f7SWilliam A. Kennington III { 38c7cf25f7SWilliam A. Kennington III } 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: 51de70ccf6SWilliam A. Kennington III std::chrono::seconds 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 { 57*49f9d255SJagpal 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