blob: c3f3dfd4418c4271d60f2f4bbd73bdc0c15f5b08 [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>
15#include <host-ipmid/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
20#include <iostream>
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
Tom Josephc35524e2016-08-29 08:17:59 -050025// Tuple of Global Singletons
Vernon Mauerycbccb052018-10-24 13:52:22 -070026static auto io = std::make_shared<boost::asio::io_context>();
Tom Josephc35524e2016-08-29 08:17:59 -050027session::Manager manager;
28command::Table table;
Vernon Mauerycbccb052018-10-24 13:52:22 -070029eventloop::EventLoop loop(io);
Tom Joseph52f53d72017-03-14 15:20:19 +053030sol::Manager solManager;
31
32std::tuple<session::Manager&, command::Table&, eventloop::EventLoop&,
Vernon Mauery9e801a22018-10-12 13:20:49 -070033 sol::Manager&>
34 singletonPool(manager, table, loop, solManager);
Tom Josephc35524e2016-08-29 08:17:59 -050035
36sd_bus* bus = nullptr;
Ratan Gupta166c71a2018-03-23 23:05:17 +053037sd_event* events = nullptr;
Marri Devender Rao3ecf0a12017-07-13 08:07:22 -050038
Ratan Gupta40801362018-03-12 16:21:37 +053039// Global timer for network changes
Vernon Maueryb1088062018-10-24 12:49:30 -070040std::unique_ptr<phosphor::Timer> networkTimer = nullptr;
Ratan Gupta40801362018-03-12 16:21:37 +053041
Tom069f01e2016-12-02 14:11:37 +053042FILE* ipmidbus = nullptr;
Jason M. Billsb00f8f72018-09-10 15:14:10 -070043static unsigned short selReservationID = 0xFFFF;
44static bool selReservationValid = false;
Tom069f01e2016-12-02 14:11:37 +053045sd_bus_slot* ipmid_slot = nullptr;
Tom Josephc35524e2016-08-29 08:17:59 -050046
Vernon Maueryd0062ed2018-10-25 09:36:06 -070047std::shared_ptr<sdbusplus::bus::bus> sdbusp;
48
Tom Josephc35524e2016-08-29 08:17:59 -050049/*
50 * @brief Required by apphandler IPMI Provider Library
51 */
52sd_bus* ipmid_get_sd_bus_connection()
53{
54 return bus;
55}
56
57/*
Vernon Maueryd0062ed2018-10-25 09:36:06 -070058 * @brief mechanism to get at sdbusplus object
59 */
60std::shared_ptr<sdbusplus::bus::bus> getSdBus()
61{
62 return sdbusp;
63}
64
65/*
Tom069f01e2016-12-02 14:11:37 +053066 * @brief Required by apphandler IPMI Provider Library
67 */
Ratan Gupta04edb9b2018-03-20 23:06:06 +053068sd_event* ipmid_get_sd_event_connection()
69{
Ratan Gupta166c71a2018-03-23 23:05:17 +053070 return events;
Ratan Gupta04edb9b2018-03-20 23:06:06 +053071}
72
73/*
74 * @brief Required by apphandler IPMI Provider Library
75 */
Jason M. Billsb00f8f72018-09-10 15:14:10 -070076unsigned short reserveSel(void)
Tom069f01e2016-12-02 14:11:37 +053077{
Jason M. Billsb00f8f72018-09-10 15:14:10 -070078 // IPMI spec, Reservation ID, the value simply increases against each
79 // execution of the Reserve SEL command.
Vernon Mauery9e801a22018-10-12 13:20:49 -070080 if (++selReservationID == 0)
81 {
Jason M. Billsb00f8f72018-09-10 15:14:10 -070082 selReservationID = 1;
83 }
84 selReservationValid = true;
85 return selReservationID;
86}
87
88/*
89 * @brief Required by apphandler IPMI Provider Library
90 */
91bool checkSELReservation(unsigned short id)
92{
93 return (selReservationValid && selReservationID == id);
94}
95
96/*
97 * @brief Required by apphandler IPMI Provider Library
98 */
99void cancelSELReservation(void)
100{
101 selReservationValid = false;
Tom069f01e2016-12-02 14:11:37 +0530102}
103
ssekard6f3f7d2018-08-16 17:30:28 +0530104EInterfaceIndex getInterfaceIndex(void)
105{
106 return interfaceLAN1;
107}
108
Vernon Mauerycc7b1cb2018-10-24 13:13:46 -0700109int main()
Tom Josephc35524e2016-08-29 08:17:59 -0500110{
Tom069f01e2016-12-02 14:11:37 +0530111 /*
112 * Required by apphandler IPMI Provider Library for logging.
113 */
Vernon Mauery9e801a22018-10-12 13:20:49 -0700114 ipmidbus = fopen("/dev/null", "w");
Tom069f01e2016-12-02 14:11:37 +0530115
Tom Josephc35524e2016-08-29 08:17:59 -0500116 // Connect to system bus
Vernon Mauery96a1a392018-11-08 16:54:23 -0800117 auto rc = sd_bus_default_system(&bus);
Tom Josephc35524e2016-08-29 08:17:59 -0500118 if (rc < 0)
119 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700120 std::cerr << "Failed to connect to system bus:" << strerror(-rc)
121 << "\n";
Vernon Mauerycbccb052018-10-24 13:52:22 -0700122 return rc;
Tom Josephc35524e2016-08-29 08:17:59 -0500123 }
124
Ratan Gupta166c71a2018-03-23 23:05:17 +0530125 /* Get an sd event handler */
126 rc = sd_event_default(&events);
127 if (rc < 0)
128 {
Vernon Mauery9e801a22018-10-12 13:20:49 -0700129 std::cerr << "Failure to create sd_event" << strerror(-rc) << "\n";
Vernon Maueryd0062ed2018-10-25 09:36:06 -0700130 return EXIT_FAILURE;
Ratan Gupta166c71a2018-03-23 23:05:17 +0530131 }
Vernon Mauerycbccb052018-10-24 13:52:22 -0700132 sdbusp = std::make_shared<sdbusplus::asio::connection>(*io, bus);
Ratan Gupta166c71a2018-03-23 23:05:17 +0530133
Tom Joseph83029cb2017-09-01 16:37:31 +0530134 // Register callback to update cache for a GUID change and cache the GUID
135 command::registerGUIDChangeCallback();
136 cache::guid = command::getSystemGUID();
137
Tom485038e2016-12-02 13:44:45 +0530138 // Register all the IPMI provider libraries applicable for net-ipmid
139 provider::registerCallbackHandlers(NET_IPMID_LIB_PATH);
140
Tom Josephc35524e2016-08-29 08:17:59 -0500141 // Register the phosphor-net-ipmid session setup commands
142 command::sessionSetupCommands();
143
Tom Joseph89481cf2017-04-03 02:11:34 +0530144 // Register the phosphor-net-ipmid SOL commands
145 sol::command::registerCommands();
146
Tom Josephc35524e2016-08-29 08:17:59 -0500147 // Start Event Loop
Vernon Mauerycbccb052018-10-24 13:52:22 -0700148 return std::get<eventloop::EventLoop&>(singletonPool).startEventLoop();
Tom Josephc35524e2016-08-29 08:17:59 -0500149}