Lines Matching defs:rrset
46 #include "services/cache/rrset.h"
61 /** remove rrset, update loop variables */
64 struct rrset_parse* prev, struct rrset_parse** rrset)
67 && (*rrset)->dname_len <= LDNS_MAX_DOMAINLEN) {
69 dname_pkt_copy(pkt, buf, (*rrset)->dname);
71 (*rrset)->type, ntohs((*rrset)->rrset_class));
74 prev->rrset_all_next = (*rrset)->rrset_all_next;
75 else msg->rrset_first = (*rrset)->rrset_all_next;
76 if(msg->rrset_last == *rrset)
79 switch((*rrset)->section) {
85 msgparse_bucket_remove(msg, *rrset);
86 *rrset = (*rrset)->rrset_all_next;
109 /** get additional name from rrset RR, return false if no name present */
111 get_additional_name(struct rrset_parse* rrset, struct rr_parse* rr,
116 switch(rrset->type) {
152 struct rrset_parse* rrset)
159 if(!has_additional(rrset->type))
161 for(rr = rrset->rr_first; rr; rr = rr->next) {
162 if(get_additional_name(rrset, rr, &nm, &nmlen, pkt)) {
165 LDNS_RR_TYPE_A, rrset->rrset_class, 0);
168 LDNS_RR_TYPE_A, rrset->rrset_class);
175 rrset->rrset_class, 0);
177 nmlen, LDNS_RR_TYPE_AAAA, rrset->rrset_class);
187 parse_get_cname_target(struct rrset_parse* rrset, uint8_t** sname,
191 if(rrset->rr_count != 1) {
193 verbose(VERB_ALGO, "Found CNAME rrset with "
194 "size > 1: %u", (unsigned)rrset->rr_count);
196 rrset->rr_count = 1;
197 rrset->size = rrset->rr_first->size;
198 for(sig=rrset->rrsig_first; sig; sig=sig->next)
199 rrset->size += sig->size;
200 rrset->rr_last = rrset->rr_first;
201 rrset->rr_first->next = NULL;
203 if(rrset->rr_first->size < sizeof(uint16_t)+1)
205 *sname = rrset->rr_first->ttl_data + sizeof(uint32_t)
207 *snamelen = rrset->rr_first->size - sizeof(uint16_t);
209 if(rrset->rr_first->outside_packet) {
250 /** synthesize a CNAME rrset */
254 struct rrset_parse* rrset, struct rrset_parse* prev,
274 cn->section = rrset->section;
275 cn->rrset_class = rrset->rrset_class;
286 memmove(cn->rr_first->ttl_data, rrset->rr_first->ttl_data,
342 struct rrset_parse* rrset;
343 for(rrset = msg->rrset_first; rrset; rrset = rrset->rrset_all_next)
344 if(rrset->type == LDNS_RR_TYPE_SOA &&
345 rrset->section == LDNS_SECTION_AUTHORITY)
372 shorten_rrset(sldns_buffer* pkt, struct rrset_parse* rrset, int count)
375 * content does not overwhelm the cache. It may make the rrset
383 struct rr_parse* rr = rrset->rr_first, *prev = NULL;
393 && rrset->dname_len <= LDNS_MAX_DOMAINLEN) {
395 dname_pkt_copy(pkt, buf, rrset->dname);
397 rrset->type, ntohs(rrset->rrset_class));
400 rrset->rr_last = prev;
401 rrset->rr_count = count;
403 rrset->size -= rr->size;
406 if(rrset->rr_last)
407 rrset->rr_last->next = NULL;
408 else rrset->rr_first = NULL;
430 struct rrset_parse* rrset, *prev, *nsset=NULL;
441 /* walk through the parse packet rrset list, keep track of previous
444 rrset = msg->rrset_first;
445 while(rrset && rrset->section == LDNS_SECTION_ANSWER) {
453 pkt, msg, prev, &rrset);
456 if(rrset->type == LDNS_RR_TYPE_DNAME &&
457 pkt_strict_sub(pkt, sname, rrset->dname)) {
458 /* check if next rrset is correct CNAME. else,
460 struct rrset_parse* nx = rrset->rrset_all_next;
463 if(rrset->rr_count != 1) {
464 verbose(VERB_ALGO, "Found DNAME rrset with "
466 (unsigned)rrset->rr_count);
469 if(!synth_cname(sname, snamelen, rrset, alias,
485 prev = rrset;
486 rrset = nx;
491 /* synth a CNAME rrset */
493 aliaslen, region, msg, rrset, rrset, nx, pkt);
500 rrset = nx;
506 if(dname_pkt_compare(pkt, sname, rrset->dname) != 0) {
508 pkt, msg, prev, &rrset);
513 if(rrset->type == LDNS_RR_TYPE_CNAME) {
514 struct rrset_parse* nx = rrset->rrset_all_next;
533 parse_get_cname_target(rrset, &t, &tlen, pkt) &&
543 msg->rrset_last = rrset;
544 rrset->rrset_all_next =
546 nx->rrset_all_next = rrset;
548 * is other rrset removal code after
554 if(!parse_get_cname_target(rrset, &sname, &snamelen, pkt))
556 prev = rrset;
557 rrset = rrset->rrset_all_next;
560 while(rrset && rrset->section ==
563 rrset->dname) == 0) {
564 if(rrset->type == LDNS_RR_TYPE_NS &&
565 rrset->rr_count > env->cfg->iter_scrub_ns) {
566 shorten_rrset(pkt, rrset, env->cfg->iter_scrub_ns);
568 prev = rrset;
569 rrset = rrset->rrset_all_next;
577 qinfo->qtype != rrset->type) {
579 pkt, msg, prev, &rrset);
583 if(rrset->type == LDNS_RR_TYPE_NS &&
584 rrset->rr_count > env->cfg->iter_scrub_ns) {
585 shorten_rrset(pkt, rrset, env->cfg->iter_scrub_ns);
588 /* Mark the additional names from relevant rrset as OK. */
591 if(dname_pkt_compare(pkt, qinfo->qname, rrset->dname) == 0)
592 mark_additional_rrset(pkt, msg, rrset);
594 prev = rrset;
595 rrset = rrset->rrset_all_next;
599 while(rrset && rrset->section == LDNS_SECTION_AUTHORITY) {
601 if(rrset->type==LDNS_RR_TYPE_DNAME ||
602 rrset->type==LDNS_RR_TYPE_CNAME ||
603 rrset->type==LDNS_RR_TYPE_A ||
604 rrset->type==LDNS_RR_TYPE_AAAA) {
606 "RRset:", pkt, msg, prev, &rrset);
611 !type_allowed_in_authority_section(rrset->type)) {
613 "RRset:", pkt, msg, prev, &rrset);
617 if(rrset->type==LDNS_RR_TYPE_NS) {
619 if(!sub_of_pkt(pkt, qinfo->qname, rrset->dname)) {
621 "RRset:", pkt, msg, prev, &rrset);
634 "RRset:", pkt, msg, prev, &rrset);
638 nsset = rrset;
641 "RRset:", pkt, msg, prev, &rrset);
644 if(rrset->rr_count > env->cfg->iter_scrub_ns) {
655 rrset->rrsig_count != 0) {
657 "RRset:", pkt, msg, prev, &rrset);
660 shorten_rrset(pkt, rrset, env->cfg->iter_scrub_ns);
666 if(rrset->type==LDNS_RR_TYPE_DS &&
668 dname_pkt_compare(pkt, qinfo->qname, rrset->dname) == 0) {
669 rrset->section = LDNS_SECTION_ANSWER;
670 msg->ancount = rrset->rr_count + rrset->rrsig_count;
677 msg->rrset_first = rrset;
678 msg->rrset_last = rrset;
679 rrset->rrset_all_next = NULL;
682 mark_additional_rrset(pkt, msg, rrset);
683 prev = rrset;
684 rrset = rrset->rrset_all_next;
691 while(rrset && rrset->section == LDNS_SECTION_ADDITIONAL) {
692 if(rrset->type==LDNS_RR_TYPE_A ||
693 rrset->type==LDNS_RR_TYPE_AAAA)
695 if((rrset->flags & RRSET_SCRUB_OK)) {
697 rrset->flags &= ~RRSET_SCRUB_OK;
700 "RRset:", pkt, msg, prev, &rrset);
705 if(rrset->type==LDNS_RR_TYPE_DNAME ||
706 rrset->type==LDNS_RR_TYPE_CNAME ||
707 rrset->type==LDNS_RR_TYPE_NS) {
709 "RRset:", pkt, msg, prev, &rrset);
714 !type_allowed_in_additional_section(rrset->type)) {
716 "RRset:", pkt, msg, prev, &rrset);
719 prev = rrset;
720 rrset = rrset->rrset_all_next;
728 * The rrset is stored in the cache but removed from the message.
734 * @param rrset: to store.
738 struct rrset_parse* rrset)
749 if(!parse_copy_decompress_rrset(pkt, msg, rrset, NULL, k)) {
764 * @param rrset: the NSEC rrset
769 struct rrset_parse* rrset, uint8_t* zonename)
774 log_assert(rrset->type == LDNS_RR_TYPE_NSEC);
775 for(rr = rrset->rr_first; rr; rr = rr->next) {
806 struct rrset_parse* prev, struct rrset_parse** rrset, int* added_ede,
810 for(rr = (*rrset)->rr_first; rr; rr = rr->next) {
815 if((*rrset)->type == LDNS_RR_TYPE_A && rr->size != 6 ) {
822 pkt, *rrset, rr_prev, rr, NULL, 0)) {
824 pkt, msg, prev, rrset);
833 if((*rrset)->type == LDNS_RR_TYPE_AAAA && rr->size != 18 ) {
840 pkt, *rrset, rr_prev, rr, NULL, 0)) {
842 pkt, msg, prev, rrset);
876 struct rrset_parse* rrset, *prev;
878 rrset = msg->rrset_first;
883 if(rrset && rrset->type == LDNS_RR_TYPE_DNAME &&
884 rrset->section == LDNS_SECTION_ANSWER &&
885 pkt_strict_sub(pkt, qinfo->qname, rrset->dname) &&
886 pkt_sub(pkt, rrset->dname, zonename)) {
887 prev = rrset; /* DNAME allowed to stay in answer section */
888 rrset = rrset->rrset_all_next;
898 while(rrset && rrset->section == LDNS_SECTION_ANSWER) {
899 if(dname_pkt_compare(pkt, qinfo->qname, rrset->dname) != 0) {
900 if(has_additional(rrset->type)) del_addi = 1;
902 "RRset:", pkt, msg, prev, &rrset);
905 prev = rrset;
906 rrset = rrset->rrset_all_next;
917 rrset = msg->rrset_first;
918 while(rrset) {
921 if(rrset->type == LDNS_RR_TYPE_A ||
922 rrset->type == LDNS_RR_TYPE_AAAA) {
923 if(scrub_sanitize_rr_length(pkt, msg, prev, &rrset,
929 if( (rrset->type == LDNS_RR_TYPE_A ||
930 rrset->type == LDNS_RR_TYPE_AAAA)) {
934 /* also do not remove entire rrset, unless all records
936 if(priv_rrset_bad(ie->priv, pkt, rrset)) {
937 remove_rrset(NULL, pkt, msg, prev, &rrset);
949 if(!pkt_sub(pkt, rrset->dname, zonename)) {
951 rrset->type == LDNS_RR_TYPE_NS &&
952 rrset->section == LDNS_SECTION_AUTHORITY &&
955 sub_of_pkt(pkt, zonename, rrset->dname)) {
956 /* noerror, nodata and this NS rrset is above
964 rrset->type == LDNS_RR_TYPE_A ||
965 rrset->type == LDNS_RR_TYPE_AAAA)) {
969 store_rrset(pkt, msg, env, rrset);
971 "poison RRset:", pkt, msg, prev, &rrset);
974 if(has_additional(rrset->type)) del_addi = 1;
976 "poison RRset:", pkt, msg, prev, &rrset);
980 if(rrset->type == LDNS_RR_TYPE_NS &&
981 (rrset->section == LDNS_SECTION_AUTHORITY ||
982 rrset->section == LDNS_SECTION_ANSWER)) {
988 ns_rrset_dname = rrset->dname;
990 if(del_addi && rrset->section == LDNS_SECTION_ADDITIONAL) {
992 "poison reference RRset:", pkt, msg, prev, &rrset);
996 if(rrset->type == LDNS_RR_TYPE_NSEC &&
997 sanitize_nsec_is_overreach(pkt, rrset, zonename)) {
999 "RRset:", pkt, msg, prev, &rrset);
1003 rrset->section == LDNS_SECTION_ADDITIONAL &&
1004 (rrset->type == LDNS_RR_TYPE_A || rrset->type == LDNS_RR_TYPE_AAAA) &&
1005 !pkt_strict_sub(pkt, rrset->dname, ns_rrset_dname)) {
1007 * at an A/AAAA rrset, have a previous
1011 * flag, recompute the hash for the rrset
1015 rrset->flags = PACKED_RRSET_UNVERIFIED_GLUE;
1016 rrset->hash = pkt_hash_rrset(pkt, rrset->dname, rrset->type, rrset->rrset_class, rrset->flags);
1017 store_rrset(pkt, msg, env, rrset);
1019 "unverified glue reference RRset:", pkt, msg, prev, &rrset);
1022 prev = rrset;
1023 rrset = rrset->rrset_all_next;