summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2009-05-15 23:06:41 +0000
committerDr. Stephen Henson <steve@openssl.org>2009-05-15 23:06:41 +0000
commitd3d4f9f5e9c592c661604d0f5995e6ac2f8507e9 (patch)
tree80f2c351d1739cc444bee93e9e018f0117de98a3
parenteb38b26dbc2dd15bb6e0a351d0826e7da09b1782 (diff)
PR: 1929
Submitted by: Robin Seggelmann <seggelmann@fh-muenster.de> Approved by: steve@openssl.org DTLS MTU bug.
-rw-r--r--crypto/bio/bss_dgram.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/crypto/bio/bss_dgram.c b/crypto/bio/bss_dgram.c
index 173d871f56..1e4666822f 100644
--- a/crypto/bio/bss_dgram.c
+++ b/crypto/bio/bss_dgram.c
@@ -70,7 +70,9 @@
#include <sys/timeb.h>
#endif
+#ifdef OPENSSL_SYS_LINUX
#define IP_MTU 14 /* linux is lame */
+#endif
#ifdef WATT32
#define sock_write SockWrite /* Watt-32 uses same names */
@@ -401,22 +403,26 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
break;
#endif
case BIO_CTRL_DGRAM_QUERY_MTU:
- sockopt_len = sizeof(sockopt_val);
+#ifdef IP_MTU
+ sockopt_len = sizeof(sockopt_val);
if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val,
&sockopt_len)) < 0 || sockopt_val < 0)
{ ret = 0; }
else
{
- data->mtu = sockopt_val;
+ data->mtu = sockopt_val - 20 - 8; /* Subtract IP and UDP header */
ret = data->mtu;
}
+#else
+ ret = 0;
+#endif
break;
case BIO_CTRL_DGRAM_GET_MTU:
return data->mtu;
break;
case BIO_CTRL_DGRAM_SET_MTU:
- data->mtu = num;
- ret = num;
+ data->mtu = num - 20 - 8; /* Subtract IP and UDP header */
+ ret = data->mtu;
break;
case BIO_CTRL_DGRAM_SET_CONNECTED:
to = (struct sockaddr *)ptr;