Handle errors from TAP-Win32/64 adapter in a better way.
authorGuus Sliepen <guus@tinc-vpn.org>
Fri, 7 Feb 2014 15:34:08 +0000 (16:34 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Fri, 7 Feb 2014 18:55:31 +0000 (19:55 +0100)
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

index 9744196a3cd93c65d2138b34deada4d540af6861..428a990e2004d766f549b564dcd6723c988fc25d 100644 (file)
@@ -47,6 +47,7 @@ static DWORD WINAPI tapreader(void *bla) {
        DWORD len;
        OVERLAPPED overlapped;
        vpn_packet_t packet;
        DWORD len;
        OVERLAPPED overlapped;
        vpn_packet_t packet;
+       int errors;
 
        logger(DEBUG_ALWAYS, LOG_DEBUG, "Tap reader running");
 
 
        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));
                        } 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;
                packet.len = len;
                packet.priority = 0;
+
+               EnterCriticalSection(&mutex);
                route(myself, &packet);
                event_flush_output();
                LeaveCriticalSection(&mutex);
                route(myself, &packet);
                event_flush_output();
                LeaveCriticalSection(&mutex);