Lines Matching defs:mstate

231 	struct mesh_state* mstate = (struct mesh_state*)n->key;
235 mesh_state_delete(&mstate->s);
371 mesh_serve_expired_init(struct mesh_state* mstate, int timeout)
376 if(!mstate->s.serve_expired_data) {
377 mstate->s.serve_expired_data = (struct serve_expired_data*)
379 mstate->s.region, sizeof(struct serve_expired_data));
380 if(!mstate->s.serve_expired_data)
385 mstate->s.serve_expired_data->get_cached_answer =
386 mstate->s.serve_expired_data->get_cached_answer?
387 mstate->s.serve_expired_data->get_cached_answer:
391 if(!mstate->s.serve_expired_data->timer && timeout != -1) {
392 mstate->s.serve_expired_data->timer = comm_timer_create(
393 mstate->s.env->worker_base, mesh_serve_expired_callback, mstate);
394 if(!mstate->s.serve_expired_data->timer)
400 comm_timer_set(mstate->s.serve_expired_data->timer, &t);
877 struct mesh_state* mstate;
881 mstate = (struct mesh_state*)regional_alloc(region,
883 if(!mstate) {
887 memset(mstate, 0, sizeof(*mstate));
888 mstate->node = *RBTREE_NULL;
889 mstate->run_node = *RBTREE_NULL;
890 mstate->node.key = mstate;
891 mstate->run_node.key = mstate;
892 mstate->reply_list = NULL;
893 mstate->list_select = mesh_no_list;
894 mstate->replies_sent = 0;
895 rbtree_init(&mstate->super_set, &mesh_state_ref_compare);
896 rbtree_init(&mstate->sub_set, &mesh_state_ref_compare);
897 mstate->num_activated = 0;
898 mstate->unique = NULL;
900 mstate->s.qinfo.qtype = qinfo->qtype;
901 mstate->s.qinfo.qclass = qinfo->qclass;
902 mstate->s.qinfo.local_alias = NULL;
903 mstate->s.qinfo.qname_len = qinfo->qname_len;
904 mstate->s.qinfo.qname = regional_alloc_init(region, qinfo->qname,
906 if(!mstate->s.qinfo.qname) {
911 mstate->s.client_info = regional_alloc_init(region, cinfo,
913 if(!mstate->s.client_info) {
919 mstate->s.query_flags = (qflags & (BIT_RD|BIT_CD));
920 mstate->s.is_priming = prime;
921 mstate->s.is_valrec = valrec;
922 mstate->s.reply = NULL;
923 mstate->s.region = region;
924 mstate->s.curmod = 0;
925 mstate->s.return_msg = 0;
926 mstate->s.return_rcode = LDNS_RCODE_NOERROR;
927 mstate->s.env = env;
928 mstate->s.mesh_info = mstate;
929 mstate->s.prefetch_leeway = 0;
930 mstate->s.serve_expired_data = NULL;
931 mstate->s.no_cache_lookup = 0;
932 mstate->s.no_cache_store = 0;
933 mstate->s.need_refetch = 0;
934 mstate->s.was_ratelimited = 0;
935 mstate->s.qstarttime = *env->now;
939 mstate->s.minfo[i] = NULL;
940 mstate->s.ext_state[i] = module_state_initial;
943 mstate->s.edns_opts_front_in = NULL;
944 mstate->s.edns_opts_back_out = NULL;
945 mstate->s.edns_opts_back_in = NULL;
946 mstate->s.edns_opts_front_out = NULL;
948 return mstate;
952 mesh_state_make_unique(struct mesh_state* mstate)
954 mstate->unique = mstate;
958 mesh_state_cleanup(struct mesh_state* mstate)
962 if(!mstate)
964 mesh = mstate->s.env->mesh;
966 if(mstate->s.serve_expired_data && mstate->s.serve_expired_data->timer) {
967 comm_timer_delete(mstate->s.serve_expired_data->timer);
968 mstate->s.serve_expired_data->timer = NULL;
971 if(!mstate->replies_sent) {
972 struct mesh_reply* rep = mstate->reply_list;
977 mstate->reply_list = NULL;
987 while((cb = mstate->cb_list)!=NULL) {
988 mstate->cb_list = cb->next;
1000 (*mesh->mods.mod[i]->clear)(&mstate->s, i);
1001 mstate->s.minfo[i] = NULL;
1002 mstate->s.ext_state[i] = module_finished;
1004 alloc_reg_release(mstate->s.env->alloc, mstate->s.region);
1012 struct mesh_state* mstate;
1015 mstate = qstate->mesh_info;
1016 mesh = mstate->s.env->mesh;
1017 mesh_detach_subs(&mstate->s);
1018 if(mstate->list_select == mesh_forever_list) {
1020 mesh_list_remove(mstate, &mesh->forever_first,
1022 } else if(mstate->list_select == mesh_jostle_list) {
1023 mesh_list_remove(mstate, &mesh->jostle_first,
1026 if(!mstate->reply_list && !mstate->cb_list
1027 && mstate->super_set.count == 0) {
1031 if(mstate->reply_list || mstate->cb_list) {
1036 ref.s = mstate;
1037 RBTREE_FOR(super, struct mesh_state_ref*, &mstate->super_set) {
1040 (void)rbtree_delete(&mesh->run, mstate);
1041 (void)rbtree_delete(&mesh->all, mstate);
1042 mesh_state_cleanup(mstate);
1496 void mesh_query_done(struct mesh_state* mstate)
1502 struct reply_info* rep = (mstate->s.return_msg?
1503 mstate->s.return_msg->rep:NULL);
1507 if(mstate->s.serve_expired_data) {
1508 comm_timer_delete(mstate->s.serve_expired_data->timer);
1509 mstate->s.serve_expired_data->timer = NULL;
1511 if(mstate->s.return_rcode == LDNS_RCODE_SERVFAIL ||
1514 mesh_serve_expired_callback(mstate);
1515 if((mstate->reply_list || mstate->cb_list)
1516 && mstate->s.env->cfg->log_servfail
1517 && !mstate->s.env->cfg->val_log_squelch) {
1518 char* err = errinf_to_str_servfail(&mstate->s);
1522 for(r = mstate->reply_list; r; r = r->next) {
1524 timeval_subtract(&old, mstate->s.env->now_tv, &r->start_time);
1525 if(mstate->s.env->cfg->discard_timeout != 0 &&
1527 mstate->s.env->cfg->discard_timeout) {
1534 struct mesh_reply* reply_list = mstate->reply_list;
1536 infra_wait_limit_dec(mstate->s.env->infra_cache,
1537 &r->query_reply, mstate->s.env->cfg);
1538 mstate->reply_list = NULL;
1542 mstate->reply_list = reply_list;
1543 mstate->s.env->mesh->stats_dropped++;
1552 if(mstate->s.respip_action_info &&
1553 mstate->s.respip_action_info->addrinfo) {
1554 respip_inform_print(mstate->s.respip_action_info,
1555 r->qname, mstate->s.qinfo.qtype,
1556 mstate->s.qinfo.qclass, r->local_alias,
1563 if(mstate->s.is_drop) {
1569 struct mesh_reply* reply_list = mstate->reply_list;
1570 infra_wait_limit_dec(mstate->s.env->infra_cache,
1571 &r->query_reply, mstate->s.env->cfg);
1572 mstate->reply_list = NULL;
1577 mstate->reply_list = reply_list;
1584 mesh_send_reply(mstate, mstate->s.return_rcode, rep,
1587 tcp_req_info_remove_mesh_state(r->query_reply.c->tcp_req_info, mstate);
1597 if(i > 0 && mstate->s.respip_action_info &&
1598 mstate->s.respip_action_info->addrinfo &&
1599 mstate->s.env->cfg->stat_extended &&
1600 mstate->s.respip_action_info->rpz_used) {
1601 if(mstate->s.respip_action_info->rpz_disabled)
1602 mstate->s.env->mesh->rpz_action[RPZ_DISABLED_ACTION] += i;
1603 if(mstate->s.respip_action_info->rpz_cname_override)
1604 mstate->s.env->mesh->rpz_action[RPZ_CNAME_OVERRIDE_ACTION] += i;
1606 mstate->s.env->mesh->rpz_action[respip_action_to_rpz_action(
1607 mstate->s.respip_action_info->action)] += i;
1609 if(!mstate->s.is_drop && i > 0) {
1610 if(mstate->s.env->cfg->stat_extended
1611 && mstate->s.is_cachedb_answer) {
1612 mstate->s.env->mesh->ans_cachedb += i;
1617 if(mstate->reply_list) {
1618 mstate->reply_list = NULL;
1619 if(!mstate->reply_list && !mstate->cb_list) {
1621 log_assert(mstate->s.env->mesh->num_reply_states > 0);
1622 mstate->s.env->mesh->num_reply_states--;
1624 if(!mstate->reply_list && !mstate->cb_list &&
1625 mstate->super_set.count == 0)
1626 mstate->s.env->mesh->num_detached_states++;
1628 mstate->replies_sent = 1;
1630 while((c = mstate->cb_list) != NULL) {
1633 if(!mstate->reply_list && mstate->cb_list && !c->next) {
1635 log_assert(mstate->s.env->mesh->num_reply_states > 0);
1636 mstate->s.env->mesh->num_reply_states--;
1638 mstate->cb_list = c->next;
1639 if(!mstate->reply_list && !mstate->cb_list &&
1640 mstate->super_set.count == 0)
1641 mstate->s.env->mesh->num_detached_states++;
1642 mesh_do_callback(mstate, mstate->s.return_rcode, rep, c, &tv);
1646 void mesh_walk_supers(struct mesh_area* mesh, struct mesh_state* mstate)
1649 RBTREE_FOR(ref, struct mesh_state_ref*, &mstate->super_set)
1656 (*mesh->mods.mod[ref->s->s.curmod]->inform_super)(&mstate->s,
1659 copy_state_to_super(&mstate->s, ref->s->s.curmod, &ref->s->s);
1795 /* Extract the query info and flags from 'mstate' into '*qinfop' and '*qflags'.
1799 mesh_copy_qinfo(struct mesh_state* mstate, struct query_info** qinfop,
1802 struct regional* region = mstate->s.env->scratch;
1805 qinfo = regional_alloc_init(region, &mstate->s.qinfo, sizeof(*qinfo));
1813 *qflags = mstate->s.query_flags;
1821 * @param mstate: currently active mesh state.
1832 mesh_continue(struct mesh_area* mesh, struct mesh_state* mstate,
1835 mstate->num_activated++;
1836 if(mstate->num_activated > MESH_MAX_ACTIVATION) {
1839 mesh->mods.mod[mstate->s.curmod]->name);
1841 &mstate->s.qinfo);
1846 mstate->s.curmod++;
1847 if(mesh->mods.num == mstate->s.curmod) {
1850 &mstate->s.qinfo);
1851 mstate->s.curmod--;
1852 return mesh_continue(mesh, mstate, module_error, ev);
1855 int curmod = mstate->s.curmod;
1856 for(; mstate->s.curmod < mesh->mods.num;
1857 mstate->s.curmod++) {
1859 mesh->mods.mod[mstate->s.curmod]->clear));
1860 (*mesh->mods.mod[mstate->s.curmod]->clear)
1861 (&mstate->s, mstate->s.curmod);
1862 mstate->s.minfo[mstate->s.curmod] = NULL;
1864 mstate->s.curmod = curmod;
1869 if(s == module_wait_subquery && mstate->sub_set.count == 0) {
1872 &mstate->s.qinfo);
1875 if(s == module_error && mstate->s.return_rcode == LDNS_RCODE_NOERROR) {
1877 mstate->s.return_rcode = LDNS_RCODE_SERVFAIL;
1880 mesh_query_done(mstate);
1881 mesh_walk_supers(mesh, mstate);
1882 mesh_state_delete(&mstate->s);
1886 if(mstate->s.curmod == 0) {
1895 if(mstate->s.need_refetch && mstate->reply_list &&
1897 mstate->s.env->unique_mesh) {
1898 addr = mstate->reply_list->query_reply.client_addr;
1903 mesh_query_done(mstate);
1904 mesh_walk_supers(mesh, mstate);
1910 if(mstate->s.need_refetch) {
1911 mesh_copy_qinfo(mstate, &qinfo, &qflags);
1915 mstate->s.edns_opts_front_in,
1916 mstate->s.env->cfg->client_subnet_opcode)) != NULL) {
1920 mstate->s.env->scratch);
1923 rpz_p = mstate->s.rpz_passthru;
1927 mesh_state_delete(&mstate->s);
1933 mesh_state_delete(&mstate->s);
1938 mstate->s.curmod --;
1945 void mesh_run(struct mesh_area* mesh, struct mesh_state* mstate,
1950 while(mstate) {
1953 mesh->mods.mod[mstate->s.curmod]->operate));
1954 (*mesh->mods.mod[mstate->s.curmod]->operate)
1955 (&mstate->s, ev, mstate->s.curmod, e);
1958 mstate->s.reply = NULL;
1959 regional_free_all(mstate->s.env->scratch);
1960 s = mstate->s.ext_state[mstate->s.curmod];
1962 mesh->mods.mod[mstate->s.curmod]->name, strextstate(s));
1964 if(mesh_continue(mesh, mstate, s, &ev))
1971 mstate = (struct mesh_state*)mesh->run.root->key;
1972 (void)rbtree_delete(&mesh->run, mstate);
1973 } else mstate = NULL;
2125 /* if not replies any more in mstate, it is no longer a reply_state */
2162 struct mesh_state* mstate = (struct mesh_state*) arg;
2163 struct module_qstate* qstate = &mstate->s;
2252 for(r = mstate->reply_list; r; r = r->next) {
2254 timeval_subtract(&old, mstate->s.env->now_tv, &r->start_time);
2255 if(mstate->s.env->cfg->discard_timeout != 0 &&
2257 mstate->s.env->cfg->discard_timeout) {
2264 struct mesh_reply* reply_list = mstate->reply_list;
2266 infra_wait_limit_dec(mstate->s.env->infra_cache,
2267 &r->query_reply, mstate->s.env->cfg);
2268 mstate->reply_list = NULL;
2272 mstate->reply_list = reply_list;
2273 mstate->s.env->mesh->stats_dropped++;
2296 mstate->s.region, LDNS_EDE_STALE_ANSWER, NULL);
2302 mesh_send_reply(mstate, LDNS_RCODE_NOERROR, msg->rep,
2305 tcp_req_info_remove_mesh_state(r->query_reply.c->tcp_req_info, mstate);
2307 infra_wait_limit_dec(mstate->s.env->infra_cache,
2308 &r->query_reply, mstate->s.env->cfg);
2328 if(mstate->reply_list) {
2329 mstate->reply_list = NULL;
2330 if(!mstate->reply_list && !mstate->cb_list) {
2333 if(mstate->super_set.count == 0) {
2339 while((c = mstate->cb_list) != NULL) {
2342 if(!mstate->reply_list && mstate->cb_list && !c->next) {
2347 mstate->cb_list = c->next;
2348 if(!mstate->reply_list && !mstate->cb_list &&
2349 mstate->super_set.count == 0)
2351 mesh_do_callback(mstate, LDNS_RCODE_NOERROR, msg->rep, c, &tv);
2356 mesh_respond_serve_expired(struct mesh_state* mstate)
2358 if(!mstate->s.serve_expired_data)
2359 mesh_serve_expired_init(mstate, -1);
2360 mesh_serve_expired_callback(mstate);