dsp: firmware_update: Wrap static errno variants of package APIs

Begin the process of migrating package parsing APIs away from using PLDM
protocol completion codes for signaling errors.

For now keep the new symbols internal. They will eventually be exposed
and the current stable APIs deprecated.

Change-Id: Ieb67c43ebb0782b9da530c52de99b59edca4a648
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 01f67e7..3d4255a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -43,6 +43,7 @@
 - Returned error values for the following stable APIs have changed their
   semantics:
 
+  - `decode_descriptor_type_length_value()`
   - `decode_event_message_buffer_size_resp()`
   - `decode_get_numeric_effecter_value_resp()`
   - `decode_get_sensor_reading_resp()`
diff --git a/src/dsp/firmware_update.c b/src/dsp/firmware_update.c
index b94f019..534d068 100644
--- a/src/dsp/firmware_update.c
+++ b/src/dsp/firmware_update.c
@@ -326,19 +326,18 @@
 	}
 }
 
-LIBPLDM_ABI_STABLE
-int decode_pldm_package_header_info(
+static int decode_pldm_package_header_info_errno(
 	const uint8_t *data, size_t length,
 	struct pldm_package_header_information *package_header_info,
 	struct variable_field *package_version_str)
 {
 	if (data == NULL || package_header_info == NULL ||
 	    package_version_str == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EINVAL;
 	}
 
 	if (length < sizeof(struct pldm_package_header_information)) {
-		return PLDM_ERROR_INVALID_LENGTH;
+		return -EOVERFLOW;
 	}
 
 	struct pldm_package_header_information *data_header =
@@ -346,17 +345,17 @@
 
 	if (!is_string_type_valid(data_header->package_version_string_type) ||
 	    (data_header->package_version_string_length == 0)) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EBADMSG;
 	}
 
 	if (length < sizeof(struct pldm_package_header_information) +
 			     data_header->package_version_string_length) {
-		return PLDM_ERROR_INVALID_LENGTH;
+		return -EOVERFLOW;
 	}
 
 	if ((data_header->component_bitmap_bit_length %
 	     PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE) != 0) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EBADMSG;
 	}
 
 	memcpy(package_header_info->uuid, data_header->uuid,
@@ -379,11 +378,27 @@
 	package_version_str->length =
 		package_header_info->package_version_string_length;
 
-	return PLDM_SUCCESS;
+	return 0;
 }
 
 LIBPLDM_ABI_STABLE
-int decode_firmware_device_id_record(
+int decode_pldm_package_header_info(
+	const uint8_t *data, size_t length,
+	struct pldm_package_header_information *package_header_info,
+	struct variable_field *package_version_str)
+{
+	int rc;
+
+	rc = decode_pldm_package_header_info_errno(
+		data, length, package_header_info, package_version_str);
+	if (rc < 0) {
+		return pldm_xlate_errno(rc);
+	}
+
+	return PLDM_SUCCESS;
+}
+
+static int decode_firmware_device_id_record_errno(
 	const uint8_t *data, size_t length,
 	uint16_t component_bitmap_bit_length,
 	struct pldm_firmware_device_id_record *fw_device_id_record,
@@ -396,16 +411,16 @@
 	    applicable_components == NULL ||
 	    comp_image_set_version_str == NULL || record_descriptors == NULL ||
 	    fw_device_pkg_data == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EINVAL;
 	}
 
 	if (length < sizeof(struct pldm_firmware_device_id_record)) {
-		return PLDM_ERROR_INVALID_LENGTH;
+		return -EOVERFLOW;
 	}
 
 	if ((component_bitmap_bit_length %
 	     PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE) != 0) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EBADMSG;
 	}
 
 	struct pldm_firmware_device_id_record *data_record =
@@ -414,7 +429,7 @@
 	if (!is_string_type_valid(
 		    data_record->comp_image_set_version_string_type) ||
 	    (data_record->comp_image_set_version_string_length == 0)) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EBADMSG;
 	}
 
 	fw_device_id_record->record_length =
@@ -430,7 +445,7 @@
 		le16toh(data_record->fw_device_pkg_data_length);
 
 	if (length < fw_device_id_record->record_length) {
-		return PLDM_ERROR_INVALID_LENGTH;
+		return -EOVERFLOW;
 	}
 
 	uint16_t applicable_components_length =
@@ -444,7 +459,7 @@
 		fw_device_id_record->fw_device_pkg_data_length;
 
 	if (fw_device_id_record->record_length < calc_min_record_length) {
-		return PLDM_ERROR_INVALID_LENGTH;
+		return -EOVERFLOW;
 	}
 
 	applicable_components->ptr =
@@ -472,6 +487,29 @@
 			fw_device_id_record->fw_device_pkg_data_length;
 	}
 
+	return 0;
+}
+
+LIBPLDM_ABI_STABLE
+int decode_firmware_device_id_record(
+	const uint8_t *data, size_t length,
+	uint16_t component_bitmap_bit_length,
+	struct pldm_firmware_device_id_record *fw_device_id_record,
+	struct variable_field *applicable_components,
+	struct variable_field *comp_image_set_version_str,
+	struct variable_field *record_descriptors,
+	struct variable_field *fw_device_pkg_data)
+{
+	int rc;
+
+	rc = decode_firmware_device_id_record_errno(
+		data, length, component_bitmap_bit_length, fw_device_id_record,
+		applicable_components, comp_image_set_version_str,
+		record_descriptors, fw_device_pkg_data);
+	if (rc < 0) {
+		return pldm_xlate_errno(rc);
+	}
+
 	return PLDM_SUCCESS;
 }
 
@@ -509,20 +547,19 @@
 	return pldm_msgbuf_destroy(buf);
 }
 
-LIBPLDM_ABI_STABLE
-int decode_descriptor_type_length_value(const uint8_t *data, size_t length,
-					uint16_t *descriptor_type,
-					struct variable_field *descriptor_data)
+static int decode_descriptor_type_length_value_errno(
+	const uint8_t *data, size_t length, uint16_t *descriptor_type,
+	struct variable_field *descriptor_data)
 {
 	uint16_t descriptor_length = 0;
 
 	if (data == NULL || descriptor_type == NULL ||
 	    descriptor_data == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EINVAL;
 	}
 
 	if (length < PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN) {
-		return PLDM_ERROR_INVALID_LENGTH;
+		return -EOVERFLOW;
 	}
 
 	struct pldm_descriptor_tlv *entry =
@@ -533,34 +570,49 @@
 	if (*descriptor_type != PLDM_FWUP_VENDOR_DEFINED) {
 		if (descriptor_length !=
 		    get_descriptor_type_length(*descriptor_type)) {
-			return PLDM_ERROR_INVALID_LENGTH;
+			return -EBADMSG;
 		}
 	}
 
 	if (length < (sizeof(*descriptor_type) + sizeof(descriptor_length) +
 		      descriptor_length)) {
-		return PLDM_ERROR_INVALID_LENGTH;
+		return -EOVERFLOW;
 	}
 
 	descriptor_data->ptr = entry->descriptor_data;
 	descriptor_data->length = descriptor_length;
 
-	return PLDM_SUCCESS;
+	return 0;
 }
 
 LIBPLDM_ABI_STABLE
-int decode_vendor_defined_descriptor_value(
+int decode_descriptor_type_length_value(const uint8_t *data, size_t length,
+					uint16_t *descriptor_type,
+					struct variable_field *descriptor_data)
+{
+	int rc;
+
+	rc = decode_descriptor_type_length_value_errno(
+		data, length, descriptor_type, descriptor_data);
+	if (rc < 0) {
+		return pldm_xlate_errno(rc);
+	}
+
+	return PLDM_SUCCESS;
+}
+
+static int decode_vendor_defined_descriptor_value_errno(
 	const uint8_t *data, size_t length, uint8_t *descriptor_title_str_type,
 	struct variable_field *descriptor_title_str,
 	struct variable_field *descriptor_data)
 {
 	if (data == NULL || descriptor_title_str_type == NULL ||
 	    descriptor_title_str == NULL || descriptor_data == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EINVAL;
 	}
 
 	if (length < sizeof(struct pldm_vendor_defined_descriptor_title_data)) {
-		return PLDM_ERROR_INVALID_LENGTH;
+		return -EOVERFLOW;
 	}
 
 	struct pldm_vendor_defined_descriptor_title_data *entry =
@@ -568,13 +620,13 @@
 	if (!is_string_type_valid(
 		    entry->vendor_defined_descriptor_title_str_type) ||
 	    (entry->vendor_defined_descriptor_title_str_len == 0)) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EBADMSG;
 	}
 
 	// Assuming at least 1 byte of VendorDefinedDescriptorData
 	if (length < (sizeof(struct pldm_vendor_defined_descriptor_title_data) +
 		      entry->vendor_defined_descriptor_title_str_len)) {
-		return PLDM_ERROR_INVALID_LENGTH;
+		return -EOVERFLOW;
 	}
 
 	*descriptor_title_str_type =
@@ -591,22 +643,39 @@
 		sizeof(entry->vendor_defined_descriptor_title_str_len) -
 		descriptor_title_str->length;
 
-	return PLDM_SUCCESS;
+	return 0;
 }
 
 LIBPLDM_ABI_STABLE
-int decode_pldm_comp_image_info(
+int decode_vendor_defined_descriptor_value(
+	const uint8_t *data, size_t length, uint8_t *descriptor_title_str_type,
+	struct variable_field *descriptor_title_str,
+	struct variable_field *descriptor_data)
+{
+	int rc;
+
+	rc = decode_vendor_defined_descriptor_value_errno(
+		data, length, descriptor_title_str_type, descriptor_title_str,
+		descriptor_data);
+	if (rc < 0) {
+		return pldm_xlate_errno(rc);
+	}
+
+	return PLDM_SUCCESS;
+}
+
+static int decode_pldm_comp_image_info_errno(
 	const uint8_t *data, size_t length,
 	struct pldm_component_image_information *pldm_comp_image_info,
 	struct variable_field *comp_version_str)
 {
 	if (data == NULL || pldm_comp_image_info == NULL ||
 	    comp_version_str == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EINVAL;
 	}
 
 	if (length < sizeof(struct pldm_component_image_information)) {
-		return PLDM_ERROR_INVALID_LENGTH;
+		return -EOVERFLOW;
 	}
 
 	struct pldm_component_image_information *data_header =
@@ -614,12 +683,12 @@
 
 	if (!is_string_type_valid(data_header->comp_version_string_type) ||
 	    (data_header->comp_version_string_length == 0)) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EBADMSG;
 	}
 
 	if (length < sizeof(struct pldm_component_image_information) +
 			     data_header->comp_version_string_length) {
-		return PLDM_ERROR_INVALID_LENGTH;
+		return -EOVERFLOW;
 	}
 
 	pldm_comp_image_info->comp_classification =
@@ -643,12 +712,12 @@
 	if ((pldm_comp_image_info->comp_options.bits.bit1 == false &&
 	     pldm_comp_image_info->comp_comparison_stamp !=
 		     PLDM_FWUP_INVALID_COMPONENT_COMPARISON_TIMESTAMP)) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EBADMSG;
 	}
 
 	if (pldm_comp_image_info->comp_location_offset == 0 ||
 	    pldm_comp_image_info->comp_size == 0) {
-		return PLDM_ERROR_INVALID_DATA;
+		return -EBADMSG;
 	}
 
 	comp_version_str->ptr =
@@ -656,6 +725,23 @@
 	comp_version_str->length =
 		pldm_comp_image_info->comp_version_string_length;
 
+	return 0;
+}
+
+LIBPLDM_ABI_STABLE
+int decode_pldm_comp_image_info(
+	const uint8_t *data, size_t length,
+	struct pldm_component_image_information *pldm_comp_image_info,
+	struct variable_field *comp_version_str)
+{
+	int rc;
+
+	rc = decode_pldm_comp_image_info_errno(
+		data, length, pldm_comp_image_info, comp_version_str);
+	if (rc < 0) {
+		return pldm_xlate_errno(rc);
+	}
+
 	return PLDM_SUCCESS;
 }
 
diff --git a/tests/dsp/firmware_update.cpp b/tests/dsp/firmware_update.cpp
index b4f6f92..78f81db 100644
--- a/tests/dsp/firmware_update.cpp
+++ b/tests/dsp/firmware_update.cpp
@@ -612,7 +612,7 @@
     rc = decode_descriptor_type_length_value(invalidIANADescriptor1.data(),
                                              invalidIANADescriptor1.size(),
                                              &descriptorType, &descriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
 
     // IANA Enterprise ID descriptor data less than length
     std::array<uint8_t, 7> invalidIANADescriptor2{0x01, 0x00, 0x04, 0x00,