mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-30 14:07:59 +00:00
Add UDP refresh queries.
Generate NOTIFY messages.
This commit is contained in:
parent
9069fc6030
commit
9e53cbca72
4
CHANGES
4
CHANGES
@ -1,3 +1,7 @@
|
|||||||
|
63 [func] generate NOTIFY messages.
|
||||||
|
|
||||||
|
62. [func] add UDP refresh support.
|
||||||
|
|
||||||
61. [cleanup] use single quotes consistently in log messages.
|
61. [cleanup] use single quotes consistently in log messages.
|
||||||
|
|
||||||
60. [func] Catch and disallow singleton types on message
|
60. [func] Catch and disallow singleton types on message
|
||||||
|
@ -169,13 +169,13 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_c_view_t *cview,
|
|||||||
if (result == ISC_R_SUCCESS)
|
if (result == ISC_R_SUCCESS)
|
||||||
dns_zone_setoption(zone, DNS_ZONE_O_DIALUP, boolean);
|
dns_zone_setoption(zone, DNS_ZONE_O_DIALUP, boolean);
|
||||||
else
|
else
|
||||||
dns_zone_clearoption(zone, DNS_ZONE_O_DIALUP);
|
dns_zone_setoption(zone, DNS_ZONE_O_DIALUP, ISC_FALSE);
|
||||||
|
|
||||||
result = dns_c_zone_getnotify(czone, &boolean);
|
result = dns_c_zone_getnotify(czone, &boolean);
|
||||||
if (result == ISC_R_SUCCESS)
|
if (result == ISC_R_SUCCESS)
|
||||||
dns_zone_setoption(zone, DNS_ZONE_O_NOTIFY, boolean);
|
dns_zone_setoption(zone, DNS_ZONE_O_NOTIFY, boolean);
|
||||||
else
|
else
|
||||||
dns_zone_clearoption(zone, DNS_ZONE_O_NOTIFY);
|
dns_zone_setoption(zone, DNS_ZONE_O_NOTIFY, ISC_TRUE);
|
||||||
|
|
||||||
result = dns_c_zone_getalsonotify(czone, &iplist);
|
result = dns_c_zone_getalsonotify(czone, &iplist);
|
||||||
if (result == ISC_R_SUCCESS) {
|
if (result == ISC_R_SUCCESS) {
|
||||||
|
@ -80,6 +80,7 @@ struct dns_view {
|
|||||||
dns_zt_t * zonetable;
|
dns_zt_t * zonetable;
|
||||||
dns_resolver_t * resolver;
|
dns_resolver_t * resolver;
|
||||||
dns_adb_t * adb;
|
dns_adb_t * adb;
|
||||||
|
dns_requestmgr_t * requestmgr;
|
||||||
dns_cache_t * cache;
|
dns_cache_t * cache;
|
||||||
dns_db_t * cachedb;
|
dns_db_t * cachedb;
|
||||||
dns_db_t * hints;
|
dns_db_t * hints;
|
||||||
@ -91,6 +92,7 @@ struct dns_view {
|
|||||||
isc_task_t * task;
|
isc_task_t * task;
|
||||||
isc_event_t resevent;
|
isc_event_t resevent;
|
||||||
isc_event_t adbevent;
|
isc_event_t adbevent;
|
||||||
|
isc_event_t reqevent;
|
||||||
/* Configurable data, locked by conflock. */
|
/* Configurable data, locked by conflock. */
|
||||||
dns_tsig_keyring_t * statickeys;
|
dns_tsig_keyring_t * statickeys;
|
||||||
dns_tsig_keyring_t * dynamickeys;
|
dns_tsig_keyring_t * dynamickeys;
|
||||||
@ -121,6 +123,7 @@ struct dns_view {
|
|||||||
|
|
||||||
#define DNS_VIEWATTR_RESSHUTDOWN 0x01
|
#define DNS_VIEWATTR_RESSHUTDOWN 0x01
|
||||||
#define DNS_VIEWATTR_ADBSHUTDOWN 0x02
|
#define DNS_VIEWATTR_ADBSHUTDOWN 0x02
|
||||||
|
#define DNS_VIEWATTR_REQSHUTDOWN 0x04
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
|
dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include <isc/sockaddr.h>
|
#include <isc/sockaddr.h>
|
||||||
#include <isc/types.h>
|
#include <isc/types.h>
|
||||||
|
|
||||||
|
#include <dns/adb.h>
|
||||||
#include <dns/types.h>
|
#include <dns/types.h>
|
||||||
#include <dns/result.h>
|
#include <dns/result.h>
|
||||||
#include <dns/name.h>
|
#include <dns/name.h>
|
||||||
@ -436,16 +437,12 @@ void dns_zone_clearoption(dns_zone_t *zone, unsigned int option);
|
|||||||
* 'zone' to be a valid initalised zone.
|
* 'zone' to be a valid initalised zone.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void dns_zone_getoptions(dns_zone_t *zone, unsigned int *options,
|
unsigned int dns_zone_getoptions(dns_zone_t *zone);
|
||||||
unsigned int *optionsmask);
|
|
||||||
/*
|
/*
|
||||||
* Return which options a set ('options') and which are active
|
* Return which options a set.
|
||||||
* ('optionsmask').
|
|
||||||
*
|
*
|
||||||
* Require:
|
* Require:
|
||||||
* 'zone' to be a valid initalised zone.
|
* 'zone' to be a valid initalised zone.
|
||||||
* 'options' to be non NULL.
|
|
||||||
* 'optionsmask' to be non NULL.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void dns_zone_setrefresh(dns_zone_t *zone, isc_uint32_t refresh,
|
void dns_zone_setrefresh(dns_zone_t *zone, isc_uint32_t refresh,
|
||||||
@ -614,6 +611,9 @@ void dns_zone_setmasterport(dns_zone_t *zone, isc_uint16_t port);
|
|||||||
isc_uint16_t dns_zone_getmasterport(dns_zone_t *zone);
|
isc_uint16_t dns_zone_getmasterport(dns_zone_t *zone);
|
||||||
|
|
||||||
void dns_zone_setresolver(dns_zone_t *zone, dns_resolver_t *resolver);
|
void dns_zone_setresolver(dns_zone_t *zone, dns_resolver_t *resolver);
|
||||||
|
void dns_zone_setrequestmgr(dns_zone_t *zone, dns_requestmgr_t *requestmgr);
|
||||||
|
void dns_zone_setadb(dns_zone_t *zone, dns_adb_t *adb);
|
||||||
|
|
||||||
|
|
||||||
isc_result_t dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from,
|
isc_result_t dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from,
|
||||||
dns_message_t *msg);
|
dns_message_t *msg);
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include <dns/rbt.h>
|
#include <dns/rbt.h>
|
||||||
#include <dns/rdataset.h>
|
#include <dns/rdataset.h>
|
||||||
#include <dns/resolver.h>
|
#include <dns/resolver.h>
|
||||||
|
#include <dns/request.h>
|
||||||
#include <dns/tsig.h>
|
#include <dns/tsig.h>
|
||||||
#include <dns/view.h>
|
#include <dns/view.h>
|
||||||
#include <dns/zone.h>
|
#include <dns/zone.h>
|
||||||
@ -46,9 +47,11 @@
|
|||||||
|
|
||||||
#define RESSHUTDOWN(v) (((v)->attributes & DNS_VIEWATTR_RESSHUTDOWN) != 0)
|
#define RESSHUTDOWN(v) (((v)->attributes & DNS_VIEWATTR_RESSHUTDOWN) != 0)
|
||||||
#define ADBSHUTDOWN(v) (((v)->attributes & DNS_VIEWATTR_ADBSHUTDOWN) != 0)
|
#define ADBSHUTDOWN(v) (((v)->attributes & DNS_VIEWATTR_ADBSHUTDOWN) != 0)
|
||||||
|
#define REQSHUTDOWN(v) (((v)->attributes & DNS_VIEWATTR_REQSHUTDOWN) != 0)
|
||||||
|
|
||||||
static void resolver_shutdown(isc_task_t *task, isc_event_t *event);
|
static void resolver_shutdown(isc_task_t *task, isc_event_t *event);
|
||||||
static void adb_shutdown(isc_task_t *task, isc_event_t *event);
|
static void adb_shutdown(isc_task_t *task, isc_event_t *event);
|
||||||
|
static void req_shutdown(isc_task_t *task, isc_event_t *event);
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
|
dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
|
||||||
@ -121,12 +124,14 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
|
|||||||
view->hints = NULL;
|
view->hints = NULL;
|
||||||
view->resolver = NULL;
|
view->resolver = NULL;
|
||||||
view->adb = NULL;
|
view->adb = NULL;
|
||||||
|
view->requestmgr = NULL;
|
||||||
view->mctx = mctx;
|
view->mctx = mctx;
|
||||||
view->rdclass = rdclass;
|
view->rdclass = rdclass;
|
||||||
view->frozen = ISC_FALSE;
|
view->frozen = ISC_FALSE;
|
||||||
view->task = NULL;
|
view->task = NULL;
|
||||||
view->references = 1;
|
view->references = 1;
|
||||||
view->attributes = (DNS_VIEWATTR_RESSHUTDOWN|DNS_VIEWATTR_ADBSHUTDOWN);
|
view->attributes = (DNS_VIEWATTR_RESSHUTDOWN|DNS_VIEWATTR_ADBSHUTDOWN|
|
||||||
|
DNS_VIEWATTR_REQSHUTDOWN);
|
||||||
view->statickeys = NULL;
|
view->statickeys = NULL;
|
||||||
view->dynamickeys = NULL;
|
view->dynamickeys = NULL;
|
||||||
view->matchclients = NULL;
|
view->matchclients = NULL;
|
||||||
@ -154,6 +159,9 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
|
|||||||
ISC_EVENT_INIT(&view->adbevent, sizeof view->adbevent, 0, NULL,
|
ISC_EVENT_INIT(&view->adbevent, sizeof view->adbevent, 0, NULL,
|
||||||
DNS_EVENT_VIEWADBSHUTDOWN, adb_shutdown,
|
DNS_EVENT_VIEWADBSHUTDOWN, adb_shutdown,
|
||||||
view, NULL, NULL, NULL);
|
view, NULL, NULL, NULL);
|
||||||
|
ISC_EVENT_INIT(&view->reqevent, sizeof view->reqevent, 0, NULL,
|
||||||
|
DNS_EVENT_VIEWREQSHUTDOWN, req_shutdown,
|
||||||
|
view, NULL, NULL, NULL);
|
||||||
view->magic = DNS_VIEW_MAGIC;
|
view->magic = DNS_VIEW_MAGIC;
|
||||||
|
|
||||||
*viewp = view;
|
*viewp = view;
|
||||||
@ -214,6 +222,7 @@ destroy(dns_view_t *view) {
|
|||||||
REQUIRE(view->references == 0);
|
REQUIRE(view->references == 0);
|
||||||
REQUIRE(RESSHUTDOWN(view));
|
REQUIRE(RESSHUTDOWN(view));
|
||||||
REQUIRE(ADBSHUTDOWN(view));
|
REQUIRE(ADBSHUTDOWN(view));
|
||||||
|
REQUIRE(REQSHUTDOWN(view));
|
||||||
|
|
||||||
if (view->peers != NULL)
|
if (view->peers != NULL)
|
||||||
dns_peerlist_detach(&view->peers);
|
dns_peerlist_detach(&view->peers);
|
||||||
@ -225,6 +234,8 @@ destroy(dns_view_t *view) {
|
|||||||
dns_adb_detach(&view->adb);
|
dns_adb_detach(&view->adb);
|
||||||
if (view->resolver != NULL)
|
if (view->resolver != NULL)
|
||||||
dns_resolver_detach(&view->resolver);
|
dns_resolver_detach(&view->resolver);
|
||||||
|
if (view->requestmgr != NULL)
|
||||||
|
dns_requestmgr_detach(&view->requestmgr);
|
||||||
if (view->task != NULL)
|
if (view->task != NULL)
|
||||||
isc_task_detach(&view->task);
|
isc_task_detach(&view->task);
|
||||||
if (view->hints != NULL)
|
if (view->hints != NULL)
|
||||||
@ -253,7 +264,8 @@ all_done(dns_view_t *view) {
|
|||||||
* Caller must be holding the view lock.
|
* Caller must be holding the view lock.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (view->references == 0 && RESSHUTDOWN(view) && ADBSHUTDOWN(view))
|
if (view->references == 0 && RESSHUTDOWN(view) &&
|
||||||
|
ADBSHUTDOWN(view) && REQSHUTDOWN(view))
|
||||||
return (ISC_TRUE);
|
return (ISC_TRUE);
|
||||||
|
|
||||||
return (ISC_FALSE);
|
return (ISC_FALSE);
|
||||||
@ -281,6 +293,8 @@ dns_view_detach(dns_view_t **viewp) {
|
|||||||
dns_resolver_shutdown(view->resolver);
|
dns_resolver_shutdown(view->resolver);
|
||||||
if (!ADBSHUTDOWN(view))
|
if (!ADBSHUTDOWN(view))
|
||||||
dns_adb_shutdown(view->adb);
|
dns_adb_shutdown(view->adb);
|
||||||
|
if (!REQSHUTDOWN(view))
|
||||||
|
dns_requestmgr_shutdown(view->requestmgr);
|
||||||
done = all_done(view);
|
done = all_done(view);
|
||||||
}
|
}
|
||||||
UNLOCK(&view->lock);
|
UNLOCK(&view->lock);
|
||||||
@ -335,6 +349,28 @@ adb_shutdown(isc_task_t *task, isc_event_t *event) {
|
|||||||
destroy(view);
|
destroy(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
req_shutdown(isc_task_t *task, isc_event_t *event) {
|
||||||
|
dns_view_t *view = event->ev_arg;
|
||||||
|
isc_boolean_t done;
|
||||||
|
|
||||||
|
REQUIRE(event->ev_type == DNS_EVENT_VIEWREQSHUTDOWN);
|
||||||
|
REQUIRE(DNS_VIEW_VALID(view));
|
||||||
|
REQUIRE(view->task == task);
|
||||||
|
|
||||||
|
LOCK(&view->lock);
|
||||||
|
|
||||||
|
view->attributes |= DNS_VIEWATTR_REQSHUTDOWN;
|
||||||
|
done = all_done(view);
|
||||||
|
|
||||||
|
UNLOCK(&view->lock);
|
||||||
|
|
||||||
|
isc_event_free(&event);
|
||||||
|
|
||||||
|
if (done)
|
||||||
|
destroy(view);
|
||||||
|
}
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
dns_view_createresolver(dns_view_t *view,
|
dns_view_createresolver(dns_view_t *view,
|
||||||
isc_taskmgr_t *taskmgr, unsigned int ntasks,
|
isc_taskmgr_t *taskmgr, unsigned int ntasks,
|
||||||
@ -381,6 +417,19 @@ dns_view_createresolver(dns_view_t *view,
|
|||||||
dns_adb_whenshutdown(view->adb, view->task, &event);
|
dns_adb_whenshutdown(view->adb, view->task, &event);
|
||||||
view->attributes &= ~DNS_VIEWATTR_ADBSHUTDOWN;
|
view->attributes &= ~DNS_VIEWATTR_ADBSHUTDOWN;
|
||||||
|
|
||||||
|
result = dns_requestmgr_create(view->mctx, timermgr, socketmgr,
|
||||||
|
dns_resolver_dispatchv4(view->resolver),
|
||||||
|
dns_resolver_dispatchv6(view->resolver),
|
||||||
|
&view->requestmgr);
|
||||||
|
if (result != ISC_R_SUCCESS) {
|
||||||
|
dns_adb_shutdown(view->adb);
|
||||||
|
dns_resolver_shutdown(view->resolver);
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
event = &view->reqevent;
|
||||||
|
dns_requestmgr_whenshutdown(view->requestmgr, view->task, &event);
|
||||||
|
view->attributes &= ~DNS_VIEWATTR_REQSHUTDOWN;
|
||||||
|
|
||||||
return (ISC_R_SUCCESS);
|
return (ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -447,6 +496,24 @@ dns_view_addzone(dns_view_t *view, dns_zone_t *zone) {
|
|||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
set_resolver(dns_zone_t *zone, void *ptr) {
|
||||||
|
dns_zone_setresolver(zone, ptr);
|
||||||
|
return (ISC_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
set_requestmgr(dns_zone_t *zone, void *ptr) {
|
||||||
|
dns_zone_setrequestmgr(zone, ptr);
|
||||||
|
return (ISC_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
set_adb(dns_zone_t *zone, void *ptr) {
|
||||||
|
dns_zone_setadb(zone, ptr);
|
||||||
|
return (ISC_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
dns_view_freeze(dns_view_t *view) {
|
dns_view_freeze(dns_view_t *view) {
|
||||||
|
|
||||||
@ -460,6 +527,16 @@ dns_view_freeze(dns_view_t *view) {
|
|||||||
if (view->resolver != NULL) {
|
if (view->resolver != NULL) {
|
||||||
INSIST(view->cachedb != NULL);
|
INSIST(view->cachedb != NULL);
|
||||||
dns_resolver_freeze(view->resolver);
|
dns_resolver_freeze(view->resolver);
|
||||||
|
(void)dns_zt_apply(view->zonetable, ISC_FALSE,
|
||||||
|
set_resolver, view->resolver);
|
||||||
|
}
|
||||||
|
if (view->requestmgr != NULL) {
|
||||||
|
(void)dns_zt_apply(view->zonetable, ISC_FALSE,
|
||||||
|
set_requestmgr, view->requestmgr);
|
||||||
|
}
|
||||||
|
if (view->adb != NULL) {
|
||||||
|
(void)dns_zt_apply(view->zonetable, ISC_FALSE,
|
||||||
|
set_adb, view->adb);
|
||||||
}
|
}
|
||||||
view->frozen = ISC_TRUE;
|
view->frozen = ISC_TRUE;
|
||||||
}
|
}
|
||||||
|
1079
lib/dns/zone.c
1079
lib/dns/zone.c
File diff suppressed because it is too large
Load Diff
@ -169,13 +169,13 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_c_view_t *cview,
|
|||||||
if (result == ISC_R_SUCCESS)
|
if (result == ISC_R_SUCCESS)
|
||||||
dns_zone_setoption(zone, DNS_ZONE_O_DIALUP, boolean);
|
dns_zone_setoption(zone, DNS_ZONE_O_DIALUP, boolean);
|
||||||
else
|
else
|
||||||
dns_zone_clearoption(zone, DNS_ZONE_O_DIALUP);
|
dns_zone_setoption(zone, DNS_ZONE_O_DIALUP, ISC_FALSE);
|
||||||
|
|
||||||
result = dns_c_zone_getnotify(czone, &boolean);
|
result = dns_c_zone_getnotify(czone, &boolean);
|
||||||
if (result == ISC_R_SUCCESS)
|
if (result == ISC_R_SUCCESS)
|
||||||
dns_zone_setoption(zone, DNS_ZONE_O_NOTIFY, boolean);
|
dns_zone_setoption(zone, DNS_ZONE_O_NOTIFY, boolean);
|
||||||
else
|
else
|
||||||
dns_zone_clearoption(zone, DNS_ZONE_O_NOTIFY);
|
dns_zone_setoption(zone, DNS_ZONE_O_NOTIFY, ISC_TRUE);
|
||||||
|
|
||||||
result = dns_c_zone_getalsonotify(czone, &iplist);
|
result = dns_c_zone_getalsonotify(czone, &iplist);
|
||||||
if (result == ISC_R_SUCCESS) {
|
if (result == ISC_R_SUCCESS) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user