blob: 43ad596a4f7e211a47dca2e34e514566de4d8e4f [file] [log] [blame]
Tom Josephc35524e2016-08-29 08:17:59 -05001#include "main.hpp"
Tom Josephc35524e2016-08-29 08:17:59 -05002
Tom Josephc35524e2016-08-29 08:17:59 -05003#include "comm_module.hpp"
Vernon Mauery9e801a22018-10-12 13:20:49 -07004#include "command/guid.hpp"
Tom Josephc35524e2016-08-29 08:17:59 -05005#include "command_table.hpp"
6#include "message.hpp"
7#include "message_handler.hpp"
Tom485038e2016-12-02 13:44:45 +05308#include "provider_registration.hpp"
Tom Josephc35524e2016-08-29 08:17:59 -05009#include "socket_channel.hpp"
Tom Joseph89481cf2017-04-03 02:11:34 +053010#include "sol_module.hpp"
Tom Josephc35524e2016-08-29 08:17:59 -050011
Vernon Mauery9e801a22018-10-12 13:20:49 -070012#include <assert.h>
13#include <dirent.h>
14#include <dlfcn.h>
William A. Kennington III4f09eae2019-02-12 17:10:35 -080015#include <ipmid/api.h>
Vernon Mauery9e801a22018-10-12 13:20:49 -070016#include <systemd/sd-daemon.h>
17#include <systemd/sd-event.h>
18#include <unistd.h>
19
Vernon Maueryfc37e592018-12-19 14:55:15 -080020#include <phosphor-logging/log.hpp>
Vernon Mauerycbccb052018-10-24 13:52:22 -070021#include <sdbusplus/asio/connection.hpp>
Vernon Maueryb1088062018-10-24 12:49:30 -070022#include <sdbusplus/timer.hpp>
Vernon Mauery9e801a22018-10-12 13:20:49 -070023#include <tuple>
24
Vernon Maueryfc37e592018-12-19 14:55:15 -080025using namespace phosphor::logging;
26
Tom Josephc35524e2016-08-29 08:17:59 -050027// Tuple of Global Singletons
Vernon Mauerycbccb052018-10-24 13:52:22 -070028static auto io = std::make_shared<boost::asio::io_context>();
Tom Josephc35524e2016-08-29 08:17:59 -050029session::Manager manager;
30command::Table table;
Vernon Mauerycbccb052018-10-24 13:52:22 -070031eventloop::EventLoop loop(io);
Vernon Mauery7e4a6512018-11-09 08:43:36 -080032sol::Manager solManager(io);
Tom Joseph52f53d72017-03-14 15:20:19 +053033
34std::tuple<session::Manager&, command::Table&, eventloop::EventLoop&,
Vernon Mauery9e801a22018-10-12 13:20:49 -070035 sol::Manager&>
36 singletonPool(manager, table, loop, solManager);
Tom Josephc35524e2016-08-29 08:17:59 -050037
38sd_bus* bus = nullptr;
Ratan Gupta166c71a2018-03-23 23:05:17 +053039sd_event* events = nullptr;
Marri Devender Rao3ecf0a12017-07-13 08:07:22 -050040
Ratan Gupta40801362018-03-12 16:21:37 +053041// Global timer for network changes
Vernon Maueryb1088062018-10-24 12:49:30 -070042std::unique_ptr<phosphor::Timer> networkTimer = nullptr;
Ratan Gupta40801362018-03-12 16:21:37 +053043
Tom069f01e2016-12-02 14:11:37 +053044FILE* ipmidbus = nullptr;
Jason M. Billsb00f8f72018-09-10 15:14:10 -070045static unsigned short selReservationID = 0xFFFF;
46static bool selReservationValid = false;
Tom069f01e2016-12-02 14:11:37 +053047sd_bus_slot* ipmid_slot = nullptr;
Tom Josephc35524e2016-08-29 08:17:59 -050048
Vernon Maueryd0062ed2018-10-25 09:36:06 -070049std::shared_ptr<sdbusplus::bus::bus> sdbusp;
50
Tom Josephc35524e2016-08-29 08:17:59 -050051/*
52 * @brief Required by apphandler IPMI Provider Library
53 */
54sd_bus* ipmid_get_sd_bus_connection()
55{
56 return bus;
57}
58
59/*
Vernon Maueryd0062ed2018-10-25 09:36:06 -070060 * @brief mechanism to get at sdbusplus object
61 */
62std::shared_ptr<sdbusplus::bus::bus> getSdBus()
63{
64 return sdbusp;
65}
66
67/*
Tom069f01e2016-12-02 14:11:37 +053068 * @brief Required by apphandler IPMI Provider Library
69 */
Ratan Gupta04edb9b2018-03-20 23:06:06 +053070sd_event* ipmid_get_sd_event_connection()
71{
Ratan Gupta166c71a2018-03-23 23:05:17 +053072 return events;
Ratan Gupta04edb9b2018-03-20 23:06:06 +053073}
74
75/*
76 * @brief Required by apphandler IPMI Provider Library
77 */
Jason M. Billsb00f8f72018-09-10 15:14:10 -070078unsigned short reserveSel(void)
Tom069f01e2016-12-02 14:11:37 +053079{
Jason M. Billsb00f8f72018-09-10 15:14:10 -070080 // IPMI spec, Reservation ID, the value simply increases against each
81 // execution of the Reserve SEL command.
Vernon Mauery9e801a22018-10-12 13:20:49 -070082 if (++selReservationID == 0)
83 {
Jason M. Billsb00f8f72018-09-10 15:14:10 -070084 selReservationID = 1;
85 }
86 selReservationValid = true;
87 return selReservationID;
88}
89
90/*
91 * @brief Required by apphandler IPMI Provider Library
92 */
93bool checkSELReservation(unsigned short id)
94{
95 return (selReservationValid && selReservationID == id);
96}
97
98/*
99 * @brief Required by apphandler IPMI Provider Library
100 */
101void cancelSELReservation(void)
102{
103 selReservationValid = false;
Tom069f01e2016-12-02 14:11:37 +0530104}
105
ssekard6f3f7d2018-08-16 17:30:28 +0530106EInterfaceIndex getInterfaceIndex(void)
107{
108 return interfaceLAN1;
109}
110
Vernon Mauerycc7b1cb2018-10-24 13:13:46 -0700111int main()
Tom Josephc35524e2016-08-29 08:17:59 -0500112{
Tom069f01e2016-12-02 14:11:37 +0530113 /*
114 * Required by apphandler IPMI Provider Library for logging.
115 */
Vernon Mauery9e801a22018-10-12 13:20:49 -0700116 ipmidbus = fopen("/dev/null", "w");
Tom069f01e2016-12-02 14:11:37 +0530117
Tom Josephc35524e2016-08-29 08:17:59 -0500118 // Connect to system bus
Vernon Mauery96a1a392018-11-08 16:54:23 -0800119 auto rc = sd_bus_default_system(&bus);
Tom Josephc35524e2016-08-29 08:17:59 -0500120 if (rc < 0)
121 {
Vernon Maueryfc37e592018-12-19 14:55:15 -0800122 log<level::ERR>("Failed to connect to system bus",
123 entry("ERROR=%s", strerror(-rc)));
Vernon Mauerycbccb052018-10-24 13:52:22 -0700124 return rc;
Tom Josephc35524e2016-08-29 08:17:59 -0500125 }
126
Ratan Gupta166c71a2018-03-23 23:05:17 +0530127 /* Get an sd event handler */
128 rc = sd_event_default(&events);
129 if (rc < 0)
130 {
Vernon Maueryfc37e592018-12-19 14:55:15 -0800131 log<level::ERR>("Failure to create sd_event",
132 entry("ERROR=%s", strerror(-rc)));
Vernon Maueryd0062ed2018-10-25 09:36:06 -0700133 return EXIT_FAILURE;
Ratan Gupta166c71a2018-03-23 23:05:17 +0530134 }
Vernon Mauerycbccb052018-10-24 13:52:22 -0700135 sdbusp = std::make_shared<sdbusplus::asio::connection>(*io, bus);
Ratan Gupta166c71a2018-03-23 23:05:17 +0530136
Tom Joseph83029cb2017-09-01 16:37:31 +0530137 // Register callback to update cache for a GUID change and cache the GUID
138 command::registerGUIDChangeCallback();
139 cache::guid = command::getSystemGUID();
140
Tom485038e2016-12-02 13:44:45 +0530141 // Register all the IPMI provider libraries applicable for net-ipmid
142 provider::registerCallbackHandlers(NET_IPMID_LIB_PATH);
143
Tom Josephc35524e2016-08-29 08:17:59 -0500144 // Register the phosphor-net-ipmid session setup commands
145 command::sessionSetupCommands();
146
Tom Joseph89481cf2017-04-03 02:11:34 +0530147 // Register the phosphor-net-ipmid SOL commands
148 sol::command::registerCommands();
149
Tom Josephc35524e2016-08-29 08:17:59 -0500150 // Start Event Loop
Vernon Mauerycbccb052018-10-24 13:52:22 -0700151 return std::get<eventloop::EventLoop&>(singletonPool).startEventLoop();
Tom Josephc35524e2016-08-29 08:17:59 -0500152}