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 
1049f9d255SJagpal Singh Gill #include <phosphor-logging/lg2.hpp>
111bbe3d1eSWilliam A. Kennington III #include <sdbusplus/bus.hpp>
121bbe3d1eSWilliam A. Kennington III #include <sdbusplus/server/manager.hpp>
13de70ccf6SWilliam A. Kennington III #include <sdeventplus/clock.hpp>
141bbe3d1eSWilliam A. Kennington III #include <sdeventplus/event.hpp>
15217bb3fdSWilliam A. Kennington III #include <sdeventplus/source/signal.hpp>
1652d70915SWilliam A. Kennington III #include <sdeventplus/utility/sdbus.hpp>
17de70ccf6SWilliam A. Kennington III #include <sdeventplus/utility/timer.hpp>
189ede1b74SWilliam A. Kennington III #include <stdplus/pinned.hpp>
19*b740196bSWilliam A. Kennington III #include <stdplus/print.hpp>
20217bb3fdSWilliam A. Kennington III #include <stdplus/signal.hpp>
211bbe3d1eSWilliam A. Kennington III 
2289d734b9SPatrick Williams #include <chrono>
2389d734b9SPatrick Williams 
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:
TimerExecutor(sdeventplus::Event & event,std::chrono::milliseconds delay)35f5151aa5SWilliam A. Kennington III     TimerExecutor(sdeventplus::Event& event, std::chrono::milliseconds delay) :
36de70ccf6SWilliam A. Kennington III         delay(delay), timer(event, nullptr)
3789d734b9SPatrick Williams     {}
38c7cf25f7SWilliam A. Kennington III 
schedule()39de70ccf6SWilliam A. Kennington III     void schedule() override
401bbe3d1eSWilliam A. Kennington III     {
41de70ccf6SWilliam A. Kennington III         timer.restartOnce(delay);
421bbe3d1eSWilliam A. Kennington III     }
431bbe3d1eSWilliam A. Kennington III 
setCallback(fu2::unique_function<void ()> && cb)44de70ccf6SWilliam A. Kennington III     void setCallback(fu2::unique_function<void()>&& cb) override
45de70ccf6SWilliam A. Kennington III     {
46de70ccf6SWilliam A. Kennington III         timer.set_callback([cb = std::move(cb)](Timer&) mutable { cb(); });
47de70ccf6SWilliam A. Kennington III     }
48de70ccf6SWilliam A. Kennington III 
49de70ccf6SWilliam A. Kennington III   private:
50f5151aa5SWilliam A. Kennington III     std::chrono::milliseconds delay;
51de70ccf6SWilliam A. Kennington III     Timer timer;
52de70ccf6SWilliam A. Kennington III };
53de70ccf6SWilliam A. Kennington III 
termCb(sdeventplus::source::Signal & signal,const struct signalfd_siginfo *)54217bb3fdSWilliam A. Kennington III void termCb(sdeventplus::source::Signal& signal, const struct signalfd_siginfo*)
551bbe3d1eSWilliam A. Kennington III {
5649f9d255SJagpal Singh Gill     lg2::notice("Received request to terminate, exiting");
57217bb3fdSWilliam A. Kennington III     signal.get_event().exit(0);
581bbe3d1eSWilliam A. Kennington III }
591bbe3d1eSWilliam A. Kennington III 
main()60217bb3fdSWilliam A. Kennington III int main()
61217bb3fdSWilliam A. Kennington III {
62217bb3fdSWilliam A. Kennington III     auto event = sdeventplus::Event::get_default();
63217bb3fdSWilliam A. Kennington III     stdplus::signal::block(SIGTERM);
64217bb3fdSWilliam A. Kennington III     sdeventplus::source::Signal(event, SIGTERM, termCb).set_floating(true);
651bbe3d1eSWilliam A. Kennington III 
669ede1b74SWilliam A. Kennington III     stdplus::Pinned bus = sdbusplus::bus::new_default();
67c38b0710SPatrick Williams     sdbusplus::server::manager_t objManager(bus, DEFAULT_OBJPATH);
681bbe3d1eSWilliam A. Kennington III 
699ede1b74SWilliam A. Kennington III     stdplus::Pinned<TimerExecutor> reload(event, std::chrono::seconds(3));
70d40046b0SWilliam A. Kennington III     stdplus::Pinned<Manager> manager(bus, reload, DEFAULT_OBJPATH,
71d40046b0SWilliam A. Kennington III                                      "/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 
main(int,char **)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     {
92*b740196bSWilliam A. Kennington III         stdplus::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