Home | History | Annotate | Download | only in services

Lines Matching defs:mstate

250 	struct mesh_state* mstate = (struct mesh_state*)n->key;
254 mesh_state_delete(&mstate->s);
390 mesh_serve_expired_init(struct mesh_state* mstate, int timeout)
395 if(!mstate->s.serve_expired_data) {
396 mstate->s.serve_expired_data = (struct serve_expired_data*)
398 mstate->s.region, sizeof(struct serve_expired_data));
399 if(!mstate->s.serve_expired_data)
404 mstate->s.serve_expired_data->get_cached_answer =
405 mstate->s.serve_expired_data->get_cached_answer?
406 mstate->s.serve_expired_data->get_cached_answer:
410 if(!mstate->s.serve_expired_data->timer && timeout != -1) {
411 mstate->s.serve_expired_data->timer = comm_timer_create(
412 mstate->s.env->worker_base, mesh_serve_expired_callback, mstate);
413 if(!mstate->s.serve_expired_data->timer)
419 comm_timer_set(mstate->s.serve_expired_data->timer, &t);
968 struct mesh_state* mstate;
972 mstate = (struct mesh_state*)regional_alloc(region,
974 if(!mstate) {
978 memset(mstate, 0, sizeof(*mstate));
979 mstate->node = *RBTREE_NULL;
980 mstate->run_node = *RBTREE_NULL;
981 mstate->node.key = mstate;
982 mstate->run_node.key = mstate;
983 mstate->reply_list = NULL;
984 mstate->list_select = mesh_no_list;
985 mstate->replies_sent = 0;
986 rbtree_init(&mstate->super_set, &mesh_state_ref_compare);
987 rbtree_init(&mstate->sub_set, &mesh_state_ref_compare);
988 mstate->num_activated = 0;
989 mstate->unique = NULL;
991 mstate->s.qinfo.qtype = qinfo->qtype;
992 mstate->s.qinfo.qclass = qinfo->qclass;
993 mstate->s.qinfo.local_alias = NULL;
994 mstate->s.qinfo.qname_len = qinfo->qname_len;
995 mstate->s.qinfo.qname = regional_alloc_init(region, qinfo->qname,
997 if(!mstate->s.qinfo.qname) {
1002 mstate->s.client_info = mesh_copy_client_info(region, cinfo);
1003 if(!mstate->s.client_info) {
1009 mstate->s.query_flags = (qflags & (BIT_RD|BIT_CD));
1010 mstate->s.is_priming = prime;
1011 mstate->s.is_valrec = valrec;
1012 mstate->s.reply = NULL;
1013 mstate->s.region = region;
1014 mstate->s.curmod = 0;
1015 mstate->s.return_msg = 0;
1016 mstate->s.return_rcode = LDNS_RCODE_NOERROR;
1017 mstate->s.env = env;
1018 mstate->s.mesh_info = mstate;
1019 mstate->s.prefetch_leeway = 0;
1020 mstate->s.serve_expired_data = NULL;
1021 mstate->s.no_cache_lookup = 0;
1022 mstate->s.no_cache_store = 0;
1023 mstate->s.need_refetch = 0;
1024 mstate->s.was_ratelimited = 0;
1025 mstate->s.qstarttime = *env->now;
1029 mstate->s.minfo[i] = NULL;
1030 mstate->s.ext_state[i] = module_state_initial;
1033 mstate->s.edns_opts_front_in = NULL;
1034 mstate->s.edns_opts_back_out = NULL;
1035 mstate->s.edns_opts_back_in = NULL;
1036 mstate->s.edns_opts_front_out = NULL;
1038 return mstate;
1042 mesh_state_make_unique(struct mesh_state* mstate)
1044 mstate->unique = mstate;
1048 mesh_state_cleanup(struct mesh_state* mstate)
1052 if(!mstate)
1054 mesh = mstate->s.env->mesh;
1056 if(mstate->s.serve_expired_data && mstate->s.serve_expired_data->timer) {
1057 comm_timer_delete(mstate->s.serve_expired_data->timer);
1058 mstate->s.serve_expired_data->timer = NULL;
1061 if(!mstate->replies_sent) {
1062 struct mesh_reply* rep = mstate->reply_list;
1067 mstate->reply_list = NULL;
1077 while((cb = mstate->cb_list)!=NULL) {
1078 mstate->cb_list = cb->next;
1090 (*mesh->mods.mod[i]->clear)(&mstate->s, i);
1091 mstate->s.minfo[i] = NULL;
1092 mstate->s.ext_state[i] = module_finished;
1094 alloc_reg_release(mstate->s.env->alloc, mstate->s.region);
1102 struct mesh_state* mstate;
1105 mstate = qstate->mesh_info;
1106 mesh = mstate->s.env->mesh;
1107 mesh_detach_subs(&mstate->s);
1108 if(mstate->list_select == mesh_forever_list) {
1110 mesh_list_remove(mstate, &mesh->forever_first,
1112 } else if(mstate->list_select == mesh_jostle_list) {
1113 mesh_list_remove(mstate, &mesh->jostle_first,
1116 if(!mstate->reply_list && !mstate->cb_list
1117 && mstate->super_set.count == 0) {
1121 if(mstate->reply_list || mstate->cb_list) {
1126 ref.s = mstate;
1127 RBTREE_FOR(super, struct mesh_state_ref*, &mstate->super_set) {
1130 (void)rbtree_delete(&mesh->run, mstate);
1131 (void)rbtree_delete(&mesh->all, mstate);
1132 mesh_state_cleanup(mstate);
1697 void mesh_query_done(struct mesh_state* mstate)
1703 struct reply_info* rep = (mstate->s.return_msg?
1704 mstate->s.return_msg->rep:NULL);
1708 if(mstate->s.serve_expired_data) {
1709 comm_timer_delete(mstate->s.serve_expired_data->timer);
1710 mstate->s.serve_expired_data->timer = NULL;
1712 if(mstate->s.return_rcode == LDNS_RCODE_SERVFAIL ||
1714 if(mstate->s.env->cfg->serve_expired) {
1716 mesh_respond_serve_expired(mstate);
1718 if((mstate->reply_list || mstate->cb_list)
1719 && mstate->s.env->cfg->log_servfail
1720 && !mstate->s.env->cfg->val_log_squelch) {
1721 char* err = errinf_to_str_servfail(&mstate->s);
1726 if(mstate->reply_list && mstate->s.env->cfg->dns_error_reporting)
1727 dns_error_reporting(&mstate->s, rep);
1729 for(r = mstate->reply_list; r; r = r->next) {
1731 timeval_subtract(&old, mstate->s.env->now_tv, &r->start_time);
1732 if(mstate->s.env->cfg->discard_timeout != 0 &&
1734 mstate->s.env->cfg->discard_timeout) {
1741 struct mesh_reply* reply_list = mstate->reply_list;
1743 infra_wait_limit_dec(mstate->s.env->infra_cache,
1744 &r->query_reply, mstate->s.env->cfg);
1745 mstate->reply_list = NULL;
1749 mstate->reply_list = reply_list;
1750 mstate->s.env->mesh->num_queries_discard_timeout++;
1759 if(mstate->s.respip_action_info &&
1760 mstate->s.respip_action_info->addrinfo) {
1761 respip_inform_print(mstate->s.respip_action_info,
1762 r->qname, mstate->s.qinfo.qtype,
1763 mstate->s.qinfo.qclass, r->local_alias,
1770 if(mstate->s.is_drop) {
1776 struct mesh_reply* reply_list = mstate->reply_list;
1777 infra_wait_limit_dec(mstate->s.env->infra_cache,
1778 &r->query_reply, mstate->s.env->cfg);
1779 mstate->reply_list = NULL;
1784 mstate->reply_list = reply_list;
1791 mesh_send_reply(mstate, mstate->s.return_rcode, rep,
1794 tcp_req_info_remove_mesh_state(r->query_reply.c->tcp_req_info, mstate);
1804 if(i > 0 && mstate->s.respip_action_info &&
1805 mstate->s.respip_action_info->addrinfo &&
1806 mstate->s.env->cfg->stat_extended &&
1807 mstate->s.respip_action_info->rpz_used) {
1808 if(mstate->s.respip_action_info->rpz_disabled)
1809 mstate->s.env->mesh->rpz_action[RPZ_DISABLED_ACTION] += i;
1810 if(mstate->s.respip_action_info->rpz_cname_override)
1811 mstate->s.env->mesh->rpz_action[RPZ_CNAME_OVERRIDE_ACTION] += i;
1813 mstate->s.env->mesh->rpz_action[respip_action_to_rpz_action(
1814 mstate->s.respip_action_info->action)] += i;
1816 if(!mstate->s.is_drop && i > 0) {
1817 if(mstate->s.env->cfg->stat_extended
1818 && mstate->s.is_cachedb_answer) {
1819 mstate->s.env->mesh->ans_cachedb += i;
1824 if(mstate->reply_list) {
1825 mstate->reply_list = NULL;
1826 if(!mstate->reply_list && !mstate->cb_list) {
1828 log_assert(mstate->s.env->mesh->num_reply_states > 0);
1829 mstate->s.env->mesh->num_reply_states--;
1831 if(!mstate->reply_list && !mstate->cb_list &&
1832 mstate->super_set.count == 0)
1833 mstate->s.env->mesh->num_detached_states++;
1835 mstate->replies_sent = 1;
1837 while((c = mstate->cb_list) != NULL) {
1840 if(!mstate->reply_list && mstate->cb_list && !c->next) {
1842 log_assert(mstate->s.env->mesh->num_reply_states > 0);
1843 mstate->s.env->mesh->num_reply_states--;
1845 mstate->cb_list = c->next;
1846 if(!mstate->reply_list && !mstate->cb_list &&
1847 mstate->super_set.count == 0)
1848 mstate->s.env->mesh->num_detached_states++;
1849 mesh_do_callback(mstate, mstate->s.return_rcode, rep, c, &tv);
1853 void mesh_walk_supers(struct mesh_area* mesh, struct mesh_state* mstate)
1856 RBTREE_FOR(ref, struct mesh_state_ref*, &mstate->super_set)
1863 (*mesh->mods.mod[ref->s->s.curmod]->inform_super)(&mstate->s,
1866 copy_state_to_super(&mstate->s, ref->s->s.curmod, &ref->s->s);
2021 /* Extract the query info and flags from 'mstate' into '*qinfop' and '*qflags'.
2025 mesh_copy_qinfo(struct mesh_state* mstate, struct query_info** qinfop,
2028 struct regional* region = mstate->s.env->scratch;
2031 qinfo = regional_alloc_init(region, &mstate->s.qinfo, sizeof(*qinfo));
2039 *qflags = mstate->s.query_flags;
2047 * @param mstate: currently active mesh state.
2058 mesh_continue(struct mesh_area* mesh, struct mesh_state* mstate,
2061 mstate->num_activated++;
2062 if(mstate->num_activated > MESH_MAX_ACTIVATION) {
2065 mesh->mods.mod[mstate->s.curmod]->name);
2067 &mstate->s.qinfo);
2072 mstate->s.curmod++;
2073 if(mesh->mods.num == mstate->s.curmod) {
2076 &mstate->s.qinfo);
2077 mstate->s.curmod--;
2078 return mesh_continue(mesh, mstate, module_error, ev);
2081 int curmod = mstate->s.curmod;
2082 for(; mstate->s.curmod < mesh->mods.num;
2083 mstate->s.curmod++) {
2085 mesh->mods.mod[mstate->s.curmod]->clear));
2086 (*mesh->mods.mod[mstate->s.curmod]->clear)
2087 (&mstate->s, mstate->s.curmod);
2088 mstate->s.minfo[mstate->s.curmod] = NULL;
2090 mstate->s.curmod = curmod;
2095 if(s == module_wait_subquery && mstate->sub_set.count == 0) {
2098 &mstate->s.qinfo);
2101 if(s == module_error && mstate->s.return_rcode == LDNS_RCODE_NOERROR) {
2103 mstate->s.return_rcode = LDNS_RCODE_SERVFAIL;
2106 mesh_query_done(mstate);
2107 mesh_walk_supers(mesh, mstate);
2108 mesh_state_delete(&mstate->s);
2112 if(mstate->s.curmod == 0) {
2121 if(mstate->s.need_refetch && mstate->reply_list &&
2123 mstate->s.env->unique_mesh) {
2124 addr = mstate->reply_list->query_reply.client_addr;
2129 mesh_query_done(mstate);
2130 mesh_walk_supers(mesh, mstate);
2136 if(mstate->s.need_refetch) {
2137 mesh_copy_qinfo(mstate, &qinfo, &qflags);
2141 mstate->s.edns_opts_front_in,
2142 mstate->s.env->cfg->client_subnet_opcode)) != NULL) {
2146 mstate->s.env->scratch);
2149 rpz_p = mstate->s.rpz_passthru;
2153 mesh_state_delete(&mstate->s);
2159 mesh_state_delete(&mstate->s);
2164 mstate->s.curmod --;
2171 void mesh_run(struct mesh_area* mesh, struct mesh_state* mstate,
2176 while(mstate) {
2179 mesh->mods.mod[mstate->s.curmod]->operate));
2180 (*mesh->mods.mod[mstate->s.curmod]->operate)
2181 (&mstate->s, ev, mstate->s.curmod, e);
2184 mstate->s.reply = NULL;
2185 regional_free_all(mstate->s.env->scratch);
2186 s = mstate->s.ext_state[mstate->s.curmod];
2188 mesh->mods.mod[mstate->s.curmod]->name, strextstate(s));
2190 if(mesh_continue(mesh, mstate, s, &ev))
2197 mstate = (struct mesh_state*)mesh->run.root->key;
2198 (void)rbtree_delete(&mesh->run, mstate);
2199 } else mstate = NULL;
2357 /* if not replies any more in mstate, it is no longer a reply_state */
2395 struct mesh_state* mstate = (struct mesh_state*) arg;
2396 struct module_qstate* qstate = &mstate->s;
2492 for(r = mstate->reply_list; r; r = r->next) {
2494 timeval_subtract(&old, mstate->s.env->now_tv, &r->start_time);
2495 if(mstate->s.env->cfg->discard_timeout != 0 &&
2497 mstate->s.env->cfg->discard_timeout) {
2504 struct mesh_reply* reply_list = mstate->reply_list;
2506 infra_wait_limit_dec(mstate->s.env->infra_cache,
2507 &r->query_reply, mstate->s.env->cfg);
2508 mstate->reply_list = NULL;
2512 mstate->reply_list = reply_list;
2513 mstate->s.env->mesh->num_queries_discard_timeout++;
2536 mstate->s.region, LDNS_EDE_STALE_ANSWER, NULL);
2542 mesh_send_reply(mstate, LDNS_RCODE_NOERROR, msg->rep,
2545 tcp_req_info_remove_mesh_state(r->query_reply.c->tcp_req_info, mstate);
2547 infra_wait_limit_dec(mstate->s.env->infra_cache,
2548 &r->query_reply, mstate->s.env->cfg);
2568 if(mstate->reply_list) {
2569 mstate->reply_list = NULL;
2570 if(!mstate->reply_list && !mstate->cb_list) {
2573 if(mstate->super_set.count == 0) {
2579 mstate->cb_list) != NULL) {
2582 if(!mstate->reply_list && mstate->cb_list && !c->next) {
2587 mstate->cb_list = c->next;
2588 if(!mstate->reply_list && !mstate->cb_list &&
2589 mstate->super_set.count == 0)
2591 mesh_do_callback(mstate, LDNS_RCODE_NOERROR, msg->rep, c, &tv);
2596 mesh_respond_serve_expired(struct mesh_state* mstate)
2598 if(!mstate->s.serve_expired_data)
2599 mesh_serve_expired_init(mstate, -1);
2600 mesh_serve_expired_callback(mstate);