mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-08 21:02:04 -04:00
common code elimination
This commit is contained in:
parent
ab0380976c
commit
7c2dce3c4d
1 changed files with 168 additions and 245 deletions
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: request.c,v 1.50 2001/01/23 02:00:56 bwelling Exp $ */
|
||||
/* $Id: request.c,v 1.51 2001/01/23 07:36:06 marka Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -433,6 +433,156 @@ req_send(dns_request_t *request, isc_task_t *task, isc_sockaddr_t *address) {
|
|||
return (result);
|
||||
}
|
||||
|
||||
static isc_boolean_t
|
||||
isblackholed(dns_dispatchmgr_t *dispatchmgr, isc_sockaddr_t *destaddr) {
|
||||
dns_acl_t *blackhole = NULL;
|
||||
isc_netaddr_t netaddr;
|
||||
int match;
|
||||
isc_boolean_t drop = ISC_FALSE;
|
||||
char netaddrstr[ISC_NETADDR_FORMATSIZE];
|
||||
|
||||
(void)dns_dispatchmgr_getblackhole(dispatchmgr, &blackhole);
|
||||
if (blackhole != NULL) {
|
||||
isc_netaddr_fromsockaddr(&netaddr, destaddr);
|
||||
if (dns_acl_match(&netaddr, NULL, blackhole,
|
||||
NULL, &match, NULL) == ISC_R_SUCCESS &&
|
||||
match > 0)
|
||||
drop = ISC_TRUE;
|
||||
dns_acl_detach(&blackhole);
|
||||
}
|
||||
if (drop) {
|
||||
isc_netaddr_format(&netaddr, netaddrstr, sizeof(netaddrstr));
|
||||
req_log(ISC_LOG_DEBUG(10), "blackholed address %s", netaddrstr);
|
||||
}
|
||||
return (drop);
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
create_tcp_dispatch(dns_requestmgr_t *requestmgr, isc_sockaddr_t *srcaddr,
|
||||
isc_sockaddr_t *destaddr, dns_dispatch_t **dispatchp)
|
||||
{
|
||||
isc_result_t result;
|
||||
isc_socket_t *socket = NULL;
|
||||
isc_sockaddr_t src;
|
||||
unsigned int attrs;
|
||||
isc_sockaddr_t bind_any;
|
||||
|
||||
result = isc_socket_create(requestmgr->socketmgr,
|
||||
isc_sockaddr_pf(destaddr),
|
||||
isc_sockettype_tcp, &socket);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (result);
|
||||
if (srcaddr == NULL) {
|
||||
isc_sockaddr_anyofpf(&bind_any,
|
||||
isc_sockaddr_pf(destaddr));
|
||||
result = isc_socket_bind(socket, &bind_any);
|
||||
} else {
|
||||
src = *srcaddr;
|
||||
isc_sockaddr_setport(&src, 0);
|
||||
result = isc_socket_bind(socket, &src);
|
||||
}
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_TCP;
|
||||
attrs |= DNS_DISPATCHATTR_PRIVATE;
|
||||
if (isc_sockaddr_pf(destaddr) == AF_INET)
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
else
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
result = dns_dispatch_createtcp(requestmgr->dispatchmgr,
|
||||
socket, requestmgr->taskmgr,
|
||||
4096, 2, 1, 1, 3, attrs,
|
||||
dispatchp);
|
||||
cleanup:
|
||||
isc_socket_detach(&socket);
|
||||
return (result);
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
find_udp_dispatch(dns_requestmgr_t *requestmgr, isc_sockaddr_t *srcaddr,
|
||||
isc_sockaddr_t *destaddr, dns_dispatch_t **dispatchp)
|
||||
{
|
||||
dns_dispatch_t *disp = NULL;
|
||||
unsigned int attrs, attrmask;
|
||||
|
||||
if (srcaddr == NULL) {
|
||||
switch (isc_sockaddr_pf(destaddr)) {
|
||||
case PF_INET:
|
||||
disp = requestmgr->dispatchv4;
|
||||
break;
|
||||
|
||||
case PF_INET6:
|
||||
disp = requestmgr->dispatchv6;
|
||||
break;
|
||||
|
||||
default:
|
||||
return (ISC_R_NOTIMPLEMENTED);
|
||||
}
|
||||
if (disp == NULL)
|
||||
return (ISC_R_FAMILYNOSUPPORT);
|
||||
dns_dispatch_attach(disp, dispatchp);
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_UDP;
|
||||
switch (isc_sockaddr_pf(srcaddr)) {
|
||||
case PF_INET:
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
break;
|
||||
|
||||
case PF_INET6:
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
break;
|
||||
|
||||
default:
|
||||
return (ISC_R_NOTIMPLEMENTED);
|
||||
}
|
||||
attrmask = 0;
|
||||
attrmask |= DNS_DISPATCHATTR_UDP;
|
||||
attrmask |= DNS_DISPATCHATTR_TCP;
|
||||
attrmask |= DNS_DISPATCHATTR_IPV4;
|
||||
attrmask |= DNS_DISPATCHATTR_IPV6;
|
||||
return (dns_dispatch_getudp(requestmgr->dispatchmgr,
|
||||
requestmgr->socketmgr,
|
||||
requestmgr->taskmgr,
|
||||
srcaddr, 4096,
|
||||
1000, 32768, 16411, 16433,
|
||||
attrs, attrmask,
|
||||
dispatchp));
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
get_dispatch(isc_boolean_t tcp, dns_requestmgr_t *requestmgr,
|
||||
isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
|
||||
dns_dispatch_t **dispatchp)
|
||||
{
|
||||
isc_result_t result;
|
||||
if (tcp)
|
||||
result = create_tcp_dispatch(requestmgr, srcaddr,
|
||||
destaddr, dispatchp);
|
||||
else
|
||||
result = find_udp_dispatch(requestmgr, srcaddr,
|
||||
destaddr, dispatchp);
|
||||
return (result);
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
set_timer(isc_timer_t *timer, unsigned int timeout) {
|
||||
isc_time_t expires;
|
||||
isc_interval_t interval;
|
||||
isc_result_t result;
|
||||
|
||||
isc_interval_set(&interval, timeout, 0);
|
||||
result = isc_time_nowplusinterval(&expires, &interval);
|
||||
|
||||
if (result == ISC_R_SUCCESS)
|
||||
result = isc_timer_reset(timer, isc_timertype_once, &expires,
|
||||
NULL, ISC_FALSE);
|
||||
return (result);
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
|
||||
isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
|
||||
|
|
@ -445,15 +595,9 @@ dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
|
|||
isc_socket_t *socket = NULL;
|
||||
isc_result_t result;
|
||||
isc_mem_t *mctx;
|
||||
isc_sockaddr_t bind_any;
|
||||
isc_sockaddr_t src;
|
||||
isc_interval_t interval;
|
||||
dns_messageid_t id;
|
||||
isc_time_t expires;
|
||||
unsigned int attrs;
|
||||
isc_boolean_t tcp = ISC_FALSE;
|
||||
isc_region_t r;
|
||||
dns_acl_t *blackhole = NULL;
|
||||
|
||||
REQUIRE(VALID_REQUESTMGR(requestmgr));
|
||||
REQUIRE(msgbuf != NULL);
|
||||
|
|
@ -469,28 +613,8 @@ dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
|
|||
|
||||
req_log(ISC_LOG_DEBUG(3), "dns_request_createraw");
|
||||
|
||||
(void)dns_dispatchmgr_getblackhole(requestmgr->dispatchmgr,
|
||||
&blackhole);
|
||||
if (blackhole != NULL) {
|
||||
isc_netaddr_t netaddr;
|
||||
int match;
|
||||
isc_boolean_t drop = ISC_FALSE;
|
||||
|
||||
isc_netaddr_fromsockaddr(&netaddr, destaddr);
|
||||
if (dns_acl_match(&netaddr, NULL, blackhole,
|
||||
NULL, &match, NULL) == ISC_R_SUCCESS &&
|
||||
match > 0)
|
||||
drop = ISC_TRUE;
|
||||
dns_acl_detach(&blackhole);
|
||||
if (drop) {
|
||||
char netaddrstr[ISC_NETADDR_FORMATSIZE];
|
||||
isc_netaddr_format(&netaddr, netaddrstr,
|
||||
sizeof(netaddrstr));
|
||||
req_log(ISC_LOG_DEBUG(10), "blackholed address %s",
|
||||
netaddrstr);
|
||||
return (DNS_R_BLACKHOLED);
|
||||
}
|
||||
}
|
||||
if (isblackholed(requestmgr->dispatchmgr, destaddr))
|
||||
return (DNS_R_BLACKHOLED);
|
||||
|
||||
request = isc_mem_get(mctx, sizeof(*request));
|
||||
if (request == NULL) {
|
||||
|
|
@ -544,94 +668,11 @@ dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
|
|||
if ((options & DNS_REQUESTOPT_TCP) != 0 || r.length > 512)
|
||||
tcp = ISC_TRUE;
|
||||
|
||||
if (tcp) {
|
||||
result = isc_socket_create(requestmgr->socketmgr,
|
||||
isc_sockaddr_pf(destaddr),
|
||||
isc_sockettype_tcp, &socket);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
if (srcaddr == NULL) {
|
||||
isc_sockaddr_anyofpf(&bind_any,
|
||||
isc_sockaddr_pf(destaddr));
|
||||
result = isc_socket_bind(socket, &bind_any);
|
||||
} else {
|
||||
src = *srcaddr;
|
||||
isc_sockaddr_setport(&src, 0);
|
||||
result = isc_socket_bind(socket, &src);
|
||||
}
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_socket_detach(&socket);
|
||||
goto cleanup;
|
||||
}
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_TCP;
|
||||
attrs |= DNS_DISPATCHATTR_PRIVATE;
|
||||
if (isc_sockaddr_pf(destaddr) == AF_INET)
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
else
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
result = dns_dispatch_createtcp(requestmgr->dispatchmgr,
|
||||
socket, requestmgr->taskmgr,
|
||||
4096, 2, 1, 1, 3, attrs,
|
||||
&request->dispatch);
|
||||
isc_socket_detach(&socket);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
} else {
|
||||
dns_dispatch_t *disp = NULL;
|
||||
if (srcaddr == NULL) {
|
||||
switch (isc_sockaddr_pf(destaddr)) {
|
||||
case PF_INET:
|
||||
disp = requestmgr->dispatchv4;
|
||||
break;
|
||||
result = get_dispatch(tcp, requestmgr, srcaddr, destaddr,
|
||||
&request->dispatch);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
|
||||
case PF_INET6:
|
||||
disp = requestmgr->dispatchv6;
|
||||
break;
|
||||
|
||||
default:
|
||||
result = ISC_R_NOTIMPLEMENTED;
|
||||
goto cleanup;
|
||||
}
|
||||
if (disp == NULL) {
|
||||
result = ISC_R_FAMILYNOSUPPORT;
|
||||
goto cleanup;
|
||||
}
|
||||
dns_dispatch_attach(disp, &request->dispatch);
|
||||
} else {
|
||||
unsigned int attrs, attrmask;
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_UDP;
|
||||
switch (isc_sockaddr_pf(srcaddr)) {
|
||||
case PF_INET:
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
break;
|
||||
|
||||
case PF_INET6:
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
break;
|
||||
|
||||
default:
|
||||
result = ISC_R_NOTIMPLEMENTED;
|
||||
goto cleanup;
|
||||
}
|
||||
attrmask = 0;
|
||||
attrmask |= DNS_DISPATCHATTR_UDP;
|
||||
attrmask |= DNS_DISPATCHATTR_TCP;
|
||||
attrmask |= DNS_DISPATCHATTR_IPV4;
|
||||
attrmask |= DNS_DISPATCHATTR_IPV6;
|
||||
result = dns_dispatch_getudp(requestmgr->dispatchmgr,
|
||||
requestmgr->socketmgr,
|
||||
requestmgr->taskmgr,
|
||||
srcaddr, 4096,
|
||||
1000, 32768, 16411, 16433,
|
||||
attrs, attrmask,
|
||||
&request->dispatch);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
socket = dns_dispatch_getsocket(request->dispatch);
|
||||
INSIST(socket != NULL);
|
||||
result = dns_dispatch_addresponse(request->dispatch, destaddr, task,
|
||||
|
|
@ -670,13 +711,7 @@ dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
|
|||
ISC_LIST_APPEND(requestmgr->requests, request, link);
|
||||
UNLOCK(&requestmgr->lock);
|
||||
|
||||
isc_interval_set(&interval, timeout, 0);
|
||||
result = isc_time_nowplusinterval(&expires, &interval);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto unlink;
|
||||
|
||||
result = isc_timer_reset(request->timer, isc_timertype_once,
|
||||
&expires, NULL, ISC_FALSE);
|
||||
result = set_timer(request->timer, timeout);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto unlink;
|
||||
|
||||
|
|
@ -750,13 +785,8 @@ dns_request_createvia(dns_requestmgr_t *requestmgr, dns_message_t *message,
|
|||
isc_socket_t *socket = NULL;
|
||||
isc_result_t result;
|
||||
isc_mem_t *mctx;
|
||||
isc_sockaddr_t bind_any;
|
||||
isc_sockaddr_t src;
|
||||
isc_interval_t interval;
|
||||
dns_messageid_t id;
|
||||
isc_time_t expires;
|
||||
unsigned int attrs;
|
||||
dns_acl_t *blackhole = NULL;
|
||||
isc_boolean_t tcp;
|
||||
|
||||
REQUIRE(VALID_REQUESTMGR(requestmgr));
|
||||
REQUIRE(message != NULL);
|
||||
|
|
@ -772,28 +802,8 @@ dns_request_createvia(dns_requestmgr_t *requestmgr, dns_message_t *message,
|
|||
|
||||
req_log(ISC_LOG_DEBUG(3), "dns_request_create");
|
||||
|
||||
(void)dns_dispatchmgr_getblackhole(requestmgr->dispatchmgr,
|
||||
&blackhole);
|
||||
if (blackhole != NULL) {
|
||||
isc_netaddr_t netaddr;
|
||||
int match;
|
||||
isc_boolean_t drop = ISC_FALSE;
|
||||
|
||||
isc_netaddr_fromsockaddr(&netaddr, destaddr);
|
||||
if (dns_acl_match(&netaddr, NULL, blackhole,
|
||||
NULL, &match, NULL) == ISC_R_SUCCESS &&
|
||||
match > 0)
|
||||
drop = ISC_TRUE;
|
||||
dns_acl_detach(&blackhole);
|
||||
if (drop) {
|
||||
char netaddrstr[ISC_NETADDR_FORMATSIZE];
|
||||
isc_netaddr_format(&netaddr, netaddrstr,
|
||||
sizeof(netaddrstr));
|
||||
req_log(ISC_LOG_DEBUG(10), "blackholed address %s",
|
||||
netaddrstr);
|
||||
return (DNS_R_BLACKHOLED);
|
||||
}
|
||||
}
|
||||
if (isblackholed(requestmgr->dispatchmgr, destaddr))
|
||||
return (DNS_R_BLACKHOLED);
|
||||
|
||||
request = isc_mem_get(mctx, sizeof(*request));
|
||||
if (request == NULL) {
|
||||
|
|
@ -841,94 +851,12 @@ dns_request_createvia(dns_requestmgr_t *requestmgr, dns_message_t *message,
|
|||
dns_tsigkey_attach(key, &request->tsigkey);
|
||||
|
||||
use_tcp:
|
||||
if ((options & DNS_REQUESTOPT_TCP) != 0) {
|
||||
result = isc_socket_create(requestmgr->socketmgr,
|
||||
isc_sockaddr_pf(destaddr),
|
||||
isc_sockettype_tcp, &socket);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
if (srcaddr == NULL) {
|
||||
isc_sockaddr_anyofpf(&bind_any,
|
||||
isc_sockaddr_pf(destaddr));
|
||||
result = isc_socket_bind(socket, &bind_any);
|
||||
} else {
|
||||
src = *srcaddr;
|
||||
isc_sockaddr_setport(&src, 0);
|
||||
result = isc_socket_bind(socket, &src);
|
||||
}
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_socket_detach(&socket);
|
||||
goto cleanup;
|
||||
}
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_TCP;
|
||||
attrs |= DNS_DISPATCHATTR_PRIVATE;
|
||||
if (isc_sockaddr_pf(destaddr) == AF_INET)
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
else
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
attrs |= DNS_DISPATCHATTR_MAKEQUERY;
|
||||
result = dns_dispatch_createtcp(requestmgr->dispatchmgr,
|
||||
socket, requestmgr->taskmgr,
|
||||
4096, 2, 1, 1, 3, attrs,
|
||||
&request->dispatch);
|
||||
isc_socket_detach(&socket);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
} else {
|
||||
dns_dispatch_t *disp = NULL;
|
||||
if (srcaddr == NULL) {
|
||||
switch (isc_sockaddr_pf(destaddr)) {
|
||||
case PF_INET:
|
||||
disp = requestmgr->dispatchv4;
|
||||
break;
|
||||
tcp = ISC_TF((options & DNS_REQUESTOPT_TCP) != 0);
|
||||
result = get_dispatch(tcp, requestmgr, srcaddr, destaddr,
|
||||
&request->dispatch);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
|
||||
case PF_INET6:
|
||||
disp = requestmgr->dispatchv6;
|
||||
break;
|
||||
|
||||
default:
|
||||
result = ISC_R_NOTIMPLEMENTED;
|
||||
goto cleanup;
|
||||
}
|
||||
if (disp == NULL) {
|
||||
result = ISC_R_FAMILYNOSUPPORT;
|
||||
goto cleanup;
|
||||
}
|
||||
dns_dispatch_attach(disp, &request->dispatch);
|
||||
} else {
|
||||
unsigned int attrs, attrmask;
|
||||
attrs = 0;
|
||||
attrs |= DNS_DISPATCHATTR_UDP;
|
||||
switch (isc_sockaddr_pf(srcaddr)) {
|
||||
case PF_INET:
|
||||
attrs |= DNS_DISPATCHATTR_IPV4;
|
||||
break;
|
||||
|
||||
case PF_INET6:
|
||||
attrs |= DNS_DISPATCHATTR_IPV6;
|
||||
break;
|
||||
|
||||
default:
|
||||
result = ISC_R_NOTIMPLEMENTED;
|
||||
goto cleanup;
|
||||
}
|
||||
attrmask = 0;
|
||||
attrmask |= DNS_DISPATCHATTR_UDP;
|
||||
attrmask |= DNS_DISPATCHATTR_TCP;
|
||||
attrmask |= DNS_DISPATCHATTR_IPV4;
|
||||
attrmask |= DNS_DISPATCHATTR_IPV6;
|
||||
result = dns_dispatch_getudp(requestmgr->dispatchmgr,
|
||||
requestmgr->socketmgr,
|
||||
requestmgr->taskmgr,
|
||||
srcaddr, 4096,
|
||||
1000, 32768, 16411, 16433,
|
||||
attrs, attrmask,
|
||||
&request->dispatch);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
socket = dns_dispatch_getsocket(request->dispatch);
|
||||
INSIST(socket != NULL);
|
||||
result = dns_dispatch_addresponse(request->dispatch, destaddr, task,
|
||||
|
|
@ -950,6 +878,7 @@ dns_request_createvia(dns_requestmgr_t *requestmgr, dns_message_t *message,
|
|||
dns_dispatch_detach(&request->dispatch);
|
||||
socket = NULL;
|
||||
options |= DNS_REQUESTOPT_TCP;
|
||||
tcp = ISC_TRUE;
|
||||
goto use_tcp;
|
||||
}
|
||||
if (result != ISC_R_SUCCESS)
|
||||
|
|
@ -972,13 +901,7 @@ dns_request_createvia(dns_requestmgr_t *requestmgr, dns_message_t *message,
|
|||
ISC_LIST_APPEND(requestmgr->requests, request, link);
|
||||
UNLOCK(&requestmgr->lock);
|
||||
|
||||
isc_interval_set(&interval, timeout, 0);
|
||||
result = isc_time_nowplusinterval(&expires, &interval);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto unlink;
|
||||
|
||||
result = isc_timer_reset(request->timer, isc_timertype_once,
|
||||
&expires, NULL, ISC_FALSE);
|
||||
result = set_timer(request->timer, timeout);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto unlink;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue