From b12b0c011f41d3cad863b19285f710aec5000748 Mon Sep 17 00:00:00 2001 From: Vishwanatha Subbanna Date: Tue, 7 Mar 2017 18:17:19 +0530 Subject: Update chassis command handler to use state manager services Until now, IPMI chassis command handler was utilising services from chassis_control script and this patch makes a transition to use the services from the latest State Manager daemon. Fixes openbmc/openbmc#1238 Change-Id: Ic075971bbda44829a3ebe9c0c1de3053a8e97cfa Signed-off-by: Vishwanatha Subbanna --- Makefile.am | 4 +-- chassishandler.cpp | 74 ++++++++++++++++++++++++++++++++---------------------- configure.ac | 1 + 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/Makefile.am b/Makefile.am index 6c934ef..ef4cdc5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -31,8 +31,8 @@ libapphandler_la_SOURCES = \ transporthandler.cpp \ globalhandler.cpp \ groupext.cpp -libapphandler_la_LDFLAGS = $(SYSTEMD_LIBS) $(libmapper_LIBS) $(PHOSPHOR_LOGGING_LIBS) -version-info 0:0:0 -shared -libapphandler_la_CXXFLAGS = $(SYSTEMD_CFLAGS) $(libmapper_CFLAGS) $(PHOSPHOR_LOGGING_CFLAGS) +libapphandler_la_LDFLAGS = $(SYSTEMD_LIBS) $(libmapper_LIBS) $(PHOSPHOR_LOGGING_LIBS) $(PHOSPHOR_DBUS_INTERFACES_LIBS) -version-info 0:0:0 -shared +libapphandler_la_CXXFLAGS = $(SYSTEMD_CFLAGS) $(libmapper_CFLAGS) $(PHOSPHOR_LOGGING_CFLAGS) $(PHOSPHOR_DBUS_INTERFACES_CFLAGS) libsysintfcmdsdir = ${libdir}/ipmid-providers libsysintfcmds_LTLIBRARIES = libsysintfcmds.la diff --git a/chassishandler.cpp b/chassishandler.cpp index b2d4d2b..b2a1e7c 100644 --- a/chassishandler.cpp +++ b/chassishandler.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include //Defines #define SET_PARM_VERSION 0x01 @@ -42,9 +44,6 @@ static constexpr size_t PREFIX_OFFSET = 21; static constexpr size_t GATEWAY_OFFSET = 22; -// OpenBMC Chassis Manager dbus framework -const char *chassis_object_name = "/org/openbmc/control/chassis0"; -const char *chassis_intf_name = "org.openbmc.control.Chassis"; void register_netfn_chassis_functions() __attribute__((constructor)); @@ -73,6 +72,9 @@ typedef struct uint8_t front_panel_button_cap_status; }__attribute__((packed)) ipmi_get_chassis_status_t; +// Phosphor Host State manager +namespace State = sdbusplus::xyz::openbmc_project::State::server; + int dbus_get_property(const char *name, char **buf) { sd_bus_error error = SD_BUS_ERROR_NULL; @@ -562,11 +564,19 @@ ipmi_ret_t ipmi_get_chassis_cap(ipmi_netfn_t netfn, ipmi_cmd_t cmd, return rc; } -//------------------------------------------------------------ -// Calls into Chassis Control Dbus object to do the power off -//------------------------------------------------------------ -int ipmi_chassis_power_control(const char *method) +//------------------------------------------ +// Calls into Host State Manager Dbus object +//------------------------------------------ +int initiate_state_transition(State::Host::Transition transition) { + using namespace phosphor::logging; + + // OpenBMC Host State Manager dbus framework + constexpr auto HOST_STATE_MANAGER_ROOT = "/xyz/openbmc_project/state/host0"; + constexpr auto HOST_STATE_MANAGER_IFACE = "xyz.openbmc_project.State.Host"; + constexpr auto DBUS_PROPERTY_IFACE = "org.freedesktop.DBus.Properties"; + constexpr auto PROPERTY = "RequestedHostTransition"; + // sd_bus error int rc = 0; char *busname = NULL; @@ -574,38 +584,42 @@ int ipmi_chassis_power_control(const char *method) // SD Bus error report mechanism. sd_bus_error bus_error = SD_BUS_ERROR_NULL; - // Response from the call. Although there is no response for this call, - // obligated to mention this to make compiler happy. - sd_bus_message *response = NULL; - // Gets a hook onto either a SYSTEM or SESSION bus sd_bus *bus_type = ipmid_get_sd_bus_connection(); - rc = mapper_get_service(bus_type, chassis_object_name, &busname); + rc = mapper_get_service(bus_type, HOST_STATE_MANAGER_ROOT, &busname); if (rc < 0) { - fprintf(stderr, "Failed to get %s bus name: %s\n", - chassis_object_name, strerror(-rc)); - goto finish; + log("Failed to get bus name", + entry("ERROR=%s, OBJPATH=%s", + strerror(-rc), HOST_STATE_MANAGER_ROOT)); + return rc; } - rc = sd_bus_call_method(bus_type, // On the System Bus - busname, // Service to contact - chassis_object_name, // Object path - chassis_intf_name, // Interface name - method, // Method to be called - &bus_error, // object to return error - &response, // Response buffer if any - NULL); // No input arguments + + // Convert to string equivalent of the passed in transition enum. + auto request = State::convertForMessage(transition); + + rc = sd_bus_call_method(bus_type, // On the system bus + busname, // Service to contact + HOST_STATE_MANAGER_ROOT, // Object path + DBUS_PROPERTY_IFACE, // Interface name + "Set", // Method to be called + &bus_error, // object to return error + nullptr, // Response buffer if any + "ssv", // Takes 3 arguments + HOST_STATE_MANAGER_IFACE, + PROPERTY, + "s", request.c_str()); if(rc < 0) { - fprintf(stderr,"ERROR initiating Power Off:[%s]\n",bus_error.message); + log("Failed to initiate transition", + entry("ERROR=%s, REQUEST=%s", + bus_error.message, request.c_str())); } else { - printf("Chassis Power Off initiated successfully\n"); + log("Transition request initiated successfully"); } -finish: sd_bus_error_free(&bus_error); - sd_bus_message_unref(response); free(busname); return rc; @@ -804,17 +818,17 @@ ipmi_ret_t ipmi_chassis_control(ipmi_netfn_t netfn, ipmi_cmd_t cmd, switch(chassis_ctrl_cmd) { case CMD_POWER_ON: - rc = ipmi_chassis_power_control("powerOn"); + rc = initiate_state_transition(State::Host::Transition::On); break; case CMD_POWER_OFF: - rc = ipmi_chassis_power_control("powerOff"); + rc = initiate_state_transition(State::Host::Transition::Off); break; case CMD_HARD_RESET: case CMD_POWER_CYCLE: // SPEC has a section that says certain implementations can trigger // PowerOn if power is Off when a command to power cycle is // requested - rc = ipmi_chassis_power_control("reboot"); + rc = initiate_state_transition(State::Host::Transition::Reboot); break; default: { diff --git a/configure.ac b/configure.ac index f9acc0f..4ffc554 100644 --- a/configure.ac +++ b/configure.ac @@ -16,6 +16,7 @@ AC_PROG_MAKE_SET AC_CHECK_LIB([mapper], [mapper_get_service], ,[AC_MSG_ERROR([Could not find libmapper...openbmc/phosphor-objmgr package required])]) PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 221]) PKG_CHECK_MODULES([PHOSPHOR_LOGGING], [phosphor-logging],, [AC_MSG_ERROR([Could not find phosphor-logging...openbmc/phosphor-logging package required])]) +PKG_CHECK_MODULES([PHOSPHOR_DBUS_INTERFACES], [phosphor-dbus-interfaces],, [AC_MSG_ERROR([Could not find phosphor-dbus-interfaces...openbmc/phosphor-dbus-interfaces package required])]) # Checks for header files. AC_CHECK_HEADER(systemd/sd-bus.h, ,[AC_MSG_ERROR([Could not find systemd/sd-bus.h...systemd developement package required])]) -- cgit v1.2.1