From: Guus Sliepen Date: Sun, 2 Jan 2011 14:02:23 +0000 (+0100) Subject: Always send MTU probes at least once every PingInterval. X-Git-Tag: release-1.0.14~22 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=f99661a4ca5bacff47239ce7978b9c9948917c54;p=oweals%2Ftinc.git Always send MTU probes at least once every PingInterval. Before, if MTU probes failed, tinc would stop sending probes until the next time keys were regenerated (by default, once every hour). Now it continues to send them every PingInterval, so it recovers faster from temporary failures. --- diff --git a/src/net_packet.c b/src/net_packet.c index 9e5ef46..aef5534 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -85,16 +85,21 @@ void send_mtu_probe(node_t *n) { } if(n->mtuprobes > 32) { + if(!n->minmtu) { + n->mtuprobes = 31; + timeout = pinginterval; + goto end; + } + ifdebug(TRAFFIC) logger(LOG_INFO, "%s (%s) did not respond to UDP ping, restarting PMTU discovery", n->name, n->hostname); n->mtuprobes = 1; n->minmtu = 0; n->maxmtu = MTU; } - if(n->mtuprobes >= 10 && !n->minmtu) { + if(n->mtuprobes >= 10 && n->mtuprobes < 32 && !n->minmtu) { ifdebug(TRAFFIC) logger(LOG_INFO, "No response to MTU probes from %s (%s)", n->name, n->hostname); - n->mtuprobes = 0; - return; + n->mtuprobes = 31; } if(n->mtuprobes == 30 || (n->mtuprobes < 30 && n->minmtu >= n->maxmtu)) { @@ -148,12 +153,17 @@ void mtu_probe_h(node_t *n, vpn_packet_t *packet, length_t len) { packet->data[0] = 1; send_udppacket(n, packet); } else { + if(n->mtuprobes > 30) { + if(n->minmtu) + n->mtuprobes = 30; + else + n->mtuprobes = 1; + } + if(len > n->maxmtu) len = n->maxmtu; if(n->minmtu < len) n->minmtu = len; - if(n->mtuprobes > 30) - n->mtuprobes = 30; } } diff --git a/src/protocol_key.c b/src/protocol_key.c index fbd7cab..e2e4be5 100644 --- a/src/protocol_key.c +++ b/src/protocol_key.c @@ -310,7 +310,7 @@ bool ans_key_h(connection_t *c) { update_node_udp(from, &sa); } - if(from->options & OPTION_PMTU_DISCOVERY && !from->mtuprobes) + if(from->options & OPTION_PMTU_DISCOVERY && !from->mtuevent) send_mtu_probe(from); return true;