mirror of
https://github.com/isc-projects/bind9.git
synced 2026-05-28 04:34:54 -04:00
libdns refactoring: get rid of multiple versions of dns_dispatch_createtcp and dns_dispatch_addresponse, unify dns_dispatch_gettcp and dns_dispatch_gettcp2
This commit is contained in:
parent
275a6a3bec
commit
e20b702418
6 changed files with 58 additions and 165 deletions
|
|
@ -2496,28 +2496,12 @@ dispatch_free(dns_dispatch_t **dispp) {
|
|||
|
||||
isc_result_t
|
||||
dns_dispatch_createtcp(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
|
||||
isc_taskmgr_t *taskmgr, unsigned int buffersize,
|
||||
isc_taskmgr_t *taskmgr, const isc_sockaddr_t *localaddr,
|
||||
const isc_sockaddr_t *destaddr, unsigned int buffersize,
|
||||
unsigned int maxbuffers, unsigned int maxrequests,
|
||||
unsigned int buckets, unsigned int increment,
|
||||
unsigned int attributes, dns_dispatch_t **dispp)
|
||||
{
|
||||
|
||||
attributes |= DNS_DISPATCHATTR_PRIVATE; /* XXXMLG */
|
||||
|
||||
return (dns_dispatch_createtcp2(mgr, sock, taskmgr, NULL, NULL,
|
||||
buffersize, maxbuffers, maxrequests,
|
||||
buckets, increment, attributes,
|
||||
dispp));
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_createtcp2(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
|
||||
isc_taskmgr_t *taskmgr, const isc_sockaddr_t *localaddr,
|
||||
const isc_sockaddr_t *destaddr, unsigned int buffersize,
|
||||
unsigned int maxbuffers, unsigned int maxrequests,
|
||||
unsigned int buckets, unsigned int increment,
|
||||
unsigned int attributes, dns_dispatch_t **dispp)
|
||||
{
|
||||
isc_result_t result;
|
||||
dns_dispatch_t *disp;
|
||||
|
||||
|
|
@ -2623,7 +2607,8 @@ dns_dispatch_createtcp2(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
|
|||
|
||||
isc_result_t
|
||||
dns_dispatch_gettcp(dns_dispatchmgr_t *mgr, const isc_sockaddr_t *destaddr,
|
||||
const isc_sockaddr_t *localaddr, dns_dispatch_t **dispp)
|
||||
const isc_sockaddr_t *localaddr, isc_boolean_t *connected,
|
||||
dns_dispatch_t **dispp)
|
||||
{
|
||||
dns_dispatch_t *disp;
|
||||
isc_result_t result;
|
||||
|
|
@ -2636,6 +2621,7 @@ dns_dispatch_gettcp(dns_dispatchmgr_t *mgr, const isc_sockaddr_t *destaddr,
|
|||
REQUIRE(destaddr != NULL);
|
||||
REQUIRE(dispp != NULL && *dispp == NULL);
|
||||
|
||||
/* First pass */
|
||||
attributes = DNS_DISPATCHATTR_TCP | DNS_DISPATCHATTR_CONNECTED;
|
||||
mask = DNS_DISPATCHATTR_TCP | DNS_DISPATCHATTR_PRIVATE |
|
||||
DNS_DISPATCHATTR_EXCLUSIVE | DNS_DISPATCHATTR_CONNECTED;
|
||||
|
|
@ -2661,70 +2647,20 @@ dns_dispatch_gettcp(dns_dispatchmgr_t *mgr, const isc_sockaddr_t *destaddr,
|
|||
disp->refcount++;
|
||||
*dispp = disp;
|
||||
match = ISC_TRUE;
|
||||
if (connected != NULL) {
|
||||
*connected = ISC_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
UNLOCK(&disp->lock);
|
||||
disp = ISC_LIST_NEXT(disp, link);
|
||||
}
|
||||
UNLOCK(&mgr->lock);
|
||||
return (match ? ISC_R_SUCCESS : ISC_R_NOTFOUND);
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_gettcp2(dns_dispatchmgr_t *mgr, const isc_sockaddr_t *destaddr,
|
||||
const isc_sockaddr_t *localaddr, isc_boolean_t *connected,
|
||||
dns_dispatch_t **dispp)
|
||||
{
|
||||
dns_dispatch_t *disp;
|
||||
isc_result_t result;
|
||||
isc_sockaddr_t peeraddr;
|
||||
isc_sockaddr_t sockname;
|
||||
unsigned int attributes, mask;
|
||||
isc_boolean_t match = ISC_FALSE;
|
||||
|
||||
REQUIRE(VALID_DISPATCHMGR(mgr));
|
||||
REQUIRE(destaddr != NULL);
|
||||
REQUIRE(dispp != NULL && *dispp == NULL);
|
||||
REQUIRE(connected != NULL);
|
||||
|
||||
/* First pass (same as dns_dispatch_gettcp()) */
|
||||
attributes = DNS_DISPATCHATTR_TCP | DNS_DISPATCHATTR_CONNECTED;
|
||||
mask = DNS_DISPATCHATTR_TCP | DNS_DISPATCHATTR_PRIVATE |
|
||||
DNS_DISPATCHATTR_EXCLUSIVE | DNS_DISPATCHATTR_CONNECTED;
|
||||
|
||||
LOCK(&mgr->lock);
|
||||
disp = ISC_LIST_HEAD(mgr->list);
|
||||
while (disp != NULL && !match) {
|
||||
LOCK(&disp->lock);
|
||||
if ((disp->shutting_down == 0) &&
|
||||
ATTRMATCH(disp->attributes, attributes, mask) &&
|
||||
(localaddr == NULL ||
|
||||
isc_sockaddr_eqaddr(localaddr, &disp->local))) {
|
||||
result = isc_socket_getsockname(disp->socket,
|
||||
&sockname);
|
||||
if (result == ISC_R_SUCCESS)
|
||||
result = isc_socket_getpeername(disp->socket,
|
||||
&peeraddr);
|
||||
if (result == ISC_R_SUCCESS &&
|
||||
isc_sockaddr_equal(destaddr, &peeraddr) &&
|
||||
(localaddr == NULL ||
|
||||
isc_sockaddr_eqaddr(localaddr, &sockname))) {
|
||||
/* attach */
|
||||
disp->refcount++;
|
||||
*dispp = disp;
|
||||
match = ISC_TRUE;
|
||||
*connected = ISC_TRUE;
|
||||
}
|
||||
}
|
||||
UNLOCK(&disp->lock);
|
||||
disp = ISC_LIST_NEXT(disp, link);
|
||||
}
|
||||
if (match) {
|
||||
if (match || connected == NULL) {
|
||||
UNLOCK(&mgr->lock);
|
||||
return (ISC_R_SUCCESS);
|
||||
return (match ? ISC_R_SUCCESS : ISC_R_NOTFOUND);
|
||||
}
|
||||
|
||||
/* Second pass */
|
||||
/* Second pass, only if connected != NULL */
|
||||
attributes = DNS_DISPATCHATTR_TCP;
|
||||
|
||||
disp = ISC_LIST_HEAD(mgr->list);
|
||||
|
|
@ -3175,21 +3111,11 @@ dns_dispatch_detach(dns_dispatch_t **dispp) {
|
|||
}
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_addresponse2(dns_dispatch_t *disp, const isc_sockaddr_t *dest,
|
||||
isc_task_t *task, isc_taskaction_t action, void *arg,
|
||||
dns_messageid_t *idp, dns_dispentry_t **resp,
|
||||
isc_socketmgr_t *sockmgr)
|
||||
{
|
||||
return (dns_dispatch_addresponse3(disp, 0, dest, task, action, arg,
|
||||
idp, resp, sockmgr));
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_addresponse3(dns_dispatch_t *disp, unsigned int options,
|
||||
const isc_sockaddr_t *dest, isc_task_t *task,
|
||||
isc_taskaction_t action, void *arg,
|
||||
dns_messageid_t *idp, dns_dispentry_t **resp,
|
||||
isc_socketmgr_t *sockmgr)
|
||||
dns_dispatch_addresponse(dns_dispatch_t *disp, unsigned int options,
|
||||
const isc_sockaddr_t *dest, isc_task_t *task,
|
||||
isc_taskaction_t action, void *arg,
|
||||
dns_messageid_t *idp, dns_dispentry_t **resp,
|
||||
isc_socketmgr_t *sockmgr)
|
||||
{
|
||||
dns_dispentry_t *res;
|
||||
unsigned int bucket;
|
||||
|
|
@ -3383,18 +3309,6 @@ dns_dispatch_addresponse3(dns_dispatch_t *disp, unsigned int options,
|
|||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_addresponse(dns_dispatch_t *disp, const isc_sockaddr_t *dest,
|
||||
isc_task_t *task, isc_taskaction_t action, void *arg,
|
||||
dns_messageid_t *idp, dns_dispentry_t **resp)
|
||||
{
|
||||
REQUIRE(VALID_DISPATCH(disp));
|
||||
REQUIRE((disp->attributes & DNS_DISPATCHATTR_EXCLUSIVE) == 0);
|
||||
|
||||
return (dns_dispatch_addresponse3(disp, 0, dest, task, action, arg,
|
||||
idp, resp, NULL));
|
||||
}
|
||||
|
||||
void
|
||||
dns_dispatch_starttcp(dns_dispatch_t *disp) {
|
||||
|
||||
|
|
|
|||
|
|
@ -290,17 +290,11 @@ dns_dispatch_getudp_dup(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr,
|
|||
|
||||
isc_result_t
|
||||
dns_dispatch_createtcp(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
|
||||
isc_taskmgr_t *taskmgr, unsigned int buffersize,
|
||||
isc_taskmgr_t *taskmgr, const isc_sockaddr_t *localaddr,
|
||||
const isc_sockaddr_t *destaddr, unsigned int buffersize,
|
||||
unsigned int maxbuffers, unsigned int maxrequests,
|
||||
unsigned int buckets, unsigned int increment,
|
||||
unsigned int attributes, dns_dispatch_t **dispp);
|
||||
isc_result_t
|
||||
dns_dispatch_createtcp2(dns_dispatchmgr_t *mgr, isc_socket_t *sock,
|
||||
isc_taskmgr_t *taskmgr, const isc_sockaddr_t *localaddr,
|
||||
const isc_sockaddr_t *destaddr, unsigned int buffersize,
|
||||
unsigned int maxbuffers, unsigned int maxrequests,
|
||||
unsigned int buckets, unsigned int increment,
|
||||
unsigned int attributes, dns_dispatch_t **dispp);
|
||||
/*%<
|
||||
* Create a new dns_dispatch and attach it to the provided isc_socket_t.
|
||||
*
|
||||
|
|
@ -374,34 +368,20 @@ dns_dispatch_starttcp(dns_dispatch_t *disp);
|
|||
|
||||
isc_result_t
|
||||
dns_dispatch_gettcp(dns_dispatchmgr_t *mgr, const isc_sockaddr_t *destaddr,
|
||||
const isc_sockaddr_t *localaddr, dns_dispatch_t **dispp);
|
||||
isc_result_t
|
||||
dns_dispatch_gettcp2(dns_dispatchmgr_t *mgr, const isc_sockaddr_t *destaddr,
|
||||
const isc_sockaddr_t *localaddr, isc_boolean_t *connected,
|
||||
dns_dispatch_t **dispp);
|
||||
/*
|
||||
* Attempt to connect to a existing TCP connection (connection completed
|
||||
* for dns_dispatch_gettcp()).
|
||||
* if connected == NULL).
|
||||
*/
|
||||
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_addresponse3(dns_dispatch_t *disp, unsigned int options,
|
||||
const isc_sockaddr_t *dest, isc_task_t *task,
|
||||
isc_taskaction_t action, void *arg,
|
||||
isc_uint16_t *idp, dns_dispentry_t **resp,
|
||||
isc_socketmgr_t *sockmgr);
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_addresponse2(dns_dispatch_t *disp, const isc_sockaddr_t *dest,
|
||||
isc_task_t *task, isc_taskaction_t action, void *arg,
|
||||
isc_uint16_t *idp, dns_dispentry_t **resp,
|
||||
isc_socketmgr_t *sockmgr);
|
||||
|
||||
isc_result_t
|
||||
dns_dispatch_addresponse(dns_dispatch_t *disp, const isc_sockaddr_t *dest,
|
||||
isc_task_t *task, isc_taskaction_t action, void *arg,
|
||||
isc_uint16_t *idp, dns_dispentry_t **resp);
|
||||
dns_dispatch_addresponse(dns_dispatch_t *disp, unsigned int options,
|
||||
const isc_sockaddr_t *dest, isc_task_t *task,
|
||||
isc_taskaction_t action, void *arg,
|
||||
isc_uint16_t *idp, dns_dispentry_t **resp,
|
||||
isc_socketmgr_t *sockmgr);
|
||||
/*%<
|
||||
* Add a response entry for this dispatch.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -534,9 +534,9 @@ create_tcp_dispatch(isc_boolean_t newtcp, isc_boolean_t share,
|
|||
isc_sockaddr_t bind_any;
|
||||
|
||||
if (!newtcp && share) {
|
||||
result = dns_dispatch_gettcp2(requestmgr->dispatchmgr,
|
||||
destaddr, srcaddr,
|
||||
connected, dispatchp);
|
||||
result = dns_dispatch_gettcp(requestmgr->dispatchmgr,
|
||||
destaddr, srcaddr,
|
||||
connected, dispatchp);
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
char peer[ISC_SOCKADDR_FORMATSIZE];
|
||||
|
||||
|
|
@ -548,7 +548,7 @@ create_tcp_dispatch(isc_boolean_t newtcp, isc_boolean_t share,
|
|||
}
|
||||
} else if (!newtcp) {
|
||||
result = dns_dispatch_gettcp(requestmgr->dispatchmgr, destaddr,
|
||||
srcaddr, dispatchp);
|
||||
srcaddr, NULL, dispatchp);
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
char peer[ISC_SOCKADDR_FORMATSIZE];
|
||||
|
||||
|
|
@ -588,11 +588,11 @@ create_tcp_dispatch(isc_boolean_t newtcp, isc_boolean_t share,
|
|||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
|
||||
isc_socket_dscp(sock, dscp);
|
||||
result = dns_dispatch_createtcp2(requestmgr->dispatchmgr,
|
||||
sock, requestmgr->taskmgr,
|
||||
srcaddr, destaddr,
|
||||
4096, 32768, 32768, 16411, 16433,
|
||||
attrs, dispatchp);
|
||||
result = dns_dispatch_createtcp(requestmgr->dispatchmgr,
|
||||
sock, requestmgr->taskmgr,
|
||||
srcaddr, destaddr,
|
||||
4096, 32768, 32768, 16411, 16433,
|
||||
attrs, dispatchp);
|
||||
cleanup:
|
||||
isc_socket_detach(&sock);
|
||||
return (result);
|
||||
|
|
@ -832,10 +832,10 @@ dns_request_createraw4(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
|
|||
dispopt |= DNS_DISPATCHOPT_FIXEDID;
|
||||
}
|
||||
|
||||
result = dns_dispatch_addresponse3(request->dispatch, dispopt,
|
||||
destaddr, task, req_response,
|
||||
request, &id, &request->dispentry,
|
||||
requestmgr->socketmgr);
|
||||
result = dns_dispatch_addresponse(request->dispatch, dispopt,
|
||||
destaddr, task, req_response,
|
||||
request, &id, &request->dispentry,
|
||||
requestmgr->socketmgr);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
if ((options & DNS_REQUESTOPT_FIXEDID) != 0 && !newtcp) {
|
||||
newtcp = ISC_TRUE;
|
||||
|
|
@ -1060,10 +1060,10 @@ dns_request_createvia4(dns_requestmgr_t *requestmgr, dns_message_t *message,
|
|||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
|
||||
result = dns_dispatch_addresponse2(request->dispatch, destaddr, task,
|
||||
req_response, request, &id,
|
||||
&request->dispentry,
|
||||
requestmgr->socketmgr);
|
||||
result = dns_dispatch_addresponse(request->dispatch, 0, destaddr,
|
||||
task, req_response, request, &id,
|
||||
&request->dispentry,
|
||||
requestmgr->socketmgr);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
sock = req_getsocket(request);
|
||||
|
|
|
|||
|
|
@ -2387,14 +2387,15 @@ resquery_send(resquery_t *query) {
|
|||
/*
|
||||
* Get a query id from the dispatch.
|
||||
*/
|
||||
result = dns_dispatch_addresponse2(query->dispatch,
|
||||
&query->addrinfo->sockaddr,
|
||||
task,
|
||||
resquery_response,
|
||||
query,
|
||||
&query->id,
|
||||
&query->dispentry,
|
||||
res->socketmgr);
|
||||
result = dns_dispatch_addresponse(query->dispatch,
|
||||
0,
|
||||
&query->addrinfo->sockaddr,
|
||||
task,
|
||||
resquery_response,
|
||||
query,
|
||||
&query->id,
|
||||
&query->dispentry,
|
||||
res->socketmgr);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup_temps;
|
||||
|
||||
|
|
@ -2932,10 +2933,12 @@ resquery_connected(isc_task_t *task, isc_event_t *event) {
|
|||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
|
||||
result = dns_dispatch_createtcp(query->dispatchmgr,
|
||||
query->tcpsocket,
|
||||
query->fctx->res->taskmgr,
|
||||
4096, 2, 1, 1, 3, attrs,
|
||||
&query->dispatch);
|
||||
query->tcpsocket,
|
||||
query->fctx->res->taskmgr,
|
||||
NULL, NULL,
|
||||
4096, 2, 1, 1, 3,
|
||||
attrs,
|
||||
&query->dispatch);
|
||||
|
||||
/*
|
||||
* Regardless of whether dns_dispatch_create()
|
||||
|
|
|
|||
|
|
@ -294,8 +294,8 @@ ATF_TC_BODY(dispatch_getnext, tc) {
|
|||
result = isc_socket_recv(sock, ®ion, 1, task, nameserver, sock);
|
||||
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
|
||||
|
||||
result = dns_dispatch_addresponse(dispatch, &local, task, response,
|
||||
NULL, &id, &dispentry);
|
||||
result = dns_dispatch_addresponse(dispatch, 0, &local, task, response,
|
||||
NULL, &id, &dispentry, NULL);
|
||||
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
|
||||
|
||||
memset(message, 0, sizeof(message));
|
||||
|
|
|
|||
|
|
@ -269,13 +269,10 @@ dns_difftuple_copy
|
|||
dns_difftuple_create
|
||||
dns_difftuple_free
|
||||
dns_dispatch_addresponse
|
||||
dns_dispatch_addresponse2
|
||||
dns_dispatch_addresponse3
|
||||
dns_dispatch_attach
|
||||
dns_dispatch_cancel
|
||||
dns_dispatch_changeattributes
|
||||
dns_dispatch_createtcp
|
||||
dns_dispatch_createtcp2
|
||||
dns_dispatch_detach
|
||||
dns_dispatch_getattributes
|
||||
dns_dispatch_getdscp
|
||||
|
|
@ -284,7 +281,6 @@ dns_dispatch_getlocaladdress
|
|||
dns_dispatch_getnext
|
||||
dns_dispatch_getsocket
|
||||
dns_dispatch_gettcp
|
||||
dns_dispatch_gettcp2
|
||||
dns_dispatch_getudp
|
||||
dns_dispatch_getudp_dup
|
||||
dns_dispatch_importrecv
|
||||
|
|
|
|||
Loading…
Reference in a new issue