+static char *device_info = NULL;
+
+static uint64_t device_total_in = 0;
+static uint64_t device_total_out = 0;
+
+extern char *myport;
+
+static DWORD WINAPI tapreader(void *bla) {
+ int status;
+ DWORD len;
+ OVERLAPPED overlapped;
+ vpn_packet_t packet;
+ int errors;
+
+ logger(LOG_DEBUG, "Tap reader running");
+
+ /* Read from tap device and send to parent */
+
+ overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ for(;;) {
+ overlapped.Offset = 0;
+ overlapped.OffsetHigh = 0;
+ ResetEvent(overlapped.hEvent);
+
+ status = ReadFile(device_handle, packet.data, MTU, &len, &overlapped);
+
+ if(!status) {
+ if(GetLastError() == ERROR_IO_PENDING) {
+ WaitForSingleObject(overlapped.hEvent, INFINITE);
+ if(!GetOverlappedResult(device_handle, &overlapped, &len, FALSE))
+ continue;
+ } else {
+ logger(LOG_ERR, "Error while reading from %s %s: %s", device_info,
+ device, strerror(errno));
+ errors++;
+ if(errors >= 10) {
+ EnterCriticalSection(&mutex);
+ running = false;
+ LeaveCriticalSection(&mutex);
+ }
+ usleep(1000000);
+ continue;
+ }
+ }