implement async handlers for all requester commands
this commit makes use of 74f27c730ef3925a0f2a3adfaa04f8790f931372 to
convert the existing blocking requester commands in pldm to async
ones.
this is tested with Host code and seems to work fine
Change-Id: I8d4762c3cd5bce49f854b30f8325bfcd1dcb4ff9
Signed-off-by: Sampa Misra <sampmisr@in.ibm.com>
diff --git a/oem/ibm/libpldmresponder/file_io.hpp b/oem/ibm/libpldmresponder/file_io.hpp
index 430811e..10c6d47 100644
--- a/oem/ibm/libpldmresponder/file_io.hpp
+++ b/oem/ibm/libpldmresponder/file_io.hpp
@@ -10,6 +10,7 @@
#include "oem/ibm/requester/dbus_to_file_handler.hpp"
#include "oem_ibm_handler.hpp"
#include "pldmd/handler.hpp"
+#include "requester/handler.hpp"
#include <fcntl.h>
#include <stdint.h>
@@ -166,10 +167,11 @@
{
public:
Handler(oem_platform::Handler* oemPlatformHandler, int hostSockFd,
- uint8_t hostEid, dbus_api::Requester* dbusImplReqester) :
+ uint8_t hostEid, dbus_api::Requester* dbusImplReqester,
+ pldm::requester::Handler<pldm::requester::Request>* handler) :
oemPlatformHandler(oemPlatformHandler),
hostSockFd(hostSockFd), hostEid(hostEid),
- dbusImplReqester(dbusImplReqester)
+ dbusImplReqester(dbusImplReqester), handler(handler)
{
handlers.emplace(PLDM_READ_FILE_INTO_MEMORY,
[this](const pldm_msg* request, size_t payloadLength) {
@@ -231,8 +233,8 @@
pldm::utils::DBusHandler::getBus(),
sdbusplus::bus::match::rules::interfacesAdded() +
sdbusplus::bus::match::rules::argNpath(0, dumpObjPath),
- [hostSockFd, hostEid,
- dbusImplReqester](sdbusplus::message::message& msg) {
+ [this, hostSockFd, hostEid, dbusImplReqester,
+ &handler](sdbusplus::message::message& msg) {
std::map<
std::string,
std::map<std::string, std::variant<std::string, uint32_t>>>
@@ -259,11 +261,13 @@
std::get<std::string>(property.second);
}
}
- auto dbusToFileHandler = std::make_unique<
- pldm::requester::oem_ibm::DbusToFileHandler>(
- hostSockFd, hostEid, dbusImplReqester, path);
- dbusToFileHandler->processNewResourceDump(vspstring,
- password);
+ dbusToFileHandlers
+ .emplace_back(
+ std::make_unique<pldm::requester::oem_ibm::
+ DbusToFileHandler>(
+ hostSockFd, hostEid, dbusImplReqester, path,
+ handler))
+ ->processNewResourceDump(vspstring, password);
break;
}
}
@@ -272,8 +276,8 @@
pldm::utils::DBusHandler::getBus(),
sdbusplus::bus::match::rules::interfacesAdded() +
sdbusplus::bus::match::rules::argNpath(0, certObjPath),
- [hostSockFd, hostEid,
- dbusImplReqester](sdbusplus::message::message& msg) {
+ [this, hostSockFd, hostEid, dbusImplReqester,
+ &handler](sdbusplus::message::message& msg) {
std::map<
std::string,
std::map<std::string, std::variant<std::string, uint32_t>>>
@@ -295,13 +299,13 @@
sdbusplus::message::object_path(path)
.filename();
- auto dbusToFileHandler =
- std::make_unique<pldm::requester::oem_ibm::
- DbusToFileHandler>(
+ dbusToFileHandlers
+ .emplace_back(std::make_unique<
+ pldm::requester::oem_ibm::
+ DbusToFileHandler>(
hostSockFd, hostEid, dbusImplReqester,
- path);
- dbusToFileHandler->newCsrFileAvailable(
- csr, fileHandle);
+ path, handler))
+ ->newCsrFileAvailable(csr, fileHandle);
break;
}
}
@@ -416,12 +420,18 @@
using DBusInterfaceAdded = std::vector<std::pair<
std::string,
std::vector<std::pair<std::string, std::variant<std::string>>>>>;
+ std::unique_ptr<pldm::requester::oem_ibm::DbusToFileHandler>
+ dbusToFileHandler; //!< pointer to send request to Host
std::unique_ptr<sdbusplus::bus::match::match>
resDumpMatcher; //!< Pointer to capture the interface added signal
//!< for new resource dump
std::unique_ptr<sdbusplus::bus::match::match>
vmiCertMatcher; //!< Pointer to capture the interface added signal
//!< for new csr string
+ /** @brief PLDM request handler */
+ pldm::requester::Handler<pldm::requester::Request>* handler;
+ std::vector<std::unique_ptr<pldm::requester::oem_ibm::DbusToFileHandler>>
+ dbusToFileHandlers;
};
} // namespace oem_ibm
diff --git a/oem/ibm/libpldmresponder/oem_ibm_handler.cpp b/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
index 7fa7570..9b64bd9 100644
--- a/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
+++ b/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
@@ -291,10 +291,8 @@
}
int pldm::responder::oem_ibm_platform::Handler::sendEventToHost(
- std::vector<uint8_t>& requestMsg)
+ std::vector<uint8_t>& requestMsg, uint8_t instanceId)
{
- uint8_t* responseMsg = nullptr;
- size_t responseMsgSize{};
if (requestMsg.size())
{
std::ostringstream tempStream;
@@ -305,33 +303,29 @@
}
std::cout << tempStream.str() << std::endl;
}
-
- auto requesterRc =
- pldm_send_recv(mctp_eid, mctp_fd, requestMsg.data(), requestMsg.size(),
- &responseMsg, &responseMsgSize);
- std::unique_ptr<uint8_t, decltype(std::free)*> responseMsgPtr{responseMsg,
- std::free};
- if (requesterRc != PLDM_REQUESTER_SUCCESS)
+ auto oemPlatformEventMessageResponseHandler =
+ [](mctp_eid_t /*eid*/, const pldm_msg* response, size_t respMsgLen) {
+ uint8_t completionCode{};
+ uint8_t status{};
+ auto rc = decode_platform_event_message_resp(
+ response, respMsgLen, &completionCode, &status);
+ if (rc || completionCode)
+ {
+ std::cerr << "Failed to decode_platform_event_message_resp: "
+ << " for code update event rc=" << rc
+ << ", cc=" << static_cast<unsigned>(completionCode)
+ << std::endl;
+ }
+ };
+ auto rc = handler->registerRequest(
+ mctp_eid, instanceId, PLDM_PLATFORM, PLDM_PLATFORM_EVENT_MESSAGE,
+ std::move(requestMsg),
+ std::move(oemPlatformEventMessageResponseHandler));
+ if (rc)
{
- std::cerr << "Failed to send message/receive response. RC = "
- << requesterRc << ", errno = " << errno
- << "for sending event to host \n";
- return requesterRc;
+ std::cerr << "Failed to send BIOS attribute change event message \n";
}
- uint8_t completionCode{};
- uint8_t status{};
- auto responsePtr = reinterpret_cast<struct pldm_msg*>(responseMsgPtr.get());
- auto rc = decode_platform_event_message_resp(
- responsePtr, responseMsgSize - sizeof(pldm_msg_hdr), &completionCode,
- &status);
- if (rc != PLDM_SUCCESS || completionCode != PLDM_SUCCESS)
- {
- std::cerr << "Failure in decode platform event message response, rc= "
- << rc << " cc=" << static_cast<unsigned>(completionCode)
- << "\n";
- return rc;
- }
return rc;
}
@@ -376,15 +370,15 @@
{
std::cerr << "Failed to encode state sensor event, rc = " << rc
<< std::endl;
+ requester.markFree(mctp_eid, instanceId);
return;
}
- rc = sendEventToHost(requestMsg);
+ rc = sendEventToHost(requestMsg, instanceId);
if (rc != PLDM_SUCCESS)
{
std::cerr << "Failed to send event to host: "
<< "rc=" << rc << std::endl;
}
- requester.markFree(mctp_eid, instanceId);
return;
}
diff --git a/oem/ibm/libpldmresponder/oem_ibm_handler.hpp b/oem/ibm/libpldmresponder/oem_ibm_handler.hpp
index ee1081e..a713980 100644
--- a/oem/ibm/libpldmresponder/oem_ibm_handler.hpp
+++ b/oem/ibm/libpldmresponder/oem_ibm_handler.hpp
@@ -6,6 +6,7 @@
#include "libpldmresponder/oem_handler.hpp"
#include "libpldmresponder/pdr_utils.hpp"
#include "libpldmresponder/platform.hpp"
+#include "requester/handler.hpp"
namespace pldm
{
@@ -51,10 +52,11 @@
public:
Handler(const pldm::utils::DBusHandler* dBusIntf,
pldm::responder::CodeUpdate* codeUpdate, int mctp_fd,
- uint8_t mctp_eid, Requester& requester, sdeventplus::Event& event) :
+ uint8_t mctp_eid, Requester& requester, sdeventplus::Event& event,
+ pldm::requester::Handler<pldm::requester::Request>* handler) :
oem_platform::Handler(dBusIntf),
codeUpdate(codeUpdate), platformHandler(nullptr), mctp_fd(mctp_fd),
- mctp_eid(mctp_eid), requester(requester), event(event)
+ mctp_eid(mctp_eid), requester(requester), event(event), handler(handler)
{
codeUpdate->setVersions();
}
@@ -116,9 +118,10 @@
/** @brief Method to send encoded request msg of code update event to host
* @param[in] requestMsg - encoded request msg
+ * @param[in] instanceId - instance id of the message
* @return PLDM status code
*/
- int sendEventToHost(std::vector<uint8_t>& requestMsg);
+ int sendEventToHost(std::vector<uint8_t>& requestMsg, uint8_t instanceId);
/** @brief _processEndUpdate processes the actual work that needs
* to be carried out after EndUpdate effecter is set. This is done async
@@ -170,6 +173,9 @@
private:
/** @brief D-Bus property changed signal match for CurrentPowerState*/
std::unique_ptr<sdbusplus::bus::match::match> chassisOffMatch;
+
+ /** @brief PLDM request handler */
+ pldm::requester::Handler<pldm::requester::Request>* handler;
};
/** @brief Method to encode code update event msg
diff --git a/oem/ibm/libpldmresponder/platform_oem_ibm.cpp b/oem/ibm/libpldmresponder/platform_oem_ibm.cpp
index d5c6528..0ae1adb 100644
--- a/oem/ibm/libpldmresponder/platform_oem_ibm.cpp
+++ b/oem/ibm/libpldmresponder/platform_oem_ibm.cpp
@@ -15,9 +15,10 @@
namespace platform
{
-int sendBiosAttributeUpdateEvent(int fd, uint8_t eid,
- dbus_api::Requester* requester,
- const std::vector<uint16_t>& handles)
+int sendBiosAttributeUpdateEvent(
+ uint8_t eid, dbus_api::Requester* requester,
+ const std::vector<uint16_t>& handles,
+ pldm::requester::Handler<pldm::requester::Request>* handler)
{
constexpr auto hostStatePath = "/xyz/openbmc_project/state/host0";
constexpr auto hostStateInterface =
@@ -77,50 +78,40 @@
std::cout << tempStream.str() << std::endl;
}
- uint8_t* responseMsg = nullptr;
- size_t responseMsgSize{};
-
- rc = pldm_send_recv(eid, fd, requestMsg.data(), requestMsg.size(),
- &responseMsg, &responseMsgSize);
- std::unique_ptr<uint8_t, decltype(std::free)*> responseMsgPtr{responseMsg,
- std::free};
- requester->markFree(eid, instanceId);
-
- if (rc != PLDM_REQUESTER_SUCCESS)
+ auto platformEventMessageResponseHandler = [](mctp_eid_t /*eid*/,
+ const pldm_msg* response,
+ size_t respMsgLen) {
+ if (response == nullptr || !respMsgLen)
+ {
+ std::cerr
+ << "Failed to receive response for platform event message \n";
+ return;
+ }
+ uint8_t completionCode{};
+ uint8_t status{};
+ auto rc = decode_platform_event_message_resp(response, respMsgLen,
+ &completionCode, &status);
+ if (rc || completionCode)
+ {
+ std::cerr << "Failed to decode_platform_event_message_resp: "
+ << "rc=" << rc
+ << ", cc=" << static_cast<unsigned>(completionCode)
+ << std::endl;
+ }
+ };
+ rc = handler->registerRequest(
+ eid, instanceId, PLDM_PLATFORM, PLDM_PLATFORM_EVENT_MESSAGE,
+ std::move(requestMsg), std::move(platformEventMessageResponseHandler));
+ if (rc)
{
- std::cerr << "Failed to send BIOS attribute update event. RC = " << rc
- << ", errno = " << errno << "\n";
- pldm::utils::reportError(
- "xyz.openbmc_project.bmc.pldm.InternalFailure");
- return rc;
+ std::cerr << "Failed to send the platform event message \n";
}
- auto responsePtr = reinterpret_cast<struct pldm_msg*>(responseMsgPtr.get());
- uint8_t completionCode{};
- uint8_t status{};
- rc = decode_platform_event_message_resp(
- responsePtr, responseMsgSize - sizeof(pldm_msg_hdr), &completionCode,
- &status);
- if (rc != PLDM_SUCCESS)
- {
- std::cerr << "Failed to decode PlatformEventMessage response, rc = "
- << rc << "\n";
- return rc;
- }
-
- if (completionCode != PLDM_SUCCESS)
- {
- std::cerr << "Failed to send the BIOS attribute update event, rc = "
- << (uint32_t)completionCode << "\n";
- pldm::utils::reportError(
- "xyz.openbmc_project.bmc.pldm.InternalFailure");
- }
-
- return completionCode;
+ return rc;
}
} // namespace platform
} // namespace responder
-} // namespace pldm
\ No newline at end of file
+} // namespace pldm
diff --git a/oem/ibm/libpldmresponder/platform_oem_ibm.hpp b/oem/ibm/libpldmresponder/platform_oem_ibm.hpp
index 639f1d5..6f3a320 100644
--- a/oem/ibm/libpldmresponder/platform_oem_ibm.hpp
+++ b/oem/ibm/libpldmresponder/platform_oem_ibm.hpp
@@ -1,6 +1,7 @@
#pragma once
#include "pldmd/dbus_impl_requester.hpp"
+#include "requester/handler.hpp"
#include <vector>
@@ -18,14 +19,15 @@
* PLDM_EVENT_TYPE_OEM_EVENT_BIOS_ATTRIBUTE_UPDATE is send to host with the
* list of BIOS attribute handles.
*
- * @param[in] fd - socket descriptor to communicate to host
* @param[in] eid - MCTP EID of host firmware
* @param[in] requester - pointer to Requester object
* @param[in] handles - List of BIOS attribute handles
+ * @param[in] handler - PLDM request handler
*/
-int sendBiosAttributeUpdateEvent(int fd, uint8_t eid,
- dbus_api::Requester* requester,
- const std::vector<uint16_t>& handles);
+int sendBiosAttributeUpdateEvent(
+ uint8_t eid, dbus_api::Requester* requester,
+ const std::vector<uint16_t>& handles,
+ pldm::requester::Handler<pldm::requester::Request>* handler);
} // namespace platform