Forward packets to not directly reachable hosts via UDP if possible.
[tinc] / src / net_packet.c
index 626f8b1..054a66f 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;
@@ -365,10 +369,13 @@ static void send_udppacket(node_t *n, vpn_packet_t *origpkt) {
 
        if(n->options & OPTION_PMTU_DISCOVERY && inpkt->len > n->minmtu && (inpkt->data[12] | inpkt->data[13])) {
                ifdebug(TRAFFIC) logger(LOG_INFO,
-                               "Packet for %s (%s) larger than minimum MTU, forwarding via TCP",
-                               n->name, n->hostname);
+                               "Packet for %s (%s) larger than minimum MTU, forwarding via %s",
+                               n->name, n->hostname, n != n->nexthop ? n->nexthop->name : "TCP");
 
-               send_tcppacket(n->nexthop->connection, origpkt);
+               if(n != n->nexthop)
+                       send_packet(n->nexthop, origpkt);
+               else
+                       send_tcppacket(n->nexthop->connection, origpkt);
 
                return;
        }