|
@@ -570,6 +570,11 @@ std::string EthernetTap::deviceName() const
|
|
|
return std::string(_dev);
|
|
|
}
|
|
|
|
|
|
+std::string EthernetTap::persistentId() const
|
|
|
+{
|
|
|
+ return std::string();
|
|
|
+}
|
|
|
+
|
|
|
#ifdef __LINUX__
|
|
|
bool EthernetTap::updateMulticastGroups(std::set<MulticastGroup> &groups)
|
|
|
{
|
|
@@ -901,6 +906,11 @@ void EthernetTap::threadMain()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+bool EthernetTap::deletePersistentTapDevice(const RuntimeEnvironment *_r,const char *pid)
|
|
|
+{
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
} // namespace ZeroTier
|
|
|
|
|
|
#endif // __UNIX_LIKE__ //////////////////////////////////////////////////////
|
|
@@ -1278,31 +1288,9 @@ bool EthernetTap::addIP(const InetAddress &ip)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // Update registry to contain all non-link-local IPs for this interface
|
|
|
- std::string regMultiIps,regMultiNetmasks;
|
|
|
- for(std::set<InetAddress>::const_iterator i(haveIps.begin());i!=haveIps.end();++i) {
|
|
|
- if (!i->isLinkLocal()) {
|
|
|
- regMultiIps.append(i->toIpString());
|
|
|
- regMultiIps.push_back((char)0);
|
|
|
- regMultiNetmasks.append(i->netmask().toIpString());
|
|
|
- regMultiNetmasks.push_back((char)0);
|
|
|
- }
|
|
|
- }
|
|
|
- HKEY tcpIpInterfaces;
|
|
|
- if (RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Interfaces",0,KEY_READ|KEY_WRITE,&tcpIpInterfaces) == ERROR_SUCCESS) {
|
|
|
- if (regMultiIps.length()) {
|
|
|
- regMultiIps.push_back((char)0);
|
|
|
- regMultiNetmasks.push_back((char)0);
|
|
|
- RegSetKeyValueA(tcpIpInterfaces,_myDeviceInstanceId.c_str(),"IPAddress",REG_MULTI_SZ,regMultiIps.data(),(DWORD)regMultiIps.length());
|
|
|
- RegSetKeyValueA(tcpIpInterfaces,_myDeviceInstanceId.c_str(),"SubnetMask",REG_MULTI_SZ,regMultiNetmasks.data(),(DWORD)regMultiNetmasks.length());
|
|
|
- } else {
|
|
|
- RegDeleteKeyValueA(tcpIpInterfaces,_myDeviceInstanceId.c_str(),"IPAddress");
|
|
|
- RegDeleteKeyValueA(tcpIpInterfaces,_myDeviceInstanceId.c_str(),"SubnetMask");
|
|
|
- }
|
|
|
- }
|
|
|
- RegCloseKey(tcpIpInterfaces);
|
|
|
+ _syncIpsWithRegistry(haveIps);
|
|
|
} catch (std::exception &exc) {
|
|
|
- LOG("unexpected exception adding IP address to %s: %s",ip.toString().c_str(),deviceName().c_str(),exc.what());
|
|
|
+ LOG("unexpected exception adding IP address %s to %s: %s",ip.toString().c_str(),deviceName().c_str(),exc.what());
|
|
|
} catch ( ... ) {
|
|
|
LOG("unexpected exception adding IP address %s to %s: unknown exception",ip.toString().c_str(),deviceName().c_str());
|
|
|
}
|
|
@@ -1331,13 +1319,18 @@ bool EthernetTap::removeIP(const InetAddress &ip)
|
|
|
if (addr == ip) {
|
|
|
DeleteUnicastIpAddressEntry(&(ipt->Table[i]));
|
|
|
FreeMibTable(ipt);
|
|
|
+ _syncIpsWithRegistry(ips());
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
FreeMibTable((PVOID)ipt);
|
|
|
}
|
|
|
- } catch ( ... ) {}
|
|
|
+ } catch (std::exception &exc) {
|
|
|
+ LOG("unexpected exception removing IP address %s from %s: %s",ip.toString().c_str(),deviceName().c_str(),exc.what());
|
|
|
+ } catch ( ... ) {
|
|
|
+ LOG("unexpected exception removing IP address %s from %s: unknown exception",ip.toString().c_str(),deviceName().c_str());
|
|
|
+ }
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -1398,6 +1391,11 @@ std::string EthernetTap::deviceName() const
|
|
|
return _myDeviceInstanceId;
|
|
|
}
|
|
|
|
|
|
+std::string EthernetTap::persistentId() const
|
|
|
+{
|
|
|
+ return _myDeviceInstanceIdPath;
|
|
|
+}
|
|
|
+
|
|
|
bool EthernetTap::updateMulticastGroups(std::set<MulticastGroup> &groups)
|
|
|
{
|
|
|
std::set<MulticastGroup> newGroups;
|
|
@@ -1501,6 +1499,59 @@ void EthernetTap::threadMain()
|
|
|
CancelIo(_tap);
|
|
|
}
|
|
|
|
|
|
+bool EthernetTap::deletePersistentTapDevice(const RuntimeEnvironment *_r,const char *pid)
|
|
|
+{
|
|
|
+#ifdef _WIN64
|
|
|
+ BOOL is64Bit = TRUE;
|
|
|
+ const char *devcon = "\\devcon_x64.exe";
|
|
|
+#else
|
|
|
+ BOOL is64Bit = FALSE;
|
|
|
+ IsWow64Process(GetCurrentProcess(),&is64Bit);
|
|
|
+ const char *devcon = ((is64Bit == TRUE) ? "\\devcon_x64.exe" : "\\devcon_x86.exe");
|
|
|
+#endif
|
|
|
+
|
|
|
+ STARTUPINFOA startupInfo;
|
|
|
+ startupInfo.cb = sizeof(startupInfo);
|
|
|
+ PROCESS_INFORMATION processInfo;
|
|
|
+ memset(&startupInfo,0,sizeof(STARTUPINFOA));
|
|
|
+ memset(&processInfo,0,sizeof(PROCESS_INFORMATION));
|
|
|
+ if (CreateProcessA(NULL,(LPSTR)(std::string("\"") + _r->homePath + devcon + "\" remove @" + pid).c_str(),NULL,NULL,FALSE,0,NULL,NULL,&startupInfo,&processInfo)) {
|
|
|
+ WaitForSingleObject(processInfo.hProcess,INFINITE);
|
|
|
+ CloseHandle(processInfo.hProcess);
|
|
|
+ CloseHandle(processInfo.hThread);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+void EthernetTap::_syncIpsWithRegistry(const std::set<InetAddress> &haveIps)
|
|
|
+{
|
|
|
+ // Update registry to contain all non-link-local IPs for this interface
|
|
|
+ std::string regMultiIps,regMultiNetmasks;
|
|
|
+ for(std::set<InetAddress>::const_iterator i(haveIps.begin());i!=haveIps.end();++i) {
|
|
|
+ if (!i->isLinkLocal()) {
|
|
|
+ regMultiIps.append(i->toIpString());
|
|
|
+ regMultiIps.push_back((char)0);
|
|
|
+ regMultiNetmasks.append(i->netmask().toIpString());
|
|
|
+ regMultiNetmasks.push_back((char)0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ HKEY tcpIpInterfaces;
|
|
|
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Interfaces",0,KEY_READ|KEY_WRITE,&tcpIpInterfaces) == ERROR_SUCCESS) {
|
|
|
+ if (regMultiIps.length()) {
|
|
|
+ regMultiIps.push_back((char)0);
|
|
|
+ regMultiNetmasks.push_back((char)0);
|
|
|
+ RegSetKeyValueA(tcpIpInterfaces,_myDeviceInstanceId.c_str(),"IPAddress",REG_MULTI_SZ,regMultiIps.data(),(DWORD)regMultiIps.length());
|
|
|
+ RegSetKeyValueA(tcpIpInterfaces,_myDeviceInstanceId.c_str(),"SubnetMask",REG_MULTI_SZ,regMultiNetmasks.data(),(DWORD)regMultiNetmasks.length());
|
|
|
+ } else {
|
|
|
+ RegDeleteKeyValueA(tcpIpInterfaces,_myDeviceInstanceId.c_str(),"IPAddress");
|
|
|
+ RegDeleteKeyValueA(tcpIpInterfaces,_myDeviceInstanceId.c_str(),"SubnetMask");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ RegCloseKey(tcpIpInterfaces);
|
|
|
+}
|
|
|
+
|
|
|
} // namespace ZeroTier
|
|
|
|
|
|
#endif // __WINDOWS__ ////////////////////////////////////////////////////////
|