blob: d79572c7ece100d251b362957661051aa90c58c6 [file] [log] [blame]
Tom Josephc35524e2016-08-29 08:17:59 -05001#include "main.hpp"
2#include <assert.h>
3#include <dlfcn.h>
4#include <dirent.h>
5#include <unistd.h>
6
7#include <iostream>
8#include <tuple>
9
10#include <systemd/sd-bus.h>
11#include <systemd/sd-daemon.h>
12#include <systemd/sd-event.h>
13
14#include <host-ipmid/ipmid-api.h>
Tom Joseph83029cb2017-09-01 16:37:31 +053015#include "command/guid.hpp"
Tom Josephc35524e2016-08-29 08:17:59 -050016#include "comm_module.hpp"
17#include "command_table.hpp"
18#include "message.hpp"
19#include "message_handler.hpp"
Tom485038e2016-12-02 13:44:45 +053020#include "provider_registration.hpp"
Tom Josephc35524e2016-08-29 08:17:59 -050021#include "socket_channel.hpp"
Tom Joseph89481cf2017-04-03 02:11:34 +053022#include "sol_module.hpp"
Ratan Gupta40801362018-03-12 16:21:37 +053023#include "timer.hpp"
Tom Josephc35524e2016-08-29 08:17:59 -050024
25// Tuple of Global Singletons
26session::Manager manager;
27command::Table table;
Tom Joseph52f53d72017-03-14 15:20:19 +053028eventloop::EventLoop loop;
29sol::Manager solManager;
30
31std::tuple<session::Manager&, command::Table&, eventloop::EventLoop&,
32 sol::Manager&> singletonPool(manager, table, loop, solManager);
Tom Josephc35524e2016-08-29 08:17:59 -050033
34sd_bus* bus = nullptr;
Ratan Gupta166c71a2018-03-23 23:05:17 +053035sd_event* events = nullptr;
Marri Devender Rao3ecf0a12017-07-13 08:07:22 -050036
Ratan Gupta40801362018-03-12 16:21:37 +053037// Global timer for network changes
38std::unique_ptr<phosphor::ipmi::Timer> networkTimer = nullptr;
39
Tom069f01e2016-12-02 14:11:37 +053040FILE* ipmidbus = nullptr;
41unsigned short g_sel_reserve = 0xFFFF;
42sd_bus_slot* ipmid_slot = nullptr;
Tom Josephc35524e2016-08-29 08:17:59 -050043
44/*
45 * @brief Required by apphandler IPMI Provider Library
46 */
47sd_bus* ipmid_get_sd_bus_connection()
48{
49 return bus;
50}
51
52/*
Tom069f01e2016-12-02 14:11:37 +053053 * @brief Required by apphandler IPMI Provider Library
54 */
Ratan Gupta04edb9b2018-03-20 23:06:06 +053055sd_event* ipmid_get_sd_event_connection()
56{
Ratan Gupta166c71a2018-03-23 23:05:17 +053057 return events;
Ratan Gupta04edb9b2018-03-20 23:06:06 +053058}
59
60/*
61 * @brief Required by apphandler IPMI Provider Library
62 */
Tom069f01e2016-12-02 14:11:37 +053063unsigned short get_sel_reserve_id()
64{
65 return g_sel_reserve;
66}
67
Tom Josephc35524e2016-08-29 08:17:59 -050068int main(int i_argc, char* i_argv[])
69{
Tom069f01e2016-12-02 14:11:37 +053070 /*
71 * Required by apphandler IPMI Provider Library for logging.
72 */
73 ipmidbus = fopen("/dev/null", "w");
74
Tom Josephc35524e2016-08-29 08:17:59 -050075 // Connect to system bus
76 auto rc = sd_bus_open_system(&bus);
77 if (rc < 0)
78 {
79 std::cerr << "Failed to connect to system bus:" << strerror(-rc) <<"\n";
80 goto finish;
81 }
82
Ratan Gupta166c71a2018-03-23 23:05:17 +053083 /* Get an sd event handler */
84 rc = sd_event_default(&events);
85 if (rc < 0)
86 {
87 std::cerr << "Failure to create sd_event" << strerror(-rc) <<"\n";
88 goto finish;
89 }
90
Tom Joseph83029cb2017-09-01 16:37:31 +053091 // Register callback to update cache for a GUID change and cache the GUID
92 command::registerGUIDChangeCallback();
93 cache::guid = command::getSystemGUID();
94
95
Tom485038e2016-12-02 13:44:45 +053096 // Register all the IPMI provider libraries applicable for net-ipmid
97 provider::registerCallbackHandlers(NET_IPMID_LIB_PATH);
98
Tom Josephc35524e2016-08-29 08:17:59 -050099 // Register the phosphor-net-ipmid session setup commands
100 command::sessionSetupCommands();
101
Tom Joseph89481cf2017-04-03 02:11:34 +0530102 // Register the phosphor-net-ipmid SOL commands
103 sol::command::registerCommands();
104
Tom Josephc35524e2016-08-29 08:17:59 -0500105 // Start Event Loop
Ratan Gupta166c71a2018-03-23 23:05:17 +0530106 return std::get<eventloop::EventLoop&>(singletonPool).startEventLoop(events);
Tom Josephc35524e2016-08-29 08:17:59 -0500107
108finish:
109 sd_bus_unref(bus);
Ratan Gupta166c71a2018-03-23 23:05:17 +0530110 sd_event_unref(events);
Tom Josephc35524e2016-08-29 08:17:59 -0500111
112 return 0;
113}