Browse Source

More tap work -- DHCP configuration and such.

Adam Ierymenko 12 years ago
parent
commit
cd907a7662
4 changed files with 71 additions and 0 deletions
  1. 33 0
      node/EthernetTap.cpp
  2. 28 0
      node/EthernetTap.hpp
  3. 1 0
      node/Network.cpp
  4. 9 0
      node/Network.hpp

+ 33 - 0
node/EthernetTap.cpp

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

+ 28 - 0
node/EthernetTap.hpp

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

+ 1 - 0
node/Network.cpp

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

+ 9 - 0
node/Network.hpp

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