From d30b9e1272fef18070d37d10b2b3e4bb2fc07f59 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Mon, 19 Nov 2012 14:20:50 +0100 Subject: [PATCH] Ensure MTU probe replies are sent back the same way they came in. Also sprinkle some comments over mtu_probe_h(). --- src/net_packet.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/net_packet.c b/src/net_packet.c index 902b0815..e50135ec 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -164,11 +164,26 @@ static void mtu_probe_h(node_t *n, vpn_packet_t *packet, length_t len) { logger(DEBUG_TRAFFIC, LOG_INFO, "Got MTU probe length %d from %s (%s)", packet->len, n->name, n->hostname); if(!packet->data[0]) { + /* It's a probe request, send back a reply */ + packet->data[0] = 1; + + /* Temporarily set udp_confirmed, so that the reply is sent + back exactly the way it came in. */ + + bool udp_confirmed = n->status.udp_confirmed; + n->status.udp_confirmed = true; send_udppacket(n, packet); + n->status.udp_confirmed = udp_confirmed; } else { + /* It's a valid reply: now we know bidirectional communication + is possible using the address and socket that the reply + packet used. */ + n->status.udp_confirmed = true; + /* If we haven't established the PMTU yet, restart the discovery process. */ + if(n->mtuprobes > 30) { if(n->minmtu) n->mtuprobes = 30; @@ -176,6 +191,8 @@ static void mtu_probe_h(node_t *n, vpn_packet_t *packet, length_t len) { n->mtuprobes = 1; } + /* If applicable, raise the minimum supported MTU */ + if(len > n->maxmtu) len = n->maxmtu; if(n->minmtu < len) -- 2.20.1