Add PLDM GetTypes, GetCmds, GetVersion handlers
Google-Bug-Id: 311697203
Change-Id: Ibb430403a3a1663f0f7dee856531eea3a27f5fab
Signed-off-by: Harsh Tyagi <harshtya@google.com>
diff --git a/util/state_machine/discovery/base/base_disc_state_machine.cpp b/util/state_machine/discovery/base/base_disc_state_machine.cpp
index efb2035..d52cb39 100644
--- a/util/state_machine/discovery/base/base_disc_state_machine.cpp
+++ b/util/state_machine/discovery/base/base_disc_state_machine.cpp
@@ -22,7 +22,7 @@
OperationStatus BaseDiscoveryStateMachine::run()
{
- stdplus::print(stderr, "Trigeering PLDM Base discovery for device {}...",
+ stdplus::print(stderr, "Triggering PLDM Base discovery for device {}...\n",
this->deviceName);
if (!this->initialized &&
this->requesterStatus != StateMachineStatus::NoPendingAction)
@@ -81,9 +81,10 @@
OperationStatus BaseDiscoveryStateMachine::processGetTidRequest()
{
- int requestBytes = baseCommandRequestSize.at(PLDM_GET_TID);
- std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) + requestBytes);
+ std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
+ baseCommandRequestSize.at(PLDM_GET_TID));
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
int rc = encode_get_tid_req(this->instanceId, request);
if (rc)
{
@@ -95,9 +96,8 @@
return OperationStatus::EncodingRequestFailure;
}
- rc = pldmSendAtNetwork(this->eid, this->netId, this->fd, requestMsg.data(),
- requestMsg.size());
- if (rc)
+ if (pldmSendAtNetwork(this->eid, this->netId, this->fd, requestMsg.data(),
+ requestMsg.size()))
{
this->requesterStatus = StateMachineStatus::RequestFailed;
return OperationStatus::PldmSendFailure;
@@ -107,9 +107,9 @@
uint8_t* responseMsg = response.data();
size_t responseMsgSize = sizeof(pldm_msg_hdr) + PLDM_GET_TID_RESP_BYTES;
auto responsePtr = reinterpret_cast<struct pldm_msg*>(responseMsg);
- rc = pldmRecvAtNetwork(this->eid, this->netId, this->fd, this->instanceId,
- &responseMsg, &responseMsgSize);
- if (rc)
+
+ if (pldmRecvAtNetwork(this->eid, this->netId, this->fd, this->instanceId,
+ &responseMsg, &responseMsgSize))
{
this->requesterStatus = StateMachineStatus::RequestFailed;
return OperationStatus::PldmRecvFailure;
@@ -130,20 +130,164 @@
OperationStatus BaseDiscoveryStateMachine::processGetPldmTypesRequest()
{
- // TODO(@harshtya): Implement processGetPldmTypesRequest
- return OperationStatus::Success;
+ std::vector<uint8_t> requestMsg(
+ sizeof(pldm_msg_hdr) + baseCommandRequestSize.at(PLDM_GET_PLDM_TYPES));
+ auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+ int rc = encode_get_types_req(this->instanceId, request);
+ if (rc)
+ {
+ stdplus::print(
+ stderr,
+ "Encoding PLDM Types request failed in base discovery with rc: {} "
+ "for device {}\n",
+ rc, this->deviceName);
+ return OperationStatus::EncodingRequestFailure;
+ }
+
+ if (pldmSendAtNetwork(this->eid, this->netId, this->fd, requestMsg.data(),
+ requestMsg.size()))
+ {
+ this->requesterStatus = StateMachineStatus::RequestFailed;
+ return OperationStatus::PldmSendFailure;
+ }
+ std::vector<uint8_t> response(
+ sizeof(pldm_msg_hdr) + PLDM_GET_TYPES_RESP_BYTES, 0);
+ uint8_t* responseMsg = response.data();
+ size_t responseMsgSize = response.size();
+ auto responsePtr = reinterpret_cast<struct pldm_msg*>(responseMsg);
+
+ if (pldmRecvAtNetwork(this->eid, this->netId, this->fd, this->instanceId,
+ &responseMsg, &responseMsgSize))
+ {
+ this->requesterStatus = StateMachineStatus::RequestFailed;
+ return OperationStatus::PldmRecvFailure;
+ }
+ stdplus::print(stderr,
+ "Pushing response for GET_PLDM_TYPES for device: "
+ "{}\n",
+ this->deviceName);
+ OperationStatus status = pushCommandResponse(responsePtr, responseMsgSize);
+ if (status != OperationStatus::Success)
+ {
+ stdplus::print(stderr,
+ "Failed to push response for Get PLDM TYPES in base "
+ "discovery with status: {} for device: {}\n",
+ static_cast<int>(status), this->deviceName);
+ }
+ return status;
}
OperationStatus BaseDiscoveryStateMachine::processGetPldmVersionRequest()
{
- // TODO(@harshtya): Implement processGetPldmVersionRequest
- return OperationStatus::Success;
+ std::vector<uint8_t> requestMsg(
+ sizeof(pldm_msg_hdr) +
+ baseCommandRequestSize.at(PLDM_GET_PLDM_VERSION));
+ auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+ int rc = encode_get_version_req(this->instanceId, /*transfer_handle=*/0,
+ PLDM_GET_FIRSTPART, this->commandPldmType,
+ request);
+ if (rc)
+ {
+ stdplus::print(
+ stderr,
+ "Encoding PLDM Version request failed in base discovery with rc: "
+ "{} for device {} and pldmType: {}\n",
+ rc, this->deviceName, std::to_string(this->commandPldmType));
+ return OperationStatus::EncodingRequestFailure;
+ }
+
+ if (pldmSendAtNetwork(this->eid, this->netId, this->fd, requestMsg.data(),
+ requestMsg.size()))
+ {
+ this->requesterStatus = StateMachineStatus::RequestFailed;
+ return OperationStatus::PldmSendFailure;
+ }
+
+ std::vector<uint8_t> response(
+ sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_RESP_BYTES, 0);
+ uint8_t* responseMsg = response.data();
+ size_t responseMsgSize = response.size();
+ auto responsePtr = reinterpret_cast<struct pldm_msg*>(responseMsg);
+
+ if (pldmRecvAtNetwork(this->eid, this->netId, this->fd, this->instanceId,
+ &responseMsg, &responseMsgSize))
+ {
+ this->requesterStatus = StateMachineStatus::RequestFailed;
+ return OperationStatus::PldmRecvFailure;
+ }
+ stdplus::print(stderr,
+ "Pushing response for GET_PLDM_VERSION for device: "
+ "{} with pldmType: {}\n",
+ this->deviceName, std::to_string(this->commandPldmType));
+ OperationStatus status = pushCommandResponse(responsePtr, responseMsgSize);
+ if (status != OperationStatus::Success)
+ {
+ stdplus::print(stderr,
+ "Failed to push response for Get PLDM Version in base "
+ "discovery with status: {} for device: {} for pldm Type:"
+ " {}\n",
+ static_cast<int>(status), this->deviceName,
+ std::to_string(this->commandPldmType));
+ }
+ return status;
}
OperationStatus BaseDiscoveryStateMachine::processGetPldmCommandsRequest()
{
- // TODO(@harshtya): Implement processGetPldmCommandsRequest
- return OperationStatus::Success;
+ std::vector<uint8_t> requestMsg(
+ sizeof(pldm_msg_hdr) +
+ baseCommandRequestSize.at(PLDM_GET_PLDM_COMMANDS));
+ auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+ int rc = encode_get_commands_req(this->instanceId, this->commandPldmType,
+ this->pldmVersions[this->commandPldmType],
+ request);
+ if (rc)
+ {
+ stdplus::print(
+ stderr,
+ "Encoding PLDM Commands request failed in base discovery with rc: "
+ "{} for device {} and pldmType: {}\n",
+ rc, this->deviceName, std::to_string(this->commandPldmType));
+ return OperationStatus::EncodingRequestFailure;
+ }
+
+ if (pldmSendAtNetwork(this->eid, this->netId, this->fd, requestMsg.data(),
+ requestMsg.size()))
+ {
+ this->requesterStatus = StateMachineStatus::RequestFailed;
+ return OperationStatus::PldmSendFailure;
+ }
+ std::vector<uint8_t> response(
+ sizeof(pldm_msg_hdr) + PLDM_GET_COMMANDS_RESP_BYTES, 0);
+ uint8_t* responseMsg = response.data();
+ size_t responseMsgSize = response.size();
+ auto responsePtr = reinterpret_cast<struct pldm_msg*>(responseMsg);
+
+ if (pldmRecvAtNetwork(this->eid, this->netId, this->fd, this->instanceId,
+ &responseMsg, &responseMsgSize))
+ {
+ this->requesterStatus = StateMachineStatus::RequestFailed;
+ return OperationStatus::PldmRecvFailure;
+ }
+
+ stdplus::print(stderr,
+ "Pushing response for GET_PLDM_COMMANDS for device: "
+ "{} with pldmType: {}\n",
+ this->deviceName, std::to_string(this->commandPldmType));
+ OperationStatus status = pushCommandResponse(responsePtr, responseMsgSize);
+ if (status != OperationStatus::Success)
+ {
+ stdplus::print(stderr,
+ "Failed to push response for Get PLDM Command in base "
+ "discovery with status: {} for device: {} for pldm Type:"
+ " {}\n",
+ static_cast<int>(status), this->deviceName,
+ std::to_string(this->commandPldmType));
+ }
+ return status;
}
OperationStatus BaseDiscoveryStateMachine::pushCommandResponse(