blob: 78a24d2c179cb82ed7c4ef9e49c1e8f66e813f72 [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;
Jason M. Billsb00f8f72018-09-10 15:14:10 -070041static unsigned short selReservationID = 0xFFFF;
42static bool selReservationValid = false;
Tom069f01e2016-12-02 14:11:37 +053043sd_bus_slot* ipmid_slot = nullptr;
Tom Josephc35524e2016-08-29 08:17:59 -050044
45/*
46 * @brief Required by apphandler IPMI Provider Library
47 */
48sd_bus* ipmid_get_sd_bus_connection()
49{
50 return bus;
51}
52
53/*
Tom069f01e2016-12-02 14:11:37 +053054 * @brief Required by apphandler IPMI Provider Library
55 */
Ratan Gupta04edb9b2018-03-20 23:06:06 +053056sd_event* ipmid_get_sd_event_connection()
57{
Ratan Gupta166c71a2018-03-23 23:05:17 +053058 return events;
Ratan Gupta04edb9b2018-03-20 23:06:06 +053059}
60
61/*
62 * @brief Required by apphandler IPMI Provider Library
63 */
Jason M. Billsb00f8f72018-09-10 15:14:10 -070064unsigned short reserveSel(void)
Tom069f01e2016-12-02 14:11:37 +053065{
Jason M. Billsb00f8f72018-09-10 15:14:10 -070066 // IPMI spec, Reservation ID, the value simply increases against each
67 // execution of the Reserve SEL command.
68 if (++selReservationID == 0) {
69 selReservationID = 1;
70 }
71 selReservationValid = true;
72 return selReservationID;
73}
74
75/*
76 * @brief Required by apphandler IPMI Provider Library
77 */
78bool checkSELReservation(unsigned short id)
79{
80 return (selReservationValid && selReservationID == id);
81}
82
83/*
84 * @brief Required by apphandler IPMI Provider Library
85 */
86void cancelSELReservation(void)
87{
88 selReservationValid = false;
Tom069f01e2016-12-02 14:11:37 +053089}
90
Tom Josephc35524e2016-08-29 08:17:59 -050091int main(int i_argc, char* i_argv[])
92{
Tom069f01e2016-12-02 14:11:37 +053093 /*
94 * Required by apphandler IPMI Provider Library for logging.
95 */
96 ipmidbus = fopen("/dev/null", "w");
97
Tom Josephc35524e2016-08-29 08:17:59 -050098 // Connect to system bus
99 auto rc = sd_bus_open_system(&bus);
100 if (rc < 0)
101 {
102 std::cerr << "Failed to connect to system bus:" << strerror(-rc) <<"\n";
103 goto finish;
104 }
105
Ratan Gupta166c71a2018-03-23 23:05:17 +0530106 /* Get an sd event handler */
107 rc = sd_event_default(&events);
108 if (rc < 0)
109 {
110 std::cerr << "Failure to create sd_event" << strerror(-rc) <<"\n";
111 goto finish;
112 }
113
Tom Joseph83029cb2017-09-01 16:37:31 +0530114 // Register callback to update cache for a GUID change and cache the GUID
115 command::registerGUIDChangeCallback();
116 cache::guid = command::getSystemGUID();
117
118
Tom485038e2016-12-02 13:44:45 +0530119 // Register all the IPMI provider libraries applicable for net-ipmid
120 provider::registerCallbackHandlers(NET_IPMID_LIB_PATH);
121
Tom Josephc35524e2016-08-29 08:17:59 -0500122 // Register the phosphor-net-ipmid session setup commands
123 command::sessionSetupCommands();
124
Tom Joseph89481cf2017-04-03 02:11:34 +0530125 // Register the phosphor-net-ipmid SOL commands
126 sol::command::registerCommands();
127
Tom Josephc35524e2016-08-29 08:17:59 -0500128 // Start Event Loop
Ratan Gupta166c71a2018-03-23 23:05:17 +0530129 return std::get<eventloop::EventLoop&>(singletonPool).startEventLoop(events);
Tom Josephc35524e2016-08-29 08:17:59 -0500130
131finish:
132 sd_bus_unref(bus);
Ratan Gupta166c71a2018-03-23 23:05:17 +0530133 sd_event_unref(events);
Tom Josephc35524e2016-08-29 08:17:59 -0500134
135 return 0;
136}