libpldm: Add decode API for GetFirmwareParameters response

decode_get_firmware_parameters_resp_comp_set_info decodes the
GetFirmwareParameters response except the component parameter table.
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: I73da32ffa494cc1242ffe310f78acf4596ed04cf
diff --git a/libpldm/firmware_update.c b/libpldm/firmware_update.c
index 66b4ab5..b0daddb 100644
--- a/libpldm/firmware_update.c
+++ b/libpldm/firmware_update.c
@@ -79,3 +79,78 @@
 	return encode_pldm_header_only(PLDM_REQUEST, instance_id, PLDM_FWUP,

 				       PLDM_GET_FIRMWARE_PARAMETERS, msg);

 }

+

+int decode_get_firmware_parameters_resp_comp_set_info(

+    const struct pldm_msg *msg, size_t payload_length,

+    struct pldm_get_firmware_parameters_resp *resp_data,

+    struct variable_field *active_comp_image_set_ver_str,

+    struct variable_field *pending_comp_image_set_ver_str)

+{

+	if (msg == NULL || resp_data == NULL ||

+	    active_comp_image_set_ver_str == NULL ||

+	    pending_comp_image_set_ver_str == NULL) {

+

+		return PLDM_ERROR_INVALID_DATA;

+	}

+

+	if (payload_length < sizeof(struct pldm_get_firmware_parameters_resp)) {

+		return PLDM_ERROR_INVALID_LENGTH;

+	}

+

+	struct pldm_get_firmware_parameters_resp *response =

+	    (struct pldm_get_firmware_parameters_resp *)msg->payload;

+

+	resp_data->completion_code = response->completion_code;

+

+	if (PLDM_SUCCESS != resp_data->completion_code) {

+		return PLDM_SUCCESS;

+	}

+

+	if (response->active_comp_image_set_ver_str_len == 0) {

+		return PLDM_ERROR_INVALID_DATA;

+	}

+

+	size_t resp_len = sizeof(struct pldm_get_firmware_parameters_resp) +

+			  response->active_comp_image_set_ver_str_len +

+			  response->pending_comp_image_set_ver_str_len;

+

+	if (payload_length != resp_len) {

+		return PLDM_ERROR_INVALID_LENGTH;

+	}

+

+	resp_data->capabilities_during_update.value =

+	    le32toh(response->capabilities_during_update.value);

+

+	resp_data->comp_count = le16toh(response->comp_count);

+	if (resp_data->comp_count == 0) {

+		return PLDM_ERROR;

+	}

+

+	resp_data->active_comp_image_set_ver_str_type =

+	    response->active_comp_image_set_ver_str_type;

+	resp_data->active_comp_image_set_ver_str_len =

+	    response->active_comp_image_set_ver_str_len;

+	resp_data->pending_comp_image_set_ver_str_type =

+	    response->pending_comp_image_set_ver_str_type;

+	resp_data->pending_comp_image_set_ver_str_len =

+	    response->pending_comp_image_set_ver_str_len;

+

+	active_comp_image_set_ver_str->ptr =

+	    msg->payload + sizeof(struct pldm_get_firmware_parameters_resp);

+	active_comp_image_set_ver_str->length =

+	    resp_data->active_comp_image_set_ver_str_len;

+

+	if (resp_data->pending_comp_image_set_ver_str_len != 0) {

+		pending_comp_image_set_ver_str->ptr =

+		    msg->payload +

+		    sizeof(struct pldm_get_firmware_parameters_resp) +

+		    resp_data->active_comp_image_set_ver_str_len;

+		pending_comp_image_set_ver_str->length =

+		    resp_data->pending_comp_image_set_ver_str_len;

+	} else {

+		pending_comp_image_set_ver_str->ptr = NULL;

+		pending_comp_image_set_ver_str->length = 0;

+	}

+

+	return PLDM_SUCCESS;

+}