From b32ed384c747b438796df99fadb5aaf4fa536a2e Mon Sep 17 00:00:00 2001
From: Matthias Schiffer <mschiffer@universe-factory.net>
Date: Sat, 3 Dec 2016 13:22:22 +0100
Subject: [PATCH] gluon-mesh-batman-adv-core: respondd: correctly detect lower
 interface types (#954)

Fixes #941
---
 .../gluon-mesh-batman-adv-core/src/respondd.c | 26 +++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/package/gluon-mesh-batman-adv-core/src/respondd.c b/package/gluon-mesh-batman-adv-core/src/respondd.c
index f21eb62eb..ba14997a8 100644
--- a/package/gluon-mesh-batman-adv-core/src/respondd.c
+++ b/package/gluon-mesh-batman-adv-core/src/respondd.c
@@ -121,9 +121,31 @@ static void mesh_add_subif(const char *ifname, struct json_object *wireless,
 			   struct json_object *tunnel, struct json_object *other) {
 	struct json_object *address = gluonutil_wrap_and_free_string(gluonutil_get_interface_address(ifname));
 
-	if (interface_file_exists(ifname, "wireless"))
+	char lowername[IFNAMSIZ];
+	strncpy(lowername, ifname, sizeof(lowername)-1);
+	lowername[sizeof(lowername)-1] = 0;
+
+	const char *format = "/sys/class/net/%s/lower_*";
+	char pattern[strlen(format) + IFNAMSIZ];
+
+	/* In case of VLAN and bridge interfaces, we want the lower interface
+	 * to determine the interface type (but not for the interface address) */
+	while (true) {
+		snprintf(pattern, sizeof(pattern), format, lowername);
+		size_t pattern_len = strlen(pattern);
+
+		glob_t lower;
+		if (glob(pattern, GLOB_NOSORT, NULL, &lower))
+			break;
+
+		strncpy(lowername, lower.gl_pathv[0] + pattern_len - 1, sizeof(lowername)-1);
+
+		globfree(&lower);
+	}
+
+	if (interface_file_exists(lowername, "wireless"))
 		json_object_array_add(wireless, address);
-	else if (interface_file_exists(ifname, "tun_flags"))
+	else if (interface_file_exists(lowername, "tun_flags"))
 		json_object_array_add(tunnel, address);
 	else
 		json_object_array_add(other, address);
-- 
GitLab