فهرست منبع

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