netmgr: stop DNS listening, pt 2
This commit is contained in:
committed by
Ondřej Surý
parent
24751997c4
commit
c86c24f69c
@@ -278,6 +278,8 @@ struct isc_nmsocket {
|
||||
isc_nmsocket_type type;
|
||||
isc_nm_t * mgr;
|
||||
isc_nmsocket_t * parent;
|
||||
/* outer socket is for 'wrapped' sockets - e.g. tcpdns in tcp */
|
||||
isc_nmsocket_t * outer;
|
||||
isc_nmsocket_t * children;
|
||||
int nchildren;
|
||||
isc_nmiface_t * iface;
|
||||
|
||||
@@ -389,6 +389,11 @@ isc__nmsocket_destroy(isc_nmsocket_t *socket, bool dofree) {
|
||||
isc__nmsocket_destroy(&socket->children[i], false);
|
||||
}
|
||||
|
||||
if (VALID_NMHANDLE(&socket->tcphandle) && socket->tcphandle.dofree != NULL) {
|
||||
socket->tcphandle.dofree(socket->tcphandle.opaque);
|
||||
}
|
||||
socket->tcphandle = (isc_nmhandle_t) {};
|
||||
|
||||
ck_stack_entry_t *se;
|
||||
while ((se = ck_stack_pop_mpmc(&socket->inactivehandles)) != NULL) {
|
||||
isc_nmhandle_t *handle = nm_handle_is_get(se);
|
||||
@@ -667,8 +672,13 @@ isc_nmhandle_detach(isc_nmhandle_t **handlep) {
|
||||
|
||||
bool reuse = false;
|
||||
if (atomic_load(&socket->active)) {
|
||||
reuse = ck_stack_trypush_mpmc(&socket->inactivehandles,
|
||||
&handle->ilink);
|
||||
if (handle != &socket->tcphandle) {
|
||||
reuse = ck_stack_trypush_mpmc(
|
||||
&socket->inactivehandles,
|
||||
&handle->ilink);
|
||||
} else {
|
||||
reuse = true;
|
||||
}
|
||||
}
|
||||
|
||||
isc_mutex_unlock(&socket->lock);
|
||||
|
||||
@@ -308,6 +308,7 @@ read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t*buf) {
|
||||
INSIST(buf != NULL);
|
||||
if (nread < 0) {
|
||||
isc__nm_free_uvbuf(socket, buf);
|
||||
socket->rcb.recv(socket->rcbarg, &socket->tcphandle, NULL);
|
||||
/* XXXWPK TODO clean up handles! */
|
||||
return;
|
||||
}
|
||||
@@ -358,6 +359,7 @@ tcp_connection_cb(uv_stream_t *server, int status) {
|
||||
INSIST(result == ISC_R_SUCCESS);
|
||||
isc_nmhandle_t *handle = isc__nmhandle_get(csocket, &peer);
|
||||
ssocket->rcb.accept(handle, ISC_R_SUCCESS, ssocket->rcbarg);
|
||||
isc_nmsocket_detach(&csocket);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -52,11 +52,11 @@ dnslisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
|
||||
sizeof(*dnssocket));
|
||||
isc__nmsocket_init(dnssocket, handle->socket->mgr,
|
||||
isc_nm_tcpdnssocket);
|
||||
/* We need to copy read callbacks from parent socket */
|
||||
/* We need to copy read callbacks from outer socket */
|
||||
dnssocket->rcb.recv = dnslistensocket->rcb.recv;
|
||||
dnssocket->rcbarg = dnslistensocket->rcbarg;
|
||||
dnssocket->extrahandlesize = dnslistensocket->extrahandlesize;
|
||||
isc_nmsocket_attach(handle->socket, &dnssocket->parent);
|
||||
isc_nmsocket_attach(handle->socket, &dnssocket->outer);
|
||||
isc_nm_read(handle, dnslisten_readcb, dnssocket);
|
||||
}
|
||||
|
||||
@@ -65,18 +65,26 @@ dnslisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
|
||||
* a complete DNS packet and, if so - call the callback
|
||||
*/
|
||||
static void
|
||||
dnslisten_readcb(void *arg, isc_nmhandle_t*handle, isc_region_t *region) {
|
||||
dnslisten_readcb(void *arg, isc_nmhandle_t *handle, isc_region_t *region) {
|
||||
/* A 'wrapper' handle */
|
||||
(void)handle;
|
||||
isc_nmsocket_t *dnssocket = (isc_nmsocket_t*) arg;
|
||||
if (region == NULL) {
|
||||
/* Connection closed */
|
||||
isc_nmhandle_detach(&handle);
|
||||
isc_nmsocket_detach(&dnssocket->outer);
|
||||
isc_nmsocket_detach(&dnssocket);
|
||||
return;
|
||||
}
|
||||
isc_nmhandle_t *dnshandle =
|
||||
isc__nmhandle_get(dnssocket, &handle->peer);
|
||||
/* XXXWPK for the love of all that is holy fix it, that's so wrong */
|
||||
INSIST(((region->base[0] << 8) + (region->base[1]) ==
|
||||
(int) region->length - 2));
|
||||
isc_nmhandle_t *dnshandle =
|
||||
isc__nmhandle_get(dnssocket, &handle->peer);
|
||||
isc_region_t r2 =
|
||||
{.base = region->base + 2, .length = region->length - 2};
|
||||
dnssocket->rcb.recv(dnssocket->rcbarg, dnshandle, &r2);
|
||||
isc_nmhandle_detach(&dnshandle);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -94,7 +102,7 @@ isc_nm_tcp_dnslisten(isc_nm_t *mgr,
|
||||
{
|
||||
isc_result_t result;
|
||||
|
||||
/* A 'wrapper' socket object with parent set to true TCP socket */
|
||||
/* A 'wrapper' socket object with outer set to true TCP socket */
|
||||
isc_nmsocket_t *dnslistensocket =
|
||||
isc_mem_get(mgr->mctx, sizeof(*dnslistensocket));
|
||||
isc__nmsocket_init(dnslistensocket, mgr, isc_nm_tcpdnslistener);
|
||||
@@ -103,13 +111,13 @@ isc_nm_tcp_dnslisten(isc_nm_t *mgr,
|
||||
dnslistensocket->rcbarg = cbarg;
|
||||
dnslistensocket->extrahandlesize = extrahandlesize;
|
||||
|
||||
/* We set dnslistensocket->parent to a true listening socket */
|
||||
/* We set dnslistensocket->outer to a true listening socket */
|
||||
result = isc_nm_tcp_listen(mgr,
|
||||
iface,
|
||||
dnslisten_acceptcb,
|
||||
extrahandlesize,
|
||||
dnslistensocket,
|
||||
&dnslistensocket->parent);
|
||||
&dnslistensocket->outer);
|
||||
dnslistensocket->listening = true;
|
||||
*rv = dnslistensocket;
|
||||
return (result);
|
||||
@@ -117,9 +125,9 @@ isc_nm_tcp_dnslisten(isc_nm_t *mgr,
|
||||
|
||||
void
|
||||
isc_nm_tcpdns_stoplistening(isc_nmsocket_t *socket) {
|
||||
isc_nm_tcp_stoplistening(socket->parent);
|
||||
isc_nm_tcp_stoplistening(socket->outer);
|
||||
atomic_store(&socket->listening, false);
|
||||
isc_nmsocket_detach(&socket->parent);
|
||||
isc_nmsocket_detach(&socket->outer);
|
||||
}
|
||||
|
||||
|
||||
@@ -136,6 +144,7 @@ tcpdnssend_cb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
|
||||
tcpsend_t *ts = (tcpsend_t *) cbarg;
|
||||
(void) handle;
|
||||
ts->cb(ts->orighandle, result, ts->cbarg);
|
||||
isc_nmhandle_detach(&ts->orighandle);
|
||||
}
|
||||
/*
|
||||
* isc__nm_tcp_send sends buf to a peer on a socket.
|
||||
@@ -151,7 +160,7 @@ isc__nm_tcpdns_send(isc_nmhandle_t *handle,
|
||||
INSIST(socket->type == isc_nm_tcpdnssocket);
|
||||
tcpsend_t *t = malloc(sizeof(*t));
|
||||
*t = (tcpsend_t) {};
|
||||
t->handle = &handle->socket->parent->tcphandle;
|
||||
t->handle = &handle->socket->outer->tcphandle;
|
||||
t->cb = cb;
|
||||
t->cbarg = cbarg;
|
||||
t->region =
|
||||
|
||||
Reference in New Issue
Block a user