Lines Matching refs:mstate
251 struct mesh_state* mstate = (struct mesh_state*)n->key;
255 mesh_state_delete(&mstate->s);
393 mesh_serve_expired_init(struct mesh_state* mstate, int timeout)
398 if(!mstate->s.serve_expired_data) {
399 mstate->s.serve_expired_data = (struct serve_expired_data*)
401 mstate->s.region, sizeof(struct serve_expired_data));
402 if(!mstate->s.serve_expired_data)
407 mstate->s.serve_expired_data->get_cached_answer =
408 mstate->s.serve_expired_data->get_cached_answer?
409 mstate->s.serve_expired_data->get_cached_answer:
413 if(!mstate->s.serve_expired_data->timer && timeout != -1) {
414 mstate->s.serve_expired_data->timer = comm_timer_create(
415 mstate->s.env->worker_base, mesh_serve_expired_callback, mstate);
416 if(!mstate->s.serve_expired_data->timer)
422 comm_timer_set(mstate->s.serve_expired_data->timer, &t);
984 struct mesh_state* mstate;
988 mstate = (struct mesh_state*)regional_alloc(region,
990 if(!mstate) {
994 memset(mstate, 0, sizeof(*mstate));
995 mstate->node = *RBTREE_NULL;
996 mstate->run_node = *RBTREE_NULL;
997 mstate->node.key = mstate;
998 mstate->run_node.key = mstate;
999 mstate->reply_list = NULL;
1000 mstate->list_select = mesh_no_list;
1001 mstate->replies_sent = 0;
1002 rbtree_init(&mstate->super_set, &mesh_state_ref_compare);
1003 rbtree_init(&mstate->sub_set, &mesh_state_ref_compare);
1004 mstate->num_activated = 0;
1005 mstate->unique = NULL;
1007 mstate->s.qinfo.qtype = qinfo->qtype;
1008 mstate->s.qinfo.qclass = qinfo->qclass;
1009 mstate->s.qinfo.local_alias = NULL;
1010 mstate->s.qinfo.qname_len = qinfo->qname_len;
1011 mstate->s.qinfo.qname = regional_alloc_init(region, qinfo->qname,
1013 if(!mstate->s.qinfo.qname) {
1018 mstate->s.client_info = mesh_copy_client_info(region, cinfo);
1019 if(!mstate->s.client_info) {
1025 mstate->s.query_flags = (qflags & (BIT_RD|BIT_CD));
1026 mstate->s.is_priming = prime;
1027 mstate->s.is_valrec = valrec;
1028 mstate->s.reply = NULL;
1029 mstate->s.region = region;
1030 mstate->s.curmod = 0;
1031 mstate->s.return_msg = 0;
1032 mstate->s.return_rcode = LDNS_RCODE_NOERROR;
1033 mstate->s.env = env;
1034 mstate->s.mesh_info = mstate;
1035 mstate->s.prefetch_leeway = 0;
1036 mstate->s.serve_expired_data = NULL;
1037 mstate->s.no_cache_lookup = 0;
1038 mstate->s.no_cache_store = 0;
1039 mstate->s.need_refetch = 0;
1040 mstate->s.was_ratelimited = 0;
1041 mstate->s.error_response_cache = 0;
1042 mstate->s.qstarttime = *env->now;
1046 mstate->s.minfo[i] = NULL;
1047 mstate->s.ext_state[i] = module_state_initial;
1050 mstate->s.edns_opts_front_in = NULL;
1051 mstate->s.edns_opts_back_out = NULL;
1052 mstate->s.edns_opts_back_in = NULL;
1053 mstate->s.edns_opts_front_out = NULL;
1055 return mstate;
1059 mesh_state_make_unique(struct mesh_state* mstate)
1061 mstate->unique = mstate;
1065 mesh_state_cleanup(struct mesh_state* mstate)
1069 if(!mstate)
1071 mesh = mstate->s.env->mesh;
1073 if(mstate->s.serve_expired_data && mstate->s.serve_expired_data->timer) {
1074 comm_timer_delete(mstate->s.serve_expired_data->timer);
1075 mstate->s.serve_expired_data->timer = NULL;
1078 if(!mstate->replies_sent) {
1079 struct mesh_reply* rep = mstate->reply_list;
1088 rep = mstate->reply_list;
1092 mstate->reply_list = NULL;
1100 while((cb = mstate->cb_list)!=NULL) {
1101 mstate->cb_list = cb->next;
1113 (*mesh->mods.mod[i]->clear)(&mstate->s, i);
1114 mstate->s.minfo[i] = NULL;
1115 mstate->s.ext_state[i] = module_finished;
1117 alloc_reg_release(mstate->s.env->alloc, mstate->s.region);
1125 struct mesh_state* mstate;
1128 mstate = qstate->mesh_info;
1129 mesh = mstate->s.env->mesh;
1130 mesh_detach_subs(&mstate->s);
1131 if(mstate->list_select == mesh_forever_list) {
1133 mesh_list_remove(mstate, &mesh->forever_first,
1135 } else if(mstate->list_select == mesh_jostle_list) {
1136 mesh_list_remove(mstate, &mesh->jostle_first,
1139 if(!mstate->reply_list && !mstate->cb_list
1140 && mstate->super_set.count == 0) {
1144 if(mstate->reply_list || mstate->cb_list) {
1149 ref.s = mstate;
1150 RBTREE_FOR(super, struct mesh_state_ref*, &mstate->super_set) {
1153 (void)rbtree_delete(&mesh->run, mstate);
1154 (void)rbtree_delete(&mesh->all, mstate);
1155 mesh_state_cleanup(mstate);
1721 void mesh_query_done(struct mesh_state* mstate)
1727 struct reply_info* rep = (mstate->s.return_msg?
1728 mstate->s.return_msg->rep:NULL);
1732 if(mstate->s.serve_expired_data) {
1733 comm_timer_delete(mstate->s.serve_expired_data->timer);
1734 mstate->s.serve_expired_data->timer = NULL;
1736 if(mstate->s.return_rcode == LDNS_RCODE_SERVFAIL ||
1738 if(mstate->s.env->cfg->serve_expired) {
1740 mesh_respond_serve_expired(mstate);
1742 if((mstate->reply_list || mstate->cb_list)
1743 && mstate->s.env->cfg->log_servfail
1744 && !mstate->s.env->cfg->val_log_squelch) {
1745 char* err = errinf_to_str_servfail(&mstate->s);
1750 if(mstate->reply_list && mstate->s.env->cfg->dns_error_reporting)
1751 dns_error_reporting(&mstate->s, rep);
1753 for(r = mstate->reply_list; r; r = r->next) {
1763 timeval_subtract(&old, mstate->s.env->now_tv, &r->start_time);
1764 if(mstate->s.env->cfg->discard_timeout != 0 &&
1766 mstate->s.env->cfg->discard_timeout) {
1773 struct mesh_reply* reply_list = mstate->reply_list;
1775 infra_wait_limit_dec(mstate->s.env->infra_cache,
1776 &r->query_reply, mstate->s.env->cfg);
1777 mstate->reply_list = NULL;
1781 mstate->reply_list = reply_list;
1782 log_assert(mstate->s.env->mesh->num_reply_addrs > 0);
1783 mstate->s.env->mesh->num_reply_addrs--;
1784 mstate->s.env->mesh->num_queries_discard_timeout++;
1794 if(mstate->s.respip_action_info &&
1795 mstate->s.respip_action_info->addrinfo) {
1796 respip_inform_print(mstate->s.respip_action_info,
1797 r->qname, mstate->s.qinfo.qtype,
1798 mstate->s.qinfo.qclass, r->local_alias,
1805 if(mstate->s.is_drop) {
1811 struct mesh_reply* reply_list = mstate->reply_list;
1812 infra_wait_limit_dec(mstate->s.env->infra_cache,
1813 &r->query_reply, mstate->s.env->cfg);
1814 mstate->reply_list = NULL;
1819 mstate->reply_list = reply_list;
1820 log_assert(mstate->s.env->mesh->num_reply_addrs > 0);
1821 mstate->s.env->mesh->num_reply_addrs--;
1828 mesh_send_reply(mstate, mstate->s.return_rcode, rep,
1831 tcp_req_info_remove_mesh_state(r->query_reply.c->tcp_req_info, mstate);
1841 if(i > 0 && mstate->s.respip_action_info &&
1842 mstate->s.respip_action_info->addrinfo &&
1843 mstate->s.env->cfg->stat_extended &&
1844 mstate->s.respip_action_info->rpz_used) {
1845 if(mstate->s.respip_action_info->rpz_disabled)
1846 mstate->s.env->mesh->rpz_action[RPZ_DISABLED_ACTION] += i;
1847 if(mstate->s.respip_action_info->rpz_cname_override)
1848 mstate->s.env->mesh->rpz_action[RPZ_CNAME_OVERRIDE_ACTION] += i;
1850 mstate->s.env->mesh->rpz_action[respip_action_to_rpz_action(
1851 mstate->s.respip_action_info->action)] += i;
1853 if(!mstate->s.is_drop && i > 0) {
1854 if(mstate->s.env->cfg->stat_extended
1855 && mstate->s.is_cachedb_answer) {
1856 mstate->s.env->mesh->ans_cachedb += i;
1861 if(mstate->reply_list) {
1862 mstate->reply_list = NULL;
1863 if(!mstate->reply_list && !mstate->cb_list) {
1865 log_assert(mstate->s.env->mesh->num_reply_states > 0);
1866 mstate->s.env->mesh->num_reply_states--;
1868 if(!mstate->reply_list && !mstate->cb_list &&
1869 mstate->super_set.count == 0)
1870 mstate->s.env->mesh->num_detached_states++;
1872 mstate->replies_sent = 1;
1874 while((c = mstate->cb_list) != NULL) {
1877 if(!mstate->reply_list && mstate->cb_list && !c->next) {
1879 log_assert(mstate->s.env->mesh->num_reply_states > 0);
1880 mstate->s.env->mesh->num_reply_states--;
1882 mstate->cb_list = c->next;
1883 if(!mstate->reply_list && !mstate->cb_list &&
1884 mstate->super_set.count == 0)
1885 mstate->s.env->mesh->num_detached_states++;
1886 mesh_do_callback(mstate, mstate->s.return_rcode, rep, c, &tv);
1890 void mesh_walk_supers(struct mesh_area* mesh, struct mesh_state* mstate)
1893 RBTREE_FOR(ref, struct mesh_state_ref*, &mstate->super_set)
1900 (*mesh->mods.mod[ref->s->s.curmod]->inform_super)(&mstate->s,
1903 copy_state_to_super(&mstate->s, ref->s->s.curmod, &ref->s->s);
2062 /* Extract the query info and flags from 'mstate' into '*qinfop' and '*qflags'.
2066 mesh_copy_qinfo(struct mesh_state* mstate, struct query_info** qinfop,
2069 struct regional* region = mstate->s.env->scratch;
2072 qinfo = regional_alloc_init(region, &mstate->s.qinfo, sizeof(*qinfo));
2080 *qflags = mstate->s.query_flags;
2088 * @param mstate: currently active mesh state.
2099 mesh_continue(struct mesh_area* mesh, struct mesh_state* mstate,
2102 mstate->num_activated++;
2103 if(mstate->num_activated > MESH_MAX_ACTIVATION) {
2106 mesh->mods.mod[mstate->s.curmod]->name);
2108 &mstate->s.qinfo);
2113 mstate->s.curmod++;
2114 if(mesh->mods.num == mstate->s.curmod) {
2117 &mstate->s.qinfo);
2118 mstate->s.curmod--;
2119 return mesh_continue(mesh, mstate, module_error, ev);
2122 int curmod = mstate->s.curmod;
2123 for(; mstate->s.curmod < mesh->mods.num;
2124 mstate->s.curmod++) {
2126 mesh->mods.mod[mstate->s.curmod]->clear));
2127 (*mesh->mods.mod[mstate->s.curmod]->clear)
2128 (&mstate->s, mstate->s.curmod);
2129 mstate->s.minfo[mstate->s.curmod] = NULL;
2131 mstate->s.curmod = curmod;
2136 if(s == module_wait_subquery && mstate->sub_set.count == 0) {
2139 &mstate->s.qinfo);
2142 if(s == module_error && mstate->s.return_rcode == LDNS_RCODE_NOERROR) {
2144 mstate->s.return_rcode = LDNS_RCODE_SERVFAIL;
2147 mesh_query_done(mstate);
2148 mesh_walk_supers(mesh, mstate);
2149 mesh_state_delete(&mstate->s);
2153 if(mstate->s.curmod == 0) {
2162 if(mstate->s.need_refetch && mstate->reply_list &&
2164 mstate->s.env->unique_mesh) {
2165 addr = mstate->reply_list->query_reply.client_addr;
2170 mesh_query_done(mstate);
2171 mesh_walk_supers(mesh, mstate);
2177 if(mstate->s.need_refetch) {
2178 mesh_copy_qinfo(mstate, &qinfo, &qflags);
2182 mstate->s.edns_opts_front_in,
2183 mstate->s.env->cfg->client_subnet_opcode)) != NULL) {
2187 mstate->s.env->scratch);
2190 rpz_p = mstate->s.rpz_passthru;
2194 mesh_state_delete(&mstate->s);
2200 mesh_state_delete(&mstate->s);
2205 mstate->s.curmod --;
2212 void mesh_run(struct mesh_area* mesh, struct mesh_state* mstate,
2217 while(mstate) {
2220 mesh->mods.mod[mstate->s.curmod]->operate));
2221 (*mesh->mods.mod[mstate->s.curmod]->operate)
2222 (&mstate->s, ev, mstate->s.curmod, e);
2225 mstate->s.reply = NULL;
2226 regional_free_all(mstate->s.env->scratch);
2227 s = mstate->s.ext_state[mstate->s.curmod];
2229 mesh->mods.mod[mstate->s.curmod]->name, strextstate(s));
2231 if(mesh_continue(mesh, mstate, s, &ev))
2238 mstate = (struct mesh_state*)mesh->run.root->key;
2239 (void)rbtree_delete(&mesh->run, mstate);
2240 } else mstate = NULL;
2403 /* if not replies any more in mstate, it is no longer a reply_state */
2441 struct mesh_state* mstate = (struct mesh_state*) arg;
2442 struct module_qstate* qstate = &mstate->s;
2538 for(r = mstate->reply_list; r; r = r->next) {
2540 timeval_subtract(&old, mstate->s.env->now_tv, &r->start_time);
2541 if(mstate->s.env->cfg->discard_timeout != 0 &&
2543 mstate->s.env->cfg->discard_timeout) {
2550 struct mesh_reply* reply_list = mstate->reply_list;
2552 infra_wait_limit_dec(mstate->s.env->infra_cache,
2553 &r->query_reply, mstate->s.env->cfg);
2554 mstate->reply_list = NULL;
2558 mstate->reply_list = reply_list;
2559 mstate
2582 mstate->s.region, LDNS_EDE_STALE_ANSWER, NULL);
2588 mesh_send_reply(mstate, LDNS_RCODE_NOERROR, msg->rep,
2591 tcp_req_info_remove_mesh_state(r->query_reply.c->tcp_req_info, mstate);
2593 infra_wait_limit_dec(mstate->s.env->infra_cache,
2594 &r->query_reply, mstate->s.env->cfg);
2614 if(mstate->reply_list) {
2615 mstate->reply_list = NULL;
2616 if(!mstate->reply_list && !mstate->cb_list) {
2619 if(mstate->super_set.count == 0) {
2625 while((c = mstate->cb_list) != NULL) {
2628 if(!mstate->reply_list && mstate->cb_list && !c->next) {
2633 mstate->cb_list = c->next;
2634 if(!mstate->reply_list && !mstate->cb_list &&
2635 mstate->super_set.count == 0)
2637 mesh_do_callback(mstate, LDNS_RCODE_NOERROR, msg->rep, c, &tv);
2642 mesh_respond_serve_expired(struct mesh_state* mstate)
2644 if(!mstate->s.serve_expired_data)
2645 mesh_serve_expired_init(mstate, -1);
2646 mesh_serve_expired_callback(mstate);