Lines Matching refs:qstate

289 cachedb_new(struct module_qstate* qstate, int id)
292 qstate->region, sizeof(struct cachedb_qstate));
293 qstate->minfo[id] = iq;
305 * @param qstate: our query state
312 error_response(struct module_qstate* qstate, int id, int rcode)
317 qstate->return_rcode = rcode;
318 qstate->return_msg = NULL;
319 qstate->ext_state[id] = module_finished;
325 * @param qstate: query state with query info
331 calc_hash(struct module_qstate* qstate, char* buf, size_t len)
337 const char* secret = qstate->env->cfg->cachedb_secret;
341 if(clen + qstate->qinfo.qname_len < sizeof(clear)) {
342 memmove(clear+clen, qstate->qinfo.qname,
343 qstate->qinfo.qname_len);
344 clen += qstate->qinfo.qname_len;
347 uint16_t t = htons(qstate->qinfo.qtype);
348 uint16_t c = htons(qstate->qinfo.qclass);
379 prep_data(struct module_qstate* qstate, struct sldns_buffer* buf)
391 if(!qstate->return_msg || !qstate->return_msg->rep)
395 if(FLAGS_GET_RCODE(qstate->return_msg->rep->flags) !=
397 FLAGS_GET_RCODE(qstate->return_msg->rep->flags) !=
399 FLAGS_GET_RCODE(qstate->return_msg->rep->flags) !=
406 if(qstate->return_msg->rep->ttl == 0 &&
407 !qstate->env->cfg->serve_expired)
411 if (qstate->env->cfg->ede && qstate->return_msg->rep->reason_bogus != LDNS_EDE_NONE) {
412 edns_opt_list_append_ede(&edns.opt_list_out, qstate->env->scratch,
413 qstate->return_msg->rep->reason_bogus,
414 qstate->return_msg->rep->reason_bogus_str);
418 log_dns_msg("cachedb encoding", &qstate->return_msg->qinfo,
419 qstate->return_msg->rep);
420 if(!reply_info_answer_encode(&qstate->return_msg->qinfo,
421 qstate->return_msg->rep, 0, qstate->query_flags,
422 buf, 0, 1, qstate->env->scratch, 65535, &edns, 1, 0))
428 /* qstate->return_msg->rep->ttl contains that relative shortest ttl */
429 timestamp = (uint64_t)*qstate->env->now;
430 expiry = timestamp + (uint64_t)qstate->return_msg->rep->ttl;
447 good_expiry_and_qinfo(struct module_qstate* qstate, struct sldns_buffer* buf)
461 if((time_t)expiry < *qstate->env->now &&
462 (!qstate->env->cfg->serve_expired ||
464 *qstate->env->now - (time_t)expiry > SERVE_EXPIRED_TTL)))
537 parse_data(struct module_qstate* qstate, struct sldns_buffer* buf,
557 regional_free_all(qstate->env->scratch);
558 prs = (struct msg_parse*)regional_alloc(qstate->env->scratch,
565 if(parse_packet(buf, prs, qstate->env->scratch) != LDNS_RCODE_NOERROR) {
569 if(parse_extract_edns_from_response_msg(prs, &edns, qstate->env->scratch) !=
575 qstate->return_msg = dns_alloc_msg(buf, prs, qstate->region);
577 if(!qstate->return_msg)
581 if(qstate->env->cfg->ede &&
584 qstate->return_msg->rep->reason_bogus =
590 qstate->return_msg->rep->reason_bogus_str = regional_alloc(
591 qstate->region, sizeof(char) * (ede_len+1));
592 memcpy(qstate->return_msg->rep->reason_bogus_str,
594 qstate->return_msg->rep->reason_bogus_str[ede_len] = 0;
598 qstate->return_rcode = LDNS_RCODE_NOERROR;
601 if(*qstate->env->now <= (time_t)timestamp) {
605 adjust = *qstate->env->now - (time_t)timestamp;
606 if(qstate->return_msg->rep->ttl < adjust) {
611 if(!qstate->env->cfg->serve_expired ||
612 (FLAGS_GET_RCODE(qstate->return_msg->rep->flags)
614 FLAGS_GET_RCODE(qstate->return_msg->rep->flags)
616 FLAGS_GET_RCODE(qstate->return_msg->rep->flags)
623 adjust_msg_ttl(qstate->return_msg, adjust);
630 if(qstate->env->cfg->serve_expired &&
631 !qstate->env->cfg->serve_expired_client_timeout &&
632 (adjust == -1 || (time_t)expiry < *qstate->env->now)) {
633 qstate->need_refetch = 1;
640 * Lookup the qstate.qinfo in extcache, store in qstate.return_msg.
644 cachedb_extcache_lookup(struct module_qstate* qstate, struct cachedb_env* ie,
648 calc_hash(qstate, key, sizeof(key));
651 if( !(*ie->backend->lookup)(qstate->env, ie, key,
652 qstate->env->scratch_buffer)) {
657 if( !good_expiry_and_qinfo(qstate, qstate->env->scratch_buffer) ) {
662 if( !parse_data(qstate, qstate->env->scratch_buffer, msg_expired) ) {
669 * Store the qstate.return_msg in extcache for key qstate.info
672 cachedb_extcache_store(struct module_qstate* qstate, struct cachedb_env* ie)
675 calc_hash(qstate, key, sizeof(key));
678 if(!prep_data(qstate, qstate->env->scratch_buffer))
682 (*ie->backend->store)(qstate->env, ie, key,
683 sldns_buffer_begin(qstate->env->scratch_buffer),
684 sldns_buffer_limit(qstate->env->scratch_buffer),
685 qstate->return_msg->rep->ttl);
692 cachedb_intcache_lookup(struct module_qstate* qstate, struct cachedb_env* cde)
702 if(iter_stub_fwd_no_cache(qstate, &qstate->qinfo,
705 msg = dns_cache_lookup(qstate->env, qstate->qinfo.qname,
706 qstate->qinfo.qname_len, qstate->qinfo.qtype,
707 qstate->qinfo.qclass, qstate->query_flags,
708 qstate->region, qstate->env->scratch,
712 if(!msg && qstate->env->neg_cache &&
713 iter_qname_indicates_dnssec(qstate->env, &qstate->qinfo)) {
716 msg = val_neg_getmsg(qstate->env->neg_cache, &qstate->qinfo,
717 qstate->region, qstate->env->rrset_cache,
718 qstate->env->scratch_buffer,
719 *qstate->env->now, 1/*add SOA*/, NULL,
720 qstate->env->cfg);
725 qstate->return_rcode = LDNS_RCODE_NOERROR;
726 qstate->return_msg = msg;
734 cachedb_intcache_store(struct module_qstate* qstate, int msg_expired)
736 uint32_t store_flags = qstate->query_flags;
737 int serve_expired = qstate->env->cfg->serve_expired;
739 if(qstate->env->cfg->serve_expired)
741 if(!qstate->return_msg)
747 set_msg_ttl(qstate->return_msg, (time_t)-3);
749 (void)dns_cache_store(qstate->env, &qstate->qinfo,
750 qstate->return_msg->rep, 0, qstate->prefetch_leeway, 0,
751 qstate->region, store_flags, qstate->qstarttime);
753 if(qstate->env->cfg->serve_expired_client_timeout) {
761 adjust_msg_ttl(qstate->return_msg, -1);
765 mesh_respond_serve_expired(qstate->mesh_info);
771 * @param qstate: query state (from the mesh), passed between modules.
772 * contains qstate->env module environment with global caches and so on.
778 cachedb_handle_query(struct module_qstate* qstate,
783 qstate->is_cachedb_answer = 0;
787 qstate->ext_state[id] = module_wait_module;
791 if(qstate->blacklist || qstate->no_cache_lookup) {
794 qstate->ext_state[id] = module_wait_module;
800 if(cachedb_intcache_lookup(qstate, ie)) {
802 if(qstate->return_msg->rep)
804 &qstate->return_msg->qinfo,
805 qstate->return_msg->rep);
807 sldns_lookup_by_id(sldns_rcodes, qstate->return_rcode)
808 ?sldns_lookup_by_id(sldns_rcodes, qstate->return_rcode)->name
812 qstate->ext_state[id] = module_finished;
817 if(cachedb_extcache_lookup(qstate, ie, &msg_expired)) {
820 &qstate->return_msg->qinfo,
821 qstate->return_msg->rep);
823 cachedb_intcache_store(qstate, msg_expired);
830 if(qstate->env->cfg->serve_expired && msg_expired) {
831 qstate->return_msg = NULL;
832 qstate->ext_state[id] = module_wait_module;
836 qstate->need_refetch = 0;
839 if(qstate->need_refetch && qstate->serve_expired_data &&
840 qstate->serve_expired_data->timer) {
841 qstate->return_msg = NULL;
842 qstate->ext_state[id] = module_wait_module;
845 qstate->is_cachedb_answer = 1;
847 qstate->ext_state[id] = module_finished;
851 if(qstate->serve_expired_data &&
852 qstate->env->cfg->cachedb_check_when_serve_expired &&
853 !qstate->env->cfg->serve_expired_client_timeout) {
856 mesh_respond_serve_expired(qstate->mesh_info);
861 qstate->ext_state[id] = module_wait_module;
866 * @param qstate: query state (from the mesh), passed between modules.
867 * contains qstate->env module environment with global caches and so on.
873 cachedb_handle_response(struct module_qstate* qstate,
876 qstate->is_cachedb_answer = 0;
878 if(!ie->enabled || qstate->no_cache_store) {
880 qstate->ext_state[id] = module_finished;
883 if(qstate->env->cfg->cachedb_no_store) {
885 qstate->ext_state[id] = module_finished;
890 cachedb_extcache_store(qstate, ie);
893 qstate->ext_state[id] = module_finished;
897 cachedb_operate(struct module_qstate* qstate, enum module_ev event, int id,
900 struct cachedb_env* ie = (struct cachedb_env*)qstate->env->modinfo[id];
901 struct cachedb_qstate* iq = (struct cachedb_qstate*)qstate->minfo[id];
903 id, strextstate(qstate->ext_state[id]), strmodulevent(event));
905 &qstate->qinfo);
910 if(!cachedb_new(qstate, id)) {
911 (void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
914 iq = (struct cachedb_qstate*)qstate->minfo[id];
917 cachedb_handle_query(qstate, iq, ie, id);
921 cachedb_handle_response(qstate, iq, ie, id);
927 cachedb_process_response(qstate, iq, ie, id, outbound, event);
933 (void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
938 qstate->ext_state[id] = module_finished;
943 (void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
947 cachedb_inform_super(struct module_qstate* ATTR_UNUSED(qstate),
955 cachedb_clear(struct module_qstate* qstate, int id)
958 if(!qstate)
960 iq = (struct cachedb_qstate*)qstate->minfo[id];
965 qstate->minfo[id] = NULL;
1005 void cachedb_msg_remove(struct module_qstate* qstate)
1008 int id = modstack_find(qstate->env->modstack, "cachedb");
1009 struct cachedb_env* ie = (struct cachedb_env*)qstate->env->modinfo[id];
1011 log_query_info(VERB_ALGO, "cachedb msg remove", &qstate->qinfo);
1012 calc_hash(qstate, key, sizeof(key));
1013 sldns_buffer_clear(qstate->env->scratch_buffer);
1014 sldns_buffer_write_u32(qstate->env->scratch_buffer, 0);
1015 sldns_buffer_flip(qstate->env->scratch_buffer);
1018 (*ie->backend->store)(qstate->env, ie, key,
1019 sldns_buffer_begin(qstate->env->scratch_buffer),
1020 sldns_buffer_limit(qstate->env->scratch_buffer),