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