atomic_load(&sock->mgr->closing));
}
-static void
-update_result(isc_nmsocket_t *sock, const isc_result_t result) {
- if (!atomic_load(&sock->tlsstream.result_updated)) {
- atomic_store(&sock->tlsstream.result_updated, true);
- if (!sock->tlsstream.server) {
- LOCK(&sock->lock);
- sock->result = result;
- SIGNAL(&sock->cond);
- while (!atomic_load(&sock->active)) {
- WAIT(&sock->scond, &sock->lock);
- }
- UNLOCK(&sock->lock);
- } else {
- LOCK(&sock->lock);
- sock->result = result;
- UNLOCK(&sock->lock);
- }
- }
-}
-
static void
tls_call_connect_cb(isc_nmsocket_t *sock, isc_nmhandle_t *handle,
const isc_result_t result) {
sock->tlsstream.bio_out);
sock->tlsstream.server = server;
sock->tlsstream.nsending = 0;
+ sock->tlsstream.state = TLS_INIT;
return (ISC_R_SUCCESS);
error:
isc_tls_free(&sock->tlsstream.tls);
tlssock->peer = handle->sock->peer;
tlssock->read_timeout = atomic_load(&handle->sock->mgr->init);
tlssock->tid = isc_nm_tid();
- tlssock->tlsstream.state = TLS_INIT;
tlssock->tlsstream.ctx = tlslistensock->tlsstream.ctx;
}
}
+static void
+tcp_connected(isc_nmhandle_t *handle, isc_result_t result, void *cbarg);
+
void
isc_nm_tlsconnect(isc_nm_t *mgr, isc_nmiface_t *local, isc_nmiface_t *peer,
isc_nm_cb_t cb, void *cbarg, SSL_CTX *ctx,
unsigned int timeout, size_t extrahandlesize) {
- isc_nmsocket_t *nsock = NULL, *tsock = NULL;
- isc__netievent_tlsconnect_t *ievent = NULL;
+ isc_nmsocket_t *nsock = NULL;
#if defined(NETMGR_TRACE) && defined(NETMGR_TRACE_VERBOSE)
fprintf(stderr, "TLS: isc_nm_tlsconnect(): in net thread: %s\n",
isc__nm_in_netthread() ? "yes" : "no");
nsock->connect_timeout = timeout;
nsock->tlsstream.ctx = ctx;
- ievent = isc__nm_get_netievent_tlsconnect(mgr, nsock);
- ievent->local = local->addr;
- ievent->peer = peer->addr;
- ievent->ctx = ctx;
-
- isc__nmsocket_attach(nsock, &tsock);
- if (isc__nm_in_netthread()) {
- atomic_store(&nsock->active, true);
- nsock->tid = isc_nm_tid();
- isc__nm_async_tlsconnect(&mgr->workers[nsock->tid],
- (isc__netievent_t *)ievent);
- isc__nm_put_netievent_tlsconnect(mgr, ievent);
- } else {
- nsock->tid = isc_random_uniform(mgr->nworkers);
- isc__nm_enqueue_ievent(&mgr->workers[nsock->tid],
- (isc__netievent_t *)ievent);
- }
-
- LOCK(&nsock->lock);
- while (nsock->result == ISC_R_DEFAULT) {
- WAIT(&nsock->cond, &nsock->lock);
- }
- atomic_store(&nsock->active, true);
- BROADCAST(&nsock->scond);
- UNLOCK(&nsock->lock);
- INSIST(VALID_NMSOCK(nsock));
- isc__nmsocket_detach(&tsock);
+ isc_nm_tcpconnect(mgr,
+ (isc_nmiface_t *)&nsock->tlsstream.local_iface.addr,
+ (isc_nmiface_t *)&peer->addr, tcp_connected, nsock,
+ nsock->connect_timeout, 0);
}
static void
REQUIRE(VALID_NMSOCK(tlssock));
REQUIRE(VALID_NMHANDLE(handle));
+ tlssock->tid = isc_nm_tid();
if (result != ISC_R_SUCCESS) {
goto error;
}
- result = initialize_tls(tlssock, false);
- if (result != ISC_R_SUCCESS) {
- goto error;
- }
-
- tlssock->peer = isc_nmhandle_peeraddr(handle);
- isc_nmhandle_attach(handle, &tlssock->outerhandle);
-
- tls_do_bio(tlssock, NULL, NULL, false);
- return;
-error:
- tlshandle = isc__nmhandle_get(tlssock, NULL, NULL);
- atomic_store(&tlssock->closed, true);
- tls_call_connect_cb(tlssock, tlshandle, result);
- isc_nmhandle_detach(&tlshandle);
- isc__nmsocket_detach(&tlssock);
-}
-
-void
-isc__nm_async_tlsconnect(isc__networker_t *worker, isc__netievent_t *ev0) {
- isc__netievent_tlsconnect_t *ievent =
- (isc__netievent_tlsconnect_t *)ev0;
- isc_nmsocket_t *tlssock = ievent->sock;
- isc_result_t result;
- isc_nmhandle_t *tlshandle = NULL;
-
- UNUSED(worker);
-
if (isc__nm_closing(tlssock)) {
result = ISC_R_CANCELED;
goto error;
goto error;
}
- tlssock->tid = isc_nm_tid();
- tlssock->tlsstream.state = TLS_INIT;
+ result = initialize_tls(tlssock, false);
+ if (result != ISC_R_SUCCESS) {
+ goto error;
+ }
- isc_nm_tcpconnect(worker->mgr, (isc_nmiface_t *)&ievent->local,
- (isc_nmiface_t *)&ievent->peer, tcp_connected,
- tlssock, tlssock->connect_timeout, 0);
+ tlssock->peer = isc_nmhandle_peeraddr(handle);
+ isc_nmhandle_attach(handle, &tlssock->outerhandle);
+ atomic_store(&tlssock->active, true);
- update_result(tlssock, ISC_R_SUCCESS);
+ tls_do_bio(tlssock, NULL, NULL, false);
return;
-
error:
tlshandle = isc__nmhandle_get(tlssock, NULL, NULL);
atomic_store(&tlssock->closed, true);
tls_call_connect_cb(tlssock, tlshandle, result);
- update_result(tlssock, result);
isc_nmhandle_detach(&tlshandle);
isc__nmsocket_detach(&tlssock);
}