dsp: firmware_update: Flags for decode_pldm_firmware_update_package()

Allow influencing the parser behavior down the track.

Change-Id: If63284f5c67b7a8e40d5b3176f5b8367038eb98e
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 63bfec5..a3675ea 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -64,6 +64,7 @@
 
 - Reworked the firmware update package parsing APIs to track parse state using a
   run-time state machine
+- Add flags parameter to `decode_pldm_firmware_update_package()`
 
 ### Deprecated
 
diff --git a/include/libpldm/firmware_update.h b/include/libpldm/firmware_update.h
index 596f708..d7b58e8 100644
--- a/include/libpldm/firmware_update.h
+++ b/include/libpldm/firmware_update.h
@@ -2468,6 +2468,7 @@
 	const struct pldm_package_format_pin *pin;
 	const pldm_package_header_information_pad *hdr;
 	enum pldm_package_parse state;
+	uint32_t flags;
 	struct variable_field package;
 	struct variable_field areas;
 	struct pldm_package_iter iter;
@@ -2481,6 +2482,7 @@
  * @param[in] pin The maximum supported package format revision of the caller
  * @param[out] hdr The parsed package header structure
  * @param[out] pkg State-tracking for parsing subsequent package records and components
+ * @param[in] flags Affects the parsing behaviour of the library
  *
  * @pre @p pkg must be zero-initialised.
  *
@@ -2488,6 +2490,7 @@
  * components, and to initialise @p pkg prior to any subsequent extraction of
  * package records and components.
  *
+ * @note @p flags must be zero
  * @note @p data is stored in @iter for later reference, and therefore must
  *       out-live @p iter
  * @note @p hdr is stored in @iter for later reference, and therefore must
@@ -2507,7 +2510,8 @@
 int decode_pldm_firmware_update_package(
 	const void *data, size_t length,
 	const struct pldm_package_format_pin *pin,
-	pldm_package_header_information_pad *hdr, struct pldm_package *pkg);
+	pldm_package_header_information_pad *hdr, struct pldm_package *pkg,
+	uint32_t flags);
 
 LIBPLDM_ITERATOR
 bool pldm_package_firmware_device_id_record_iter_end(
diff --git a/src/dsp/firmware_update.c b/src/dsp/firmware_update.c
index 8c2e1db..0f757ba 100644
--- a/src/dsp/firmware_update.c
+++ b/src/dsp/firmware_update.c
@@ -582,6 +582,7 @@
 	pkg->pin = pin;
 	pkg->hdr = hdr;
 	pkg->state = PLDM_PACKAGE_PARSE_HEADER;
+	pkg->flags = 0;
 	pkg->package.ptr = data;
 	pkg->package.length = length;
 
@@ -3258,12 +3259,17 @@
 int decode_pldm_firmware_update_package(
 	const void *data, size_t length,
 	const struct pldm_package_format_pin *pin,
-	pldm_package_header_information_pad *hdr, struct pldm_package *pkg)
+	pldm_package_header_information_pad *hdr, struct pldm_package *pkg,
+	uint32_t flags)
 {
 	if (!data || !pin || !hdr || !pkg) {
 		return -EINVAL;
 	}
 
+	if (flags) {
+		return -EINVAL;
+	}
+
 	return decode_pldm_package_header_info_errno(data, length, pin, hdr,
 						     pkg);
 }
diff --git a/tests/dsp/firmware_update.cpp b/tests/dsp/firmware_update.cpp
index d467f00..53ff4ff 100644
--- a/tests/dsp/firmware_update.cpp
+++ b/tests/dsp/firmware_update.cpp
@@ -4832,19 +4832,23 @@
     uint8_t data;
     int rc;
 
-    rc = decode_pldm_firmware_update_package(nullptr, 0, &pin, &hdr, &pkg);
+    rc = decode_pldm_firmware_update_package(nullptr, 0, &pin, &hdr, &pkg, 0);
     EXPECT_EQ(rc, -EINVAL);
 
     rc = decode_pldm_firmware_update_package(&data, sizeof(data), nullptr, &hdr,
-                                             &pkg);
+                                             &pkg, 0);
     EXPECT_EQ(rc, -EINVAL);
 
     rc = decode_pldm_firmware_update_package(&data, sizeof(data), &pin, nullptr,
-                                             &pkg);
+                                             &pkg, 0);
     EXPECT_EQ(rc, -EINVAL);
 
     rc = decode_pldm_firmware_update_package(&data, sizeof(data), &pin, &hdr,
-                                             nullptr);
+                                             nullptr, 0);
+    EXPECT_EQ(rc, -EINVAL);
+
+    rc = decode_pldm_firmware_update_package(&data, sizeof(data), &pin, &hdr,
+                                             &pkg, UINT32_MAX);
     EXPECT_EQ(rc, -EINVAL);
 }
 #endif
@@ -4871,7 +4875,7 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(&data, sizeof(data), &pin, &hdr,
-                                             &pkg);
+                                             &pkg, 0);
     EXPECT_EQ(rc, -ENOTSUP);
 }
 #endif
@@ -4911,11 +4915,11 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(&data, sizeof(data), &lowPin, &hdr,
-                                             &pkg);
+                                             &pkg, 0);
     EXPECT_EQ(rc, -EINVAL);
 
     rc = decode_pldm_firmware_update_package(&data, sizeof(data), &highPin,
-                                             &hdr, &pkg);
+                                             &hdr, &pkg, 0);
     EXPECT_EQ(rc, -ENOTSUP);
 }
 #endif
@@ -4955,11 +4959,11 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(&data, sizeof(data), &lowPin, &hdr,
-                                             &pkg);
+                                             &pkg, 0);
     EXPECT_EQ(rc, -EINVAL);
 
     rc = decode_pldm_firmware_update_package(&data, sizeof(data), &highPin,
-                                             &hdr, &pkg);
+                                             &hdr, &pkg, 0);
     EXPECT_EQ(rc, -EINVAL);
 }
 #endif
@@ -4999,7 +5003,7 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(&data, sizeof(data), &pin, &hdr,
-                                             &pkg);
+                                             &pkg, 0);
     EXPECT_EQ(rc, -ENOTSUP);
 }
 #endif
@@ -5023,7 +5027,7 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(package.data(), package.size(),
-                                             &pin, &hdr, &pkg);
+                                             &pin, &hdr, &pkg, 0);
     EXPECT_EQ(rc, -ENOTSUP);
 }
 #endif
@@ -5061,7 +5065,7 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(package.data(), package.size(),
-                                             &pin, &hdr, &pkg);
+                                             &pin, &hdr, &pkg, 0);
     ASSERT_EQ(rc, 0);
 
     EXPECT_EQ(memcmp(PLDM_FWUP_PACKAGE_HEADER_IDENTIFIER_V1_0.data(),
@@ -5194,7 +5198,7 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(package.data(), package.size(),
-                                             &pin, &hdr, &pkg);
+                                             &pin, &hdr, &pkg, 0);
     ASSERT_EQ(rc, 0);
 
     EXPECT_EQ(memcmp(PLDM_FWUP_PACKAGE_HEADER_IDENTIFIER_V1_0.data(),
@@ -5302,7 +5306,7 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(package.data(), package.size(),
-                                             &pin, &hdr, &pkg);
+                                             &pin, &hdr, &pkg, 0);
     ASSERT_EQ(rc, 0);
 
     EXPECT_EQ(memcmp(PLDM_FWUP_PACKAGE_HEADER_IDENTIFIER_V1_0.data(),
@@ -5468,7 +5472,7 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(package.data(), package.size(),
-                                             &pin, &hdr, &pkg);
+                                             &pin, &hdr, &pkg, 0);
     ASSERT_EQ(rc, 0);
 
     EXPECT_EQ(memcmp(PLDM_FWUP_PACKAGE_HEADER_IDENTIFIER_V1_1.data(),
@@ -5690,7 +5694,7 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(package.data(), package.size(),
-                                             &pin, &hdr, &pkg);
+                                             &pin, &hdr, &pkg, 0);
     ASSERT_EQ(rc, 0);
 
     EXPECT_EQ(memcmp(PLDM_FWUP_PACKAGE_HEADER_IDENTIFIER_V1_2.data(),
@@ -5924,7 +5928,7 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(package.data(), package.size(),
-                                             &pin, &hdr, &pkg);
+                                             &pin, &hdr, &pkg, 0);
     ASSERT_EQ(rc, 0);
 
     EXPECT_EQ(memcmp(PLDM_FWUP_PACKAGE_HEADER_IDENTIFIER_V1_3.data(),
@@ -6167,7 +6171,7 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(package.data(), package.size(),
-                                             &pin, &hdr, &pkg);
+                                             &pin, &hdr, &pkg, 0);
     ASSERT_EQ(rc, 0);
 
     foreach_pldm_package_downstream_device_id_record(pkg, ddrec, rc)
@@ -6221,7 +6225,7 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(package.data(), package.size(),
-                                             &pin, &hdr, &pkg);
+                                             &pin, &hdr, &pkg, 0);
     ASSERT_EQ(rc, 0);
 
     foreach_pldm_package_component_image_information(pkg, info, rc)
@@ -6277,7 +6281,7 @@
     int rc;
 
     rc = decode_pldm_firmware_update_package(package.data(), package.size(),
-                                             &pin, &hdr, &pkg);
+                                             &pin, &hdr, &pkg, 0);
     ASSERT_EQ(rc, 0);
 
     foreach_pldm_package_firmware_device_id_record(pkg, fdrec, rc)
diff --git a/tools/pd.c b/tools/pd.c
index d88cea2..edafe38 100644
--- a/tools/pd.c
+++ b/tools/pd.c
@@ -119,7 +119,8 @@
 	}
 
 	in = fread(package, 1, PD_PACKAGE_BUFFER, stdin);
-	rc = decode_pldm_firmware_update_package(package, in, &pin, &hdr, &pkg);
+	rc = decode_pldm_firmware_update_package(package, in, &pin, &hdr, &pkg,
+						 0);
 	if (rc < 0) {
 		warnx("Failed to parse PLDM package: %s\n",
 		      strerrorname_np(-rc));