Re: [PATCH] bcm53xx: add support for Meraki MR26

2022-07-02 Thread Christian Marangi
On Sat, Jul 02, 2022 at 05:23:51PM +0200, Christian Lamparter wrote:
> On 02/07/2022 17:05, Christian Marangi wrote:
> > > +++ 
> > > b/target/linux/bcm53xx/base-files/etc/hotplug.d/ieee80211/10-fix-mac-address
> > > @@ -0,0 +1,18 @@
> > > +#!/bin/ash
> > > +
> > > +[ "$ACTION" = "add" ] || exit 0
> > > +
> > Sorry for OT and unreleated question.
> > We are doing a nvmem migration and some device can declare precal bin
> > with nvmem cells but mac addrs still require special handling with a
> > script. We currently ""abuse"" the system requesting the precal bin but
> > this is problematic if we drop the precal bin (since it will be provided
> > via nvmem) and mac won't be patched.
> > 
> > I notice you are using this and wonder does this gets called when each
> > wifi gets probed?
> > 
> > Think will be an good solution to my problem.
> > 
> > Just asking some info sorry for the OT question again.
> > 
> 
> No worries, this script pops up from time to time. I've
> copied that from ath79 or was it mpc85xx?
> 
> yes, each phyX when registered issues a hotplug-call. procd/hotplug
> then checks if something exists in /etc/hotplug.d/%SUBSYSTEM%
> (i.e ieee80211) and then executes the script with various environment
> variables set. This is orchestrated by the /etc/hotplug.json rule
> at the very end of the file.
> 
> Does this help?
> 
> Cheers,
> Christian

Yes I think this is just what we need to patch the mac on ath10k.
Thanks for the explaination. This will totally help.

-- 
Ansuel

___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


Re: [PATCH] bcm53xx: add support for Meraki MR26

2022-07-02 Thread Christian Lamparter

On 02/07/2022 17:05, Christian Marangi wrote:

+++ b/target/linux/bcm53xx/base-files/etc/hotplug.d/ieee80211/10-fix-mac-address
@@ -0,0 +1,18 @@
+#!/bin/ash
+
+[ "$ACTION" = "add" ] || exit 0
+

Sorry for OT and unreleated question.
We are doing a nvmem migration and some device can declare precal bin
with nvmem cells but mac addrs still require special handling with a
script. We currently ""abuse"" the system requesting the precal bin but
this is problematic if we drop the precal bin (since it will be provided
via nvmem) and mac won't be patched.

I notice you are using this and wonder does this gets called when each
wifi gets probed?

Think will be an good solution to my problem.

Just asking some info sorry for the OT question again.



No worries, this script pops up from time to time. I've
copied that from ath79 or was it mpc85xx?

yes, each phyX when registered issues a hotplug-call. procd/hotplug
then checks if something exists in /etc/hotplug.d/%SUBSYSTEM%
(i.e ieee80211) and then executes the script with various environment
variables set. This is orchestrated by the /etc/hotplug.json rule
at the very end of the file.

Does this help?

Cheers,
Christian

___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


Re: [PATCH] bcm53xx: add support for Meraki MR26

2022-07-02 Thread Christian Marangi
On Sat, Jul 02, 2022 at 04:55:37PM +0200, Christian Lamparter wrote:
> Meraki MR26 is an EOL wireless access point featuring a
> PoE ethernet port and two dual-band 3x3 MIMO 802.11n
> radios and 1x1 dual-band WIFI dedicated to scanning.
> 
> Thank you Amir for the unit and PSU.
> 
> Hardware info:
> SOC   : Broadcom BCM53015A1KFEBG (dual-core Cortex-A9 CPU at 800 MHz)
> RAM   : SK hynix Inc. H5TQ1G63EFR, 1 Gbit DDR3 SDRAM = 128 MiB
> NAND  : Spansion S34ML01G100TF100, 1 Gbit SLC NAND Flash = 128 MiB
> ETH   : 1 GBit Ethernet Port - PoE
> WIFI1 : Broadcom BCM43431KMLG, BCM43431 802.11 abgn
> WIFI1 : Broadcom BCM43431KMLG, BCM43431 802.11 abgn
> WIFI3 : Broadcom BCM43428 abgn (1x1:1 - id: 43428)
> BUTTON: one reset button
> LEDS  : RGB-LED
> MISC  : Atmel AT24C64 8KiB EEPROM (i2c - seems empty)
>   : Ti INA219 26V, 12-bit, i2c output current/voltage/power monitor
>   : TPS23754, High Power/High Efficiency PoE Interface+DC/DC Controller
> 
> SERIAL:
>   WARNING: The serial port needs a TTL/RS-232 3V3 level converter!
>   The Serial setting is 115200-8-N-1. The board has a populated
>   right angle 1x4 0.1" pinheader.
>   The pinout is: VCC (next to J3, has little white arrow), RX, TX, GND.
> 
> This flashing procedure for the MR26 was tested with firmware:
> "22-143410M-gf25cbf5a-asa".
> U-Boot 2012.10-00063-g83f9fe4 (Jun 04 2014 - 21:22:39)
> 
> A guide how to open up the device is available on the wiki:
> 
> 
> Notes:
>  - The WIFI do work to a degree. Limited to 802.11bg in the 2.4GHz band.
>  - the WIFI macs are made up.
> 
> 0. Create a separate Ethernet LAN which can't have access to the internet.
>Ideally use 192.168.1.2 for your PC. The new OpenWrt firmware will setup
>the network via DHCP Discovery, so make sure your PC is running
>a DHCP-Server (i.e.: dnsmasq)
>'# dnsmasq -i eth# -F 192.168.1.5,192.168.1.50
>Download the openwrt-meraki-mr26 initramfs file from openwrt.org and
>rename it to something simple like mr26.bin. Then put it into the tftp's
>server directory.
> 
> 1. Disassemble the MR26 device by removing all screws (4 screws are located
>under the 4 rubber feets!) and prying open the plastic covers without
>breaking the plastic retention clips. Once inside, remove the plastic
>back casing. Be careful, there some "hidden" retention clips on both
>sides of the LAN port, you need a light to see those. Next, you want to
>remove all the screws on the outer metal shielding to get to the PCB.
>It's not necessary to remove the antennas!
> 
> 2. Connect the serial cable to the serial header and Ethernet patch cable
>to the device.
> 
> 4. Before connecting the power, get ready flood the serial console program
>with the magic:   xyzzy  . This is necessary in order to get into the
>u-boot prompt. Once Ready: connect power cable.
> 
> 5. If you don't get the "u-boot>" prompt within the first few seconds,
>you have to disconnect and reconnect the power cable and try again.
> 
> 6. In the u-boot prompt enter:
> 
>setenv ipaddr 192.168.1.4
>setenv serverip 192.168.1.2
>tftpboot ${meraki_loadaddr} mr26.bin; bootm
> 
>this will boot a in-ram-only OpenWrt image.
> 
> 7. Once it booted use sysupgrade to permanently install OpenWrt.
>To do this: Download the latest sysupgrade.bin file and move
>it to the device. Then use sysupgrade *sysupgrade.bin to install it.
> 
> WARNING: DO NOT DELETE the "storage" ubi volume!
> 
> Signed-off-by: Christian Lamparter 
> ---
>  .../bcm53xx/base-files/etc/board.d/02_network |   6 +
>  .../hotplug.d/ieee80211/10-fix-mac-address|  18 ++
>  .../base-files/lib/upgrade/platform.sh|  15 +-
>  target/linux/bcm53xx/image/Makefile   |  18 +-
>  .../081-next-ARM_dts_BCM53015-add-mr26.patch  | 242 ++
>  .../072-next-ARM_dts_BCM53015-add-mr26.patch  | 242 ++
>  6 files changed, 535 insertions(+), 6 deletions(-)
>  create mode 100644 
> target/linux/bcm53xx/base-files/etc/hotplug.d/ieee80211/10-fix-mac-address
>  create mode 100644 
> target/linux/bcm53xx/patches-5.10/081-next-ARM_dts_BCM53015-add-mr26.patch
>  create mode 100644 
> target/linux/bcm53xx/patches-5.15/072-next-ARM_dts_BCM53015-add-mr26.patch
> 
> diff --git a/target/linux/bcm53xx/base-files/etc/board.d/02_network 
> b/target/linux/bcm53xx/base-files/etc/board.d/02_network
> index 822320c0a6..c2e5afc5ed 100644
> --- a/target/linux/bcm53xx/base-files/etc/board.d/02_network
> +++ b/target/linux/bcm53xx/base-files/etc/board.d/02_network
> @@ -22,6 +22,7 @@ bcm53xx_setup_interfaces()
>   luxul,xap-1610-v1)
>   ucidef_set_interface_lan "poe lan" "dhcp"
>   ;;
> + meraki,mr26 | \
>   meraki,mr32)
>   ucidef_set_interface_lan "poe" "dhcp"
>   ;;
> @@ -58,6 +59,11 @@ bcm53xx_setup_macs()
>   etXmacaddr=$(nvram get et0macaddr)
>   

[PATCH] bcm53xx: add support for Meraki MR26

2022-07-02 Thread Christian Lamparter
Meraki MR26 is an EOL wireless access point featuring a
PoE ethernet port and two dual-band 3x3 MIMO 802.11n
radios and 1x1 dual-band WIFI dedicated to scanning.

Thank you Amir for the unit and PSU.

Hardware info:
SOC   : Broadcom BCM53015A1KFEBG (dual-core Cortex-A9 CPU at 800 MHz)
RAM   : SK hynix Inc. H5TQ1G63EFR, 1 Gbit DDR3 SDRAM = 128 MiB
NAND  : Spansion S34ML01G100TF100, 1 Gbit SLC NAND Flash = 128 MiB
ETH   : 1 GBit Ethernet Port - PoE
WIFI1 : Broadcom BCM43431KMLG, BCM43431 802.11 abgn
WIFI1 : Broadcom BCM43431KMLG, BCM43431 802.11 abgn
WIFI3 : Broadcom BCM43428 abgn (1x1:1 - id: 43428)
BUTTON: one reset button
LEDS  : RGB-LED
MISC  : Atmel AT24C64 8KiB EEPROM (i2c - seems empty)
  : Ti INA219 26V, 12-bit, i2c output current/voltage/power monitor
  : TPS23754, High Power/High Efficiency PoE Interface+DC/DC Controller

SERIAL:
WARNING: The serial port needs a TTL/RS-232 3V3 level converter!
The Serial setting is 115200-8-N-1. The board has a populated
right angle 1x4 0.1" pinheader.
The pinout is: VCC (next to J3, has little white arrow), RX, TX, GND.

This flashing procedure for the MR26 was tested with firmware:
"22-143410M-gf25cbf5a-asa".
U-Boot 2012.10-00063-g83f9fe4 (Jun 04 2014 - 21:22:39)

A guide how to open up the device is available on the wiki:


Notes:
 - The WIFI do work to a degree. Limited to 802.11bg in the 2.4GHz band.
 - the WIFI macs are made up.

0. Create a separate Ethernet LAN which can't have access to the internet.
   Ideally use 192.168.1.2 for your PC. The new OpenWrt firmware will setup
   the network via DHCP Discovery, so make sure your PC is running
   a DHCP-Server (i.e.: dnsmasq)
   '# dnsmasq -i eth# -F 192.168.1.5,192.168.1.50
   Download the openwrt-meraki-mr26 initramfs file from openwrt.org and
   rename it to something simple like mr26.bin. Then put it into the tftp's
   server directory.

1. Disassemble the MR26 device by removing all screws (4 screws are located
   under the 4 rubber feets!) and prying open the plastic covers without
   breaking the plastic retention clips. Once inside, remove the plastic
   back casing. Be careful, there some "hidden" retention clips on both
   sides of the LAN port, you need a light to see those. Next, you want to
   remove all the screws on the outer metal shielding to get to the PCB.
   It's not necessary to remove the antennas!

2. Connect the serial cable to the serial header and Ethernet patch cable
   to the device.

4. Before connecting the power, get ready flood the serial console program
   with the magic:   xyzzy  . This is necessary in order to get into the
   u-boot prompt. Once Ready: connect power cable.

5. If you don't get the "u-boot>" prompt within the first few seconds,
   you have to disconnect and reconnect the power cable and try again.

6. In the u-boot prompt enter:

   setenv ipaddr 192.168.1.4
   setenv serverip 192.168.1.2
   tftpboot ${meraki_loadaddr} mr26.bin; bootm

   this will boot a in-ram-only OpenWrt image.

7. Once it booted use sysupgrade to permanently install OpenWrt.
   To do this: Download the latest sysupgrade.bin file and move
   it to the device. Then use sysupgrade *sysupgrade.bin to install it.

WARNING: DO NOT DELETE the "storage" ubi volume!

Signed-off-by: Christian Lamparter 
---
 .../bcm53xx/base-files/etc/board.d/02_network |   6 +
 .../hotplug.d/ieee80211/10-fix-mac-address|  18 ++
 .../base-files/lib/upgrade/platform.sh|  15 +-
 target/linux/bcm53xx/image/Makefile   |  18 +-
 .../081-next-ARM_dts_BCM53015-add-mr26.patch  | 242 ++
 .../072-next-ARM_dts_BCM53015-add-mr26.patch  | 242 ++
 6 files changed, 535 insertions(+), 6 deletions(-)
 create mode 100644 
target/linux/bcm53xx/base-files/etc/hotplug.d/ieee80211/10-fix-mac-address
 create mode 100644 
target/linux/bcm53xx/patches-5.10/081-next-ARM_dts_BCM53015-add-mr26.patch
 create mode 100644 
target/linux/bcm53xx/patches-5.15/072-next-ARM_dts_BCM53015-add-mr26.patch

diff --git a/target/linux/bcm53xx/base-files/etc/board.d/02_network 
b/target/linux/bcm53xx/base-files/etc/board.d/02_network
index 822320c0a6..c2e5afc5ed 100644
--- a/target/linux/bcm53xx/base-files/etc/board.d/02_network
+++ b/target/linux/bcm53xx/base-files/etc/board.d/02_network
@@ -22,6 +22,7 @@ bcm53xx_setup_interfaces()
luxul,xap-1610-v1)
ucidef_set_interface_lan "poe lan" "dhcp"
;;
+   meraki,mr26 | \
meraki,mr32)
ucidef_set_interface_lan "poe" "dhcp"
;;
@@ -58,6 +59,11 @@ bcm53xx_setup_macs()
etXmacaddr=$(nvram get et0macaddr)
offset=5
;;
+   meraki,mr26)
+   label_mac="$(mtd_get_mac_binary_ubi board-config 0x66)"
+   ucidef_set_interface_macaddr "lan" "$label_mac"
+   ucidef_set_label_macaddr "$label_mac"
+   ;;

Re: [fstools v2 PATCH 1/2] partname: check all parameters for overriding if needed

2022-07-02 Thread INAGAKI Hiroshi

A, this series is not v2, it's v3... I mistook in the subject...

On 2022/07/02 15:48, INAGAKI Hiroshi wrote:

In bootargs, the specific parameter is overridden if needed for booting
OpenWrt, such as "root=".
In this case, the last specific parameter in bootargs should be read
instead of the one passed by bootloader.

example (I-O DATA HDL2-AAX):

console=ttyS0,115200 mtdparts=spi0.0:960k(boot),64k(env),-(system) \
   initrd=0x340 rw root=/dev/md2 rootfstype=ext4 rw rootdelay=2 \
   init=/lib/sysvinit/init init=/sbin/init root=PARTLABEL=rootfs \
   rootfstype=squashfs,ext4

- "root=/dev/md2": passed by bootloader, for stock firmware
- "root=PARTLABEL=rootfs": passed by dtb, for OpenWrt

So, this patch adds checking support for all parameters in the specified
file and check all for root device ("root=" parameter).

Signed-off-by: INAGAKI Hiroshi 
---
v1 -> v2:

   (no patch)

v2 -> v3:

   - added patch to fix wrong detection of overridden root= parameter

  libfstools/partname.c | 17 ++---
  1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/libfstools/partname.c b/libfstools/partname.c
index f59c52e..e282402 100644
--- a/libfstools/partname.c
+++ b/libfstools/partname.c
@@ -62,9 +62,9 @@ static int partname_volume_init(struct volume *v)
  }
  
  /* adapted from procd/utils.c -> should go to libubox */

-static char* get_var_from_file(const char* filename, const char* name, char* 
out, int len)
+static char* get_var_from_file(const char* filename, const char* name, char* 
out, int len, bool chk_all)
  {
-   char line[1024], *c, *sptr;
+   char line[1024], *c, *sptr, *_out = NULL;
int fd = open(filename, O_RDONLY);
if (fd == -1)
return NULL;
@@ -89,10 +89,13 @@ static char* get_var_from_file(const char* filename, const 
char* name, char* out
  
  		strncpy(out, [1], len);

out[len-1] = '\0';
-   return out;
+   if (!chk_all)
+   return out;
+
+   _out = out;
}
  
-	return NULL;

+   return _out;
  }
  
  static char *rootdevname(char *devpath) {

@@ -123,12 +126,12 @@ static struct volume *partname_volume_find(char *name)
bool found = false;
glob_t gl;
  
-	if (get_var_from_file("/proc/cmdline", "fstools_ignore_partname", rootparam, sizeof(rootparam))) {

+   if (get_var_from_file("/proc/cmdline", "fstools_ignore_partname", 
rootparam, sizeof(rootparam), false)) {
if (!strcmp("1", rootparam))
return NULL;
}
  
-	if (get_var_from_file("/proc/cmdline", "root", rootparam, sizeof(rootparam))) {

+   if (get_var_from_file("/proc/cmdline", "root", rootparam, 
sizeof(rootparam), true)) {
rootdev = rootdevname(rootparam);
/* find partition on same device as rootfs */
snprintf(ueventgstr, sizeof(ueventgstr), "%s/%s/*/uevent", 
block_dir_name, rootdev);
@@ -139,7 +142,7 @@ static struct volume *partname_volume_find(char *name)
  
  	if (!glob(ueventgstr, GLOB_NOESCAPE, NULL, ))

for (j = 0; j < gl.gl_pathc; j++) {
-   if (!get_var_from_file(gl.gl_pathv[j], "PARTNAME", 
namebuf, sizeof(namebuf)))
+   if (!get_var_from_file(gl.gl_pathv[j], "PARTNAME", 
namebuf, sizeof(namebuf), false))
continue;
if (!strncmp(namebuf, name, sizeof(namebuf))) {
found = 1;


___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


[fstools v2 PATCH 2/2] partname: check "PARTLABEL" in root= parameter

2022-07-02 Thread INAGAKI Hiroshi
This patch adds "PARTLABEL=" checking of root= parameter to
partname_volume_find function.

The Linux Kernel supports "root=PARTLABEL=" syntax, but fstools
doesn't and fail to parse the path to the root device.
So check the parameter and skip parsing, find partition from all block
devices if this syntax is used.

Note:
This change is required for some NAS devices sold by I-O DATA, such as
HDL2-A and HDL2-AAX series.
On they, kernel and rootfs are stored in the storage device connected
to SATA, port1 or port2 and the path to the partition will be assigned
dynamically.
So "root=PARTLABEL=" syntax is required instead of "/dev/sdXN".

Signed-off-by: INAGAKI Hiroshi 
---
v1 -> v2:

  - use "PARTLABEL=" string in root= parametr instead of the new fstools
parameter to block searching root device

v2 -> v3:

  - rebased on the first patch of this patch series

 libfstools/partname.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/libfstools/partname.c b/libfstools/partname.c
index e282402..8ccf12a 100644
--- a/libfstools/partname.c
+++ b/libfstools/partname.c
@@ -131,12 +131,13 @@ static struct volume *partname_volume_find(char *name)
return NULL;
}
 
-   if (get_var_from_file("/proc/cmdline", "root", rootparam, 
sizeof(rootparam), true)) {
+   if (get_var_from_file("/proc/cmdline", "root", rootparam, 
sizeof(rootparam), true) &&
+   strncmp(rootparam, "PARTLABEL=", 10)) {
rootdev = rootdevname(rootparam);
/* find partition on same device as rootfs */
snprintf(ueventgstr, sizeof(ueventgstr), "%s/%s/*/uevent", 
block_dir_name, rootdev);
} else {
-   /* no 'root=' kernel cmdline parameter, find on any block 
device */
+   /* PARTLABEL= is specifed or no 'root=' kernel cmdline 
parameter, find on any block device */
snprintf(ueventgstr, sizeof(ueventgstr), "%s/*/uevent", 
block_dir_name);
}
 
-- 
2.36.1.windows.1


___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


[fstools v2 PATCH 1/2] partname: check all parameters for overriding if needed

2022-07-02 Thread INAGAKI Hiroshi
In bootargs, the specific parameter is overridden if needed for booting
OpenWrt, such as "root=".
In this case, the last specific parameter in bootargs should be read
instead of the one passed by bootloader.

example (I-O DATA HDL2-AAX):

console=ttyS0,115200 mtdparts=spi0.0:960k(boot),64k(env),-(system) \
  initrd=0x340 rw root=/dev/md2 rootfstype=ext4 rw rootdelay=2 \
  init=/lib/sysvinit/init init=/sbin/init root=PARTLABEL=rootfs \
  rootfstype=squashfs,ext4

- "root=/dev/md2": passed by bootloader, for stock firmware
- "root=PARTLABEL=rootfs": passed by dtb, for OpenWrt

So, this patch adds checking support for all parameters in the specified
file and check all for root device ("root=" parameter).

Signed-off-by: INAGAKI Hiroshi 
---
v1 -> v2:

  (no patch)

v2 -> v3:

  - added patch to fix wrong detection of overridden root= parameter

 libfstools/partname.c | 17 ++---
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/libfstools/partname.c b/libfstools/partname.c
index f59c52e..e282402 100644
--- a/libfstools/partname.c
+++ b/libfstools/partname.c
@@ -62,9 +62,9 @@ static int partname_volume_init(struct volume *v)
 }
 
 /* adapted from procd/utils.c -> should go to libubox */
-static char* get_var_from_file(const char* filename, const char* name, char* 
out, int len)
+static char* get_var_from_file(const char* filename, const char* name, char* 
out, int len, bool chk_all)
 {
-   char line[1024], *c, *sptr;
+   char line[1024], *c, *sptr, *_out = NULL;
int fd = open(filename, O_RDONLY);
if (fd == -1)
return NULL;
@@ -89,10 +89,13 @@ static char* get_var_from_file(const char* filename, const 
char* name, char* out
 
strncpy(out, [1], len);
out[len-1] = '\0';
-   return out;
+   if (!chk_all)
+   return out;
+
+   _out = out;
}
 
-   return NULL;
+   return _out;
 }
 
 static char *rootdevname(char *devpath) {
@@ -123,12 +126,12 @@ static struct volume *partname_volume_find(char *name)
bool found = false;
glob_t gl;
 
-   if (get_var_from_file("/proc/cmdline", "fstools_ignore_partname", 
rootparam, sizeof(rootparam))) {
+   if (get_var_from_file("/proc/cmdline", "fstools_ignore_partname", 
rootparam, sizeof(rootparam), false)) {
if (!strcmp("1", rootparam))
return NULL;
}
 
-   if (get_var_from_file("/proc/cmdline", "root", rootparam, 
sizeof(rootparam))) {
+   if (get_var_from_file("/proc/cmdline", "root", rootparam, 
sizeof(rootparam), true)) {
rootdev = rootdevname(rootparam);
/* find partition on same device as rootfs */
snprintf(ueventgstr, sizeof(ueventgstr), "%s/%s/*/uevent", 
block_dir_name, rootdev);
@@ -139,7 +142,7 @@ static struct volume *partname_volume_find(char *name)
 
if (!glob(ueventgstr, GLOB_NOESCAPE, NULL, ))
for (j = 0; j < gl.gl_pathc; j++) {
-   if (!get_var_from_file(gl.gl_pathv[j], "PARTNAME", 
namebuf, sizeof(namebuf)))
+   if (!get_var_from_file(gl.gl_pathv[j], "PARTNAME", 
namebuf, sizeof(namebuf), false))
continue;
if (!strncmp(namebuf, name, sizeof(namebuf))) {
found = 1;
-- 
2.36.1.windows.1


___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel