diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index 68055c0f08..f66533154d 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -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) { diff --git a/lib/dns/include/dns/dispatch.h b/lib/dns/include/dns/dispatch.h index d3caf9cfac..44ade7e905 100644 --- a/lib/dns/include/dns/dispatch.h +++ b/lib/dns/include/dns/dispatch.h @@ -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. * diff --git a/lib/dns/request.c b/lib/dns/request.c index a5d522d575..cfc20eb68a 100644 --- a/lib/dns/request.c +++ b/lib/dns/request.c @@ -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); diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index b7b46db2e0..e6352458f1 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -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() diff --git a/lib/dns/tests/dispatch_test.c b/lib/dns/tests/dispatch_test.c index d344c78d36..815241d2d6 100644 --- a/lib/dns/tests/dispatch_test.c +++ b/lib/dns/tests/dispatch_test.c @@ -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)); diff --git a/lib/dns/win32/libdns.def.in b/lib/dns/win32/libdns.def.in index 025808d128..7dc0e2b699 100644 --- a/lib/dns/win32/libdns.def.in +++ b/lib/dns/win32/libdns.def.in @@ -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