PR: 1929
authorDr. Stephen Henson <steve@openssl.org>
Fri, 15 May 2009 23:06:41 +0000 (23:06 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Fri, 15 May 2009 23:06:41 +0000 (23:06 +0000)
Submitted by: Robin Seggelmann <seggelmann@fh-muenster.de>
Approved by: steve@openssl.org

DTLS MTU bug.

crypto/bio/bss_dgram.c

index 173d871f567d9f81581942cff0483ad6402efa87..1e4666822ffe3cf5709bf11644d42eeb59e17734 100644 (file)
@@ -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;