pldmd: implement a new handler registration scheme
Implement a PLDM request handler registration scheme that requires
handlers to be C++ objects rather than plain functions. This was needed
for a couple of reasons:
- Perform specific actions at the PLDM daemon startup (that's when the
handlers are loaded).
- Share data across PLDM request messages (for eg FRU/BIOS tables),
without having to resort to globals and statics.
Tested:
- existing unit tests still pass
- added tests for the new registration scheme
Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
Change-Id: I1cf1c0a6fccd15da54f08120e61a5f256df6bc36
diff --git a/oem/ibm/libpldmresponder/file_io.cpp b/oem/ibm/libpldmresponder/file_io.cpp
index 05051b6..963a6b6 100644
--- a/oem/ibm/libpldmresponder/file_io.cpp
+++ b/oem/ibm/libpldmresponder/file_io.cpp
@@ -5,7 +5,6 @@
#include "file_io_by_type.hpp"
#include "file_table.hpp"
#include "libpldmresponder/utils.hpp"
-#include "registration.hpp"
#include "xyz/openbmc_project/Common/error.hpp"
#include <fcntl.h>
@@ -31,28 +30,6 @@
namespace responder
{
-namespace oem_ibm
-{
-
-void registerHandlers()
-{
- registerHandler(PLDM_OEM, PLDM_GET_FILE_TABLE, std::move(getFileTable));
- registerHandler(PLDM_OEM, PLDM_READ_FILE_INTO_MEMORY,
- std::move(readFileIntoMemory));
- registerHandler(PLDM_OEM, PLDM_WRITE_FILE_FROM_MEMORY,
- std::move(writeFileFromMemory));
- registerHandler(PLDM_OEM, PLDM_READ_FILE, std::move(readFile));
- registerHandler(PLDM_OEM, PLDM_WRITE_FILE, std::move(writeFile));
- registerHandler(PLDM_OEM, PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY,
- std::move(writeFileByTypeFromMemory));
- registerHandler(PLDM_OEM, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY,
- std::move(readFileByTypeIntoMemory));
- registerHandler(PLDM_OEM, PLDM_READ_FILE_BY_TYPE,
- std::move(readFileByType));
-}
-
-} // namespace oem_ibm
-
namespace fs = std::filesystem;
using namespace phosphor::logging;
@@ -173,7 +150,11 @@
} // namespace dma
-Response readFileIntoMemory(const pldm_msg* request, size_t payloadLength)
+namespace oem_ibm
+{
+
+Response Handler::readFileIntoMemory(const pldm_msg* request,
+ size_t payloadLength)
{
uint32_t fileHandle = 0;
uint32_t offset = 0;
@@ -254,7 +235,8 @@
request->hdr.instance_id);
}
-Response writeFileFromMemory(const pldm_msg* request, size_t payloadLength)
+Response Handler::writeFileFromMemory(const pldm_msg* request,
+ size_t payloadLength)
{
uint32_t fileHandle = 0;
uint32_t offset = 0;
@@ -330,7 +312,7 @@
request->hdr.instance_id);
}
-Response getFileTable(const pldm_msg* request, size_t payloadLength)
+Response Handler::getFileTable(const pldm_msg* request, size_t payloadLength)
{
uint32_t transferHandle = 0;
uint8_t transferFlag = 0;
@@ -385,7 +367,7 @@
return response;
}
-Response readFile(const pldm_msg* request, size_t payloadLength)
+Response Handler::readFile(const pldm_msg* request, size_t payloadLength)
{
uint32_t fileHandle = 0;
uint32_t offset = 0;
@@ -465,7 +447,7 @@
return response;
}
-Response writeFile(const pldm_msg* request, size_t payloadLength)
+Response Handler::writeFile(const pldm_msg* request, size_t payloadLength)
{
uint32_t fileHandle = 0;
uint32_t offset = 0;
@@ -601,20 +583,21 @@
return response;
}
-Response writeFileByTypeFromMemory(const pldm_msg* request,
- size_t payloadLength)
+Response Handler::writeFileByTypeFromMemory(const pldm_msg* request,
+ size_t payloadLength)
{
return rwFileByTypeIntoMemory(PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY, request,
payloadLength);
}
-Response readFileByTypeIntoMemory(const pldm_msg* request, size_t payloadLength)
+Response Handler::readFileByTypeIntoMemory(const pldm_msg* request,
+ size_t payloadLength)
{
return rwFileByTypeIntoMemory(PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, request,
payloadLength);
}
-Response readFileByType(const pldm_msg* request, size_t payloadLength)
+Response Handler::readFileByType(const pldm_msg* request, size_t payloadLength)
{
Response response(sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_RESP_BYTES);
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
@@ -661,5 +644,6 @@
return response;
}
+} // namespace oem_ibm
} // namespace responder
} // namespace pldm
diff --git a/oem/ibm/libpldmresponder/file_io.hpp b/oem/ibm/libpldmresponder/file_io.hpp
index 07a13aa..231222c 100644
--- a/oem/ibm/libpldmresponder/file_io.hpp
+++ b/oem/ibm/libpldmresponder/file_io.hpp
@@ -1,5 +1,7 @@
#pragma once
+#include "handler.hpp"
+
#include <stdint.h>
#include <unistd.h>
@@ -11,19 +13,8 @@
namespace pldm
{
-
namespace responder
{
-
-namespace oem_ibm
-{
-/** @brief Register handlers for command from the platform spec
- */
-void registerHandlers();
-} // namespace oem_ibm
-
-using Response = std::vector<uint8_t>;
-
namespace dma
{
@@ -121,79 +112,128 @@
} // namespace dma
-/** @brief Handler for readFileIntoMemory command
- *
- * @param[in] request - pointer to PLDM request payload
- * @param[in] payloadLength - length of the message
- *
- * @return PLDM response message
- */
-Response readFileIntoMemory(const pldm_msg* request, size_t payloadLength);
+namespace oem_ibm
+{
-/** @brief Handler for writeFileIntoMemory command
- *
- * @param[in] request - pointer to PLDM request payload
- * @param[in] payloadLength - length of the message
- *
- * @return PLDM response message
- */
-Response writeFileFromMemory(const pldm_msg* request, size_t payloadLength);
+class Handler : public CmdHandler
+{
+ public:
+ Handler()
+ {
+ handlers.emplace(PLDM_READ_FILE_INTO_MEMORY,
+ [this](const pldm_msg* request, size_t payloadLength) {
+ return this->readFileIntoMemory(request,
+ payloadLength);
+ });
+ handlers.emplace(PLDM_WRITE_FILE_FROM_MEMORY,
+ [this](const pldm_msg* request, size_t payloadLength) {
+ return this->writeFileFromMemory(request,
+ payloadLength);
+ });
+ handlers.emplace(PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY,
+ [this](const pldm_msg* request, size_t payloadLength) {
+ return this->writeFileByTypeFromMemory(
+ request, payloadLength);
+ });
+ handlers.emplace(PLDM_READ_FILE_BY_TYPE_INTO_MEMORY,
+ [this](const pldm_msg* request, size_t payloadLength) {
+ return this->readFileByTypeIntoMemory(
+ request, payloadLength);
+ });
+ handlers.emplace(PLDM_READ_FILE_BY_TYPE, [this](const pldm_msg* request,
+ size_t payloadLength) {
+ return this->readFileByType(request, payloadLength);
+ });
+ handlers.emplace(PLDM_GET_FILE_TABLE,
+ [this](const pldm_msg* request, size_t payloadLength) {
+ return this->getFileTable(request, payloadLength);
+ });
+ handlers.emplace(PLDM_READ_FILE,
+ [this](const pldm_msg* request, size_t payloadLength) {
+ return this->readFile(request, payloadLength);
+ });
+ handlers.emplace(PLDM_WRITE_FILE,
+ [this](const pldm_msg* request, size_t payloadLength) {
+ return this->writeFile(request, payloadLength);
+ });
+ }
-/** @brief Handler for writeFileByTypeFromMemory command
- *
- * @param[in] request - pointer to PLDM request payload
- * @param[in] payloadLength - length of the message
- *
- * @return PLDM response message
- */
+ /** @brief Handler for readFileIntoMemory command
+ *
+ * @param[in] request - pointer to PLDM request payload
+ * @param[in] payloadLength - length of the message
+ *
+ * @return PLDM response message
+ */
+ Response readFileIntoMemory(const pldm_msg* request, size_t payloadLength);
-Response writeFileByTypeFromMemory(const pldm_msg* request,
- size_t payloadLength);
+ /** @brief Handler for writeFileIntoMemory command
+ *
+ * @param[in] request - pointer to PLDM request payload
+ * @param[in] payloadLength - length of the message
+ *
+ * @return PLDM response message
+ */
+ Response writeFileFromMemory(const pldm_msg* request, size_t payloadLength);
-/** @brief Handler for readFileByTypeIntoMemory command
- *
- * @param[in] request - pointer to PLDM request payload
- * @param[in] payloadLength - length of the message
- *
- * @return PLDM response message
- */
-Response readFileByTypeIntoMemory(const pldm_msg* request,
- size_t payloadLength);
+ /** @brief Handler for writeFileByTypeFromMemory command
+ *
+ * @param[in] request - pointer to PLDM request payload
+ * @param[in] payloadLength - length of the message
+ *
+ * @return PLDM response message
+ */
-/** @brief Handler for readFileByType command
- *
- * @param[in] request - pointer to PLDM request payload
- * @param[in] payloadLength - length of the message
- *
- * @return PLDM response message
- */
-Response readFileByType(const pldm_msg* request, size_t payloadLength);
+ Response writeFileByTypeFromMemory(const pldm_msg* request,
+ size_t payloadLength);
-/** @brief Handler for GetFileTable command
- *
- * @param[in] request - pointer to PLDM request payload
- * @param[in] payloadLength - length of the message payload
- *
- * @return PLDM response message
- */
-Response getFileTable(const pldm_msg* request, size_t payloadLength);
+ /** @brief Handler for readFileByTypeIntoMemory command
+ *
+ * @param[in] request - pointer to PLDM request payload
+ * @param[in] payloadLength - length of the message
+ *
+ * @return PLDM response message
+ */
+ Response readFileByTypeIntoMemory(const pldm_msg* request,
+ size_t payloadLength);
-/** @brief Handler for readFile command
- *
- * @param[in] request - PLDM request msg
- * @param[in] payloadLength - length of the message payload
- *
- * @return PLDM response message
- */
-Response readFile(const pldm_msg* request, size_t payloadLength);
+ /** @brief Handler for readFileByType command
+ *
+ * @param[in] request - pointer to PLDM request payload
+ * @param[in] payloadLength - length of the message
+ *
+ * @return PLDM response message
+ */
+ Response readFileByType(const pldm_msg* request, size_t payloadLength);
-/** @brief Handler for writeFile command
- *
- * @param[in] request - PLDM request msg
- * @param[in] payloadLength - length of the message payload
- *
- * @return PLDM response message
- */
-Response writeFile(const pldm_msg* request, size_t payloadLength);
+ /** @brief Handler for GetFileTable command
+ *
+ * @param[in] request - pointer to PLDM request payload
+ * @param[in] payloadLength - length of the message payload
+ *
+ * @return PLDM response message
+ */
+ Response getFileTable(const pldm_msg* request, size_t payloadLength);
+
+ /** @brief Handler for readFile command
+ *
+ * @param[in] request - PLDM request msg
+ * @param[in] payloadLength - length of the message payload
+ *
+ * @return PLDM response message
+ */
+ Response readFile(const pldm_msg* request, size_t payloadLength);
+
+ /** @brief Handler for writeFile command
+ *
+ * @param[in] request - PLDM request msg
+ * @param[in] payloadLength - length of the message payload
+ *
+ * @return PLDM response message
+ */
+ Response writeFile(const pldm_msg* request, size_t payloadLength);
+};
+
+} // namespace oem_ibm
} // namespace responder
} // namespace pldm