Lines Matching +full:super +full:- +full:set

2  * dns64/dns64.c - DNS64 module
63 * in module-config but when the dns64-prefix variable is not present.
68 * Maximum length of a domain name in a PTR query in the .in-addr.arpa tree.
76 DNS64_INTERNAL_QUERY, /**< Internally-generated query, no DNS64
80 DNS64_SUBQUERY_FINISHED /**< Query for which we generated a sub-query, and
81 for which this sub-query is finished. */
85 * Per-query module-specific state. For the DNS64 module.
90 /** If the dns64 module started with no_cache bool set in the qstate,
161 while ( begin < --end ) { in reverse()
184 return ss - s; in uitoa()
192 * \param ipv6 IPv6 address represented as a 128-bit array in big-endian
218 * "\03206\03123\0231\011\07in-addr\04arpa".
220 * \param ipv4 IPv4 address represented as an unsigned 32-bit number.
230 static const char IPV4_PTR_SUFFIX[] = "\07in-addr\04arpa"; in ipv4_to_ptr()
245 return c + sizeof(IPV4_PTR_SUFFIX) - ptr; in ipv4_to_ptr()
249 * Converts an IPv6-related domain name string from a PTR query into an IPv6
250 * address represented as a 128-bit array.
271 x = ptr[i] - '0'; in ptr_to_ipv6()
273 x = ptr[i] - 'a' + 10; in ptr_to_ipv6()
275 x = ptr[i] - 'A' + 10; in ptr_to_ipv6()
280 ipv6[15-i/4] |= x << (2 * ((i-1) % 4)); in ptr_to_ipv6()
339 node->name = sldns_str2wire_dname(str, &node->len); in dns64_insert_ignore_aaaa()
340 if(!node->name) { in dns64_insert_ignore_aaaa()
342 log_err("cannot parse dns64-ignore-aaaa: %s", str); in dns64_insert_ignore_aaaa()
345 node->labs = dname_count_labels(node->name); in dns64_insert_ignore_aaaa()
346 node->dclass = LDNS_RR_CLASS_IN; in dns64_insert_ignore_aaaa()
347 if(!name_tree_insert(&dns64_env->ignore_aaaa, node, in dns64_insert_ignore_aaaa()
348 node->name, node->len, node->labs, node->dclass)) { in dns64_insert_ignore_aaaa()
350 free(node->name); in dns64_insert_ignore_aaaa()
362 * \param dns64_env Module-specific global parameters.
369 verbose(VERB_ALGO, "dns64-prefix: %s", cfg->dns64_prefix); in dns64_apply_cfg()
370 if (!netblockstrtoaddr(cfg->dns64_prefix ? cfg->dns64_prefix : in dns64_apply_cfg()
371 DEFAULT_DNS64_PREFIX, 0, &dns64_env->prefix_addr, in dns64_apply_cfg()
372 &dns64_env->prefix_addrlen, &dns64_env->prefix_net)) { in dns64_apply_cfg()
373 log_err("cannot parse dns64-prefix netblock: %s", cfg->dns64_prefix); in dns64_apply_cfg()
376 if (!addr_is_ip6(&dns64_env->prefix_addr, dns64_env->prefix_addrlen)) { in dns64_apply_cfg()
377 log_err("dns64_prefix is not IPv6: %s", cfg->dns64_prefix); in dns64_apply_cfg()
380 if (dns64_env->prefix_net != 32 && dns64_env->prefix_net != 40 && in dns64_apply_cfg()
381 dns64_env->prefix_net != 48 && dns64_env->prefix_net != 56 && in dns64_apply_cfg()
382 dns64_env->prefix_net != 64 && dns64_env->prefix_net != 96 ) { in dns64_apply_cfg()
383 log_err("dns64-prefix length it not 32, 40, 48, 56, 64 or 96: %s", in dns64_apply_cfg()
384 cfg->dns64_prefix); in dns64_apply_cfg()
387 for(s = cfg->dns64_ignore_aaaa; s; s = s->next) { in dns64_apply_cfg()
388 if(!dns64_insert_ignore_aaaa(dns64_env, s->str)) in dns64_apply_cfg()
391 name_tree_init_parents(&dns64_env->ignore_aaaa); in dns64_apply_cfg()
410 env->modinfo[id] = (void*)dns64_env; in dns64_init()
411 name_tree_init(&dns64_env->ignore_aaaa); in dns64_init()
412 if (!dns64_apply_cfg(dns64_env, env->cfg)) { in dns64_init()
425 free(n->name); in free_ignore_aaaa_node()
441 dns64_env = (struct dns64_env*)env->modinfo[id]; in dns64_deinit()
443 traverse_postorder(&dns64_env->ignore_aaaa, free_ignore_aaaa_node, in dns64_deinit()
446 free(env->modinfo[id]); in dns64_deinit()
447 env->modinfo[id] = NULL; in dns64_deinit()
462 struct dns64_env* dns64_env = (struct dns64_env*)qstate->env->modinfo[id]; in handle_ipv6_ptr()
470 if (!ptr_to_ipv6((char*)qstate->qinfo.qname, sin6.sin6_addr.s6_addr, in handle_ipv6_ptr()
479 &dns64_env->prefix_addr, dns64_env->prefix_net, in handle_ipv6_ptr()
480 (socklen_t)sizeof(sin6)) != dns64_env->prefix_net) in handle_ipv6_ptr()
490 qinfo = qstate->qinfo; in handle_ipv6_ptr()
491 if (!(qinfo.qname = regional_alloc(qstate->region, MAX_PTR_QNAME_IPV4))) in handle_ipv6_ptr()
494 sizeof(sin6.sin6_addr.s6_addr), dns64_env->prefix_net), in handle_ipv6_ptr()
497 /* Create the new sub-query. */ in handle_ipv6_ptr()
498 fptr_ok(fptr_whitelist_modenv_attach_sub(qstate->env->attach_sub)); in handle_ipv6_ptr()
499 if(!(*qstate->env->attach_sub)(qstate, &qinfo, qstate->query_flags, 0, 0, in handle_ipv6_ptr()
503 subq->curmod = id; in handle_ipv6_ptr()
504 subq->ext_state[id] = module_state_initial; in handle_ipv6_ptr()
505 subq->minfo[id] = NULL; in handle_ipv6_ptr()
520 qinfo = qstate->qinfo; in generate_type_A_query()
523 /* Start the sub-query. */ in generate_type_A_query()
524 fptr_ok(fptr_whitelist_modenv_attach_sub(qstate->env->attach_sub)); in generate_type_A_query()
525 if(!(*qstate->env->attach_sub)(qstate, &qinfo, qstate->query_flags, 0, in generate_type_A_query()
528 verbose(VERB_ALGO, "dns64: sub-query creation failed"); in generate_type_A_query()
532 subq->curmod = id; in generate_type_A_query()
533 subq->ext_state[id] = module_state_initial; in generate_type_A_query()
534 subq->minfo[id] = NULL; in generate_type_A_query()
542 * The ignore-aaaa list has names for which the AAAA for the domain is
546 * @return true if the name is covered by ignore-aaaa.
551 struct dns64_env* dns64_env = (struct dns64_env*)qstate->env->modinfo[id]; in dns64_always_synth_for_qname()
552 int labs = dname_count_labels(qstate->qinfo.qname); in dns64_always_synth_for_qname()
553 struct name_tree_node* node = name_tree_lookup(&dns64_env->ignore_aaaa, in dns64_always_synth_for_qname()
554 qstate->qinfo.qname, qstate->qinfo.qname_len, labs, in dns64_always_synth_for_qname()
555 qstate->qinfo.qclass); in dns64_always_synth_for_qname()
575 struct dns64_qstate* iq = (struct dns64_qstate*)qstate->minfo[id]; in handle_event_pass()
576 int synth_all_cfg = qstate->env->cfg->dns64_synthall; in handle_event_pass()
579 if(iq && iq->state == DNS64_NEW_QUERY in handle_event_pass()
580 && qstate->qinfo.qtype == LDNS_RR_TYPE_PTR in handle_event_pass()
581 && qstate->qinfo.qname_len == 74 in handle_event_pass()
582 && !strcmp((char*)&qstate->qinfo.qname[64], "\03ip6\04arpa")) { in handle_event_pass()
587 if(iq && iq->state == DNS64_NEW_QUERY && in handle_event_pass()
588 qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA && in handle_event_pass()
591 && !(qstate->query_flags & BIT_CD))))) { in handle_event_pass()
593 verbose(VERB_ALGO, "dns64: ignore-aaaa and synthesize anyway"); in handle_event_pass()
597 /* We are finished when our sub-query is finished. */ in handle_event_pass()
598 if(iq && iq->state == DNS64_SUBQUERY_FINISHED) in handle_event_pass()
608 * maybe issue a new sub-query for the A record.
619 struct dns64_qstate* iq = (struct dns64_qstate*)qstate->minfo[id]; in handle_event_moddone()
623 * - An internal query. in handle_event_moddone()
624 * - A query for a record type other than AAAA. in handle_event_moddone()
625 * - CD FLAG was set on querier in handle_event_moddone()
626 * - An AAAA query for which an error was returned.(qstate.return_rcode) in handle_event_moddone()
627 * -> treated as servfail thus synthesize (sec 5.1.3 6147), thus in handle_event_moddone()
629 * - A successful AAAA query with an answer. in handle_event_moddone()
637 qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA && in handle_event_moddone()
638 (!iq || iq->state != DNS64_INTERNAL_QUERY) && in handle_event_moddone()
639 !(qstate->query_flags & BIT_CD); in handle_event_moddone()
640 int has_data = /* whether query returned non-empty rrset */ in handle_event_moddone()
641 qstate->return_msg && in handle_event_moddone()
642 qstate->return_msg->rep && in handle_event_moddone()
643 reply_find_answer_rrset(&qstate->qinfo, qstate->return_msg->rep); in handle_event_moddone()
650 verbose(VERB_ALGO, "dns64: ignore-aaaa and synthesize anyway"); in handle_event_moddone()
655 if( (!iq || !iq->started_no_cache_store) && in handle_event_moddone()
656 qstate->return_msg && in handle_event_moddone()
657 qstate->return_msg->rep && in handle_event_moddone()
659 qstate->env, &qstate->qinfo, qstate->return_msg->rep, in handle_event_moddone()
660 0, qstate->prefetch_leeway, 0, NULL, in handle_event_moddone()
661 qstate->query_flags, qstate->qstarttime)) in handle_event_moddone()
687 id, strextstate(qstate->ext_state[id]), in dns64_operate()
689 log_query_info(VERB_QUERY, "dns64 operate: query", &qstate->qinfo); in dns64_operate()
695 qstate->region, sizeof(*iq)))) { in dns64_operate()
697 qstate->ext_state[id] = module_error; in dns64_operate()
700 qstate->minfo[id] = iq; in dns64_operate()
701 iq->state = DNS64_NEW_QUERY; in dns64_operate()
702 iq->started_no_cache_store = qstate->no_cache_store; in dns64_operate()
703 qstate->no_cache_store = 1; in dns64_operate()
707 qstate->ext_state[id] = handle_event_pass(qstate, id); in dns64_operate()
710 qstate->ext_state[id] = handle_event_moddone(qstate, id); in dns64_operate()
713 qstate->ext_state[id] = module_finished; in dns64_operate()
716 if(qstate->ext_state[id] == module_finished) { in dns64_operate()
717 iq = (struct dns64_qstate*)qstate->minfo[id]; in dns64_operate()
718 if(iq && iq->state != DNS64_INTERNAL_QUERY) in dns64_operate()
719 qstate->no_cache_store = iq->started_no_cache_store; in dns64_operate()
733 * Create synthesized AAAA RR set data. We need to allocated extra memory in dns64_synth_aaaa_data()
737 if(fd->count > RR_COUNT_MAX) { in dns64_synth_aaaa_data()
743 + fd->count * (sizeof(size_t) + sizeof(time_t) + in dns64_synth_aaaa_data()
749 /* Copy attributes from A RR set. */ in dns64_synth_aaaa_data()
750 dd->ttl = fd->ttl; in dns64_synth_aaaa_data()
751 dd->count = fd->count; in dns64_synth_aaaa_data()
752 dd->rrsig_count = 0; in dns64_synth_aaaa_data()
753 dd->trust = fd->trust; in dns64_synth_aaaa_data()
754 dd->security = fd->security; in dns64_synth_aaaa_data()
759 dd->rr_len = in dns64_synth_aaaa_data()
761 dd->rr_data = (uint8_t**)&dd->rr_len[dd->count]; in dns64_synth_aaaa_data()
762 dd->rr_ttl = (time_t*)&dd->rr_data[dd->count]; in dns64_synth_aaaa_data()
763 for(i = 0; i < fd->count; ++i) { in dns64_synth_aaaa_data()
764 if (fd->rr_len[i] != 6 || fd->rr_data[i][0] != 0 in dns64_synth_aaaa_data()
765 || fd->rr_data[i][1] != 4) { in dns64_synth_aaaa_data()
769 dd->rr_len[i] = 18; in dns64_synth_aaaa_data()
770 dd->rr_data[i] = in dns64_synth_aaaa_data()
771 (uint8_t*)&dd->rr_ttl[dd->count] + 18*i; in dns64_synth_aaaa_data()
772 dd->rr_data[i][0] = 0; in dns64_synth_aaaa_data()
773 dd->rr_data[i][1] = 16; in dns64_synth_aaaa_data()
775 ((struct sockaddr_in6*)&dns64_env->prefix_addr)->sin6_addr.s6_addr, in dns64_synth_aaaa_data()
776 sizeof(((struct sockaddr_in6*)&dns64_env->prefix_addr)->sin6_addr.s6_addr), in dns64_synth_aaaa_data()
777 dns64_env->prefix_net, &fd->rr_data[i][2], in dns64_synth_aaaa_data()
778 fd->rr_len[i]-2, &dd->rr_data[i][2], in dns64_synth_aaaa_data()
779 dd->rr_len[i]-2); in dns64_synth_aaaa_data()
780 dd->rr_ttl[i] = fd->rr_ttl[i]; in dns64_synth_aaaa_data()
784 * Create synthesized AAAA RR set key. This is mostly just bookkeeping, in dns64_synth_aaaa_data()
793 dk->rk.dname = (uint8_t*)regional_alloc_init(region, in dns64_synth_aaaa_data()
794 fk->rk.dname, fk->rk.dname_len); in dns64_synth_aaaa_data()
796 if(!dk->rk.dname) { in dns64_synth_aaaa_data()
802 dk->rk.type = htons(LDNS_RR_TYPE_AAAA); in dns64_synth_aaaa_data()
803 memset(&dk->entry, 0, sizeof(dk->entry)); in dns64_synth_aaaa_data()
804 dk->entry.key = dk; in dns64_synth_aaaa_data()
805 dk->entry.hash = rrset_key_hash(&dk->rk); in dns64_synth_aaaa_data()
806 dk->entry.data = dd; in dns64_synth_aaaa_data()
811 * Synthesize an AAAA RR set from an A sub-query's answer and add it to the
815 * \param super Original AAAA query.
819 dns64_adjust_a(int id, struct module_qstate* super, struct module_qstate* qstate) in dns64_adjust_a() argument
821 struct dns64_env* dns64_env = (struct dns64_env*)super->env->modinfo[id]; in dns64_adjust_a()
829 log_assert(super->region); in dns64_adjust_a()
830 log_assert(qstate->return_msg); in dns64_adjust_a()
831 log_assert(qstate->return_msg->rep); in dns64_adjust_a()
833 /* If dns64-synthall is enabled, return_msg is not initialized */ in dns64_adjust_a()
834 if(!super->return_msg) { in dns64_adjust_a()
835 super->return_msg = (struct dns_msg*)regional_alloc( in dns64_adjust_a()
836 super->region, sizeof(struct dns_msg)); in dns64_adjust_a()
837 if(!super->return_msg) in dns64_adjust_a()
839 memset(super->return_msg, 0, sizeof(*super->return_msg)); in dns64_adjust_a()
840 super->return_msg->qinfo = super->qinfo; in dns64_adjust_a()
843 rep = qstate->return_msg->rep; in dns64_adjust_a()
848 cp = construct_reply_info_base(super->region, rep->flags, rep->qdcount, in dns64_adjust_a()
849 rep->ttl, rep->prefetch_ttl, rep->serve_expired_ttl, in dns64_adjust_a()
850 rep->serve_expired_norec_ttl, in dns64_adjust_a()
851 rep->an_numrrsets, rep->ns_numrrsets, rep->ar_numrrsets, in dns64_adjust_a()
852 rep->rrset_count, rep->security, LDNS_EDE_NONE); in dns64_adjust_a()
857 if(!reply_info_alloc_rrset_keys(cp, NULL, super->region)) { in dns64_adjust_a()
862 for(i=0; i<cp->rrset_count; i++) { in dns64_adjust_a()
863 fk = rep->rrsets[i]; in dns64_adjust_a()
864 dk = cp->rrsets[i]; in dns64_adjust_a()
865 fd = (struct packed_rrset_data*)fk->entry.data; in dns64_adjust_a()
866 dk->rk = fk->rk; in dns64_adjust_a()
867 dk->id = fk->id; in dns64_adjust_a()
869 if(i<rep->an_numrrsets && fk->rk.type == htons(LDNS_RR_TYPE_A)) { in dns64_adjust_a()
870 /* also sets dk->entry.hash */ in dns64_adjust_a()
871 dns64_synth_aaaa_data(fk, fd, dk, &dd, super->region, dns64_env); in dns64_adjust_a()
876 rrset_cache_remove(super->env->rrset_cache, dk->rk.dname, in dns64_adjust_a()
877 dk->rk.dname_len, LDNS_RR_TYPE_AAAA, in dns64_adjust_a()
882 msg_cache_remove(super->env, dk->rk.dname, in dns64_adjust_a()
883 dk->rk.dname_len, LDNS_RR_TYPE_AAAA, in dns64_adjust_a()
886 dk->entry.hash = fk->entry.hash; in dns64_adjust_a()
887 dk->rk.dname = (uint8_t*)regional_alloc_init(super->region, in dns64_adjust_a()
888 fk->rk.dname, fk->rk.dname_len); in dns64_adjust_a()
890 if(!dk->rk.dname) in dns64_adjust_a()
895 super->region, fd, s); in dns64_adjust_a()
902 dk->entry.data = (void*)dd; in dns64_adjust_a()
906 super->return_msg->rep = cp; in dns64_adjust_a()
911 * sub-query's response.
913 * \param qstate IPv4 PTR sub-query.
914 * \param super Original IPv6 PTR query.
917 dns64_adjust_ptr(struct module_qstate* qstate, struct module_qstate* super) in dns64_adjust_ptr() argument
923 /* Copy the sub-query's reply to the parent. */ in dns64_adjust_ptr()
924 if (!(super->return_msg = (struct dns_msg*)regional_alloc(super->region, in dns64_adjust_ptr()
927 super->return_msg->qinfo = super->qinfo; in dns64_adjust_ptr()
928 if (!(super->return_msg->rep = reply_info_copy(qstate->return_msg->rep, in dns64_adjust_ptr()
929 NULL, super->region))) in dns64_adjust_ptr()
933 * Adjust the domain name of the answer RR set so that it matches the in dns64_adjust_ptr()
936 answer = reply_find_answer_rrset(&qstate->qinfo, super->return_msg->rep); in dns64_adjust_ptr()
938 answer->rk.dname = super->qinfo.qname; in dns64_adjust_ptr()
939 answer->rk.dname_len = super->qinfo.qname_len; in dns64_adjust_ptr()
944 * This function is called when a sub-query finishes to inform the parent query.
946 * We issue two kinds of sub-queries: PTR and A.
948 * \param qstate State of the sub-query.
950 * \param super State of the super-query.
954 struct module_qstate* super) in dns64_inform_super() argument
956 struct dns64_qstate* super_dq = (struct dns64_qstate*)super->minfo[id]; in dns64_inform_super()
958 &qstate->qinfo); in dns64_inform_super()
959 log_query_info(VERB_ALGO, "super is", &super->qinfo); in dns64_inform_super()
962 * Signal that the sub-query is finished, no matter whether we are in dns64_inform_super()
966 super_dq = (struct dns64_qstate*)regional_alloc(super->region, in dns64_inform_super()
970 super->return_rcode = LDNS_RCODE_SERVFAIL; in dns64_inform_super()
971 super->return_msg = NULL; in dns64_inform_super()
974 super->minfo[id] = super_dq; in dns64_inform_super()
976 super_dq->started_no_cache_store = super->no_cache_store; in dns64_inform_super()
978 super_dq->state = DNS64_SUBQUERY_FINISHED; in dns64_inform_super()
982 if(qstate->return_rcode != LDNS_RCODE_NOERROR in dns64_inform_super()
983 || !qstate->return_msg in dns64_inform_super()
984 || !qstate->return_msg->rep) { in dns64_inform_super()
989 if(qstate->qinfo.qtype == LDNS_RR_TYPE_A && in dns64_inform_super()
990 !reply_find_answer_rrset(&qstate->qinfo, in dns64_inform_super()
991 qstate->return_msg->rep)) { in dns64_inform_super()
992 super_dq->state = DNS64_INTERNAL_QUERY; in dns64_inform_super()
997 if (super->return_rcode != LDNS_RCODE_NOERROR) in dns64_inform_super()
998 super->return_rcode = qstate->return_rcode; in dns64_inform_super()
1001 if (qstate->qinfo.qtype == LDNS_RR_TYPE_A) { in dns64_inform_super()
1002 dns64_adjust_a(id, super, qstate); in dns64_inform_super()
1004 log_assert(qstate->qinfo.qtype == LDNS_RR_TYPE_PTR); in dns64_inform_super()
1005 dns64_adjust_ptr(qstate, super); in dns64_inform_super()
1009 if ( (!super_dq || !super_dq->started_no_cache_store) && in dns64_inform_super()
1010 !dns_cache_store(super->env, &super->qinfo, super->return_msg->rep, in dns64_inform_super()
1011 0, super->prefetch_leeway, 0, NULL, super->query_flags, qstate->qstarttime)) in dns64_inform_super()
1016 * Clear module-specific data from query state. Since we do not allocate memory,
1025 qstate->minfo[id] = NULL; in dns64_clear()
1030 * per-query data.
1038 struct dns64_env* dns64_env = (struct dns64_env*)env->modinfo[id]; in dns64_get_mem()