--- crypto/bio/bio.h	7 Mar 2012 15:14:16 -0000	1.67.2.16
+++ crypto/bio/bio.h	4 Jun 2012 09:36:26 -0000
@@ -162,6 +162,7 @@
 
 #define BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT   45 /* Next DTLS handshake timeout to
 											  * adjust socket timeouts */
+#define BIO_CTRL_DGRAM_SET_DONT_FRAG      48
 
 /* modifiers */
 #define BIO_FP_READ		0x02

--- crypto/bio/bss_dgram.c	7 Mar 2012 15:14:16 -0000	1.2.2.22
+++ crypto/bio/bss_dgram.c	4 Jun 2012 09:36:26 -0000
@@ -346,11 +346,9 @@
 	int *ip;
 	struct sockaddr *to = NULL;
 	bio_dgram_data *data = NULL;
-#if defined(IP_MTU_DISCOVER) || defined(IP_MTU)
-	long sockopt_val = 0;
-	unsigned int sockopt_len = 0;
-#endif
+	int sockopt_val = 0;
 #ifdef OPENSSL_SYS_LINUX
+	unsigned int sockopt_len = 0;
 	socklen_t addr_len;
 	struct sockaddr_storage addr;
 #endif
@@ -634,6 +632,29 @@
 			ret = 0;
 		break;
 #endif
+	case BIO_CTRL_DGRAM_SET_DONT_FRAG:
+#ifdef OPENSSL_SYS_LINUX
+		sockopt_val = num ? IP_PMTUDISC_PROBE : IP_PMTUDISC_DONT;
+#else
+		sockopt_val = num ? 1 : 0;
+#endif
+
+#if defined(IP_DONTFRAG)
+		if ((ret = setsockopt(b->num, IPPROTO_IP, IP_DONTFRAG,
+			&sockopt_val, sizeof(sockopt_val))) < 0)
+			{ perror("setsockopt"); ret = -1; }
+#elif defined(OPENSSL_SYS_LINUX)
+		if ((ret = setsockopt(b->num, IPPROTO_IP, IP_MTU_DISCOVER,
+			&sockopt_val, sizeof(sockopt_val))) < 0)
+			{ perror("setsockopt"); ret = -1; }
+#elif defined(OPENSSL_SYS_WINDOWS)
+		if ((ret = setsockopt(b->num, IPPROTO_IP, IP_DONTFRAGMENT,
+			(const char *)&sockopt_val, sizeof(sockopt_val))) < 0)
+			{ perror("setsockopt"); ret = -1; }
+#else
+		ret = -1;
+#endif
+		break;
 	default:
 		ret=0;
 		break;
