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