Adding severity when reporting an error

Severity is part of the PEL User Header section, and is used
to specify the PEL severity. This commit adds an option to pass
severity parameter while logging PEL. This will help to classify PELs
based on their severity. The commit also maintains uniformity in
the PEL Error logged.

Tested: By creating the error logs(pel) in error scenarios.

Signed-off-by: Pavithra Barithaya <pavithra.b@ibm.com>
Change-Id: Ic084d49b8ffe9aaea2c36c9fefa95a10a9c1c3ec
diff --git a/common/types.hpp b/common/types.hpp
index 0c7514c..6f100c5 100644
--- a/common/types.hpp
+++ b/common/types.hpp
@@ -20,6 +20,18 @@
 using Response = std::vector<uint8_t>;
 using Command = uint8_t;
 
+enum PelSeverity
+{
+    Notice,
+    Informational,
+    Debug,
+    Warning,
+    Critical,
+    Emergency,
+    Alert,
+    Error
+};
+
 namespace dbus
 {
 
diff --git a/common/utils.cpp b/common/utils.cpp
index 076cd5c..7e43b49 100644
--- a/common/utils.cpp
+++ b/common/utils.cpp
@@ -448,7 +448,7 @@
     return response;
 }
 
-void reportError(const char* errorMsg)
+void reportError(const char* errorMsg, const Severity& sev)
 {
     auto& bus = pldm::utils::DBusHandler::getBus();
 
@@ -457,15 +457,19 @@
         using LoggingCreate =
             sdbusplus::client::xyz::openbmc_project::logging::Create<>;
 
+        std::string severity = "xyz.openbmc_project.Logging.Entry.Level.Error";
+
         using namespace sdbusplus::xyz::openbmc_project::Logging::server;
-        auto severity =
-            sdbusplus::xyz::openbmc_project::Logging::server::convertForMessage(
-                sdbusplus::xyz::openbmc_project::Logging::server::Entry::Level::
-                    Error);
         auto method = bus.new_method_call(LoggingCreate::default_service,
                                           LoggingCreate::instance_path,
                                           LoggingCreate::interface, "Create");
 
+        auto itr = sevMap.find(sev);
+        if (itr != sevMap.end())
+        {
+            severity = itr->second;
+        }
+
         std::map<std::string, std::string> addlData{};
         method.append(errorMsg, severity, addlData);
         bus.call_noreply(method, dbusTimeout);
diff --git a/common/utils.hpp b/common/utils.hpp
index 5f24322..e940265 100644
--- a/common/utils.hpp
+++ b/common/utils.hpp
@@ -32,6 +32,20 @@
 
 namespace pldm
 {
+using Severity = pldm::PelSeverity;
+
+// mapping of severity enum to severity interface
+static std::unordered_map<Severity, std::string> sevMap = {
+    {Severity::Informational,
+     "xyz.openbmc_project.Logging.Entry.Level.Informational"},
+    {Severity::Debug, "xyz.openbmc_project.Logging.Entry.Level.Debug"},
+    {Severity::Notice, "xyz.openbmc_project.Logging.Entry.Level.Notice"},
+    {Severity::Warning, "xyz.openbmc_project.Logging.Entry.Level.Warning"},
+    {Severity::Critical, "xyz.openbmc_project.Logging.Entry.Level.Critical"},
+    {Severity::Emergency, "xyz.openbmc_project.Logging.Entry.Level.Emergency"},
+    {Severity::Error, "xyz.openbmc_project.Logging.Entry.Level.Error"},
+    {Severity::Alert, "xyz.openbmc_project.Logging.Entry.Level.Alert"}};
+
 namespace utils
 {
 namespace fs = std::filesystem;
@@ -139,8 +153,11 @@
 /**
  *  @brief creates an error log
  *  @param[in] errorMsg - the error message
+ *  @param[in] sev - severity of the log
+ *
  */
-void reportError(const char* errorMsg);
+void reportError(const char* errorMsg,
+                 const PelSeverity& sev = pldm::PelSeverity::Error);
 
 /** @brief Convert any Decimal number to BCD
  *
diff --git a/host-bmc/dbus_to_host_effecters.cpp b/host-bmc/dbus_to_host_effecters.cpp
index d5aeb58..21e893d 100644
--- a/host-bmc/dbus_to_host_effecters.cpp
+++ b/host-bmc/dbus_to_host_effecters.cpp
@@ -289,14 +289,14 @@
             error("Failed to decode setStateEffecterStates response, rc {RC}",
                   "RC", rc);
             pldm::utils::reportError(
-                "xyz.openbmc_project.bmc.pldm.SetHostEffecterFailed");
+                "xyz.openbmc_project.PLDM.Error.SetHostEffecterFailed");
         }
         if (completionCode)
         {
             error("Failed to set a Host effecter, cc = {CC}", "CC",
                   static_cast<unsigned>(completionCode));
             pldm::utils::reportError(
-                "xyz.openbmc_project.bmc.pldm.SetHostEffecterFailed");
+                "xyz.openbmc_project.PLDM.Error.SetHostEffecterFailed");
         }
     };
 
diff --git a/host-bmc/host_pdr_handler.cpp b/host-bmc/host_pdr_handler.cpp
index 72f2478..0d85d2b 100644
--- a/host-bmc/host_pdr_handler.cpp
+++ b/host-bmc/host_pdr_handler.cpp
@@ -773,7 +773,7 @@
         {
             error("Failed to get State sensor PDR");
             pldm::utils::reportError(
-                "xyz.openbmc_project.bmc.pldm.InternalFailure");
+                "xyz.openbmc_project.PLDM.Error.SetHostSensorState.GetStateSensorPDRFail");
             return;
         }
 
@@ -807,7 +807,7 @@
                         "Failed to encode_get_state_sensor_readings_req, rc = {RC}",
                         "RC", rc);
                     pldm::utils::reportError(
-                        "xyz.openbmc_project.bmc.pldm.InternalFailure");
+                        "xyz.openbmc_project.PLDM.Error.SetHostSensorState.EncodeStateSensorFail");
                     return;
                 }
 
@@ -834,8 +834,6 @@
                             "Failed to decode_get_state_sensor_readings_resp, rc = {RC} cc = {CC}",
                             "RC", rc, "CC",
                             static_cast<unsigned>(completionCode));
-                        pldm::utils::reportError(
-                            "xyz.openbmc_project.bmc.pldm.InternalFailure");
                     }
 
                     uint8_t eventState;
diff --git a/libpldmresponder/platform.cpp b/libpldmresponder/platform.cpp
index 6c77159..e0870b2 100644
--- a/libpldmresponder/platform.cpp
+++ b/libpldmresponder/platform.cpp
@@ -156,7 +156,6 @@
         }
     }
 }
-
 Response Handler::getPDR(const pldm_msg* request, size_t payloadLength)
 {
     if (hostPDRHandler)
@@ -999,7 +998,7 @@
                 "Failed to decode setEventReceiver command response, rc = {RC}, cc = {CC}",
                 "RC", rc, "CC", (unsigned)completionCode);
             pldm::utils::reportError(
-                "xyz.openbmc_project.bmc.pldm.InternalFailure");
+                "xyz.openbmc_project.PLDM.Error.InternalFailure");
         }
     };
     rc = handler->registerRequest(
diff --git a/oem/ibm/libpldmresponder/file_io_type_dump.cpp b/oem/ibm/libpldmresponder/file_io_type_dump.cpp
index 19b14d7..811f3fb 100644
--- a/oem/ibm/libpldmresponder/file_io_type_dump.cpp
+++ b/oem/ibm/libpldmresponder/file_io_type_dump.cpp
@@ -224,7 +224,8 @@
         {
             error("Failue in resource dump file ack");
             pldm::utils::reportError(
-                "xyz.openbmc_project.bmc.pldm.InternalFailure");
+                "xyz.openbmc_project.PLDM.Error.fileAck.ResourceDumpFileAckFail",
+                pldm::PelSeverity::Informational);
 
             PropertyValue value{
                 "xyz.openbmc_project.Common.Progress.OperationStatus.Failed"};
@@ -274,7 +275,7 @@
                     "fileAck: Failed to make a d-bus call to DUMP manager to reset source dump id of {FILE_PATH}, with ERROR={ERR_EXCEP}",
                     "FILE_PATH", path.c_str(), "ERR_EXCEP", e.what());
                 pldm::utils::reportError(
-                    "xyz.openbmc_project.bmc.PLDM.fileAck.SourceDumpIdResetFail");
+                    "xyz.openbmc_project.PLDM.Error.fileAck.SourceDumpIdResetFail");
                 return PLDM_ERROR;
             }
 
@@ -292,7 +293,7 @@
                     "fileAck: Failed to make a d-bus method to delete the dump entry {FILE_PATH}, with ERROR={ERR_EXCEP}",
                     "FILE_PATH", path.c_str(), "ERR_EXCEP", e.what());
                 pldm::utils::reportError(
-                    "xyz.openbmc_project.bmc.PLDM.fileAck.DumpEntryDeleteFail");
+                    "xyz.openbmc_project.PLDM.Error.fileAck.DumpEntryDeleteFail");
                 return PLDM_ERROR;
             }
             return PLDM_SUCCESS;
diff --git a/oem/ibm/requester/dbus_to_file_handler.cpp b/oem/ibm/requester/dbus_to_file_handler.cpp
index 7f15103..35a4d9c 100644
--- a/oem/ibm/requester/dbus_to_file_handler.cpp
+++ b/oem/ibm/requester/dbus_to_file_handler.cpp
@@ -38,7 +38,7 @@
         error(
             "Failed to send resource dump parameters as instance ID DB is not set");
         pldm::utils::reportError(
-            "xyz.openbmc_project.bmc.pldm.InternalFailure");
+            "xyz.openbmc_project.PLDM.Error.sendNewFileAvailableCmd.SendDumpParametersFail");
         return;
     }
     auto instanceId = instanceIdDb->next(mctp_eid);
@@ -88,7 +88,9 @@
 
 void DbusToFileHandler::reportResourceDumpFailure()
 {
-    pldm::utils::reportError("xyz.openbmc_project.bmc.pldm.InternalFailure");
+    pldm::utils::reportError(
+        "xyz.openbmc_project.PLDM.Error.ReportResourceDumpFail",
+        pldm::PelSeverity::Warning);
 
     PropertyValue value{resDumpStatus};
     DBusMapping dbusMapping{resDumpCurrentObjPath, resDumpProgressIntf,
@@ -247,7 +249,7 @@
     {
         error("Failed to send csr to host.");
         pldm::utils::reportError(
-            "xyz.openbmc_project.bmc.pldm.InternalFailure");
+            "xyz.openbmc_project.PLDM.Error.SendFileToHostFail");
         return;
     }
     auto instanceId = instanceIdDb->next(mctp_eid);
@@ -279,7 +281,7 @@
                 "Failed to decode_new_file_resp for vmi, or Host returned error for new_file_available rc = {RC}, cc = {CC}",
                 "RC", rc, "CC", static_cast<unsigned>(completionCode));
             pldm::utils::reportError(
-                "xyz.openbmc_project.bmc.pldm.InternalFailure");
+                "xyz.openbmc_project.PLDM.Error.DecodeNewFileResponseFail");
         }
     };
     rc = handler->registerRequest(
@@ -289,7 +291,7 @@
     {
         error("Failed to send NewFileAvailable Request to Host for vmi");
         pldm::utils::reportError(
-            "xyz.openbmc_project.bmc.pldm.InternalFailure");
+            "xyz.openbmc_project.PLDM.Error.NewFileAvailableRequestFail");
     }
 }
 
diff --git a/softoff/main.cpp b/softoff/main.cpp
index cfbbcd2..64bf47e 100644
--- a/softoff/main.cpp
+++ b/softoff/main.cpp
@@ -48,7 +48,7 @@
     if (softPower.isTimerExpired() && softPower.isReceiveResponse())
     {
         pldm::utils::reportError(
-            "pldm soft off: Waiting for the host soft off timeout");
+            "xyz.openbmc_project.PLDM.Error.SoftPowerOff.HostSoftOffTimeOut");
         error(
             "PLDM host soft off: ERROR! Wait for the host soft off timeout. Exit the pldm-softpoweroff");
         return -1;