--- crypto/bio/bss_dgram.c	2009-05-05 10:45:33.000000000 +0200
+++ crypto/bio/bss_dgram.c	2009-05-15 12:46:39.000000000 +0200
@@ -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 */
@@ -334,22 +336,26 @@
 		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;
