Reduce multiple oem_ibm entry points in pldmd
Abstract the custom method of `OEM-IBM` into the oem-ibm.hpp file
to prevent the continuous increase of custom code and reduce multiple
`OEM-IBM` entry points in pldmd.
Tested: enabled oem-ibm and built pldm successfully.
Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: Ieddb8d12281553e70bdb1c333bd29425c9d14fb0
diff --git a/pldmd/oem_ibm.hpp b/pldmd/oem_ibm.hpp
new file mode 100644
index 0000000..82f3699
--- /dev/null
+++ b/pldmd/oem_ibm.hpp
@@ -0,0 +1,182 @@
+#pragma once
+
+#include "libpldm/pdr.h"
+
+#include "../oem/ibm/libpldmresponder/file_io.hpp"
+#include "../oem/ibm/libpldmresponder/fru_oem_ibm.hpp"
+#include "../oem/ibm/libpldmresponder/oem_ibm_handler.hpp"
+#include "common/utils.hpp"
+#include "dbus_impl_requester.hpp"
+#include "host-bmc/dbus_to_event_handler.hpp"
+#include "invoker.hpp"
+#include "libpldmresponder/fru.hpp"
+#include "requester/request.hpp"
+
+namespace pldm
+{
+namespace oem_ibm
+{
+
+using namespace pldm::state_sensor;
+using namespace pldm::dbus_api;
+
+/**
+ * @class OemIBM
+ *
+ * @brief class for creating all the OEM IBM handlers
+ *
+ * Only in case of OEM_IBM this class object will be instantiated
+ */
+class OemIBM
+{
+ public:
+ OemIBM() = delete;
+ OemIBM(const Pdr&) = delete;
+ OemIBM& operator=(const OemIBM&) = delete;
+ OemIBM(OemIBM&&) = delete;
+ OemIBM& operator=(OemIBM&&) = delete;
+
+ public:
+ /** Constructs OemIBM object
+ *
+ * @param[in] dBusIntf - D-Bus handler
+ * @param[in] mctp_fd - fd of MCTP communications socket
+ * @param[in] mctp_eid - MCTP EID of remote host firmware
+ * @param[in] repo - pointer to BMC's primary PDR repo
+ * @param[in] instanceIdDb - pointer to an InstanceIdDb object
+ * @param[in] event - sd_event handler
+ * @param[in] invoker - invoker handler
+ * @param[in] hostPDRHandler - hostPDRHandler handler
+ * @param[in] platformHandler - platformHandler handler
+ * @param[in] fruHandler - fruHandler handler
+ * @param[in] baseHandler - baseHandler handler
+ * @param[in] reqHandler - reqHandler handler
+ */
+ explicit OemIBM(
+ const pldm::utils::DBusHandler* dBusIntf, int mctp_fd, uint8_t mctp_eid,
+ pldm_pdr* repo, pldm::InstanceIdDb& instanceIdDb,
+ sdeventplus::Event& event, Invoker& invoker,
+ HostPDRHandler* hostPDRHandler, platform::Handler* platformHandler,
+ fru::Handler* fruHandler, base::Handler* baseHandler,
+ pldm::requester::Handler<pldm::requester::Request>* reqHandler) :
+ dBusIntf(dBusIntf),
+ mctp_fd(mctp_fd), mctp_eid(mctp_eid), repo(repo),
+ instanceIdDb(instanceIdDb), event(event), invoker(invoker),
+ reqHandler(reqHandler)
+ {
+ createOemFruHandler();
+ fruHandler->setOemFruHandler(oemFruHandler.get());
+
+ createOemIbmFruHandler();
+ oemIbmFruHandler->setIBMFruHandler(fruHandler);
+
+ createCodeUpdate();
+ createOemPlatformHandler();
+ codeUpdate->setOemPlatformHandler(oemPlatformHandler.get());
+ hostPDRHandler->setOemPlatformHandler(oemPlatformHandler.get());
+ platformHandler->setOemPlatformHandler(oemPlatformHandler.get());
+ baseHandler->setOemPlatformHandler(oemPlatformHandler.get());
+
+ createOemIbmPlatformHandler();
+ oemIbmPlatformHandler->setPlatformHandler(platformHandler);
+
+ registerHandler();
+ }
+
+ private:
+ /** @brief Method for creating codeUpdate handler */
+ void createCodeUpdate()
+ {
+ codeUpdate = std::make_unique<pldm::responder::CodeUpdate>(dBusIntf);
+ codeUpdate->clearDirPath(LID_STAGING_DIR);
+ }
+
+ /** @brief Method for creating oemPlatformHandler
+ *
+ * This method also assigns the oemPlatformHandler to the below
+ * different handlers.
+ */
+ void createOemPlatformHandler()
+ {
+ oemPlatformHandler = std::make_unique<oem_ibm_platform::Handler>(
+ dBusIntf, codeUpdate.get(), mctp_fd, mctp_eid, instanceIdDb, event,
+ reqHandler);
+ }
+
+ /** @brief Method for creating oemIbmPlatformHandler */
+ void createOemIbmPlatformHandler()
+ {
+ oemIbmPlatformHandler =
+ dynamic_cast<pldm::responder::oem_ibm_platform::Handler*>(
+ oemPlatformHandler.get());
+ }
+
+ /** @brief Method for creating oemFruHandler */
+ void createOemFruHandler()
+ {
+ oemFruHandler = std::make_unique<oem_ibm_fru::Handler>(repo);
+ }
+
+ /** @brief Method for creating oemIbmFruHandler */
+ void createOemIbmFruHandler()
+ {
+ oemIbmFruHandler = dynamic_cast<pldm::responder::oem_ibm_fru::Handler*>(
+ oemFruHandler.get());
+ }
+
+ /** @brief Method for registering PLDM OEM handler */
+ void registerHandler()
+ {
+ invoker.registerHandler(
+ PLDM_OEM, std::make_unique<pldm::responder::oem_ibm::Handler>(
+ oemPlatformHandler.get(), mctp_fd, mctp_eid,
+ &instanceIdDb, reqHandler));
+ }
+
+ private:
+ /** @brief D-Bus handler */
+ const pldm::utils::DBusHandler* dBusIntf;
+
+ /** @brief fd of MCTP communications socket */
+ int mctp_fd;
+
+ /** @brief MCTP EID of remote host firmware */
+ uint8_t mctp_eid;
+
+ /** @brief pointer to BMC's primary PDR repo */
+ pldm_pdr* repo;
+
+ /** @brief reference to an Instance ID database object, used to obtain PLDM
+ * instance IDs
+ */
+ pldm::InstanceIdDb& instanceIdDb;
+
+ /** @brief reference of main event loop of pldmd, primarily used to schedule
+ * work
+ */
+ sdeventplus::Event& event;
+
+ /** @brief Object to the invoker class*/
+ Invoker& invoker;
+
+ /** @brief pointer to the requester class*/
+ requester::Handler<requester::Request>* reqHandler;
+
+ /** @brief pointer to the oem_ibm_handler class*/
+ std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
+
+ /** @brief pointer to the oem_ibm_fru class*/
+ std::unique_ptr<oem_fru::Handler> oemFruHandler{};
+
+ /** @brief pointer to the CodeUpdate class*/
+ std::unique_ptr<pldm::responder::CodeUpdate> codeUpdate{};
+
+ /** @brief oem IBM Platform handler*/
+ pldm::responder::oem_ibm_platform::Handler* oemIbmPlatformHandler = nullptr;
+
+ /** @brief oem IBM Fru handler*/
+ pldm::responder::oem_ibm_fru::Handler* oemIbmFruHandler = nullptr;
+};
+
+} // namespace oem_ibm
+} // namespace pldm
diff --git a/pldmd/pldmd.cpp b/pldmd/pldmd.cpp
index 1030c8e..102458f 100644
--- a/pldmd/pldmd.cpp
+++ b/pldmd/pldmd.cpp
@@ -60,9 +60,7 @@
#endif
#ifdef OEM_IBM
-#include "libpldmresponder/file_io.hpp"
-#include "libpldmresponder/fru_oem_ibm.hpp"
-#include "libpldmresponder/oem_ibm_handler.hpp"
+#include "oem_ibm.hpp"
#endif
constexpr uint8_t MCTP_MSG_TYPE_PLDM = 1;
@@ -232,31 +230,16 @@
hostEffecterParser;
std::unique_ptr<DbusToPLDMEvent> dbusToPLDMEventHandler;
DBusHandler dbusHandler;
- std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
std::unique_ptr<platform_config::Handler> platformConfigHandler{};
platformConfigHandler = std::make_unique<platform_config::Handler>();
- std::unique_ptr<oem_fru::Handler> oemFruHandler{};
-#ifdef OEM_IBM
- std::unique_ptr<pldm::responder::CodeUpdate> codeUpdate =
- std::make_unique<pldm::responder::CodeUpdate>(&dbusHandler);
- codeUpdate->clearDirPath(LID_STAGING_DIR);
- oemPlatformHandler = std::make_unique<oem_ibm_platform::Handler>(
- &dbusHandler, codeUpdate.get(), pldmTransport.getEventSource(), hostEID,
- instanceIdDb, event, &reqHandler);
- codeUpdate->setOemPlatformHandler(oemPlatformHandler.get());
- oemFruHandler = std::make_unique<oem_ibm_fru::Handler>(pdrRepo.get());
- invoker.registerHandler(PLDM_OEM, std::make_unique<oem_ibm::Handler>(
- oemPlatformHandler.get(),
- pldmTransport.getEventSource(),
- hostEID, &instanceIdDb, &reqHandler));
-#endif
if (hostEID)
{
hostPDRHandler = std::make_shared<HostPDRHandler>(
pldmTransport.getEventSource(), hostEID, event, pdrRepo.get(),
EVENTS_JSONS_DIR, entityTree.get(), bmcEntityTree.get(),
- instanceIdDb, &reqHandler, oemPlatformHandler.get());
+ instanceIdDb, &reqHandler);
+
// HostFirmware interface needs access to hostPDR to know if host
// is running
dbusImplHost.setHostPdrObj(hostPDRHandler);
@@ -268,13 +251,10 @@
dbusToPLDMEventHandler = std::make_unique<DbusToPLDMEvent>(
pldmTransport.getEventSource(), hostEID, instanceIdDb, &reqHandler);
}
- auto biosHandler = std::make_unique<bios::Handler>(
- pldmTransport.getEventSource(), hostEID, &instanceIdDb, &reqHandler,
- platformConfigHandler.get(), requestPLDMServiceName);
auto fruHandler = std::make_unique<fru::Handler>(
FRU_JSONS_DIR, FRU_MASTER_JSON, pdrRepo.get(), entityTree.get(),
- bmcEntityTree.get(), oemFruHandler.get());
+ bmcEntityTree.get());
// FRU table is built lazily when a FRU command or Get PDR command is
// handled. To enable building FRU table, the FRU handler is passed to the
@@ -282,25 +262,27 @@
auto platformHandler = std::make_unique<platform::Handler>(
&dbusHandler, hostEID, &instanceIdDb, PDR_JSONS_DIR, pdrRepo.get(),
hostPDRHandler.get(), dbusToPLDMEventHandler.get(), fruHandler.get(),
- oemPlatformHandler.get(), platformConfigHandler.get(), &reqHandler,
- event, true);
-#ifdef OEM_IBM
- pldm::responder::oem_ibm_platform::Handler* oemIbmPlatformHandler =
- dynamic_cast<pldm::responder::oem_ibm_platform::Handler*>(
- oemPlatformHandler.get());
- oemIbmPlatformHandler->setPlatformHandler(platformHandler.get());
+ platformConfigHandler.get(), &reqHandler, event, true);
- pldm::responder::oem_ibm_fru::Handler* oemIbmFruHandler =
- dynamic_cast<pldm::responder::oem_ibm_fru::Handler*>(
- oemFruHandler.get());
- oemIbmFruHandler->setIBMFruHandler(fruHandler.get());
+ auto biosHandler = std::make_unique<bios::Handler>(
+ pldmTransport.getEventSource(), hostEID, &instanceIdDb, &reqHandler,
+ platformConfigHandler.get(), requestPLDMServiceName);
+
+ auto baseHandler = std::make_unique<base::Handler>(event);
+
+#ifdef OEM_IBM
+ pldm::oem_ibm::OemIBM oemIBM(&dbusHandler, pldmTransport.getEventSource(),
+ hostEID, pdrRepo.get(), instanceIdDb, event,
+ invoker, hostPDRHandler.get(),
+ platformHandler.get(), fruHandler.get(),
+ baseHandler.get(), &reqHandler);
#endif
invoker.registerHandler(PLDM_BIOS, std::move(biosHandler));
invoker.registerHandler(PLDM_PLATFORM, std::move(platformHandler));
- invoker.registerHandler(PLDM_BASE, std::make_unique<base::Handler>(
- event, oemPlatformHandler.get()));
invoker.registerHandler(PLDM_FRU, std::move(fruHandler));
+ invoker.registerHandler(PLDM_BASE, std::move(baseHandler));
+
dbus_api::Pdr dbusImplPdr(bus, "/xyz/openbmc_project/pldm", pdrRepo.get());
sdbusplus::xyz::openbmc_project::PLDM::server::Event dbusImplEvent(
bus, "/xyz/openbmc_project/pldm");