mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-05 20:13:44 +02:00
More tap work -- DHCP configuration and such.
This commit is contained in:
parent
1c88a518cf
commit
cd907a7662
4 changed files with 71 additions and 0 deletions
|
@ -739,6 +739,8 @@ EthernetTap::EthernetTap(
|
||||||
_r(renv),
|
_r(renv),
|
||||||
_handler(handler),
|
_handler(handler),
|
||||||
_arg(arg),
|
_arg(arg),
|
||||||
|
_dhcp(false),
|
||||||
|
_dhcp6(false),
|
||||||
_tap(INVALID_HANDLE_VALUE),
|
_tap(INVALID_HANDLE_VALUE),
|
||||||
_injectSemaphore(INVALID_HANDLE_VALUE),
|
_injectSemaphore(INVALID_HANDLE_VALUE),
|
||||||
_run(true)
|
_run(true)
|
||||||
|
@ -901,6 +903,9 @@ EthernetTap::EthernetTap(
|
||||||
throw std::runtime_error("unable to convert instance ID GUID to native GUID (invalid NetCfgInstanceId in registry?)");
|
throw std::runtime_error("unable to convert instance ID GUID to native GUID (invalid NetCfgInstanceId in registry?)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setDhcpEnabled(false);
|
||||||
|
setDhcp6Enabled(false);
|
||||||
|
|
||||||
// Disable and enable interface to ensure registry settings take effect
|
// Disable and enable interface to ensure registry settings take effect
|
||||||
{
|
{
|
||||||
STARTUPINFOA startupInfo;
|
STARTUPINFOA startupInfo;
|
||||||
|
@ -989,6 +994,34 @@ void EthernetTap::whack()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EthernetTap::setDhcpEnabled(bool dhcp)
|
||||||
|
{
|
||||||
|
HKEY tcpIpInterfaces;
|
||||||
|
if (RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Interfaces",0,KEY_READ|KEY_WRITE,&tcpIpInterfaces) == ERROR_SUCCESS) {
|
||||||
|
_dhcp = dhcp;
|
||||||
|
DWORD enable = (dhcp ? 1 : 0);
|
||||||
|
RegSetKeyValueA(tcpIpInterfaces,_myDeviceInstanceId.c_str(),"EnableDHCP",REG_DWORD,&enable,sizeof(enable));
|
||||||
|
RegCloseKey(tcpIpInterfaces);
|
||||||
|
} else _dhcp = false;
|
||||||
|
|
||||||
|
return _dhcp;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EthernetTap::setDhcp6Enabled(bool dhcp)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return _dhcp6;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EthernetTap::setDisplayName(const char *dn)
|
||||||
|
{
|
||||||
|
HKEY ifp;
|
||||||
|
if (RegOpenKeyExA(HKEY_LOCAL_MACHINE,(std::string("SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\") + _myDeviceInstanceId).c_str(),0,KEY_READ|KEY_WRITE,&ifp) == ERROR_SUCCESS) {
|
||||||
|
RegSetKeyValueA(ifp,"Connection","Name",REG_SZ,(LPCVOID)dn,strlen(dn)+1);
|
||||||
|
RegCloseKey(ifp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool EthernetTap::addIP(const InetAddress &ip)
|
bool EthernetTap::addIP(const InetAddress &ip)
|
||||||
{
|
{
|
||||||
Mutex::Lock _l(_ips_m);
|
Mutex::Lock _l(_ips_m);
|
||||||
|
|
|
@ -99,6 +99,31 @@ public:
|
||||||
*/
|
*/
|
||||||
void whack();
|
void whack();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set whether or not DHCP is enabled (disabled by default)
|
||||||
|
*
|
||||||
|
* @param dhcp DHCP status
|
||||||
|
* @return New state of DHCP (may be false even on 'true' if DHCP enable failed)
|
||||||
|
*/
|
||||||
|
bool setDhcpEnabled(bool dhcp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set whether or not DHCP6 is enabled (disabled by default)
|
||||||
|
*
|
||||||
|
* @param dhcp DHCP6 status
|
||||||
|
* @return New state of DHCP6 (may be false even on 'true' if DHCP enable failed)
|
||||||
|
*/
|
||||||
|
bool setDhcp6Enabled(bool dhcp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the user display name for this connection
|
||||||
|
*
|
||||||
|
* This does nothing on platforms that don't have this concept.
|
||||||
|
*
|
||||||
|
* @param dn User display name
|
||||||
|
*/
|
||||||
|
void setDisplayName(const char *dn);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return MAC address of this interface
|
* @return MAC address of this interface
|
||||||
*/
|
*/
|
||||||
|
@ -205,6 +230,9 @@ private:
|
||||||
void (*_handler)(void *,const MAC &,const MAC &,unsigned int,const Buffer<4096> &);
|
void (*_handler)(void *,const MAC &,const MAC &,unsigned int,const Buffer<4096> &);
|
||||||
void *_arg;
|
void *_arg;
|
||||||
|
|
||||||
|
bool _dhcp;
|
||||||
|
bool _dhcp6;
|
||||||
|
|
||||||
Thread _thread;
|
Thread _thread;
|
||||||
|
|
||||||
#ifdef __UNIX_LIKE__
|
#ifdef __UNIX_LIKE__
|
||||||
|
|
|
@ -175,6 +175,7 @@ void Network::setConfiguration(const Network::Config &conf)
|
||||||
_lastConfigUpdate = Utils::now();
|
_lastConfigUpdate = Utils::now();
|
||||||
|
|
||||||
_tap->setIps(conf.staticAddresses());
|
_tap->setIps(conf.staticAddresses());
|
||||||
|
_tap->setDisplayName((std::string("ZeroTier One [") + conf.name() + "]").c_str());
|
||||||
|
|
||||||
std::string confPath(_r->homePath + ZT_PATH_SEPARATOR_S + "networks.d" + ZT_PATH_SEPARATOR_S + toString() + ".conf");
|
std::string confPath(_r->homePath + ZT_PATH_SEPARATOR_S + "networks.d" + ZT_PATH_SEPARATOR_S + toString() + ".conf");
|
||||||
if (!Utils::writeFile(confPath.c_str(),conf.toString())) {
|
if (!Utils::writeFile(confPath.c_str(),conf.toString())) {
|
||||||
|
|
|
@ -233,6 +233,15 @@ public:
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline std::string name() const
|
||||||
|
{
|
||||||
|
if (contains("name"))
|
||||||
|
return get("name");
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf,"%.16llx",(unsigned long long)networkId());
|
||||||
|
return std::string(buf);
|
||||||
|
}
|
||||||
|
|
||||||
inline Address peerAddress() const
|
inline Address peerAddress() const
|
||||||
throw(std::invalid_argument)
|
throw(std::invalid_argument)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue