Enable a datapath interface manually 85/256085/2 accepted/tizen/unified/20210407.100543 submit/tizen/20210405.022858
authorSeonah Moon <seonah1.moon@samsung.com>
Mon, 29 Mar 2021 07:25:29 +0000 (16:25 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Tue, 30 Mar 2021 04:52:45 +0000 (13:52 +0900)
Change-Id: I81fa94b9b9b528ba55da7be58ebc1a5f9c21f970

include/NanUtils.h
src/NanDataPathManager.cpp
src/NanUtils.cpp

index dadb64afde79f121e4b09ab251e6331625ac26ca..09a850216c2d091dedd7c079dbad787585d0bb2a 100644 (file)
@@ -29,5 +29,7 @@
 
 bool isSameMacAddress(const uint8_t *mac1, const uint8_t *mac2);
 bool isWifiInterfaceUp(const char *interfaceName);
+void interfaceUp(const char *interfaceName);
+void interfaceDown(const char *interfaceName);
 int addRoute(const char *interfaceName, const char *ipv6Address);
 int deleteRoute(const char *interfaceName, const char *ipv6Address);
index 07cbbbeb085d5a394fe9086079f72ef0c09b60af..c7f6393b9839ba92406b2fa7fafbbba3733256fb 100644 (file)
@@ -77,12 +77,14 @@ void NanDataPathManager::addDataPathInterface(std::string interface)
 {
        NAN_LOGD("Data Path Interface %s is added", interface.c_str());
        mDataPathInterfaces.insert(interface);
+       interfaceUp(interface.c_str());
 }
 
 void NanDataPathManager::removeDataPathInterface(std::string interface)
 {
        NAN_LOGD("Data Path Interface %s is deleted", interface.c_str());
        mDataPathInterfaces.erase(interface);
+       interfaceDown(interface.c_str());
 }
 
 NanDataPathInformation *NanDataPathManager::createDataPathInformation(uint16_t pubSubId, NanPeer *peer,
index 996528c645142d26093482004bc7d1adb272ff46..ff3ab66989ce65333994f0bac78b57c3c64b33ce 100644 (file)
@@ -64,6 +64,50 @@ bool isWifiInterfaceUp(const char *interfaceName)
        return (ifr.ifr_flags & IFF_UP);
 }
 
+void interfaceUp(const char *interfaceName)
+{
+       if (interfaceName == NULL)
+               return;
+
+       struct ifreq ifr;
+       int sk = socket(AF_INET, SOCK_DGRAM, 0);
+
+       NAN_LOGD("Try to enable a network interface [%s]", interfaceName);
+       if (sk < 0)
+               return;
+
+       memset(&ifr, 0, sizeof ifr);
+       strncpy(ifr.ifr_name, interfaceName, IFNAMSIZ - 1);
+       ifr.ifr_flags |= IFF_UP;
+
+       if (ioctl(sk, SIOCSIFFLAGS, &ifr) < 0)
+               NAN_LOGE("ioctl SIOCGIFFLAGS failed: %d", errno);
+
+       close(sk);
+}
+
+void interfaceDown(const char *interfaceName)
+{
+       if (interfaceName == NULL)
+               return;
+
+       struct ifreq ifr;
+       int sk = socket(AF_INET, SOCK_DGRAM, 0);
+
+       NAN_LOGD("Try to disable a network interface [%s]", interfaceName);
+       if (sk < 0)
+               return;
+
+       memset(&ifr, 0, sizeof ifr);
+       strncpy(ifr.ifr_name, interfaceName, IFNAMSIZ - 1);
+       ifr.ifr_flags &= ~IFF_UP;
+
+       if (ioctl(sk, SIOCSIFFLAGS, &ifr) < 0)
+               NAN_LOGE("ioctl SIOCGIFFLAGS failed: %d", errno);
+
+       close(sk);
+}
+
 static int updateRtmsg(struct in6_rtmsg *rt, const char *interfaceName, const char *ipv6Address)
 {
        memset(rt, 0, sizeof(struct in6_rtmsg));