• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-12-stable/contrib/unbound/services/

Lines Matching defs:mstate

281 	struct mesh_state* mstate = (struct mesh_state*)n->key;
285 mesh_state_delete(&mstate->s);
419 mesh_serve_expired_init(struct mesh_state* mstate, int timeout)
424 if(!mstate->s.serve_expired_data) {
425 mstate->s.serve_expired_data = (struct serve_expired_data*)
427 mstate->s.region, sizeof(struct serve_expired_data));
428 if(!mstate->s.serve_expired_data)
433 mstate->s.serve_expired_data->get_cached_answer =
434 mstate->s.serve_expired_data->get_cached_answer?
435 mstate->s.serve_expired_data->get_cached_answer:
439 if(!mstate->s.serve_expired_data->timer) {
440 mstate->s.serve_expired_data->timer = comm_timer_create(
441 mstate->s.env->worker_base, mesh_serve_expired_callback, mstate);
442 if(!mstate->s.serve_expired_data->timer)
448 comm_timer_set(mstate->s.serve_expired_data->timer, &t);
778 struct mesh_state* mstate;
782 mstate = (struct mesh_state*)regional_alloc(region,
784 if(!mstate) {
788 memset(mstate, 0, sizeof(*mstate));
789 mstate->node = *RBTREE_NULL;
790 mstate->run_node = *RBTREE_NULL;
791 mstate->node.key = mstate;
792 mstate->run_node.key = mstate;
793 mstate->reply_list = NULL;
794 mstate->list_select = mesh_no_list;
795 mstate->replies_sent = 0;
796 rbtree_init(&mstate->super_set, &mesh_state_ref_compare);
797 rbtree_init(&mstate->sub_set, &mesh_state_ref_compare);
798 mstate->num_activated = 0;
799 mstate->unique = NULL;
801 mstate->s.qinfo.qtype = qinfo->qtype;
802 mstate->s.qinfo.qclass = qinfo->qclass;
803 mstate->s.qinfo.local_alias = NULL;
804 mstate->s.qinfo.qname_len = qinfo->qname_len;
805 mstate->s.qinfo.qname = regional_alloc_init(region, qinfo->qname,
807 if(!mstate->s.qinfo.qname) {
812 mstate->s.client_info = regional_alloc_init(region, cinfo,
814 if(!mstate->s.client_info) {
820 mstate->s.query_flags = (qflags & (BIT_RD|BIT_CD));
821 mstate->s.is_priming = prime;
822 mstate->s.is_valrec = valrec;
823 mstate->s.reply = NULL;
824 mstate->s.region = region;
825 mstate->s.curmod = 0;
826 mstate->s.return_msg = 0;
827 mstate->s.return_rcode = LDNS_RCODE_NOERROR;
828 mstate->s.env = env;
829 mstate->s.mesh_info = mstate;
830 mstate->s.prefetch_leeway = 0;
831 mstate->s.serve_expired_data = NULL;
832 mstate->s.no_cache_lookup = 0;
833 mstate->s.no_cache_store = 0;
834 mstate->s.need_refetch = 0;
835 mstate->s.was_ratelimited = 0;
839 mstate->s.minfo[i] = NULL;
840 mstate->s.ext_state[i] = module_state_initial;
843 mstate->s.edns_opts_front_in = NULL;
844 mstate->s.edns_opts_back_out = NULL;
845 mstate->s.edns_opts_back_in = NULL;
846 mstate->s.edns_opts_front_out = NULL;
848 return mstate;
852 mesh_state_is_unique(struct mesh_state* mstate)
854 return mstate->unique != NULL;
858 mesh_state_make_unique(struct mesh_state* mstate)
860 mstate->unique = mstate;
864 mesh_state_cleanup(struct mesh_state* mstate)
868 if(!mstate)
870 mesh = mstate->s.env->mesh;
872 if(mstate->s.serve_expired_data && mstate->s.serve_expired_data->timer) {
873 comm_timer_delete(mstate->s.serve_expired_data->timer);
874 mstate->s.serve_expired_data->timer = NULL;
877 if(!mstate->replies_sent) {
878 struct mesh_reply* rep = mstate->reply_list;
883 mstate->reply_list = NULL;
889 while((cb = mstate->cb_list)!=NULL) {
890 mstate->cb_list = cb->next;
902 (*mesh->mods.mod[i]->clear)(&mstate->s, i);
903 mstate->s.minfo[i] = NULL;
904 mstate->s.ext_state[i] = module_finished;
906 alloc_reg_release(mstate->s.env->alloc, mstate->s.region);
914 struct mesh_state* mstate;
917 mstate = qstate->mesh_info;
918 mesh = mstate->s.env->mesh;
919 mesh_detach_subs(&mstate->s);
920 if(mstate->list_select == mesh_forever_list) {
922 mesh_list_remove(mstate, &mesh->forever_first,
924 } else if(mstate->list_select == mesh_jostle_list) {
925 mesh_list_remove(mstate, &mesh->jostle_first,
928 if(!mstate->reply_list && !mstate->cb_list
929 && mstate->super_set.count == 0) {
933 if(mstate->reply_list || mstate->cb_list) {
938 ref.s = mstate;
939 RBTREE_FOR(super, struct mesh_state_ref*, &mstate->super_set) {
942 (void)rbtree_delete(&mesh->run, mstate);
943 (void)rbtree_delete(&mesh->all, mstate);
944 mesh_state_cleanup(mstate);
1327 void mesh_query_done(struct mesh_state* mstate)
1333 struct reply_info* rep = (mstate->s.return_msg?
1334 mstate->s.return_msg->rep:NULL);
1337 if(mstate->s.serve_expired_data) {
1338 comm_timer_delete(mstate->s.serve_expired_data->timer);
1339 mstate->s.serve_expired_data->timer = NULL;
1341 if(mstate->s.return_rcode == LDNS_RCODE_SERVFAIL ||
1344 mesh_serve_expired_callback(mstate);
1345 if((mstate->reply_list || mstate->cb_list)
1346 && mstate->s.env->cfg->log_servfail
1347 && !mstate->s.env->cfg->val_log_squelch) {
1348 char* err = errinf_to_str_servfail(&mstate->s);
1354 for(r = mstate->reply_list; r; r = r->next) {
1359 if(mstate->s.respip_action_info &&
1360 mstate->s.respip_action_info->addrinfo) {
1361 respip_inform_print(mstate->s.respip_action_info,
1362 r->qname, mstate->s.qinfo.qtype,
1363 mstate->s.qinfo.qclass, r->local_alias,
1365 if(mstate->s.env->cfg->stat_extended &&
1366 mstate->s.respip_action_info->rpz_used) {
1367 if(mstate->s.respip_action_info->rpz_disabled)
1368 mstate->s.env->mesh->rpz_action[RPZ_DISABLED_ACTION]++;
1369 if(mstate->s.respip_action_info->rpz_cname_override)
1370 mstate->s.env->mesh->rpz_action[RPZ_CNAME_OVERRIDE_ACTION]++;
1372 mstate->s.env->mesh->rpz_action[respip_action_to_rpz_action(
1373 mstate->s.respip_action_info->action)]++;
1379 if(mstate->s.is_drop) {
1385 struct mesh_reply* reply_list = mstate->reply_list;
1386 mstate->reply_list = NULL;
1388 mstate->reply_list = reply_list;
1395 mesh_send_reply(mstate, mstate->s.return_rcode, rep,
1398 tcp_req_info_remove_mesh_state(r->query_reply.c->tcp_req_info, mstate);
1405 if(mstate->reply_list) {
1406 mstate->reply_list = NULL;
1407 if(!mstate->reply_list && !mstate->cb_list) {
1409 log_assert(mstate->s.env->mesh->num_reply_states > 0);
1410 mstate->s.env->mesh->num_reply_states--;
1412 if(!mstate->reply_list && !mstate->cb_list &&
1413 mstate->super_set.count == 0)
1414 mstate->s.env->mesh->num_detached_states++;
1416 mstate->replies_sent = 1;
1417 while((c = mstate->cb_list) != NULL) {
1420 if(!mstate->reply_list && mstate->cb_list && !c->next) {
1422 log_assert(mstate->s.env->mesh->num_reply_states > 0);
1423 mstate->s.env->mesh->num_reply_states--;
1425 mstate->cb_list = c->next;
1426 if(!mstate->reply_list && !mstate->cb_list &&
1427 mstate->super_set.count == 0)
1428 mstate->s.env->mesh->num_detached_states++;
1429 mesh_do_callback(mstate, mstate->s.return_rcode, rep, c, &tv);
1433 void mesh_walk_supers(struct mesh_area* mesh, struct mesh_state* mstate)
1436 RBTREE_FOR(ref, struct mesh_state_ref*, &mstate->super_set)
1443 (*mesh->mods.mod[ref->s->s.curmod]->inform_super)(&mstate->s,
1446 copy_state_to_super(&mstate->s, ref->s->s.curmod, &ref->s->s);
1575 /* Extract the query info and flags from 'mstate' into '*qinfop' and '*qflags'.
1579 mesh_copy_qinfo(struct mesh_state* mstate, struct query_info** qinfop,
1582 struct regional* region = mstate->s.env->scratch;
1585 qinfo = regional_alloc_init(region, &mstate->s.qinfo, sizeof(*qinfo));
1593 *qflags = mstate->s.query_flags;
1601 * @param mstate: currently active mesh state.
1612 mesh_continue(struct mesh_area* mesh, struct mesh_state* mstate,
1615 mstate->num_activated++;
1616 if(mstate->num_activated > MESH_MAX_ACTIVATION) {
1619 mesh->mods.mod[mstate->s.curmod]->name);
1621 &mstate->s.qinfo);
1626 mstate->s.curmod++;
1627 if(mesh->mods.num == mstate->s.curmod) {
1630 &mstate->s.qinfo);
1631 mstate->s.curmod--;
1632 return mesh_continue(mesh, mstate, module_error, ev);
1635 int curmod = mstate->s.curmod;
1636 for(; mstate->s.curmod < mesh->mods.num;
1637 mstate->s.curmod++) {
1639 mesh->mods.mod[mstate->s.curmod]->clear));
1640 (*mesh->mods.mod[mstate->s.curmod]->clear)
1641 (&mstate->s, mstate->s.curmod);
1642 mstate->s.minfo[mstate->s.curmod] = NULL;
1644 mstate->s.curmod = curmod;
1649 if(s == module_wait_subquery && mstate->sub_set.count == 0) {
1652 &mstate->s.qinfo);
1655 if(s == module_error && mstate->s.return_rcode == LDNS_RCODE_NOERROR) {
1657 mstate->s.return_rcode = LDNS_RCODE_SERVFAIL;
1660 mesh_query_done(mstate);
1661 mesh_walk_supers(mesh, mstate);
1662 mesh_state_delete(&mstate->s);
1666 if(mstate->s.curmod == 0) {
1670 mesh_query_done(mstate);
1671 mesh_walk_supers(mesh, mstate);
1677 if(mstate->s.need_refetch)
1678 mesh_copy_qinfo(mstate, &qinfo, &qflags);
1680 mesh_state_delete(&mstate->s);
1688 mstate->s.curmod --;
1695 void mesh_run(struct mesh_area* mesh, struct mesh_state* mstate,
1700 while(mstate) {
1703 mesh->mods.mod[mstate->s.curmod]->operate));
1704 (*mesh->mods.mod[mstate->s.curmod]->operate)
1705 (&mstate->s, ev, mstate->s.curmod, e);
1708 mstate->s.reply = NULL;
1709 regional_free_all(mstate->s.env->scratch);
1710 s = mstate->s.ext_state[mstate->s.curmod];
1712 mesh->mods.mod[mstate->s.curmod]->name, strextstate(s));
1714 if(mesh_continue(mesh, mstate, s, &ev))
1721 mstate = (struct mesh_state*)mesh->run.root->key;
1722 (void)rbtree_delete(&mesh->run, mstate);
1723 } else mstate = NULL;
1873 /* if not replies any more in mstate, it is no longer a reply_state */
1910 struct mesh_state* mstate = (struct mesh_state*) arg;
1911 struct module_qstate* qstate = &mstate->s;
1998 for(r = mstate->reply_list; r; r = r->next) {
2022 mesh_send_reply(mstate, LDNS_RCODE_NOERROR, msg->rep,
2025 tcp_req_info_remove_mesh_state(r->query_reply.c->tcp_req_info, mstate);
2033 if(mstate->reply_list) {
2034 mstate->reply_list = NULL;
2035 if(!mstate->reply_list && !mstate->cb_list) {
2038 if(mstate->super_set.count == 0) {
2043 while((c = mstate->cb_list) != NULL) {
2046 if(!mstate->reply_list && mstate->cb_list && !c->next) {
2051 mstate->cb_list = c->next;
2052 if(!mstate->reply_list && !mstate->cb_list &&
2053 mstate->super_set.count == 0)
2055 mesh_do_callback(mstate, LDNS_RCODE_NOERROR, msg->rep, c, &tv);