From ac7f82cb235008d1711781a87ffdce5d45465134 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Fri, 7 Feb 2014 16:34:08 +0100 Subject: [PATCH] Handle errors from TAP-Win32/64 adapter in a better way. Before, the tapreader thread would just exit immediately after encountering the first error, without notifying the main thread. Now, the tapreader thead never exits itself, but tells the main thread to stop when more than ten errors are encountered in a row. --- src/mingw/device.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/mingw/device.c b/src/mingw/device.c index 9744196..428a990 100644 --- a/src/mingw/device.c +++ b/src/mingw/device.c @@ -47,6 +47,7 @@ static DWORD WINAPI tapreader(void *bla) { DWORD len; OVERLAPPED overlapped; vpn_packet_t packet; + int errors; logger(DEBUG_ALWAYS, LOG_DEBUG, "Tap reader running"); @@ -69,13 +70,22 @@ static DWORD WINAPI tapreader(void *bla) { } else { logger(DEBUG_ALWAYS, LOG_ERR, "Error while reading from %s %s: %s", device_info, device, strerror(errno)); - return -1; + errors++; + if(errors >= 10) { + EnterCriticalSection(&mutex); + running = false; + LeaveCriticalSection(&mutex); + } + usleep(1000000); + continue; } } - EnterCriticalSection(&mutex); + errors = 0; packet.len = len; packet.priority = 0; + + EnterCriticalSection(&mutex); route(myself, &packet); event_flush_output(); LeaveCriticalSection(&mutex); -- 2.25.1