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));