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