bss_dgram.c: fix unaligned access
[openssl.git] / crypto / bio / bss_dgram.c
1 /*
2  * Copyright 2005-2018 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 #include <stdio.h>
11 #include <errno.h>
12
13 #include "bio_local.h"
14 #ifndef OPENSSL_NO_DGRAM
15
16 # ifndef OPENSSL_NO_SCTP
17 #  include <netinet/sctp.h>
18 #  include <fcntl.h>
19 #  define OPENSSL_SCTP_DATA_CHUNK_TYPE            0x00
20 #  define OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE 0xc0
21 # endif
22
23 # if defined(OPENSSL_SYS_LINUX) && !defined(IP_MTU)
24 #  define IP_MTU      14        /* linux is lame */
25 # endif
26
27 # if OPENSSL_USE_IPV6 && !defined(IPPROTO_IPV6)
28 #  define IPPROTO_IPV6 41       /* windows is lame */
29 # endif
30
31 # if defined(__FreeBSD__) && defined(IN6_IS_ADDR_V4MAPPED)
32 /* Standard definition causes type-punning problems. */
33 #  undef IN6_IS_ADDR_V4MAPPED
34 #  define s6_addr32 __u6_addr.__u6_addr32
35 #  define IN6_IS_ADDR_V4MAPPED(a)               \
36         (((a)->s6_addr32[0] == 0) &&          \
37          ((a)->s6_addr32[1] == 0) &&          \
38          ((a)->s6_addr32[2] == htonl(0x0000ffff)))
39 # endif
40
41 static int dgram_write(BIO *h, const char *buf, int num);
42 static int dgram_read(BIO *h, char *buf, int size);
43 static int dgram_puts(BIO *h, const char *str);
44 static long dgram_ctrl(BIO *h, int cmd, long arg1, void *arg2);
45 static int dgram_new(BIO *h);
46 static int dgram_free(BIO *data);
47 static int dgram_clear(BIO *bio);
48
49 # ifndef OPENSSL_NO_SCTP
50 static int dgram_sctp_write(BIO *h, const char *buf, int num);
51 static int dgram_sctp_read(BIO *h, char *buf, int size);
52 static int dgram_sctp_puts(BIO *h, const char *str);
53 static long dgram_sctp_ctrl(BIO *h, int cmd, long arg1, void *arg2);
54 static int dgram_sctp_new(BIO *h);
55 static int dgram_sctp_free(BIO *data);
56 static int dgram_sctp_wait_for_dry(BIO *b);
57 static int dgram_sctp_msg_waiting(BIO *b);
58 #  ifdef SCTP_AUTHENTICATION_EVENT
59 static void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification
60                                                   *snp);
61 #  endif
62 # endif
63
64 static int BIO_dgram_should_retry(int s);
65
66 static void get_current_time(struct timeval *t);
67
68 static const BIO_METHOD methods_dgramp = {
69     BIO_TYPE_DGRAM,
70     "datagram socket",
71     /* TODO: Convert to new style write function */
72     bwrite_conv,
73     dgram_write,
74     /* TODO: Convert to new style read function */
75     bread_conv,
76     dgram_read,
77     dgram_puts,
78     NULL,                       /* dgram_gets,         */
79     dgram_ctrl,
80     dgram_new,
81     dgram_free,
82     NULL,                       /* dgram_callback_ctrl */
83 };
84
85 # ifndef OPENSSL_NO_SCTP
86 static const BIO_METHOD methods_dgramp_sctp = {
87     BIO_TYPE_DGRAM_SCTP,
88     "datagram sctp socket",
89     /* TODO: Convert to new style write function */
90     bwrite_conv,
91     dgram_sctp_write,
92     /* TODO: Convert to new style write function */
93     bread_conv,
94     dgram_sctp_read,
95     dgram_sctp_puts,
96     NULL,                       /* dgram_gets,         */
97     dgram_sctp_ctrl,
98     dgram_sctp_new,
99     dgram_sctp_free,
100     NULL,                       /* dgram_callback_ctrl */
101 };
102 # endif
103
104 typedef struct bio_dgram_data_st {
105     BIO_ADDR peer;
106     unsigned int connected;
107     unsigned int _errno;
108     unsigned int mtu;
109     struct timeval next_timeout;
110     struct timeval socket_timeout;
111     unsigned int peekmode;
112 } bio_dgram_data;
113
114 # ifndef OPENSSL_NO_SCTP
115 typedef struct bio_dgram_sctp_save_message_st {
116     BIO *bio;
117     char *data;
118     int length;
119 } bio_dgram_sctp_save_message;
120
121 typedef struct bio_dgram_sctp_data_st {
122     BIO_ADDR peer;
123     unsigned int connected;
124     unsigned int _errno;
125     unsigned int mtu;
126     struct bio_dgram_sctp_sndinfo sndinfo;
127     struct bio_dgram_sctp_rcvinfo rcvinfo;
128     struct bio_dgram_sctp_prinfo prinfo;
129     BIO_dgram_sctp_notification_handler_fn handle_notifications;
130     void *notification_context;
131     int in_handshake;
132     int ccs_rcvd;
133     int ccs_sent;
134     int save_shutdown;
135     int peer_auth_tested;
136 } bio_dgram_sctp_data;
137 # endif
138
139 const BIO_METHOD *BIO_s_datagram(void)
140 {
141     return &methods_dgramp;
142 }
143
144 BIO *BIO_new_dgram(int fd, int close_flag)
145 {
146     BIO *ret;
147
148     ret = BIO_new(BIO_s_datagram());
149     if (ret == NULL)
150         return NULL;
151     BIO_set_fd(ret, fd, close_flag);
152     return ret;
153 }
154
155 static int dgram_new(BIO *bi)
156 {
157     bio_dgram_data *data = OPENSSL_zalloc(sizeof(*data));
158
159     if (data == NULL)
160         return 0;
161     bi->ptr = data;
162     return 1;
163 }
164
165 static int dgram_free(BIO *a)
166 {
167     bio_dgram_data *data;
168
169     if (a == NULL)
170         return 0;
171     if (!dgram_clear(a))
172         return 0;
173
174     data = (bio_dgram_data *)a->ptr;
175     OPENSSL_free(data);
176
177     return 1;
178 }
179
180 static int dgram_clear(BIO *a)
181 {
182     if (a == NULL)
183         return 0;
184     if (a->shutdown) {
185         if (a->init) {
186             BIO_closesocket(a->num);
187         }
188         a->init = 0;
189         a->flags = 0;
190     }
191     return 1;
192 }
193
194 static void dgram_adjust_rcv_timeout(BIO *b)
195 {
196 # if defined(SO_RCVTIMEO)
197     bio_dgram_data *data = (bio_dgram_data *)b->ptr;
198     union {
199         size_t s;
200         int i;
201     } sz = {
202         0
203     };
204
205     /* Is a timer active? */
206     if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) {
207         struct timeval timenow, timeleft;
208
209         /* Read current socket timeout */
210 #  ifdef OPENSSL_SYS_WINDOWS
211         int timeout;
212
213         sz.i = sizeof(timeout);
214         if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
215                        (void *)&timeout, &sz.i) < 0) {
216             perror("getsockopt");
217         } else {
218             data->socket_timeout.tv_sec = timeout / 1000;
219             data->socket_timeout.tv_usec = (timeout % 1000) * 1000;
220         }
221 #  else
222         sz.i = sizeof(data->socket_timeout);
223         if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
224                        &(data->socket_timeout), (void *)&sz) < 0) {
225             perror("getsockopt");
226         } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0)
227             OPENSSL_assert(sz.s <= sizeof(data->socket_timeout));
228 #  endif
229
230         /* Get current time */
231         get_current_time(&timenow);
232
233         /* Calculate time left until timer expires */
234         memcpy(&timeleft, &(data->next_timeout), sizeof(struct timeval));
235         if (timeleft.tv_usec < timenow.tv_usec) {
236             timeleft.tv_usec = 1000000 - timenow.tv_usec + timeleft.tv_usec;
237             timeleft.tv_sec--;
238         } else {
239             timeleft.tv_usec -= timenow.tv_usec;
240         }
241         if (timeleft.tv_sec < timenow.tv_sec) {
242             timeleft.tv_sec = 0;
243             timeleft.tv_usec = 1;
244         } else {
245             timeleft.tv_sec -= timenow.tv_sec;
246         }
247
248         /*
249          * Adjust socket timeout if next handshake message timer will expire
250          * earlier.
251          */
252         if ((data->socket_timeout.tv_sec == 0
253              && data->socket_timeout.tv_usec == 0)
254             || (data->socket_timeout.tv_sec > timeleft.tv_sec)
255             || (data->socket_timeout.tv_sec == timeleft.tv_sec
256                 && data->socket_timeout.tv_usec >= timeleft.tv_usec)) {
257 #  ifdef OPENSSL_SYS_WINDOWS
258             timeout = timeleft.tv_sec * 1000 + timeleft.tv_usec / 1000;
259             if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
260                            (void *)&timeout, sizeof(timeout)) < 0) {
261                 perror("setsockopt");
262             }
263 #  else
264             if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &timeleft,
265                            sizeof(struct timeval)) < 0) {
266                 perror("setsockopt");
267             }
268 #  endif
269         }
270     }
271 # endif
272 }
273
274 static void dgram_reset_rcv_timeout(BIO *b)
275 {
276 # if defined(SO_RCVTIMEO)
277     bio_dgram_data *data = (bio_dgram_data *)b->ptr;
278
279     /* Is a timer active? */
280     if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) {
281 #  ifdef OPENSSL_SYS_WINDOWS
282         int timeout = data->socket_timeout.tv_sec * 1000 +
283             data->socket_timeout.tv_usec / 1000;
284         if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
285                        (void *)&timeout, sizeof(timeout)) < 0) {
286             perror("setsockopt");
287         }
288 #  else
289         if (setsockopt
290             (b->num, SOL_SOCKET, SO_RCVTIMEO, &(data->socket_timeout),
291              sizeof(struct timeval)) < 0) {
292             perror("setsockopt");
293         }
294 #  endif
295     }
296 # endif
297 }
298
299 static int dgram_read(BIO *b, char *out, int outl)
300 {
301     int ret = 0;
302     bio_dgram_data *data = (bio_dgram_data *)b->ptr;
303     int flags = 0;
304
305     BIO_ADDR peer;
306     socklen_t len = sizeof(peer);
307
308     if (out != NULL) {
309         clear_socket_error();
310         memset(&peer, 0, sizeof(peer));
311         dgram_adjust_rcv_timeout(b);
312         if (data->peekmode)
313             flags = MSG_PEEK;
314         ret = recvfrom(b->num, out, outl, flags,
315                        BIO_ADDR_sockaddr_noconst(&peer), &len);
316
317         if (!data->connected && ret >= 0)
318             BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &peer);
319
320         BIO_clear_retry_flags(b);
321         if (ret < 0) {
322             if (BIO_dgram_should_retry(ret)) {
323                 BIO_set_retry_read(b);
324                 data->_errno = get_last_socket_error();
325             }
326         }
327
328         dgram_reset_rcv_timeout(b);
329     }
330     return ret;
331 }
332
333 static int dgram_write(BIO *b, const char *in, int inl)
334 {
335     int ret;
336     bio_dgram_data *data = (bio_dgram_data *)b->ptr;
337     clear_socket_error();
338
339     if (data->connected)
340         ret = writesocket(b->num, in, inl);
341     else {
342         int peerlen = BIO_ADDR_sockaddr_size(&data->peer);
343
344         ret = sendto(b->num, in, inl, 0,
345                      BIO_ADDR_sockaddr(&data->peer), peerlen);
346     }
347
348     BIO_clear_retry_flags(b);
349     if (ret <= 0) {
350         if (BIO_dgram_should_retry(ret)) {
351             BIO_set_retry_write(b);
352             data->_errno = get_last_socket_error();
353         }
354     }
355     return ret;
356 }
357
358 static long dgram_get_mtu_overhead(bio_dgram_data *data)
359 {
360     long ret;
361
362     switch (BIO_ADDR_family(&data->peer)) {
363     case AF_INET:
364         /*
365          * Assume this is UDP - 20 bytes for IP, 8 bytes for UDP
366          */
367         ret = 28;
368         break;
369 # if OPENSSL_USE_IPV6
370     case AF_INET6:
371         {
372 #  ifdef IN6_IS_ADDR_V4MAPPED
373             struct in6_addr tmp_addr;
374             if (BIO_ADDR_rawaddress(&data->peer, &tmp_addr, NULL)
375                 && IN6_IS_ADDR_V4MAPPED(&tmp_addr))
376                 /*
377                  * Assume this is UDP - 20 bytes for IP, 8 bytes for UDP
378                  */
379                 ret = 28;
380             else
381 #  endif
382             /*
383              * Assume this is UDP - 40 bytes for IP, 8 bytes for UDP
384              */
385             ret = 48;
386         }
387         break;
388 # endif
389     default:
390         /* We don't know. Go with the historical default */
391         ret = 28;
392         break;
393     }
394     return ret;
395 }
396
397 static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
398 {
399     long ret = 1;
400     int *ip;
401     bio_dgram_data *data = NULL;
402     int sockopt_val = 0;
403     int d_errno;
404 # if defined(OPENSSL_SYS_LINUX) && (defined(IP_MTU_DISCOVER) || defined(IP_MTU))
405     socklen_t sockopt_len;      /* assume that system supporting IP_MTU is
406                                  * modern enough to define socklen_t */
407     socklen_t addr_len;
408     BIO_ADDR addr;
409 # endif
410
411     data = (bio_dgram_data *)b->ptr;
412
413     switch (cmd) {
414     case BIO_CTRL_RESET:
415         num = 0;
416         ret = 0;
417         break;
418     case BIO_CTRL_INFO:
419         ret = 0;
420         break;
421     case BIO_C_SET_FD:
422         dgram_clear(b);
423         b->num = *((int *)ptr);
424         b->shutdown = (int)num;
425         b->init = 1;
426         break;
427     case BIO_C_GET_FD:
428         if (b->init) {
429             ip = (int *)ptr;
430             if (ip != NULL)
431                 *ip = b->num;
432             ret = b->num;
433         } else
434             ret = -1;
435         break;
436     case BIO_CTRL_GET_CLOSE:
437         ret = b->shutdown;
438         break;
439     case BIO_CTRL_SET_CLOSE:
440         b->shutdown = (int)num;
441         break;
442     case BIO_CTRL_PENDING:
443     case BIO_CTRL_WPENDING:
444         ret = 0;
445         break;
446     case BIO_CTRL_DUP:
447     case BIO_CTRL_FLUSH:
448         ret = 1;
449         break;
450     case BIO_CTRL_DGRAM_CONNECT:
451         BIO_ADDR_make(&data->peer, BIO_ADDR_sockaddr((BIO_ADDR *)ptr));
452         break;
453         /* (Linux)kernel sets DF bit on outgoing IP packets */
454     case BIO_CTRL_DGRAM_MTU_DISCOVER:
455 # if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO)
456         addr_len = (socklen_t) sizeof(addr);
457         memset(&addr, 0, sizeof(addr));
458         if (getsockname(b->num, &addr.sa, &addr_len) < 0) {
459             ret = 0;
460             break;
461         }
462         switch (addr.sa.sa_family) {
463         case AF_INET:
464             sockopt_val = IP_PMTUDISC_DO;
465             if ((ret = setsockopt(b->num, IPPROTO_IP, IP_MTU_DISCOVER,
466                                   &sockopt_val, sizeof(sockopt_val))) < 0)
467                 perror("setsockopt");
468             break;
469 #  if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO)
470         case AF_INET6:
471             sockopt_val = IPV6_PMTUDISC_DO;
472             if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
473                                   &sockopt_val, sizeof(sockopt_val))) < 0)
474                 perror("setsockopt");
475             break;
476 #  endif
477         default:
478             ret = -1;
479             break;
480         }
481 # else
482         ret = -1;
483 # endif
484         break;
485     case BIO_CTRL_DGRAM_QUERY_MTU:
486 # if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU)
487         addr_len = (socklen_t) sizeof(addr);
488         memset(&addr, 0, sizeof(addr));
489         if (getsockname(b->num, &addr.sa, &addr_len) < 0) {
490             ret = 0;
491             break;
492         }
493         sockopt_len = sizeof(sockopt_val);
494         switch (addr.sa.sa_family) {
495         case AF_INET:
496             if ((ret =
497                  getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val,
498                             &sockopt_len)) < 0 || sockopt_val < 0) {
499                 ret = 0;
500             } else {
501                 /*
502                  * we assume that the transport protocol is UDP and no IP
503                  * options are used.
504                  */
505                 data->mtu = sockopt_val - 8 - 20;
506                 ret = data->mtu;
507             }
508             break;
509 #  if OPENSSL_USE_IPV6 && defined(IPV6_MTU)
510         case AF_INET6:
511             if ((ret =
512                  getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU,
513                             (void *)&sockopt_val, &sockopt_len)) < 0
514                 || sockopt_val < 0) {
515                 ret = 0;
516             } else {
517                 /*
518                  * we assume that the transport protocol is UDP and no IPV6
519                  * options are used.
520                  */
521                 data->mtu = sockopt_val - 8 - 40;
522                 ret = data->mtu;
523             }
524             break;
525 #  endif
526         default:
527             ret = 0;
528             break;
529         }
530 # else
531         ret = 0;
532 # endif
533         break;
534     case BIO_CTRL_DGRAM_GET_FALLBACK_MTU:
535         ret = -dgram_get_mtu_overhead(data);
536         switch (BIO_ADDR_family(&data->peer)) {
537         case AF_INET:
538             ret += 576;
539             break;
540 # if OPENSSL_USE_IPV6
541         case AF_INET6:
542             {
543 #  ifdef IN6_IS_ADDR_V4MAPPED
544                 struct in6_addr tmp_addr;
545                 if (BIO_ADDR_rawaddress(&data->peer, &tmp_addr, NULL)
546                     && IN6_IS_ADDR_V4MAPPED(&tmp_addr))
547                     ret += 576;
548                 else
549 #  endif
550                     ret += 1280;
551             }
552             break;
553 # endif
554         default:
555             ret += 576;
556             break;
557         }
558         break;
559     case BIO_CTRL_DGRAM_GET_MTU:
560         return data->mtu;
561     case BIO_CTRL_DGRAM_SET_MTU:
562         data->mtu = num;
563         ret = num;
564         break;
565     case BIO_CTRL_DGRAM_SET_CONNECTED:
566         if (ptr != NULL) {
567             data->connected = 1;
568             BIO_ADDR_make(&data->peer, BIO_ADDR_sockaddr((BIO_ADDR *)ptr));
569         } else {
570             data->connected = 0;
571             memset(&data->peer, 0, sizeof(data->peer));
572         }
573         break;
574     case BIO_CTRL_DGRAM_GET_PEER:
575         ret = BIO_ADDR_sockaddr_size(&data->peer);
576         /* FIXME: if num < ret, we will only return part of an address.
577            That should bee an error, no? */
578         if (num == 0 || num > ret)
579             num = ret;
580         memcpy(ptr, &data->peer, (ret = num));
581         break;
582     case BIO_CTRL_DGRAM_SET_PEER:
583         BIO_ADDR_make(&data->peer, BIO_ADDR_sockaddr((BIO_ADDR *)ptr));
584         break;
585     case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT:
586         memcpy(&(data->next_timeout), ptr, sizeof(struct timeval));
587         break;
588 # if defined(SO_RCVTIMEO)
589     case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT:
590 #  ifdef OPENSSL_SYS_WINDOWS
591         {
592             struct timeval *tv = (struct timeval *)ptr;
593             int timeout = tv->tv_sec * 1000 + tv->tv_usec / 1000;
594             if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
595                            (void *)&timeout, sizeof(timeout)) < 0) {
596                 perror("setsockopt");
597                 ret = -1;
598             }
599         }
600 #  else
601         if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr,
602                        sizeof(struct timeval)) < 0) {
603             perror("setsockopt");
604             ret = -1;
605         }
606 #  endif
607         break;
608     case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
609         {
610             union {
611                 size_t s;
612                 int i;
613             } sz = {
614                 0
615             };
616 #  ifdef OPENSSL_SYS_WINDOWS
617             int timeout;
618             struct timeval *tv = (struct timeval *)ptr;
619
620             sz.i = sizeof(timeout);
621             if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
622                            (void *)&timeout, &sz.i) < 0) {
623                 perror("getsockopt");
624                 ret = -1;
625             } else {
626                 tv->tv_sec = timeout / 1000;
627                 tv->tv_usec = (timeout % 1000) * 1000;
628                 ret = sizeof(*tv);
629             }
630 #  else
631             sz.i = sizeof(struct timeval);
632             if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
633                            ptr, (void *)&sz) < 0) {
634                 perror("getsockopt");
635                 ret = -1;
636             } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0) {
637                 OPENSSL_assert(sz.s <= sizeof(struct timeval));
638                 ret = (int)sz.s;
639             } else
640                 ret = sz.i;
641 #  endif
642         }
643         break;
644 # endif
645 # if defined(SO_SNDTIMEO)
646     case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT:
647 #  ifdef OPENSSL_SYS_WINDOWS
648         {
649             struct timeval *tv = (struct timeval *)ptr;
650             int timeout = tv->tv_sec * 1000 + tv->tv_usec / 1000;
651             if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
652                            (void *)&timeout, sizeof(timeout)) < 0) {
653                 perror("setsockopt");
654                 ret = -1;
655             }
656         }
657 #  else
658         if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr,
659                        sizeof(struct timeval)) < 0) {
660             perror("setsockopt");
661             ret = -1;
662         }
663 #  endif
664         break;
665     case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
666         {
667             union {
668                 size_t s;
669                 int i;
670             } sz = {
671                 0
672             };
673 #  ifdef OPENSSL_SYS_WINDOWS
674             int timeout;
675             struct timeval *tv = (struct timeval *)ptr;
676
677             sz.i = sizeof(timeout);
678             if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
679                            (void *)&timeout, &sz.i) < 0) {
680                 perror("getsockopt");
681                 ret = -1;
682             } else {
683                 tv->tv_sec = timeout / 1000;
684                 tv->tv_usec = (timeout % 1000) * 1000;
685                 ret = sizeof(*tv);
686             }
687 #  else
688             sz.i = sizeof(struct timeval);
689             if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
690                            ptr, (void *)&sz) < 0) {
691                 perror("getsockopt");
692                 ret = -1;
693             } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0) {
694                 OPENSSL_assert(sz.s <= sizeof(struct timeval));
695                 ret = (int)sz.s;
696             } else
697                 ret = sz.i;
698 #  endif
699         }
700         break;
701 # endif
702     case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP:
703         /* fall-through */
704     case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP:
705 # ifdef OPENSSL_SYS_WINDOWS
706         d_errno = (data->_errno == WSAETIMEDOUT);
707 # else
708         d_errno = (data->_errno == EAGAIN);
709 # endif
710         if (d_errno) {
711             ret = 1;
712             data->_errno = 0;
713         } else
714             ret = 0;
715         break;
716 # ifdef EMSGSIZE
717     case BIO_CTRL_DGRAM_MTU_EXCEEDED:
718         if (data->_errno == EMSGSIZE) {
719             ret = 1;
720             data->_errno = 0;
721         } else
722             ret = 0;
723         break;
724 # endif
725     case BIO_CTRL_DGRAM_SET_DONT_FRAG:
726         sockopt_val = num ? 1 : 0;
727
728         switch (data->peer.sa.sa_family) {
729         case AF_INET:
730 # if defined(IP_DONTFRAG)
731             if ((ret = setsockopt(b->num, IPPROTO_IP, IP_DONTFRAG,
732                                   &sockopt_val, sizeof(sockopt_val))) < 0) {
733                 perror("setsockopt");
734                 ret = -1;
735             }
736 # elif defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined (IP_PMTUDISC_PROBE)
737             if ((sockopt_val = num ? IP_PMTUDISC_PROBE : IP_PMTUDISC_DONT),
738                 (ret = setsockopt(b->num, IPPROTO_IP, IP_MTU_DISCOVER,
739                                   &sockopt_val, sizeof(sockopt_val))) < 0) {
740                 perror("setsockopt");
741                 ret = -1;
742             }
743 # elif defined(OPENSSL_SYS_WINDOWS) && defined(IP_DONTFRAGMENT)
744             if ((ret = setsockopt(b->num, IPPROTO_IP, IP_DONTFRAGMENT,
745                                   (const char *)&sockopt_val,
746                                   sizeof(sockopt_val))) < 0) {
747                 perror("setsockopt");
748                 ret = -1;
749             }
750 # else
751             ret = -1;
752 # endif
753             break;
754 # if OPENSSL_USE_IPV6
755         case AF_INET6:
756 #  if defined(IPV6_DONTFRAG)
757             if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_DONTFRAG,
758                                   (const void *)&sockopt_val,
759                                   sizeof(sockopt_val))) < 0) {
760                 perror("setsockopt");
761                 ret = -1;
762             }
763 #  elif defined(OPENSSL_SYS_LINUX) && defined(IPV6_MTUDISCOVER)
764             if ((sockopt_val = num ? IP_PMTUDISC_PROBE : IP_PMTUDISC_DONT),
765                 (ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
766                                   &sockopt_val, sizeof(sockopt_val))) < 0) {
767                 perror("setsockopt");
768                 ret = -1;
769             }
770 #  else
771             ret = -1;
772 #  endif
773             break;
774 # endif
775         default:
776             ret = -1;
777             break;
778         }
779         break;
780     case BIO_CTRL_DGRAM_GET_MTU_OVERHEAD:
781         ret = dgram_get_mtu_overhead(data);
782         break;
783
784     /*
785      * BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE is used here for compatibility
786      * reasons. When BIO_CTRL_DGRAM_SET_PEEK_MODE was first defined its value
787      * was incorrectly clashing with BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE. The
788      * value has been updated to a non-clashing value. However to preserve
789      * binary compatibility we now respond to both the old value and the new one
790      */
791     case BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE:
792     case BIO_CTRL_DGRAM_SET_PEEK_MODE:
793         data->peekmode = (unsigned int)num;
794         break;
795     default:
796         ret = 0;
797         break;
798     }
799     return ret;
800 }
801
802 static int dgram_puts(BIO *bp, const char *str)
803 {
804     int n, ret;
805
806     n = strlen(str);
807     ret = dgram_write(bp, str, n);
808     return ret;
809 }
810
811 # ifndef OPENSSL_NO_SCTP
812 const BIO_METHOD *BIO_s_datagram_sctp(void)
813 {
814     return &methods_dgramp_sctp;
815 }
816
817 BIO *BIO_new_dgram_sctp(int fd, int close_flag)
818 {
819     BIO *bio;
820     int ret, optval = 20000;
821     int auth_data = 0, auth_forward = 0;
822     unsigned char *p;
823     struct sctp_authchunk auth;
824     struct sctp_authchunks *authchunks;
825     socklen_t sockopt_len;
826 #  ifdef SCTP_AUTHENTICATION_EVENT
827 #   ifdef SCTP_EVENT
828     struct sctp_event event;
829 #   else
830     struct sctp_event_subscribe event;
831 #   endif
832 #  endif
833
834     bio = BIO_new(BIO_s_datagram_sctp());
835     if (bio == NULL)
836         return NULL;
837     BIO_set_fd(bio, fd, close_flag);
838
839     /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */
840     auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE;
841     ret =
842         setsockopt(fd, IPPROTO_SCTP, SCTP_AUTH_CHUNK, &auth,
843                    sizeof(struct sctp_authchunk));
844     if (ret < 0) {
845         BIO_vfree(bio);
846         BIOerr(BIO_F_BIO_NEW_DGRAM_SCTP, ERR_R_SYS_LIB);
847         ERR_add_error_data(1, "Ensure SCTP AUTH chunks are enabled in kernel");
848         return NULL;
849     }
850     auth.sauth_chunk = OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE;
851     ret =
852         setsockopt(fd, IPPROTO_SCTP, SCTP_AUTH_CHUNK, &auth,
853                    sizeof(struct sctp_authchunk));
854     if (ret < 0) {
855         BIO_vfree(bio);
856         BIOerr(BIO_F_BIO_NEW_DGRAM_SCTP, ERR_R_SYS_LIB);
857         ERR_add_error_data(1, "Ensure SCTP AUTH chunks are enabled in kernel");
858         return NULL;
859     }
860
861     /*
862      * Test if activation was successful. When using accept(), SCTP-AUTH has
863      * to be activated for the listening socket already, otherwise the
864      * connected socket won't use it. Similarly with connect(): the socket
865      * prior to connection must be activated for SCTP-AUTH
866      */
867     sockopt_len = (socklen_t) (sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t));
868     authchunks = OPENSSL_zalloc(sockopt_len);
869     if (authchunks == NULL) {
870         BIO_vfree(bio);
871         return NULL;
872     }
873     ret = getsockopt(fd, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, authchunks,
874                    &sockopt_len);
875     if (ret < 0) {
876         OPENSSL_free(authchunks);
877         BIO_vfree(bio);
878         return NULL;
879     }
880
881     for (p = (unsigned char *)authchunks->gauth_chunks;
882          p < (unsigned char *)authchunks + sockopt_len;
883          p += sizeof(uint8_t)) {
884         if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE)
885             auth_data = 1;
886         if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE)
887             auth_forward = 1;
888     }
889
890     OPENSSL_free(authchunks);
891
892     if (!auth_data || !auth_forward) {
893         BIO_vfree(bio);
894         BIOerr(BIO_F_BIO_NEW_DGRAM_SCTP, ERR_R_SYS_LIB);
895         ERR_add_error_data(1,
896                            "Ensure SCTP AUTH chunks are enabled on the "
897                            "underlying socket");
898         return NULL;
899     }
900
901 #  ifdef SCTP_AUTHENTICATION_EVENT
902 #   ifdef SCTP_EVENT
903     memset(&event, 0, sizeof(event));
904     event.se_assoc_id = 0;
905     event.se_type = SCTP_AUTHENTICATION_EVENT;
906     event.se_on = 1;
907     ret =
908         setsockopt(fd, IPPROTO_SCTP, SCTP_EVENT, &event,
909                    sizeof(struct sctp_event));
910     if (ret < 0) {
911         BIO_vfree(bio);
912         return NULL;
913     }
914 #   else
915     sockopt_len = (socklen_t) sizeof(struct sctp_event_subscribe);
916     ret = getsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, &sockopt_len);
917     if (ret < 0) {
918         BIO_vfree(bio);
919         return NULL;
920     }
921
922     event.sctp_authentication_event = 1;
923
924     ret =
925         setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event,
926                    sizeof(struct sctp_event_subscribe));
927     if (ret < 0) {
928         BIO_vfree(bio);
929         return NULL;
930     }
931 #   endif
932 #  endif
933
934     /*
935      * Disable partial delivery by setting the min size larger than the max
936      * record size of 2^14 + 2048 + 13
937      */
938     ret =
939         setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval,
940                    sizeof(optval));
941     if (ret < 0) {
942         BIO_vfree(bio);
943         return NULL;
944     }
945
946     return bio;
947 }
948
949 int BIO_dgram_is_sctp(BIO *bio)
950 {
951     return (BIO_method_type(bio) == BIO_TYPE_DGRAM_SCTP);
952 }
953
954 static int dgram_sctp_new(BIO *bi)
955 {
956     bio_dgram_sctp_data *data = NULL;
957
958     bi->init = 0;
959     bi->num = 0;
960     if ((data = OPENSSL_zalloc(sizeof(*data))) == NULL) {
961         BIOerr(BIO_F_DGRAM_SCTP_NEW, ERR_R_MALLOC_FAILURE);
962         return 0;
963     }
964 #  ifdef SCTP_PR_SCTP_NONE
965     data->prinfo.pr_policy = SCTP_PR_SCTP_NONE;
966 #  endif
967     bi->ptr = data;
968
969     bi->flags = 0;
970     return 1;
971 }
972
973 static int dgram_sctp_free(BIO *a)
974 {
975     bio_dgram_sctp_data *data;
976
977     if (a == NULL)
978         return 0;
979     if (!dgram_clear(a))
980         return 0;
981
982     data = (bio_dgram_sctp_data *) a->ptr;
983     if (data != NULL)
984         OPENSSL_free(data);
985
986     return 1;
987 }
988
989 #  ifdef SCTP_AUTHENTICATION_EVENT
990 void dgram_sctp_handle_auth_free_key_event(BIO *b,
991                                            union sctp_notification *snp)
992 {
993     int ret;
994     struct sctp_authkey_event *authkeyevent = &snp->sn_auth_event;
995
996     if (authkeyevent->auth_indication == SCTP_AUTH_FREE_KEY) {
997         struct sctp_authkeyid authkeyid;
998
999         /* delete key */
1000         authkeyid.scact_keynumber = authkeyevent->auth_keynumber;
1001         ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY,
1002                          &authkeyid, sizeof(struct sctp_authkeyid));
1003     }
1004 }
1005 #  endif
1006
1007 static int dgram_sctp_read(BIO *b, char *out, int outl)
1008 {
1009     int ret = 0, n = 0, i, optval;
1010     socklen_t optlen;
1011     bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
1012     struct msghdr msg;
1013     struct iovec iov;
1014     struct cmsghdr *cmsg;
1015     char cmsgbuf[512];
1016
1017     if (out != NULL) {
1018         clear_socket_error();
1019
1020         do {
1021             memset(&data->rcvinfo, 0, sizeof(data->rcvinfo));
1022             iov.iov_base = out;
1023             iov.iov_len = outl;
1024             msg.msg_name = NULL;
1025             msg.msg_namelen = 0;
1026             msg.msg_iov = &iov;
1027             msg.msg_iovlen = 1;
1028             msg.msg_control = cmsgbuf;
1029             msg.msg_controllen = 512;
1030             msg.msg_flags = 0;
1031             n = recvmsg(b->num, &msg, 0);
1032
1033             if (n <= 0) {
1034                 if (n < 0)
1035                     ret = n;
1036                 break;
1037             }
1038
1039             if (msg.msg_controllen > 0) {
1040                 for (cmsg = CMSG_FIRSTHDR(&msg); cmsg;
1041                      cmsg = CMSG_NXTHDR(&msg, cmsg)) {
1042                     if (cmsg->cmsg_level != IPPROTO_SCTP)
1043                         continue;
1044 #  ifdef SCTP_RCVINFO
1045                     if (cmsg->cmsg_type == SCTP_RCVINFO) {
1046                         struct sctp_rcvinfo *rcvinfo;
1047
1048                         rcvinfo = (struct sctp_rcvinfo *)CMSG_DATA(cmsg);
1049                         data->rcvinfo.rcv_sid = rcvinfo->rcv_sid;
1050                         data->rcvinfo.rcv_ssn = rcvinfo->rcv_ssn;
1051                         data->rcvinfo.rcv_flags = rcvinfo->rcv_flags;
1052                         data->rcvinfo.rcv_ppid = rcvinfo->rcv_ppid;
1053                         data->rcvinfo.rcv_tsn = rcvinfo->rcv_tsn;
1054                         data->rcvinfo.rcv_cumtsn = rcvinfo->rcv_cumtsn;
1055                         data->rcvinfo.rcv_context = rcvinfo->rcv_context;
1056                     }
1057 #  endif
1058 #  ifdef SCTP_SNDRCV
1059                     if (cmsg->cmsg_type == SCTP_SNDRCV) {
1060                         struct sctp_sndrcvinfo *sndrcvinfo;
1061
1062                         sndrcvinfo =
1063                             (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
1064                         data->rcvinfo.rcv_sid = sndrcvinfo->sinfo_stream;
1065                         data->rcvinfo.rcv_ssn = sndrcvinfo->sinfo_ssn;
1066                         data->rcvinfo.rcv_flags = sndrcvinfo->sinfo_flags;
1067                         data->rcvinfo.rcv_ppid = sndrcvinfo->sinfo_ppid;
1068                         data->rcvinfo.rcv_tsn = sndrcvinfo->sinfo_tsn;
1069                         data->rcvinfo.rcv_cumtsn = sndrcvinfo->sinfo_cumtsn;
1070                         data->rcvinfo.rcv_context = sndrcvinfo->sinfo_context;
1071                     }
1072 #  endif
1073                 }
1074             }
1075
1076             if (msg.msg_flags & MSG_NOTIFICATION) {
1077                 union sctp_notification snp;
1078
1079                 memcpy(&snp, out, sizeof(snp));
1080                 if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) {
1081 #  ifdef SCTP_EVENT
1082                     struct sctp_event event;
1083 #  else
1084                     struct sctp_event_subscribe event;
1085                     socklen_t eventsize;
1086 #  endif
1087
1088                     /* disable sender dry event */
1089 #  ifdef SCTP_EVENT
1090                     memset(&event, 0, sizeof(event));
1091                     event.se_assoc_id = 0;
1092                     event.se_type = SCTP_SENDER_DRY_EVENT;
1093                     event.se_on = 0;
1094                     i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENT, &event,
1095                                    sizeof(struct sctp_event));
1096                     if (i < 0) {
1097                         ret = i;
1098                         break;
1099                     }
1100 #  else
1101                     eventsize = sizeof(struct sctp_event_subscribe);
1102                     i = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event,
1103                                    &eventsize);
1104                     if (i < 0) {
1105                         ret = i;
1106                         break;
1107                     }
1108
1109                     event.sctp_sender_dry_event = 0;
1110
1111                     i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event,
1112                                    sizeof(struct sctp_event_subscribe));
1113                     if (i < 0) {
1114                         ret = i;
1115                         break;
1116                     }
1117 #  endif
1118                 }
1119 #  ifdef SCTP_AUTHENTICATION_EVENT
1120                 if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
1121                     dgram_sctp_handle_auth_free_key_event(b, &snp);
1122 #  endif
1123
1124                 if (data->handle_notifications != NULL)
1125                     data->handle_notifications(b, data->notification_context,
1126                                                (void *)out);
1127
1128                 memset(&snp, 0, sizeof(snp));
1129                 memset(out, 0, outl);
1130             } else {
1131                 ret += n;
1132             }
1133         }
1134         while ((msg.msg_flags & MSG_NOTIFICATION) && (msg.msg_flags & MSG_EOR)
1135                && (ret < outl));
1136
1137         if (ret > 0 && !(msg.msg_flags & MSG_EOR)) {
1138             /* Partial message read, this should never happen! */
1139
1140             /*
1141              * The buffer was too small, this means the peer sent a message
1142              * that was larger than allowed.
1143              */
1144             if (ret == outl)
1145                 return -1;
1146
1147             /*
1148              * Test if socket buffer can handle max record size (2^14 + 2048
1149              * + 13)
1150              */
1151             optlen = (socklen_t) sizeof(int);
1152             ret = getsockopt(b->num, SOL_SOCKET, SO_RCVBUF, &optval, &optlen);
1153             if (ret >= 0)
1154                 OPENSSL_assert(optval >= 18445);
1155
1156             /*
1157              * Test if SCTP doesn't partially deliver below max record size
1158              * (2^14 + 2048 + 13)
1159              */
1160             optlen = (socklen_t) sizeof(int);
1161             ret =
1162                 getsockopt(b->num, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT,
1163                            &optval, &optlen);
1164             if (ret >= 0)
1165                 OPENSSL_assert(optval >= 18445);
1166
1167             /*
1168              * Partially delivered notification??? Probably a bug....
1169              */
1170             OPENSSL_assert(!(msg.msg_flags & MSG_NOTIFICATION));
1171
1172             /*
1173              * Everything seems ok till now, so it's most likely a message
1174              * dropped by PR-SCTP.
1175              */
1176             memset(out, 0, outl);
1177             BIO_set_retry_read(b);
1178             return -1;
1179         }
1180
1181         BIO_clear_retry_flags(b);
1182         if (ret < 0) {
1183             if (BIO_dgram_should_retry(ret)) {
1184                 BIO_set_retry_read(b);
1185                 data->_errno = get_last_socket_error();
1186             }
1187         }
1188
1189         /* Test if peer uses SCTP-AUTH before continuing */
1190         if (!data->peer_auth_tested) {
1191             int ii, auth_data = 0, auth_forward = 0;
1192             unsigned char *p;
1193             struct sctp_authchunks *authchunks;
1194
1195             optlen =
1196                 (socklen_t) (sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t));
1197             authchunks = OPENSSL_malloc(optlen);
1198             if (authchunks == NULL) {
1199                 BIOerr(BIO_F_DGRAM_SCTP_READ, ERR_R_MALLOC_FAILURE);
1200                 return -1;
1201             }
1202             memset(authchunks, 0, optlen);
1203             ii = getsockopt(b->num, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS,
1204                             authchunks, &optlen);
1205
1206             if (ii >= 0)
1207                 for (p = (unsigned char *)authchunks->gauth_chunks;
1208                      p < (unsigned char *)authchunks + optlen;
1209                      p += sizeof(uint8_t)) {
1210                     if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE)
1211                         auth_data = 1;
1212                     if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE)
1213                         auth_forward = 1;
1214                 }
1215
1216             OPENSSL_free(authchunks);
1217
1218             if (!auth_data || !auth_forward) {
1219                 BIOerr(BIO_F_DGRAM_SCTP_READ, BIO_R_CONNECT_ERROR);
1220                 return -1;
1221             }
1222
1223             data->peer_auth_tested = 1;
1224         }
1225     }
1226     return ret;
1227 }
1228
1229 /*
1230  * dgram_sctp_write - send message on SCTP socket
1231  * @b: BIO to write to
1232  * @in: data to send
1233  * @inl: amount of bytes in @in to send
1234  *
1235  * Returns -1 on error or the sent amount of bytes on success
1236  */
1237 static int dgram_sctp_write(BIO *b, const char *in, int inl)
1238 {
1239     int ret;
1240     bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
1241     struct bio_dgram_sctp_sndinfo *sinfo = &(data->sndinfo);
1242     struct bio_dgram_sctp_prinfo *pinfo = &(data->prinfo);
1243     struct bio_dgram_sctp_sndinfo handshake_sinfo;
1244     struct iovec iov[1];
1245     struct msghdr msg;
1246     struct cmsghdr *cmsg;
1247 #  if defined(SCTP_SNDINFO) && defined(SCTP_PRINFO)
1248     char cmsgbuf[CMSG_SPACE(sizeof(struct sctp_sndinfo)) +
1249                  CMSG_SPACE(sizeof(struct sctp_prinfo))];
1250     struct sctp_sndinfo *sndinfo;
1251     struct sctp_prinfo *prinfo;
1252 #  else
1253     char cmsgbuf[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
1254     struct sctp_sndrcvinfo *sndrcvinfo;
1255 #  endif
1256
1257     clear_socket_error();
1258
1259     /*
1260      * If we're send anything else than application data, disable all user
1261      * parameters and flags.
1262      */
1263     if (in[0] != 23) {
1264         memset(&handshake_sinfo, 0, sizeof(handshake_sinfo));
1265 #  ifdef SCTP_SACK_IMMEDIATELY
1266         handshake_sinfo.snd_flags = SCTP_SACK_IMMEDIATELY;
1267 #  endif
1268         sinfo = &handshake_sinfo;
1269     }
1270
1271     /* We can only send a shutdown alert if the socket is dry */
1272     if (data->save_shutdown) {
1273         ret = BIO_dgram_sctp_wait_for_dry(b);
1274         if (ret < 0)
1275             return -1;
1276         if (ret == 0) {
1277             BIO_clear_retry_flags(b);
1278             BIO_set_retry_write(b);
1279             return -1;
1280         }
1281     }
1282
1283     iov[0].iov_base = (char *)in;
1284     iov[0].iov_len = inl;
1285     msg.msg_name = NULL;
1286     msg.msg_namelen = 0;
1287     msg.msg_iov = iov;
1288     msg.msg_iovlen = 1;
1289     msg.msg_control = (caddr_t) cmsgbuf;
1290     msg.msg_controllen = 0;
1291     msg.msg_flags = 0;
1292 #  if defined(SCTP_SNDINFO) && defined(SCTP_PRINFO)
1293     cmsg = (struct cmsghdr *)cmsgbuf;
1294     cmsg->cmsg_level = IPPROTO_SCTP;
1295     cmsg->cmsg_type = SCTP_SNDINFO;
1296     cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndinfo));
1297     sndinfo = (struct sctp_sndinfo *)CMSG_DATA(cmsg);
1298     memset(sndinfo, 0, sizeof(*sndinfo));
1299     sndinfo->snd_sid = sinfo->snd_sid;
1300     sndinfo->snd_flags = sinfo->snd_flags;
1301     sndinfo->snd_ppid = sinfo->snd_ppid;
1302     sndinfo->snd_context = sinfo->snd_context;
1303     msg.msg_controllen += CMSG_SPACE(sizeof(struct sctp_sndinfo));
1304
1305     cmsg =
1306         (struct cmsghdr *)&cmsgbuf[CMSG_SPACE(sizeof(struct sctp_sndinfo))];
1307     cmsg->cmsg_level = IPPROTO_SCTP;
1308     cmsg->cmsg_type = SCTP_PRINFO;
1309     cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_prinfo));
1310     prinfo = (struct sctp_prinfo *)CMSG_DATA(cmsg);
1311     memset(prinfo, 0, sizeof(*prinfo));
1312     prinfo->pr_policy = pinfo->pr_policy;
1313     prinfo->pr_value = pinfo->pr_value;
1314     msg.msg_controllen += CMSG_SPACE(sizeof(struct sctp_prinfo));
1315 #  else
1316     cmsg = (struct cmsghdr *)cmsgbuf;
1317     cmsg->cmsg_level = IPPROTO_SCTP;
1318     cmsg->cmsg_type = SCTP_SNDRCV;
1319     cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
1320     sndrcvinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
1321     memset(sndrcvinfo, 0, sizeof(*sndrcvinfo));
1322     sndrcvinfo->sinfo_stream = sinfo->snd_sid;
1323     sndrcvinfo->sinfo_flags = sinfo->snd_flags;
1324 #   ifdef __FreeBSD__
1325     sndrcvinfo->sinfo_flags |= pinfo->pr_policy;
1326 #   endif
1327     sndrcvinfo->sinfo_ppid = sinfo->snd_ppid;
1328     sndrcvinfo->sinfo_context = sinfo->snd_context;
1329     sndrcvinfo->sinfo_timetolive = pinfo->pr_value;
1330     msg.msg_controllen += CMSG_SPACE(sizeof(struct sctp_sndrcvinfo));
1331 #  endif
1332
1333     ret = sendmsg(b->num, &msg, 0);
1334
1335     BIO_clear_retry_flags(b);
1336     if (ret <= 0) {
1337         if (BIO_dgram_should_retry(ret)) {
1338             BIO_set_retry_write(b);
1339             data->_errno = get_last_socket_error();
1340         }
1341     }
1342     return ret;
1343 }
1344
1345 static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1346 {
1347     long ret = 1;
1348     bio_dgram_sctp_data *data = NULL;
1349     socklen_t sockopt_len = 0;
1350     struct sctp_authkeyid authkeyid;
1351     struct sctp_authkey *authkey = NULL;
1352
1353     data = (bio_dgram_sctp_data *) b->ptr;
1354
1355     switch (cmd) {
1356     case BIO_CTRL_DGRAM_QUERY_MTU:
1357         /*
1358          * Set to maximum (2^14) and ignore user input to enable transport
1359          * protocol fragmentation. Returns always 2^14.
1360          */
1361         data->mtu = 16384;
1362         ret = data->mtu;
1363         break;
1364     case BIO_CTRL_DGRAM_SET_MTU:
1365         /*
1366          * Set to maximum (2^14) and ignore input to enable transport
1367          * protocol fragmentation. Returns always 2^14.
1368          */
1369         data->mtu = 16384;
1370         ret = data->mtu;
1371         break;
1372     case BIO_CTRL_DGRAM_SET_CONNECTED:
1373     case BIO_CTRL_DGRAM_CONNECT:
1374         /* Returns always -1. */
1375         ret = -1;
1376         break;
1377     case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT:
1378         /*
1379          * SCTP doesn't need the DTLS timer Returns always 1.
1380          */
1381         break;
1382     case BIO_CTRL_DGRAM_GET_MTU_OVERHEAD:
1383         /*
1384          * We allow transport protocol fragmentation so this is irrelevant
1385          */
1386         ret = 0;
1387         break;
1388     case BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE:
1389         if (num > 0)
1390             data->in_handshake = 1;
1391         else
1392             data->in_handshake = 0;
1393
1394         ret =
1395             setsockopt(b->num, IPPROTO_SCTP, SCTP_NODELAY,
1396                        &data->in_handshake, sizeof(int));
1397         break;
1398     case BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY:
1399         /*
1400          * New shared key for SCTP AUTH. Returns 0 on success, -1 otherwise.
1401          */
1402
1403         /* Get active key */
1404         sockopt_len = sizeof(struct sctp_authkeyid);
1405         ret =
1406             getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid,
1407                        &sockopt_len);
1408         if (ret < 0)
1409             break;
1410
1411         /* Add new key */
1412         sockopt_len = sizeof(struct sctp_authkey) + 64 * sizeof(uint8_t);
1413         authkey = OPENSSL_malloc(sockopt_len);
1414         if (authkey == NULL) {
1415             ret = -1;
1416             break;
1417         }
1418         memset(authkey, 0, sockopt_len);
1419         authkey->sca_keynumber = authkeyid.scact_keynumber + 1;
1420 #  ifndef __FreeBSD__
1421         /*
1422          * This field is missing in FreeBSD 8.2 and earlier, and FreeBSD 8.3
1423          * and higher work without it.
1424          */
1425         authkey->sca_keylength = 64;
1426 #  endif
1427         memcpy(&authkey->sca_key[0], ptr, 64 * sizeof(uint8_t));
1428
1429         ret =
1430             setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_KEY, authkey,
1431                        sockopt_len);
1432         OPENSSL_free(authkey);
1433         authkey = NULL;
1434         if (ret < 0)
1435             break;
1436
1437         /* Reset active key */
1438         ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY,
1439                          &authkeyid, sizeof(struct sctp_authkeyid));
1440         if (ret < 0)
1441             break;
1442
1443         break;
1444     case BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY:
1445         /* Returns 0 on success, -1 otherwise. */
1446
1447         /* Get active key */
1448         sockopt_len = sizeof(struct sctp_authkeyid);
1449         ret =
1450             getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid,
1451                        &sockopt_len);
1452         if (ret < 0)
1453             break;
1454
1455         /* Set active key */
1456         authkeyid.scact_keynumber = authkeyid.scact_keynumber + 1;
1457         ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY,
1458                          &authkeyid, sizeof(struct sctp_authkeyid));
1459         if (ret < 0)
1460             break;
1461
1462         /*
1463          * CCS has been sent, so remember that and fall through to check if
1464          * we need to deactivate an old key
1465          */
1466         data->ccs_sent = 1;
1467         /* fall-through */
1468
1469     case BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD:
1470         /* Returns 0 on success, -1 otherwise. */
1471
1472         /*
1473          * Has this command really been called or is this just a
1474          * fall-through?
1475          */
1476         if (cmd == BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD)
1477             data->ccs_rcvd = 1;
1478
1479         /*
1480          * CSS has been both, received and sent, so deactivate an old key
1481          */
1482         if (data->ccs_rcvd == 1 && data->ccs_sent == 1) {
1483             /* Get active key */
1484             sockopt_len = sizeof(struct sctp_authkeyid);
1485             ret =
1486                 getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY,
1487                            &authkeyid, &sockopt_len);
1488             if (ret < 0)
1489                 break;
1490
1491             /*
1492              * Deactivate key or delete second last key if
1493              * SCTP_AUTHENTICATION_EVENT is not available.
1494              */
1495             authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1;
1496 #  ifdef SCTP_AUTH_DEACTIVATE_KEY
1497             sockopt_len = sizeof(struct sctp_authkeyid);
1498             ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY,
1499                              &authkeyid, sockopt_len);
1500             if (ret < 0)
1501                 break;
1502 #  endif
1503 #  ifndef SCTP_AUTHENTICATION_EVENT
1504             if (authkeyid.scact_keynumber > 0) {
1505                 authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1;
1506                 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY,
1507                                  &authkeyid, sizeof(struct sctp_authkeyid));
1508                 if (ret < 0)
1509                     break;
1510             }
1511 #  endif
1512
1513             data->ccs_rcvd = 0;
1514             data->ccs_sent = 0;
1515         }
1516         break;
1517     case BIO_CTRL_DGRAM_SCTP_GET_SNDINFO:
1518         /* Returns the size of the copied struct. */
1519         if (num > (long)sizeof(struct bio_dgram_sctp_sndinfo))
1520             num = sizeof(struct bio_dgram_sctp_sndinfo);
1521
1522         memcpy(ptr, &(data->sndinfo), num);
1523         ret = num;
1524         break;
1525     case BIO_CTRL_DGRAM_SCTP_SET_SNDINFO:
1526         /* Returns the size of the copied struct. */
1527         if (num > (long)sizeof(struct bio_dgram_sctp_sndinfo))
1528             num = sizeof(struct bio_dgram_sctp_sndinfo);
1529
1530         memcpy(&(data->sndinfo), ptr, num);
1531         break;
1532     case BIO_CTRL_DGRAM_SCTP_GET_RCVINFO:
1533         /* Returns the size of the copied struct. */
1534         if (num > (long)sizeof(struct bio_dgram_sctp_rcvinfo))
1535             num = sizeof(struct bio_dgram_sctp_rcvinfo);
1536
1537         memcpy(ptr, &data->rcvinfo, num);
1538
1539         ret = num;
1540         break;
1541     case BIO_CTRL_DGRAM_SCTP_SET_RCVINFO:
1542         /* Returns the size of the copied struct. */
1543         if (num > (long)sizeof(struct bio_dgram_sctp_rcvinfo))
1544             num = sizeof(struct bio_dgram_sctp_rcvinfo);
1545
1546         memcpy(&(data->rcvinfo), ptr, num);
1547         break;
1548     case BIO_CTRL_DGRAM_SCTP_GET_PRINFO:
1549         /* Returns the size of the copied struct. */
1550         if (num > (long)sizeof(struct bio_dgram_sctp_prinfo))
1551             num = sizeof(struct bio_dgram_sctp_prinfo);
1552
1553         memcpy(ptr, &(data->prinfo), num);
1554         ret = num;
1555         break;
1556     case BIO_CTRL_DGRAM_SCTP_SET_PRINFO:
1557         /* Returns the size of the copied struct. */
1558         if (num > (long)sizeof(struct bio_dgram_sctp_prinfo))
1559             num = sizeof(struct bio_dgram_sctp_prinfo);
1560
1561         memcpy(&(data->prinfo), ptr, num);
1562         break;
1563     case BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN:
1564         /* Returns always 1. */
1565         if (num > 0)
1566             data->save_shutdown = 1;
1567         else
1568             data->save_shutdown = 0;
1569         break;
1570     case BIO_CTRL_DGRAM_SCTP_WAIT_FOR_DRY:
1571         return dgram_sctp_wait_for_dry(b);
1572     case BIO_CTRL_DGRAM_SCTP_MSG_WAITING:
1573         return dgram_sctp_msg_waiting(b);
1574
1575     default:
1576         /*
1577          * Pass to default ctrl function to process SCTP unspecific commands
1578          */
1579         ret = dgram_ctrl(b, cmd, num, ptr);
1580         break;
1581     }
1582     return ret;
1583 }
1584
1585 int BIO_dgram_sctp_notification_cb(BIO *b,
1586                 BIO_dgram_sctp_notification_handler_fn handle_notifications,
1587                 void *context)
1588 {
1589     bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
1590
1591     if (handle_notifications != NULL) {
1592         data->handle_notifications = handle_notifications;
1593         data->notification_context = context;
1594     } else
1595         return -1;
1596
1597     return 0;
1598 }
1599
1600 /*
1601  * BIO_dgram_sctp_wait_for_dry - Wait for SCTP SENDER_DRY event
1602  * @b: The BIO to check for the dry event
1603  *
1604  * Wait until the peer confirms all packets have been received, and so that
1605  * our kernel doesn't have anything to send anymore.  This is only received by
1606  * the peer's kernel, not the application.
1607  *
1608  * Returns:
1609  * -1 on error
1610  *  0 when not dry yet
1611  *  1 when dry
1612  */
1613 int BIO_dgram_sctp_wait_for_dry(BIO *b)
1614 {
1615     return (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SCTP_WAIT_FOR_DRY, 0, NULL);
1616 }
1617
1618 static int dgram_sctp_wait_for_dry(BIO *b)
1619 {
1620     int is_dry = 0;
1621     int sockflags = 0;
1622     int n, ret;
1623     union sctp_notification snp;
1624     struct msghdr msg;
1625     struct iovec iov;
1626 #  ifdef SCTP_EVENT
1627     struct sctp_event event;
1628 #  else
1629     struct sctp_event_subscribe event;
1630     socklen_t eventsize;
1631 #  endif
1632     bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
1633
1634     /* set sender dry event */
1635 #  ifdef SCTP_EVENT
1636     memset(&event, 0, sizeof(event));
1637     event.se_assoc_id = 0;
1638     event.se_type = SCTP_SENDER_DRY_EVENT;
1639     event.se_on = 1;
1640     ret =
1641         setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENT, &event,
1642                    sizeof(struct sctp_event));
1643 #  else
1644     eventsize = sizeof(struct sctp_event_subscribe);
1645     ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize);
1646     if (ret < 0)
1647         return -1;
1648
1649     event.sctp_sender_dry_event = 1;
1650
1651     ret =
1652         setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event,
1653                    sizeof(struct sctp_event_subscribe));
1654 #  endif
1655     if (ret < 0)
1656         return -1;
1657
1658     /* peek for notification */
1659     memset(&snp, 0, sizeof(snp));
1660     iov.iov_base = (char *)&snp;
1661     iov.iov_len = sizeof(union sctp_notification);
1662     msg.msg_name = NULL;
1663     msg.msg_namelen = 0;
1664     msg.msg_iov = &iov;
1665     msg.msg_iovlen = 1;
1666     msg.msg_control = NULL;
1667     msg.msg_controllen = 0;
1668     msg.msg_flags = 0;
1669
1670     n = recvmsg(b->num, &msg, MSG_PEEK);
1671     if (n <= 0) {
1672         if ((n < 0) && (get_last_socket_error() != EAGAIN)
1673             && (get_last_socket_error() != EWOULDBLOCK))
1674             return -1;
1675         else
1676             return 0;
1677     }
1678
1679     /* if we find a notification, process it and try again if necessary */
1680     while (msg.msg_flags & MSG_NOTIFICATION) {
1681         memset(&snp, 0, sizeof(snp));
1682         iov.iov_base = (char *)&snp;
1683         iov.iov_len = sizeof(union sctp_notification);
1684         msg.msg_name = NULL;
1685         msg.msg_namelen = 0;
1686         msg.msg_iov = &iov;
1687         msg.msg_iovlen = 1;
1688         msg.msg_control = NULL;
1689         msg.msg_controllen = 0;
1690         msg.msg_flags = 0;
1691
1692         n = recvmsg(b->num, &msg, 0);
1693         if (n <= 0) {
1694             if ((n < 0) && (get_last_socket_error() != EAGAIN)
1695                 && (get_last_socket_error() != EWOULDBLOCK))
1696                 return -1;
1697             else
1698                 return is_dry;
1699         }
1700
1701         if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) {
1702             is_dry = 1;
1703
1704             /* disable sender dry event */
1705 #  ifdef SCTP_EVENT
1706             memset(&event, 0, sizeof(event));
1707             event.se_assoc_id = 0;
1708             event.se_type = SCTP_SENDER_DRY_EVENT;
1709             event.se_on = 0;
1710             ret =
1711                 setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENT, &event,
1712                            sizeof(struct sctp_event));
1713 #  else
1714             eventsize = (socklen_t) sizeof(struct sctp_event_subscribe);
1715             ret =
1716                 getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event,
1717                            &eventsize);
1718             if (ret < 0)
1719                 return -1;
1720
1721             event.sctp_sender_dry_event = 0;
1722
1723             ret =
1724                 setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event,
1725                            sizeof(struct sctp_event_subscribe));
1726 #  endif
1727             if (ret < 0)
1728                 return -1;
1729         }
1730 #  ifdef SCTP_AUTHENTICATION_EVENT
1731         if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
1732             dgram_sctp_handle_auth_free_key_event(b, &snp);
1733 #  endif
1734
1735         if (data->handle_notifications != NULL)
1736             data->handle_notifications(b, data->notification_context,
1737                                        (void *)&snp);
1738
1739         /* found notification, peek again */
1740         memset(&snp, 0, sizeof(snp));
1741         iov.iov_base = (char *)&snp;
1742         iov.iov_len = sizeof(union sctp_notification);
1743         msg.msg_name = NULL;
1744         msg.msg_namelen = 0;
1745         msg.msg_iov = &iov;
1746         msg.msg_iovlen = 1;
1747         msg.msg_control = NULL;
1748         msg.msg_controllen = 0;
1749         msg.msg_flags = 0;
1750
1751         /* if we have seen the dry already, don't wait */
1752         if (is_dry) {
1753             sockflags = fcntl(b->num, F_GETFL, 0);
1754             fcntl(b->num, F_SETFL, O_NONBLOCK);
1755         }
1756
1757         n = recvmsg(b->num, &msg, MSG_PEEK);
1758
1759         if (is_dry) {
1760             fcntl(b->num, F_SETFL, sockflags);
1761         }
1762
1763         if (n <= 0) {
1764             if ((n < 0) && (get_last_socket_error() != EAGAIN)
1765                 && (get_last_socket_error() != EWOULDBLOCK))
1766                 return -1;
1767             else
1768                 return is_dry;
1769         }
1770     }
1771
1772     /* read anything else */
1773     return is_dry;
1774 }
1775
1776 int BIO_dgram_sctp_msg_waiting(BIO *b)
1777 {
1778     return (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SCTP_MSG_WAITING, 0, NULL);
1779 }
1780
1781 static int dgram_sctp_msg_waiting(BIO *b)
1782 {
1783     int n, sockflags;
1784     union sctp_notification snp;
1785     struct msghdr msg;
1786     struct iovec iov;
1787     bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
1788
1789     /* Check if there are any messages waiting to be read */
1790     do {
1791         memset(&snp, 0, sizeof(snp));
1792         iov.iov_base = (char *)&snp;
1793         iov.iov_len = sizeof(union sctp_notification);
1794         msg.msg_name = NULL;
1795         msg.msg_namelen = 0;
1796         msg.msg_iov = &iov;
1797         msg.msg_iovlen = 1;
1798         msg.msg_control = NULL;
1799         msg.msg_controllen = 0;
1800         msg.msg_flags = 0;
1801
1802         sockflags = fcntl(b->num, F_GETFL, 0);
1803         fcntl(b->num, F_SETFL, O_NONBLOCK);
1804         n = recvmsg(b->num, &msg, MSG_PEEK);
1805         fcntl(b->num, F_SETFL, sockflags);
1806
1807         /* if notification, process and try again */
1808         if (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)) {
1809 #  ifdef SCTP_AUTHENTICATION_EVENT
1810             if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
1811                 dgram_sctp_handle_auth_free_key_event(b, &snp);
1812 #  endif
1813
1814             memset(&snp, 0, sizeof(snp));
1815             iov.iov_base = (char *)&snp;
1816             iov.iov_len = sizeof(union sctp_notification);
1817             msg.msg_name = NULL;
1818             msg.msg_namelen = 0;
1819             msg.msg_iov = &iov;
1820             msg.msg_iovlen = 1;
1821             msg.msg_control = NULL;
1822             msg.msg_controllen = 0;
1823             msg.msg_flags = 0;
1824             n = recvmsg(b->num, &msg, 0);
1825
1826             if (data->handle_notifications != NULL)
1827                 data->handle_notifications(b, data->notification_context,
1828                                            (void *)&snp);
1829         }
1830
1831     } while (n > 0 && (msg.msg_flags & MSG_NOTIFICATION));
1832
1833     /* Return 1 if there is a message to be read, return 0 otherwise. */
1834     if (n > 0)
1835         return 1;
1836     else
1837         return 0;
1838 }
1839
1840 static int dgram_sctp_puts(BIO *bp, const char *str)
1841 {
1842     int n, ret;
1843
1844     n = strlen(str);
1845     ret = dgram_sctp_write(bp, str, n);
1846     return ret;
1847 }
1848 # endif
1849
1850 static int BIO_dgram_should_retry(int i)
1851 {
1852     int err;
1853
1854     if ((i == 0) || (i == -1)) {
1855         err = get_last_socket_error();
1856
1857 # if defined(OPENSSL_SYS_WINDOWS)
1858         /*
1859          * If the socket return value (i) is -1 and err is unexpectedly 0 at
1860          * this point, the error code was overwritten by another system call
1861          * before this error handling is called.
1862          */
1863 # endif
1864
1865         return BIO_dgram_non_fatal_error(err);
1866     }
1867     return 0;
1868 }
1869
1870 int BIO_dgram_non_fatal_error(int err)
1871 {
1872     switch (err) {
1873 # if defined(OPENSSL_SYS_WINDOWS)
1874 #  if defined(WSAEWOULDBLOCK)
1875     case WSAEWOULDBLOCK:
1876 #  endif
1877 # endif
1878
1879 # ifdef EWOULDBLOCK
1880 #  ifdef WSAEWOULDBLOCK
1881 #   if WSAEWOULDBLOCK != EWOULDBLOCK
1882     case EWOULDBLOCK:
1883 #   endif
1884 #  else
1885     case EWOULDBLOCK:
1886 #  endif
1887 # endif
1888
1889 # ifdef EINTR
1890     case EINTR:
1891 # endif
1892
1893 # ifdef EAGAIN
1894 #  if EWOULDBLOCK != EAGAIN
1895     case EAGAIN:
1896 #  endif
1897 # endif
1898
1899 # ifdef EPROTO
1900     case EPROTO:
1901 # endif
1902
1903 # ifdef EINPROGRESS
1904     case EINPROGRESS:
1905 # endif
1906
1907 # ifdef EALREADY
1908     case EALREADY:
1909 # endif
1910
1911         return 1;
1912     default:
1913         break;
1914     }
1915     return 0;
1916 }
1917
1918 static void get_current_time(struct timeval *t)
1919 {
1920 # if defined(_WIN32)
1921     SYSTEMTIME st;
1922     union {
1923         unsigned __int64 ul;
1924         FILETIME ft;
1925     } now;
1926
1927     GetSystemTime(&st);
1928     SystemTimeToFileTime(&st, &now.ft);
1929 #  ifdef  __MINGW32__
1930     now.ul -= 116444736000000000ULL;
1931 #  else
1932     now.ul -= 116444736000000000UI64; /* re-bias to 1/1/1970 */
1933 #  endif
1934     t->tv_sec = (long)(now.ul / 10000000);
1935     t->tv_usec = ((int)(now.ul % 10000000)) / 10;
1936 # else
1937     gettimeofday(t, NULL);
1938 # endif
1939 }
1940
1941 #endif