From 7d39946ea0fe954bcd0c4d52fffc6d9dc6248cf6 Mon Sep 17 00:00:00 2001 From: Roger Pueyo Centelles Date: Thu, 28 Nov 2019 13:29:12 +0100 Subject: [PATCH] rbextract: support devices directly showing ERD magic Older ath79-based MikroTik devices have the ERD calibration data compressed and stored different to newer IPQ40xx ones. This commit adds support for these former ones. Signed-off-by: Roger Pueyo Centelles Acked-by: Koen Vandeputte --- package/utils/rbextract/Makefile | 3 ++- package/utils/rbextract/src/rbextract.c | 28 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/package/utils/rbextract/Makefile b/package/utils/rbextract/Makefile index b055a615cf1a..4bc6898b11fd 100644 --- a/package/utils/rbextract/Makefile +++ b/package/utils/rbextract/Makefile @@ -2,6 +2,7 @@ # Copyright (C) 2010 Gabor Juhos # Copyright (C) 2018 Chris Schimp # Copyright (C) 2019 Robert Marko +# Copyright (C) 2019 Roger Pueyo Centelles # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -10,7 +11,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=rbextract -PKG_RELEASE:=1 +PKG_RELEASE:=2 CMAKE_INSTALL:=1 include $(INCLUDE_DIR)/package.mk diff --git a/package/utils/rbextract/src/rbextract.c b/package/utils/rbextract/src/rbextract.c index 0985497f3ffc..ceed2494a121 100644 --- a/package/utils/rbextract/src/rbextract.c +++ b/package/utils/rbextract/src/rbextract.c @@ -333,7 +333,35 @@ __rb_get_wlan_data(void) goto err_free_rle_out; } } + /* Older ath79-based boards directly show the RB_MAGIC_ERD bytes followed by + the LZO-compressed calibration data with no RLE */ + if (magic == RB_MAGIC_ERD) { + if (tag_len > RB_ART_SIZE) { + printf("Calibration data too large\n"); + goto err_free_lzo_in; + } + + err = routerboot_find_tag(tag, tag_len, + 0x1, &buf_lzo_in, &erd_tag_len); + if (err) { + printf("No ERD chunk found\n"); + goto err_free_lzo_out; + } + + printf("Decompressing with LZO\n"); + lzo_out_len = RB_ART_SIZE; + err = lzo1x_decompress_safe(buf_lzo_in, tag_len, + buf_lzo_out, &lzo_out_len, NULL); + /* For some reason, I get this "input not consumed" error + * even though the output is correct, so ignore it. */ + if (err && err != LZO_E_INPUT_NOT_CONSUMED) { + printf("unable to decompress calibration data: %d\n", + err); + goto err_free_lzo_out; + } + buf_rle_out = buf_lzo_out; + } return buf_rle_out; err_free_rle_out: -- 2.30.2