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

View file

@ -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__

View file

@ -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())) {

View file

@ -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)
{ {