* Sort addrinfo list by RTT.
*/
static void
-sort_adbfind(dns_adbfind_t *find) {
+sort_adbfind(dns_adbfind_t *find, unsigned int bias) {
dns_adbaddrinfo_t *best, *curr;
dns_adbaddrinfolist_t sorted;
+ int family;
/* Lame N^2 bubble sort. */
ISC_LIST_INIT(sorted);
while (!ISC_LIST_EMPTY(find->list)) {
best = ISC_LIST_HEAD(find->list);
+ family = isc_sockaddr_pf(&best->sockaddr);
curr = ISC_LIST_NEXT(best, publink);
while (curr != NULL) {
- if (curr->srtt < best->srtt)
- best = curr;
+ if (isc_sockaddr_pf(&curr->sockaddr) == family) {
+ if (curr->srtt < best->srtt)
+ best = curr;
+ } else if (family == AF_INET6) {
+ if (curr->srtt + bias < best->srtt) {
+ best = curr;
+ family = AF_INET;
+ }
+ } else {
+ if (curr->srtt < best->srtt + bias) {
+ best = curr;
+ family = AF_INET6;
+ }
+ }
curr = ISC_LIST_NEXT(curr, publink);
}
ISC_LIST_UNLINK(find->list, best, publink);
* Sort a list of finds by server RTT.
*/
static void
-sort_finds(dns_adbfindlist_t *findlist) {
+sort_finds(dns_adbfindlist_t *findlist, unsigned int bias) {
dns_adbfind_t *best, *curr;
dns_adbfindlist_t sorted;
dns_adbaddrinfo_t *addrinfo, *bestaddrinfo;
+ int family;
/* Sort each find's addrinfo list by SRTT. */
for (curr = ISC_LIST_HEAD(*findlist);
curr != NULL;
curr = ISC_LIST_NEXT(curr, publink))
- sort_adbfind(curr);
+ sort_adbfind(curr, bias);
/* Lame N^2 bubble sort. */
ISC_LIST_INIT(sorted);
best = ISC_LIST_HEAD(*findlist);
bestaddrinfo = ISC_LIST_HEAD(best->list);
INSIST(bestaddrinfo != NULL);
+ family = isc_sockaddr_pf(&bestaddrinfo->sockaddr);
curr = ISC_LIST_NEXT(best, publink);
while (curr != NULL) {
addrinfo = ISC_LIST_HEAD(curr->list);
INSIST(addrinfo != NULL);
- if (addrinfo->srtt < bestaddrinfo->srtt) {
- best = curr;
- bestaddrinfo = addrinfo;
+ if (isc_sockaddr_pf(&addrinfo->sockaddr) == family) {
+ if (addrinfo->srtt < bestaddrinfo->srtt) {
+ best = curr;
+ bestaddrinfo = addrinfo;
+ }
+ } else if (family == AF_INET6) {
+ if (addrinfo->srtt + bias <
+ bestaddrinfo->srtt) {
+ best = curr;
+ bestaddrinfo = addrinfo;
+ family = AF_INET;
+ }
+ } else {
+ if (addrinfo->srtt <
+ bestaddrinfo->srtt + bias) {
+ best = curr;
+ bestaddrinfo = addrinfo;
+ family = AF_INET6;
+ }
}
curr = ISC_LIST_NEXT(curr, publink);
}
* We've found some addresses. We might still be looking
* for more addresses.
*/
- sort_finds(&fctx->finds);
- sort_finds(&fctx->altfinds);
+ sort_finds(&fctx->finds, res->view->v6bias);
+ sort_finds(&fctx->altfinds, 0);
result = ISC_R_SUCCESS;
}
{ "fetch-quota-params", &cfg_type_fetchquota, 0 },
{ "fetches-per-server", &cfg_type_fetchesper, 0 },
{ "fetches-per-zone", &cfg_type_fetchesper, 0 },
+#ifdef ALLOW_FILTER_AAAA
+ { "filter-aaaa", &cfg_type_bracketed_aml, 0 },
+ { "filter-aaaa-on-v4", &cfg_type_filter_aaaa, 0 },
+ { "filter-aaaa-on-v6", &cfg_type_filter_aaaa, 0 },
+#else
+ { "filter-aaaa", &cfg_type_bracketed_aml,
+ CFG_CLAUSEFLAG_NOTCONFIGURED },
+ { "filter-aaaa-on-v4", &cfg_type_filter_aaaa,
+ CFG_CLAUSEFLAG_NOTCONFIGURED },
+ { "filter-aaaa-on-v6", &cfg_type_filter_aaaa,
+ CFG_CLAUSEFLAG_NOTCONFIGURED },
+#endif
{ "ixfr-from-differences", &cfg_type_ixfrdifftype, 0 },
{ "lame-ttl", &cfg_type_ttlval, 0 },
{ "nocookie-udp-size", &cfg_type_uint32, 0 },
{ "queryport-pool-ports", &cfg_type_uint32, CFG_CLAUSEFLAG_OBSOLETE },
{ "queryport-pool-updateinterval", &cfg_type_uint32,
CFG_CLAUSEFLAG_OBSOLETE },
+ { "rate-limit", &cfg_type_rrl, 0 },
{ "recursion", &cfg_type_boolean, 0 },
{ "request-sit", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "request-nsid", &cfg_type_boolean, 0 },
{ "require-server-cookie", &cfg_type_boolean, 0 },
{ "resolver-query-timeout", &cfg_type_uint32, 0 },
+ { "response-policy", &cfg_type_rpz, 0 },
{ "rfc2308-type1", &cfg_type_boolean, CFG_CLAUSEFLAG_NYI },
{ "root-delegation-only", &cfg_type_optional_exclude, 0 },
{ "rrset-order", &cfg_type_rrsetorder, 0 },
{ "topology", &cfg_type_bracketed_aml, CFG_CLAUSEFLAG_NOTIMP },
{ "transfer-format", &cfg_type_transferformat, 0 },
{ "use-queryport-pool", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
+ { "v6-bias", &cfg_type_uint32, 0 },
{ "zero-no-soa-ttl-cache", &cfg_type_boolean, 0 },
-#ifdef ALLOW_FILTER_AAAA
- { "filter-aaaa", &cfg_type_bracketed_aml, 0 },
- { "filter-aaaa-on-v4", &cfg_type_filter_aaaa, 0 },
- { "filter-aaaa-on-v6", &cfg_type_filter_aaaa, 0 },
-#else
- { "filter-aaaa", &cfg_type_bracketed_aml,
- CFG_CLAUSEFLAG_NOTCONFIGURED },
- { "filter-aaaa-on-v4", &cfg_type_filter_aaaa,
- CFG_CLAUSEFLAG_NOTCONFIGURED },
- { "filter-aaaa-on-v6", &cfg_type_filter_aaaa,
- CFG_CLAUSEFLAG_NOTCONFIGURED },
-#endif
- { "response-policy", &cfg_type_rpz, 0 },
- { "rate-limit", &cfg_type_rrl, 0 },
{ NULL, NULL, 0 }
};
zone_clauses,
NULL
};
+
static cfg_type_t cfg_type_viewopts = {
- "view", cfg_parse_map, cfg_print_map, cfg_doc_map, &cfg_rep_map, view_clausesets };
+ "view", cfg_parse_map, cfg_print_map, cfg_doc_map, &cfg_rep_map,
+ view_clausesets
+};
/*% The "zone" statement syntax. */