|
|
|
|
@ -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
|
|
|
|
|
|