Explorar el Código

Don't actually "power cycle" the interface except on startup. Doing that after we're running could lose IP configuration.

Adam Ierymenko hace 10 años
padre
commit
6fc090eb00
Se han modificado 1 ficheros con 10 adiciones y 5 borrados
  1. 10 5
      osdep/WindowsEthernetTap.cpp

+ 10 - 5
osdep/WindowsEthernetTap.cpp

@@ -589,16 +589,20 @@ void WindowsEthernetTap::threadMain()
 
 	Utils::snprintf(tapPath,sizeof(tapPath),"\\\\.\\Global\\%s.tap",_netCfgInstanceId.c_str());
 	int prevTapResetStatus = _systemTapResetStatus;
-	bool throwOneAway = true; // "Power cycle" the network port once on startup, because Windows...
+	bool throwOneAway = true; // Restart once on startup, because Windows.
+	bool powerCycle = true; // If true, "power cycle" the device, because Windows.
 	while (_run) {
-		_disableTapDevice();
-		Sleep(500);
-		_enableTapDevice();
-		Sleep(500);
+		if (powerCycle) {
+			_disableTapDevice();
+			Sleep(500);
+			_enableTapDevice();
+			Sleep(500);
+		}
 
 		_tap = CreateFileA(tapPath,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM|FILE_FLAG_OVERLAPPED,NULL);
 		if (_tap == INVALID_HANDLE_VALUE) {
 			fprintf(stderr,"Error opening %s -- retrying.\r\n",tapPath);
+			powerCycle = true;
 			continue;
 		}
 
@@ -700,6 +704,7 @@ void WindowsEthernetTap::threadMain()
 		bool writeInProgress = false;
 		while (_run) {
 			if ((prevTapResetStatus != _systemTapResetStatus)||(throwOneAway)) {
+				powerCycle = throwOneAway;
 				throwOneAway = false;
 				prevTapResetStatus = _systemTapResetStatus;
 				break; // this will cause us to close and reopen the tap