Quit when there are too many consecutive errors on the tun/tap device.
[oweals/tinc.git] / src / net.c
index ee58ac0a0b943bf1f2e1c8e0f9bba3f179189925..bed779a5c50b3ef78abdd5a29a40bfc5b1822540 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -280,12 +280,21 @@ static void check_network_activity(fd_set * readset, fd_set * writeset) {
        int result, i;
        socklen_t len = sizeof(result);
        vpn_packet_t packet;
+       int errors = 0;
 
        /* check input from kernel */
        if(device_fd >= 0 && FD_ISSET(device_fd, readset)) {
                if(read_packet(&packet)) {
+                       errors = 0;
                        packet.priority = 0;
                        route(myself, &packet);
+               } else {
+                       usleep(errors * 50000);
+                       errors++;
+                       if(errors > 10) {
+                               logger(LOG_ERR, "Too many errors from %s, exiting!", device);
+                               running = false;
+                       }
                }
        }