Add a flag to disable the fec data computation
The write of fec data is currently mandatory in the update engine. This
step reduces the update package size but it's also time comsuming. So we
add a flag to allow partners make the trade off and disable the on device
fec data computation.
Bug: 139723500
Test: generate and apply incremental updates for verified boot 1.0 & 2.0
Change-Id: Ic7c63396bb4d4fbbc3c3b2e9ff3804c9ff941f2f
diff --git a/payload_generator/generate_delta_main.cc b/payload_generator/generate_delta_main.cc
index 3cb891f..7c304ce 100644
--- a/payload_generator/generate_delta_main.cc
+++ b/payload_generator/generate_delta_main.cc
@@ -421,6 +421,9 @@
"",
"An info file specifying dynamic partition metadata. "
"Only allowed in major version 2 or newer.");
+ DEFINE_bool(disable_fec_computation,
+ false,
+ "Disables the fec data computation on device.");
brillo::FlagHelper::Init(
argc,
@@ -527,6 +530,8 @@
<< "Partition name can't be empty, see --partition_names.";
payload_config.target.partitions.emplace_back(partition_names[i]);
payload_config.target.partitions.back().path = new_partitions[i];
+ payload_config.target.partitions.back().disable_fec_computation =
+ FLAGS_disable_fec_computation;
if (i < new_mapfiles.size())
payload_config.target.partitions.back().mapfile_path = new_mapfiles[i];
}
diff --git a/payload_generator/payload_generation_config.h b/payload_generator/payload_generation_config.h
index 584ac7b..e90edde 100644
--- a/payload_generator/payload_generation_config.h
+++ b/payload_generator/payload_generation_config.h
@@ -116,6 +116,9 @@
PostInstallConfig postinstall;
VerityConfig verity;
+
+ // Enables the on device fec data computation by default.
+ bool disable_fec_computation = false;
};
// The ImageConfig struct describes a pair of binaries kernel and rootfs and the
diff --git a/payload_generator/payload_generation_config_android.cc b/payload_generator/payload_generation_config_android.cc
index 90c053f..d950092 100644
--- a/payload_generator/payload_generation_config_android.cc
+++ b/payload_generator/payload_generation_config_android.cc
@@ -63,11 +63,13 @@
part->verity.hash_tree_extent = ExtentForBytes(
hashtree.hash_block_size, hashtree.tree_offset, hashtree.tree_size);
- part->verity.fec_data_extent =
- ExtentForBytes(hashtree.data_block_size, 0, hashtree.fec_offset);
- part->verity.fec_extent = ExtentForBytes(
- hashtree.data_block_size, hashtree.fec_offset, hashtree.fec_size);
- part->verity.fec_roots = hashtree.fec_num_roots;
+ if (!part->disable_fec_computation) {
+ part->verity.fec_data_extent =
+ ExtentForBytes(hashtree.data_block_size, 0, hashtree.fec_offset);
+ part->verity.fec_extent = ExtentForBytes(
+ hashtree.data_block_size, hashtree.fec_offset, hashtree.fec_size);
+ part->verity.fec_roots = hashtree.fec_num_roots;
+ }
return true;
}
@@ -205,7 +207,8 @@
ExtentForRange(hash_start_block, tree_size / block_size);
}
fec_ecc_metadata ecc_data;
- if (fh.get_ecc_metadata(ecc_data) && ecc_data.valid) {
+ if (!part.disable_fec_computation && fh.get_ecc_metadata(ecc_data) &&
+ ecc_data.valid) {
TEST_AND_RETURN_FALSE(block_size == FEC_BLOCKSIZE);
part.verity.fec_data_extent = ExtentForRange(0, ecc_data.blocks);
part.verity.fec_extent =
diff --git a/payload_generator/payload_generation_config_android_unittest.cc b/payload_generator/payload_generation_config_android_unittest.cc
index 53378c2..44eaf55 100644
--- a/payload_generator/payload_generation_config_android_unittest.cc
+++ b/payload_generator/payload_generation_config_android_unittest.cc
@@ -160,6 +160,24 @@
EXPECT_EQ(2u, verity.fec_roots);
}
+TEST_F(PayloadGenerationConfigAndroidTest, LoadVerityConfigDisableFecTest) {
+ brillo::Blob part = GetAVBPartition();
+ test_utils::WriteFileVector(temp_file_.path(), part);
+ image_config_.partitions[0].disable_fec_computation = true;
+ EXPECT_TRUE(image_config_.LoadImageSize());
+ EXPECT_TRUE(image_config_.partitions[0].OpenFilesystem());
+ EXPECT_TRUE(image_config_.LoadVerityConfig());
+ const VerityConfig& verity = image_config_.partitions[0].verity;
+ EXPECT_FALSE(verity.IsEmpty());
+ EXPECT_EQ(ExtentForRange(0, 2), verity.hash_tree_data_extent);
+ EXPECT_EQ(ExtentForRange(2, 1), verity.hash_tree_extent);
+ EXPECT_EQ("sha1", verity.hash_tree_algorithm);
+ brillo::Blob salt(kHashTreeSalt, std::end(kHashTreeSalt));
+ EXPECT_EQ(salt, verity.hash_tree_salt);
+ EXPECT_EQ(0u, verity.fec_data_extent.num_blocks());
+ EXPECT_EQ(0u, verity.fec_extent.num_blocks());
+}
+
TEST_F(PayloadGenerationConfigAndroidTest,
LoadVerityConfigInvalidHashTreeTest) {
brillo::Blob part = GetAVBPartition();
diff --git a/scripts/brillo_update_payload b/scripts/brillo_update_payload
index a238ddf..23d2d7e 100755
--- a/scripts/brillo_update_payload
+++ b/scripts/brillo_update_payload
@@ -28,12 +28,16 @@
# check verify a payload using paycheck (static testing)
#
# Generate command arguments:
-# --payload generated unsigned payload output file
-# --source_image if defined, generate a delta payload from the specified
-# image to the target_image
-# --target_image the target image that should be sent to clients
-# --metadata_size_file if defined, generate a file containing the size of the
-# payload metadata in bytes to the specified file
+# --payload generated unsigned payload output file
+# --source_image if defined, generate a delta payload from the
+# specified image to the target_image
+# --target_image the target image that should be sent to clients
+# --metadata_size_file if defined, generate a file containing the size
+# of the ayload metadata in bytes to the specified
+# file
+# --disable_fec_computation Disable the on device fec data computation for
+# incremental update. This feature is enabled by
+# default
#
# Hash command arguments:
# --unsigned_payload the input unsigned payload to generate the hash from
@@ -182,6 +186,9 @@
"Optional: The maximum unix timestamp of the OS allowed to apply this \
payload, should be set to a number higher than the build timestamp of the \
system running on the device, 0 if not specified."
+ DEFINE_string disable_fec_computation "" \
+ "Optional: Disables the on device fec data computation for incremental \
+update. This feature is enabled by default."
fi
if [[ "${COMMAND}" == "hash" || "${COMMAND}" == "sign" ]]; then
DEFINE_string unsigned_payload "" "Path to the input unsigned payload."
@@ -656,6 +663,10 @@
if [[ -n "${FORCE_MINOR_VERSION}" ]]; then
GENERATOR_ARGS+=( --minor_version="${FORCE_MINOR_VERSION}" )
fi
+ if [[ -n "${FLAGS_disable_fec_computation}" ]]; then
+ GENERATOR_ARGS+=(
+ --disable_fec_computation="${FLAGS_disable_fec_computation}" )
+ fi
fi
if [[ -n "${FORCE_MAJOR_VERSION}" ]]; then