1 #include "globalhandler.h"
2 
3 #include <stdio.h>
4 
5 #include <phosphor-logging/elog-errors.hpp>
6 #include <phosphor-logging/log.hpp>
7 #include <string>
8 #include <utils.hpp>
9 #include <xyz/openbmc_project/Common/error.hpp>
10 #include <xyz/openbmc_project/State/BMC/server.hpp>
11 
12 #include "host-ipmid/ipmid-api.h"
13 
14 static constexpr auto bmcStateRoot = "/xyz/openbmc_project/state";
15 static constexpr auto bmcStateIntf = "xyz.openbmc_project.State.BMC";
16 static constexpr auto reqTransition = "RequestedBMCTransition";
17 static constexpr auto match = "bmc0";
18 
19 using namespace phosphor::logging;
20 using BMC = sdbusplus::xyz::openbmc_project::State::server::BMC;
21 
22 void register_netfn_global_functions() __attribute__((constructor));
23 
24 void resetBMC()
25 {
26     sdbusplus::bus::bus bus{ipmid_get_sd_bus_connection()};
27 
28     auto bmcStateObj =
29         ipmi::getDbusObject(bus, bmcStateIntf, bmcStateRoot, match);
30 
31     auto service = ipmi::getService(bus, bmcStateIntf, bmcStateObj.first);
32 
33     ipmi::setDbusProperty(bus, service, bmcStateObj.first, bmcStateIntf,
34                           reqTransition,
35                           convertForMessage(BMC::Transition::Reboot));
36 }
37 
38 ipmi_ret_t ipmi_global_reset(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
39                              ipmi_request_t request, ipmi_response_t response,
40                              ipmi_data_len_t data_len, ipmi_context_t context)
41 {
42     try
43     {
44         resetBMC();
45     }
46     catch (std::exception& e)
47     {
48         log<level::ERR>(e.what());
49         return IPMI_CC_UNSPECIFIED_ERROR;
50     }
51 
52     // Status code.
53     ipmi_ret_t rc = IPMI_CC_OK;
54     *data_len = 0;
55     return rc;
56 }
57 
58 void register_netfn_global_functions()
59 {
60     // Cold Reset
61     ipmi_register_callback(NETFUN_APP, IPMI_CMD_COLD_RESET, NULL,
62                            ipmi_global_reset, PRIVILEGE_ADMIN);
63 
64     // <Warm Reset>
65     ipmi_register_callback(NETFUN_APP, IPMI_CMD_WARM_RESET, NULL,
66                            ipmi_global_reset, PRIVILEGE_ADMIN);
67 
68     return;
69 }
70