If a probe reply is received that makes minmtu equal to maxmtu, we
have to wait until try_mtu() runs to realize that. Since try_mtu()
runs after a packet is sent, this means there is at least one packet
(possibly more, depending on timing) that won't benefit from the
fixed MTU. This also happens when maxmtu is updated from the send()
path.
This commit fixes that by making sure we check whether the MTU can be
fixed every time minmtu or maxmtu is touched.
#define MAX_SEQNO 1073741824
#define MAX_SEQNO 1073741824
+static void try_fix_mtu(node_t *n) {
+ if(n->mtuprobes > 30)
+ return;
+
+ if(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;
+ logger(DEBUG_TRAFFIC, LOG_INFO, "Fixing MTU of %s (%s) to %d after %d probes", n->name, n->hostname, n->mtu, n->mtuprobes);
+ n->mtuprobes = 31;
+ }
+}
+
static void udp_probe_timeout_handler(void *data) {
node_t *n = data;
if(!n->status.udp_confirmed)
static void udp_probe_timeout_handler(void *data) {
node_t *n = data;
if(!n->status.udp_confirmed)
if(probelen > n->maxmtu)
probelen = n->maxmtu;
if(probelen > n->maxmtu)
probelen = n->maxmtu;
- if(n->minmtu < probelen)
+ if(n->minmtu < probelen) {
/* Calculate RTT and bandwidth.
The RTT is the time between the MTU probe burst was sent and the first
/* Calculate RTT and bandwidth.
The RTT is the time between the MTU probe burst was sent and the first
n->maxmtu = origlen - 1;
if(n->mtu >= origlen)
n->mtu = origlen - 1;
n->maxmtu = origlen - 1;
if(n->mtu >= origlen)
n->mtu = origlen - 1;
} else
logger(DEBUG_TRAFFIC, LOG_WARNING, "Error sending packet to %s (%s): %s", n->name, n->hostname, sockstrerror(sockerrno));
}
} else
logger(DEBUG_TRAFFIC, LOG_WARNING, "Error sending packet to %s (%s): %s", n->name, n->hostname, sockstrerror(sockerrno));
}
relay->maxmtu = len - 1;
if(relay->mtu >= len)
relay->mtu = len - 1;
relay->maxmtu = len - 1;
if(relay->mtu >= len)
relay->mtu = len - 1;
} else {
logger(DEBUG_TRAFFIC, LOG_WARNING, "Error sending UDP SPTPS packet to %s (%s): %s", relay->name, relay->hostname, sockstrerror(sockerrno));
return false;
} else {
logger(DEBUG_TRAFFIC, LOG_WARNING, "Error sending UDP SPTPS packet to %s (%s): %s", relay->name, relay->hostname, sockstrerror(sockerrno));
return false;
- 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;
- logger(DEBUG_TRAFFIC, LOG_INFO, "Fixing MTU of %s (%s) to %d after %d probes", n->name, n->hostname, n->mtu, n->mtuprobes);
- n->mtuprobes = 31;
- }
int timeout;
if(n->mtuprobes == 31) {
int timeout;
if(n->mtuprobes == 31) {
send_udp_probe_packet(n, MAX(len, 64));
}
send_udp_probe_packet(n, MAX(len, 64));
}
+
+ if(n->mtuprobes >= 0)
+ n->mtuprobes++;