4 * dns packet implementation
6 * a Net::DNS like library for C
8 * (c) NLnet Labs, 2004-2006
10 * See the file LICENSE for the license
13 #include <ldns/config.h>
15 #include <ldns/ldns.h>
16 #include <ldns/internal.h>
22 #include <openssl/rand.h>
26 * do this as functions to get type checking
29 #define LDNS_EDNS_MASK_DO_BIT 0x8000
30 #define LDNS_EDNS_MASK_UNASSIGNED (0xFFFF & ~LDNS_EDNS_MASK_DO_BIT)
32 /* TODO defines for 3600 */
33 /* convert to and from numerical flag values */
34 ldns_lookup_table ldns_edns_flags[] = {
41 ldns_pkt_id(const ldns_pkt *packet)
43 return packet->_header->_id;
47 ldns_pkt_qr(const ldns_pkt *packet)
49 return packet->_header->_qr;
53 ldns_pkt_aa(const ldns_pkt *packet)
55 return packet->_header->_aa;
59 ldns_pkt_tc(const ldns_pkt *packet)
61 return packet->_header->_tc;
65 ldns_pkt_rd(const ldns_pkt *packet)
67 return packet->_header->_rd;
71 ldns_pkt_cd(const ldns_pkt *packet)
73 return packet->_header->_cd;
77 ldns_pkt_ra(const ldns_pkt *packet)
79 return packet->_header->_ra;
83 ldns_pkt_ad(const ldns_pkt *packet)
85 return packet->_header->_ad;
89 ldns_pkt_get_opcode(const ldns_pkt *packet)
91 return packet->_header->_opcode;
95 ldns_pkt_get_rcode(const ldns_pkt *packet)
97 return packet->_header->_rcode;
101 ldns_pkt_qdcount(const ldns_pkt *packet)
103 return packet->_header->_qdcount;
107 ldns_pkt_ancount(const ldns_pkt *packet)
109 return packet->_header->_ancount;
113 ldns_pkt_nscount(const ldns_pkt *packet)
115 return packet->_header->_nscount;
119 ldns_pkt_arcount(const ldns_pkt *packet)
121 return packet->_header->_arcount;
125 ldns_pkt_question(const ldns_pkt *packet)
127 return packet->_question;
131 ldns_pkt_answer(const ldns_pkt *packet)
133 return packet->_answer;
137 ldns_pkt_authority(const ldns_pkt *packet)
139 return packet->_authority;
143 ldns_pkt_additional(const ldns_pkt *packet)
145 return packet->_additional;
148 /* return ALL section concatenated */
150 ldns_pkt_all(const ldns_pkt *packet)
152 ldns_rr_list *all, *prev_all;
154 all = ldns_rr_list_cat_clone(
155 ldns_pkt_question(packet),
156 ldns_pkt_answer(packet));
158 all = ldns_rr_list_cat_clone(all,
159 ldns_pkt_authority(packet));
160 ldns_rr_list_deep_free(prev_all);
162 all = ldns_rr_list_cat_clone(all,
163 ldns_pkt_additional(packet));
164 ldns_rr_list_deep_free(prev_all);
169 ldns_pkt_all_noquestion(const ldns_pkt *packet)
171 ldns_rr_list *all, *all2;
173 all = ldns_rr_list_cat_clone(
174 ldns_pkt_answer(packet),
175 ldns_pkt_authority(packet));
176 all2 = ldns_rr_list_cat_clone(all,
177 ldns_pkt_additional(packet));
179 ldns_rr_list_deep_free(all);
184 ldns_pkt_size(const ldns_pkt *packet)
186 return packet->_size;
190 ldns_pkt_querytime(const ldns_pkt *packet)
192 return packet->_querytime;
196 ldns_pkt_answerfrom(const ldns_pkt *packet)
198 return packet->_answerfrom;
202 ldns_pkt_timestamp(const ldns_pkt *packet)
204 return packet->timestamp;
208 ldns_pkt_edns_udp_size(const ldns_pkt *packet)
210 return packet->_edns_udp_size;
214 ldns_pkt_edns_extended_rcode(const ldns_pkt *packet)
216 return packet->_edns_extended_rcode;
220 ldns_pkt_edns_version(const ldns_pkt *packet)
222 return packet->_edns_version;
226 ldns_pkt_edns_z(const ldns_pkt *packet)
228 return packet->_edns_z;
232 ldns_pkt_edns_do(const ldns_pkt *packet)
234 return (packet->_edns_z & LDNS_EDNS_MASK_DO_BIT);
238 ldns_pkt_set_edns_do(ldns_pkt *packet, bool value)
241 packet->_edns_z = packet->_edns_z | LDNS_EDNS_MASK_DO_BIT;
243 packet->_edns_z = packet->_edns_z & ~LDNS_EDNS_MASK_DO_BIT;
248 ldns_pkt_edns_unassigned(const ldns_pkt *packet)
250 return (packet->_edns_z & LDNS_EDNS_MASK_UNASSIGNED);
254 ldns_pkt_set_edns_unassigned(ldns_pkt *packet, uint16_t value)
256 packet->_edns_z = (packet->_edns_z & ~LDNS_EDNS_MASK_UNASSIGNED)
257 | (value & LDNS_EDNS_MASK_UNASSIGNED);
261 ldns_pkt_edns_data(const ldns_pkt *packet)
263 return packet->_edns_data;
266 /* return only those rr that share the ownername */
268 ldns_pkt_rr_list_by_name(const ldns_pkt *packet,
269 const ldns_rdf *ownername,
270 ldns_pkt_section sec)
280 rrs = ldns_pkt_get_section_clone(packet, sec);
283 for(i = 0; i < ldns_rr_list_rr_count(rrs); i++) {
284 if (ldns_dname_compare(ldns_rr_owner(
285 ldns_rr_list_rr(rrs, i)),
287 /* owner names match */
289 ret = ldns_rr_list_new();
291 ldns_rr_list_push_rr(ret,
293 ldns_rr_list_rr(rrs, i))
298 ldns_rr_list_deep_free(rrs);
303 /* return only those rr that share a type */
305 ldns_pkt_rr_list_by_type(const ldns_pkt *packet,
307 ldns_pkt_section sec)
317 rrs = ldns_pkt_get_section_clone(packet, sec);
318 new = ldns_rr_list_new();
320 for(i = 0; i < ldns_rr_list_rr_count(rrs); i++) {
321 if (type == ldns_rr_get_type(ldns_rr_list_rr(rrs, i))) {
323 ldns_rr_list_push_rr(new,
325 ldns_rr_list_rr(rrs, i))
329 ldns_rr_list_deep_free(rrs);
331 if (ldns_rr_list_rr_count(new) == 0) {
332 ldns_rr_list_free(new);
339 /* return only those rrs that share name and type */
341 ldns_pkt_rr_list_by_name_and_type(const ldns_pkt *packet,
342 const ldns_rdf *ownername,
344 ldns_pkt_section sec)
355 rrs = ldns_pkt_get_section_clone(packet, sec);
356 new = ldns_rr_list_new();
359 for(i = 0; i < ldns_rr_list_rr_count(rrs); i++) {
360 if (type == ldns_rr_get_type(ldns_rr_list_rr(rrs, i)) &&
361 ldns_dname_compare(ldns_rr_owner(ldns_rr_list_rr(rrs, i)),
366 ldns_rr_list_push_rr(new, ldns_rr_clone(ldns_rr_list_rr(rrs, i)));
370 ldns_rr_list_deep_free(rrs);
372 ldns_rr_list_free(new);
378 ldns_pkt_rr(const ldns_pkt *pkt, ldns_pkt_section sec, const ldns_rr *rr)
383 case LDNS_SECTION_QUESTION:
384 return ldns_rr_list_contains_rr(ldns_pkt_question(pkt), rr);
385 case LDNS_SECTION_ANSWER:
386 return ldns_rr_list_contains_rr(ldns_pkt_answer(pkt), rr);
387 case LDNS_SECTION_AUTHORITY:
388 return ldns_rr_list_contains_rr(ldns_pkt_authority(pkt), rr);
389 case LDNS_SECTION_ADDITIONAL:
390 return ldns_rr_list_contains_rr(ldns_pkt_additional(pkt), rr);
391 case LDNS_SECTION_ANY:
392 result = ldns_rr_list_contains_rr(ldns_pkt_question(pkt), rr);
394 case LDNS_SECTION_ANY_NOQUESTION:
396 || ldns_rr_list_contains_rr(ldns_pkt_answer(pkt), rr)
397 || ldns_rr_list_contains_rr(ldns_pkt_authority(pkt), rr)
398 || ldns_rr_list_contains_rr(ldns_pkt_additional(pkt), rr);
405 ldns_pkt_section_count(const ldns_pkt *packet, ldns_pkt_section s)
408 case LDNS_SECTION_QUESTION:
409 return ldns_pkt_qdcount(packet);
410 case LDNS_SECTION_ANSWER:
411 return ldns_pkt_ancount(packet);
412 case LDNS_SECTION_AUTHORITY:
413 return ldns_pkt_nscount(packet);
414 case LDNS_SECTION_ADDITIONAL:
415 return ldns_pkt_arcount(packet);
416 case LDNS_SECTION_ANY:
417 return ldns_pkt_qdcount(packet) +
418 ldns_pkt_ancount(packet) +
419 ldns_pkt_nscount(packet) +
420 ldns_pkt_arcount(packet);
421 case LDNS_SECTION_ANY_NOQUESTION:
422 return ldns_pkt_ancount(packet) +
423 ldns_pkt_nscount(packet) +
424 ldns_pkt_arcount(packet);
431 ldns_pkt_empty(ldns_pkt *p)
434 return true; /* NULL is empty? */
436 if (ldns_pkt_section_count(p, LDNS_SECTION_ANY) > 0) {
445 ldns_pkt_get_section_clone(const ldns_pkt *packet, ldns_pkt_section s)
448 case LDNS_SECTION_QUESTION:
449 return ldns_rr_list_clone(ldns_pkt_question(packet));
450 case LDNS_SECTION_ANSWER:
451 return ldns_rr_list_clone(ldns_pkt_answer(packet));
452 case LDNS_SECTION_AUTHORITY:
453 return ldns_rr_list_clone(ldns_pkt_authority(packet));
454 case LDNS_SECTION_ADDITIONAL:
455 return ldns_rr_list_clone(ldns_pkt_additional(packet));
456 case LDNS_SECTION_ANY:
457 /* these are already clones */
458 return ldns_pkt_all(packet);
459 case LDNS_SECTION_ANY_NOQUESTION:
460 return ldns_pkt_all_noquestion(packet);
466 ldns_rr *ldns_pkt_tsig(const ldns_pkt *pkt) {
467 return pkt->_tsig_rr;
472 ldns_pkt_set_id(ldns_pkt *packet, uint16_t id)
474 packet->_header->_id = id;
478 ldns_pkt_set_random_id(ldns_pkt *packet)
480 uint16_t rid = ldns_get_random();
481 ldns_pkt_set_id(packet, rid);
486 ldns_pkt_set_qr(ldns_pkt *packet, bool qr)
488 packet->_header->_qr = qr;
492 ldns_pkt_set_aa(ldns_pkt *packet, bool aa)
494 packet->_header->_aa = aa;
498 ldns_pkt_set_tc(ldns_pkt *packet, bool tc)
500 packet->_header->_tc = tc;
504 ldns_pkt_set_rd(ldns_pkt *packet, bool rd)
506 packet->_header->_rd = rd;
510 ldns_pkt_set_additional(ldns_pkt *p, ldns_rr_list *rr)
516 ldns_pkt_set_question(ldns_pkt *p, ldns_rr_list *rr)
522 ldns_pkt_set_answer(ldns_pkt *p, ldns_rr_list *rr)
528 ldns_pkt_set_authority(ldns_pkt *p, ldns_rr_list *rr)
534 ldns_pkt_set_cd(ldns_pkt *packet, bool cd)
536 packet->_header->_cd = cd;
540 ldns_pkt_set_ra(ldns_pkt *packet, bool ra)
542 packet->_header->_ra = ra;
546 ldns_pkt_set_ad(ldns_pkt *packet, bool ad)
548 packet->_header->_ad = ad;
552 ldns_pkt_set_opcode(ldns_pkt *packet, ldns_pkt_opcode opcode)
554 packet->_header->_opcode = opcode;
558 ldns_pkt_set_rcode(ldns_pkt *packet, uint8_t rcode)
560 packet->_header->_rcode = rcode;
564 ldns_pkt_set_qdcount(ldns_pkt *packet, uint16_t qdcount)
566 packet->_header->_qdcount = qdcount;
570 ldns_pkt_set_ancount(ldns_pkt *packet, uint16_t ancount)
572 packet->_header->_ancount = ancount;
576 ldns_pkt_set_nscount(ldns_pkt *packet, uint16_t nscount)
578 packet->_header->_nscount = nscount;
582 ldns_pkt_set_arcount(ldns_pkt *packet, uint16_t arcount)
584 packet->_header->_arcount = arcount;
588 ldns_pkt_set_querytime(ldns_pkt *packet, uint32_t time)
590 packet->_querytime = time;
594 ldns_pkt_set_answerfrom(ldns_pkt *packet, ldns_rdf *answerfrom)
596 packet->_answerfrom = answerfrom;
600 ldns_pkt_set_timestamp(ldns_pkt *packet, struct timeval timeval)
602 packet->timestamp.tv_sec = timeval.tv_sec;
603 packet->timestamp.tv_usec = timeval.tv_usec;
607 ldns_pkt_set_size(ldns_pkt *packet, size_t s)
613 ldns_pkt_set_edns_udp_size(ldns_pkt *packet, uint16_t s)
615 packet->_edns_udp_size = s;
619 ldns_pkt_set_edns_extended_rcode(ldns_pkt *packet, uint8_t c)
621 packet->_edns_extended_rcode = c;
625 ldns_pkt_set_edns_version(ldns_pkt *packet, uint8_t v)
627 packet->_edns_version = v;
631 ldns_pkt_set_edns_z(ldns_pkt *packet, uint16_t z)
637 ldns_pkt_set_edns_data(ldns_pkt *packet, ldns_rdf *data)
639 packet->_edns_data = data;
643 ldns_pkt_set_edns_option_list(ldns_pkt *packet, ldns_edns_option_list *list)
645 if (packet->_edns_list)
646 ldns_edns_option_list_deep_free(packet->_edns_list);
647 packet->_edns_list = list;
652 ldns_pkt_set_section_count(ldns_pkt *packet, ldns_pkt_section s, uint16_t count)
655 case LDNS_SECTION_QUESTION:
656 ldns_pkt_set_qdcount(packet, count);
658 case LDNS_SECTION_ANSWER:
659 ldns_pkt_set_ancount(packet, count);
661 case LDNS_SECTION_AUTHORITY:
662 ldns_pkt_set_nscount(packet, count);
664 case LDNS_SECTION_ADDITIONAL:
665 ldns_pkt_set_arcount(packet, count);
667 case LDNS_SECTION_ANY:
668 case LDNS_SECTION_ANY_NOQUESTION:
673 void ldns_pkt_set_tsig(ldns_pkt *pkt, ldns_rr *rr)
679 ldns_pkt_push_rr(ldns_pkt *packet, ldns_pkt_section section, ldns_rr *rr)
682 case LDNS_SECTION_QUESTION:
683 if (!ldns_rr_list_push_rr(ldns_pkt_question(packet), rr)) {
686 ldns_pkt_set_qdcount(packet, ldns_pkt_qdcount(packet) + 1);
688 case LDNS_SECTION_ANSWER:
689 if (!ldns_rr_list_push_rr(ldns_pkt_answer(packet), rr)) {
692 ldns_pkt_set_ancount(packet, ldns_pkt_ancount(packet) + 1);
694 case LDNS_SECTION_AUTHORITY:
695 if (!ldns_rr_list_push_rr(ldns_pkt_authority(packet), rr)) {
698 ldns_pkt_set_nscount(packet, ldns_pkt_nscount(packet) + 1);
700 case LDNS_SECTION_ADDITIONAL:
701 if (!ldns_rr_list_push_rr(ldns_pkt_additional(packet), rr)) {
704 ldns_pkt_set_arcount(packet, ldns_pkt_arcount(packet) + 1);
706 case LDNS_SECTION_ANY:
707 case LDNS_SECTION_ANY_NOQUESTION:
708 /* shouldn't this error? */
715 ldns_pkt_safe_push_rr(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr *rr)
718 /* check to see if its there */
719 if (ldns_pkt_rr(pkt, sec, rr)) {
723 return ldns_pkt_push_rr(pkt, sec, rr);
727 ldns_pkt_push_rr_list(ldns_pkt *p, ldns_pkt_section s, ldns_rr_list *list)
730 for(i = 0; i < ldns_rr_list_rr_count(list); i++) {
731 if (!ldns_pkt_push_rr(p, s, ldns_rr_list_rr(list, i))) {
739 ldns_pkt_safe_push_rr_list(ldns_pkt *p, ldns_pkt_section s, ldns_rr_list *list)
742 for(i = 0; i < ldns_rr_list_rr_count(list); i++) {
743 if (!ldns_pkt_safe_push_rr(p, s, ldns_rr_list_rr(list, i))) {
751 ldns_pkt_edns(const ldns_pkt *pkt)
753 return (ldns_pkt_edns_udp_size(pkt) > 0 ||
754 ldns_pkt_edns_extended_rcode(pkt) > 0 ||
755 ldns_pkt_edns_data(pkt) ||
756 ldns_pkt_edns_do(pkt) ||
762 ldns_edns_option_list*
763 pkt_edns_data2edns_option_list(const ldns_rdf *edns_data)
766 ldns_edns_option_list* edns_list;
773 max = ldns_rdf_size(edns_data);
774 wire = ldns_rdf_data(edns_data);
778 if (!(edns_list = ldns_edns_option_list_new()))
782 ldns_edns_option* edns;
785 if (pos + 4 > max) { /* make sure the header is */
786 ldns_edns_option_list_deep_free(edns_list);
789 ldns_edns_option_code code = ldns_read_uint16(&wire[pos]);
790 size_t size = ldns_read_uint16(&wire[pos+2]);
793 if (pos + size > max) { /* make sure the size fits the data */
794 ldns_edns_option_list_deep_free(edns_list);
797 data = LDNS_XMALLOC(uint8_t, size);
800 ldns_edns_option_list_deep_free(edns_list);
803 memcpy(data, &wire[pos], size);
806 edns = ldns_edns_new(code, size, data);
809 ldns_edns_option_list_deep_free(edns_list);
812 if (!ldns_edns_option_list_push(edns_list, edns)) {
813 ldns_edns_option_list_deep_free(edns_list);
821 ldns_edns_option_list*
822 ldns_pkt_edns_get_option_list(ldns_pkt *packet)
824 /* return the list if it already exists */
825 if (packet->_edns_list != NULL)
826 return packet->_edns_list;
828 /* if the list doesn't exists, we create it by parsing the
831 if (!ldns_pkt_edns_data(packet))
834 return ( packet->_edns_list
835 = pkt_edns_data2edns_option_list(ldns_pkt_edns_data(packet)));
839 /* Create/destroy/convert functions
845 packet = LDNS_MALLOC(ldns_pkt);
850 packet->_header = LDNS_MALLOC(ldns_hdr);
851 if (!packet->_header) {
856 packet->_question = ldns_rr_list_new();
857 packet->_answer = ldns_rr_list_new();
858 packet->_authority = ldns_rr_list_new();
859 packet->_additional = ldns_rr_list_new();
861 /* default everything to false */
862 ldns_pkt_set_qr(packet, false);
863 ldns_pkt_set_aa(packet, false);
864 ldns_pkt_set_tc(packet, false);
865 ldns_pkt_set_rd(packet, false);
866 ldns_pkt_set_ra(packet, false);
867 ldns_pkt_set_ad(packet, false);
868 ldns_pkt_set_cd(packet, false);
870 ldns_pkt_set_opcode(packet, LDNS_PACKET_QUERY);
871 ldns_pkt_set_rcode(packet, 0);
872 ldns_pkt_set_id(packet, 0);
873 ldns_pkt_set_size(packet, 0);
874 ldns_pkt_set_querytime(packet, 0);
875 memset(&packet->timestamp, 0, sizeof(packet->timestamp));
876 ldns_pkt_set_answerfrom(packet, NULL);
877 ldns_pkt_set_section_count(packet, LDNS_SECTION_QUESTION, 0);
878 ldns_pkt_set_section_count(packet, LDNS_SECTION_ANSWER, 0);
879 ldns_pkt_set_section_count(packet, LDNS_SECTION_AUTHORITY, 0);
880 ldns_pkt_set_section_count(packet, LDNS_SECTION_ADDITIONAL, 0);
882 ldns_pkt_set_edns_udp_size(packet, 0);
883 ldns_pkt_set_edns_extended_rcode(packet, 0);
884 ldns_pkt_set_edns_version(packet, 0);
885 ldns_pkt_set_edns_z(packet, 0);
886 ldns_pkt_set_edns_data(packet, NULL);
887 packet->_edns_list = NULL;
888 packet->_edns_present = false;
890 ldns_pkt_set_tsig(packet, NULL);
896 ldns_pkt_free(ldns_pkt *packet)
899 LDNS_FREE(packet->_header);
900 ldns_rr_list_deep_free(packet->_question);
901 ldns_rr_list_deep_free(packet->_answer);
902 ldns_rr_list_deep_free(packet->_authority);
903 ldns_rr_list_deep_free(packet->_additional);
904 ldns_rr_free(packet->_tsig_rr);
905 ldns_rdf_deep_free(packet->_edns_data);
906 ldns_edns_option_list_deep_free(packet->_edns_list);
907 ldns_rdf_deep_free(packet->_answerfrom);
913 ldns_pkt_set_flags(ldns_pkt *packet, uint16_t flags)
918 if ((flags & LDNS_QR) == LDNS_QR) {
919 ldns_pkt_set_qr(packet, true);
921 if ((flags & LDNS_AA) == LDNS_AA) {
922 ldns_pkt_set_aa(packet, true);
924 if ((flags & LDNS_RD) == LDNS_RD) {
925 ldns_pkt_set_rd(packet, true);
927 if ((flags & LDNS_TC) == LDNS_TC) {
928 ldns_pkt_set_tc(packet, true);
930 if ((flags & LDNS_CD) == LDNS_CD) {
931 ldns_pkt_set_cd(packet, true);
933 if ((flags & LDNS_RA) == LDNS_RA) {
934 ldns_pkt_set_ra(packet, true);
936 if ((flags & LDNS_AD) == LDNS_AD) {
937 ldns_pkt_set_ad(packet, true);
944 ldns_pkt_authsoa(const ldns_rdf* rr_name, ldns_rr_class rr_class)
946 ldns_rr* soa_rr = ldns_rr_new();
950 ldns_rdf *serial_rdf;
951 ldns_rdf *refresh_rdf;
953 ldns_rdf *expire_rdf;
954 ldns_rdf *minimum_rdf;
959 owner_rdf = ldns_rdf_clone(rr_name);
961 ldns_rr_free(soa_rr);
965 ldns_rr_set_owner(soa_rr, owner_rdf);
966 ldns_rr_set_type(soa_rr, LDNS_RR_TYPE_SOA);
967 ldns_rr_set_class(soa_rr, rr_class);
968 ldns_rr_set_question(soa_rr, false);
970 if (ldns_str2rdf_dname(&mname_rdf, ".") != LDNS_STATUS_OK) {
971 ldns_rr_free(soa_rr);
974 ldns_rr_push_rdf(soa_rr, mname_rdf);
976 if (ldns_str2rdf_dname(&rname_rdf, ".") != LDNS_STATUS_OK) {
977 ldns_rr_free(soa_rr);
980 ldns_rr_push_rdf(soa_rr, rname_rdf);
982 serial_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0);
984 ldns_rr_free(soa_rr);
987 ldns_rr_push_rdf(soa_rr, serial_rdf);
989 refresh_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0);
991 ldns_rr_free(soa_rr);
994 ldns_rr_push_rdf(soa_rr, refresh_rdf);
996 retry_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0);
998 ldns_rr_free(soa_rr);
1001 ldns_rr_push_rdf(soa_rr, retry_rdf);
1003 expire_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0);
1005 ldns_rr_free(soa_rr);
1008 ldns_rr_push_rdf(soa_rr, expire_rdf);
1010 minimum_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0);
1012 ldns_rr_free(soa_rr);
1015 ldns_rr_push_rdf(soa_rr, minimum_rdf);
1022 ldns_pkt_query_new_frm_str_internal(ldns_pkt **p, const char *name,
1023 ldns_rr_type rr_type, ldns_rr_class rr_class, uint16_t flags,
1024 ldns_rr* authsoa_rr)
1027 ldns_rr *question_rr;
1030 packet = ldns_pkt_new();
1032 return LDNS_STATUS_MEM_ERR;
1035 if (!ldns_pkt_set_flags(packet, flags)) {
1036 ldns_pkt_free(packet);
1037 return LDNS_STATUS_ERR;
1040 question_rr = ldns_rr_new();
1042 ldns_pkt_free(packet);
1043 return LDNS_STATUS_MEM_ERR;
1047 rr_type = LDNS_RR_TYPE_A;
1049 if (rr_class == 0) {
1050 rr_class = LDNS_RR_CLASS_IN;
1053 if (ldns_str2rdf_dname(&name_rdf, name) == LDNS_STATUS_OK) {
1054 ldns_rr_set_owner(question_rr, name_rdf);
1055 ldns_rr_set_type(question_rr, rr_type);
1056 ldns_rr_set_class(question_rr, rr_class);
1057 ldns_rr_set_question(question_rr, true);
1059 ldns_pkt_push_rr(packet, LDNS_SECTION_QUESTION, question_rr);
1061 ldns_rr_free(question_rr);
1062 ldns_pkt_free(packet);
1063 return LDNS_STATUS_ERR;
1067 ldns_pkt_push_rr(packet, LDNS_SECTION_AUTHORITY, authsoa_rr);
1070 packet->_tsig_rr = NULL;
1071 ldns_pkt_set_answerfrom(packet, NULL);
1074 return LDNS_STATUS_OK;
1076 ldns_pkt_free(packet);
1077 return LDNS_STATUS_NULL;
1082 ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *name,
1083 ldns_rr_type rr_type, ldns_rr_class rr_class, uint16_t flags)
1085 return ldns_pkt_query_new_frm_str_internal(p, name, rr_type,
1086 rr_class, flags, NULL);
1090 ldns_pkt_ixfr_request_new_frm_str(ldns_pkt **p, const char *name,
1091 ldns_rr_class rr_class, uint16_t flags, ldns_rr *soa)
1093 ldns_rr* authsoa_rr = soa;
1096 if (ldns_str2rdf_dname(&name_rdf, name) == LDNS_STATUS_OK) {
1097 authsoa_rr = ldns_pkt_authsoa(name_rdf, rr_class);
1099 ldns_rdf_free(name_rdf);
1101 return ldns_pkt_query_new_frm_str_internal(p, name, LDNS_RR_TYPE_IXFR,
1102 rr_class, flags, authsoa_rr);
1106 ldns_pkt_query_new_internal(ldns_rdf *rr_name, ldns_rr_type rr_type,
1107 ldns_rr_class rr_class, uint16_t flags, ldns_rr* authsoa_rr)
1110 ldns_rr *question_rr;
1112 packet = ldns_pkt_new();
1117 if (!ldns_pkt_set_flags(packet, flags)) {
1121 question_rr = ldns_rr_new();
1123 ldns_pkt_free(packet);
1128 rr_type = LDNS_RR_TYPE_A;
1130 if (rr_class == 0) {
1131 rr_class = LDNS_RR_CLASS_IN;
1134 ldns_rr_set_owner(question_rr, rr_name);
1135 ldns_rr_set_type(question_rr, rr_type);
1136 ldns_rr_set_class(question_rr, rr_class);
1137 ldns_rr_set_question(question_rr, true);
1138 ldns_pkt_push_rr(packet, LDNS_SECTION_QUESTION, question_rr);
1141 ldns_pkt_push_rr(packet, LDNS_SECTION_AUTHORITY, authsoa_rr);
1144 packet->_tsig_rr = NULL;
1149 ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type,
1150 ldns_rr_class rr_class, uint16_t flags)
1152 return ldns_pkt_query_new_internal(rr_name, rr_type,
1153 rr_class, flags, NULL);
1157 ldns_pkt_ixfr_request_new(ldns_rdf *rr_name, ldns_rr_class rr_class,
1158 uint16_t flags, ldns_rr* soa)
1160 ldns_rr* authsoa_rr = soa;
1162 authsoa_rr = ldns_pkt_authsoa(rr_name, rr_class);
1164 return ldns_pkt_query_new_internal(rr_name, LDNS_RR_TYPE_IXFR,
1165 rr_class, flags, authsoa_rr);
1169 ldns_pkt_reply_type(const ldns_pkt *p)
1174 return LDNS_PACKET_UNKNOWN;
1177 if (ldns_pkt_get_rcode(p) == LDNS_RCODE_NXDOMAIN) {
1178 return LDNS_PACKET_NXDOMAIN;
1181 if (ldns_pkt_ancount(p) == 0 && ldns_pkt_arcount(p) == 0
1182 && ldns_pkt_nscount(p) == 1) {
1185 tmp = ldns_pkt_rr_list_by_type(p, LDNS_RR_TYPE_SOA,
1186 LDNS_SECTION_AUTHORITY);
1188 ldns_rr_list_deep_free(tmp);
1189 return LDNS_PACKET_NODATA;
1191 /* I have no idea ... */
1195 if (ldns_pkt_ancount(p) == 0 && ldns_pkt_nscount(p) > 0) {
1196 tmp = ldns_pkt_rr_list_by_type(p, LDNS_RR_TYPE_NS,
1197 LDNS_SECTION_AUTHORITY);
1199 /* there are nameservers here */
1200 ldns_rr_list_deep_free(tmp);
1201 return LDNS_PACKET_REFERRAL;
1203 /* I have no idea */
1205 ldns_rr_list_deep_free(tmp);
1208 /* if we cannot determine the packet type, we say it's an
1211 return LDNS_PACKET_ANSWER;
1215 ldns_pkt_clone(const ldns_pkt *pkt)
1222 new_pkt = ldns_pkt_new();
1224 ldns_pkt_set_id(new_pkt, ldns_pkt_id(pkt));
1225 ldns_pkt_set_qr(new_pkt, ldns_pkt_qr(pkt));
1226 ldns_pkt_set_aa(new_pkt, ldns_pkt_aa(pkt));
1227 ldns_pkt_set_tc(new_pkt, ldns_pkt_tc(pkt));
1228 ldns_pkt_set_rd(new_pkt, ldns_pkt_rd(pkt));
1229 ldns_pkt_set_cd(new_pkt, ldns_pkt_cd(pkt));
1230 ldns_pkt_set_ra(new_pkt, ldns_pkt_ra(pkt));
1231 ldns_pkt_set_ad(new_pkt, ldns_pkt_ad(pkt));
1232 ldns_pkt_set_opcode(new_pkt, ldns_pkt_get_opcode(pkt));
1233 ldns_pkt_set_rcode(new_pkt, ldns_pkt_get_rcode(pkt));
1234 ldns_pkt_set_qdcount(new_pkt, ldns_pkt_qdcount(pkt));
1235 ldns_pkt_set_ancount(new_pkt, ldns_pkt_ancount(pkt));
1236 ldns_pkt_set_nscount(new_pkt, ldns_pkt_nscount(pkt));
1237 ldns_pkt_set_arcount(new_pkt, ldns_pkt_arcount(pkt));
1238 if (ldns_pkt_answerfrom(pkt))
1239 ldns_pkt_set_answerfrom(new_pkt,
1240 ldns_rdf_clone(ldns_pkt_answerfrom(pkt)));
1241 ldns_pkt_set_timestamp(new_pkt, ldns_pkt_timestamp(pkt));
1242 ldns_pkt_set_querytime(new_pkt, ldns_pkt_querytime(pkt));
1243 ldns_pkt_set_size(new_pkt, ldns_pkt_size(pkt));
1244 ldns_pkt_set_tsig(new_pkt, ldns_rr_clone(ldns_pkt_tsig(pkt)));
1246 ldns_pkt_set_edns_udp_size(new_pkt, ldns_pkt_edns_udp_size(pkt));
1247 ldns_pkt_set_edns_extended_rcode(new_pkt,
1248 ldns_pkt_edns_extended_rcode(pkt));
1249 ldns_pkt_set_edns_version(new_pkt, ldns_pkt_edns_version(pkt));
1250 new_pkt->_edns_present = pkt->_edns_present;
1251 ldns_pkt_set_edns_z(new_pkt, ldns_pkt_edns_z(pkt));
1252 if(ldns_pkt_edns_data(pkt))
1253 ldns_pkt_set_edns_data(new_pkt,
1254 ldns_rdf_clone(ldns_pkt_edns_data(pkt)));
1255 ldns_pkt_set_edns_do(new_pkt, ldns_pkt_edns_do(pkt));
1256 if (pkt->_edns_list)
1257 ldns_pkt_set_edns_option_list(new_pkt,
1258 ldns_edns_option_list_clone(pkt->_edns_list));
1260 ldns_rr_list_deep_free(new_pkt->_question);
1261 ldns_rr_list_deep_free(new_pkt->_answer);
1262 ldns_rr_list_deep_free(new_pkt->_authority);
1263 ldns_rr_list_deep_free(new_pkt->_additional);
1264 new_pkt->_question = ldns_rr_list_clone(ldns_pkt_question(pkt));
1265 new_pkt->_answer = ldns_rr_list_clone(ldns_pkt_answer(pkt));
1266 new_pkt->_authority = ldns_rr_list_clone(ldns_pkt_authority(pkt));
1267 new_pkt->_additional = ldns_rr_list_clone(ldns_pkt_additional(pkt));