summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergey Solomin <sergey.solomin@us.ibm.com>2016-08-23 09:07:28 -0500
committerSergey Solomin <sergey.solomin@us.ibm.com>2016-08-25 13:37:57 -0500
commiteb9b814403895d6435e04f02a9ff6c2b1b02cf54 (patch)
tree4a1713845844f874799a1b188db209adeaa3e085
parentbc40c178bb0b345ed1edf553b94369330003af34 (diff)
downloadphosphor-host-ipmid-eb9b814403895d6435e04f02a9ff6c2b1b02cf54.tar.gz
phosphor-host-ipmid-eb9b814403895d6435e04f02a9ff6c2b1b02cf54.zip
Hard-coded service name replaced with call to ObjectMapper
In the openbmc code, the dbus service name is hardcoded. The ObjectMapper provides a way to find out the service name by issuing a GetObject method call to the ObjectMapper. That functionality is implemented in mapper.c The output of the call to the mapper is a service name. Resolves openbmc/openbmc#319. Change-Id: I724a31ede6bdf3ae4b361e730857b1f2696a8966 Signed-off-by: Sergey Solomin <sergey.solomin@us.ibm.com>
-rw-r--r--apphandler.cpp39
-rw-r--r--chassishandler.cpp22
-rw-r--r--host-services.c11
-rw-r--r--ipmid.cpp12
-rw-r--r--storageaddsel.cpp15
-rw-r--r--testaddsel.cpp12
-rw-r--r--transporthandler.cpp24
7 files changed, 107 insertions, 28 deletions
diff --git a/apphandler.cpp b/apphandler.cpp
index d5ebe2e..4a77cfa 100644
--- a/apphandler.cpp
+++ b/apphandler.cpp
@@ -5,6 +5,7 @@
#include <string.h>
#include <stdint.h>
#include <systemd/sd-bus.h>
+#include <mapper.h>
#include <array>
extern sd_bus *bus;
@@ -173,10 +174,10 @@ ipmi_ret_t ipmi_app_get_device_id(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
ipmi_data_len_t data_len, ipmi_context_t context)
{
ipmi_ret_t rc = IPMI_CC_OK;
- const char *busname = "org.openbmc.Inventory";
const char *objname = "/org/openbmc/inventory/system/chassis/motherboard/bmc";
const char *iface = "org.openbmc.InventoryItem";
char *ver = NULL;
+ char *busname = NULL;
int r;
rev_t rev = {0};
ipmi_device_id_t dev_id{};
@@ -194,6 +195,11 @@ ipmi_ret_t ipmi_app_get_device_id(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
dev_id.revision = 0x80;
// Firmware revision is already implemented, so get it from appropriate position.
+ r = mapper_get_service(bus, objname, &busname);
+ if (r < 0) {
+ fprintf(stderr, "Failed to get bus name, return value: %s.\n", strerror(-r));
+ goto finish;
+ }
r = sd_bus_get_property_string(bus,busname,objname,iface,"version", NULL, &ver);
if ( r < 0 ) {
fprintf(stderr, "Failed to obtain version property: %s\n", strerror(-r));
@@ -242,6 +248,8 @@ ipmi_ret_t ipmi_app_get_device_id(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
// Pack the actual response
memcpy(response, &dev_id, *data_len);
+finish:
+ free(busname);
return rc;
}
@@ -249,7 +257,6 @@ ipmi_ret_t ipmi_app_get_device_guid(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
ipmi_request_t request, ipmi_response_t response,
ipmi_data_len_t data_len, ipmi_context_t context)
{
- const char *busname = "org.openbmc.control.Chassis";
const char *objname = "/org/openbmc/control/chassis0";
const char *iface = "org.freedesktop.DBus.Properties";
const char *chassis_iface = "org.openbmc.control.Chassis";
@@ -257,6 +264,7 @@ ipmi_ret_t ipmi_app_get_device_guid(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
sd_bus_error error = SD_BUS_ERROR_NULL;
int r = 0;
char *uuid = NULL;
+ char *busname = NULL;
// UUID is in RFC4122 format. Ex: 61a39523-78f2-11e5-9862-e6402cfc3223
// Per IPMI Spec 2.0 need to convert to 16 hex bytes and reverse the byte order
@@ -276,6 +284,11 @@ ipmi_ret_t ipmi_app_get_device_guid(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
printf("IPMI GET DEVICE GUID\n");
// Call Get properties method with the interface and property name
+ r = mapper_get_service(bus, objname, &busname);
+ if (r < 0) {
+ fprintf(stderr, "Failed to get bus name, return value: %s.\n", strerror(-r));
+ goto finish;
+ }
r = sd_bus_call_method(bus,busname,objname,iface,
"Get",&error, &reply, "ss",
chassis_iface, "uuid");
@@ -333,6 +346,7 @@ ipmi_ret_t ipmi_app_get_device_guid(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
finish:
sd_bus_error_free(&error);
reply = sd_bus_message_unref(reply);
+ free(busname);
return rc;
}
@@ -373,7 +387,6 @@ ipmi_ret_t ipmi_app_set_watchdog(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
ipmi_request_t request, ipmi_response_t response,
ipmi_data_len_t data_len, ipmi_context_t context)
{
- const char *busname = "org.openbmc.watchdog.Host";
const char *objname = "/org/openbmc/watchdog/host0";
const char *iface = "org.openbmc.Watchdog";
sd_bus_message *reply = NULL;
@@ -383,7 +396,7 @@ ipmi_ret_t ipmi_app_set_watchdog(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
set_wd_data_t *reqptr = (set_wd_data_t*) request;
uint16_t timer = 0;
uint32_t timer_ms = 0;
-
+ char *busname = NULL;
*data_len = 0;
// Get number of 100ms intervals
@@ -393,6 +406,12 @@ ipmi_ret_t ipmi_app_set_watchdog(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
printf("WATCHDOG SET Timer:[0x%X] 100ms intervals\n",timer);
+ // Get bus name
+ r = mapper_get_service(bus, objname, &busname);
+ if (r < 0) {
+ fprintf(stderr, "Failed to get bus name, return value: %s.\n", strerror(-r));
+ goto finish;
+ }
// Set watchdog timer
r = sd_bus_call_method(bus, busname, objname, iface,
"set", &error, &reply, "i", timer_ms);
@@ -431,6 +450,7 @@ ipmi_ret_t ipmi_app_set_watchdog(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
finish:
sd_bus_error_free(&error);
reply = sd_bus_message_unref(reply);
+ free(busname);
return (r < 0) ? -1 : IPMI_CC_OK;
}
@@ -440,19 +460,24 @@ ipmi_ret_t ipmi_app_reset_watchdog(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
ipmi_request_t request, ipmi_response_t response,
ipmi_data_len_t data_len, ipmi_context_t context)
{
- const char *busname = "org.openbmc.watchdog.Host";
const char *objname = "/org/openbmc/watchdog/host0";
const char *iface = "org.openbmc.Watchdog";
sd_bus_message *reply = NULL;
sd_bus_error error = SD_BUS_ERROR_NULL;
int r = 0;
+ char *busname = NULL;
// Status code.
ipmi_ret_t rc = IPMI_CC_OK;
*data_len = 0;
printf("WATCHDOG RESET\n");
-
+ // Get bus name
+ r = mapper_get_service(bus, objname, &busname);
+ if (r < 0) {
+ fprintf(stderr, "Failed to get bus name, return value: %s.\n", strerror(-r));
+ goto finish;
+ }
// Refresh watchdog
r = sd_bus_call_method(bus, busname, objname, iface,
"poke", &error, &reply, NULL);
@@ -461,8 +486,10 @@ ipmi_ret_t ipmi_app_reset_watchdog(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
rc = -1;
}
+finish:
sd_bus_error_free(&error);
reply = sd_bus_message_unref(reply);
+ free(busname);
return rc;
}
diff --git a/chassishandler.cpp b/chassishandler.cpp
index ded9157..92d9752 100644
--- a/chassishandler.cpp
+++ b/chassishandler.cpp
@@ -15,7 +15,6 @@
// OpenBMC Chassis Manager dbus framework
-const char *chassis_bus_name = "org.openbmc.control.Chassis";
const char *chassis_object_name = "/org/openbmc/control/chassis0";
const char *chassis_intf_name = "org.openbmc.control.Chassis";
@@ -42,7 +41,7 @@ int dbus_get_property(const char *name, char **buf)
r = mapper_get_service(bus, settings_object_name, &connection);
if (r < 0) {
- fprintf(stderr, "Failed to get connection, return value: %d.\n", r);
+ fprintf(stderr, "Failed to get connection, return value: %s.\n", strerror(-r));
goto finish;
}
@@ -107,7 +106,7 @@ int dbus_set_property(const char * name, const char *value)
r = mapper_get_service(bus, settings_object_name, &connection);
if (r < 0) {
- fprintf(stderr, "Failed to get connection, return value: %d.\n", r);
+ fprintf(stderr, "Failed to get connection, return value: %s.\n", strerror(-r));
goto finish;
}
@@ -180,9 +179,10 @@ int ipmi_chassis_power_control(const char *method)
{
// sd_bus error
int rc = 0;
+ char *busname = NULL;
- // SD Bus error report mechanism.
- sd_bus_error bus_error = SD_BUS_ERROR_NULL;
+ // 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.
@@ -190,9 +190,13 @@ int ipmi_chassis_power_control(const char *method)
// 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);
+ if (rc < 0) {
+ fprintf(stderr, "Failed to get bus name, return value: %s.\n", strerror(-rc));
+ goto finish;
+ }
rc = sd_bus_call_method(bus_type, // On the System Bus
- chassis_bus_name, // Service to contact
+ busname, // Service to contact
chassis_object_name, // Object path
chassis_intf_name, // Interface name
method, // Method to be called
@@ -208,10 +212,12 @@ int ipmi_chassis_power_control(const char *method)
printf("Chassis Power Off initiated successfully\n");
}
+finish:
sd_bus_error_free(&bus_error);
sd_bus_message_unref(response);
+ free(busname);
- return rc;
+ return rc;
}
diff --git a/host-services.c b/host-services.c
index cc47439..78ad4c3 100644
--- a/host-services.c
+++ b/host-services.c
@@ -2,13 +2,12 @@
#include <stdlib.h>
#include <errno.h>
#include <systemd/sd-bus.h>
-
+#include <mapper.h>
#include "ipmid-api.h"
void register_host_services() __attribute__((constructor));
// OpenBMC Host IPMI dbus framework
-const char *bus_name = "org.openbmc.HostIpmi";
const char *object_name = "/org/openbmc/HostIpmi/1";
const char *intf_name = "org.openbmc.HostIpmi";
@@ -19,6 +18,7 @@ static int soft_power_off(sd_bus_message *m, void *userdata, sd_bus_error *ret_e
{
int64_t bt_resp = -1;
int rc = 0;
+ char *bus_name = NULL;
// Steps to be taken when we get this.
// 1: Send a SMS_ATN to the Host
@@ -43,7 +43,11 @@ static int soft_power_off(sd_bus_message *m, void *userdata, sd_bus_error *ret_e
// Gets a hook onto either a SYSTEM or SESSION bus
sd_bus *bus = ipmid_get_sd_bus_connection();
-
+ rc = mapper_get_service(bus, object_name, &bus_name);
+ if (rc < 0) {
+ fprintf(stderr, "Failed to get bus name, return value: %s.\n", strerror(-rc));
+ goto finish;
+ }
rc = sd_bus_call_method(bus, // In the System Bus
bus_name, // Service to contact
object_name, // Object path
@@ -69,6 +73,7 @@ static int soft_power_off(sd_bus_message *m, void *userdata, sd_bus_error *ret_e
finish:
sd_bus_error_free(&bus_error);
response = sd_bus_message_unref(response);
+ free(bus_name);
if(rc < 0)
{
diff --git a/ipmid.cpp b/ipmid.cpp
index 7848afe..31608e9 100644
--- a/ipmid.cpp
+++ b/ipmid.cpp
@@ -35,7 +35,6 @@ void print_usage(void) {
}
// Host settings in DBUS
-constexpr char settings_host_bus[] = "org.openbmc.settings.Host";
constexpr char settings_host_object[] = "/org/openbmc/settings/host0";
constexpr char settings_host_intf[] = "org.freedesktop.DBus.Properties";
@@ -271,16 +270,22 @@ void cache_restricted_mode()
sd_bus_message *reply = NULL;
sd_bus_error error = SD_BUS_ERROR_NULL;
int rc = 0;
+ char *busname = NULL;
+ rc = mapper_get_service(bus, settings_host_object, &busname);
+ if (rc < 0) {
+ fprintf(stderr, "Failed to get HOST busname: %s\n", strerror(-rc));
+ goto cleanup;
+ }
rc = sd_bus_call_method(bus,
- settings_host_bus,
+ busname,
settings_host_object,
settings_host_intf,
"Get",
&error,
&reply,
"ss",
- settings_host_bus,
+ "org.openbmc.settings.Host",
"restricted_mode");
if(rc < 0)
{
@@ -303,6 +308,7 @@ void cache_restricted_mode()
cleanup:
sd_bus_error_free(&error);
reply = sd_bus_message_unref(reply);
+ free(busname);
}
static int handle_restricted_mode_change(sd_bus_message *m, void *user_data,
diff --git a/storageaddsel.cpp b/storageaddsel.cpp
index 3343772..9d15a49 100644
--- a/storageaddsel.cpp
+++ b/storageaddsel.cpp
@@ -7,7 +7,7 @@
#include <vector>
#include <memory>
#include <systemd/sd-bus.h>
-
+#include <mapper.h>
#include "ipmid.H"
#include "storagehandler.h"
#include "sensorhandler.h"
@@ -179,12 +179,18 @@ int send_esel_to_dbus(const char *desc, const char *sev, const char *details, ui
sd_bus_message *reply = NULL, *m=NULL;
uint16_t x;
int r;
+ const char *object_name = "/org/openbmc/records/events";
+ char *bus_name = NULL;
mbus = ipmid_get_sd_bus_connection();
-
+ r = mapper_get_service(mbus, object_name, &bus_name);
+ if (r < 0) {
+ fprintf(stderr, "Failed to get connection, return value: %s.\n", strerror(-r));
+ goto finish;
+ }
r = sd_bus_message_new_method_call(mbus,&m,
- "org.openbmc.records.events",
- "/org/openbmc/records/events",
+ bus_name,
+ object_name,
"org.openbmc.recordlog",
"acceptHostMessage");
if (r < 0) {
@@ -218,6 +224,7 @@ finish:
sd_bus_error_free(&error);
m = sd_bus_message_unref(m);
reply = sd_bus_message_unref(reply);
+ free (bus_name);
return r;
}
diff --git a/testaddsel.cpp b/testaddsel.cpp
index 202200a..9fd9d35 100644
--- a/testaddsel.cpp
+++ b/testaddsel.cpp
@@ -5,6 +5,7 @@
#include <stdint.h>
#include <systemd/sd-bus.h>
#include "sensorhandler.h"
+#include <mapper.h>
extern void send_esel(uint16_t recordid);
@@ -16,15 +17,19 @@ sd_bus *bus = NULL;
// step for mapping IPMI
int find_openbmc_path(const char *type, const uint8_t num, dbus_interface_t *interface) {
- const char *busname = "org.openbmc.managers.System";
const char *objname = "/org/openbmc/managers/System";
char *str1, *str2, *str3;
sd_bus_error error = SD_BUS_ERROR_NULL;
sd_bus_message *reply = NULL, *m=NULL;
-
-
int r;
+ char *busname = NULL;
+
+ r = mapper_get_service(bus, objname, &busname);
+ if (r < 0) {
+ fprintf(stderr, "Failed to get busname: %s\n", strerror(-r));
+ goto final;
+ }
r = sd_bus_message_new_method_call(bus,&m,busname,objname,busname,"getObjectFromByteId");
if (r < 0) {
@@ -60,6 +65,7 @@ final:
sd_bus_error_free(&error);
sd_bus_message_unref(m);
+ free (busname);
return r;
}
diff --git a/transporthandler.cpp b/transporthandler.cpp
index 3b4cf07..5bb5355 100644
--- a/transporthandler.cpp
+++ b/transporthandler.cpp
@@ -12,10 +12,10 @@
#ifdef SYSTEMD_NETWORKD_DBUS
#include <systemd/sd-bus.h>
+#include <mapper.h>
#endif
// OpenBMC System Manager dbus framework
-const char *app = "org.openbmc.NetworkManager";
const char *obj = "/org/openbmc/NetworkManager/Interface";
const char *ifc = "org.openbmc.NetworkManager";
@@ -53,7 +53,13 @@ ipmi_ret_t getNetworkData(uint8_t lan_param, uint8_t * data)
char* gateway = NULL;
int r = 0;
ipmi_ret_t rc = IPMI_CC_OK;
+ char *app = NULL;
+ r = mapper_get_service(bus, obj, &app);
+ if (r < 0) {
+ fprintf(stderr, "Failed to get bus name, return value: %s.\n", strerror(-r));
+ goto cleanup;
+ }
r = sd_bus_call_method(bus, app, obj, ifc, "GetAddress4", &error,
&reply, "s", nwinterface);
if(r < 0)
@@ -118,6 +124,7 @@ ipmi_ret_t getNetworkData(uint8_t lan_param, uint8_t * data)
cleanup:
sd_bus_error_free(&error);
reply = sd_bus_message_unref(reply);
+ free(app);
return rc;
}
@@ -149,6 +156,7 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
sd_bus_message *reply = NULL;
sd_bus_error error = SD_BUS_ERROR_NULL;
int r = 0;
+ char *app = NULL;
printf("IPMI SET_LAN\n");
@@ -175,6 +183,11 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
reqptr->data[4],
reqptr->data[5]);
+ r = mapper_get_service(bus, obj, &app);
+ if (r < 0) {
+ fprintf(stderr, "Failed to get bus name, return value: %s.\n", strerror(-r));
+ goto finish;
+ }
r = sd_bus_call_method(bus, app, obj, ifc, "SetHwAddress", &error,
&reply, "ss", nwinterface, mac);
if(r < 0)
@@ -239,8 +252,10 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
rc = IPMI_CC_PARM_NOT_SUPPORTED;
}
+finish:
sd_bus_error_free(&error);
reply = sd_bus_message_unref(reply);
+ free(app);
return rc;
}
@@ -264,6 +279,7 @@ ipmi_ret_t ipmi_transport_get_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
int r = 0;
const uint8_t current_revision = 0x11; // Current rev per IPMI Spec 2.0
int i = 0;
+ char *app = NULL;
printf("IPMI GET_LAN\n");
@@ -321,6 +337,11 @@ ipmi_ret_t ipmi_transport_get_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
uint8_t buf[7];
char *eaddr1 = NULL;
+ r = mapper_get_service(bus, obj, &app);
+ if (r < 0) {
+ fprintf(stderr, "Failed to get bus name, return value: %s.\n", strerror(-r));
+ goto cleanup;
+ }
r = sd_bus_call_method(bus, app, obj, ifc, "GetHwAddress", &error,
&reply, "s", nwinterface);
if(r < 0)
@@ -376,6 +397,7 @@ ipmi_ret_t ipmi_transport_get_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
cleanup:
sd_bus_error_free(&error);
reply = sd_bus_message_unref(reply);
+ free(app);
return rc;
}
OpenPOWER on IntegriCloud