libpldmresponder: implement setStateEffecterStates
This commit implements the handler for setStateEffecterStates response.
Apart from that it actually sets the effecter for PLDM_BOOT_PROGRESS
state. This is used when host sends setStateEffecterStates to mark
any change in hypervisor state. The currently supported states are
"StandBy" and "BootComplete" as per
xyz.openbmc_project.State.OperatingSystem.Status
Change-Id: I205627b2b8a796a0dd4a200ac3d59c1d19d71f01
Signed-off-by: Sampa Misra <sampmisr@in.ibm.com>
diff --git a/libpldmresponder/platform.cpp b/libpldmresponder/platform.cpp
index 5fa14c8..538c49c 100644
--- a/libpldmresponder/platform.cpp
+++ b/libpldmresponder/platform.cpp
@@ -1,11 +1,7 @@
-#include "config.h"
#include "platform.hpp"
-#include "pdr.hpp"
-
-#include <exception>
-#include <phosphor-logging/log.hpp>
+#include "registration.hpp"
namespace pldm
{
@@ -13,7 +9,20 @@
namespace responder
{
+namespace platform
+{
+
+void registerHandlers()
+{
+ registerHandler(PLDM_PLATFORM, PLDM_GET_PDR, std::move(getPDR));
+ registerHandler(PLDM_PLATFORM, PLDM_SET_STATE_EFFECTER_STATES,
+ std::move(setStateEffecterStates));
+}
+
+} // namespace platform
+
using namespace phosphor::logging;
+using namespace pldm::responder::effecter::dbus_mapping;
Response getPDR(const pldm_msg* request, size_t payloadLength)
{
@@ -83,5 +92,42 @@
return response;
}
+Response setStateEffecterStates(const pldm_msg* request, size_t payloadLength)
+{
+ Response response(
+ sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES, 0);
+ auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
+ uint16_t effecterId;
+ uint8_t compEffecterCnt;
+ constexpr auto maxCompositeEffecterCnt = 8;
+ std::vector<set_effecter_state_field> stateField(maxCompositeEffecterCnt,
+ {0, 0});
+
+ if ((payloadLength > PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES) ||
+ (payloadLength < sizeof(effecterId) + sizeof(compEffecterCnt) +
+ sizeof(set_effecter_state_field)))
+ {
+ encode_set_state_effecter_states_resp(
+ request->hdr.instance_id, PLDM_ERROR_INVALID_LENGTH, responsePtr);
+ return response;
+ }
+
+ int rc = decode_set_state_effecter_states_req(request, payloadLength,
+ &effecterId, &compEffecterCnt,
+ stateField.data());
+
+ if (rc == PLDM_SUCCESS)
+ {
+ stateField.resize(compEffecterCnt);
+ const DBusHandler dBusIntf;
+ rc = setStateEffecterStatesHandler<DBusHandler>(dBusIntf, effecterId,
+ stateField);
+ }
+
+ encode_set_state_effecter_states_resp(request->hdr.instance_id, rc,
+ responsePtr);
+ return response;
+}
+
} // namespace responder
} // namespace pldm