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 năm trước cách đây
mục cha
commit
6fc090eb00
1 tập tin đã thay đổi với 10 bổ sung5 xóa
  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