2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 06:25:31 +00:00

IPv6 query flood suppression

This commit is contained in:
Bob Halley
1999-12-14 00:10:06 +00:00
parent 525cdd36b3
commit 4a3ad0da97
3 changed files with 37 additions and 18 deletions

View File

@@ -367,8 +367,11 @@ static isc_result_t dbfind_a6(dns_adbname_t *, isc_stdtime_t, isc_boolean_t);
*/ */
#define FIND_WANTEVENT(fn) (((fn)->options & DNS_ADBFIND_WANTEVENT) != 0) #define FIND_WANTEVENT(fn) (((fn)->options & DNS_ADBFIND_WANTEVENT) != 0)
#define FIND_WANTEMPTYEVENT(fn) (((fn)->options & DNS_ADBFIND_EMPTYEVENT) != 0) #define FIND_WANTEMPTYEVENT(fn) (((fn)->options & DNS_ADBFIND_EMPTYEVENT) != 0)
#define FIND_AVOIDFETCHES(fn) (((fn)->options & DNS_ADBFIND_AVOIDFETCHES) \
!= 0)
#define FIND_HAS_ADDRS(fn) (!ISC_LIST_EMPTY((fn)->list)) #define FIND_HAS_ADDRS(fn) (!ISC_LIST_EMPTY((fn)->list))
/* /*
* These are currently used on simple unsigned ints, so they are * These are currently used on simple unsigned ints, so they are
* not really associated with any particular type. * not really associated with any particular type.
@@ -2158,6 +2161,7 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action,
isc_result_t result; isc_result_t result;
isc_boolean_t want_event; isc_boolean_t want_event;
unsigned int wanted_addresses; unsigned int wanted_addresses;
unsigned int wanted_fetches;
unsigned int query_pending; unsigned int query_pending;
REQUIRE(DNS_ADB_VALID(adb)); REQUIRE(DNS_ADB_VALID(adb));
@@ -2172,6 +2176,7 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action,
result = ISC_R_UNEXPECTED; result = ISC_R_UNEXPECTED;
wanted_addresses = (options & DNS_ADBFIND_ADDRESSMASK); wanted_addresses = (options & DNS_ADBFIND_ADDRESSMASK);
wanted_fetches = 0;
query_pending = 0; query_pending = 0;
want_event = ISC_FALSE; want_event = ISC_FALSE;
@@ -2270,16 +2275,7 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action,
if (NCACHE_RESULT(result)) if (NCACHE_RESULT(result))
goto v6; goto v6;
/* wanted_fetches |= DNS_ADBFIND_INET;
* Try to start fetches for v4.
*/
result = fetch_name_v4(adbname, now);
if (result == ISC_R_SUCCESS) {
DP(DEF_LEVEL,
"dns_adb_createfind: Started A fetch for name %p",
adbname);
goto v6;
}
} }
v6: v6:
@@ -2291,7 +2287,7 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action,
DP(DEF_LEVEL, DP(DEF_LEVEL,
"dns_adb_createfind: Found A6 for name %p", "dns_adb_createfind: Found A6 for name %p",
adbname); adbname);
goto copy; goto fetch;
} }
/* /*
@@ -2299,17 +2295,39 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action,
* another query. * another query.
*/ */
if (NCACHE_RESULT(result)) if (NCACHE_RESULT(result))
goto copy; goto fetch;
wanted_fetches |= DNS_ADBFIND_INET6;
}
fetch:
if (wanted_fetches != 0 &&
(!FIND_AVOIDFETCHES(find) || wanted_addresses == wanted_fetches)) {
/*
* We're missing at least one address family. Either the
* caller hasn't instructed us to avoid fetches, or we don't
* know anything about any of the address families that would
* be acceptable so we have to launch fetches.
*/
/* /*
* Try to start fetches for a6. * Start V4.
*/ */
result = fetch_name_a6(adbname, now, use_hints); if (WANT_INET(wanted_fetches) &&
if (result == ISC_R_SUCCESS) { fetch_name_v4(adbname, now) == ISC_R_SUCCESS) {
DP(DEF_LEVEL,
"dns_adb_createfind: Started A fetch for name %p",
adbname);
}
/*
* Start V6.
*/
if (WANT_INET6(wanted_fetches) &&
fetch_name_a6(adbname, now, use_hints) == ISC_R_SUCCESS) {
DP(DEF_LEVEL, DP(DEF_LEVEL,
"dns_adb_createfind: Started A6 fetch for name %p", "dns_adb_createfind: Started A6 fetch for name %p",
adbname); adbname);
goto copy;
} }
} }
@@ -2317,7 +2335,6 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action,
* Run through the name and copy out the bits we are * Run through the name and copy out the bits we are
* interested in. * interested in.
*/ */
copy:
copy_namehook_lists(adb, find, zone, adbname, now); copy_namehook_lists(adb, find, zone, adbname, now);
if (NAME_FETCH_V4(adbname)) if (NAME_FETCH_V4(adbname))

View File

@@ -140,6 +140,7 @@ struct dns_adbfind {
#define DNS_ADBFIND_EMPTYEVENT 0x00000004 #define DNS_ADBFIND_EMPTYEVENT 0x00000004
#define DNS_ADBFIND_WANTEVENT 0x00000008 #define DNS_ADBFIND_WANTEVENT 0x00000008
#define DNS_ADBFIND_AVOIDFETCHES 0x00000010
/* dns_adbaddrinfo_t /* dns_adbaddrinfo_t
* *

View File

@@ -1026,7 +1026,8 @@ fctx_getaddresses(fetchctx_t *fctx) {
return (DNS_R_SERVFAIL); return (DNS_R_SERVFAIL);
res = fctx->res; res = fctx->res;
options = DNS_ADBFIND_WANTEVENT|DNS_ADBFIND_EMPTYEVENT; options = DNS_ADBFIND_WANTEVENT | DNS_ADBFIND_EMPTYEVENT |
DNS_ADBFIND_AVOIDFETCHES;
if (res->dispatch4 != NULL) if (res->dispatch4 != NULL)
options |= DNS_ADBFIND_INET; options |= DNS_ADBFIND_INET;
if (res->dispatch6 != NULL) if (res->dispatch6 != NULL)