More tap work -- DHCP configuration and such.

This commit is contained in:
Adam Ierymenko 2013-08-27 15:55:32 -04:00
parent 1c88a518cf
commit cd907a7662
4 changed files with 71 additions and 0 deletions

View File

@ -739,6 +739,8 @@ EthernetTap::EthernetTap(
_r(renv),
_handler(handler),
_arg(arg),
_dhcp(false),
_dhcp6(false),
_tap(INVALID_HANDLE_VALUE),
_injectSemaphore(INVALID_HANDLE_VALUE),
_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?)");
}
setDhcpEnabled(false);
setDhcp6Enabled(false);
// Disable and enable interface to ensure registry settings take effect
{
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)
{
Mutex::Lock _l(_ips_m);

View File

@ -99,6 +99,31 @@ public:
*/
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
*/
@ -205,6 +230,9 @@ private:
void (*_handler)(void *,const MAC &,const MAC &,unsigned int,const Buffer<4096> &);
void *_arg;
bool _dhcp;
bool _dhcp6;
Thread _thread;
#ifdef __UNIX_LIKE__

View File

@ -175,6 +175,7 @@ void Network::setConfiguration(const Network::Config &conf)
_lastConfigUpdate = Utils::now();
_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");
if (!Utils::writeFile(confPath.c_str(),conf.toString())) {

View File

@ -233,6 +233,15 @@ public:
#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
throw(std::invalid_argument)
{