pldm: libpldmresponder: call ccOnlyResponse when en/decoding errors
Should return ccOnlyResponse when en/decoding process encounters an
error, to avoid redundant data in response.
Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: I8ae02f588740de1ffd6dde99c92046b7cc1d5c39
diff --git a/libpldmresponder/bios.cpp b/libpldmresponder/bios.cpp
index 2d3a8ee..a92d3cd 100644
--- a/libpldmresponder/bios.cpp
+++ b/libpldmresponder/bios.cpp
@@ -157,10 +157,7 @@
std::cerr << "Error getting time, PATH=" << hostTimePath
<< " TIME INTERACE=" << timeInterface << "\n";
- encode_get_date_time_resp(request->hdr.instance_id, PLDM_ERROR, seconds,
- minutes, hours, day, month, year,
- responsePtr);
- return response;
+ return CmdHandler::ccOnlyResponse(request, PLDM_ERROR);
}
uint64_t timeSec = std::chrono::duration_cast<std::chrono::seconds>(
@@ -170,8 +167,14 @@
pldm::responder::utils::epochToBCDTime(timeSec, seconds, minutes, hours,
day, month, year);
- encode_get_date_time_resp(request->hdr.instance_id, PLDM_SUCCESS, seconds,
- minutes, hours, day, month, year, responsePtr);
+ auto rc = encode_get_date_time_resp(request->hdr.instance_id, PLDM_SUCCESS,
+ seconds, minutes, hours, day, month,
+ year, responsePtr);
+ if (rc != PLDM_SUCCESS)
+ {
+ return ccOnlyResponse(request, rc);
+ }
+
return response;
}
@@ -221,15 +224,10 @@
/** @brief Construct the BIOS string table
*
- * @param[in] BIOSStringTable - the string table
- * @param[in] transferHandle - transfer handle to identify part of transfer
- * @param[in] transferOpFlag - flag to indicate which part of data being
- * transferred
- * @param[in] instanceID - instance ID to identify the command
+ * @param[in,out] BIOSStringTable - the string table
+ * @param[in] request - Request message
*/
-Response getBIOSStringTable(BIOSTable& BIOSStringTable,
- uint32_t /*transferHandle*/,
- uint8_t /*transferOpFlag*/, uint8_t instanceID)
+Response getBIOSStringTable(BIOSTable& BIOSStringTable, const pldm_msg* request)
{
Response response(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES,
@@ -237,10 +235,16 @@
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
if (!BIOSStringTable.isEmpty())
{
- encode_get_bios_table_resp(instanceID, PLDM_SUCCESS,
- 0, /* next transfer handle */
- PLDM_START_AND_END, nullptr, response.size(),
- responsePtr); // filling up the header here
+ auto rc = encode_get_bios_table_resp(
+ request->hdr.instance_id, PLDM_SUCCESS,
+ 0, /* next transfer handle */
+ PLDM_START_AND_END, nullptr, response.size(),
+ responsePtr); // filling up the header here
+ if (rc != PLDM_SUCCESS)
+ {
+ return CmdHandler::ccOnlyResponse(request, rc);
+ }
+
BIOSStringTable.load(response);
return response;
}
@@ -279,9 +283,14 @@
stringTable.size(),
0);
responsePtr = reinterpret_cast<pldm_msg*>(response.data());
- encode_get_bios_table_resp(
- instanceID, PLDM_SUCCESS, 0 /* nxtTransferHandle */, PLDM_START_AND_END,
- stringTable.data(), response.size(), responsePtr);
+ auto rc = encode_get_bios_table_resp(
+ request->hdr.instance_id, PLDM_SUCCESS, 0 /* nxtTransferHandle */,
+ PLDM_START_AND_END, stringTable.data(), response.size(), responsePtr);
+ if (rc != PLDM_SUCCESS)
+ {
+ return CmdHandler::ccOnlyResponse(request, rc);
+ }
+
return response;
}
@@ -697,19 +706,14 @@
/** @brief Construct the BIOS attribute table
*
- * @param[in] BIOSAttributeTable - the attribute table
+ * @param[in,out] BIOSAttributeTable - the attribute table
* @param[in] BIOSStringTable - the string table
- * @param[in] transferHandle - transfer handle to identify part of transfer
- * @param[in] transferOpFlag - flag to indicate which part of data being
- * transferred
- * @param[in] instanceID - instance ID to identify the command
* @param[in] biosJsonDir - path where the BIOS json files are present
+ * @param[in] request - Request message
*/
Response getBIOSAttributeTable(BIOSTable& BIOSAttributeTable,
const BIOSTable& BIOSStringTable,
- uint32_t /*transferHandle*/,
- uint8_t /*transferOpFlag*/, uint8_t instanceID,
- const char* biosJsonDir)
+ const char* biosJsonDir, const pldm_msg* request)
{
Response response(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES,
0);
@@ -734,10 +738,8 @@
if (attributeTable.empty())
{ // no available json file is found
- encode_get_bios_table_resp(instanceID, PLDM_BIOS_TABLE_UNAVAILABLE,
- nxtTransferHandle, transferFlag, nullptr,
- response.size(), responsePtr);
- return response;
+ return CmdHandler::ccOnlyResponse(request,
+ PLDM_BIOS_TABLE_UNAVAILABLE);
}
pldm::responder::utils::padAndChecksum(attributeTable);
BIOSAttributeTable.store(attributeTable);
@@ -745,15 +747,25 @@
PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES +
attributeTable.size());
responsePtr = reinterpret_cast<pldm_msg*>(response.data());
- encode_get_bios_table_resp(instanceID, PLDM_SUCCESS, nxtTransferHandle,
- transferFlag, attributeTable.data(),
- response.size(), responsePtr);
+
+ auto rc = encode_get_bios_table_resp(
+ request->hdr.instance_id, PLDM_SUCCESS, nxtTransferHandle,
+ transferFlag, attributeTable.data(), response.size(), responsePtr);
+ if (rc != PLDM_SUCCESS)
+ {
+ return CmdHandler::ccOnlyResponse(request, rc);
+ }
}
else
{ // persisted table present, constructing response
- encode_get_bios_table_resp(instanceID, PLDM_SUCCESS, nxtTransferHandle,
- transferFlag, nullptr, response.size(),
- responsePtr); // filling up the header here
+ auto rc = encode_get_bios_table_resp(
+ request->hdr.instance_id, PLDM_SUCCESS, nxtTransferHandle,
+ transferFlag, nullptr, response.size(),
+ responsePtr); // filling up the header here
+ if (rc != PLDM_SUCCESS)
+ {
+ return CmdHandler::ccOnlyResponse(request, rc);
+ }
BIOSAttributeTable.load(response);
}
@@ -796,20 +808,15 @@
/** @brief Construct the BIOS attribute value table
*
- * @param[in] BIOSAttributeValueTable - the attribute value table
+ * @param[in,out] BIOSAttributeValueTable - the attribute value table
* @param[in] BIOSAttributeTable - the attribute table
* @param[in] BIOSStringTable - the string table
- * @param[in] transferHandle - transfer handle to identify part of transfer
- * @param[in] transferOpFlag - flag to indicate which part of data being
- * transferred
- * @param[in] instanceID - instance ID to identify the command
+ * @param[in] request - Request message
*/
Response getBIOSAttributeValueTable(BIOSTable& BIOSAttributeValueTable,
const BIOSTable& BIOSAttributeTable,
const BIOSTable& BIOSStringTable,
- uint32_t& /*transferHandle*/,
- uint8_t& /*transferOpFlag*/,
- uint8_t instanceID)
+ const pldm_msg* request)
{
Response response(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES,
0);
@@ -819,9 +826,15 @@
if (!BIOSAttributeValueTable.isEmpty())
{
- encode_get_bios_table_resp(instanceID, PLDM_SUCCESS, nxtTransferHandle,
- transferFlag, nullptr, response.size(),
- responsePtr); // filling up the header here
+ auto rc = encode_get_bios_table_resp(
+ request->hdr.instance_id, PLDM_SUCCESS, nxtTransferHandle,
+ transferFlag, nullptr, response.size(),
+ responsePtr); // filling up the header here
+ if (rc != PLDM_SUCCESS)
+ {
+ return CmdHandler::ccOnlyResponse(request, rc);
+ }
+
BIOSAttributeValueTable.load(response);
return response;
}
@@ -838,10 +851,7 @@
});
if (attributeValueTable.empty())
{
- encode_get_bios_table_resp(instanceID, PLDM_BIOS_TABLE_UNAVAILABLE,
- nxtTransferHandle, transferFlag, nullptr,
- response.size(), responsePtr);
- return response;
+ return CmdHandler::ccOnlyResponse(request, PLDM_BIOS_TABLE_UNAVAILABLE);
}
pldm::responder::utils::padAndChecksum(attributeValueTable);
BIOSAttributeValueTable.store(attributeValueTable);
@@ -849,9 +859,13 @@
response.resize(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES +
attributeValueTable.size());
responsePtr = reinterpret_cast<pldm_msg*>(response.data());
- encode_get_bios_table_resp(instanceID, PLDM_SUCCESS, nxtTransferHandle,
- transferFlag, attributeValueTable.data(),
- response.size(), responsePtr);
+ auto rc = encode_get_bios_table_resp(
+ request->hdr.instance_id, PLDM_SUCCESS, nxtTransferHandle, transferFlag,
+ attributeValueTable.data(), response.size(), responsePtr);
+ if (rc != PLDM_SUCCESS)
+ {
+ return CmdHandler::ccOnlyResponse(request, rc);
+ }
return response;
}
@@ -930,9 +944,13 @@
valueLength,
0);
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
- encode_get_bios_current_value_by_handle_resp(
+ rc = encode_get_bios_current_value_by_handle_resp(
request->hdr.instance_id, PLDM_SUCCESS, 0, PLDM_START_AND_END, valuePtr,
valueLength, responsePtr);
+ if (rc != PLDM_SUCCESS)
+ {
+ return ccOnlyResponse(request, rc);
+ }
return response;
}
@@ -945,15 +963,10 @@
{
Response response(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES,
0);
- auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
if (setupConfig(biosJsonDir) != 0)
{
- encode_get_bios_table_resp(
- request->hdr.instance_id, PLDM_BIOS_TABLE_UNAVAILABLE,
- 0 /* nxtTransferHandle */, PLDM_START_AND_END, nullptr,
- response.size(), responsePtr);
- return response;
+ return CmdHandler::ccOnlyResponse(request, PLDM_BIOS_TABLE_UNAVAILABLE);
}
uint32_t transferHandle{};
@@ -962,63 +975,55 @@
auto rc = decode_get_bios_table_req(request, payloadLength, &transferHandle,
&transferOpFlag, &tableType);
- if (rc == PLDM_SUCCESS)
+ if (rc != PLDM_SUCCESS)
{
- BIOSTable BIOSStringTable(
- (std::string(biosTablePath) + "/" + stringTableFile).c_str());
- BIOSTable BIOSAttributeTable(
- (std::string(biosTablePath) + "/" + attrTableFile).c_str());
- BIOSTable BIOSAttributeValueTable(
- (std::string(biosTablePath) + "/" + attrValTableFile).c_str());
- switch (tableType)
- {
- case PLDM_BIOS_STRING_TABLE:
+ return CmdHandler::ccOnlyResponse(request, rc);
+ }
- response = getBIOSStringTable(BIOSStringTable, transferHandle,
- transferOpFlag,
- request->hdr.instance_id);
- break;
- case PLDM_BIOS_ATTR_TABLE:
+ BIOSTable BIOSStringTable(
+ (std::string(biosTablePath) + "/" + stringTableFile).c_str());
+ BIOSTable BIOSAttributeTable(
+ (std::string(biosTablePath) + "/" + attrTableFile).c_str());
+ BIOSTable BIOSAttributeValueTable(
+ (std::string(biosTablePath) + "/" + attrValTableFile).c_str());
+ switch (tableType)
+ {
+ case PLDM_BIOS_STRING_TABLE:
- if (BIOSStringTable.isEmpty())
- {
- rc = PLDM_BIOS_TABLE_UNAVAILABLE;
- }
- else
- {
- response = getBIOSAttributeTable(
- BIOSAttributeTable, BIOSStringTable, transferHandle,
- transferOpFlag, request->hdr.instance_id, biosJsonDir);
- }
- break;
- case PLDM_BIOS_ATTR_VAL_TABLE:
- if (BIOSAttributeTable.isEmpty() || BIOSStringTable.isEmpty())
- {
- rc = PLDM_BIOS_TABLE_UNAVAILABLE;
- }
- else
- {
- response = getBIOSAttributeValueTable(
- BIOSAttributeValueTable, BIOSAttributeTable,
- BIOSStringTable, transferHandle, transferOpFlag,
- request->hdr.instance_id);
- }
- break;
- default:
- rc = PLDM_INVALID_BIOS_TABLE_TYPE;
- break;
- }
+ response = getBIOSStringTable(BIOSStringTable, request);
+ break;
+ case PLDM_BIOS_ATTR_TABLE:
+
+ if (BIOSStringTable.isEmpty())
+ {
+ rc = PLDM_BIOS_TABLE_UNAVAILABLE;
+ }
+ else
+ {
+ response = getBIOSAttributeTable(
+ BIOSAttributeTable, BIOSStringTable, biosJsonDir, request);
+ }
+ break;
+ case PLDM_BIOS_ATTR_VAL_TABLE:
+ if (BIOSAttributeTable.isEmpty() || BIOSStringTable.isEmpty())
+ {
+ rc = PLDM_BIOS_TABLE_UNAVAILABLE;
+ }
+ else
+ {
+ response = getBIOSAttributeValueTable(BIOSAttributeValueTable,
+ BIOSAttributeTable,
+ BIOSStringTable, request);
+ }
+ break;
+ default:
+ rc = PLDM_INVALID_BIOS_TABLE_TYPE;
+ break;
}
if (rc != PLDM_SUCCESS)
{
- uint32_t nxtTransferHandle{};
- uint8_t transferFlag{};
- size_t respPayloadLength{};
-
- encode_get_bios_table_resp(request->hdr.instance_id, rc,
- nxtTransferHandle, transferFlag, nullptr,
- respPayloadLength, responsePtr);
+ return CmdHandler::ccOnlyResponse(request, rc);
}
return response;