resolver.h 14.8 KB
Newer Older
Bob Halley's avatar
Bob Halley committed
1
/*
Automatic Updater's avatar
Automatic Updater committed
2
 * Copyright (C) 2004-2010  Internet Systems Consortium, Inc. ("ISC")
Mark Andrews's avatar
Mark Andrews committed
3
 * Copyright (C) 1999-2001, 2003  Internet Software Consortium.
4
 *
Automatic Updater's avatar
Automatic Updater committed
5
 * Permission to use, copy, modify, and/or distribute this software for any
Bob Halley's avatar
Bob Halley committed
6 7
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
8
 *
Mark Andrews's avatar
Mark Andrews committed
9 10 11 12 13 14 15
 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
Bob Halley's avatar
Bob Halley committed
16 17
 */

18
/* $Id: resolver.h,v 1.68 2011/02/03 05:41:54 marka Exp $ */
David Lawrence's avatar
David Lawrence committed
19

Bob Halley's avatar
Bob Halley committed
20 21 22 23 24 25 26
#ifndef DNS_RESOLVER_H
#define DNS_RESOLVER_H 1

/*****
 ***** Module Info
 *****/

27
/*! \file dns/resolver.h
Bob Halley's avatar
Bob Halley committed
28
 *
29
 * \brief
Andreas Gustafsson's avatar
Andreas Gustafsson committed
30 31 32 33 34 35
 * This is the BIND 9 resolver, the module responsible for resolving DNS
 * requests by iteratively querying authoritative servers and following
 * referrals.  This is a "full resolver", not to be confused with
 * the stub resolvers most people associate with the word "resolver".
 * The full resolver is part of the caching name server or resolver
 * daemon the stub resolver talks to.
Bob Halley's avatar
Bob Halley committed
36 37
 *
 * MP:
38
 *\li	The module ensures appropriate synchronization of data structures it
Bob Halley's avatar
Bob Halley committed
39 40 41
 *	creates and manipulates.
 *
 * Reliability:
42
 *\li	No anticipated impact.
Bob Halley's avatar
Bob Halley committed
43 44
 *
 * Resources:
45
 *\li	TBS
Bob Halley's avatar
Bob Halley committed
46 47
 *
 * Security:
48
 *\li	No anticipated impact.
Bob Halley's avatar
Bob Halley committed
49 50
 *
 * Standards:
51 52
 *\li	RFCs:	1034, 1035, 2181, TBS
 *\li	Drafts:	TBS
Bob Halley's avatar
Bob Halley committed
53 54 55
 */

#include <isc/lang.h>
Bob Halley's avatar
Bob Halley committed
56
#include <isc/socket.h>
Bob Halley's avatar
Bob Halley committed
57 58

#include <dns/types.h>
Bob Halley's avatar
Bob Halley committed
59
#include <dns/fixedname.h>
Bob Halley's avatar
Bob Halley committed
60 61 62

ISC_LANG_BEGINDECLS

63
/*%
Bob Halley's avatar
Bob Halley committed
64 65 66
 * A dns_fetchevent_t is sent when a 'fetch' completes.  Any of 'db',
 * 'node', 'rdataset', and 'sigrdataset' may be bound.  It is the
 * receiver's responsibility to detach before freeing the event.
67
 * \brief
68 69 70
 * 'rdataset', 'sigrdataset', 'client' and 'id' are the values that were
 * supplied when dns_resolver_createfetch() was called.  They are returned
 *  to the caller so that they may be freed.
Bob Halley's avatar
Bob Halley committed
71
 */
Bob Halley's avatar
Bob Halley committed
72 73
typedef struct dns_fetchevent {
	ISC_EVENT_COMMON(struct dns_fetchevent);
Bob Halley's avatar
Bob Halley committed
74
	dns_fetch_t *			fetch;
75
	isc_result_t			result;
Bob Halley's avatar
Bob Halley committed
76 77 78 79 80 81
	dns_rdatatype_t			qtype;
	dns_db_t *			db;
	dns_dbnode_t *			node;
	dns_rdataset_t *		rdataset;
	dns_rdataset_t *		sigrdataset;
	dns_fixedname_t			foundname;
82 83
	isc_sockaddr_t *		client;
	dns_messageid_t			id;
84
	isc_result_t			vresult;
Bob Halley's avatar
Bob Halley committed
85
} dns_fetchevent_t;
Bob Halley's avatar
Bob Halley committed
86

Bob Halley's avatar
Bob Halley committed
87 88 89
/*
 * Options that modify how a 'fetch' is done.
 */
90 91 92 93 94 95
#define DNS_FETCHOPT_TCP		0x01	     /*%< Use TCP. */
#define DNS_FETCHOPT_UNSHARED		0x02	     /*%< See below. */
#define DNS_FETCHOPT_RECURSIVE		0x04	     /*%< Set RD? */
#define DNS_FETCHOPT_NOEDNS0		0x08	     /*%< Do not use EDNS. */
#define DNS_FETCHOPT_FORWARDONLY	0x10	     /*%< Only use forwarders. */
#define DNS_FETCHOPT_NOVALIDATE		0x20	     /*%< Disable validation. */
96
#define DNS_FETCHOPT_EDNS512		0x40	     /*%< Advertise a 512 byte
97 98
							  UDP buffer. */
#define DNS_FETCHOPT_WANTNSID           0x80         /*%< Request NSID */
Bob Halley's avatar
Bob Halley committed
99

100 101 102 103
#define	DNS_FETCHOPT_EDNSVERSIONSET	0x00800000
#define	DNS_FETCHOPT_EDNSVERSIONMASK	0xff000000
#define	DNS_FETCHOPT_EDNSVERSIONSHIFT	24

104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
/*
 * Upper bounds of class of query RTT (ms).  Corresponds to
 * dns_resstatscounter_queryrttX statistics counters.
 */
#define DNS_RESOLVER_QRYRTTCLASS0	10
#define DNS_RESOLVER_QRYRTTCLASS0STR	"10"
#define DNS_RESOLVER_QRYRTTCLASS1	100
#define DNS_RESOLVER_QRYRTTCLASS1STR	"100"
#define DNS_RESOLVER_QRYRTTCLASS2	500
#define DNS_RESOLVER_QRYRTTCLASS2STR	"500"
#define DNS_RESOLVER_QRYRTTCLASS3	800
#define DNS_RESOLVER_QRYRTTCLASS3STR	"800"
#define DNS_RESOLVER_QRYRTTCLASS4	1600
#define DNS_RESOLVER_QRYRTTCLASS4STR	"1600"

Bob Halley's avatar
Bob Halley committed
119 120 121 122
/*
 * XXXRTH  Should this API be made semi-private?  (I.e.
 * _dns_resolver_create()).
 */
Bob Halley's avatar
Bob Halley committed
123

124 125 126
#define DNS_RESOLVER_CHECKNAMES		0x01
#define DNS_RESOLVER_CHECKNAMESFAIL	0x02

127
isc_result_t
Bob Halley's avatar
Bob Halley committed
128
dns_resolver_create(dns_view_t *view,
Bob Halley's avatar
Bob Halley committed
129
		    isc_taskmgr_t *taskmgr, unsigned int ntasks,
Bob Halley's avatar
Bob Halley committed
130 131
		    isc_socketmgr_t *socketmgr,
		    isc_timermgr_t *timermgr,
132
		    unsigned int options,
133
		    dns_dispatchmgr_t *dispatchmgr,
134 135 136
		    dns_dispatch_t *dispatchv4,
		    dns_dispatch_t *dispatchv6,
		    dns_resolver_t **resp);
137

138
/*%<
Bob Halley's avatar
Bob Halley committed
139 140 141 142
 * Create a resolver.
 *
 * Notes:
 *
143
 *\li	Generally, applications should not create a resolver directly, but
Bob Halley's avatar
Bob Halley committed
144 145 146 147
 *	should instead call dns_view_createresolver().
 *
 * Requires:
 *
148
 *\li	'view' is a valid view.
Bob Halley's avatar
Bob Halley committed
149
 *
150
 *\li	'taskmgr' is a valid task manager.
Bob Halley's avatar
Bob Halley committed
151
 *
152
 *\li	'ntasks' > 0.
Bob Halley's avatar
Bob Halley committed
153
 *
154
 *\li	'socketmgr' is a valid socket manager.
Bob Halley's avatar
Bob Halley committed
155
 *
156
 *\li	'timermgr' is a valid timer manager.
Bob Halley's avatar
Bob Halley committed
157
 *
158
 *\li	'dispatchv4' is a valid dispatcher with an IPv4 UDP socket, or is NULL.
159
 *
160
 *\li	'dispatchv6' is a valid dispatcher with an IPv6 UDP socket, or is NULL.
Bob Halley's avatar
Bob Halley committed
161
 *
Mark Andrews's avatar
Mark Andrews committed
162
 *\li	resp != NULL && *resp == NULL.
Bob Halley's avatar
Bob Halley committed
163 164 165
 *
 * Returns:
 *
166
 *\li	#ISC_R_SUCCESS				On success.
Bob Halley's avatar
Bob Halley committed
167
 *
168
 *\li	Anything else				Failure.
Bob Halley's avatar
Bob Halley committed
169
 */
Bob Halley's avatar
Bob Halley committed
170

171 172
void
dns_resolver_freeze(dns_resolver_t *res);
173
/*%<
174 175 176 177
 * Freeze resolver.
 *
 * Notes:
 *
178
 *\li	Certain configuration changes cannot be made after the resolver
179
 *	is frozen.  Fetches cannot be created until the resolver is frozen.
180 181 182
 *
 * Requires:
 *
183
 *\li	'res' is a valid resolver.
184 185 186
 *
 * Ensures:
 *
187
 *\li	'res' is frozen.
188 189
 */

Bob Halley's avatar
Bob Halley committed
190 191
void
dns_resolver_prime(dns_resolver_t *res);
192
/*%<
Bob Halley's avatar
Bob Halley committed
193 194 195 196
 * Prime resolver.
 *
 * Notes:
 *
197
 *\li	Resolvers which have a forwarding policy other than dns_fwdpolicy_only
Bob Halley's avatar
Bob Halley committed
198 199 200 201 202 203
 *	need to be primed with the root nameservers, otherwise the root
 *	nameserver hints data may be used indefinitely.  This function requests
 *	that the resolver start a priming fetch, if it isn't already priming.
 *
 * Requires:
 *
204
 *\li	'res' is a valid, frozen resolver.
Bob Halley's avatar
Bob Halley committed
205 206 207
 */


208 209 210
void
dns_resolver_whenshutdown(dns_resolver_t *res, isc_task_t *task,
			  isc_event_t **eventp);
211
/*%<
Bob Halley's avatar
Bob Halley committed
212 213 214 215
 * Send '*eventp' to 'task' when 'res' has completed shutdown.
 *
 * Notes:
 *
216
 *\li	It is not safe to detach the last reference to 'res' until
Bob Halley's avatar
Bob Halley committed
217 218 219 220
 *	shutdown is complete.
 *
 * Requires:
 *
221
 *\li	'res' is a valid resolver.
Bob Halley's avatar
Bob Halley committed
222
 *
223
 *\li	'task' is a valid task.
Bob Halley's avatar
Bob Halley committed
224
 *
225
 *\li	*eventp is a valid event.
Bob Halley's avatar
Bob Halley committed
226 227 228
 *
 * Ensures:
 *
229
 *\li	*eventp == NULL.
Bob Halley's avatar
Bob Halley committed
230
 */
231 232 233

void
dns_resolver_shutdown(dns_resolver_t *res);
234
/*%<
Bob Halley's avatar
Bob Halley committed
235 236 237 238
 * Start the shutdown process for 'res'.
 *
 * Notes:
 *
239
 *\li	This call has no effect if the resolver is already shutting down.
Bob Halley's avatar
Bob Halley committed
240 241 242
 *
 * Requires:
 *
243
 *\li	'res' is a valid resolver.
Bob Halley's avatar
Bob Halley committed
244
 */
245

Bob Halley's avatar
Bob Halley committed
246 247 248 249 250 251
void
dns_resolver_attach(dns_resolver_t *source, dns_resolver_t **targetp);

void
dns_resolver_detach(dns_resolver_t **resp);

252
isc_result_t
Bob Halley's avatar
Bob Halley committed
253 254
dns_resolver_createfetch(dns_resolver_t *res, dns_name_t *name,
			 dns_rdatatype_t type,
Bob Halley's avatar
Bob Halley committed
255
			 dns_name_t *domain, dns_rdataset_t *nameservers,
Bob Halley's avatar
Bob Halley committed
256 257 258
			 dns_forwarders_t *forwarders,
			 unsigned int options, isc_task_t *task,
			 isc_taskaction_t action, void *arg,
Bob Halley's avatar
Bob Halley committed
259
			 dns_rdataset_t *rdataset,
260
			 dns_rdataset_t *sigrdataset,
Bob Halley's avatar
Bob Halley committed
261
			 dns_fetch_t **fetchp);
262 263 264 265 266 267 268 269 270 271 272 273

isc_result_t
dns_resolver_createfetch2(dns_resolver_t *res, dns_name_t *name,
			  dns_rdatatype_t type,
			  dns_name_t *domain, dns_rdataset_t *nameservers,
			  dns_forwarders_t *forwarders,
			  isc_sockaddr_t *client, isc_uint16_t id,
			  unsigned int options, isc_task_t *task,
			  isc_taskaction_t action, void *arg,
			  dns_rdataset_t *rdataset,
			  dns_rdataset_t *sigrdataset,
			  dns_fetch_t **fetchp);
274
/*%<
Bob Halley's avatar
Bob Halley committed
275 276 277 278
 * Recurse to answer a question.
 *
 * Notes:
 *
279
 *\li	This call starts a query for 'name', type 'type'.
Bob Halley's avatar
Bob Halley committed
280
 *
281
 *\li	The 'domain' is a parent domain of 'name' for which
Andreas Gustafsson's avatar
Andreas Gustafsson committed
282
 *	a set of name servers 'nameservers' is known.  If no
283
 *	such name server information is available, set
Andreas Gustafsson's avatar
Andreas Gustafsson committed
284 285
 * 	'domain' and 'nameservers' to NULL.
 *
286
 *\li	'forwarders' is unimplemented, and subject to change when
Andreas Gustafsson's avatar
Andreas Gustafsson committed
287
 *	we figure out how selective forwarding will work.
Bob Halley's avatar
Bob Halley committed
288
 *
289 290
 *\li	When the fetch completes (successfully or otherwise), a
 *	#DNS_EVENT_FETCHDONE event with action 'action' and arg 'arg' will be
Bob Halley's avatar
Bob Halley committed
291 292
 *	posted to 'task'.
 *
293
 *\li	The values of 'rdataset' and 'sigrdataset' will be returned in
Bob Halley's avatar
Bob Halley committed
294 295
 *	the FETCHDONE event.
 *
296 297 298 299
 *\li	'client' and 'id' are used for duplicate query detection.  '*client'
 *	must remain stable until after 'action' has been called or
 *	dns_resolver_cancelfetch() is called.
 *
Bob Halley's avatar
Bob Halley committed
300 301
 * Requires:
 *
302
 *\li	'res' is a valid resolver that has been frozen.
Bob Halley's avatar
Bob Halley committed
303
 *
304
 *\li	'name' is a valid name.
Bob Halley's avatar
Bob Halley committed
305
 *
306
 *\li	'type' is not a meta type other than ANY.
Bob Halley's avatar
Bob Halley committed
307
 *
308
 *\li	'domain' is a valid name or NULL.
Bob Halley's avatar
Bob Halley committed
309
 *
310
 *\li	'nameservers' is a valid NS rdataset (whose owner name is 'domain')
311
 *	iff. 'domain' is not NULL.
Bob Halley's avatar
Bob Halley committed
312
 *
313
 *\li	'forwarders' is NULL.
Bob Halley's avatar
Bob Halley committed
314
 *
315 316
 *\li	'client' is a valid sockaddr or NULL.
 *
317
 *\li	'options' contains valid options.
Bob Halley's avatar
Bob Halley committed
318
 *
319
 *\li	'rdataset' is a valid, disassociated rdataset.
Bob Halley's avatar
Bob Halley committed
320
 *
321
 *\li	'sigrdataset' is NULL, or is a valid, disassociated rdataset.
Bob Halley's avatar
Bob Halley committed
322
 *
323
 *\li	fetchp != NULL && *fetchp == NULL.
Bob Halley's avatar
Bob Halley committed
324 325 326
 *
 * Returns:
 *
327
 *\li	#ISC_R_SUCCESS					Success
328
 *\li	#DNS_R_DUPLICATE
329
 *\li	#DNS_R_DROP
Bob Halley's avatar
Bob Halley committed
330
 *
331
 *\li	Many other values are possible, all of which indicate failure.
Bob Halley's avatar
Bob Halley committed
332
 */
Bob Halley's avatar
Bob Halley committed
333

Bob Halley's avatar
Bob Halley committed
334
void
335
dns_resolver_cancelfetch(dns_fetch_t *fetch);
336
/*%<
Bob Halley's avatar
Bob Halley committed
337 338 339 340
 * Cancel 'fetch'.
 *
 * Notes:
 *
341 342
 *\li	If 'fetch' has not completed, post its FETCHDONE event with a
 *	result code of #ISC_R_CANCELED.
343 344 345
 *
 * Requires:
 *
346
 *\li	'fetch' is a valid fetch.
Bob Halley's avatar
Bob Halley committed
347
 */
Bob Halley's avatar
Bob Halley committed
348

Bob Halley's avatar
Bob Halley committed
349
void
350
dns_resolver_destroyfetch(dns_fetch_t **fetchp);
351
/*%<
Bob Halley's avatar
Bob Halley committed
352 353 354 355
 * Destroy 'fetch'.
 *
 * Requires:
 *
356
 *\li	'*fetchp' is a valid fetch.
357
 *
358
 *\li	The caller has received the FETCHDONE event (either because the
Bob Halley's avatar
Bob Halley committed
359 360 361 362
 *	fetch completed or because dns_resolver_cancelfetch() was called).
 *
 * Ensures:
 *
363
 *\li	*fetchp == NULL.
Bob Halley's avatar
Bob Halley committed
364
 */
Mark Andrews's avatar
Mark Andrews committed
365

366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
void
dns_resolver_logfetch(dns_fetch_t *fetch, isc_log_t *lctx,
		      isc_logcategory_t *category, isc_logmodule_t *module,
		      int level, isc_boolean_t duplicateok);
/*%<
 * Dump a log message on internal state at the completion of given 'fetch'.
 * 'lctx', 'category', 'module', and 'level' are used to write the log message.
 * By default, only one log message is written even if the corresponding fetch
 * context serves multiple clients; if 'duplicateok' is true the suppression
 * is disabled and the message can be written every time this function is
 * called.
 *
 * Requires:
 *
 *\li	'fetch' is a valid fetch, and has completed.
 */

383 384 385
dns_dispatchmgr_t *
dns_resolver_dispatchmgr(dns_resolver_t *resolver);

386 387 388 389 390 391 392 393 394
dns_dispatch_t *
dns_resolver_dispatchv4(dns_resolver_t *resolver);

dns_dispatch_t *
dns_resolver_dispatchv6(dns_resolver_t *resolver);

isc_socketmgr_t *
dns_resolver_socketmgr(dns_resolver_t *resolver);

395 396 397
isc_taskmgr_t *
dns_resolver_taskmgr(dns_resolver_t *resolver);

Mark Andrews's avatar
Mark Andrews committed
398 399
isc_uint32_t
dns_resolver_getlamettl(dns_resolver_t *resolver);
400
/*%<
Mark Andrews's avatar
Mark Andrews committed
401 402 403
 * Get the resolver's lame-ttl.  zero => no lame processing.
 *
 * Requires:
404
 *\li	'resolver' to be valid.
Mark Andrews's avatar
Mark Andrews committed
405 406 407 408
 */

void
dns_resolver_setlamettl(dns_resolver_t *resolver, isc_uint32_t lame_ttl);
409
/*%<
Mark Andrews's avatar
Mark Andrews committed
410 411 412
 * Set the resolver's lame-ttl.  zero => no lame processing.
 *
 * Requires:
413
 *\li	'resolver' to be valid.
Mark Andrews's avatar
Mark Andrews committed
414 415
 */

416 417
unsigned int
dns_resolver_nrunning(dns_resolver_t *resolver);
418
/*%<
419 420 421 422 423 424 425
 * Return the number of currently running resolutions in this
 * resolver.  This is may be less than the number of outstanding
 * fetches due to multiple identical fetches, or more than the
 * number of of outstanding fetches due to the fact that resolution
 * can continue even though a fetch has been canceled.
 */

426 427 428
isc_result_t
dns_resolver_addalternate(dns_resolver_t *resolver, isc_sockaddr_t *alt,
			  dns_name_t *name, in_port_t port);
429
/*%<
430 431 432 433 434
 * Add alternate addresses to be tried in the event that the nameservers
 * for a zone are not available in the address families supported by the
 * operating system.
 *
 * Require:
435
 * \li	only one of 'name' or 'alt' to be valid.
436 437
 */

438 439
void
dns_resolver_setudpsize(dns_resolver_t *resolver, isc_uint16_t udpsize);
440
/*%<
441 442 443 444 445
 * Set the EDNS UDP buffer size advertised by the server.
 */

isc_uint16_t
dns_resolver_getudpsize(dns_resolver_t *resolver);
446
/*%<
447 448 449
 * Get the current EDNS UDP buffer size.
 */

450 451
void
dns_resolver_reset_algorithms(dns_resolver_t *resolver);
452
/*%<
453 454 455 456 457 458
 * Clear the disabled DNSSEC algorithms.
 */

isc_result_t
dns_resolver_disable_algorithm(dns_resolver_t *resolver, dns_name_t *name,
			       unsigned int alg);
459
/*%<
460 461 462 463
 * Mark the give DNSSEC algorithm as disabled and below 'name'.
 * Valid algorithms are less than 256.
 *
 * Returns:
464 465 466
 *\li	#ISC_R_SUCCESS
 *\li	#ISC_R_RANGE
 *\li	#ISC_R_NOMEMORY
467 468 469 470 471
 */

isc_boolean_t
dns_resolver_algorithm_supported(dns_resolver_t *resolver, dns_name_t *name,
				 unsigned int alg);
472
/*%<
473 474 475 476 477 478
 * Check if the given algorithm is supported by this resolver.
 * This checks if the algorithm has been disabled via
 * dns_resolver_disable_algorithm() then the underlying
 * crypto libraries if not specifically disabled.
 */

479 480
isc_boolean_t
dns_resolver_digest_supported(dns_resolver_t *resolver, unsigned int digest_type);
Mark Andrews's avatar
Mark Andrews committed
481
/*%<
482 483 484
 * Is this digest type supported.
 */

485 486 487 488 489 490 491 492 493 494
void
dns_resolver_resetmustbesecure(dns_resolver_t *resolver);

isc_result_t
dns_resolver_setmustbesecure(dns_resolver_t *resolver, dns_name_t *name,
			     isc_boolean_t value);

isc_boolean_t
dns_resolver_getmustbesecure(dns_resolver_t *resolver, dns_name_t *name);

495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515

void
dns_resolver_settimeout(dns_resolver_t *resolver, unsigned int seconds);
/*%<
 * Set the length of time the resolver will work on a query, in seconds.
 *
 * If timeout is 0, the default timeout will be applied.
 *
 * Requires:
 * \li  resolver to be valid.
 */

unsigned int
dns_resolver_gettimeout(dns_resolver_t *resolver);
/*%<
 * Get the current length of time the resolver will work on a query, in seconds.
 *
 * Requires:
 * \li  resolver to be valid.
 */

516 517 518 519 520 521 522
void
dns_resolver_setclientsperquery(dns_resolver_t *resolver,
				isc_uint32_t min, isc_uint32_t max);

void
dns_resolver_getclientsperquery(dns_resolver_t *resolver, isc_uint32_t *cur,
				isc_uint32_t *min, isc_uint32_t *max);
523 524 525

isc_boolean_t
dns_resolver_getzeronosoattl(dns_resolver_t *resolver);
526

527 528 529
void
dns_resolver_setzeronosoattl(dns_resolver_t *resolver, isc_boolean_t state);

530 531 532
unsigned int
dns_resolver_getoptions(dns_resolver_t *resolver);

533 534
void
dns_resolver_addbadcache(dns_resolver_t *resolver, dns_name_t *name,
Automatic Updater's avatar
Automatic Updater committed
535
			 dns_rdatatype_t type, isc_time_t *expire);
536 537 538 539 540 541 542 543 544 545
/*%<
 * Add a entry to the bad cache for <name,type> that will expire at 'expire'.
 *
 * Requires:
 * \li	resolver to be valid.
 * \li	name to be valid.
 */

isc_boolean_t
dns_resolver_getbadcache(dns_resolver_t *resolver, dns_name_t *name,
Automatic Updater's avatar
Automatic Updater committed
546
			 dns_rdatatype_t type, isc_time_t *now);
547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574
/*%<
 * Check to see if there is a unexpired entry in the bad cache for
 * <name,type>.
 *
 * Requires:
 * \li	resolver to be valid.
 * \li	name to be valid.
 */

void
dns_resolver_flushbadcache(dns_resolver_t *resolver, dns_name_t *name);
/*%<
 * Flush the bad cache of all entries at 'name' if 'name' is non NULL.
 * Flush the entire bad cache if 'name' is NULL.
 *
 * Requires:
 * \li	resolver to be valid.
 */

void
dns_resolver_printbadcache(dns_resolver_t *resolver, FILE *fp);
/*%
 * Print out the contents of the bad cache to 'fp'.
 *
 * Requires:
 * \li	resolver to be valid.
 */

Bob Halley's avatar
Bob Halley committed
575 576 577
ISC_LANG_ENDDECLS

#endif /* DNS_RESOLVER_H */