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/libpldmresponder/bios.hpp b/libpldmresponder/bios.hpp
index 412e07a..e9abed2 100644
--- a/libpldmresponder/bios.hpp
+++ b/libpldmresponder/bios.hpp
@@ -4,6 +4,7 @@
#include "bios_parser.hpp"
#include "bios_table.hpp"
+#include "handler.hpp"
#include <stdint.h>
@@ -17,7 +18,6 @@
namespace pldm
{
-using Response = std::vector<uint8_t>;
using AttributeHandle = uint16_t;
using StringHandle = uint16_t;
using PossibleValuesByHandle = std::vector<StringHandle>;
@@ -25,18 +25,15 @@
namespace responder
{
+namespace bios
+{
+
using AttrTableEntryHandler =
std::function<void(const struct pldm_bios_attr_table_entry*)>;
void traverseBIOSAttrTable(const bios::Table& BIOSAttrTable,
AttrTableEntryHandler handler);
-namespace bios
-{
-/** @brief Register handlers for command from the platform spec
- */
-void registerHandlers();
-
namespace internal
{
@@ -49,25 +46,41 @@
*/
Response buildBIOSTables(const pldm_msg* request, size_t payloadLength,
const char* biosJsonDir, const char* biosTablePath);
-} // end namespace internal
+} // namespace internal
+
+class Handler : public CmdHandler
+{
+ public:
+ Handler()
+ {
+ handlers.emplace(PLDM_GET_DATE_TIME,
+ [this](const pldm_msg* request, size_t payloadLength) {
+ return this->getDateTime(request, payloadLength);
+ });
+ handlers.emplace(PLDM_GET_BIOS_TABLE,
+ [this](const pldm_msg* request, size_t payloadLength) {
+ return this->getBIOSTable(request, payloadLength);
+ });
+ }
+
+ /** @brief Handler for GetDateTime
+ *
+ * @param[in] request - Request message payload
+ * @param[return] Response - PLDM Response message
+ */
+ Response getDateTime(const pldm_msg* request, size_t payloadLength);
+
+ /** @brief Handler for GetBIOSTable
+ *
+ * @param[in] request - Request message
+ * @param[in] payload_length - Request message payload length
+ * @param[return] Response - PLDM Response message
+ */
+ Response getBIOSTable(const pldm_msg* request, size_t payloadLength);
+};
} // namespace bios
-/** @brief Handler for GetDateTime
- *
- * @param[in] request - Request message payload
- * @param[return] Response - PLDM Response message
- */
-Response getDateTime(const pldm_msg* request, size_t payloadLength);
-
-/** @brief Handler for GetBIOSTable
- *
- * @param[in] request - Request message
- * @param[in] payload_length - Request message payload length
- * @param[return] Response - PLDM Response message
- */
-Response getBIOSTable(const pldm_msg* request, size_t payloadLength);
-
namespace utils
{