blob: 7c199c11c3c277ca8e5549cbf4ebf29f281b4068 [file] [log] [blame]
#include "pldm_base_cmd.hpp"
#include "pldm_cmd_helper.hpp"
#include <string>
constexpr uint8_t PLDM_ENTITY_ID = 8;
constexpr uint8_t MCTP_MSG_TYPE_PLDM = 1;
constexpr uint8_t PLDM_LOCAL_INSTANCE_ID = 0;
using namespace std;
/*
* Main function that handles the GetPLDMTypes response callback via mctp
*
*/
void getPLDMTypes(vector<std::string>&& /*args*/)
{
// Create and encode the request message
vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
sizeof(MCTP_MSG_TYPE_PLDM) +
sizeof(PLDM_ENTITY_ID));
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
// Encode the get_types request message
uint8_t instanceId = PLDM_LOCAL_INSTANCE_ID;
auto returnCode = encode_get_types_req(instanceId, request);
if (returnCode)
{
cerr << "Failed to encode request msg for GetPLDMType : RC = "
<< returnCode << endl;
return;
}
cout << "Encoded request succesfully : RC = " << returnCode << endl;
// Insert the PLDM message type and EID at the begining of the request msg.
requestMsg.insert(requestMsg.begin(), MCTP_MSG_TYPE_PLDM);
requestMsg.insert(requestMsg.begin(), PLDM_ENTITY_ID);
cout << "Request Message:" << endl;
printBuffer(requestMsg);
// Create the response message
vector<uint8_t> responseMsg;
// Compares the response with request packet on first socket recv() call.
// If above condition is qualified then, reads the actual response from
// the socket to output buffer responseMsg.
returnCode = mctpSockSendRecv(requestMsg, responseMsg);
if (!returnCode)
{
cout << "Socket recv() successful : RC = " << returnCode << endl;
cout << "Response Message : " << endl;
printBuffer(responseMsg);
}
else
{
cerr << "Failed to recieve from socket : RC = " << returnCode << endl;
return;
}
}
/*
* Main function that handles the GetPLDMVersion response callback via mctp
*
*/
void getPLDMVersion(vector<std::string>&& args)
{
// Create a request packet
std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
PLDM_GET_VERSION_REQ_BYTES);
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
uint8_t pldmType = 0x0;
if (!args[1].c_str())
{
cout << "Mandatory argument PLDM Command Type not provided!" << endl;
cout << "Run pldmtool --help for more information" << endl;
return;
}
if (!strcasecmp(args[1].c_str(), "base"))
{
cout << "PLDM Type requested : " << args[1] << endl;
pldmType = PLDM_BASE;
}
else if (!strcasecmp(args[1].c_str(), "bios"))
{
cout << "PLDM Type requested : " << args[1] << endl;
pldmType = PLDM_BIOS;
}
else if (!strcasecmp(args[1].c_str(), "fru"))
{
cout << "PLDM Type requested : " << args[1] << endl;
pldmType = PLDM_FRU;
}
else if (!strcasecmp(args[1].c_str(), "oem"))
{
cout << "PLDM Type requested : " << args[1] << endl;
pldmType = PLDM_OEM;
}
else
{
cerr << "Unsupported pldm command type OR not supported yet : "
<< args[1] << endl;
return;
}
uint8_t instanceId = PLDM_LOCAL_INSTANCE_ID;
uint32_t transferHandle = 0x0;
transfer_op_flag opFlag = PLDM_GET_FIRSTPART;
// encode the get_version request
auto returnCode = encode_get_version_req(instanceId, transferHandle, opFlag,
pldmType, request);
if (returnCode)
{
cerr << "Failed to encode request msg for GetPLDMVersion. RC = "
<< returnCode << endl;
return;
}
cout << "Encoded request succesfully : RC = " << returnCode << endl;
// Insert the PLDM message type and EID at the begining of the request msg.
requestMsg.insert(requestMsg.begin(), MCTP_MSG_TYPE_PLDM);
requestMsg.insert(requestMsg.begin(), PLDM_ENTITY_ID);
cout << "Request Message:" << endl;
printBuffer(requestMsg);
// Create the response message
vector<uint8_t> responseMsg;
// Compares the response with request packet on first socket recv() call.
// If above condition is qualified then, reads the actual response from
// the socket to output buffer responseMsg.
returnCode = mctpSockSendRecv(requestMsg, responseMsg);
if (!returnCode)
{
cout << "Socket recv() successful : RC = " << returnCode << endl;
cout << "Response Message:" << endl;
printBuffer(responseMsg);
}
else
{
cerr << "Failed to recieve from socket : RC = " << returnCode << endl;
return;
}
}
/*
* Main function that handles the PLDM raw command response callback via mctp
*
*/
void handleRawOp(vector<std::string>&& args)
{
// Minimu 3 bytes of header data needs to passed. else its a invalid request
if (size(args) < 3)
{
cerr << "Not enough arguments passed."
" Minimum, need to pass PLDM header raw data"
<< endl;
return;
}
// Create a request packet and initialize it
std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
requestMsg.clear();
// Read the raw data passed in the command line
// Form request message from the raw data passed
for (auto&& rawByte : args)
{
requestMsg.insert(requestMsg.end(), stoi(rawByte, nullptr, 16));
}
// Validating the payload raw data based on pldm command type
uint8_t pldmCmd = requestMsg[2];
switch (pldmCmd)
{
case PLDM_GET_PLDM_VERSION:
if (size(requestMsg) !=
(sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_REQ_BYTES))
{
cerr << "Not enough raw data provided." << endl;
cerr << "Total length can be = 3 bytes of header + 6 bytes"
" for payload. Please refer spec for details"
<< endl;
return;
}
break;
case PLDM_GET_TID:
case PLDM_GET_PLDM_TYPES:
if (size(requestMsg) != sizeof(pldm_msg_hdr))
{
cerr << "Total length can be = 3 bytes of header + 0 bytes"
" for payload. Please refer spec for details"
<< endl;
return;
}
break;
case PLDM_GET_PLDM_COMMANDS:
if (size(requestMsg) !=
sizeof(pldm_msg_hdr) + PLDM_GET_COMMANDS_REQ_BYTES)
{
cerr << "Total length can be = 3 bytes of header + 5 bytes"
" for payload. Please refer spec for details"
<< endl;
return;
}
break;
case PLDM_SET_STATE_EFFECTER_STATES:
// payload size depends on comp_effecter_count
// if count=1 then, request size will be 8 bytes including header
// if count=9 then, request size will be 19 bytes including header
if ((size(requestMsg) < 8) ||
(size(requestMsg) >
sizeof(pldm_msg_hdr) +
PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES))
{
cerr << "Total length can be = 3 bytes of header + min/max 8/19"
" bytes for payload. Please refer spec for details"
<< endl;
return;
}
break;
default:
cerr << "Command Not supported/implemented : " << args[2] << endl;
cerr << "Contact backend Team" << endl;
return;
}
// Add the MCTP type and PLDM entity id at the end
requestMsg.insert(requestMsg.begin(), MCTP_MSG_TYPE_PLDM);
requestMsg.insert(requestMsg.begin(), PLDM_ENTITY_ID);
cout << "Request Message" << endl;
printBuffer(requestMsg);
// Create the response message
vector<uint8_t> responseMsg;
// Compares the response with request packet on first socket recv() call.
// If above condition is qualified then, reads the actual response from
// the socket to output buffer responseMsg.
int returnCode = mctpSockSendRecv(requestMsg, responseMsg);
if (!returnCode)
{
cout << "Socket recv() successful : RC = " << returnCode << endl;
cout << "Response Message:" << endl;
printBuffer(responseMsg);
}
else
{
cerr << "Failed to recieve from socket : RC = " << returnCode << endl;
return;
}
}