Reduce version skew.
[openssl.git] / crypto / bio / bss_dgram.c
index c1972191676c9313eb3304d3cf502b9eaf0a624a..46cbe8a407697a923bc6a709ce98e239ed68d57e 100644 (file)
 #define IP_MTU      14 /* linux is lame */
 #endif
 
+#ifdef __FreeBSD__
+/* Standard definition causes type-punning problems. */
+#undef IN6_IS_ADDR_V4MAPPED
+#define s6_addr32 __u6_addr.__u6_addr32
+#define IN6_IS_ADDR_V4MAPPED(a)               \
+        (((a)->s6_addr32[0] == 0) &&          \
+         ((a)->s6_addr32[1] == 0) &&          \
+         ((a)->s6_addr32[2] == htonl(0x0000ffff)))
+#endif
+
 #ifdef WATT32
 #define sock_write SockWrite  /* Watt-32 uses same names */
 #define sock_read  SockRead
@@ -616,6 +626,27 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
                ret = 0;
 #endif
                break;
+       case BIO_CTRL_DGRAM_GET_FALLBACK_MTU:
+               switch (data->peer.sa.sa_family)
+                       {
+                       case AF_INET:
+                               ret = 576 - 20 - 8;
+                               break;
+#if OPENSSL_USE_IPV6
+                       case AF_INET6:
+#ifdef IN6_IS_ADDR_V4MAPPED
+                               if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr))
+                                       ret = 576 - 20 - 8;
+                               else
+#endif
+                                       ret = 1280 - 40 - 8;
+                               break;
+#endif
+                       default:
+                               ret = 576 - 20 - 8;
+                               break;
+                       }
+               break;
        case BIO_CTRL_DGRAM_GET_MTU:
                return data->mtu;
                break;
@@ -1155,7 +1186,7 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
 
                        if (!auth_data || !auth_forward)
                                {
-                               BIOerr(BIO_F_BIO_READ,BIO_R_CONNECT_ERROR);
+                               BIOerr(BIO_F_DGRAM_SCTP_READ,BIO_R_CONNECT_ERROR);
                                return -1;
                                }