Lines Matching +full:pd +full:- +full:node

2  * services/localzone.c - local zones authority service.
65 RBTREE_FOR(d, struct local_data*, &z->data) { in local_zone_out()
66 for(p = d->rrsets; p; p = p->next) { in local_zone_out()
67 log_nametypeclass(NO_VERBOSE, "rrset", d->name, in local_zone_out()
68 ntohs(p->rrset->rk.type), in local_zone_out()
69 ntohs(p->rrset->rk.rrset_class)); in local_zone_out()
78 lock_rw_rdlock(&z->lock); in local_zone_print()
80 local_zone_type2str(z->type)); in local_zone_print()
81 log_nametypeclass(NO_VERBOSE, buf, z->name, 0, z->dclass); in local_zone_print()
83 lock_rw_unlock(&z->lock); in local_zone_print()
89 lock_rw_rdlock(&zones->lock); in local_zones_print()
90 log_info("number of auth zones %u", (unsigned)zones->ztree.count); in local_zones_print()
91 RBTREE_FOR(z, struct local_zone*, &zones->ztree) { in local_zones_print()
94 lock_rw_unlock(&zones->lock); in local_zones_print()
104 rbtree_init(&zones->ztree, &local_zone_cmp); in local_zones_create()
105 lock_rw_init(&zones->lock); in local_zones_create()
106 lock_protect(&zones->lock, &zones->ztree, sizeof(zones->ztree)); in local_zones_create()
115 struct local_zone* z = (struct local_zone*)n->key; in lzdel()
124 lock_rw_destroy(&zones->lock); in local_zones_delete()
126 traverse_postorder(&zones->ztree, lzdel, NULL); in local_zones_delete()
135 lock_rw_destroy(&z->lock); in local_zone_delete()
136 regional_destroy(z->region); in local_zone_delete()
137 free(z->name); in local_zone_delete()
138 free(z->taglist); in local_zone_delete()
150 if(a->dclass != b->dclass) { in local_zone_cmp()
151 if(a->dclass < b->dclass) in local_zone_cmp()
152 return -1; in local_zone_cmp()
155 return dname_lab_cmp(a->name, a->namelabs, b->name, b->namelabs, &m); in local_zone_cmp()
164 return dname_canon_lab_cmp(a->name, a->namelabs, b->name, in local_data_cmp()
165 b->namelabs, &m); in local_data_cmp()
191 z->node.key = z; in local_zone_create()
192 z->dclass = dclass; in local_zone_create()
193 z->type = t; in local_zone_create()
194 z->name = nm; in local_zone_create()
195 z->namelen = len; in local_zone_create()
196 z->namelabs = labs; in local_zone_create()
197 lock_rw_init(&z->lock); in local_zone_create()
198 z->region = regional_create_nochunk(sizeof(struct regional)); in local_zone_create()
199 if(!z->region) { in local_zone_create()
203 rbtree_init(&z->data, &local_data_cmp); in local_zone_create()
204 lock_protect(&z->lock, &z->parent, sizeof(*z)-sizeof(rbnode_type)); in local_zone_create()
205 /* also the zones->lock protects node, parent, name*, class */ in local_zone_create()
222 lock_rw_wrlock(&zones->lock); in lz_enter_zone_dname()
223 lock_rw_wrlock(&z->lock); in lz_enter_zone_dname()
224 if(!rbtree_insert(&zones->ztree, &z->node)) { in lz_enter_zone_dname()
228 log_warn("duplicate local-zone %s", str); in lz_enter_zone_dname()
229 lock_rw_unlock(&z->lock); in lz_enter_zone_dname()
235 lock_rw_wrlock(&z->lock); in lz_enter_zone_dname()
236 lock_rw_unlock(&zones->lock); in lz_enter_zone_dname()
240 lock_rw_unlock(&zones->lock); in lz_enter_zone_dname()
279 log_err("error parsing local-data at %d: '%s': %s", in rrstr_get_rr_content()
307 log_err("error parsing local-data at %d '%s': %s", in get_rr_nameclass()
326 * @param alias_ok: 1 if matching a non-exact, alias type such as CNAME is
335 for(p = data->rrsets; p; p = p->next) { in local_data_find_type()
336 if(p->rrset->rk.type == type) in local_data_find_type()
338 if(alias_ok && p->rrset->rk.type == htons(LDNS_RR_TYPE_CNAME)) in local_data_find_type()
348 rr_is_duplicate(struct packed_rrset_data* pd, uint8_t* rdata, size_t rdata_len) in rr_is_duplicate() argument
351 for(i=0; i<pd->count; i++) { in rr_is_duplicate()
352 if(pd->rr_len[i] == rdata_len && in rr_is_duplicate()
353 memcmp(pd->rr_data[i], rdata, rdata_len) == 0) in rr_is_duplicate()
361 new_local_rrset(struct regional* region, struct local_data* node, in new_local_rrset() argument
364 struct packed_rrset_data* pd; in new_local_rrset() local
371 rrset->next = node->rrsets; in new_local_rrset()
372 node->rrsets = rrset; in new_local_rrset()
373 rrset->rrset = (struct ub_packed_rrset_key*) in new_local_rrset()
374 regional_alloc_zero(region, sizeof(*rrset->rrset)); in new_local_rrset()
375 if(!rrset->rrset) { in new_local_rrset()
379 rrset->rrset->entry.key = rrset->rrset; in new_local_rrset()
380 pd = (struct packed_rrset_data*)regional_alloc_zero(region, in new_local_rrset()
381 sizeof(*pd)); in new_local_rrset()
382 if(!pd) { in new_local_rrset()
386 pd->trust = rrset_trust_prim_noglue; in new_local_rrset()
387 pd->security = sec_status_insecure; in new_local_rrset()
388 rrset->rrset->entry.data = pd; in new_local_rrset()
389 rrset->rrset->rk.dname = node->name; in new_local_rrset()
390 rrset->rrset->rk.dname_len = node->namelen; in new_local_rrset()
391 rrset->rrset->rk.type = htons(rrtype); in new_local_rrset()
392 rrset->rrset->rk.rrset_class = htons(rrclass); in new_local_rrset()
398 rrset_insert_rr(struct regional* region, struct packed_rrset_data* pd, in rrset_insert_rr() argument
401 size_t* oldlen = pd->rr_len; in rrset_insert_rr()
402 time_t* oldttl = pd->rr_ttl; in rrset_insert_rr()
403 uint8_t** olddata = pd->rr_data; in rrset_insert_rr()
406 if(pd->count > LOCALZONE_RRSET_COUNT_MAX) { in rrset_insert_rr()
411 pd->count++; in rrset_insert_rr()
412 pd->rr_len = regional_alloc(region, sizeof(*pd->rr_len)*pd->count); in rrset_insert_rr()
413 pd->rr_ttl = regional_alloc(region, sizeof(*pd->rr_ttl)*pd->count); in rrset_insert_rr()
414 pd->rr_data = regional_alloc(region, sizeof(*pd->rr_data)*pd->count); in rrset_insert_rr()
415 if(!pd->rr_len || !pd->rr_ttl || !pd->rr_data) { in rrset_insert_rr()
419 if(pd->count > 1) { in rrset_insert_rr()
420 memcpy(pd->rr_len+1, oldlen, in rrset_insert_rr()
421 sizeof(*pd->rr_len)*(pd->count-1)); in rrset_insert_rr()
422 memcpy(pd->rr_ttl+1, oldttl, in rrset_insert_rr()
423 sizeof(*pd->rr_ttl)*(pd->count-1)); in rrset_insert_rr()
424 memcpy(pd->rr_data+1, olddata, in rrset_insert_rr()
425 sizeof(*pd->rr_data)*(pd->count-1)); in rrset_insert_rr()
427 pd->rr_len[0] = rdata_len; in rrset_insert_rr()
428 pd->rr_ttl[0] = ttl; in rrset_insert_rr()
429 pd->rr_data[0] = regional_alloc_init(region, rdata, rdata_len); in rrset_insert_rr()
430 if(!pd->rr_data[0]) { in rrset_insert_rr()
437 /** Delete RR from local-zone RRset, wastes memory as the deleted RRs cannot be
440 local_rrset_remove_rr(struct packed_rrset_data* pd, size_t index) in local_rrset_remove_rr() argument
442 log_assert(pd->count > 0); in local_rrset_remove_rr()
443 if(index >= pd->count) { in local_rrset_remove_rr()
447 if(index + 1 < pd->count) { in local_rrset_remove_rr()
450 size_t num = pd->count - nexti; in local_rrset_remove_rr()
451 memmove(pd->rr_len+index, pd->rr_len+nexti, sizeof(*pd->rr_len)*num); in local_rrset_remove_rr()
452 memmove(pd->rr_ttl+index, pd->rr_ttl+nexti, sizeof(*pd->rr_ttl)*num); in local_rrset_remove_rr()
453 memmove(pd->rr_data+index, pd->rr_data+nexti, sizeof(*pd->rr_data)*num); in local_rrset_remove_rr()
455 pd->count--; in local_rrset_remove_rr()
463 key.node.key = &key; in local_zone_find_data()
467 return (struct local_data*)rbtree_search(&z->data, &key.node); in local_zone_find_data()
470 /** find a node, create it if not and all its empty nonterminal parents */
478 ld = (struct local_data*)regional_alloc_zero(z->region, in lz_find_create_node()
484 ld->node.key = ld; in lz_find_create_node()
485 ld->name = regional_alloc_init(z->region, nm, nmlen); in lz_find_create_node()
486 if(!ld->name) { in lz_find_create_node()
490 ld->namelen = nmlen; in lz_find_create_node()
491 ld->namelabs = nmlabs; in lz_find_create_node()
492 if(!rbtree_insert(&z->data, &ld->node)) { in lz_find_create_node()
496 if(nmlabs > z->namelabs) { in lz_find_create_node()
498 if(!lz_find_create_node(z, nm, nmlen, nmlabs-1, res)) in lz_find_create_node()
515 struct packed_rrset_data* pd = (struct packed_rrset_data*) in lz_mark_soa_for_zone() local
516 regional_alloc_zero(z->region, sizeof(*pd)); in lz_mark_soa_for_zone()
518 regional_alloc_zero(z->region, sizeof(*rrset_negative)); in lz_mark_soa_for_zone()
520 if(!rrset_negative||!pd) { in lz_mark_soa_for_zone()
525 z->soa = soa_rrset; in lz_mark_soa_for_zone()
526 rrset_negative->entry.key = rrset_negative; in lz_mark_soa_for_zone()
527 pd->trust = rrset_trust_prim_noglue; in lz_mark_soa_for_zone()
528 pd->security = sec_status_insecure; in lz_mark_soa_for_zone()
529 rrset_negative->entry.data = pd; in lz_mark_soa_for_zone()
530 rrset_negative->rk.dname = soa_rrset->rk.dname; in lz_mark_soa_for_zone()
531 rrset_negative->rk.dname_len = soa_rrset->rk.dname_len; in lz_mark_soa_for_zone()
532 rrset_negative->rk.type = soa_rrset->rk.type; in lz_mark_soa_for_zone()
533 rrset_negative->rk.rrset_class = soa_rrset->rk.rrset_class; in lz_mark_soa_for_zone()
534 if(!rrset_insert_rr(z->region, pd, rdata, rdata_len, ttl, rrstr)) in lz_mark_soa_for_zone()
537 if(pd->count == 0 || pd->rr_len[0] < 2+4) in lz_mark_soa_for_zone()
539 minimum = (time_t)sldns_read_uint32(pd->rr_data[0]+(pd->rr_len[0]-4)); in lz_mark_soa_for_zone()
541 pd->ttl = minimum; in lz_mark_soa_for_zone()
542 pd->rr_ttl[0] = minimum; in lz_mark_soa_for_zone()
544 z->soa_negative = rrset_negative; in lz_mark_soa_for_zone()
553 struct local_data* node; in local_zone_enter_rr() local
555 struct packed_rrset_data* pd; in local_zone_enter_rr() local
557 if(!lz_find_create_node(z, nm, nmlen, nmlabs, &node)) { in local_zone_enter_rr()
560 log_assert(node); in local_zone_enter_rr()
564 if((z->type == local_zone_redirect || in local_zone_enter_rr()
565 z->type == local_zone_inform_redirect) && node->rrsets) { in local_zone_enter_rr()
569 else if (node->rrsets->rrset->rk.type == in local_zone_enter_rr()
574 log_err("local-data '%s' in redirect zone must not " in local_zone_enter_rr()
575 "coexist with %s local-data", rrstr, othertype); in local_zone_enter_rr()
579 rrset = local_data_find_type(node, rrtype, 0); in local_zone_enter_rr()
581 rrset = new_local_rrset(z->region, node, rrtype, rrclass); in local_zone_enter_rr()
584 if(query_dname_compare(node->name, z->name) == 0) { in local_zone_enter_rr()
586 rrset->rrset->rk.flags = PACKED_RRSET_NSEC_AT_APEX; in local_zone_enter_rr()
588 !lz_mark_soa_for_zone(z, rrset->rrset, rdata, rdata_len, ttl, in local_zone_enter_rr()
593 pd = (struct packed_rrset_data*)rrset->rrset->entry.data; in local_zone_enter_rr()
594 log_assert(rrset && pd); in local_zone_enter_rr()
597 if(rr_is_duplicate(pd, rdata, rdata_len)) { in local_zone_enter_rr()
601 return rrset_insert_rr(z->region, pd, rdata, rdata_len, ttl, rrstr); in local_zone_enter_rr()
618 log_err("bad local-data: %s", rrstr); in lz_enter_rr_into_zone()
621 log_assert(z->dclass == rrclass); in lz_enter_rr_into_zone()
622 if((z->type == local_zone_redirect || in lz_enter_rr_into_zone()
623 z->type == local_zone_inform_redirect) && in lz_enter_rr_into_zone()
624 query_dname_compare(z->name, nm) != 0) { in lz_enter_rr_into_zone()
625 log_err("local-data in redirect zone must reside at top of zone" in lz_enter_rr_into_zone()
652 lock_rw_rdlock(&zones->lock); in lz_enter_rr_str()
655 lock_rw_unlock(&zones->lock); in lz_enter_rr_str()
658 lock_rw_wrlock(&z->lock); in lz_enter_rr_str()
659 lock_rw_unlock(&zones->lock); in lz_enter_rr_str()
662 lock_rw_unlock(&z->lock); in lz_enter_rr_str()
677 log_err("cannot parse zone name in local-zone-tag: %s", zname); in lz_enter_zone_tag()
682 lock_rw_rdlock(&zones->lock); in lz_enter_zone_tag()
685 lock_rw_unlock(&zones->lock); in lz_enter_zone_tag()
686 log_err("no local-zone for tag %s", zname); in lz_enter_zone_tag()
689 lock_rw_wrlock(&z->lock); in lz_enter_zone_tag()
690 lock_rw_unlock(&zones->lock); in lz_enter_zone_tag()
691 free(z->taglist); in lz_enter_zone_tag()
692 z->taglist = memdup(list, len); in lz_enter_zone_tag()
693 z->taglen = len; in lz_enter_zone_tag()
694 if(z->taglist) in lz_enter_zone_tag()
696 lock_rw_unlock(&z->lock); in lz_enter_zone_tag()
716 log_err("cannot parse zone name in local-zone-override: %s %s", in lz_enter_override()
725 log_err("cannot parse netblock in local-zone-override: %s %s", in lz_enter_override()
732 log_err("cannot parse type in local-zone-override: %s %s %s", in lz_enter_override()
738 lock_rw_rdlock(&zones->lock); in lz_enter_override()
741 lock_rw_unlock(&zones->lock); in lz_enter_override()
742 log_err("no local-zone for local-zone-override %s", zname); in lz_enter_override()
745 lock_rw_wrlock(&z->lock); in lz_enter_override()
746 lock_rw_unlock(&zones->lock); in lz_enter_override()
749 if(!z->override_tree) { in lz_enter_override()
750 z->override_tree = (struct rbtree_type*)regional_alloc_zero( in lz_enter_override()
751 z->region, sizeof(*z->override_tree)); in lz_enter_override()
752 if(!z->override_tree) { in lz_enter_override()
753 lock_rw_unlock(&z->lock); in lz_enter_override()
757 addr_tree_init(z->override_tree); in lz_enter_override()
760 if(z->override_tree) { in lz_enter_override()
763 z->region, sizeof(*n)); in lz_enter_override()
765 lock_rw_unlock(&z->lock); in lz_enter_override()
769 n->type = t; in lz_enter_override()
770 if(!addr_tree_insert(z->override_tree, in lz_enter_override()
772 lock_rw_unlock(&z->lock); in lz_enter_override()
773 log_err("duplicate local-zone-override %s %s", in lz_enter_override()
779 lock_rw_unlock(&z->lock); in lz_enter_override()
783 /** parse local-zone: statements */
791 for(p = cfg->local_zones; p; p = p->next) { in lz_enter_zones()
796 lz_enter_zone(zones, p->str, p->str2, in lz_enter_zones()
799 lock_rw_unlock(&z->lock); in lz_enter_zones()
809 z.node.key = &z; in lz_exists()
815 lock_rw_rdlock(&zones->lock); in lz_exists()
816 if(rbtree_search(&zones->ztree, &z.node)) { in lz_exists()
817 lock_rw_unlock(&zones->lock); in lz_exists()
821 lock_rw_unlock(&zones->lock); in lz_exists()
826 /** lookup a zone in cfg->nodefault list */
833 if(name[len-1] == '.') len--; in lz_nodefault()
835 for(p = cfg->local_zones_nodefault; p; p = p->next) { in lz_nodefault()
837 if(strncasecmp(p->str, name, len) == 0 && in lz_nodefault()
838 (strlen(p->str) == len || (strlen(p->str)==len+1 && in lz_nodefault()
839 p->str[len] == '.'))) in lz_nodefault()
859 lock_rw_unlock(&z->lock); in add_empty_default()
864 lock_rw_unlock(&z->lock); in add_empty_default()
867 lock_rw_unlock(&z->lock); in add_empty_default()
878 if(cfg->local_zones_disable_default) in local_zone_enter_defaults()
900 if(z) { lock_rw_unlock(&z->lock); } in local_zone_enter_defaults()
903 lock_rw_unlock(&z->lock); in local_zone_enter_defaults()
906 if(!lz_exists(zones, "127.in-addr.arpa.") && in local_zone_enter_defaults()
907 !lz_nodefault(cfg, "127.in-addr.arpa.")) { in local_zone_enter_defaults()
908 if(!(z=lz_enter_zone(zones, "127.in-addr.arpa.", "static", in local_zone_enter_defaults()
911 "127.in-addr.arpa. 10800 IN NS localhost.") || in local_zone_enter_defaults()
913 "127.in-addr.arpa. 10800 IN SOA localhost. " in local_zone_enter_defaults()
916 "1.0.0.127.in-addr.arpa. 10800 IN PTR localhost.")) { in local_zone_enter_defaults()
918 if(z) { lock_rw_unlock(&z->lock); } in local_zone_enter_defaults()
921 lock_rw_unlock(&z->lock); in local_zone_enter_defaults()
936 if(z) { lock_rw_unlock(&z->lock); } in local_zone_enter_defaults()
939 lock_rw_unlock(&z->lock); in local_zone_enter_defaults()
962 if(!cfg->unblock_lan_zones) { in local_zone_enter_defaults()
973 /** parse local-zone-override: statements */
978 for(p = cfg->local_zone_overrides; p; p = p->next) { in lz_enter_overrides()
979 if(!lz_enter_override(zones, p->str, p->str2, p->str3, in lz_enter_overrides()
992 if(!prev || prev->dclass != curr->dclass) return NULL; in find_closest_parent()
993 (void)dname_lab_cmp(prev->name, prev->namelabs, curr->name, in find_closest_parent()
994 curr->namelabs, &m); /* we know prev is smaller */ in find_closest_parent()
996 /* find the previous, or parent-parent-parent */ in find_closest_parent()
997 for(p = prev; p; p = p->parent) { in find_closest_parent()
999 if(p->namelabs <= m) { in find_closest_parent()
1013 struct local_zone* node, *prev = NULL; in lz_init_parents() local
1014 lock_rw_wrlock(&zones->lock); in lz_init_parents()
1015 RBTREE_FOR(node, struct local_zone*, &zones->ztree) { in lz_init_parents()
1016 lock_rw_wrlock(&node->lock); in lz_init_parents()
1017 node->parent = find_closest_parent(node, prev); in lz_init_parents()
1018 prev = node; in lz_init_parents()
1019 if(node->override_tree) in lz_init_parents()
1020 addr_tree_init_parents(node->override_tree); in lz_init_parents()
1021 lock_rw_unlock(&node->lock); in lz_init_parents()
1023 lock_rw_unlock(&zones->lock); in lz_init_parents()
1026 /** enter implicit transparent zone for local-data: without local-zone: */
1043 for(p = cfg->local_data; p; p = p->next) { in lz_setup_implicit()
1048 if(!get_rr_nameclass(p->str, &rr_name, &rr_class, &rr_type)) { in lz_setup_implicit()
1049 log_err("Bad local-data RR %s", p->str); in lz_setup_implicit()
1053 lock_rw_rdlock(&zones->lock); in lz_setup_implicit()
1064 uint8_t* name = memdup(z->name, z->namelen); in lz_setup_implicit()
1065 size_t znamelen = z->namelen; in lz_setup_implicit()
1066 int znamelabs = z->namelabs; in lz_setup_implicit()
1067 enum localzone_type ztype = z->type; in lz_setup_implicit()
1068 lock_rw_unlock(&zones->lock); in lz_setup_implicit()
1084 lock_rw_unlock(&z->lock); in lz_setup_implicit()
1101 lock_rw_unlock(&zones->lock); in lz_setup_implicit()
1112 lock_rw_unlock(&zones->lock); in lz_setup_implicit()
1121 dname_remove_labels(&n2, &nmlen, nmlabs - match); in lz_setup_implicit()
1128 log_nametypeclass(VERB_ALGO, "implicit transparent local-zone", in lz_setup_implicit()
1138 lock_rw_unlock(&z->lock); in lz_setup_implicit()
1147 /** enter local-zone-tag info */
1153 for(p = cfg->local_zone_tags; p; p = p->next) { in lz_enter_zone_tags()
1154 if(!lz_enter_zone_tag(zones, p->str, p->str2, p->str2len, in lz_enter_zone_tags()
1168 for(p = cfg->local_data; p; p = p->next) { in lz_enter_data()
1169 if(!lz_enter_rr_str(zones, p->str)) in lz_enter_data()
1179 config_deldblstrlist(cfg->local_zones); in lz_freeup_cfg()
1180 cfg->local_zones = NULL; in lz_freeup_cfg()
1181 config_delstrlist(cfg->local_zones_nodefault); in lz_freeup_cfg()
1182 cfg->local_zones_nodefault = NULL; in lz_freeup_cfg()
1183 config_delstrlist(cfg->local_data); in lz_freeup_cfg()
1184 cfg->local_data = NULL; in lz_freeup_cfg()
1242 labs--; in local_zones_tags_lookup()
1244 key.node.key = &key; in local_zones_tags_lookup()
1249 rbtree_find_less_equal(&zones->ztree, &key, &res); in local_zones_tags_lookup()
1252 if(!result || result->dclass != dclass) in local_zones_tags_lookup()
1255 (void)dname_lab_cmp(result->name, result->namelabs, key.name, in local_zones_tags_lookup()
1258 if(result->namelabs <= m) in local_zones_tags_lookup()
1259 if(ignoretags || !result->taglist || in local_zones_tags_lookup()
1260 taglist_intersect(result->taglist, in local_zones_tags_lookup()
1261 result->taglen, taglist, taglen)) in local_zones_tags_lookup()
1263 result = result->parent; in local_zones_tags_lookup()
1273 key.node.key = &key; in local_zones_find()
1279 return (struct local_zone*)rbtree_search(&zones->ztree, &key); in local_zones_find()
1288 rbnode_type *node; in local_zones_find_le() local
1289 key.node.key = &key; in local_zones_find_le()
1294 *exact = rbtree_find_less_equal(&zones->ztree, &key, &node); in local_zones_find_le()
1295 return (struct local_zone*)node; in local_zones_find_le()
1317 udpsize = edns->udp_size; in local_encode()
1318 edns->edns_version = EDNS_ADVERTISED_VERSION; in local_encode()
1319 edns->udp_size = EDNS_ADVERTISED_SIZE; in local_encode()
1320 edns->ext_rcode = 0; in local_encode()
1321 edns->bits &= EDNS_DO; in local_encode()
1323 repinfo, temp, env->now_tv) || !reply_info_answer_encode(qinfo, &rep, in local_encode()
1325 buf, 0, 0, temp, udpsize, edns, (int)(edns->bits&EDNS_DO), 0)) { in local_encode()
1340 edns->edns_version = EDNS_ADVERTISED_VERSION; in local_error_encode()
1341 edns->udp_size = EDNS_ADVERTISED_SIZE; in local_error_encode()
1342 edns->ext_rcode = 0; in local_error_encode()
1343 edns->bits &= EDNS_DO; in local_error_encode()
1346 rcode, edns, repinfo, temp, env->now_tv)) in local_error_encode()
1347 edns->opt_list_inplace_cb_out = NULL; in local_error_encode()
1349 if(ede_code != LDNS_EDE_NONE && env->cfg->ede) { in local_error_encode()
1350 edns_opt_list_append_ede(&edns->opt_list_out, temp, in local_error_encode()
1370 for(p=list; p; p=p->next) { in local_data_find_tag_datas()
1375 snprintf(buf, sizeof(buf), ". %s", p->str); in local_data_find_tag_datas()
1385 if(rdr_type != qinfo->qtype && rdr_type != LDNS_RR_TYPE_CNAME) in local_data_find_tag_datas()
1389 if(r->rk.dname == NULL) { in local_data_find_tag_datas()
1390 r->entry.key = r; in local_data_find_tag_datas()
1391 r->rk.dname = qinfo->qname; in local_data_find_tag_datas()
1392 r->rk.dname_len = qinfo->qname_len; in local_data_find_tag_datas()
1393 r->rk.type = htons(rdr_type); in local_data_find_tag_datas()
1394 r->rk.rrset_class = htons(qinfo->qclass); in local_data_find_tag_datas()
1395 r->rk.flags = 0; in local_data_find_tag_datas()
1401 r->entry.data = d; in local_data_find_tag_datas()
1402 d->ttl = sldns_wirerr_get_ttl(rr, len, 1); in local_data_find_tag_datas()
1403 d->rr_len = (size_t*)((uint8_t*)d + in local_data_find_tag_datas()
1405 d->rr_data = (uint8_t**)&(d->rr_len[1]); in local_data_find_tag_datas()
1406 d->rr_ttl = (time_t*)&(d->rr_data[1]); in local_data_find_tag_datas()
1408 d = (struct packed_rrset_data*)r->entry.data; in local_data_find_tag_datas()
1410 if(d->count != 0) { in local_data_find_tag_datas()
1411 size_t* oldlen = d->rr_len; in local_data_find_tag_datas()
1412 uint8_t** olddata = d->rr_data; in local_data_find_tag_datas()
1413 time_t* oldttl = d->rr_ttl; in local_data_find_tag_datas()
1417 d->rr_len = (size_t*)regional_alloc_zero(temp, in local_data_find_tag_datas()
1418 (d->count+1)*sizeof(size_t)); in local_data_find_tag_datas()
1419 d->rr_data = (uint8_t**)regional_alloc_zero(temp, in local_data_find_tag_datas()
1420 (d->count+1)*sizeof(uint8_t*)); in local_data_find_tag_datas()
1421 d->rr_ttl = (time_t*)regional_alloc_zero(temp, in local_data_find_tag_datas()
1422 (d->count+1)*sizeof(time_t)); in local_data_find_tag_datas()
1423 if(!d->rr_len || !d->rr_data || !d->rr_ttl) in local_data_find_tag_datas()
1428 memmove(d->rr_len, oldlen, d->count*sizeof(size_t)); in local_data_find_tag_datas()
1429 memmove(d->rr_data, olddata, d->count*sizeof(uint8_t*)); in local_data_find_tag_datas()
1430 memmove(d->rr_ttl, oldttl, d->count*sizeof(time_t)); in local_data_find_tag_datas()
1433 d->rr_len[d->count] = sldns_wirerr_get_rdatalen(rr, len, 1)+2; in local_data_find_tag_datas()
1434 d->rr_ttl[d->count] = sldns_wirerr_get_ttl(rr, len, 1); in local_data_find_tag_datas()
1435 d->rr_data[d->count] = regional_alloc_init(temp, in local_data_find_tag_datas()
1437 d->rr_len[d->count]); in local_data_find_tag_datas()
1438 if(!d->rr_data[d->count]) in local_data_find_tag_datas()
1440 d->count++; in local_data_find_tag_datas()
1442 if(r->rk.dname) in local_data_find_tag_datas()
1453 /* If we've found a non-exact alias type of local data, make a shallow in find_tag_datas()
1456 if(result && qinfo->qtype != LDNS_RR_TYPE_CNAME && in find_tag_datas()
1457 r->rk.type == htons(LDNS_RR_TYPE_CNAME)) { in find_tag_datas()
1458 qinfo->local_alias = in find_tag_datas()
1460 if(!qinfo->local_alias) in find_tag_datas()
1462 qinfo->local_alias->rrset = in find_tag_datas()
1464 if(!qinfo->local_alias->rrset) in find_tag_datas()
1481 key.node.key = &key; in local_data_answer()
1482 key.name = qinfo->qname; in local_data_answer()
1483 key.namelen = qinfo->qname_len; in local_data_answer()
1487 key.name = z->name; in local_data_answer()
1488 key.namelen = z->namelen; in local_data_answer()
1489 key.namelabs = z->namelabs; in local_data_answer()
1490 if(tag != -1 && (size_t)tag<tag_datas_size && tag_datas[tag]) { in local_data_answer()
1501 if(qinfo->local_alias) in local_data_answer()
1508 ld = (struct local_data*)rbtree_search(&z->data, &key.node); in local_data_answer()
1513 lr = local_data_find_type(ld, qinfo->qtype, 1); in local_data_answer()
1520 qinfo->qtype != LDNS_RR_TYPE_CNAME && in local_data_answer()
1521 lr->rrset->rk.type == htons(LDNS_RR_TYPE_CNAME)) { in local_data_answer()
1525 qinfo->local_alias = in local_data_answer()
1527 if(!qinfo->local_alias) in local_data_answer()
1529 qinfo->local_alias->rrset = regional_alloc_init( in local_data_answer()
1530 temp, lr->rrset, sizeof(*lr->rrset)); in local_data_answer()
1531 if(!qinfo->local_alias->rrset) in local_data_answer()
1533 qinfo->local_alias->rrset->rk.dname = qinfo->qname; in local_data_answer()
1534 qinfo->local_alias->rrset->rk.dname_len = qinfo->qname_len; in local_data_answer()
1535 get_cname_target(lr->rrset, &ctarget, &ctargetlen); in local_data_answer()
1541 /* -3 for wildcard label and root label from qname */ in local_data_answer()
1542 size_t newtargetlen = qinfo->qname_len + ctargetlen - 3; in local_data_answer()
1545 log_assert(qinfo->qname_len >= 1); in local_data_answer()
1548 qinfo->local_alias = NULL; in local_data_answer()
1556 memset(&qinfo->local_alias->rrset->entry, 0, in local_data_answer()
1557 sizeof(qinfo->local_alias->rrset->entry)); in local_data_answer()
1558 qinfo->local_alias->rrset->entry.key = in local_data_answer()
1559 qinfo->local_alias->rrset; in local_data_answer()
1560 qinfo->local_alias->rrset->entry.hash = in local_data_answer()
1561 rrset_key_hash(&qinfo->local_alias->rrset->rk); in local_data_answer()
1568 lr_d = (struct packed_rrset_data*)lr->rrset->entry.data; in local_data_answer()
1569 qinfo->local_alias->rrset->entry.data = d; in local_data_answer()
1570 d->ttl = lr_d->rr_ttl[0]; /* RFC6672-like behavior: in local_data_answer()
1572 d->count = 1; in local_data_answer()
1573 d->rrsig_count = 0; in local_data_answer()
1574 d->trust = rrset_trust_ans_noAA; in local_data_answer()
1575 d->rr_len = (size_t*)((uint8_t*)d + in local_data_answer()
1577 d->rr_len[0] = newtargetlen + sizeof(uint16_t); in local_data_answer()
1579 d->rr_ttl[0] = d->ttl; in local_data_answer()
1580 sldns_write_uint16(d->rr_data[0], newtargetlen); in local_data_answer()
1582 memmove(d->rr_data[0] + sizeof(uint16_t), qinfo->qname, in local_data_answer()
1583 qinfo->qname_len - 1); in local_data_answer()
1585 memmove(d->rr_data[0] + sizeof(uint16_t) + in local_data_answer()
1586 qinfo->qname_len - 1, ctarget + 2, in local_data_answer()
1587 ctargetlen - 2); in local_data_answer()
1594 struct ub_packed_rrset_key r = *lr->rrset; in local_data_answer()
1595 r.rk.dname = qinfo->qname; in local_data_answer()
1596 r.rk.dname_len = qinfo->qname_len; in local_data_answer()
1600 return local_encode(qinfo, env, edns, repinfo, buf, temp, lr->rrset, 1, in local_data_answer()
1614 if(z->type == local_zone_always_transparent || z->type == local_zone_block_a) in local_zone_does_not_cover()
1616 if(z->type != local_zone_transparent in local_zone_does_not_cover()
1617 && z->type != local_zone_typetransparent in local_zone_does_not_cover()
1618 && z->type != local_zone_inform) in local_zone_does_not_cover()
1620 key.node.key = &key; in local_zone_does_not_cover()
1621 key.name = qinfo->qname; in local_zone_does_not_cover()
1622 key.namelen = qinfo->qname_len; in local_zone_does_not_cover()
1624 ld = (struct local_data*)rbtree_search(&z->data, &key.node); in local_zone_does_not_cover()
1625 if(z->type == local_zone_transparent || z->type == local_zone_inform) in local_zone_does_not_cover()
1628 lr = local_data_find_type(ld, qinfo->qtype, 1); in local_zone_does_not_cover()
1636 ? (repinfo->c != NULL in local_zone_is_udp_query()
1637 ? repinfo->c->type == comm_udp in local_zone_is_udp_query()
1681 if(z != NULL && z->soa && z->soa_negative) in local_zones_zone_answer()
1683 z->soa_negative, 0, rcode); in local_zones_zone_answer()
1693 if(qinfo->qtype == LDNS_RR_TYPE_A) { in local_zones_zone_answer()
1704 if(qinfo->qtype == LDNS_RR_TYPE_A || in local_zones_zone_answer()
1705 qinfo->qtype == LDNS_RR_TYPE_AAAA) { in local_zones_zone_answer()
1715 lrr.rk.dname = qinfo->qname; in local_zones_zone_answer()
1716 lrr.rk.dname_len = qinfo->qname_len; in local_zones_zone_answer()
1717 lrr.rk.type = htons(qinfo->qtype); in local_zones_zone_answer()
1718 lrr.rk.rrset_class = htons(qinfo->qclass); in local_zones_zone_answer()
1719 if(qinfo->qtype == LDNS_RR_TYPE_A) { in local_zones_zone_answer()
1739 (LDNS_RCODE_NOERROR|BIT_AA), -1, NULL); in local_zones_zone_answer()
1747 if(ld && ld->rrsets) { in local_zones_zone_answer()
1749 if(z != NULL && z->soa && z->soa_negative) in local_zones_zone_answer()
1751 z->soa_negative, 0, rcode); in local_zones_zone_answer()
1769 uint16_t port = ntohs(((struct sockaddr_in*)addr)->sin_port); in lz_inform_print()
1770 dname_str(z->name, zname); in lz_inform_print()
1772 snprintf(txt, sizeof(txt), "%s %s %s@%u", zname, local_zone_type2str(z->type), ip, in lz_inform_print()
1774 log_nametypeclass(NO_VERBOSE, txt, qinfo->qname, qinfo->qtype, qinfo->qclass); in lz_inform_print()
1786 override_tree, &repinfo->client_addr, in lz_type()
1787 repinfo->client_addrlen); in lz_type()
1788 if(lzo && lzo->type) { in lz_type()
1790 local_zone_type2str(lzo->type)); in lz_type()
1791 return lzo->type; in lz_type()
1843 * if so: - try to match (exact) local data in local_zones_answer()
1844 * - look at zone type for negative response. */ in local_zones_answer()
1845 int labs = dname_count_labels(qinfo->qname); in local_zones_answer()
1849 int r, tag = -1; in local_zones_answer()
1852 lock_rw_rdlock(&view->lock); in local_zones_answer()
1853 if(view->local_zones && in local_zones_answer()
1854 (z = local_zones_lookup(view->local_zones, in local_zones_answer()
1855 qinfo->qname, qinfo->qname_len, labs, in local_zones_answer()
1856 qinfo->qclass, qinfo->qtype))) { in local_zones_answer()
1857 lock_rw_rdlock(&z->lock); in local_zones_answer()
1858 lzt = z->type; in local_zones_answer()
1861 lock_rw_unlock(&z->lock); in local_zones_answer()
1870 lock_rw_unlock(&z->lock); in local_zones_answer()
1873 if(view->local_zones && !z && !view->isfirst){ in local_zones_answer()
1874 lock_rw_unlock(&view->lock); in local_zones_answer()
1879 dname_str(z->name, zname); in local_zones_answer()
1881 zname, local_zone_type2str(lzt), view->name); in local_zones_answer()
1883 lock_rw_unlock(&view->lock); in local_zones_answer()
1887 lock_rw_rdlock(&zones->lock); in local_zones_answer()
1888 if(!(z = local_zones_tags_lookup(zones, qinfo->qname, in local_zones_answer()
1889 qinfo->qname_len, labs, qinfo->qclass, qinfo->qtype, in local_zones_answer()
1891 lock_rw_unlock(&zones->lock); in local_zones_answer()
1894 lock_rw_rdlock(&z->lock); in local_zones_answer()
1895 lzt = lz_type(taglist, taglen, z->taglist, z->taglen, in local_zones_answer()
1896 tagactions, tagactionssize, z->type, repinfo, in local_zones_answer()
1897 z->override_tree, &tag, tagname, num_tags); in local_zones_answer()
1898 lock_rw_unlock(&zones->lock); in local_zones_answer()
1901 dname_str(z->name, zname); in local_zones_answer()
1906 if((env->cfg->log_local_actions || in local_zones_answer()
1911 lz_inform_print(z, qinfo, &repinfo->client_addr, in local_zones_answer()
1912 repinfo->client_addrlen); in local_zones_answer()
1922 lock_rw_unlock(&z->lock); in local_zones_answer()
1925 return !qinfo->local_alias; in local_zones_answer()
1928 lock_rw_unlock(&z->lock); in local_zones_answer()
1929 return r && !qinfo->local_alias; /* see above */ in local_zones_answer()
2013 p = (struct local_zone*)rbtree_next(&p->node); in set_kiddo_parents()
2015 p->dclass == z->dclass && dname_strict_subdomain(p->name, in set_kiddo_parents()
2016 p->namelabs, z->name, z->namelabs)) { in set_kiddo_parents()
2022 lock_rw_wrlock(&p->lock); in set_kiddo_parents()
2023 if(p->parent == match) in set_kiddo_parents()
2024 p->parent = newp; in set_kiddo_parents()
2025 lock_rw_unlock(&p->lock); in set_kiddo_parents()
2026 p = (struct local_zone*)rbtree_next(&p->node); in set_kiddo_parents()
2042 lock_rw_wrlock(&z->lock); in local_zones_add_zone()
2047 z->parent = find_closest_parent(z, prev); in local_zones_add_zone()
2050 if(exact||!rbtree_insert(&zones->ztree, &z->node)) { in local_zones_add_zone()
2052 lock_rw_unlock(&z->lock); in local_zones_add_zone()
2059 set_kiddo_parents(z, z->parent, z); in local_zones_add_zone()
2061 lock_rw_unlock(&z->lock); in local_zones_add_zone()
2068 lock_rw_wrlock(&z->lock); in local_zones_del_zone()
2069 set_kiddo_parents(z, z, z->parent); in local_zones_del_zone()
2072 (void)rbtree_delete(&zones->ztree, z); in local_zones_del_zone()
2075 lock_rw_unlock(&z->lock); in local_zones_del_zone()
2094 lock_rw_wrlock(&zones->lock); in local_zones_add_RR()
2100 lock_rw_unlock(&zones->lock); in local_zones_add_RR()
2106 lock_rw_wrlock(&z->lock); in local_zones_add_RR()
2107 lock_rw_unlock(&zones->lock); in local_zones_add_RR()
2109 lock_rw_unlock(&z->lock); in local_zones_add_RR()
2113 /** returns true if the node is terminal so no deeper domain names exist */
2120 struct local_data* n = (struct local_data*)rbtree_next(&d->node); in is_terminal()
2122 return 1; /* last in tree, no deeper node */ in is_terminal()
2123 if(dname_strict_subdomain(n->name, n->namelabs, d->name, d->namelabs)) in is_terminal()
2124 return 0; /* there is a deeper node */ in is_terminal()
2133 while(d && d->rrsets == NULL && is_terminal(d)) { in del_empty_term()
2136 (void)rbtree_delete(&z->data, d); in del_empty_term()
2142 labs--; in del_empty_term()
2151 struct local_rrset* prev=NULL, *p=d->rrsets; in del_local_rrset()
2152 while(p && ntohs(p->rrset->rk.type) != dtype) { in del_local_rrset()
2154 p = p->next; in del_local_rrset()
2159 if(prev) prev->next = p->next; in del_local_rrset()
2160 else d->rrsets = p->next; in del_local_rrset()
2172 lock_rw_rdlock(&zones->lock); in local_zones_del_data()
2175 lock_rw_wrlock(&z->lock); in local_zones_del_data()
2181 lock_rw_unlock(&z->lock); in local_zones_del_data()
2183 lock_rw_unlock(&zones->lock); in local_zones_del_data()
2186 lock_rw_rdlock(&zones->lock); in local_zones_del_data()
2190 lock_rw_unlock(&zones->lock); in local_zones_del_data()
2193 lock_rw_wrlock(&z->lock); in local_zones_del_data()
2194 lock_rw_unlock(&zones->lock); in local_zones_del_data()
2200 d->rrsets = NULL; in local_zones_del_data()
2202 if(query_dname_compare(d->name, z->name) == 0) { in local_zones_del_data()
2203 z->soa = NULL; in local_zones_del_data()
2204 z->soa_negative = NULL; in local_zones_del_data()
2211 lock_rw_unlock(&z->lock); in local_zones_del_data()