[PATCH] wireguard: bump to 1.0.20200623

2020-06-23 Thread Jason A. Donenfeld
* compat: drop centos 8.1 support as 8.2 is now out

Of note, as well, is that we now have both RHEL7 and RHEL8 in our CI at
.

* Kbuild: remove -fvisibility=hidden from cflags

This fixes an issue when compiling wireguard as a module for ARM kernels in
THUMB2 mode without the JUMP11 workaround.

* noise: do not assign initiation time in if condition

Style fix.

* device: avoid circular netns references

Fixes a circular reference issue with network namespaces.

* netns: workaround bad 5.2.y backport

This works around a back backport in the 5.2.y series.

Signed-off-by: Jason A. Donenfeld 
---
 package/network/services/wireguard/Makefile | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package/network/services/wireguard/Makefile 
b/package/network/services/wireguard/Makefile
index ce91fbe..b7adf27 100644
--- a/package/network/services/wireguard/Makefile
+++ b/package/network/services/wireguard/Makefile
@@ -11,12 +11,12 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=wireguard
 
-PKG_VERSION:=1.0.20200520
+PKG_VERSION:=1.0.20200623
 PKG_RELEASE:=1
 
 PKG_SOURCE:=wireguard-linux-compat-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=https://git.zx2c4.com/wireguard-linux-compat/snapshot/
-PKG_HASH:=16e7ae4bef734b243428eea07f3b3c3d4721880c3ea8eb8f98628fd6ae5b77c3
+PKG_HASH:=130937724515799edf05ff8216bc837df8acda879428f3a7f96a3287758f9445
 
 PKG_LICENSE:=GPL-2.0
 PKG_LICENSE_FILES:=COPYING
-- 
2.27.0


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


[no subject]

2020-06-23 Thread Sander Vanheule via openwrt-devel
The sender domain has a DMARC Reject/Quarantine policy which disallows
sending mailing list messages using the original "From" header.

To mitigate this problem, the original message has been wrapped
automatically by the mailing list software.--- Begin Message ---
To enable dynamic kernel/rootfs splitting for devices that require an
ELF loader, I decided to modify the current splitter for openwrt,okli
compatible partitions.

openwrt,okli is currently used by one device: PISEN WMB001N.
For this device, this patch could remove the custom build directives for
the factory images.
For TP-Link CPE devices, it could enable a dynamic firmware partition,
while these devices currently employ a fixed partition split.

The modifications are placed inside mtdsplit_uimage.c to leverage the
existing uImage definitions. Alternatively, this loader could be moved
to a separate file, but then I would prefer to create an extra
mtdsplit_uimage.h header for the common parts. This would touch more
parts of the code, but might be better moving forward.

This patch was also posted on github with pull request #3130
https://github.com/openwrt/openwrt/pull/3130

Sander Vanheule (1):
  kernel: mtdsplit: support okli loader splitting

 .../drivers/mtd/mtdsplit/mtdsplit_uimage.c| 124 +-
 1 file changed, 118 insertions(+), 6 deletions(-)

-- 
2.26.2


--- End Message ---
___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
http://lists.infradead.org/mailman/listinfo/openwrt-devel


[no subject]

2020-06-23 Thread Sander Vanheule via openwrt-devel
The sender domain has a DMARC Reject/Quarantine policy which disallows
sending mailing list messages using the original "From" header.

To mitigate this problem, the original message has been wrapped
automatically by the mailing list software.--- Begin Message ---
okli images always have the following structure:
* ELF kernel loader
* kernel uImage
* rootfs

Because the kernel loader is limited in size, the uImage can start
within the same erase block. The current version of the the uImage
splitter doesn't handle uImages not starting at an erase block
boundary, requiring fixed partition splits. A fixed rootfs/kernel split
may require future tuning if the kernel size changes. A fixed
loader/firmware split enabled the current uImage splitter, but would
require sysupgrade files without a loader, complicating build
directives.

This patch implements a basic partition scan, assuming the order listed
above. If the ELF loader is present at the start of the firmware
partition, it is included in the kernel partition. If not, then the
dynamic kernel partition only comprises the uImage. This is done for
backwards compatibility with other devices that use an openwrt,okli
compatible firmware partition with a separate loader partition.

Signed-off-by: Sander Vanheule 
---
 .../drivers/mtd/mtdsplit/mtdsplit_uimage.c| 124 +-
 1 file changed, 118 insertions(+), 6 deletions(-)

diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c 
b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c
index 525ad8218b..5476ed3508 100644
--- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c
+++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c
@@ -411,12 +411,13 @@ static struct mtd_part_parser uimage_fonfxc_parser = {
  * OKLI (OpenWrt Kernel Loader Image)
  **/
 
-#define IH_MAGIC_OKLI  0x4f4b4c49
+#define IH_MAGIC_OKLI0x4f4b4c49
+#define OKLI_MAGIC_ELF   0x7f454c46
+#define OKLI_NUM_PARTS   2
+#define OKLI_SEARCH_STEP 0x1000
 
-static ssize_t uimage_verify_okli(u_char *buf, size_t len, int *extralen)
+static int uimage_verify_okli(struct uimage_header *header)
 {
-   struct uimage_header *header = (struct uimage_header *)buf;
-
/* default sanity checks */
if (be32_to_cpu(header->ih_magic) != IH_MAGIC_OKLI) {
pr_debug("invalid uImage magic: %08x\n",
@@ -439,13 +440,124 @@ static ssize_t uimage_verify_okli(u_char *buf, size_t 
len, int *extralen)
return 0;
 }
 
+static ssize_t
+uimage_okli_find_offset(struct mtd_info *master,
+   size_t *uimage_size)
+{
+   struct uimage_header *buf;
+   size_t buf_len = sizeof(struct uimage_header);
+   size_t offset;
+   int ret;
+
+   buf = vmalloc(buf_len);
+   if (!buf)
+   return -ENOMEM;
+
+   /* use default okli step size to search for uImage */
+   for (offset = 0; offset < master->size; offset += OKLI_SEARCH_STEP) {
+   *uimage_size = 0;
+
+   ret = read_uimage_header(master, offset, (u_char *)buf, 
buf_len);
+   if (ret)
+   continue;
+
+   ret = uimage_verify_okli(buf);
+   if (ret) {
+   pr_debug("no valid uImage found in \"%s\" at offset 
%llx\n",
+   master->name, (unsigned long long) offset);
+   continue;
+   }
+
+   *uimage_size = sizeof(*buf) + be32_to_cpu(buf->ih_size);
+
+   if ((offset + *uimage_size) > master->size) {
+   pr_debug("uImage exceeds MTD device \"%s\"\n", 
master->name);
+   *uimage_size = 0;
+   continue;
+   }
+   break;
+   }
+
+   vfree(buf);
+
+   if (offset == master->size) {
+   pr_debug("no uImage found in \"%s\"\n", master->name);
+   return -ENODEV;
+   }
+
+   return offset;
+}
+
 static int
 mtdsplit_uimage_parse_okli(struct mtd_info *master,
  const struct mtd_partition **pparts,
  struct mtd_part_parser_data *data)
 {
-   return __mtdsplit_parse_uimage(master, pparts, data,
- uimage_verify_okli);
+   struct mtd_partition *parts;
+   size_t uimage_offset;
+   size_t uimage_size = 0;
+   size_t rootfs_offset;
+   size_t rootfs_size = 0;
+   int ret;
+   enum mtdsplit_part_type type;
+
+   uint32_t magic;
+   ret = read_uimage_header(master, 0, (u_char *), sizeof(magic));
+   if (ret)
+   return ret;
+
+   switch (be32_to_cpu(magic)) {
+   case OKLI_MAGIC_ELF:
+   case IH_MAGIC_OKLI:
+   break;
+   default:
+   pr_debug("invalid partition magic: %08x\n", be32_to_cpu(magic));
+   return -EINVAL;
+   }
+
+  

Re: [PATCH V1] netifd: fix wdev->data lifetime

2020-06-23 Thread John Crispin



On 23.06.20 11:40, John Crispin wrote:

The reconf patch breaks wifi down under certain conditions. The root cause
is that during reload the wdev state gets flushed. This has the effect, that
the phy is lost from the state resulting in teardown breaking.
Fix this by changing the lifetime of wdev->data.

Signed-off-by: John Crispin 
---
Changes in V2
* free() call was in the wrong place

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

diff --git a/wireless.c b/wireless.c
index efb7992..e295f28 100644
--- a/wireless.c
+++ b/wireless.c
@@ -275,8 +275,6 @@ wireless_device_free_state(struct wireless_device *wdev)
uloop_timeout_cancel(>script_check);
uloop_timeout_cancel(>timeout);
wireless_complete_kill_request(wdev);
-   free(wdev->data);
-   wdev->data = NULL;
vlist_for_each_element(>interfaces, vif, node) {
free(vif->data);
vif->data = NULL;
@@ -460,6 +458,7 @@ wireless_device_free(struct wireless_device *wdev)
vlist_flush_all(>vlans);
vlist_flush_all(>stations);
avl_delete(_devices.avl, >node.avl);
+   free(wdev->data);
free(wdev->config);
free(wdev->prev_config);
free(wdev);
@@ -1414,6 +1413,8 @@ wireless_device_notify(struct wireless_device *wdev, 
struct blob_attr *data,
if (*pdata)
return UBUS_STATUS_INVALID_ARGUMENT;
  
+		if (*pdata)

+   free(*pdata);
*pdata = blob_memdup(cur);
if (vif)
wireless_interface_set_data(vif);
 


thx, looks like the  rest of the patch fixes the issue, been stress testing 
this today, will have a closer look tomorrow ..

John

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


[no subject]

2020-06-23 Thread Martin Blumenstingl via openwrt-devel
The sender domain has a DMARC Reject/Quarantine policy which disallows
sending mailing list messages using the original "From" header.

To mitigate this problem, the original message has been wrapped
automatically by the mailing list software.--- Begin Message ---
Hi John,

On Tue, Jun 23, 2020 at 11:43 AM John Crispin  wrote:
[...]
> @@ -1414,6 +1413,8 @@ wireless_device_notify(struct wireless_device *wdev, 
> struct blob_attr *data,
> if (*pdata)
> return UBUS_STATUS_INVALID_ARGUMENT;
>
> +   if (*pdata)
> +   free(*pdata);
there's another "if (*pdata)" right above this one which returns
(UBUS_STATUS_INVALID_ARGUMENT) from that function.
I'm probably missing something so to me it seems as if the new "if
(*pdata)" is not reachable


Martin

--- End Message ---
___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
http://lists.infradead.org/mailman/listinfo/openwrt-devel


[PATCH rpcd] rc: new ubus object for handling /etc/init.d/ scripts

2020-06-23 Thread Rafał Miłecki
From: Rafał Miłecki 

This commit adds "rc" ubus object with methods "list" and "exec" for
listing and calling init.d script appropriately. It's useful for all
kind of UIs (e.g. LuCI) and custom apps.

Example:
root@OpenWrt:~# ubus call rc list
{
"blockd": {
"enabled": true,
"running": true
},
"dnsmasq": {
"enabled": true,
"running": true
}
}
root@OpenWrt:~# ubus call rc init '{ "name": "blockd", "action": "disable" }'
root@OpenWrt:~# ubus call rc init '{ "name": "dnsmasq", "action": "stop" }'
root@OpenWrt:~# ubus call rc list
{
"blockd": {
"enabled": false,
"running": true
},
"dnsmasq": {
"enabled": true,
"running": false
}
}

Signed-off-by: Rafał Miłecki 
---
Final patch:
* Put code in rpcd instead of procd
* Implement "list" method
* Validate input
---
 CMakeLists.txt|   2 +-
 include/rpcd/rc.h |   7 ++
 main.c|   6 +-
 rc.c  | 234 ++
 4 files changed, 246 insertions(+), 3 deletions(-)
 create mode 100644 include/rpcd/rc.h
 create mode 100644 rc.c

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3bfc286..26e011e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -38,7 +38,7 @@ INCLUDE_DIRECTORIES(${ubus_include_dir})
 FIND_PATH(ubox_include_dir libubox/blobmsg_json.h)
 INCLUDE_DIRECTORIES(${ubox_include_dir})
 
-ADD_EXECUTABLE(rpcd main.c exec.c session.c uci.c plugin.c)
+ADD_EXECUTABLE(rpcd main.c exec.c session.c uci.c rc.c plugin.c)
 TARGET_LINK_LIBRARIES(rpcd ${ubox} ${ubus} ${uci} ${blobmsg_json} ${json} 
${crypt} dl)
 
 SET(PLUGINS "")
diff --git a/include/rpcd/rc.h b/include/rpcd/rc.h
new file mode 100644
index 000..ca00f56
--- /dev/null
+++ b/include/rpcd/rc.h
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: ISC OR MIT
+#ifndef __RPCD_RC_H
+#define __RPCD_RC_H
+
+int rpc_rc_api_init(struct ubus_context *ctx);
+
+#endif
diff --git a/main.c b/main.c
index 9a177cf..d77a814 100644
--- a/main.c
+++ b/main.c
@@ -25,10 +25,11 @@
 #include 
 #include 
 
+#include 
+#include 
+#include 
 #include 
 #include 
-#include 
-#include 
 
 static struct ubus_context *ctx;
 static bool respawn = false;
@@ -113,6 +114,7 @@ int main(int argc, char **argv)
 
rpc_session_api_init(ctx);
rpc_uci_api_init(ctx);
+   rpc_rc_api_init(ctx);
rpc_plugin_api_init(ctx);
 
hangup = getenv("RPC_HANGUP");
diff --git a/rc.c b/rc.c
new file mode 100644
index 000..c3741eb
--- /dev/null
+++ b/rc.c
@@ -0,0 +1,234 @@
+// SPDX-License-Identifier: ISC OR MIT
+/*
+ * rpcd - UBUS RPC server
+ *
+ * Copyright (C) 2020 Rafał Miłecki 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+
+#include 
+
+enum {
+   RC_INIT_NAME,
+   RC_INIT_ACTION,
+   __RC_INIT_MAX
+};
+
+static const struct blobmsg_policy rc_init_policy[] = {
+   [RC_INIT_NAME] = { "name", BLOBMSG_TYPE_STRING },
+   [RC_INIT_ACTION] = { "action", BLOBMSG_TYPE_STRING },
+};
+
+/**
+ * rc_check_script - check if script is safe to execute as root
+ *
+ * Check if it's owned by root and if only root can modify it.
+ */
+static int rc_check_script(const char *path)
+{
+   struct stat s;
+
+   if (stat(path, ))
+   return UBUS_STATUS_NOT_FOUND;
+
+   if (s.st_uid != 0 || s.st_gid != 0 || !(s.st_mode & S_IXUSR) || 
(s.st_mode & S_IWOTH))
+   return UBUS_STATUS_PERMISSION_DENIED;
+
+   return UBUS_STATUS_OK;
+}
+
+/**
+ * rc_exec - execute a file by pathname and return its exit status
+ */
+static int rc_exec(const char *pathname, const char *action)
+{
+   int wstatus;
+   pid_t pid;
+   int fd;
+
+   pid = fork();
+   switch (pid) {
+   case -1:
+   return -errno;
+   case 0:
+   /* Set stdin, stdout & stderr to /dev/null */
+   fd = open("/dev/null", O_RDWR);
+   if (fd >= 0) {
+   dup2(fd, 0);
+   dup2(fd, 1);
+   dup2(fd, 2);
+   close(fd);
+   }
+
+   execl(pathname, pathname, action, NULL);
+   exit(errno);
+   default:
+   if (waitpid(pid, , 0) == -1)
+   return -errno;
+
+   if (!WIFEXITED(wstatus))
+   return -EIO;
+
+   return WEXITSTATUS(wstatus);
+   }
+}
+
+static int rc_list(struct ubus_context *ctx, struct ubus_object *obj,
+  struct ubus_request_data *req, const char *method,
+  struct blob_attr *msg)
+{
+   struct blob_buf buf = { };
+   struct dirent *e;
+   DIR *dir;
+
+   dir = opendir("/etc/init.d");
+   if (!dir)
+   return UBUS_STATUS_UNKNOWN_ERROR;
+
+   blob_buf_init(, 0);
+
+   while ((e = readdir(dir))) {
+

[PATCH] kernel: netfilter: move NAT targets to kmod-ebtables

2020-06-23 Thread Adrian Schmutzler
From: Ali MJ Al-Nasrawy 

Move SNAT and DNAT support from kmod-ebtables-ip4 to kmod-ebtables
because these targets operate on MAC addresses not IPv4 and
kmod-ebtables already supports NAT table and the related REDIRECT
target.

Signed-off-by: Ali MJ Al-Nasrawy 
[change commit title prefix]
Signed-off-by: Adrian Schmutzler 
---
 include/netfilter.mk | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/netfilter.mk b/include/netfilter.mk
index c95bcb504d..568e6718b5 100644
--- a/include/netfilter.mk
+++ b/include/netfilter.mk
@@ -323,9 +323,9 @@ $(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_VLAN, 
$(P_EBT)ebt_vlan))
 # targets
 $(eval $(call nf_add,EBTABLES_IP4,CONFIG_BRIDGE_EBT_ARPREPLY, 
$(P_EBT)ebt_arpreply))
 $(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_MARK_T, $(P_EBT)ebt_mark))
-$(eval $(call nf_add,EBTABLES_IP4,CONFIG_BRIDGE_EBT_DNAT, $(P_EBT)ebt_dnat))
+$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_DNAT, $(P_EBT)ebt_dnat))
 $(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_REDIRECT, 
$(P_EBT)ebt_redirect))
-$(eval $(call nf_add,EBTABLES_IP4,CONFIG_BRIDGE_EBT_SNAT, $(P_EBT)ebt_snat))
+$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_SNAT, $(P_EBT)ebt_snat))
 
 # watchers
 $(eval $(call nf_add,EBTABLES_WATCHERS,CONFIG_BRIDGE_EBT_LOG, $(P_EBT)ebt_log))
-- 
2.20.1


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


[PATCH] zram-swap: enable swap discard

2020-06-23 Thread Rui Salvaterra
Zram block devices have supported trim/discard for over six years, let's
enable it. This allows the zram device to actually free up allocated memory
when it's marked as unused in the filesystem metadata, as explained in more
detail in the original commit message [1].

[1] 
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/drivers/block/zram/zram_drv.c?h=linux-4.14.y=f4659d8e620d08bd1a84a8aec5d2f5294a242764

Signed-off-by: Rui Salvaterra 
---
 package/system/zram-swap/files/zram.init | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package/system/zram-swap/files/zram.init 
b/package/system/zram-swap/files/zram.init
index 49140ad406..d33e779850 100755
--- a/package/system/zram-swap/files/zram.init
+++ b/package/system/zram-swap/files/zram.init
@@ -182,7 +182,7 @@ start()
zram_comp_streams "$zram_dev"
echo $(( $zram_size * 1024 * 1024 )) >"/sys/block/$( basename 
"$zram_dev" )/disksize"
mkswap "$zram_dev"
-   swapon $zram_priority "$zram_dev"
+   swapon -d $zram_priority "$zram_dev"
 }
 
 stop()
-- 
2.27.0


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


[PATCH V1] netifd: fix wdev->data lifetime

2020-06-23 Thread John Crispin
The reconf patch breaks wifi down under certain conditions. The root cause
is that during reload the wdev state gets flushed. This has the effect, that
the phy is lost from the state resulting in teardown breaking.
Fix this by changing the lifetime of wdev->data.

Signed-off-by: John Crispin 
---
Changes in V2
* free() call was in the wrong place

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

diff --git a/wireless.c b/wireless.c
index efb7992..e295f28 100644
--- a/wireless.c
+++ b/wireless.c
@@ -275,8 +275,6 @@ wireless_device_free_state(struct wireless_device *wdev)
uloop_timeout_cancel(>script_check);
uloop_timeout_cancel(>timeout);
wireless_complete_kill_request(wdev);
-   free(wdev->data);
-   wdev->data = NULL;
vlist_for_each_element(>interfaces, vif, node) {
free(vif->data);
vif->data = NULL;
@@ -460,6 +458,7 @@ wireless_device_free(struct wireless_device *wdev)
vlist_flush_all(>vlans);
vlist_flush_all(>stations);
avl_delete(_devices.avl, >node.avl);
+   free(wdev->data);
free(wdev->config);
free(wdev->prev_config);
free(wdev);
@@ -1414,6 +1413,8 @@ wireless_device_notify(struct wireless_device *wdev, 
struct blob_attr *data,
if (*pdata)
return UBUS_STATUS_INVALID_ARGUMENT;
 
+   if (*pdata)
+   free(*pdata);
*pdata = blob_memdup(cur);
if (vif)
wireless_interface_set_data(vif);
-- 
2.25.1


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


[PATCH] netifd: fix wdev->data lifetime

2020-06-23 Thread John Crispin
The reconf patch breaks wifi down under certain conditions. The root cause
is that during reload the wdev state gets flushed. This has the effect, that
the phy is lost from the state resulting in teardown breaking.
Fix this by changing the lifetime of wdev->data.

Signed-off-by: John Crispin 
---
 wireless.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/wireless.c b/wireless.c
index efb7992..0aad8c7 100644
--- a/wireless.c
+++ b/wireless.c
@@ -275,8 +275,6 @@ wireless_device_free_state(struct wireless_device *wdev)
uloop_timeout_cancel(>script_check);
uloop_timeout_cancel(>timeout);
wireless_complete_kill_request(wdev);
-   free(wdev->data);
-   wdev->data = NULL;
vlist_for_each_element(>interfaces, vif, node) {
free(vif->data);
vif->data = NULL;
@@ -460,6 +458,7 @@ wireless_device_free(struct wireless_device *wdev)
vlist_flush_all(>vlans);
vlist_flush_all(>stations);
avl_delete(_devices.avl, >node.avl);
+   free(wdev->data);
free(wdev->config);
free(wdev->prev_config);
free(wdev);
@@ -1415,6 +1414,8 @@ wireless_device_notify(struct wireless_device *wdev, 
struct blob_attr *data,
return UBUS_STATUS_INVALID_ARGUMENT;
 
*pdata = blob_memdup(cur);
+   if (*pdata)
+   free(*pdata);
if (vif)
wireless_interface_set_data(vif);
else if (vlan)
-- 
2.25.1


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