Преглед на файлове

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

Adam Ierymenko преди 10 години
родител
ревизия
6fc090eb00
променени са 1 файла, в които са добавени 10 реда и са изтрити 5 реда
  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