From f5b7eb5df4605f9242b193734cade4b1b622fae3 Mon Sep 17 00:00:00 2001 From: Jakob Olsson <jakob.olsson@iopsys.eu> Date: Fri, 22 Jan 2021 16:46:26 +0100 Subject: [PATCH] map-agent: use ioctl to bring wds iface up --- src/utils/brcm_nl.c | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/utils/brcm_nl.c b/src/utils/brcm_nl.c index 25cd402e7..80f1aea45 100644 --- a/src/utils/brcm_nl.c +++ b/src/utils/brcm_nl.c @@ -29,6 +29,42 @@ #define UCI_WIRELESS "wireless" #define UCI_WLAN_IFACE "wifi-iface" + +int if_updown(const char *ifname, bool up) +{ + int fd; + struct ifreq ifr; + short flags; + + if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + return -1; + } + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, ifname, IFNAMSIZ); + + if (ioctl(fd, SIOCGIFFLAGS, &ifr) != 0) { + close(fd); + return -1; + } + + flags = ifr.ifr_flags; + + if (up && !(flags & IFF_UP)) + ifr.ifr_flags |= IFF_UP; + + if (!up && (flags & IFF_UP)) + ifr.ifr_flags &= ~IFF_UP; + + if ((flags != ifr.ifr_flags) && (0 != ioctl(fd, SIOCSIFFLAGS, &ifr))) { + close(fd); + return -1; + } + + close(fd); + return 0; +} + static bool get_bridge(char *ifname, char *bridge) { strncpy(bridge, "br-lan", 15); @@ -73,9 +109,10 @@ static int func(struct nl_msg *msg, void *arg) "bridge %s\n", ifname, bridge); /* bring up wds interface */ - ret = if_setflags(ifname, IFF_UP); + //ret = if_setflags(ifname, IFF_UP); + ret = if_updown(ifname, true); if (!ret) - printf("Successfully brought up interface %s", + printf("Successfully brought up interface %s\n", ifname); break; } -- GitLab