2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-28 21:17:54 +00:00

separate transfer-source addresses for IPv4 and IPv6

This commit is contained in:
Andreas Gustafsson 2000-01-31 18:00:07 +00:00
parent 994a1996e4
commit c718c8aa60
5 changed files with 116 additions and 52 deletions

View File

@ -96,15 +96,11 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_aclconfctx_t *ac,
isc_int32_t maxxfr;
isc_int32_t idle;
in_port_t port;
isc_sockaddr_t sockaddr_any;
struct in_addr in4addr_any;
isc_sockaddr_t sockaddr_any4;
if (isc_net_probeipv6() == ISC_R_SUCCESS)
isc_sockaddr_fromin6(&sockaddr_any, &in6addr_any, 0);
else {
in4addr_any.s_addr = INADDR_ANY;
isc_sockaddr_fromin(&sockaddr_any, &in4addr_any, 0);
}
in4addr_any.s_addr = htonl(INADDR_ANY);
isc_sockaddr_fromin(&sockaddr_any4, &in4addr_any, 0);
dns_zone_setclass(zone, czone->zclass);
@ -253,10 +249,13 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_aclconfctx_t *ac,
dns_zone_setmaxxfrin(zone, MAX_XFER_TIME);
result = dns_c_zone_gettransfersource(czone, &sockaddr);
if (result == ISC_R_SUCCESS)
dns_zone_setxfrsource(zone, &sockaddr);
else
dns_zone_setxfrsource(zone, &sockaddr_any);
if (result != ISC_R_SUCCESS) {
result = dns_c_ctx_gettransfersource(cctx, &sockaddr);
if (result != ISC_R_SUCCESS) {
sockaddr = sockaddr_any4;
}
}
dns_zone_setxfrsource4(zone, &sockaddr);
result = dns_c_zone_getmaxtransidlein(czone, &idle);
if (result == ISC_R_SUCCESS)
@ -323,10 +322,13 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_aclconfctx_t *ac,
dns_zone_setmaxxfrin(zone, MAX_XFER_TIME);
result = dns_c_zone_gettransfersource(czone, &sockaddr);
if (result == ISC_R_SUCCESS)
dns_zone_setxfrsource(zone, &sockaddr);
else
dns_zone_setxfrsource(zone, &sockaddr_any);
if (result != ISC_R_SUCCESS) {
result = dns_c_ctx_gettransfersource(cctx, &sockaddr);
if (result != ISC_R_SUCCESS) {
sockaddr = sockaddr_any4;
}
}
dns_zone_setxfrsource4(zone, &sockaddr);
result = dns_c_zone_getmaxtransidlein(czone, &idle);
if (result == ISC_R_SUCCESS)

View File

@ -422,9 +422,9 @@ void dns_zone_setrefresh(dns_zone_t *zone, isc_uint32_t refresh,
*/
isc_result_t
dns_zone_setxfrsource(dns_zone_t *zone, isc_sockaddr_t *xfrsource);
dns_zone_setxfrsource4(dns_zone_t *zone, isc_sockaddr_t *xfrsource);
/*
* Set the source address to be used in zone transfers.
* Set the source address to be used in IPv4 zone transfers.
*
* Require:
* 'zone' to be a valid initalised zone.
@ -435,10 +435,33 @@ dns_zone_setxfrsource(dns_zone_t *zone, isc_sockaddr_t *xfrsource);
*/
isc_sockaddr_t *
dns_zone_getxfrsource(dns_zone_t *zone);
dns_zone_getxfrsource4(dns_zone_t *zone);
/*
* Returns the source address set by a previous dns_zone_setxfrsource
* call. If dns_zone_setxfrsource the in6addr_any port 0 is returned.
* Returns the source address set by a previous dns_zone_setxfrsource4
* call, or the default of inaddr_any, port 0.
*
* Require:
* 'zone' to be a valid initalised zone.
*/
isc_result_t
dns_zone_setxfrsource6(dns_zone_t *zone, isc_sockaddr_t *xfrsource);
/*
* Set the source address to be used in IPv6 zone transfers.
*
* Require:
* 'zone' to be a valid initalised zone.
* 'xfrsource' to contain the address.
*
* Returns:
* DNS_R_SUCCESS
*/
isc_sockaddr_t *
dns_zone_getxfrsource6(dns_zone_t *zone);
/*
* Returns the source address set by a previous dns_zone_setxfrsource6
* call, or the default of in6addr_any, port 0.
*
* Require:
* 'zone' to be a valid initalised zone.

View File

@ -15,7 +15,7 @@
* SOFTWARE.
*/
/* $Id: xfrin.c,v 1.42 2000/01/31 15:10:29 tale Exp $ */
/* $Id: xfrin.c,v 1.43 2000/01/31 18:00:05 gson Exp $ */
#include <config.h>
@ -666,8 +666,17 @@ xfrin_create(isc_mem_t *mctx,
xfrin_timeout, xfr, &xfr->timer));
xfr->masteraddr = *masteraddr;
/* XXX global, too */
xfr->sourceaddr = *dns_zone_getxfrsource(zone);
switch (isc_sockaddr_pf(masteraddr)) {
case PF_INET:
xfr->sourceaddr = *dns_zone_getxfrsource4(zone);
break;
case PF_INET6:
xfr->sourceaddr = *dns_zone_getxfrsource6(zone);
break;
default:
INSIST(0);
}
isc_buffer_init(&xfr->qbuffer, xfr->qbuffer_data,
sizeof(xfr->qbuffer_data),
@ -685,7 +694,7 @@ isc_result_t
xfrin_start(dns_xfrin_ctx_t *xfr) {
isc_result_t result;
CHECK(isc_socket_create(xfr->socketmgr,
isc_sockaddr_pf(&xfr->masteraddr),
isc_sockaddr_pf(&xfr->sourceaddr),
isc_sockettype_tcp,
&xfr->socket));
CHECK(isc_socket_bind(xfr->socket, &xfr->sourceaddr));

View File

@ -15,7 +15,7 @@
* SOFTWARE.
*/
/* $Id: zone.c,v 1.74 2000/01/31 07:45:18 marka Exp $ */
/* $Id: zone.c,v 1.75 2000/01/31 18:00:02 gson Exp $ */
#include <config.h>
@ -142,7 +142,8 @@ struct dns_zone {
unsigned int notifycnt;
isc_sockaddr_t notifyfrom;
isc_task_t * task;
isc_sockaddr_t xfrsource;
isc_sockaddr_t xfrsource4;
isc_sockaddr_t xfrsource6;
dns_xfrin_ctx_t * xfr;
/* Access Control Lists */
dns_acl_t *update_acl;
@ -249,12 +250,16 @@ isc_result_t
dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
isc_result_t result;
dns_zone_t *zone;
isc_sockaddr_t sockaddr_any;
isc_sockaddr_t sockaddr_any4;
isc_sockaddr_t sockaddr_any6;
struct in_addr in4addr_any;
REQUIRE(zonep != NULL && *zonep == NULL);
REQUIRE(mctx != NULL);
isc_sockaddr_fromin6(&sockaddr_any, &in6addr_any, 0);
in4addr_any.s_addr = htonl(INADDR_ANY);
isc_sockaddr_fromin(&sockaddr_any4, &in4addr_any, 0);
isc_sockaddr_fromin6(&sockaddr_any6, &in6addr_any, 0);
zone = isc_mem_get(mctx, sizeof *zone);
if (zone == NULL)
@ -316,7 +321,8 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
zone->idlein = DNS_DEFAULT_IDLEIN;
zone->idleout = DNS_DEFAULT_IDLEOUT;
ISC_LIST_INIT(zone->checkservers);
zone->xfrsource = sockaddr_any;
zone->xfrsource4 = sockaddr_any4;
zone->xfrsource6 = sockaddr_any6;
zone->xfr = NULL;
zone->maxxfrin = MAX_XFER_TIME;
zone->maxxfrout = MAX_XFER_TIME;
@ -1389,20 +1395,37 @@ dns_zone_cleardbargs(dns_zone_t *zone) {
}
isc_result_t
dns_zone_setxfrsource(dns_zone_t *zone, isc_sockaddr_t *xfrsource) {
dns_zone_setxfrsource4(dns_zone_t *zone, isc_sockaddr_t *xfrsource) {
REQUIRE(DNS_ZONE_VALID(zone));
LOCK(&zone->lock);
zone->xfrsource = *xfrsource;
zone->xfrsource4 = *xfrsource;
UNLOCK(&zone->lock);
return (DNS_R_SUCCESS);
}
isc_sockaddr_t *
dns_zone_getxfrsource(dns_zone_t *zone) {
dns_zone_getxfrsource4(dns_zone_t *zone) {
REQUIRE(DNS_ZONE_VALID(zone));
return (&zone->xfrsource);
return (&zone->xfrsource4);
}
isc_result_t
dns_zone_setxfrsource6(dns_zone_t *zone, isc_sockaddr_t *xfrsource) {
REQUIRE(DNS_ZONE_VALID(zone));
LOCK(&zone->lock);
zone->xfrsource6 = *xfrsource;
UNLOCK(&zone->lock);
return (DNS_R_SUCCESS);
}
isc_sockaddr_t *
dns_zone_getxfrsource6(dns_zone_t *zone) {
REQUIRE(DNS_ZONE_VALID(zone));
return (&zone->xfrsource6);
}
isc_result_t
@ -1859,8 +1882,9 @@ dns_zone_notify(dns_zone_t *zone) {
* Enqueue notify request.
*/
for (i = 0; i < zone->notifycnt; i++) {
/* XXX IPv6 */
(void)dns_notify(origin, &zone->notify[i], dns_rdatatype_soa,
zone->rdclass, &zone->xfrsource, zone->mctx);
zone->rdclass, &zone->xfrsource4, zone->mctx);
}
dns_db_currentversion(zone->top, &version);
@ -1915,10 +1939,11 @@ dns_zone_notify(dns_zone_t *zone) {
break;
}
if (i == zone->notifycnt) {
/* XXX IPv6 */
(void)dns_notify(origin, &addr,
dns_rdatatype_soa,
zone->rdclass,
&zone->xfrsource, zone->mctx);
&zone->xfrsource4, zone->mctx);
}
result = dns_rdataset_next(&ardset);
}
@ -2780,7 +2805,10 @@ dns_zone_equal(dns_zone_t *oldzone, dns_zone_t *newzone) {
if (strcmp(oldzone->db_argv[i], newzone->db_argv[i]) != 0)
goto false;
if (!isc_sockaddr_equal(&oldzone->xfrsource, &newzone->xfrsource))
if (!isc_sockaddr_equal(&oldzone->xfrsource4, &newzone->xfrsource4))
goto false;
if (!isc_sockaddr_equal(&oldzone->xfrsource6, &newzone->xfrsource6))
goto false;
for (i = 0; i < oldzone->notifycnt; i++)

View File

@ -96,15 +96,11 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_aclconfctx_t *ac,
isc_int32_t maxxfr;
isc_int32_t idle;
in_port_t port;
isc_sockaddr_t sockaddr_any;
struct in_addr in4addr_any;
isc_sockaddr_t sockaddr_any4;
if (isc_net_probeipv6() == ISC_R_SUCCESS)
isc_sockaddr_fromin6(&sockaddr_any, &in6addr_any, 0);
else {
in4addr_any.s_addr = INADDR_ANY;
isc_sockaddr_fromin(&sockaddr_any, &in4addr_any, 0);
}
in4addr_any.s_addr = htonl(INADDR_ANY);
isc_sockaddr_fromin(&sockaddr_any4, &in4addr_any, 0);
dns_zone_setclass(zone, czone->zclass);
@ -253,10 +249,13 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_aclconfctx_t *ac,
dns_zone_setmaxxfrin(zone, MAX_XFER_TIME);
result = dns_c_zone_gettransfersource(czone, &sockaddr);
if (result == ISC_R_SUCCESS)
dns_zone_setxfrsource(zone, &sockaddr);
else
dns_zone_setxfrsource(zone, &sockaddr_any);
if (result != ISC_R_SUCCESS) {
result = dns_c_ctx_gettransfersource(cctx, &sockaddr);
if (result != ISC_R_SUCCESS) {
sockaddr = sockaddr_any4;
}
}
dns_zone_setxfrsource4(zone, &sockaddr);
result = dns_c_zone_getmaxtransidlein(czone, &idle);
if (result == ISC_R_SUCCESS)
@ -323,10 +322,13 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_aclconfctx_t *ac,
dns_zone_setmaxxfrin(zone, MAX_XFER_TIME);
result = dns_c_zone_gettransfersource(czone, &sockaddr);
if (result == ISC_R_SUCCESS)
dns_zone_setxfrsource(zone, &sockaddr);
else
dns_zone_setxfrsource(zone, &sockaddr_any);
if (result != ISC_R_SUCCESS) {
result = dns_c_ctx_gettransfersource(cctx, &sockaddr);
if (result != ISC_R_SUCCESS) {
sockaddr = sockaddr_any4;
}
}
dns_zone_setxfrsource4(zone, &sockaddr);
result = dns_c_zone_getmaxtransidlein(czone, &idle);
if (result == ISC_R_SUCCESS)