Ensure packet priority is cleared when sending PMTU probe replies.
[tinc] / src / net_packet.c
index 59e9102..5d559bd 100644 (file)
@@ -1,7 +1,7 @@
 /*
     net_packet.c -- Handles in- and outgoing VPN packets
     Copyright (C) 1998-2005 Ivo Timmermans,
-                  2000-2016 Guus Sliepen <guus@tinc-vpn.org>
+                  2000-2017 Guus Sliepen <guus@tinc-vpn.org>
                   2010      Timothy Redaelli <timothy@redaelli.eu>
                   2010      Brandon Black <blblack@gmail.com>
 
@@ -355,16 +355,16 @@ static bool receive_udppacket(node_t *n, vpn_packet_t *inpkt) {
                if(seqno != n->received_seqno + 1) {
                        if(seqno >= n->received_seqno + replaywin * 8) {
                                if(n->farfuture++ < replaywin >> 2) {
-                                       logger(DEBUG_ALWAYS, LOG_WARNING, "Packet from %s (%s) is %d seqs in the future, dropped (%u)",
+                                       logger(DEBUG_TRAFFIC, LOG_WARNING, "Packet from %s (%s) is %d seqs in the future, dropped (%u)",
                                                n->name, n->hostname, seqno - n->received_seqno - 1, n->farfuture);
                                        return false;
                                }
-                               logger(DEBUG_ALWAYS, LOG_WARNING, "Lost %d packets from %s (%s)",
+                               logger(DEBUG_TRAFFIC, LOG_WARNING, "Lost %d packets from %s (%s)",
                                                seqno - n->received_seqno - 1, n->name, n->hostname);
                                memset(n->late, 0, replaywin);
                        } else if (seqno <= n->received_seqno) {
                                if((n->received_seqno >= replaywin * 8 && seqno <= n->received_seqno - replaywin * 8) || !(n->late[(seqno / 8) % replaywin] & (1 << seqno % 8))) {
-                                       logger(DEBUG_ALWAYS, LOG_WARNING, "Got late or replayed packet from %s (%s), seqno %d, last received %d",
+                                       logger(DEBUG_TRAFFIC, LOG_WARNING, "Got late or replayed packet from %s (%s), seqno %d, last received %d",
                                                n->name, n->hostname, seqno, n->received_seqno);
                                        return false;
                                }
@@ -436,7 +436,7 @@ void receive_tcppacket(connection_t *c, const char *buffer, int len) {
 
 bool receive_tcppacket_sptps(connection_t *c, const char *data, int len) {
        if (len < sizeof(node_id_t) + sizeof(node_id_t)) {
-               logger(DEBUG_ALWAYS, LOG_ERR, "Got too short TCP SPTPS packet from %s (%s)", c->name, c->hostname);
+               logger(DEBUG_PROTOCOL, LOG_ERR, "Got too short TCP SPTPS packet from %s (%s)", c->name, c->hostname);
                return false;
        }
 
@@ -846,6 +846,7 @@ bool receive_sptps_record(void *handle, uint8_t type, const void *data, uint16_t
 
        vpn_packet_t inpkt;
        inpkt.offset = DEFAULT_PACKET_OFFSET;
+       inpkt.priority = 0;
 
        if(type == PKT_PROBE) {
                if(!from->status.udppacket) {
@@ -1573,10 +1574,19 @@ void handle_device_data(void *data, int flags) {
        vpn_packet_t packet;
        packet.offset = DEFAULT_PACKET_OFFSET;
        packet.priority = 0;
+       static int errors = 0;
 
        if(devops.read(&packet)) {
+               errors = 0;
                myself->in_packets++;
                myself->in_bytes += packet.len;
                route(myself, &packet);
+       } else {
+               usleep(errors * 50000);
+               errors++;
+               if(errors > 10) {
+                       logger(DEBUG_ALWAYS, LOG_ERR, "Too many errors from %s, exiting!", device);
+                       event_exit();
+               }
        }
 }