From b32ed384c747b438796df99fadb5aaf4fa536a2e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer 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 f21eb62e..ba14997a 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);