dsp: base: Let some encode APIs accept pointer to payload_length
In order to achieve [1], this commit updates some encoding APIs to
accept the length of the message as an in/out parameter (pointer to
size_t). The APIs are then updated to return the encoded payload length
through this parameter.
The unit tests for these APIs are updated accordingly. The change list
includes:
- encode_pldm_base_multipart_receive_req()
- encode_pldm_base_negotiate_transfer_params_req()
[1]: https://github.com/openbmc/libpldm/blob/main/CONTRIBUTING.md?plain=1#L270-L272
Change-Id: I17cb3641b2c4a7a30fe757a3275b1713499484cc
Signed-off-by: Chau Ly <chaul@amperecomputing.com>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d46a9fa..771a9cd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -40,6 +40,10 @@
- `decode_pldm_file_descriptor_pdr()` to
`decode_pldm_platform_file_descriptor_pdr()`
+- base: Let `payload_length` be an in/out buffer for:
+ - `encode_pldm_base_multipart_receive_req()`
+ - `encode_pldm_base_negotiate_transfer_params_req()`
+
### Deprecated
### Removed
diff --git a/include/libpldm/base.h b/include/libpldm/base.h
index 75197d3..83a3336 100644
--- a/include/libpldm/base.h
+++ b/include/libpldm/base.h
@@ -719,7 +719,7 @@
* @param[in] instance_id - Message's instance id
* @param[in] req - The pointer to the request message to be encoded
* @param[in,out] msg - Message will be written to this
- * @param[in] payload_length - length of request message payload
+ * @param[in, out] payload_length - length of request message payload
* @return 0 on success
* -EINVAL if the input parameters' memory are not allocated,
* or message type or instance in request header is invalid
@@ -728,7 +728,7 @@
*/
int encode_pldm_base_multipart_receive_req(
uint8_t instance_id, const struct pldm_base_multipart_receive_req *req,
- struct pldm_msg *msg, size_t payload_length);
+ struct pldm_msg *msg, size_t *payload_length);
/** @brief Decode a PLDM MultipartReceive response message
*
@@ -802,7 +802,7 @@
* @param[in] instance_id - Message's instance id
* @param[in] req - The pointer to the request message to be encoded
* @param[in,out] msg - Message will be written to this
- * @param[in] payload_length - length of request message payload
+ * @param[in, out] payload_length - length of request message payload
* @return 0 on success
* -EINVAL if the input parameters' memory are not allocated,
* or message type or instance in request header is invalid
@@ -812,7 +812,7 @@
int encode_pldm_base_negotiate_transfer_params_req(
uint8_t instance_id,
const struct pldm_base_negotiate_transfer_params_req *req,
- struct pldm_msg *msg, size_t payload_length);
+ struct pldm_msg *msg, size_t *payload_length);
/** @brief Decode a PLDM Negotiate Transfer Parameters response message
*
diff --git a/src/dsp/base.c b/src/dsp/base.c
index c8a9210..c227beb 100644
--- a/src/dsp/base.c
+++ b/src/dsp/base.c
@@ -585,12 +585,12 @@
LIBPLDM_ABI_TESTING
int encode_pldm_base_multipart_receive_req(
uint8_t instance_id, const struct pldm_base_multipart_receive_req *req,
- struct pldm_msg *msg, size_t payload_length)
+ struct pldm_msg *msg, size_t *payload_length)
{
PLDM_MSGBUF_DEFINE_P(buf);
int rc;
- if (req == NULL || msg == NULL) {
+ if (req == NULL || msg == NULL || payload_length == NULL) {
return -EINVAL;
}
@@ -606,7 +606,7 @@
}
rc = pldm_msgbuf_init_errno(buf, PLDM_MULTIPART_RECEIVE_REQ_BYTES,
- msg->payload, payload_length);
+ msg->payload, *payload_length);
if (rc) {
return rc;
}
@@ -618,7 +618,7 @@
pldm_msgbuf_insert(buf, req->section_offset);
pldm_msgbuf_insert(buf, req->section_length);
- return pldm_msgbuf_complete(buf);
+ return pldm_msgbuf_complete_used(buf, *payload_length, payload_length);
}
LIBPLDM_ABI_TESTING
@@ -795,12 +795,12 @@
int encode_pldm_base_negotiate_transfer_params_req(
uint8_t instance_id,
const struct pldm_base_negotiate_transfer_params_req *req,
- struct pldm_msg *msg, size_t payload_length)
+ struct pldm_msg *msg, size_t *payload_length)
{
PLDM_MSGBUF_DEFINE_P(buf);
int rc;
- if (req == NULL || msg == NULL) {
+ if (req == NULL || msg == NULL || payload_length == NULL) {
return -EINVAL;
}
@@ -817,7 +817,7 @@
rc = pldm_msgbuf_init_errno(
buf, PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES,
- msg->payload, payload_length);
+ msg->payload, *payload_length);
if (rc) {
return rc;
}
@@ -831,7 +831,7 @@
return pldm_msgbuf_discard(buf, rc);
}
- return pldm_msgbuf_complete(buf);
+ return pldm_msgbuf_complete_used(buf, *payload_length, payload_length);
}
LIBPLDM_ABI_TESTING
diff --git a/tests/dsp/base.cpp b/tests/dsp/base.cpp
index fbecd60..723810e 100644
--- a/tests/dsp/base.cpp
+++ b/tests/dsp/base.cpp
@@ -756,7 +756,10 @@
const struct pldm_base_multipart_receive_req req_data = {
PLDM_BASE, PLDM_XFER_FIRST_PART, 0x01, 0x10, 0x00, 0x10};
- std::array<uint8_t, PLDM_MULTIPART_RECEIVE_REQ_BYTES> requestMsg = {
+ static constexpr const size_t requestMsgLength =
+ PLDM_MULTIPART_RECEIVE_REQ_BYTES;
+
+ std::array<uint8_t, requestMsgLength> requestMsg = {
PLDM_BASE, PLDM_XFER_FIRST_PART,
0x01, 0x00,
0x00, 0x00,
@@ -767,13 +770,15 @@
0x10, 0x00,
0x00, 0x00};
- PLDM_MSG_DEFINE_P(requestPtr, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
+ PLDM_MSG_DEFINE_P(requestPtr, requestMsgLength);
+ size_t payload_length = requestMsgLength;
auto rc = encode_pldm_base_multipart_receive_req(
- instance_id, &req_data, requestPtr, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
+ instance_id, &req_data, requestPtr, &payload_length);
ASSERT_EQ(rc, 0);
EXPECT_EQ(
0, memcmp(requestPtr->payload, requestMsg.data(), sizeof(requestMsg)));
+ EXPECT_EQ(payload_length, requestMsgLength);
}
#endif
@@ -786,13 +791,17 @@
const struct pldm_base_multipart_receive_req req_data = {
PLDM_BASE, PLDM_XFER_FIRST_PART, 0x01, 0x10, 0x00, 0x10};
- PLDM_MSG_DEFINE_P(requestPtr, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
- rc = encode_pldm_base_multipart_receive_req(
- instance_id, nullptr, requestPtr, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
+ static constexpr const size_t requestMsgLength =
+ PLDM_MULTIPART_RECEIVE_REQ_BYTES;
+
+ PLDM_MSG_DEFINE_P(requestPtr, requestMsgLength);
+ size_t payload_length = requestMsgLength;
+ rc = encode_pldm_base_multipart_receive_req(instance_id, nullptr,
+ requestPtr, &payload_length);
EXPECT_EQ(rc, -EINVAL);
- rc = encode_pldm_base_multipart_receive_req(
- instance_id, &req_data, nullptr, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
+ rc = encode_pldm_base_multipart_receive_req(instance_id, &req_data, nullptr,
+ &payload_length);
EXPECT_EQ(rc, -EINVAL);
}
#endif
@@ -806,10 +815,13 @@
const struct pldm_base_multipart_receive_req req_data = {
PLDM_BASE, PLDM_XFER_FIRST_PART, 0x01, 0x10, 0x00, 0x10};
- PLDM_MSG_DEFINE_P(requestPtr, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
+ static constexpr const size_t requestMsgLength =
+ PLDM_MULTIPART_RECEIVE_REQ_BYTES;
+ PLDM_MSG_DEFINE_P(requestPtr, requestMsgLength);
+ size_t payload_length = 1;
rc = encode_pldm_base_multipart_receive_req(instance_id, &req_data,
- requestPtr, 1);
+ requestPtr, &payload_length);
EXPECT_EQ(rc, -EOVERFLOW);
}
#endif
@@ -1443,21 +1455,24 @@
0x0001, // BE 256
{{0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x81}}};
- std::array<uint8_t, PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES>
- requestMsg = {0x01, 0x00, // requester_part_size = 256
- 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x81}; // requester_protocol_support =
- // PLDM_BASE & PLDM_FILE
+ static constexpr const size_t requestMsgLength =
+ PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES;
- PLDM_MSG_DEFINE_P(requestPtr,
- PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
+ std::array<uint8_t, requestMsgLength> requestMsg = {
+ 0x01, 0x00, // requester_part_size = 256
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x81}; // requester_protocol_support =
+ // PLDM_BASE & PLDM_FILE
+
+ PLDM_MSG_DEFINE_P(requestPtr, requestMsgLength);
+ size_t payload_length = requestMsgLength;
auto rc = encode_pldm_base_negotiate_transfer_params_req(
- instance_id, &req_data, requestPtr,
- PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
+ instance_id, &req_data, requestPtr, &payload_length);
ASSERT_EQ(rc, 0);
EXPECT_EQ(
0, memcmp(requestPtr->payload, requestMsg.data(), sizeof(requestMsg)));
+ EXPECT_EQ(payload_length, requestMsgLength);
}
#endif
@@ -1470,16 +1485,17 @@
0x0001, // BE 256
{{0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x81}}};
- PLDM_MSG_DEFINE_P(requestPtr,
- PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
+ static constexpr const size_t requestMsgLength =
+ PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES;
+
+ PLDM_MSG_DEFINE_P(requestPtr, requestMsgLength);
+ size_t payload_length = requestMsgLength;
rc = encode_pldm_base_negotiate_transfer_params_req(
- instance_id, nullptr, requestPtr,
- PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
+ instance_id, nullptr, requestPtr, &payload_length);
EXPECT_EQ(rc, -EINVAL);
rc = encode_pldm_base_negotiate_transfer_params_req(
- instance_id, &req_data, nullptr,
- PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
+ instance_id, &req_data, nullptr, &payload_length);
EXPECT_EQ(rc, -EINVAL);
}
#endif
@@ -1497,8 +1513,9 @@
PLDM_MSG_DEFINE_P(requestPtr,
PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
- rc = encode_pldm_base_negotiate_transfer_params_req(instance_id, &req_data,
- requestPtr, 1);
+ size_t payload_length = 1;
+ rc = encode_pldm_base_negotiate_transfer_params_req(
+ instance_id, &req_data, requestPtr, &payload_length);
EXPECT_EQ(rc, -EOVERFLOW);
}
#endif