libpldm: Added encode API for GetFirmwareParameters cmd

Update agent sends GetFirmwareParameters command to acquire the
component details such as classification types and corresponding
versions of  firmware device. Its defined in DSP0267 Version
1.1.0 sec:10.2.

Tested: Unit tests passed

Signed-off-by: gokulsanker <gokul.sanker.v.g@intel.com>
Change-Id: I52a8b266195c3ed29aca61085518df5756ca09e2
diff --git a/libpldm/firmware_update.c b/libpldm/firmware_update.c
index 031ec85..66b4ab5 100644
--- a/libpldm/firmware_update.c
+++ b/libpldm/firmware_update.c
@@ -58,9 +58,24 @@
 	if (*descriptor_count == 0) {

 		return PLDM_ERROR_INVALID_DATA;

 	}

-

 	*descriptor_data =

 	    (uint8_t *)(msg->payload +

 			sizeof(struct pldm_query_device_identifiers_resp));

 	return PLDM_SUCCESS;

 }

+

+int encode_get_firmware_parameters_req(uint8_t instance_id,

+				       size_t payload_length,

+				       struct pldm_msg *msg)

+{

+	if (msg == NULL) {

+		return PLDM_ERROR_INVALID_DATA;

+	}

+

+	if (payload_length != PLDM_GET_FIRMWARE_PARAMETERS_REQ_BYTES) {

+		return PLDM_ERROR_INVALID_LENGTH;

+	}

+

+	return encode_pldm_header_only(PLDM_REQUEST, instance_id, PLDM_FWUP,

+				       PLDM_GET_FIRMWARE_PARAMETERS, msg);

+}

diff --git a/libpldm/firmware_update.h b/libpldm/firmware_update.h
index 6ebfa79..4d0b052 100644
--- a/libpldm/firmware_update.h
+++ b/libpldm/firmware_update.h
@@ -11,10 +11,14 @@
  *         2 bytes for descriptor length and atleast 1 byte of descriptor data

  */

 #define PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN 5

+#define PLDM_GET_FIRMWARE_PARAMETERS_REQ_BYTES 0

 

 /** @brief PLDM Firmware update commands

  */

-enum pldm_firmware_update_commands { PLDM_QUERY_DEVICE_IDENTIFIERS = 0x01 };

+enum pldm_firmware_update_commands {

+	PLDM_QUERY_DEVICE_IDENTIFIERS = 0x01,

+	PLDM_GET_FIRMWARE_PARAMETERS = 0x02

+};

 

 /** @struct pldm_query_device_identifiers_resp

  *

@@ -58,6 +62,21 @@
 					 uint32_t *device_identifiers_len,

 					 uint8_t *descriptor_count,

 					 uint8_t **descriptor_data);

+

+/** @brief Create a PLDM request message for GetFirmwareParameters

+ *

+ *  @param[in] instance_id - Message's instance id

+ *  @param[in] payload_length - Length of the request message payload

+ *  @param[in,out] msg - Message will be written to this

+ *

+ *  @return pldm_completion_codes

+ *

+ *  @note  Caller is responsible for memory alloc and dealloc of param

+ *         'msg.payload'

+ */

+int encode_get_firmware_parameters_req(uint8_t instance_id,

+				       size_t payload_length,

+				       struct pldm_msg *msg);

 #ifdef __cplusplus

 }

 #endif

diff --git a/libpldm/tests/libpldm_firmware_update_test.cpp b/libpldm/tests/libpldm_firmware_update_test.cpp
index 489be16..cb0ec5a 100644
--- a/libpldm/tests/libpldm_firmware_update_test.cpp
+++ b/libpldm/tests/libpldm_firmware_update_test.cpp
@@ -62,3 +62,18 @@
                              sizeof(struct pldm_query_device_identifiers_resp),

                          responseMsg.end()));

 }

+

+TEST(GetFirmwareParameters, goodPathEncodeRequest)

+{

+    std::array<uint8_t, sizeof(pldm_msg_hdr)> requestMsg{};

+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());

+    uint8_t instanceId = 0x01;

+

+    auto rc = encode_get_firmware_parameters_req(

+        instanceId, PLDM_GET_FIRMWARE_PARAMETERS_REQ_BYTES, requestPtr);

+    EXPECT_EQ(rc, PLDM_SUCCESS);

+    EXPECT_EQ(requestPtr->hdr.request, PLDM_REQUEST);

+    EXPECT_EQ(requestPtr->hdr.instance_id, instanceId);

+    EXPECT_EQ(requestPtr->hdr.type, PLDM_FWUP);

+    EXPECT_EQ(requestPtr->hdr.command, PLDM_GET_FIRMWARE_PARAMETERS);

+}