Browse Source

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

Adam Ierymenko 10 years ago
parent
commit
6fc090eb00
1 changed files with 10 additions and 5 deletions
  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