firmware_update: Add DSP0267 v1.2.0 version updates

- Added `component_opaque_data` fields to relevant data structures.
- Implemented decode functionality for these fields to correctly
  parse their contents.
- Added unit tests for DSP0267 v1.2.0 to verify the new
  decoding functionality.

Change-Id: I47a85b5c9f7cc28da6066e88e27e8dc877cc074b
Signed-off-by: Carter Chen <carter.chen.wiwynn@gmail.com>
diff --git a/src/dsp/firmware_update.c b/src/dsp/firmware_update.c
index a074472..ada373b 100644
--- a/src/dsp/firmware_update.c
+++ b/src/dsp/firmware_update.c
@@ -340,7 +340,7 @@
 	static const struct pldm_package_header_format_revision_info {
 		pldm_uuid identifier;
 		size_t magic;
-	} revision_info[1 + PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR02H] = {
+	} revision_info[1 + PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR03H] = {
 		[0] = {
 			.identifier = {0},
 			.magic = 0,
@@ -364,6 +364,16 @@
 				LIBPLDM_SIZEAT(struct pldm_package_component_image_information, component_version_string) +
 				LIBPLDM_SIZEAT(struct pldm_package_iter, infos),
 		},
+		[PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR03H] = { /* PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR03H */
+			.identifier = PLDM_PACKAGE_HEADER_IDENTIFIER_V1_2,
+			.magic =
+				LIBPLDM_SIZEAT(struct pldm__package_header_information, package) +
+				LIBPLDM_SIZEAT(struct pldm_package_firmware_device_id_record, firmware_device_package_data) +
+				LIBPLDM_SIZEAT(struct pldm_descriptor, descriptor_data) +
+				LIBPLDM_SIZEAT(struct pldm_package_downstream_device_id_record, package_data) +
+				LIBPLDM_SIZEAT(struct pldm_package_component_image_information, component_opaque_data) +
+				LIBPLDM_SIZEAT(struct pldm_package_iter, infos),
+		},
 	};
 
 	const struct pldm_package_header_format_revision_info *info;
@@ -384,11 +394,11 @@
 		return -EINVAL;
 	}
 
-	if (pin->format.revision > PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR02H) {
+	if (pin->format.revision > PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR03H) {
 		return -ENOTSUP;
 	}
 	static_assert(ARRAY_SIZE(revision_info) ==
-			      1 + PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR02H,
+			      1 + PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR03H,
 		      "Mismatched array bounds test");
 
 	info = &revision_info[pin->format.revision];
@@ -422,6 +432,10 @@
 	    memcmp(revision_info[PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR02H]
 			   .identifier,
 		   hdr->package_header_identifier,
+		   sizeof(hdr->package_header_identifier)) != 0 &&
+	    memcmp(revision_info[PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR03H]
+			   .identifier,
+		   hdr->package_header_identifier,
 		   sizeof(hdr->package_header_identifier)) != 0) {
 		return pldm_msgbuf_discard(buf, -ENOTSUP);
 	}
@@ -3429,6 +3443,25 @@
 	pldm_msgbuf_span_required(buf, info->component_version_string.length,
 				  (void **)&info->component_version_string.ptr);
 
+	/* Supported in package header revision 1.2 (FR03H) and above. */
+	if (hdr->package_header_format_revision >=
+	    PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR03H) {
+		rc = pldm_msgbuf_extract_uint32_to_size(
+			buf, info->component_opaque_data.length);
+		if (rc) {
+			return pldm_msgbuf_discard(buf, rc);
+		}
+		pldm_msgbuf_span_required(
+			buf, info->component_opaque_data.length,
+			(void **)&info->component_opaque_data.ptr);
+	} else {
+		info->component_opaque_data.length = 0;
+	}
+
+	if (info->component_opaque_data.length == 0) {
+		info->component_opaque_data.ptr = NULL;
+	}
+
 	pldm_msgbuf_span_remaining(buf, (void **)&iter->field.ptr,
 				   &iter->field.length);