dsp: base: Add encode req & decode resp for NegotiateTransferParameters
Added encode/decode APIs for NegotiateTransferParameters command
(0x07) which is defined in DSP0240 Version 1.2.0 section 9.6.
Change-Id: I9920e1c9c9e6d9e5999d568d8d20b4c80a1d8726
Signed-off-by: Chau Ly <chaul@amperecomputing.com>
diff --git a/tests/dsp/base.cpp b/tests/dsp/base.cpp
index 7b5bfcf..dafe09b 100644
--- a/tests/dsp/base.cpp
+++ b/tests/dsp/base.cpp
@@ -1180,3 +1180,194 @@
ASSERT_EQ(pldm_msg_hdr_correlate_response(&req, &resp), false);
}
#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(EncodeNegotiateTransferParamsRequest, GoodTest)
+{
+ uint8_t instance_id = 0;
+
+ const struct pldm_base_negotiate_transfer_params_req req_data = {
+ 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
+
+ PLDM_MSG_DEFINE_P(requestPtr,
+ PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
+ auto rc = encode_pldm_base_negotiate_transfer_params_req(
+ instance_id, &req_data, requestPtr,
+ PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
+
+ ASSERT_EQ(rc, 0);
+ EXPECT_EQ(
+ 0, memcmp(requestPtr->payload, requestMsg.data(), sizeof(requestMsg)));
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(EncodeNegotiateTransferParamsRequest, BadTestUnAllocatedPtrParams)
+{
+ int rc;
+ uint8_t instance_id = 0;
+ const struct pldm_base_negotiate_transfer_params_req req_data = {
+ 0x0001, // BE 256
+ {{0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x81}}};
+
+ PLDM_MSG_DEFINE_P(requestPtr,
+ PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
+ rc = encode_pldm_base_negotiate_transfer_params_req(
+ instance_id, nullptr, requestPtr,
+ PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
+ EXPECT_EQ(rc, -EINVAL);
+
+ rc = encode_pldm_base_negotiate_transfer_params_req(
+ instance_id, &req_data, nullptr,
+ PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
+ EXPECT_EQ(rc, -EINVAL);
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(EncodeNegotiateTransferParamsRequest,
+ BadTestInvalidExpectedOutputMsgLength)
+{
+ int rc;
+ uint8_t instance_id = 0;
+ const struct pldm_base_negotiate_transfer_params_req req_data = {
+ 0x0001, // BE 256
+ {{0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x81}}};
+
+ 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);
+ EXPECT_EQ(rc, -EOVERFLOW);
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(DecodeNegotiateTransferParamsResponse, GoodTest)
+{
+ uint8_t completionCode = PLDM_SUCCESS;
+ uint16_t responderPartSize = 128;
+ std::array<uint8_t, 8> responderProtocolSupport = {0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x81};
+
+ struct pldm_base_negotiate_transfer_params_resp resp_data = {};
+
+ PLDM_MSGBUF_DEFINE_P(buf);
+ int rc;
+
+ static constexpr const size_t payload_length =
+ PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES;
+ PLDM_MSG_DEFINE_P(responseMsg, payload_length);
+
+ rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
+ ASSERT_EQ(rc, 0);
+
+ pldm_msgbuf_insert_uint8(buf, completionCode);
+ pldm_msgbuf_insert_uint16(buf, responderPartSize);
+ rc = pldm_msgbuf_insert_array_uint8(
+ buf, sizeof(resp_data.responder_protocol_support),
+ responderProtocolSupport.data(),
+ sizeof(resp_data.responder_protocol_support));
+ EXPECT_EQ(rc, 0);
+
+ ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
+
+ rc = decode_pldm_base_negotiate_transfer_params_resp(
+ responseMsg, payload_length, &resp_data);
+
+ ASSERT_EQ(rc, 0);
+ EXPECT_EQ(resp_data.completion_code, completionCode);
+ EXPECT_EQ(resp_data.responder_part_size, responderPartSize);
+ EXPECT_EQ(0, memcmp(responderProtocolSupport.data(),
+ resp_data.responder_protocol_support,
+ sizeof(resp_data.responder_protocol_support)));
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(DecodeNegotiateTransferParamsResponse, BadTestUnAllocatedPtrParams)
+{
+ uint8_t completionCode = PLDM_SUCCESS;
+ uint16_t responderPartSize = 128;
+ std::array<uint8_t, 8> responderProtocolSupport = {0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x81};
+
+ struct pldm_base_negotiate_transfer_params_resp resp_data = {};
+
+ PLDM_MSGBUF_DEFINE_P(buf);
+ int rc;
+
+ static constexpr const size_t payload_length =
+ PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES;
+ PLDM_MSG_DEFINE_P(responseMsg, payload_length);
+
+ rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
+ ASSERT_EQ(rc, 0);
+
+ pldm_msgbuf_insert_uint8(buf, completionCode);
+ pldm_msgbuf_insert_uint16(buf, responderPartSize);
+ rc = pldm_msgbuf_insert_array_uint8(
+ buf, sizeof(resp_data.responder_protocol_support),
+ responderProtocolSupport.data(),
+ sizeof(resp_data.responder_protocol_support));
+ EXPECT_EQ(rc, 0);
+
+ ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
+
+ rc = decode_pldm_base_negotiate_transfer_params_resp(
+ nullptr, payload_length, &resp_data);
+
+ EXPECT_EQ(rc, -EINVAL);
+
+ rc = decode_pldm_base_negotiate_transfer_params_resp(
+ responseMsg, payload_length, nullptr);
+
+ EXPECT_EQ(rc, -EINVAL);
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(DecodeNegotiateTransferParamsResponse,
+ BadTestInvalidExpectedInputMsgLength)
+{
+ uint8_t completionCode = PLDM_SUCCESS;
+ uint16_t responderPartSize = 128;
+ std::array<uint8_t, 8> responderProtocolSupport = {0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x81};
+
+ struct pldm_base_negotiate_transfer_params_resp resp_data = {};
+
+ PLDM_MSGBUF_DEFINE_P(buf);
+ int rc;
+
+ static constexpr const size_t payload_length =
+ PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES;
+ PLDM_MSG_DEFINE_P(responseMsg, payload_length);
+
+ rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
+ ASSERT_EQ(rc, 0);
+
+ pldm_msgbuf_insert_uint8(buf, completionCode);
+ pldm_msgbuf_insert_uint16(buf, responderPartSize);
+ rc = pldm_msgbuf_insert_array_uint8(
+ buf, sizeof(resp_data.responder_protocol_support),
+ responderProtocolSupport.data(),
+ sizeof(resp_data.responder_protocol_support));
+ EXPECT_EQ(rc, 0);
+
+ ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
+
+ rc = decode_pldm_base_negotiate_transfer_params_resp(responseMsg, 0,
+ &resp_data);
+
+ EXPECT_EQ(rc, -EOVERFLOW);
+}
+#endif
\ No newline at end of file