summaryrefslogtreecommitdiffstats
path: root/extensions/openpower-pels
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/openpower-pels')
-rw-r--r--extensions/openpower-pels/manager.cpp90
-rw-r--r--extensions/openpower-pels/manager.hpp65
2 files changed, 149 insertions, 6 deletions
diff --git a/extensions/openpower-pels/manager.cpp b/extensions/openpower-pels/manager.cpp
index b9c7d94..aec5053 100644
--- a/extensions/openpower-pels/manager.cpp
+++ b/extensions/openpower-pels/manager.cpp
@@ -20,6 +20,7 @@
#include <filesystem>
#include <fstream>
+#include <xyz/openbmc_project/Common/error.hpp>
namespace openpower
{
@@ -29,6 +30,8 @@ namespace pels
using namespace phosphor::logging;
namespace fs = std::filesystem;
+namespace common_error = sdbusplus::xyz::openbmc_project::Common::Error;
+
namespace additional_data
{
constexpr auto rawPEL = "RAWPEL";
@@ -73,7 +76,7 @@ void Manager::addRawPEL(const std::string& rawPelPath, uint32_t obmcLogID)
file.close();
- auto pel = std::make_unique<PEL>(data, obmcLogID);
+ auto pel = std::make_unique<openpower::pels::PEL>(data, obmcLogID);
if (pel->valid())
{
// PELs created by others still need these fields set by us.
@@ -132,8 +135,8 @@ void Manager::createPEL(const std::string& message, uint32_t obmcLogID,
{
AdditionalData ad{additionalData};
- auto pel = std::make_unique<PEL>(*entry, obmcLogID, timestamp, severity,
- ad, *_dataIface);
+ auto pel = std::make_unique<openpower::pels::PEL>(
+ *entry, obmcLogID, timestamp, severity, ad, *_dataIface);
_repo.add(pel);
@@ -160,5 +163,86 @@ void Manager::createPEL(const std::string& message, uint32_t obmcLogID,
}
}
+sdbusplus::message::unix_fd Manager::getPEL(uint32_t pelID)
+{
+ Repository::LogID id{Repository::LogID::Pel(pelID)};
+ std::optional<int> fd;
+
+ try
+ {
+ fd = _repo.getPELFD(id);
+ }
+ catch (std::exception& e)
+ {
+ throw common_error::InternalFailure();
+ }
+
+ if (!fd)
+ {
+ throw common_error::InvalidArgument();
+ }
+
+ return *fd;
+}
+
+std::vector<uint8_t> Manager::getPELFromOBMCID(uint32_t obmcLogID)
+{
+ Repository::LogID id{Repository::LogID::Obmc(obmcLogID)};
+ std::optional<std::vector<uint8_t>> data;
+
+ try
+ {
+ data = _repo.getPELData(id);
+ }
+ catch (std::exception& e)
+ {
+ throw common_error::InternalFailure();
+ }
+
+ if (!data)
+ {
+ throw common_error::InvalidArgument();
+ }
+
+ return *data;
+}
+
+void Manager::hostAck(uint32_t pelID)
+{
+ Repository::LogID id{Repository::LogID::Pel(pelID)};
+
+ if (!_repo.hasPEL(id))
+ {
+ throw common_error::InvalidArgument();
+ }
+
+ if (_hostNotifier)
+ {
+ _hostNotifier->ackPEL(pelID);
+ }
+}
+
+void Manager::hostReject(uint32_t pelID, RejectionReason reason)
+{
+ Repository::LogID id{Repository::LogID::Pel(pelID)};
+
+ if (!_repo.hasPEL(id))
+ {
+ throw common_error::InvalidArgument();
+ }
+
+ if (_hostNotifier)
+ {
+ if (reason == RejectionReason::BadPEL)
+ {
+ _hostNotifier->setBadPEL(pelID);
+ }
+ else if (reason == RejectionReason::HostFull)
+ {
+ _hostNotifier->setHostFull(pelID);
+ }
+ }
+}
+
} // namespace pels
} // namespace openpower
diff --git a/extensions/openpower-pels/manager.hpp b/extensions/openpower-pels/manager.hpp
index 731dd16..7f1fcda 100644
--- a/extensions/openpower-pels/manager.hpp
+++ b/extensions/openpower-pels/manager.hpp
@@ -1,5 +1,7 @@
#pragma once
+#include "config.h"
+
#include "data_interface.hpp"
#include "host_notifier.hpp"
#include "log_manager.hpp"
@@ -7,15 +9,21 @@
#include "registry.hpp"
#include "repository.hpp"
+#include <org/open_power/Logging/PEL/server.hpp>
+#include <sdbusplus/server.hpp>
+
namespace openpower
{
namespace pels
{
+using PELInterface = sdbusplus::server::object::object<
+ sdbusplus::org::open_power::Logging::server::PEL>;
+
/**
* @brief PEL manager object
*/
-class Manager
+class Manager : public PELInterface
{
public:
Manager() = delete;
@@ -33,8 +41,8 @@ class Manager
*/
Manager(phosphor::logging::internal::Manager& logManager,
std::unique_ptr<DataInterfaceBase> dataIface) :
- _logManager(logManager),
- _repo(getPELRepoPath()),
+ PELInterface(logManager.getBus(), OBJ_LOGGING),
+ _logManager(logManager), _repo(getPELRepoPath()),
_registry(getMessageRegistryPath() / message::registryFileName),
_dataIface(std::move(dataIface))
{
@@ -91,6 +99,57 @@ class Manager
*/
bool isDeleteProhibited(uint32_t obmcLogID);
+ /**
+ * @brief Return a file descriptor to the raw PEL data
+ *
+ * Throws InvalidArgument if the PEL ID isn't found,
+ * and InternalFailure if anything else fails.
+ *
+ * @param[in] pelID - The PEL ID to get the data for
+ *
+ * @return unix_fd - File descriptor to the file that contains the PEL
+ */
+ sdbusplus::message::unix_fd getPEL(uint32_t pelID) override;
+
+ /**
+ * @brief Returns data for the PEL corresponding to an OpenBMC
+ * event log.
+ *
+ * @param[in] obmcLogID - The OpenBMC event log ID
+ *
+ * @return vector<uint8_t> - The raw PEL data
+ */
+ std::vector<uint8_t> getPELFromOBMCID(uint32_t obmcLogID) override;
+
+ /**
+ * @brief The D-Bus method called when a host successfully processes
+ * a PEL.
+ *
+ * This D-Bus method is called from the PLDM daemon when they get an
+ * 'Ack PEL' PLDM message from the host, which indicates the host
+ * firmware successfully sent it to the OS and this code doesn't need
+ * to send it to the host again.
+ *
+ * @param[in] pelID - The PEL ID
+ */
+ void hostAck(uint32_t pelID) override;
+
+ /**
+ * @brief D-Bus method called when the host rejects a PEL.
+ *
+ * This D-Bus method is called from the PLDM daemon when they get an
+ * 'Ack PEL' PLDM message from the host with a payload that says
+ * something when wrong.
+ *
+ * The choices are either:
+ * * Host Full - The host's staging area is full - try again later
+ * * Malrformed PEL - The host received an invalid PEL
+ *
+ * @param[in] pelID - The PEL ID
+ * @param[in] reason - One of the above two reasons
+ */
+ void hostReject(uint32_t pelID, RejectionReason reason) override;
+
private:
/**
* @brief Adds a received raw PEL to the PEL repository
OpenPOWER on IntegriCloud