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;
isc_result_t
dns_dispatch_gettcp(dns_dispatchmgr_t *mgr, const isc_sockaddr_t *destaddr,
- const isc_sockaddr_t *localaddr, 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);
-
- 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;
- }
- }
- 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)
+ const isc_sockaddr_t *localaddr, isc_boolean_t *connected,
+ dns_dispatch_t **dispp)
{
dns_dispatch_t *disp;
isc_result_t result;
REQUIRE(VALID_DISPATCHMGR(mgr));
REQUIRE(destaddr != NULL);
REQUIRE(dispp != NULL && *dispp == NULL);
- REQUIRE(connected != NULL);
- /* First pass (same as dns_dispatch_gettcp()) */
+ /* First pass */
attributes = DNS_DISPATCHATTR_TCP | DNS_DISPATCHATTR_CONNECTED;
mask = DNS_DISPATCHATTR_TCP | DNS_DISPATCHATTR_PRIVATE |
DNS_DISPATCHATTR_EXCLUSIVE | DNS_DISPATCHATTR_CONNECTED;
disp->refcount++;
*dispp = disp;
match = ISC_TRUE;
- *connected = ISC_TRUE;
+ if (connected != NULL) {
+ *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);
}
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;
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) {
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.
*
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.
*
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];
}
} 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];
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);
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;
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);
/*
* 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;
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()
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));
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
dns_dispatch_getnext
dns_dispatch_getsocket
dns_dispatch_gettcp
-dns_dispatch_gettcp2
dns_dispatch_getudp
dns_dispatch_getudp_dup
dns_dispatch_importrecv