Make maxmtu equal to minmtu when fixing the path MTU to a node.
[oweals/tinc.git] / src / net_packet.c
index 9b0e4685012491e75f25d3bd06e8e40ee0fd2a95..3466f87ee975a3aaf5a6d249542577b671038887 100644 (file)
@@ -91,6 +91,10 @@ void send_mtu_probe(node_t *n) {
        }
 
        if(n->mtuprobes == 30 || (n->mtuprobes < 30 && n->minmtu >= n->maxmtu)) {
+               if(n->minmtu > n->maxmtu)
+                       n->minmtu = n->maxmtu;
+               else
+                       n->maxmtu = n->minmtu;
                n->mtu = n->minmtu;
                ifdebug(TRAFFIC) logger(LOG_INFO, "Fixing MTU of %s (%s) to %d after %d probes", n->name, n->hostname, n->mtu, n->mtuprobes);
                n->mtuprobes = 31;
@@ -135,7 +139,7 @@ void mtu_probe_h(node_t *n, vpn_packet_t *packet, length_t len) {
 
        if(!packet->data[0]) {
                packet->data[0] = 1;
-               send_packet(n, packet);
+               send_udppacket(n, packet);
        } else {
                if(len > n->maxmtu)
                        len = n->maxmtu;
@@ -521,12 +525,16 @@ static node_t *try_harder(const sockaddr_t *from, const vpn_packet_t *pkt) {
        avl_node_t *node;
        edge_t *e;
        node_t *n = NULL;
+       static time_t last_hard_try = 0;
 
        for(node = edge_weight_tree->head; node; node = node->next) {
                e = node->data;
 
-               if(sockaddrcmp_noport(from, &e->address))
-                       continue;
+               if(sockaddrcmp_noport(from, &e->address)) {
+                       if(last_hard_try == now)
+                               continue;
+                       last_hard_try = now;
+               }
 
                if(!n)
                        n = e->to;