From 66f325f4674e70d83744626f3b8dda6760f8d613 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Mon, 12 May 2014 15:57:40 +0200 Subject: [PATCH] Fix PMTU discovery via datagram SPTPS. In send_sptps_data(), the len variable contains the length of the whole datagram that needs to be sent to the peer, including the overhead from SPTPS itself. --- src/net_packet.c | 4 +++- src/sptps.h | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/net_packet.c b/src/net_packet.c index 012085e2..ecdcfe20 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -767,7 +767,7 @@ bool send_sptps_data(void *handle, uint8_t type, const char *data, size_t len) { /* Send it via TCP if it is a handshake packet, TCPOnly is in use, or this packet is larger than the MTU. */ - if(type >= SPTPS_HANDSHAKE || ((myself->options | to->options) & OPTION_TCPONLY) || (type != PKT_PROBE && len > to->minmtu)) { + if(type >= SPTPS_HANDSHAKE || ((myself->options | to->options) & OPTION_TCPONLY) || (type != PKT_PROBE && (len - SPTPS_DATAGRAM_OVERHEAD) > to->minmtu)) { char buf[len * 4 / 3 + 5]; b64encode(data, buf, len); /* If no valid key is known yet, send the packets using ANS_KEY requests, @@ -792,6 +792,8 @@ bool send_sptps_data(void *handle, uint8_t type, const char *data, size_t len) { if(sendto(listen_socket[sock].udp.fd, data, len, 0, &sa->sa, SALEN(sa->sa)) < 0 && !sockwouldblock(sockerrno)) { if(sockmsgsize(sockerrno)) { + // Compensate for SPTPS overhead + len -= SPTPS_DATAGRAM_OVERHEAD; if(to->maxmtu >= len) to->maxmtu = len - 1; if(to->mtu >= len) diff --git a/src/sptps.h b/src/sptps.h index 3f8d29c6..efca2b3e 100644 --- a/src/sptps.h +++ b/src/sptps.h @@ -39,6 +39,9 @@ #define SPTPS_SIG 3 // Waiting for a SIGnature record #define SPTPS_ACK 4 // Waiting for an ACKnowledgement record +// Overhead for datagrams +#define SPTPS_DATAGRAM_OVERHEAD 21 + typedef bool (*send_data_t)(void *handle, uint8_t type, const char *data, size_t len); typedef bool (*receive_record_t)(void *handle, uint8_t type, const char *data, uint16_t len); -- 2.20.1