|
|
|
@ -543,13 +543,13 @@ int dtls_verify_cert(struct packet_stream *ps) {
|
|
|
|
|
|
|
|
|
|
static int try_connect(struct dtls_connection *d) {
|
|
|
|
|
int ret, code;
|
|
|
|
|
|
|
|
|
|
if (d->connected)
|
|
|
|
|
return 0;
|
|
|
|
|
unsigned char buf[0x10000];
|
|
|
|
|
|
|
|
|
|
__DBG("try_connect(%i)", d->active);
|
|
|
|
|
|
|
|
|
|
if (d->active)
|
|
|
|
|
if (d->connected)
|
|
|
|
|
ret = SSL_read(d->ssl, buf, sizeof(buf)); /* retransmission after connected - handshake lost */
|
|
|
|
|
else if (d->active)
|
|
|
|
|
ret = SSL_connect(d->ssl);
|
|
|
|
|
else
|
|
|
|
|
ret = SSL_accept(d->ssl);
|
|
|
|
@ -559,13 +559,26 @@ static int try_connect(struct dtls_connection *d) {
|
|
|
|
|
ret = 0;
|
|
|
|
|
switch (code) {
|
|
|
|
|
case SSL_ERROR_NONE:
|
|
|
|
|
ilogs(crypto, LOG_DEBUG, "DTLS handshake successful");
|
|
|
|
|
d->connected = 1;
|
|
|
|
|
ret = 1;
|
|
|
|
|
if (d->connected) {
|
|
|
|
|
ilogs(crypto, LOG_INFO, "DTLS data received after handshake, code: %i", code);
|
|
|
|
|
} else {
|
|
|
|
|
ilogs(crypto, LOG_DEBUG, "DTLS handshake successful");
|
|
|
|
|
d->connected = 1;
|
|
|
|
|
ret = 1;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case SSL_ERROR_WANT_READ:
|
|
|
|
|
case SSL_ERROR_WANT_WRITE:
|
|
|
|
|
if (d->connected) {
|
|
|
|
|
ilogs(crypto, LOG_INFO, "DTLS data received after handshake, code: %i", code);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case SSL_ERROR_ZERO_RETURN:
|
|
|
|
|
if (d->connected) {
|
|
|
|
|
ilogs(crypto, LOG_INFO, "DTLS peer has closed the connection");
|
|
|
|
|
ret = -2;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
@ -801,6 +814,11 @@ int dtls(struct stream_fd *sfd, const str *s, const endpoint_t *fsin) {
|
|
|
|
|
dtls_connection_cleanup(d);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if (ret == -2) {
|
|
|
|
|
/* peer close connection */
|
|
|
|
|
dtls_connection_cleanup(d);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
else if (ret == 1) {
|
|
|
|
|
/* connected! */
|
|
|
|
|
mutex_lock(&ps->out_lock); // nested lock!
|
|
|
|
|