Lines Matching defs:search

2566 	rbtdb_search_t *search = arg;
2578 if (search->zonecut != NULL)
2583 onode = search->rbtdb->origin_node;
2585 NODE_LOCK(&(search->rbtdb->node_locks[node->locknum].lock),
2600 if (header->serial <= search->serial &&
2619 IS_STUB(search->rbtdb)) {
2637 if (!IS_CACHE(search->rbtdb) && !IS_STUB(search->rbtdb) &&
2644 search->zonecut_sigrdataset = NULL;
2647 search->zonecut_sigrdataset = sigdname_header;
2650 search->zonecut_sigrdataset = NULL;
2656 * search->zonecut_rdataset will still be valid later.
2658 new_reference(search->rbtdb, node);
2659 search->zonecut = node;
2660 search->zonecut_rdataset = found;
2661 search->need_cleanup = ISC_TRUE;
2665 * may clear search->wild.
2667 search->wild = ISC_FALSE;
2668 if ((search->options & DNS_DBFIND_GLUEOK) == 0) {
2671 * this is the best answer and the search should
2679 * The search will continue beneath the zone cut.
2683 zcname = dns_fixedname_name(&search->zonecut_name);
2686 search->copy_name = ISC_TRUE;
2698 if (node->wild && (search->options & DNS_DBFIND_NOWILD) == 0)
2699 search->wild = ISC_TRUE;
2702 NODE_UNLOCK(&(search->rbtdb->node_locks[node->locknum].lock),
2777 setup_delegation(rbtdb_search_t *search, dns_dbnode_t **nodep,
2790 node = search->zonecut;
2791 type = search->zonecut_rdataset->type;
2800 if (foundname != NULL && search->copy_name) {
2801 zcname = dns_fixedname_name(&search->zonecut_name);
2810 * already have in the search block.
2813 search->need_cleanup = ISC_FALSE;
2816 NODE_LOCK(&(search->rbtdb->node_locks[node->locknum].lock),
2818 bind_rdataset(search->rbtdb, node, search->zonecut_rdataset,
2819 search->now, rdataset);
2820 if (sigrdataset != NULL && search->zonecut_sigrdataset != NULL)
2821 bind_rdataset(search->rbtdb, node,
2822 search->zonecut_sigrdataset,
2823 search->now, sigrdataset);
2824 NODE_UNLOCK(&(search->rbtdb->node_locks[node->locknum].lock),
2834 valid_glue(rbtdb_search_t *search, dns_name_t *name, rbtdb_rdatatype_t type,
2854 if (node != search->zonecut) {
2863 header = search->zonecut_rdataset;
2899 activeempty(rbtdb_search_t *search, dns_rbtnodechain_t *chain,
2913 rbtdb = search->rbtdb;
2933 if (header->serial <= search->serial &&
2951 activeemtpynode(rbtdb_search_t *search, dns_name_t *qname, dns_name_t *wname) {
2971 rbtdb = search->rbtdb;
2988 chain = search->chain;
3000 if (header->serial <= search->serial &&
3027 if (header->serial <= search->serial &&
3066 find_wildcard(rbtdb_search_t *search, dns_rbtnode_t **nodep,
3088 * search for it. If the wildcard node exists, and is active in
3092 * continue the search.
3095 rbtdb = search->rbtdb;
3096 i = search->chain.level_matches;
3105 * the search's version. We do this now, even though we
3112 if (header->serial <= search->serial &&
3142 level_node = search->chain.levels[j];
3164 * is active in the search's version, we're
3172 if (header->serial <= search->serial &&
3178 activeempty(search, &wchain, wname)) {
3179 if (activeemtpynode(search, qname,
3213 node = search->chain.levels[i];
3222 matchparams(rdatasetheader_t *header, rbtdb_search_t *search)
3249 dns_rdata_fromregion(&rdata, search->rbtdb->common.rdclass,
3254 if (nsec3.hash == search->rbtversion->hash &&
3255 nsec3.iterations == search->rbtversion->iterations &&
3256 nsec3.salt_length == search->rbtversion->salt_length &&
3257 memcmp(nsec3.salt, search->rbtversion->salt,
3269 find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
3285 if (tree == search->rbtdb->nsec3) {
3302 result = dns_rbtnodechain_current(&search->chain, name,
3306 NODE_LOCK(&(search->rbtdb->node_locks[node->locknum].lock),
3319 if (header->serial <= search->serial &&
3349 if (found != NULL && search->rbtversion->havensec3 &&
3351 !matchparams(found, search)) {
3355 result = dns_rbtnodechain_prev(&search->chain,
3373 new_reference(search->rbtdb,
3377 bind_rdataset(search->rbtdb, node,
3378 found, search->now,
3381 bind_rdataset(search->rbtdb,
3384 search->now,
3392 * relevant for our search. Treat the
3396 result = dns_rbtnodechain_prev(&search->chain,
3411 result = dns_rbtnodechain_prev(&search->chain, NULL,
3414 NODE_UNLOCK(&(search->rbtdb->node_locks[node->locknum].lock),
3419 result = dns_rbtnodechain_last(&search->chain, tree,
3446 rbtdb_search_t search;
3461 search.rbtdb = (dns_rbtdb_t *)db;
3463 REQUIRE(VALID_RBTDB(search.rbtdb));
3481 search.rbtversion = version;
3482 search.serial = search.rbtversion->serial;
3483 search.options = options;
3484 search.copy_name = ISC_FALSE;
3485 search.need_cleanup = ISC_FALSE;
3486 search.wild = ISC_FALSE;
3487 search.zonecut = NULL;
3488 dns_fixedname_init(&search.zonecut_name);
3489 dns_rbtnodechain_init(&search.chain, search.rbtdb->common.mctx);
3490 search.now = 0;
3497 RWLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read);
3501 * encounter a callback node, zone_zonecut_callback() will search the
3504 tree = (options & DNS_DBFIND_FORCENSEC3) != 0 ? search.rbtdb->nsec3 :
3505 search.rbtdb->tree;
3507 &search.chain, DNS_RBTFIND_EMPTYDATA,
3508 zone_zonecut_callback, &search);
3512 if (search.zonecut != NULL) {
3513 result = setup_delegation(&search, nodep, foundname,
3518 if (search.wild) {
3520 * At least one of the levels in the search chain
3525 result = find_wildcard(&search, &node, name);
3537 chain = search.chain;
3538 active = activeempty(&search, &chain, name);
3544 if ((search.rbtversion->secure == dns_db_secure &&
3545 !search.rbtversion->havensec3) ||
3546 (search.options & DNS_DBFIND_FORCENSEC) != 0 ||
3547 (search.options & DNS_DBFIND_FORCENSEC3) != 0)
3549 result = find_closest_nsec(&search, nodep, foundname,
3551 search.rbtversion->secure);
3567 if (search.zonecut != NULL) {
3585 ((node != search.rbtdb->origin_node &&
3587 IS_STUB(search.rbtdb)))
3605 lock = &search.rbtdb->node_locks[node->locknum].lock;
3621 if (header->serial <= search.serial &&
3647 * ensure that search->zonecut_rdataset will
3650 new_reference(search.rbtdb, node);
3651 search.zonecut = node;
3652 search.zonecut_rdataset = header;
3653 search.zonecut_sigrdataset = NULL;
3654 search.need_cleanup = ISC_TRUE;
3663 if ((search.options & DNS_DBFIND_GLUEOK) == 0
3684 !matchparams(header, &search)) {
3717 * If we've got all we need, end the search.
3728 * If we've got all we need, end the search.
3733 !search.rbtversion->havensec3) {
3741 !search.rbtversion->havensec3) {
3775 if (search.zonecut != NULL) {
3783 result = setup_delegation(&search, nodep, foundname,
3791 if (search.rbtversion->secure == dns_db_secure &&
3792 !search.rbtversion->havensec3 &&
3804 result = find_closest_nsec(&search, nodep, foundname,
3806 search.rbtdb->tree,
3807 search.rbtversion->secure);
3812 if ((search.options & DNS_DBFIND_FORCENSEC) != 0 &&
3823 new_reference(search.rbtdb, node);
3826 if ((search.rbtversion->secure == dns_db_secure &&
3827 !search.rbtversion->havensec3) ||
3828 (search.options & DNS_DBFIND_FORCENSEC) != 0)
3830 bind_rdataset(search.rbtdb, node, nsecheader,
3833 bind_rdataset(search.rbtdb, node,
3854 } else if (search.zonecut != NULL) {
3860 if (search.zonecut == node) {
3885 (search.options & DNS_DBFIND_VALIDATEGLUE) != 0 &&
3886 !valid_glue(&search, foundname, type, node)) {
3888 result = setup_delegation(&search, nodep, foundname,
3901 new_reference(search.rbtdb, node);
3903 search.need_cleanup = ISC_FALSE;
3908 bind_rdataset(search.rbtdb, node, found, 0, rdataset);
3910 bind_rdataset(search.rbtdb, node, foundsig, 0,
3921 RWUNLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read);
3927 if (search.need_cleanup) {
3928 node = search.zonecut;
3930 lock = &(search.rbtdb->node_locks[node->locknum].lock);
3933 decrement_reference(search.rbtdb, node, 0,
3942 dns_rbtnodechain_reset(&search.chain);
3969 rbtdb_search_t *search = arg;
3978 REQUIRE(search->zonecut == NULL);
3985 lock = &(search->rbtdb->node_locks[node->locknum].lock);
3997 if (header->rdh_ttl < search->now) {
4005 if ((header->rdh_ttl < search->now - RBTDB_VIRTUAL) &&
4030 mctx = search->rbtdb->common.mctx;
4031 clean_stale_headers(search->rbtdb,
4039 free_rdataset(search->rbtdb, mctx,
4063 (search->options & DNS_DBFIND_PENDINGOK) != 0)) {
4066 * search->zonecut_rdataset will still be valid later.
4068 new_reference(search->rbtdb, node);
4070 search->zonecut = node;
4071 search->zonecut_rdataset = dname_header;
4072 search->zonecut_sigrdataset = sigdname_header;
4073 search->need_cleanup = ISC_TRUE;
4084 find_deepest_zonecut(rbtdb_search_t *search, dns_rbtnode_t *node,
4103 rbtdb = search->rbtdb;
4104 i = search->chain.level_matches;
4121 if (header->rdh_ttl < search->now) {
4129 if ((header->rdh_ttl < search->now -
4143 m = search->rbtdb->common.mctx;
4145 search->rbtdb,
4198 level_node = search->chain.levels[i];
4215 new_reference(search->rbtdb, node);
4218 bind_rdataset(search->rbtdb, node, found, search->now,
4221 bind_rdataset(search->rbtdb, node, foundsig,
4222 search->now, sigrdataset);
4223 if (need_headerupdate(found, search->now) ||
4225 need_headerupdate(foundsig, search->now))) {
4232 if (need_headerupdate(found, search->now))
4233 update_header(search->rbtdb, found,
4234 search->now);
4236 need_headerupdate(foundsig, search->now)) {
4237 update_header(search->rbtdb, foundsig,
4238 search->now);
4248 node = search->chain.levels[i];
4258 find_coveringnsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
4283 result = dns_rbtnodechain_current(&search->chain, name,
4288 lock = &(search->rbtdb->node_locks[node->locknum].lock);
4319 m = search->rbtdb->common.mctx;
4321 search->rbtdb,
4328 free_rdataset(search->rbtdb, m,
4357 bind_rdataset(search->rbtdb, node, found,
4360 bind_rdataset(search->rbtdb, node, foundsig,
4362 new_reference(search->rbtdb, node);
4368 result = dns_rbtnodechain_prev(&search->chain, NULL,
4384 rbtdb_search_t search;
4397 search.rbtdb = (dns_rbtdb_t *)db;
4399 REQUIRE(VALID_RBTDB(search.rbtdb));
4405 search.rbtversion = NULL;
4406 search.serial = 1;
4407 search.options = options;
4408 search.copy_name = ISC_FALSE;
4409 search.need_cleanup = ISC_FALSE;
4410 search.wild = ISC_FALSE;
4411 search.zonecut = NULL;
4412 dns_fixedname_init(&search.zonecut_name);
4413 dns_rbtnodechain_init(&search.chain, search.rbtdb->common.mctx);
4414 search.now = now;
4418 RWLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read);
4422 * encounter a callback node, cache_zonecut_callback() will search the
4425 result = dns_rbt_findnode(search.rbtdb->tree, name, foundname, &node,
4426 &search.chain, DNS_RBTFIND_EMPTYDATA,
4427 cache_zonecut_callback, &search);
4430 if ((search.options & DNS_DBFIND_COVERINGNSEC) != 0) {
4431 result = find_coveringnsec(&search, nodep, now,
4437 if (search.zonecut != NULL) {
4438 result = setup_delegation(&search, nodep, foundname,
4443 result = find_deepest_zonecut(&search, node, nodep,
4465 lock = &(search.rbtdb->node_locks[node->locknum].lock);
4499 mctx = search.rbtdb->common.mctx;
4500 clean_stale_headers(search.rbtdb, mctx,
4507 free_rdataset(search.rbtdb, mctx,
4610 new_reference(search.rbtdb, node);
4614 bind_rdataset(search.rbtdb, node, nsheader, search.now,
4616 if (need_headerupdate(nsheader, search.now))
4619 bind_rdataset(search.rbtdb, node, nssig,
4620 search.now, sigrdataset);
4621 if (need_headerupdate(nssig, search.now))
4640 new_reference(search.rbtdb, node);
4671 bind_rdataset(search.rbtdb, node, found, search.now,
4673 if (need_headerupdate(found, search.now))
4676 bind_rdataset(search.rbtdb, node, foundsig, search.now,
4678 if (need_headerupdate(foundsig, search.now))
4691 if (update != NULL && need_headerupdate(update, search.now))
4692 update_header(search.rbtdb, update, search.now);
4693 if (updatesig != NULL && need_headerupdate(updatesig, search.now))
4694 update_header(search.rbtdb, updatesig, search.now);
4699 RWUNLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read);
4705 if (search.need_cleanup) {
4706 node = search.zonecut;
4708 lock = &(search.rbtdb->node_locks[node->locknum].lock);
4711 decrement_reference(search.rbtdb, node, 0,
4717 dns_rbtnodechain_reset(&search.chain);
4731 rbtdb_search_t search;
4737 search.rbtdb = (dns_rbtdb_t *)db;
4739 REQUIRE(VALID_RBTDB(search.rbtdb));
4744 search.rbtversion = NULL;
4745 search.serial = 1;
4746 search.options = options;
4747 search.copy_name = ISC_FALSE;
4748 search.need_cleanup = ISC_FALSE;
4749 search.wild = ISC_FALSE;
4750 search.zonecut = NULL;
4751 dns_fixedname_init(&search.zonecut_name);
4752 dns_rbtnodechain_init(&search.chain, search.rbtdb->common.mctx);
4753 search.now = now;
4758 RWLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read);
4763 result = dns_rbt_findnode(search.rbtdb->tree, name, foundname, &node,
4764 &search.chain, rbtoptions, NULL, &search);
4768 result = find_deepest_zonecut(&search, node, nodep, foundname,
4778 lock = &(search.rbtdb->node_locks[node->locknum].lock);
4806 mctx = search.rbtdb->common.mctx;
4807 clean_stale_headers(search.rbtdb, mctx,
4814 free_rdataset(search.rbtdb, mctx,
4857 new_reference(search.rbtdb, node);
4862 bind_rdataset(search.rbtdb, node, found, search.now, rdataset);
4864 bind_rdataset(search.rbtdb, node, foundsig, search.now,
4867 if (need_headerupdate(found, search.now) ||
4868 (foundsig != NULL && need_headerupdate(foundsig, search.now))) {
4875 if (need_headerupdate(found, search.now))
4876 update_header(search.rbtdb, found, search.now);
4878 need_headerupdate(foundsig, search.now)) {
4879 update_header(search.rbtdb, foundsig, search.now);
4886 RWUNLOCK(&search.rbtdb->tree_lock, isc_rwlocktype_read);
4888 INSIST(!search.need_cleanup);
4890 dns_rbtnodechain_reset(&search.chain);