rbextract: support devices directly showing ERD magic
authorRoger Pueyo Centelles <roger.pueyo@guifi.net>
Thu, 28 Nov 2019 12:29:12 +0000 (13:29 +0100)
committerAdrian Schmutzler <freifunk@adrianschmutzler.de>
Thu, 23 Jan 2020 14:28:03 +0000 (15:28 +0100)
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 <roger.pueyo@guifi.net>
Acked-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
package/utils/rbextract/Makefile
package/utils/rbextract/src/rbextract.c

index b055a615cf1a022e9cb07ed1e17cccafdb8b5d99..4bc6898b11fd58e219f88552e14516b3b467c53f 100644 (file)
@@ -2,6 +2,7 @@
 # Copyright (C) 2010 Gabor Juhos <juhosg@openwrt.org>
 # Copyright (C) 2018 Chris Schimp <silverchris@gmail.com>
 # Copyright (C) 2019 Robert Marko <robimarko@gmail.com>
+# Copyright (C) 2019 Roger Pueyo Centelles <roger.pueyo@guifi.net>
 #
 # 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
index 0985497f3ffcc264003704dcfb2ffc450353dc83..ceed2494a12191fca302bdd890bfeb959af4e80a 100644 (file)
@@ -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: