536. [func] Use transfer-source{-v6} when sending refresh queries.

Transfer-source{-v6} now take a optional port
                        parameter for setting the UDP source port.  The port
                        parameter is ignored for TCP.
This commit is contained in:
Mark Andrews
2000-10-31 01:17:19 +00:00
parent 38a5d999de
commit 04c22ceaf2
6 changed files with 284 additions and 52 deletions

View File

@@ -17,7 +17,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: confparser.y.dirty,v 1.23 2000/10/20 19:32:47 bwelling Exp $ */
/* $Id: confparser.y.dirty,v 1.24 2000/10/31 01:17:18 marka Exp $ */
#include <config.h>
@@ -1063,6 +1063,20 @@ option: /* Empty */
YYABORT;
}
}
| L_TRANSFER_SOURCE maybe_wild_ip4_only_addr L_PORT maybe_wild_port
{
isc_sockaddr_setport(&$2, $4);
tmpres = dns_c_ctx_settransfersource(currcfg, $2);
if (tmpres == ISC_R_EXISTS) {
parser_error(ISC_FALSE,
"cannot redefine transfer-source");
YYABORT;
} else if (tmpres != ISC_R_SUCCESS) {
parser_error(ISC_FALSE,
"failed to set transfer-source");
YYABORT;
}
}
| L_TRANSFER_SOURCE_V6 maybe_wild_ip6_only_addr
{
tmpres = dns_c_ctx_settransfersourcev6(currcfg, $2);
@@ -1076,6 +1090,20 @@ option: /* Empty */
YYABORT;
}
}
| L_TRANSFER_SOURCE_V6 maybe_wild_ip6_only_addr L_PORT maybe_wild_port
{
isc_sockaddr_setport(&$2, $4);
tmpres = dns_c_ctx_settransfersourcev6(currcfg, $2);
if (tmpres == ISC_R_EXISTS) {
parser_error(ISC_FALSE,
"cannot redefine transfer-source-v6");
YYABORT;
} else if (tmpres != ISC_R_SUCCESS) {
parser_error(ISC_FALSE,
"failed to set transfer-source-v6");
YYABORT;
}
}
#ifndef NOMINUM_PUBLIC
| L_ALLOW_NOTIFY L_LBRACE address_match_list L_RBRACE
{
@@ -3993,6 +4021,24 @@ view_option: L_FORWARD zone_forward_opt
YYABORT;
}
}
| L_TRANSFER_SOURCE maybe_wild_ip4_only_addr L_PORT maybe_wild_port
{
dns_c_view_t *view = dns_c_ctx_getcurrview(currcfg);
INSIST(view != NULL);
isc_sockaddr_setport(&$2, $4);
tmpres = dns_c_view_settransfersource(view, $2);
if (tmpres == ISC_R_EXISTS) {
parser_error(ISC_FALSE,
"cannot redefine view transfer-source");
YYABORT;
} else if (tmpres != ISC_R_SUCCESS) {
parser_error(ISC_FALSE,
"failed to set view transfer-source");
YYABORT;
}
}
| L_TRANSFER_SOURCE_V6 maybe_wild_ip6_only_addr
{
dns_c_view_t *view = dns_c_ctx_getcurrview(currcfg);
@@ -4011,6 +4057,25 @@ view_option: L_FORWARD zone_forward_opt
YYABORT;
}
}
| L_TRANSFER_SOURCE_V6 maybe_wild_ip6_only_addr L_PORT maybe_wild_port
{
dns_c_view_t *view = dns_c_ctx_getcurrview(currcfg);
INSIST(view != NULL);
isc_sockaddr_setport(&$2, $4);
tmpres = dns_c_view_settransfersourcev6(view, $2);
if (tmpres == ISC_R_EXISTS) {
parser_error(ISC_FALSE,
"cannot redefine view "
"transfer-source-v6");
YYABORT;
} else if (tmpres != ISC_R_SUCCESS) {
parser_error(ISC_FALSE,
"failed to set view transfer-source-v6");
YYABORT;
}
}
| L_MAX_TRANSFER_TIME_OUT L_INTEGER
{
dns_c_view_t *view = dns_c_ctx_getcurrview(currcfg);
@@ -4875,6 +4940,24 @@ zone_option: L_FILE L_QSTRING
YYABORT;
}
}
| L_TRANSFER_SOURCE maybe_wild_ip4_only_addr L_PORT maybe_wild_port
{
dns_c_zone_t *zone = dns_c_ctx_getcurrzone(currcfg);
INSIST(zone != NULL);
isc_sockaddr_setport(&$2, $4);
tmpres = dns_c_zone_settransfersource(zone, $2);
if (tmpres == ISC_R_EXISTS) {
parser_error(ISC_FALSE,
"cannot redefine zone transfer-source");
YYABORT;
} else if (tmpres != ISC_R_SUCCESS) {
parser_error(ISC_FALSE,
"failed to set zone transfer-source");
YYABORT;
}
}
| L_TRANSFER_SOURCE_V6 maybe_wild_ip6_only_addr
{
dns_c_zone_t *zone = dns_c_ctx_getcurrzone(currcfg);
@@ -4893,6 +4976,25 @@ zone_option: L_FILE L_QSTRING
YYABORT;
}
}
| L_TRANSFER_SOURCE_V6 maybe_wild_ip6_only_addr L_PORT maybe_wild_port
{
dns_c_zone_t *zone = dns_c_ctx_getcurrzone(currcfg);
INSIST(zone != NULL);
isc_sockaddr_setport(&$2, $4);
tmpres = dns_c_zone_settransfersourcev6(zone, $2);
if (tmpres == ISC_R_EXISTS) {
parser_error(ISC_FALSE,
"cannot redefine zone "
"transfer-source-v6");
YYABORT;
} else if (tmpres != ISC_R_SUCCESS) {
parser_error(ISC_FALSE,
"failed to set zone transfer-source-v6");
YYABORT;
}
}
| L_CHECK_NAMES check_names_opt
{
dns_c_zone_t *zone = dns_c_ctx_getcurrzone(currcfg);

View File

@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: request.h,v 1.15 2000/10/06 18:58:25 bwelling Exp $ */
/* $Id: request.h,v 1.16 2000/10/31 01:17:19 marka Exp $ */
#ifndef DNS_REQUEST_H
#define DNS_REQUEST_H 1
@@ -192,6 +192,42 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
* requestp != NULL && *requestp == NULL
*/
isc_result_t
dns_request_createvia(dns_requestmgr_t *requestmgr, dns_message_t *message,
isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
unsigned int options, dns_tsigkey_t *key,
unsigned int timeout, isc_task_t *task,
isc_taskaction_t action, void *arg,
dns_request_t **requestp);
/*
* Create and send a request.
*
* Notes:
*
* 'message' will be rendered and sent to 'address'. If the
* DNS_REQUESTOPT_TCP option is set, TCP will be used. The request
* will timeout after 'timeout' seconds.
*
* When the request completes, successfully, due to a timeout, or
* because it was canceled, a completion event will be sent to 'task'.
*
* Requires:
*
* 'message' is a valid DNS message.
*
* 'dstaddr' is a valid sockaddr.
*
* 'srcaddr' is a valid sockaddr or NULL.
*
* 'srcaddr' and 'dstaddr' are the same protocol family.
*
* 'timeout' > 0
*
* 'task' is a valid task.
*
* requestp != NULL && *requestp == NULL
*/
isc_result_t
dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
@@ -217,7 +253,8 @@ dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
* 'destaddr' is a valid sockaddr.
*
* 'srcaddr' is a valid sockaddr or NULL.
* This is currently not implememted, use NULL.
*
* 'srcaddr' and 'dstaddr' are the same protocol family.
*
* 'timeout' > 0
*

View File

@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: request.c,v 1.39 2000/10/30 05:08:06 marka Exp $ */
/* $Id: request.c,v 1.40 2000/10/31 01:17:15 marka Exp $ */
#include <config.h>
@@ -558,6 +558,11 @@ dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
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;
@@ -585,15 +590,11 @@ dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
requestmgr->taskmgr,
srcaddr, 4096,
1000, 32768, 16411, 16433,
attrs, attrmask, &disp);
attrs, attrmask,
&request->dispatch);
if (result != ISC_R_SUCCESS)
goto cleanup;
}
if (disp == NULL) {
result = ISC_R_FAMILYNOSUPPORT;
goto cleanup;
}
dns_dispatch_attach(disp, &request->dispatch);
}
socket = dns_dispatch_getsocket(request->dispatch);
INSIST(socket != NULL);
@@ -694,6 +695,19 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
unsigned int timeout, isc_task_t *task,
isc_taskaction_t action, void *arg,
dns_request_t **requestp)
{
return(dns_request_createvia(requestmgr, message, NULL, address,
options, key, timeout, task, action,
arg, requestp));
}
isc_result_t
dns_request_createvia(dns_requestmgr_t *requestmgr, dns_message_t *message,
isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
unsigned int options, dns_tsigkey_t *key,
unsigned int timeout, isc_task_t *task,
isc_taskaction_t action, void *arg,
dns_request_t **requestp)
{
dns_request_t *request = NULL;
isc_task_t *tclone = NULL;
@@ -701,6 +715,7 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
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;
@@ -708,11 +723,13 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
REQUIRE(VALID_REQUESTMGR(requestmgr));
REQUIRE(message != NULL);
REQUIRE(address != NULL);
REQUIRE(destaddr != NULL);
REQUIRE(task != NULL);
REQUIRE(action != NULL);
REQUIRE(requestp != NULL && *requestp == NULL);
REQUIRE(timeout > 0);
if (srcaddr != NULL)
REQUIRE(isc_sockaddr_pf(srcaddr) == isc_sockaddr_pf(destaddr));
mctx = requestmgr->mctx;
@@ -765,12 +782,19 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
use_tcp:
if ((options & DNS_REQUESTOPT_TCP) != 0) {
result = isc_socket_create(requestmgr->socketmgr,
isc_sockaddr_pf(address),
isc_sockaddr_pf(destaddr),
isc_sockettype_tcp, &socket);
if (result != ISC_R_SUCCESS)
goto cleanup;
isc_sockaddr_anyofpf(&bind_any, isc_sockaddr_pf(address));
result = isc_socket_bind(socket, &bind_any);
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;
@@ -778,7 +802,7 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
attrs = 0;
attrs |= DNS_DISPATCHATTR_TCP;
attrs |= DNS_DISPATCHATTR_PRIVATE;
if (isc_sockaddr_pf(address) == AF_INET)
if (isc_sockaddr_pf(destaddr) == AF_INET)
attrs |= DNS_DISPATCHATTR_IPV4;
else
attrs |= DNS_DISPATCHATTR_IPV6;
@@ -792,28 +816,61 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
goto cleanup;
} else {
dns_dispatch_t *disp = NULL;
switch (isc_sockaddr_pf(address)) {
case PF_INET:
disp = requestmgr->dispatchv4;
break;
if (srcaddr == NULL) {
switch (isc_sockaddr_pf(destaddr)) {
case PF_INET:
disp = requestmgr->dispatchv4;
break;
case PF_INET6:
disp = requestmgr->dispatchv6;
break;
case PF_INET6:
disp = requestmgr->dispatchv6;
break;
default:
result = ISC_R_NOTIMPLEMENTED;
goto cleanup;
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;
}
if (disp == NULL) {
result = ISC_R_FAMILYNOSUPPORT;
goto cleanup;
}
dns_dispatch_attach(disp, &request->dispatch);
}
socket = dns_dispatch_getsocket(request->dispatch);
INSIST(socket != NULL);
result = dns_dispatch_addresponse(request->dispatch, address, task,
result = dns_dispatch_addresponse(request->dispatch, destaddr, task,
req_response, request, &id,
&request->dispentry);
if (result != ISC_R_SUCCESS)
@@ -865,13 +922,13 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
goto unlink;
if ((options & DNS_REQUESTOPT_TCP) != 0) {
result = isc_socket_connect(socket, address, task,
result = isc_socket_connect(socket, destaddr, task,
req_connected, request);
if (result != ISC_R_SUCCESS)
goto unlink;
request->flags |= DNS_REQUEST_F_CONNECTING|DNS_REQUEST_F_TCP;
} else {
result = req_send(request, task, address);
result = req_send(request, task, destaddr);
if (result != ISC_R_SUCCESS)
goto unlink;
}

View File

@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: zone.c,v 1.241 2000/10/30 05:08:07 marka Exp $ */
/* $Id: zone.c,v 1.242 2000/10/31 01:17:17 marka Exp $ */
#include <config.h>
@@ -3183,6 +3183,7 @@ soa_query(isc_task_t *task, isc_event_t *event) {
isc_netaddr_t masterip;
dns_tsigkey_t *key = NULL;
isc_uint32_t options;
isc_sockaddr_t src;
REQUIRE(DNS_ZONE_VALID(zone));
@@ -3218,13 +3219,24 @@ soa_query(isc_task_t *task, isc_event_t *event) {
options = DNS_ZONE_FLAG(zone, DNS_ZONEFLG_USEVC) ?
DNS_REQUESTOPT_TCP : 0;
result = dns_request_create(zone->view->requestmgr, message,
&zone->masteraddr, options, key,
15 /* XXX */, zone->task,
refresh_callback, zone, &zone->request);
switch (isc_sockaddr_pf(&zone->masteraddr)) {
case PF_INET:
src = zone->xfrsource4;
break;
case PF_INET6:
src = zone->xfrsource6;
break;
default:
result = ISC_R_NOTIMPLEMENTED;
goto cleanup;
}
result = dns_request_createvia(zone->view->requestmgr, message,
&src, &zone->masteraddr, options, key,
15 /* XXX */, zone->task,
refresh_callback, zone, &zone->request);
if (result != ISC_R_SUCCESS) {
zone_log(zone, me, ISC_LOG_DEBUG(1),
"dns_request_create failed: %s",
"dns_request_createvia failed: %s",
dns_result_totext(result));
goto cleanup;
}
@@ -3252,6 +3264,7 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) {
isc_netaddr_t masterip;
dns_tsigkey_t *key = NULL;
dns_dbnode_t *node = NULL;
isc_sockaddr_t src;
REQUIRE(DNS_ZONE_VALID(zone));
REQUIRE((soardataset != NULL && stub == NULL) ||
@@ -3341,13 +3354,25 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) {
/*
* Always use TCP so that we shouldn't truncate in additional section.
*/
result = dns_request_create(zone->view->requestmgr, message,
&zone->masteraddr, DNS_REQUESTOPT_TCP, key,
15 /* XXX */, zone->task,
stub_callback, stub, &zone->request);
switch (isc_sockaddr_pf(&zone->masteraddr)) {
case PF_INET:
src = zone->xfrsource4;
break;
case PF_INET6:
src = zone->xfrsource6;
break;
default:
result = ISC_R_NOTIMPLEMENTED;
goto cleanup;
}
result = dns_request_createvia(zone->view->requestmgr, message,
&src, &zone->masteraddr,
DNS_REQUESTOPT_TCP, key, 15 /* XXX */,
zone->task, stub_callback, stub,
&zone->request);
if (result != ISC_R_SUCCESS) {
zone_log(zone, me, ISC_LOG_DEBUG(1),
"dns_request_create failed: %s",
"dns_request_createvia failed: %s",
dns_result_totext(result));
goto cleanup;
}