diff options
author | Sergey Solomin <sergey.solomin@us.ibm.com> | 2016-08-23 09:07:28 -0500 |
---|---|---|
committer | Sergey Solomin <sergey.solomin@us.ibm.com> | 2016-08-25 13:37:57 -0500 |
commit | eb9b814403895d6435e04f02a9ff6c2b1b02cf54 (patch) | |
tree | 4a1713845844f874799a1b188db209adeaa3e085 | |
parent | bc40c178bb0b345ed1edf553b94369330003af34 (diff) | |
download | phosphor-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.cpp | 39 | ||||
-rw-r--r-- | chassishandler.cpp | 22 | ||||
-rw-r--r-- | host-services.c | 11 | ||||
-rw-r--r-- | ipmid.cpp | 12 | ||||
-rw-r--r-- | storageaddsel.cpp | 15 | ||||
-rw-r--r-- | testaddsel.cpp | 12 | ||||
-rw-r--r-- | transporthandler.cpp | 24 |
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) { @@ -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; } |