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