[PATCH] tplink-safeloader: Patch to handle partitions with alternate names.

oklo at oklona.net oklo at oklona.net
Mon May 2 09:24:24 PDT 2022


From: Ole Kristian Lona <oklo at oklona.net>

Some devices, specifically Deco M4R-v3 / M5. These devices have
fallback partitions which will be used in case the device
determines that the primary partition set is unbootable.

Signed-off-by: Ole Kristian Lona <oklo at oklona.net>
---
 src/tplink-safeloader.c | 67 +++++++++++++++++++++++++++++++++--------
 1 file changed, 55 insertions(+), 12 deletions(-)

diff --git a/src/tplink-safeloader.c b/src/tplink-safeloader.c
index fc46124..0ddbc02 100644
--- a/src/tplink-safeloader.c
+++ b/src/tplink-safeloader.c
@@ -53,6 +53,15 @@ struct flash_partition_entry {
 	uint32_t size;
 };
 
+/** Flash partition names table entry */
+struct factory_partition_names {
+	const char *partition_table;
+	const char *soft_ver;
+	const char *os_image;
+	const char *file_system;
+	const char *extra_para;
+};
+
 /** Partition trailing padding definitions
  * Values 0x00 to 0xff are reserved to indicate the padding value
  * Values from 0x100 are reserved to indicate other behaviour */
@@ -89,6 +98,7 @@ struct device_info {
 	struct flash_partition_entry partitions[MAX_PARTITIONS+1];
 	const char *first_sysupgrade_partition;
 	const char *last_sysupgrade_partition;
+	struct factory_partition_names partition_names;
 };
 
 #define SOFT_VER_TEXT(_t) {.type = SOFT_VER_TYPE_TEXT, .text = _t}
@@ -2982,8 +2992,10 @@ static void set_source_date_epoch() {
 }
 
 /** Generates the partition-table partition */
-static struct image_partition_entry make_partition_table(const struct flash_partition_entry *p) {
-	struct image_partition_entry entry = alloc_image_partition("partition-table", 0x800);
+static struct image_partition_entry make_partition_table(const char *name,
+	const struct flash_partition_entry *p)
+{
+	struct image_partition_entry entry = alloc_image_partition(name, 0x800);
 
 	char *s = (char *)entry.data, *end = (char *)(s+entry.size);
 
@@ -3018,14 +3030,14 @@ static inline uint8_t bcd(uint8_t v) {
 
 
 /** Generates the soft-version partition */
-static struct image_partition_entry make_soft_version(
+static struct image_partition_entry make_soft_version(const char *name,
 	const struct device_info *info, uint32_t rev)
 {
 	/** If an info string is provided, use this instead of
 	 * the structured data, and include the null-termination */
 	if (info->soft_ver.type == SOFT_VER_TYPE_TEXT) {
 		uint32_t len = strlen(info->soft_ver.text) + 1;
-		return init_meta_partition_entry("soft-version",
+		return init_meta_partition_entry(name,
 			info->soft_ver.text, len, info->part_trail);
 	}
 
@@ -3055,11 +3067,11 @@ static struct image_partition_entry make_soft_version(
 	};
 
 	if (info->soft_ver_compat_level == 0)
-		return init_meta_partition_entry("soft-version", &s,
+		return init_meta_partition_entry(name, &s,
 			(uint8_t *)(&s.compat_level) - (uint8_t *)(&s),
 			info->part_trail);
 	else
-		return init_meta_partition_entry("soft-version", &s,
+		return init_meta_partition_entry(name, &s,
 			sizeof(s), info->part_trail);
 }
 
@@ -3306,6 +3318,8 @@ static void build_image(const char *output,
 	struct flash_partition_entry *os_image_partition = NULL;
 	struct flash_partition_entry *file_system_partition = NULL;
 	size_t firmware_partition_index = 0;
+	char fs_name[32];
+	char os_name[32];
 
 	for (i = 0; info->partitions[i].name; i++) {
 		if (!strcmp(info->partitions[i].name, "firmware"))
@@ -3330,7 +3344,13 @@ static void build_image(const char *output,
 		for (i = MAX_PARTITIONS-1; i >= firmware_partition_index + 1; i--)
 			info->partitions[i+1] = info->partitions[i];
 
-		file_system_partition->name = "file-system";
+		if (info->partition_names.file_system == NULL)
+			file_system_partition->name = "file-system";
+		else {
+			strcpy(fs_name, info->partition_names.file_system);
+			file_system_partition->name = fs_name;
+		}
+
 		file_system_partition->base = firmware_partition->base + kernel.st_size;
 
 		/* Align partition start to erase blocks for factory images only */
@@ -3339,15 +3359,38 @@ static void build_image(const char *output,
 
 		file_system_partition->size = firmware_partition->size - file_system_partition->base;
 
-		os_image_partition->name = "os-image";
+		if (info->partition_names.os_image == NULL)
+			os_image_partition->name = "os-image";
+		else {
+			strcpy(os_name, info->partition_names.os_image);
+			os_image_partition->name = os_name;
+		}
+
 		os_image_partition->size = kernel.st_size;
 	}
 
-	parts[0] = make_partition_table(info->partitions);
-	parts[1] = make_soft_version(info, rev);
+	if (info->partition_names.partition_table == NULL)
+		parts[0] = make_partition_table("partition-table", info->partitions);
+	else
+		parts[0] = make_partition_table(info->partition_names.partition_table, info->partitions);
+
+	if (info->partition_names.soft_ver == NULL)
+		parts[1] = make_soft_version("soft-version", info, rev);
+	else
+		parts[1] = make_soft_version(info->partition_names.soft_ver, info, rev);
+
 	parts[2] = make_support_list(info);
-	parts[3] = read_file("os-image", kernel_image, false, NULL);
-	parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof, file_system_partition);
+
+	if (info->partition_names.os_image == NULL)
+		parts[3] = read_file("os-image", kernel_image, false, NULL);
+	else
+		parts[3] = read_file(info->partition_names.os_image, kernel_image, false, NULL);
+
+	if (info->partition_names.file_system == NULL)
+		parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof, file_system_partition);
+	else
+		parts[4] = read_file(info->partition_names.file_system, rootfs_image, add_jffs2_eof, file_system_partition);
+
 
 	/* Some devices need the extra-para partition to accept the firmware */
 	if (strcasecmp(info->id, "ARCHER-A6-V3") == 0 ||
-- 
2.32.0




More information about the openwrt-devel mailing list