From 3d23048896b7171b940c56fe4e403b1d23103eef Mon Sep 17 00:00:00 2001 From: Deepak Kodihalli Date: Tue, 3 Apr 2018 07:00:45 -0500 Subject: Fix error level lookup The mapping between an error level in the esel to a phosphor-logging error level was broken. This commit fixes it. This commits also specifies the error level while calling the error report() API, so that error D-Bus objects reflect the right error level (as per the esel). Resolves openbmc/openbmc#3014. Change-Id: I9891d468d98d169f73275a3693df4f3a2166001d Signed-off-by: Deepak Kodihalli --- storageaddsel.cpp | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/storageaddsel.cpp b/storageaddsel.cpp index 82ac74b..2b41d56 100644 --- a/storageaddsel.cpp +++ b/storageaddsel.cpp @@ -15,10 +15,12 @@ #include "sensorhandler.h" #include "storagehandler.h" #include "types.hpp" +#include "xyz/openbmc_project/Logging/Entry/server.hpp" using namespace std; using namespace phosphor::logging; +using namespace sdbusplus::xyz::openbmc_project::Logging::server; extern const ipmi::sensor::InvObjectIDMap invSensors; ////////////////////////// @@ -32,24 +34,26 @@ struct esel_section_headers_t { struct severity_values_t { uint8_t type; - const char *description; + Entry::Level level; }; const std::vector g_sev_desc = { - {0x10, "recoverable error"}, - {0x20, "predictive error"}, - {0x40, "unrecoverable error"}, - {0x50, "critical error"}, - {0x60, "error from a diagnostic test"}, - {0x70, "recovered symptom "}, - {0xFF, "Unknown"}, + {0x10, Entry::Level::Warning}, // recoverable error + {0x20, Entry::Level::Warning}, // predictive error + // TODO via github issue 3066 : map level below to Level::Unrecoverable + {0x40, Entry::Level::Error}, // unrecoverable error + // TODO via github issue 3066 : map level below to Level::Critical + {0x50, Entry::Level::Error}, // critical error + {0x60, Entry::Level::Error}, // error from a diagnostic test + {0x70, Entry::Level::Warning}, // recoverable symptom + {0xFF, Entry::Level::Error}, //unknown error }; -const char* sev_lookup(uint8_t n) { +Entry::Level sev_lookup(uint8_t n) { auto i = std::find_if(std::begin(g_sev_desc), std::end(g_sev_desc), [n](auto p){ return p.type == n || p.type == 0xFF; }); - return i->description; + return i->level; } @@ -124,7 +128,7 @@ fclose_fp: } -const char *create_esel_severity(const uint8_t *buffer) { +Entry::Level create_esel_severity(const uint8_t *buffer) { uint8_t severity; // Dive in to the IBM log to find the severity @@ -162,7 +166,8 @@ int create_esel_association(const uint8_t *buffer, std::string& inventoryPath) -int create_esel_description(const uint8_t *buffer, const char *sev, char **message) { +int create_esel_description(const uint8_t *buffer, Entry::Level level, + char **message) { ipmi_add_sel_request_t *p; @@ -173,7 +178,8 @@ int create_esel_description(const uint8_t *buffer, const char *sev, char **messa find_sensor_type_string(p->sensornumber,&m); - r = asprintf(message, "A %s has experienced a %s", m, sev ); + r = asprintf(message, "A %s has experienced an error of level %d", + m, static_cast(level) ); if (r == -1) { fprintf(stderr, "Failed to allocate memory for ESEL description\n"); @@ -186,7 +192,7 @@ int create_esel_description(const uint8_t *buffer, const char *sev, char **messa int send_esel_to_dbus(const char *desc, - const char *sev, + Entry::Level level, const std::string& inventoryPath, uint8_t *debug, size_t debuglen) @@ -205,7 +211,8 @@ int send_esel_to_dbus(const char *desc, using error = sdbusplus::org::open_power::Host::Error::Event; using metadata = org::open_power::Host::Event; - report(metadata::ESEL(selData.get()), + report(level, + metadata::ESEL(selData.get()), metadata::CALLOUT_INVENTORY_PATH(inventoryPath.c_str())); return 0; @@ -214,7 +221,6 @@ int send_esel_to_dbus(const char *desc, void send_esel(uint16_t recordid) { char *desc; - const char *sev; uint8_t *buffer = NULL; const char *path = "/tmp/esel"; ssize_t sz; @@ -227,7 +233,7 @@ void send_esel(uint16_t recordid) { return; } - sev = create_esel_severity(buffer); + auto sev = create_esel_severity(buffer); create_esel_association(buffer, inventoryPath); create_esel_description(buffer, sev, &desc); -- cgit v1.2.1