diff --git a/src/utils/brcm_nl.c b/src/utils/brcm_nl.c index 25cd402e7b1e47243d033866d471d856f1e6657c..80f1aea45697057286c6d4d8ae17109793d7ad44 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; }