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);
{
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,
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));