summaryrefslogtreecommitdiffstats
path: root/lib/libcrypto/bio/bss_dgram.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libcrypto/bio/bss_dgram.c')
-rw-r--r--lib/libcrypto/bio/bss_dgram.c1114
1 files changed, 554 insertions, 560 deletions
diff --git a/lib/libcrypto/bio/bss_dgram.c b/lib/libcrypto/bio/bss_dgram.c
index 67a13ae845d..330f6fc404e 100644
--- a/lib/libcrypto/bio/bss_dgram.c
+++ b/lib/libcrypto/bio/bss_dgram.c
@@ -113,7 +113,8 @@ static long dgram_sctp_ctrl(BIO *h, int cmd, long arg1, void *arg2);
static int dgram_sctp_new(BIO *h);
static int dgram_sctp_free(BIO *data);
#ifdef SCTP_AUTHENTICATION_EVENT
-static void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp);
+static void dgram_sctp_handle_auth_free_key_event(BIO *b,
+ union sctp_notification *snp);
#endif
#endif
@@ -121,8 +122,7 @@ static int BIO_dgram_should_retry(int s);
static void get_current_time(struct timeval *t);
-static BIO_METHOD methods_dgramp=
- {
+static BIO_METHOD methods_dgramp = {
BIO_TYPE_DGRAM,
"datagram socket",
dgram_write,
@@ -133,11 +133,10 @@ static BIO_METHOD methods_dgramp=
dgram_new,
dgram_free,
NULL,
- };
+};
#ifndef OPENSSL_NO_SCTP
-static BIO_METHOD methods_dgramp_sctp=
- {
+static BIO_METHOD methods_dgramp_sctp = {
BIO_TYPE_DGRAM_SCTP,
"datagram sctp socket",
dgram_sctp_write,
@@ -148,11 +147,10 @@ static BIO_METHOD methods_dgramp_sctp=
dgram_sctp_new,
dgram_sctp_free,
NULL,
- };
+};
#endif
-typedef struct bio_dgram_data_st
- {
+typedef struct bio_dgram_data_st {
union {
struct sockaddr sa;
struct sockaddr_in sa_in;
@@ -165,18 +163,16 @@ typedef struct bio_dgram_data_st
unsigned int mtu;
struct timeval next_timeout;
struct timeval socket_timeout;
- } bio_dgram_data;
+} bio_dgram_data;
#ifndef OPENSSL_NO_SCTP
-typedef struct bio_dgram_sctp_save_message_st
- {
- BIO *bio;
- char *data;
- int length;
- } bio_dgram_sctp_save_message;
+typedef struct bio_dgram_sctp_save_message_st {
+ BIO *bio;
+ char *data;
+ int length;
+} bio_dgram_sctp_save_message;
-typedef struct bio_dgram_sctp_data_st
- {
+typedef struct bio_dgram_sctp_data_st {
union {
struct sockaddr sa;
struct sockaddr_in sa_in;
@@ -198,79 +194,88 @@ typedef struct bio_dgram_sctp_data_st
int save_shutdown;
int peer_auth_tested;
bio_dgram_sctp_save_message saved_message;
- } bio_dgram_sctp_data;
+} bio_dgram_sctp_data;
#endif
-BIO_METHOD *BIO_s_datagram(void)
- {
- return(&methods_dgramp);
- }
+BIO_METHOD
+*BIO_s_datagram(void)
+{
+ return (&methods_dgramp);
+}
-BIO *BIO_new_dgram(int fd, int close_flag)
- {
+BIO
+*BIO_new_dgram(int fd, int close_flag)
+{
BIO *ret;
- ret=BIO_new(BIO_s_datagram());
- if (ret == NULL) return(NULL);
- BIO_set_fd(ret,fd,close_flag);
- return(ret);
- }
+ ret = BIO_new(BIO_s_datagram());
+ if (ret == NULL)
+ return (NULL);
+ BIO_set_fd(ret, fd, close_flag);
+ return (ret);
+}
-static int dgram_new(BIO *bi)
- {
+static int
+dgram_new(BIO *bi)
+{
bio_dgram_data *data = NULL;
- bi->init=0;
- bi->num=0;
+ bi->init = 0;
+ bi->num = 0;
data = OPENSSL_malloc(sizeof(bio_dgram_data));
if (data == NULL)
return 0;
memset(data, 0x00, sizeof(bio_dgram_data));
- bi->ptr = data;
+ bi->ptr = data;
- bi->flags=0;
- return(1);
- }
+ bi->flags = 0;
+ return (1);
+}
-static int dgram_free(BIO *a)
- {
+static int
+dgram_free(BIO *a)
+{
bio_dgram_data *data;
- if (a == NULL) return(0);
- if ( ! dgram_clear(a))
+ if (a == NULL)
+ return (0);
+ if (!dgram_clear(a))
return 0;
data = (bio_dgram_data *)a->ptr;
- if(data != NULL) OPENSSL_free(data);
+ if (data != NULL)
+ OPENSSL_free(data);
- return(1);
- }
+ return (1);
+}
-static int dgram_clear(BIO *a)
- {
- if (a == NULL) return(0);
- if (a->shutdown)
- {
- if (a->init)
- {
+static int
+dgram_clear(BIO *a)
+{
+ if (a == NULL)
+ return (0);
+ if (a->shutdown) {
+ if (a->init) {
shutdown(a->num, SHUT_RDWR);
close(a->num);
- }
- a->init=0;
- a->flags=0;
}
- return(1);
+ a->init = 0;
+ a->flags = 0;
}
+ return (1);
+}
-static void dgram_adjust_rcv_timeout(BIO *b)
- {
+static void
+dgram_adjust_rcv_timeout(BIO *b)
+{
#if defined(SO_RCVTIMEO)
bio_dgram_data *data = (bio_dgram_data *)b->ptr;
- union { size_t s; int i; } sz = {0};
+ union { size_t s;
+ int i;
+ } sz = {0};
/* Is a timer active? */
- if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0)
- {
+ if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) {
struct timeval timenow, timeleft;
/* Read current socket timeout */
@@ -279,20 +284,19 @@ static void dgram_adjust_rcv_timeout(BIO *b)
sz.i = sizeof(timeout);
if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
- (void*)&timeout, &sz.i) < 0)
- { perror("getsockopt"); }
- else
- {
+ (void*)&timeout, &sz.i) < 0) {
+ perror("getsockopt");
+ } else {
data->socket_timeout.tv_sec = timeout / 1000;
data->socket_timeout.tv_usec = (timeout % 1000) * 1000;
- }
+ }
#else
sz.i = sizeof(data->socket_timeout);
- if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
- &(data->socket_timeout), (void *)&sz) < 0)
- { perror("getsockopt"); }
- else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0)
- OPENSSL_assert(sz.s<=sizeof(data->socket_timeout));
+ if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
+ &(data->socket_timeout), (void *)&sz) < 0) {
+ perror("getsockopt");
+ } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0)
+ OPENSSL_assert(sz.s <= sizeof(data->socket_timeout));
#endif
/* Get current time */
@@ -302,126 +306,128 @@ static void dgram_adjust_rcv_timeout(BIO *b)
memcpy(&timeleft, &(data->next_timeout), sizeof(struct timeval));
timeleft.tv_sec -= timenow.tv_sec;
timeleft.tv_usec -= timenow.tv_usec;
- if (timeleft.tv_usec < 0)
- {
+ if (timeleft.tv_usec < 0) {
timeleft.tv_sec--;
timeleft.tv_usec += 1000000;
- }
+ }
- if (timeleft.tv_sec < 0)
- {
+ if (timeleft.tv_sec < 0) {
timeleft.tv_sec = 0;
timeleft.tv_usec = 1;
- }
+ }
/* Adjust socket timeout if next handhake message timer
* will expire earlier.
*/
- if ((data->socket_timeout.tv_sec == 0 && data->socket_timeout.tv_usec == 0) ||
- (data->socket_timeout.tv_sec > timeleft.tv_sec) ||
- (data->socket_timeout.tv_sec == timeleft.tv_sec &&
- data->socket_timeout.tv_usec >= timeleft.tv_usec))
- {
+ if ((data->socket_timeout.tv_sec == 0 &&
+ data->socket_timeout.tv_usec == 0) ||
+ (data->socket_timeout.tv_sec > timeleft.tv_sec) ||
+ (data->socket_timeout.tv_sec == timeleft.tv_sec &&
+ data->socket_timeout.tv_usec >= timeleft.tv_usec)) {
#ifdef OPENSSL_SYS_WINDOWS
timeout = timeleft.tv_sec * 1000 + timeleft.tv_usec / 1000;
if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
- (void*)&timeout, sizeof(timeout)) < 0)
- { perror("setsockopt"); }
+ (void*)&timeout, sizeof(timeout)) < 0) {
+ perror("setsockopt");
+ }
#else
- if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &timeleft,
- sizeof(struct timeval)) < 0)
- { perror("setsockopt"); }
-#endif
+ if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
+ &timeleft, sizeof(struct timeval)) < 0) {
+ perror("setsockopt");
}
- }
#endif
+ }
}
+#endif
+}
-static void dgram_reset_rcv_timeout(BIO *b)
- {
+static void
+dgram_reset_rcv_timeout(BIO *b)
+{
#if defined(SO_RCVTIMEO)
bio_dgram_data *data = (bio_dgram_data *)b->ptr;
/* Is a timer active? */
- if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0)
- {
+ if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) {
#ifdef OPENSSL_SYS_WINDOWS
int timeout = data->socket_timeout.tv_sec * 1000 +
- data->socket_timeout.tv_usec / 1000;
+ data->socket_timeout.tv_usec / 1000;
if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
- (void*)&timeout, sizeof(timeout)) < 0)
- { perror("setsockopt"); }
+ (void*)&timeout, sizeof(timeout)) < 0) {
+ perror("setsockopt");
+ }
#else
- if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &(data->socket_timeout),
- sizeof(struct timeval)) < 0)
- { perror("setsockopt"); }
-#endif
+ if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
+ &(data->socket_timeout), sizeof(struct timeval)) < 0) {
+ perror("setsockopt");
}
#endif
}
+#endif
+}
-static int dgram_read(BIO *b, char *out, int outl)
- {
- int ret=0;
+static int
+dgram_read(BIO *b, char *out, int outl)
+{
+ int ret = 0;
bio_dgram_data *data = (bio_dgram_data *)b->ptr;
struct {
- /*
- * See commentary in b_sock.c. <appro>
- */
- union { size_t s; int i; } len;
- union {
- struct sockaddr sa;
- struct sockaddr_in sa_in;
+ /*
+ * See commentary in b_sock.c. <appro>
+ */
+ union {
+ size_t s;
+ int i;
+ } len;
+ union {
+ struct sockaddr sa;
+ struct sockaddr_in sa_in;
#if OPENSSL_USE_IPV6
- struct sockaddr_in6 sa_in6;
+ struct sockaddr_in6 sa_in6;
#endif
} peer;
} sa;
- sa.len.s=0;
- sa.len.i=sizeof(sa.peer);
+ sa.len.s = 0;
+ sa.len.i = sizeof(sa.peer);
- if (out != NULL)
- {
+ if (out != NULL) {
errno = 0;
memset(&sa.peer, 0x00, sizeof(sa.peer));
dgram_adjust_rcv_timeout(b);
- ret=recvfrom(b->num,out,outl,0,&sa.peer.sa,(void *)&sa.len);
- if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0)
- {
- OPENSSL_assert(sa.len.s<=sizeof(sa.peer));
+ ret = recvfrom(b->num, out, outl, 0, &sa.peer.sa,(void *)&sa.len);
+ if (sizeof(sa.len.i) != sizeof(sa.len.s) && sa.len.i == 0) {
+ OPENSSL_assert(sa.len.s <= sizeof(sa.peer));
sa.len.i = (int)sa.len.s;
- }
+ }
- if ( ! data->connected && ret >= 0)
+ if (! data->connected && ret >= 0)
BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &sa.peer);
BIO_clear_retry_flags(b);
- if (ret < 0)
- {
- if (BIO_dgram_should_retry(ret))
- {
+ if (ret < 0) {
+ if (BIO_dgram_should_retry(ret)) {
BIO_set_retry_read(b);
data->_errno = errno;
- }
}
+ }
dgram_reset_rcv_timeout(b);
- }
- return(ret);
}
+ return (ret);
+}
-static int dgram_write(BIO *b, const char *in, int inl)
- {
+static int
+dgram_write(BIO *b, const char *in, int inl)
+{
int ret;
bio_dgram_data *data = (bio_dgram_data *)b->ptr;
errno = 0;
- if ( data->connected )
- ret=write(b->num,in,inl);
- else
- {
+ if (data->connected)
+ ret = write(b->num, in, inl);
+ else {
int peerlen = sizeof(data->peer);
if (data->peer.sa.sa_family == AF_INET)
@@ -431,33 +437,33 @@ static int dgram_write(BIO *b, const char *in, int inl)
peerlen = sizeof(data->peer.sa_in6);
#endif
#if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK)
- ret=sendto(b->num, (char *)in, inl, 0, &data->peer.sa, peerlen);
+ ret = sendto(b->num, (char *)in, inl, 0, &data->peer.sa, peerlen);
#else
- ret=sendto(b->num, in, inl, 0, &data->peer.sa, peerlen);
+ ret = sendto(b->num, in, inl, 0, &data->peer.sa, peerlen);
#endif
- }
+ }
BIO_clear_retry_flags(b);
- if (ret <= 0)
- {
- if (BIO_dgram_should_retry(ret))
- {
- BIO_set_retry_write(b);
+ if (ret <= 0) {
+ if (BIO_dgram_should_retry(ret)) {
+ BIO_set_retry_write(b);
+
data->_errno = errno;
#if 0 /* higher layers are responsible for querying MTU, if necessary */
- if ( data->_errno == EMSGSIZE)
+ if (data->_errno == EMSGSIZE)
/* retrieve the new MTU */
- BIO_ctrl(b, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
+ BIO_ctrl(b, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
#endif
- }
}
- return(ret);
}
+ return (ret);
+}
-static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
- {
- long ret=1;
+static long
+dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
+{
+ long ret = 1;
int *ip;
struct sockaddr *to = NULL;
bio_dgram_data *data = NULL;
@@ -472,76 +478,73 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
#if OPENSSL_USE_IPV6
struct sockaddr_in6 s6;
#endif
- } addr;
+ } addr;
#endif
data = (bio_dgram_data *)b->ptr;
- switch (cmd)
- {
+ switch (cmd) {
case BIO_CTRL_RESET:
- num=0;
+ num = 0;
case BIO_C_FILE_SEEK:
- ret=0;
+ ret = 0;
break;
case BIO_C_FILE_TELL:
case BIO_CTRL_INFO:
- ret=0;
+ ret = 0;
break;
case BIO_C_SET_FD:
dgram_clear(b);
b->num= *((int *)ptr);
- b->shutdown=(int)num;
- b->init=1;
+ b->shutdown = (int)num;
+ b->init = 1;
break;
case BIO_C_GET_FD:
- if (b->init)
- {
- ip=(int *)ptr;
- if (ip != NULL) *ip=b->num;
- ret=b->num;
- }
- else
- ret= -1;
+ if (b->init) {
+ ip = (int *)ptr;
+ if (ip != NULL)
+ *ip = b->num;
+ ret = b->num;
+ } else
+ ret = -1;
break;
case BIO_CTRL_GET_CLOSE:
- ret=b->shutdown;
+ ret = b->shutdown;
break;
case BIO_CTRL_SET_CLOSE:
- b->shutdown=(int)num;
+ b->shutdown = (int)num;
break;
case BIO_CTRL_PENDING:
case BIO_CTRL_WPENDING:
- ret=0;
+ ret = 0;
break;
case BIO_CTRL_DUP:
case BIO_CTRL_FLUSH:
- ret=1;
+ ret = 1;
break;
case BIO_CTRL_DGRAM_CONNECT:
to = (struct sockaddr *)ptr;
#if 0
- if (connect(b->num, to, sizeof(struct sockaddr)) < 0)
- { perror("connect"); ret = 0; }
- else
- {
+ if (connect(b->num, to, sizeof(struct sockaddr)) < 0) {
+ perror("connect");
+ ret = 0;
+ } else {
#endif
- switch (to->sa_family)
- {
- case AF_INET:
- memcpy(&data->peer,to,sizeof(data->peer.sa_in));
- break;
+ switch (to->sa_family) {
+ case AF_INET:
+ memcpy(&data->peer, to, sizeof(data->peer.sa_in));
+ break;
#if OPENSSL_USE_IPV6
- case AF_INET6:
- memcpy(&data->peer,to,sizeof(data->peer.sa_in6));
- break;
+ case AF_INET6:
+ memcpy(&data->peer, to, sizeof(data->peer.sa_in6));
+ break;
#endif
- default:
- memcpy(&data->peer,to,sizeof(data->peer.sa));
- break;
- }
-#if 0
+ default:
+ memcpy(&data->peer, to, sizeof(data->peer.sa));
+ break;
}
+#if 0
+ }
#endif
break;
/* (Linux)kernel sets DF bit on outgoing IP packets */
@@ -549,31 +552,31 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO)
addr_len = (socklen_t)sizeof(addr);
memset((void *)&addr, 0, sizeof(addr));
- if (getsockname(b->num, &addr.sa, &addr_len) < 0)
- {
+ if (getsockname(b->num, &addr.sa, &addr_len) < 0) {
ret = 0;
break;
- }
- switch (addr.sa.sa_family)
- {
+ }
+ switch (addr.sa.sa_family) {
case AF_INET:
sockopt_val = IP_PMTUDISC_DO;
- if ((ret = setsockopt(b->num, IPPROTO_IP, IP_MTU_DISCOVER,
- &sockopt_val, sizeof(sockopt_val))) < 0)
+ if ((ret = setsockopt(b->num, IPPROTO_IP,
+ IP_MTU_DISCOVER, &sockopt_val,
+ sizeof(sockopt_val))) < 0)
perror("setsockopt");
break;
#if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO)
case AF_INET6:
sockopt_val = IPV6_PMTUDISC_DO;
- if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
- &sockopt_val, sizeof(sockopt_val))) < 0)
+ if ((ret = setsockopt(b->num, IPPROTO_IPV6,
+ IPV6_MTU_DISCOVER, &sockopt_val,
+ sizeof(sockopt_val))) < 0)
perror("setsockopt");
break;
#endif
default:
ret = -1;
break;
- }
+ }
ret = -1;
#else
break;
@@ -582,74 +585,67 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU)
addr_len = (socklen_t)sizeof(addr);
memset((void *)&addr, 0, sizeof(addr));
- if (getsockname(b->num, &addr.sa, &addr_len) < 0)
- {
+ if (getsockname(b->num, &addr.sa, &addr_len) < 0) {
ret = 0;
break;
- }
+ }
sockopt_len = sizeof(sockopt_val);
- switch (addr.sa.sa_family)
- {
+ switch (addr.sa.sa_family) {
case AF_INET:
- if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val,
- &sockopt_len)) < 0 || sockopt_val < 0)
- {
+ if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU,
+ (void *)&sockopt_val, &sockopt_len)) < 0 ||
+ sockopt_val < 0) {
ret = 0;
- }
- else
- {
+ } else {
/* we assume that the transport protocol is UDP and no
* IP options are used.
*/
data->mtu = sockopt_val - 8 - 20;
ret = data->mtu;
- }
+ }
break;
#if OPENSSL_USE_IPV6 && defined(IPV6_MTU)
case AF_INET6:
- if ((ret = getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU, (void *)&sockopt_val,
- &sockopt_len)) < 0 || sockopt_val < 0)
- {
+ if ((ret = getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU,
+ (void *)&sockopt_val, &sockopt_len)) < 0 ||
+ sockopt_val < 0) {
ret = 0;
- }
- else
- {
+ } else {
/* we assume that the transport protocol is UDP and no
* IPV6 options are used.
*/
data->mtu = sockopt_val - 8 - 40;
ret = data->mtu;
- }
+ }
break;
#endif
- default:
+default:
ret = 0;
break;
- }
+ }
#else
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;
+ switch (data->peer.sa.sa_family) {
+ case AF_INET:
+ ret = 576 - 20 - 8;
+ break;
#if OPENSSL_USE_IPV6
- case AF_INET6:
+ case AF_INET6:
#ifdef IN6_IS_ADDR_V4MAPPED
- if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr))
- ret = 576 - 20 - 8;
- else
+ if (IN6_IS_ADDR_V4MAPPED(&data->peer.sa_in6.sin6_addr))
+ ret = 576 - 20 - 8;
+ else
#endif
- ret = 1280 - 40 - 8;
- break;
+ ret = 1280 - 40 - 8;
+ break;
#endif
- default:
- ret = 576 - 20 - 8;
- break;
- }
+ default:
+ ret = 576 - 20 - 8;
+ break;
+ }
break;
case BIO_CTRL_DGRAM_GET_MTU:
return data->mtu;
@@ -661,65 +657,59 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
case BIO_CTRL_DGRAM_SET_CONNECTED:
to = (struct sockaddr *)ptr;
- if ( to != NULL)
- {
+ if (to != NULL) {
data->connected = 1;
- switch (to->sa_family)
- {
- case AF_INET:
- memcpy(&data->peer,to,sizeof(data->peer.sa_in));
- break;
-#if OPENSSL_USE_IPV6
- case AF_INET6:
- memcpy(&data->peer,to,sizeof(data->peer.sa_in6));
- break;
-#endif
- default:
- memcpy(&data->peer,to,sizeof(data->peer.sa));
- break;
- }
- }
- else
- {
- data->connected = 0;
- memset(&(data->peer), 0x00, sizeof(data->peer));
- }
- break;
- case BIO_CTRL_DGRAM_GET_PEER:
- switch (data->peer.sa.sa_family)
- {
+ switch (to->sa_family) {
case AF_INET:
- ret=sizeof(data->peer.sa_in);
+ memcpy(&data->peer, to, sizeof(data->peer.sa_in));
break;
#if OPENSSL_USE_IPV6
case AF_INET6:
- ret=sizeof(data->peer.sa_in6);
+ memcpy(&data->peer, to, sizeof(data->peer.sa_in6));
break;
#endif
default:
- ret=sizeof(data->peer.sa);
+ memcpy(&data->peer, to, sizeof(data->peer.sa));
break;
}
- if (num==0 || num>ret)
- num=ret;
- memcpy(ptr,&data->peer,(ret=num));
+ } else {
+ data->connected = 0;
+ memset(&(data->peer), 0x00, sizeof(data->peer));
+ }
+ break;
+ case BIO_CTRL_DGRAM_GET_PEER:
+ switch (data->peer.sa.sa_family) {
+ case AF_INET:
+ ret = sizeof(data->peer.sa_in);
+ break;
+#if OPENSSL_USE_IPV6
+ case AF_INET6:
+ ret = sizeof(data->peer.sa_in6);
+ break;
+#endif
+ default:
+ ret = sizeof(data->peer.sa);
+ break;
+ }
+ if (num == 0 || num > ret)
+ num = ret;
+ memcpy(ptr, &data->peer, (ret = num));
break;
case BIO_CTRL_DGRAM_SET_PEER:
to = (struct sockaddr *) ptr;
- switch (to->sa_family)
- {
- case AF_INET:
- memcpy(&data->peer,to,sizeof(data->peer.sa_in));
- break;
+ switch (to->sa_family) {
+ case AF_INET:
+ memcpy(&data->peer, to, sizeof(data->peer.sa_in));
+ break;
#if OPENSSL_USE_IPV6
- case AF_INET6:
- memcpy(&data->peer,to,sizeof(data->peer.sa_in6));
- break;
+ case AF_INET6:
+ memcpy(&data->peer, to, sizeof(data->peer.sa_in6));
+ break;
#endif
- default:
- memcpy(&data->peer,to,sizeof(data->peer.sa));
- break;
- }
+ default:
+ memcpy(&data->peer, to, sizeof(data->peer.sa));
+ break;
+ }
break;
case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT:
memcpy(&(data->next_timeout), ptr, sizeof(struct timeval));
@@ -728,47 +718,53 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT:
#ifdef OPENSSL_SYS_WINDOWS
{
- struct timeval *tv = (struct timeval *)ptr;
- int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000;
- if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
- (void*)&timeout, sizeof(timeout)) < 0)
- { perror("setsockopt"); ret = -1; }
+ struct timeval *tv = (struct timeval *)ptr;
+ int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000;
+ if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
+ (void*)&timeout, sizeof(timeout)) < 0) {
+ perror("setsockopt");
+ ret = -1;
+ }
}
#else
- if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr,
- sizeof(struct timeval)) < 0)
- { perror("setsockopt"); ret = -1; }
+ if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr,
+ sizeof(struct timeval)) < 0) {
+ perror("setsockopt");
+ ret = -1;
+ }
#endif
break;
case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
{
- union { size_t s; int i; } sz = {0};
+ union {
+ size_t s;
+ int i;
+ } sz = {0};
#ifdef OPENSSL_SYS_WINDOWS
- int timeout;
- struct timeval *tv = (struct timeval *)ptr;
-
- sz.i = sizeof(timeout);
- if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
- (void*)&timeout, &sz.i) < 0)
- { perror("getsockopt"); ret = -1; }
- else
- {
- tv->tv_sec = timeout / 1000;
- tv->tv_usec = (timeout % 1000) * 1000;
- ret = sizeof(*tv);
+ int timeout;
+ struct timeval *tv = (struct timeval *)ptr;
+
+ sz.i = sizeof(timeout);
+ if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
+ (void*)&timeout, &sz.i) < 0) {
+ perror("getsockopt");
+ ret = -1;
+ } else {
+ tv->tv_sec = timeout / 1000;
+ tv->tv_usec = (timeout % 1000) * 1000;
+ ret = sizeof(*tv);
}
#else
- sz.i = sizeof(struct timeval);
- if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
- ptr, (void *)&sz) < 0)
- { perror("getsockopt"); ret = -1; }
- else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0)
- {
- OPENSSL_assert(sz.s<=sizeof(struct timeval));
- ret = (int)sz.s;
- }
- else
- ret = sz.i;
+ sz.i = sizeof(struct timeval);
+ if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
+ ptr, (void *)&sz) < 0) {
+ perror("getsockopt");
+ ret = -1;
+ } else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0) {
+ OPENSSL_assert(sz.s <= sizeof(struct timeval));
+ ret = (int)sz.s;
+ } else
+ ret = sz.i;
#endif
}
break;
@@ -777,47 +773,53 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT:
#ifdef OPENSSL_SYS_WINDOWS
{
- struct timeval *tv = (struct timeval *)ptr;
- int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000;
- if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
- (void*)&timeout, sizeof(timeout)) < 0)
- { perror("setsockopt"); ret = -1; }
+ struct timeval *tv = (struct timeval *)ptr;
+ int timeout = tv->tv_sec * 1000 + tv->tv_usec/1000;
+ if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
+ (void*)&timeout, sizeof(timeout)) < 0) {
+ perror("setsockopt");
+ ret = -1;
+ }
}
#else
- if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr,
- sizeof(struct timeval)) < 0)
- { perror("setsockopt"); ret = -1; }
+ if (setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr,
+ sizeof(struct timeval)) < 0) {
+ perror("setsockopt");
+ ret = -1;
+ }
#endif
break;
case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
{
- union { size_t s; int i; } sz = {0};
+ union {
+ size_t s;
+ int i;
+ } sz = {0};
#ifdef OPENSSL_SYS_WINDOWS
- int timeout;
- struct timeval *tv = (struct timeval *)ptr;
-
- sz.i = sizeof(timeout);
- if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
- (void*)&timeout, &sz.i) < 0)
- { perror("getsockopt"); ret = -1; }
- else
- {
- tv->tv_sec = timeout / 1000;
- tv->tv_usec = (timeout % 1000) * 1000;
- ret = sizeof(*tv);
+ int timeout;
+ struct timeval *tv = (struct timeval *)ptr;
+
+ sz.i = sizeof(timeout);
+ if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
+ (void*)&timeout, &sz.i) < 0) {
+ perror("getsockopt");
+ ret = -1;
+ } else {
+ tv->tv_sec = timeout / 1000;
+ tv->tv_usec = (timeout % 1000) * 1000;
+ ret = sizeof(*tv);
}
#else
- sz.i = sizeof(struct timeval);
- if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
- ptr, (void *)&sz) < 0)
- { perror("getsockopt"); ret = -1; }
- else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0)
- {
- OPENSSL_assert(sz.s<=sizeof(struct timeval));
- ret = (int)sz.s;
- }
- else
- ret = sz.i;
+ sz.i = sizeof(struct timeval);
+ if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
+ ptr, (void *)&sz) < 0) {
+ perror("getsockopt");
+ ret = -1;
+ } else if (sizeof(sz.s) != sizeof(sz.i) && sz.i == 0) {
+ OPENSSL_assert(sz.s <= sizeof(struct timeval));
+ ret = (int)sz.s;
+ } else
+ ret = sz.i;
#endif
}
break;
@@ -826,52 +828,52 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
/* fall-through */
case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP:
#ifdef OPENSSL_SYS_WINDOWS
- if ( data->_errno == WSAETIMEDOUT)
+ if (data->_errno == WSAETIMEDOUT)
#else
- if ( data->_errno == EAGAIN)
+ if (data->_errno == EAGAIN)
#endif
- {
+ {
ret = 1;
data->_errno = 0;
- }
- else
+ } else
ret = 0;
break;
#ifdef EMSGSIZE
case BIO_CTRL_DGRAM_MTU_EXCEEDED:
- if ( data->_errno == EMSGSIZE)
- {
+ if (data->_errno == EMSGSIZE) {
ret = 1;
data->_errno = 0;
- }
- else
+ } else
ret = 0;
break;
#endif
default:
- ret=0;
+ ret = 0;
break;
- }
- return(ret);
}
+ return (ret);
+}
-static int dgram_puts(BIO *bp, const char *str)
- {
- int n,ret;
+static int
+dgram_puts(BIO *bp, const char *str)
+{
+ int n, ret;
- n=strlen(str);
- ret=dgram_write(bp,str,n);
- return(ret);
- }
+ n = strlen(str);
+ ret = dgram_write(bp, str, n);
+ return (ret);
+}
#ifndef OPENSSL_NO_SCTP
-BIO_METHOD *BIO_s_datagram_sctp(void)
- {
- return(&methods_dgramp_sctp);
- }
+BIO_METHOD
+*BIO_s_datagram_sctp(void)
+{
+ return (&methods_dgramp_sctp);
+}
-BIO *BIO_new_dgram_sctp(int fd, int close_flag)
- {
+BIO
+*BIO_new_dgram_sctp(int fd, int close_flag)
+{
BIO *bio;
int ret, optval = 20000;
int auth_data = 0, auth_forward = 0;
@@ -887,9 +889,10 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag)
#endif
#endif
- bio=BIO_new(BIO_s_datagram_sctp());
- if (bio == NULL) return(NULL);
- BIO_set_fd(bio,fd,close_flag);
+ bio = BIO_new(BIO_s_datagram_sctp());
+ if (bio == NULL)
+ return (NULL);
+ BIO_set_fd(bio, fd, close_flag);
/* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */
auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE;
@@ -909,13 +912,14 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag)
OPENSSL_assert(ret >= 0);
for (p = (unsigned char*) authchunks->gauth_chunks;
- p < (unsigned char*) authchunks + sockopt_len;
- p += sizeof(uint8_t))
- {
- if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) auth_data = 1;
- if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) auth_forward = 1;
- }
-
+ p < (unsigned char*) authchunks + sockopt_len;
+ p += sizeof(uint8_t)) {
+ if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE)
+ auth_data = 1;
+ if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE)
+ auth_forward = 1;
+ }
+
OPENSSL_free(authchunks);
OPENSSL_assert(auth_data);
@@ -947,20 +951,22 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag)
ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval));
OPENSSL_assert(ret >= 0);
- return(bio);
- }
+ return (bio);
+}
-int BIO_dgram_is_sctp(BIO *bio)
- {
+int
+BIO_dgram_is_sctp(BIO *bio)
+{
return (BIO_method_type(bio) == BIO_TYPE_DGRAM_SCTP);
- }
+}
-static int dgram_sctp_new(BIO *bi)
- {
+static int
+dgram_sctp_new(BIO *bi)
+{
bio_dgram_sctp_data *data = NULL;
- bi->init=0;
- bi->num=0;
+ bi->init = 0;
+ bi->num = 0;
data = OPENSSL_malloc(sizeof(bio_dgram_sctp_data));
if (data == NULL)
return 0;
@@ -968,46 +974,50 @@ static int dgram_sctp_new(BIO *bi)
#ifdef SCTP_PR_SCTP_NONE
data->prinfo.pr_policy = SCTP_PR_SCTP_NONE;
#endif
- bi->ptr = data;
+ bi->ptr = data;
- bi->flags=0;
- return(1);
- }
+ bi->flags = 0;
+ return (1);
+}
-static int dgram_sctp_free(BIO *a)
- {
+static int
+dgram_sctp_free(BIO *a)
+{
bio_dgram_sctp_data *data;
- if (a == NULL) return(0);
- if ( ! dgram_clear(a))
+ if (a == NULL)
+ return (0);
+ if (! dgram_clear(a))
return 0;
data = (bio_dgram_sctp_data *)a->ptr;
- if(data != NULL) OPENSSL_free(data);
+ if (data != NULL)
+ OPENSSL_free(data);
- return(1);
- }
+ return (1);
+}
#ifdef SCTP_AUTHENTICATION_EVENT
-void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp)
- {
+void
+dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp)
+{
int ret;
struct sctp_authkey_event* authkeyevent = &snp->sn_auth_event;
- if (authkeyevent->auth_indication == SCTP_AUTH_FREE_KEY)
- {
+ if (authkeyevent->auth_indication == SCTP_AUTH_FREE_KEY) {
struct sctp_authkeyid authkeyid;
/* delete key */
authkeyid.scact_keynumber = authkeyevent->auth_keynumber;
ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY,
- &authkeyid, sizeof(struct sctp_authkeyid));
- }
+ &authkeyid, sizeof(struct sctp_authkeyid));
}
+}
#endif
-static int dgram_sctp_read(BIO *b, char *out, int outl)
- {
+static int
+dgram_sctp_read(BIO *b, char *out, int outl)
+{
int ret = 0, n = 0, i, optval;
socklen_t optlen;
bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr;
@@ -1017,12 +1027,10 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
struct cmsghdr *cmsg;
char cmsgbuf[512];
- if (out != NULL)
- {
+ if (out != NULL) {
errno = 0;
- do
- {
+ do {
memset(&data->rcvinfo, 0x00, sizeof(struct bio_dgram_sctp_rcvinfo));
iov.iov_base = out;
iov.iov_len = outl;
@@ -1035,15 +1043,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
msg.msg_flags = 0;
n = recvmsg(b->num, &msg, 0);
- if (msg.msg_controllen > 0)
- {
- for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg))
- {
+ if (msg.msg_controllen > 0) {
+ for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
if (cmsg->cmsg_level != IPPROTO_SCTP)
continue;
#ifdef SCTP_RCVINFO
- if (cmsg->cmsg_type == SCTP_RCVINFO)
- {
+ if (cmsg->cmsg_type == SCTP_RCVINFO) {
struct sctp_rcvinfo *rcvinfo;
rcvinfo = (struct sctp_rcvinfo *)CMSG_DATA(cmsg);
@@ -1054,11 +1059,10 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
data->rcvinfo.rcv_tsn = rcvinfo->rcv_tsn;
data->rcvinfo.rcv_cumtsn = rcvinfo->rcv_cumtsn;
data->rcvinfo.rcv_context = rcvinfo->rcv_context;
- }
+ }
#endif
#ifdef SCTP_SNDRCV
- if (cmsg->cmsg_type == SCTP_SNDRCV)
- {
+ if (cmsg->cmsg_type == SCTP_SNDRCV) {
struct sctp_sndrcvinfo *sndrcvinfo;
sndrcvinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
@@ -1069,23 +1073,20 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
data->rcvinfo.rcv_tsn = sndrcvinfo->sinfo_tsn;
data->rcvinfo.rcv_cumtsn = sndrcvinfo->sinfo_cumtsn;
data->rcvinfo.rcv_context = sndrcvinfo->sinfo_context;
- }
-#endif
}
+#endif
}
+ }
- if (n <= 0)
- {
+ if (n <= 0) {
if (n < 0)
ret = n;
break;
- }
+ }
- if (msg.msg_flags & MSG_NOTIFICATION)
- {
+ if (msg.msg_flags & MSG_NOTIFICATION) {
snp = (union sctp_notification*) out;
- if (snp->sn_header.sn_type == SCTP_SENDER_DRY_EVENT)
- {
+ if (snp->sn_header.sn_type == SCTP_SENDER_DRY_EVENT) {
#ifdef SCTP_EVENT
struct sctp_event event;
#else
@@ -1095,13 +1096,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
/* If a message has been delayed until the socket
* is dry, it can be sent now.
*/
- if (data->saved_message.length > 0)
- {
+ if (data->saved_message.length > 0) {
dgram_sctp_write(data->saved_message.bio, data->saved_message.data,
- data->saved_message.length);
+ data->saved_message.length);
OPENSSL_free(data->saved_message.data);
data->saved_message.length = 0;
- }
+ }
/* disable sender dry event */
#ifdef SCTP_EVENT
@@ -1121,7 +1121,7 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe));
OPENSSL_assert(i >= 0);
#endif
- }
+ }
#ifdef SCTP_AUTHENTICATION_EVENT
if (snp->sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
@@ -1132,14 +1132,12 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
data->handle_notifications(b, data->notification_context, (void*) out);
memset(out, 0, outl);
- }
- else
+ } else
ret += n;
- }
+ }
while ((msg.msg_flags & MSG_NOTIFICATION) && (msg.msg_flags & MSG_EOR) && (ret < outl));
- if (ret > 0 && !(msg.msg_flags & MSG_EOR))
- {
+ if (ret > 0 && !(msg.msg_flags & MSG_EOR)) {
/* Partial message read, this should never happen! */
/* The buffer was too small, this means the peer sent
@@ -1159,8 +1157,8 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
* max record size (2^14 + 2048 + 13)
*/
optlen = (socklen_t) sizeof(int);
- ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT,
- &optval, &optlen);
+ ret = getsockopt(b->num, IPPROTO_SCTP,
+ SCTP_PARTIAL_DELIVERY_POINT, &optval, &optlen);
OPENSSL_assert(ret >= 0);
OPENSSL_assert(optval >= 18445);
@@ -1173,21 +1171,18 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
memset(out, 0, outl);
BIO_set_retry_read(b);
return -1;
- }
+ }
BIO_clear_retry_flags(b);
- if (ret < 0)
- {
- if (BIO_dgram_should_retry(ret))
- {
+ if (ret < 0) {
+ if (BIO_dgram_should_retry(ret)) {
BIO_set_retry_read(b);
data->_errno = errno;
- }
}
+ }
/* Test if peer uses SCTP-AUTH before continuing */
- if (!data->peer_auth_tested)
- {
+ if (!data->peer_auth_tested) {
int ii, auth_data = 0, auth_forward = 0;
unsigned char *p;
struct sctp_authchunks *authchunks;
@@ -1199,29 +1194,30 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
OPENSSL_assert(ii >= 0);
for (p = (unsigned char*) authchunks->gauth_chunks;
- p < (unsigned char*) authchunks + optlen;
- p += sizeof(uint8_t))
- {
- if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) auth_data = 1;
- if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) auth_forward = 1;
- }
+ p < (unsigned char*) authchunks + optlen;
+ p += sizeof(uint8_t)) {
+ if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE)
+ auth_data = 1;
+ if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE)
+ auth_forward = 1;
+ }
OPENSSL_free(authchunks);
- if (!auth_data || !auth_forward)
- {
- BIOerr(BIO_F_DGRAM_SCTP_READ,BIO_R_CONNECT_ERROR);
+ if (!auth_data || !auth_forward) {
+ BIOerr(BIO_F_DGRAM_SCTP_READ, BIO_R_CONNECT_ERROR);
return -1;
- }
+ }
data->peer_auth_tested = 1;
- }
}
- return(ret);
}
+ return (ret);
+}
-static int dgram_sctp_write(BIO *b, const char *in, int inl)
- {
+static int
+dgram_sctp_write(BIO *b, const char *in, int inl)
+{
int ret;
bio_dgram_sctp_data *data = (bio_dgram_sctp_data *)b->ptr;
struct bio_dgram_sctp_sndinfo *sinfo = &(data->sndinfo);
@@ -1256,8 +1252,7 @@ static int dgram_sctp_write(BIO *b, const char *in, int inl)
* socket is not dry yet, we have to save it and send it
* as soon as the socket gets dry.
*/
- if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b))
- {
+ if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) {
data->saved_message.bio = b;
data->saved_message.length = inl;
data->saved_message.data = OPENSSL_malloc(inl);
@@ -1317,20 +1312,20 @@ static int dgram_sctp_write(BIO *b, const char *in, int inl)
ret = sendmsg(b->num, &msg, 0);
BIO_clear_retry_flags(b);
- if (ret <= 0)
- {
- if (BIO_dgram_should_retry(ret))
- {
- BIO_set_retry_write(b);
+ if (ret <= 0) {
+ if (BIO_dgram_should_retry(ret)) {
+ BIO_set_retry_write(b);
+
data->_errno = errno;
- }
}
- return(ret);
}
+ return (ret);
+}
-static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
- {
- long ret=1;
+static long
+dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
+{
+ long ret = 1;
bio_dgram_sctp_data *data = NULL;
socklen_t sockopt_len = 0;
struct sctp_authkeyid authkeyid;
@@ -1338,8 +1333,7 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
data = (bio_dgram_sctp_data *)b->ptr;
- switch (cmd)
- {
+ switch (cmd) {
case BIO_CTRL_DGRAM_QUERY_MTU:
/* Set to maximum (2^14)
* and ignore user input to enable transport
@@ -1384,7 +1378,8 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
/* Get active key */
sockopt_len = sizeof(struct sctp_authkeyid);
ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len);
- if (ret < 0) break;
+ if (ret < 0)
+ break;
/* Add new key */
sockopt_len = sizeof(struct sctp_authkey) + 64 * sizeof(uint8_t);
@@ -1400,12 +1395,14 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
memcpy(&authkey->sca_key[0], ptr, 64 * sizeof(uint8_t));
ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_KEY, authkey, sockopt_len);
- if (ret < 0) break;
+ if (ret < 0)
+ break;
/* Reset active key */
ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY,
- &authkeyid, sizeof(struct sctp_authkeyid));
- if (ret < 0) break;
+ &authkeyid, sizeof(struct sctp_authkeyid));
+ if (ret < 0)
+ break;
break;
case BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY:
@@ -1414,13 +1411,15 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
/* Get active key */
sockopt_len = sizeof(struct sctp_authkeyid);
ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len);
- if (ret < 0) break;
+ if (ret < 0)
+ break;
/* Set active key */
authkeyid.scact_keynumber = authkeyid.scact_keynumber + 1;
ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY,
- &authkeyid, sizeof(struct sctp_authkeyid));
- if (ret < 0) break;
+ &authkeyid, sizeof(struct sctp_authkeyid));
+ if (ret < 0)
+ break;
/* CCS has been sent, so remember that and fall through
* to check if we need to deactivate an old key
@@ -1435,12 +1434,12 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
data->ccs_rcvd = 1;
/* CSS has been both, received and sent, so deactivate an old key */
- if (data->ccs_rcvd == 1 && data->ccs_sent == 1)
- {
+ if (data->ccs_rcvd == 1 && data->ccs_sent == 1) {
/* Get active key */
sockopt_len = sizeof(struct sctp_authkeyid);
ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid, &sockopt_len);
- if (ret < 0) break;
+ if (ret < 0)
+ break;
/* Deactivate key or delete second last key if
* SCTP_AUTHENTICATION_EVENT is not available.
@@ -1449,22 +1448,23 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
#ifdef SCTP_AUTH_DEACTIVATE_KEY
sockopt_len = sizeof(struct sctp_authkeyid);
ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY,
- &authkeyid, sockopt_len);
- if (ret < 0) break;
+ &authkeyid, sockopt_len);
+ if (ret < 0)
+ break;
#endif
#ifndef SCTP_AUTHENTICATION_EVENT
- if (authkeyid.scact_keynumber > 0)
- {
+ if (authkeyid.scact_keynumber > 0) {
authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1;
ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY,
- &authkeyid, sizeof(struct sctp_authkeyid));
- if (ret < 0) break;
- }
+ &authkeyid, sizeof(struct sctp_authkeyid));
+ if (ret < 0)
+ break;
+ }
#endif
data->ccs_rcvd = 0;
data->ccs_sent = 0;
- }
+ }
break;
case BIO_CTRL_DGRAM_SCTP_GET_SNDINFO:
/* Returns the size of the copied struct. */
@@ -1524,30 +1524,30 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
/* Pass to default ctrl function to
* process SCTP unspecific commands
*/
- ret=dgram_ctrl(b, cmd, num, ptr);
+ ret = dgram_ctrl(b, cmd, num, ptr);
break;
- }
- return(ret);
}
+ return (ret);
+}
-int BIO_dgram_sctp_notification_cb(BIO *b,
- void (*handle_notifications)(BIO *bio, void *context, void *buf),
- void *context)
- {
+int
+BIO_dgram_sctp_notification_cb(BIO *b,
+ void (*handle_notifications)(BIO *bio, void *context, void *buf),
+ void *context)
+{
bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
- if (handle_notifications != NULL)
- {
+ if (handle_notifications != NULL) {
data->handle_notifications = handle_notifications;
data->notification_context = context;
- }
- else
+ } else
return -1;
return 0;
- }
+}
-int BIO_dgram_sctp_wait_for_dry(BIO *b)
+int
+BIO_dgram_sctp_wait_for_dry(BIO *b)
{
int is_dry = 0;
int n, sockflags, ret;
@@ -1574,9 +1574,9 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize);
if (ret < 0)
return -1;
-
+
event.sctp_sender_dry_event = 1;
-
+
ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe));
#endif
if (ret < 0)
@@ -1595,17 +1595,15 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
msg.msg_flags = 0;
n = recvmsg(b->num, &msg, MSG_PEEK);
- if (n <= 0)
- {
+ if (n <= 0) {
if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK))
return -1;
else
return 0;
- }
+ }
/* if we find a notification, process it and try again if necessary */
- while (msg.msg_flags & MSG_NOTIFICATION)
- {
+ while (msg.msg_flags & MSG_NOTIFICATION) {
memset(&snp, 0x00, sizeof(union sctp_notification));
iov.iov_base = (char *)&snp;
iov.iov_len = sizeof(union sctp_notification);
@@ -1618,16 +1616,14 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
msg.msg_flags = 0;
n = recvmsg(b->num, &msg, 0);
- if (n <= 0)
- {
+ if (n <= 0) {
if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK))
return -1;
else
return is_dry;
- }
-
- if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT)
- {
+ }
+
+ if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) {
is_dry = 1;
/* disable sender dry event */
@@ -1649,7 +1645,7 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
#endif
if (ret < 0)
return -1;
- }
+ }
#ifdef SCTP_AUTHENTICATION_EVENT
if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
@@ -1672,34 +1668,32 @@ int BIO_dgram_sctp_wait_for_dry(BIO *b)
msg.msg_flags = 0;
/* if we have seen the dry already, don't wait */
- if (is_dry)
- {
+ if (is_dry) {
sockflags = fcntl(b->num, F_GETFL, 0);
fcntl(b->num, F_SETFL, O_NONBLOCK);
- }
+ }
n = recvmsg(b->num, &msg, MSG_PEEK);
- if (is_dry)
- {
+ if (is_dry) {
fcntl(b->num, F_SETFL, sockflags);
- }
+ }
- if (n <= 0)
- {
+ if (n <= 0) {
if ((n < 0) && (errno != EAGAIN) && (errno != EWOULDBLOCK))
return -1;
else
return is_dry;
- }
}
+ }
/* read anything else */
return is_dry;
}
-int BIO_dgram_sctp_msg_waiting(BIO *b)
- {
+int
+BIO_dgram_sctp_msg_waiting(BIO *b)
+{
int n, sockflags;
union sctp_notification snp;
struct msghdr msg;
@@ -1708,7 +1702,7 @@ int BIO_dgram_sctp_msg_waiting(BIO *b)
/* Check if there are any messages waiting to be read */
do
- {
+ {
memset(&snp, 0x00, sizeof(union sctp_notification));
iov.iov_base = (char *)&snp;
iov.iov_len = sizeof(union sctp_notification);
@@ -1726,8 +1720,7 @@ int BIO_dgram_sctp_msg_waiting(BIO *b)
fcntl(b->num, F_SETFL, sockflags);
/* if notification, process and try again */
- if (n > 0 && (msg.msg_flags & MSG_NOTIFICATION))
- {
+ if (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)) {
#ifdef SCTP_AUTHENTICATION_EVENT
if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
dgram_sctp_handle_auth_free_key_event(b, &snp);
@@ -1747,34 +1740,35 @@ int BIO_dgram_sctp_msg_waiting(BIO *b)
if (data->handle_notifications != NULL)
data->handle_notifications(b, data->notification_context, (void*) &snp);
- }
+ }
- } while (n > 0 && (msg.msg_flags & MSG_NOTIFICATION));
+ } while (n > 0 && (msg.msg_flags & MSG_NOTIFICATION));
/* Return 1 if there is a message to be read, return 0 otherwise. */
if (n > 0)
return 1;
else
return 0;
- }
+}
-static int dgram_sctp_puts(BIO *bp, const char *str)
- {
- int n,ret;
+static int
+dgram_sctp_puts(BIO *bp, const char *str)
+{
+ int n, ret;
- n=strlen(str);
- ret=dgram_sctp_write(bp,str,n);
- return(ret);
- }
+ n = strlen(str);
+ ret = dgram_sctp_write(bp, str, n);
+ return (ret);
+}
#endif
-static int BIO_dgram_should_retry(int i)
- {
+static int
+BIO_dgram_should_retry(int i)
+{
int err;
- if ((i == 0) || (i == -1))
- {
- err=errno;
+ if ((i == 0) || (i == -1)) {
+ err = errno;
#if defined(OPENSSL_SYS_WINDOWS)
/* If the socket return value (i) is -1
@@ -1785,15 +1779,15 @@ static int BIO_dgram_should_retry(int i)
*/
#endif
- return(BIO_dgram_non_fatal_error(err));
- }
- return(0);
+ return (BIO_dgram_non_fatal_error(err));
}
+ return (0);
+}
-int BIO_dgram_non_fatal_error(int err)
- {
- switch (err)
- {
+int
+BIO_dgram_non_fatal_error(int err)
+{
+ switch (err) {
#if defined(OPENSSL_SYS_WINDOWS)
# if defined(WSAEWOULDBLOCK)
case WSAEWOULDBLOCK:
@@ -1838,17 +1832,17 @@ int BIO_dgram_non_fatal_error(int err)
case EALREADY:
#endif
- return(1);
+ return (1);
/* break; */
default:
break;
- }
- return(0);
}
+ return (0);
+}
-static void get_current_time(struct timeval *t)
- {
+static void
+get_current_time(struct timeval *t) {
gettimeofday(t, NULL);
- }
+}
#endif