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>
21 #include <openssl/rand.h>
25 * do this as functions to get type checking
28 #define LDNS_EDNS_MASK_DO_BIT 0x8000
30 /* TODO defines for 3600 */
31 /* convert to and from numerical flag values */
32 ldns_lookup_table ldns_edns_flags[] = {
39 ldns_pkt_id(const ldns_pkt *packet)
41 return packet->_header->_id;
45 ldns_pkt_qr(const ldns_pkt *packet)
47 return packet->_header->_qr;
51 ldns_pkt_aa(const ldns_pkt *packet)
53 return packet->_header->_aa;
57 ldns_pkt_tc(const ldns_pkt *packet)
59 return packet->_header->_tc;
63 ldns_pkt_rd(const ldns_pkt *packet)
65 return packet->_header->_rd;
69 ldns_pkt_cd(const ldns_pkt *packet)
71 return packet->_header->_cd;
75 ldns_pkt_ra(const ldns_pkt *packet)
77 return packet->_header->_ra;
81 ldns_pkt_ad(const ldns_pkt *packet)
83 return packet->_header->_ad;
87 ldns_pkt_get_opcode(const ldns_pkt *packet)
89 return packet->_header->_opcode;
93 ldns_pkt_get_rcode(const ldns_pkt *packet)
95 return packet->_header->_rcode;
99 ldns_pkt_qdcount(const ldns_pkt *packet)
101 return packet->_header->_qdcount;
105 ldns_pkt_ancount(const ldns_pkt *packet)
107 return packet->_header->_ancount;
111 ldns_pkt_nscount(const ldns_pkt *packet)
113 return packet->_header->_nscount;
117 ldns_pkt_arcount(const ldns_pkt *packet)
119 return packet->_header->_arcount;
123 ldns_pkt_question(const ldns_pkt *packet)
125 return packet->_question;
129 ldns_pkt_answer(const ldns_pkt *packet)
131 return packet->_answer;
135 ldns_pkt_authority(const ldns_pkt *packet)
137 return packet->_authority;
141 ldns_pkt_additional(const ldns_pkt *packet)
143 return packet->_additional;
146 /* return ALL section concatenated */
148 ldns_pkt_all(const ldns_pkt *packet)
150 ldns_rr_list *all, *prev_all;
152 all = ldns_rr_list_cat_clone(
153 ldns_pkt_question(packet),
154 ldns_pkt_answer(packet));
156 all = ldns_rr_list_cat_clone(all,
157 ldns_pkt_authority(packet));
158 ldns_rr_list_deep_free(prev_all);
160 all = ldns_rr_list_cat_clone(all,
161 ldns_pkt_additional(packet));
162 ldns_rr_list_deep_free(prev_all);
167 ldns_pkt_all_noquestion(const ldns_pkt *packet)
169 ldns_rr_list *all, *all2;
171 all = ldns_rr_list_cat_clone(
172 ldns_pkt_answer(packet),
173 ldns_pkt_authority(packet));
174 all2 = ldns_rr_list_cat_clone(all,
175 ldns_pkt_additional(packet));
177 ldns_rr_list_deep_free(all);
182 ldns_pkt_size(const ldns_pkt *packet)
184 return packet->_size;
188 ldns_pkt_querytime(const ldns_pkt *packet)
190 return packet->_querytime;
194 ldns_pkt_answerfrom(const ldns_pkt *packet)
196 return packet->_answerfrom;
200 ldns_pkt_timestamp(const ldns_pkt *packet)
202 return packet->timestamp;
206 ldns_pkt_edns_udp_size(const ldns_pkt *packet)
208 return packet->_edns_udp_size;
212 ldns_pkt_edns_extended_rcode(const ldns_pkt *packet)
214 return packet->_edns_extended_rcode;
218 ldns_pkt_edns_version(const ldns_pkt *packet)
220 return packet->_edns_version;
224 ldns_pkt_edns_z(const ldns_pkt *packet)
226 return packet->_edns_z;
230 ldns_pkt_edns_do(const ldns_pkt *packet)
232 return (packet->_edns_z & LDNS_EDNS_MASK_DO_BIT);
236 ldns_pkt_set_edns_do(ldns_pkt *packet, bool value)
239 packet->_edns_z = packet->_edns_z | LDNS_EDNS_MASK_DO_BIT;
241 packet->_edns_z = packet->_edns_z & ~LDNS_EDNS_MASK_DO_BIT;
246 ldns_pkt_edns_data(const ldns_pkt *packet)
248 return packet->_edns_data;
251 /* return only those rr that share the ownername */
253 ldns_pkt_rr_list_by_name(ldns_pkt *packet,
255 ldns_pkt_section sec)
266 rrs = ldns_pkt_get_section_clone(packet, sec);
267 new = ldns_rr_list_new();
270 for(i = 0; i < ldns_rr_list_rr_count(rrs); i++) {
271 if (ldns_rdf_compare(ldns_rr_owner(
272 ldns_rr_list_rr(rrs, i)),
274 /* owner names match */
275 ldns_rr_list_push_rr(new, ldns_rr_list_rr(rrs, i));
282 /* return only those rr that share a type */
284 ldns_pkt_rr_list_by_type(const ldns_pkt *packet,
286 ldns_pkt_section sec)
296 rrs = ldns_pkt_get_section_clone(packet, sec);
297 new = ldns_rr_list_new();
299 for(i = 0; i < ldns_rr_list_rr_count(rrs); i++) {
300 if (type == ldns_rr_get_type(ldns_rr_list_rr(rrs, i))) {
302 ldns_rr_list_push_rr(new,
304 ldns_rr_list_rr(rrs, i))
308 ldns_rr_list_deep_free(rrs);
310 if (ldns_rr_list_rr_count(new) == 0) {
311 ldns_rr_list_free(new);
318 /* return only those rrs that share name and type */
320 ldns_pkt_rr_list_by_name_and_type(const ldns_pkt *packet,
321 const ldns_rdf *ownername,
323 ldns_pkt_section sec)
334 rrs = ldns_pkt_get_section_clone(packet, sec);
335 new = ldns_rr_list_new();
338 for(i = 0; i < ldns_rr_list_rr_count(rrs); i++) {
339 if (type == ldns_rr_get_type(ldns_rr_list_rr(rrs, i)) &&
340 ldns_rdf_compare(ldns_rr_owner(ldns_rr_list_rr(rrs, i)),
345 ldns_rr_list_push_rr(new, ldns_rr_clone(ldns_rr_list_rr(rrs, i)));
349 ldns_rr_list_deep_free(rrs);
351 ldns_rr_list_free(new);
357 ldns_pkt_rr(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr *rr)
362 case LDNS_SECTION_QUESTION:
363 return ldns_rr_list_contains_rr(ldns_pkt_question(pkt), rr);
364 case LDNS_SECTION_ANSWER:
365 return ldns_rr_list_contains_rr(ldns_pkt_answer(pkt), rr);
366 case LDNS_SECTION_AUTHORITY:
367 return ldns_rr_list_contains_rr(ldns_pkt_authority(pkt), rr);
368 case LDNS_SECTION_ADDITIONAL:
369 return ldns_rr_list_contains_rr(ldns_pkt_additional(pkt), rr);
370 case LDNS_SECTION_ANY:
371 result = ldns_rr_list_contains_rr(ldns_pkt_question(pkt), rr);
372 case LDNS_SECTION_ANY_NOQUESTION:
374 || ldns_rr_list_contains_rr(ldns_pkt_answer(pkt), rr)
375 || ldns_rr_list_contains_rr(ldns_pkt_authority(pkt), rr)
376 || ldns_rr_list_contains_rr(ldns_pkt_additional(pkt), rr);
383 ldns_pkt_section_count(const ldns_pkt *packet, ldns_pkt_section s)
386 case LDNS_SECTION_QUESTION:
387 return ldns_pkt_qdcount(packet);
388 case LDNS_SECTION_ANSWER:
389 return ldns_pkt_ancount(packet);
390 case LDNS_SECTION_AUTHORITY:
391 return ldns_pkt_nscount(packet);
392 case LDNS_SECTION_ADDITIONAL:
393 return ldns_pkt_arcount(packet);
394 case LDNS_SECTION_ANY:
395 return ldns_pkt_qdcount(packet) +
396 ldns_pkt_ancount(packet) +
397 ldns_pkt_nscount(packet) +
398 ldns_pkt_arcount(packet);
399 case LDNS_SECTION_ANY_NOQUESTION:
400 return ldns_pkt_ancount(packet) +
401 ldns_pkt_nscount(packet) +
402 ldns_pkt_arcount(packet);
409 ldns_pkt_empty(ldns_pkt *p)
412 return true; /* NULL is empty? */
414 if (ldns_pkt_section_count(p, LDNS_SECTION_ANY) > 0) {
422 ldns_pkt_get_section_clone(const ldns_pkt *packet, ldns_pkt_section s)
425 case LDNS_SECTION_QUESTION:
426 return ldns_rr_list_clone(ldns_pkt_question(packet));
427 case LDNS_SECTION_ANSWER:
428 return ldns_rr_list_clone(ldns_pkt_answer(packet));
429 case LDNS_SECTION_AUTHORITY:
430 return ldns_rr_list_clone(ldns_pkt_authority(packet));
431 case LDNS_SECTION_ADDITIONAL:
432 return ldns_rr_list_clone(ldns_pkt_additional(packet));
433 case LDNS_SECTION_ANY:
434 /* these are already clones */
435 return ldns_pkt_all(packet);
436 case LDNS_SECTION_ANY_NOQUESTION:
437 return ldns_pkt_all_noquestion(packet);
443 ldns_rr *ldns_pkt_tsig(const ldns_pkt *pkt) {
444 return pkt->_tsig_rr;
449 ldns_pkt_set_id(ldns_pkt *packet, uint16_t id)
451 packet->_header->_id = id;
455 ldns_pkt_set_random_id(ldns_pkt *packet)
459 if (RAND_bytes((unsigned char*)&rid, 2) != 1) {
460 rid = (uint16_t) random();
463 rid = (uint16_t) random();
465 ldns_pkt_set_id(packet, rid);
470 ldns_pkt_set_qr(ldns_pkt *packet, bool qr)
472 packet->_header->_qr = qr;
476 ldns_pkt_set_aa(ldns_pkt *packet, bool aa)
478 packet->_header->_aa = aa;
482 ldns_pkt_set_tc(ldns_pkt *packet, bool tc)
484 packet->_header->_tc = tc;
488 ldns_pkt_set_rd(ldns_pkt *packet, bool rd)
490 packet->_header->_rd = rd;
494 ldns_pkt_set_additional(ldns_pkt *p, ldns_rr_list *rr)
500 ldns_pkt_set_question(ldns_pkt *p, ldns_rr_list *rr)
506 ldns_pkt_set_answer(ldns_pkt *p, ldns_rr_list *rr)
512 ldns_pkt_set_authority(ldns_pkt *p, ldns_rr_list *rr)
518 ldns_pkt_set_cd(ldns_pkt *packet, bool cd)
520 packet->_header->_cd = cd;
524 ldns_pkt_set_ra(ldns_pkt *packet, bool ra)
526 packet->_header->_ra = ra;
530 ldns_pkt_set_ad(ldns_pkt *packet, bool ad)
532 packet->_header->_ad = ad;
536 ldns_pkt_set_opcode(ldns_pkt *packet, ldns_pkt_opcode opcode)
538 packet->_header->_opcode = opcode;
542 ldns_pkt_set_rcode(ldns_pkt *packet, uint8_t rcode)
544 packet->_header->_rcode = rcode;
548 ldns_pkt_set_qdcount(ldns_pkt *packet, uint16_t qdcount)
550 packet->_header->_qdcount = qdcount;
554 ldns_pkt_set_ancount(ldns_pkt *packet, uint16_t ancount)
556 packet->_header->_ancount = ancount;
560 ldns_pkt_set_nscount(ldns_pkt *packet, uint16_t nscount)
562 packet->_header->_nscount = nscount;
566 ldns_pkt_set_arcount(ldns_pkt *packet, uint16_t arcount)
568 packet->_header->_arcount = arcount;
572 ldns_pkt_set_querytime(ldns_pkt *packet, uint32_t time)
574 packet->_querytime = time;
578 ldns_pkt_set_answerfrom(ldns_pkt *packet, ldns_rdf *answerfrom)
580 packet->_answerfrom = answerfrom;
584 ldns_pkt_set_timestamp(ldns_pkt *packet, struct timeval timeval)
586 packet->timestamp.tv_sec = timeval.tv_sec;
587 packet->timestamp.tv_usec = timeval.tv_usec;
591 ldns_pkt_set_size(ldns_pkt *packet, size_t s)
597 ldns_pkt_set_edns_udp_size(ldns_pkt *packet, uint16_t s)
599 packet->_edns_udp_size = s;
603 ldns_pkt_set_edns_extended_rcode(ldns_pkt *packet, uint8_t c)
605 packet->_edns_extended_rcode = c;
609 ldns_pkt_set_edns_version(ldns_pkt *packet, uint8_t v)
611 packet->_edns_version = v;
615 ldns_pkt_set_edns_z(ldns_pkt *packet, uint16_t z)
621 ldns_pkt_set_edns_data(ldns_pkt *packet, ldns_rdf *data)
623 packet->_edns_data = data;
627 ldns_pkt_set_section_count(ldns_pkt *packet, ldns_pkt_section s, uint16_t count)
630 case LDNS_SECTION_QUESTION:
631 ldns_pkt_set_qdcount(packet, count);
633 case LDNS_SECTION_ANSWER:
634 ldns_pkt_set_ancount(packet, count);
636 case LDNS_SECTION_AUTHORITY:
637 ldns_pkt_set_nscount(packet, count);
639 case LDNS_SECTION_ADDITIONAL:
640 ldns_pkt_set_arcount(packet, count);
642 case LDNS_SECTION_ANY:
643 case LDNS_SECTION_ANY_NOQUESTION:
648 void ldns_pkt_set_tsig(ldns_pkt *pkt, ldns_rr *rr)
654 ldns_pkt_push_rr(ldns_pkt *packet, ldns_pkt_section section, ldns_rr *rr)
657 case LDNS_SECTION_QUESTION:
658 ldns_rr_list_push_rr(ldns_pkt_question(packet), rr);
659 ldns_pkt_set_qdcount(packet, ldns_pkt_qdcount(packet) + 1);
661 case LDNS_SECTION_ANSWER:
662 ldns_rr_list_push_rr(ldns_pkt_answer(packet), rr);
663 ldns_pkt_set_ancount(packet, ldns_pkt_ancount(packet) + 1);
665 case LDNS_SECTION_AUTHORITY:
666 ldns_rr_list_push_rr(ldns_pkt_authority(packet), rr);
667 ldns_pkt_set_nscount(packet, ldns_pkt_nscount(packet) + 1);
669 case LDNS_SECTION_ADDITIONAL:
670 ldns_rr_list_push_rr(ldns_pkt_additional(packet), rr);
671 ldns_pkt_set_arcount(packet, ldns_pkt_arcount(packet) + 1);
673 case LDNS_SECTION_ANY:
674 case LDNS_SECTION_ANY_NOQUESTION:
675 /* shouldn't this error? */
682 ldns_pkt_safe_push_rr(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr *rr)
685 /* check to see if its there */
686 if (ldns_pkt_rr(pkt, sec, rr)) {
690 return ldns_pkt_push_rr(pkt, sec, rr);
694 ldns_pkt_push_rr_list(ldns_pkt *p, ldns_pkt_section s, ldns_rr_list *list)
697 for(i = 0; i < ldns_rr_list_rr_count(list); i++) {
698 if (!ldns_pkt_push_rr(p, s, ldns_rr_list_rr(list, i))) {
706 ldns_pkt_safe_push_rr_list(ldns_pkt *p, ldns_pkt_section s, ldns_rr_list *list)
709 for(i = 0; i < ldns_rr_list_rr_count(list); i++) {
710 if (!ldns_pkt_safe_push_rr(p, s, ldns_rr_list_rr(list, i))) {
718 ldns_pkt_edns(const ldns_pkt *pkt) {
719 return (ldns_pkt_edns_udp_size(pkt) > 0 ||
720 ldns_pkt_edns_extended_rcode(pkt) > 0 ||
721 ldns_pkt_edns_data(pkt) ||
722 ldns_pkt_edns_do(pkt)
727 /* Create/destroy/convert functions
733 packet = LDNS_MALLOC(ldns_pkt);
738 packet->_header = LDNS_MALLOC(ldns_hdr);
739 if (!packet->_header) {
744 packet->_question = ldns_rr_list_new();
745 packet->_answer = ldns_rr_list_new();
746 packet->_authority = ldns_rr_list_new();
747 packet->_additional = ldns_rr_list_new();
749 /* default everything to false */
750 ldns_pkt_set_qr(packet, false);
751 ldns_pkt_set_aa(packet, false);
752 ldns_pkt_set_tc(packet, false);
753 ldns_pkt_set_rd(packet, false);
754 ldns_pkt_set_ra(packet, false);
755 ldns_pkt_set_ad(packet, false);
756 ldns_pkt_set_cd(packet, false);
758 ldns_pkt_set_opcode(packet, LDNS_PACKET_QUERY);
759 ldns_pkt_set_rcode(packet, 0);
760 ldns_pkt_set_id(packet, 0);
761 ldns_pkt_set_size(packet, 0);
762 ldns_pkt_set_querytime(packet, 0);
763 memset(&packet->timestamp, 0, sizeof(packet->timestamp));
764 ldns_pkt_set_answerfrom(packet, NULL);
765 ldns_pkt_set_section_count(packet, LDNS_SECTION_QUESTION, 0);
766 ldns_pkt_set_section_count(packet, LDNS_SECTION_ANSWER, 0);
767 ldns_pkt_set_section_count(packet, LDNS_SECTION_AUTHORITY, 0);
768 ldns_pkt_set_section_count(packet, LDNS_SECTION_ADDITIONAL, 0);
770 ldns_pkt_set_edns_udp_size(packet, 0);
771 ldns_pkt_set_edns_extended_rcode(packet, 0);
772 ldns_pkt_set_edns_version(packet, 0);
773 ldns_pkt_set_edns_z(packet, 0);
774 ldns_pkt_set_edns_data(packet, NULL);
776 ldns_pkt_set_tsig(packet, NULL);
782 ldns_pkt_free(ldns_pkt *packet)
785 LDNS_FREE(packet->_header);
786 ldns_rr_list_deep_free(packet->_question);
787 ldns_rr_list_deep_free(packet->_answer);
788 ldns_rr_list_deep_free(packet->_authority);
789 ldns_rr_list_deep_free(packet->_additional);
790 ldns_rr_free(packet->_tsig_rr);
791 ldns_rdf_deep_free(packet->_edns_data);
797 ldns_pkt_set_flags(ldns_pkt *packet, uint16_t flags)
802 if ((flags & LDNS_QR) == LDNS_QR) {
803 ldns_pkt_set_qr(packet, true);
805 if ((flags & LDNS_AA) == LDNS_AA) {
806 ldns_pkt_set_aa(packet, true);
808 if ((flags & LDNS_RD) == LDNS_RD) {
809 ldns_pkt_set_rd(packet, true);
811 if ((flags & LDNS_TC) == LDNS_TC) {
812 ldns_pkt_set_tc(packet, true);
814 if ((flags & LDNS_CD) == LDNS_CD) {
815 ldns_pkt_set_cd(packet, true);
817 if ((flags & LDNS_RA) == LDNS_RA) {
818 ldns_pkt_set_ra(packet, true);
820 if ((flags & LDNS_AD) == LDNS_AD) {
821 ldns_pkt_set_ad(packet, true);
827 ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *name, ldns_rr_type rr_type,
828 ldns_rr_class rr_class, uint16_t flags)
831 ldns_rr *question_rr;
834 packet = ldns_pkt_new();
836 return LDNS_STATUS_MEM_ERR;
839 if (!ldns_pkt_set_flags(packet, flags)) {
840 return LDNS_STATUS_ERR;
843 question_rr = ldns_rr_new();
845 return LDNS_STATUS_MEM_ERR;
849 rr_type = LDNS_RR_TYPE_A;
852 rr_class = LDNS_RR_CLASS_IN;
855 if (ldns_str2rdf_dname(&name_rdf, name) == LDNS_STATUS_OK) {
856 ldns_rr_set_owner(question_rr, name_rdf);
857 ldns_rr_set_type(question_rr, rr_type);
858 ldns_rr_set_class(question_rr, rr_class);
859 ldns_rr_set_question(question_rr, true);
861 ldns_pkt_push_rr(packet, LDNS_SECTION_QUESTION, question_rr);
863 ldns_rr_free(question_rr);
864 ldns_pkt_free(packet);
865 return LDNS_STATUS_ERR;
868 packet->_tsig_rr = NULL;
870 ldns_pkt_set_answerfrom(packet, NULL);
873 return LDNS_STATUS_OK;
875 return LDNS_STATUS_NULL;
880 ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class,
884 ldns_rr *question_rr;
886 packet = ldns_pkt_new();
891 if (!ldns_pkt_set_flags(packet, flags)) {
895 question_rr = ldns_rr_new();
901 rr_type = LDNS_RR_TYPE_A;
904 rr_class = LDNS_RR_CLASS_IN;
907 ldns_rr_set_owner(question_rr, rr_name);
908 ldns_rr_set_type(question_rr, rr_type);
909 ldns_rr_set_class(question_rr, rr_class);
910 ldns_rr_set_question(question_rr, true);
912 packet->_tsig_rr = NULL;
914 ldns_pkt_push_rr(packet, LDNS_SECTION_QUESTION, question_rr);
920 ldns_pkt_reply_type(ldns_pkt *p)
925 return LDNS_PACKET_UNKNOWN;
928 if (ldns_pkt_get_rcode(p) == LDNS_RCODE_NXDOMAIN) {
929 return LDNS_PACKET_NXDOMAIN;
932 if (ldns_pkt_ancount(p) == 0 && ldns_pkt_arcount(p) == 0
933 && ldns_pkt_nscount(p) == 1) {
936 tmp = ldns_pkt_rr_list_by_type(p, LDNS_RR_TYPE_SOA,
937 LDNS_SECTION_AUTHORITY);
939 ldns_rr_list_deep_free(tmp);
940 return LDNS_PACKET_NODATA;
942 /* I have no idea ... */
946 if (ldns_pkt_ancount(p) == 0 && ldns_pkt_nscount(p) > 0) {
947 tmp = ldns_pkt_rr_list_by_type(p, LDNS_RR_TYPE_NS,
948 LDNS_SECTION_AUTHORITY);
950 /* there are nameservers here */
951 ldns_rr_list_deep_free(tmp);
952 return LDNS_PACKET_REFERRAL;
956 ldns_rr_list_deep_free(tmp);
959 /* if we cannot determine the packet type, we say it's an
962 return LDNS_PACKET_ANSWER;
966 ldns_pkt_clone(ldns_pkt *pkt)
973 new_pkt = ldns_pkt_new();
975 ldns_pkt_set_id(new_pkt, ldns_pkt_id(pkt));
976 ldns_pkt_set_qr(new_pkt, ldns_pkt_qr(pkt));
977 ldns_pkt_set_aa(new_pkt, ldns_pkt_aa(pkt));
978 ldns_pkt_set_tc(new_pkt, ldns_pkt_tc(pkt));
979 ldns_pkt_set_rd(new_pkt, ldns_pkt_rd(pkt));
980 ldns_pkt_set_cd(new_pkt, ldns_pkt_cd(pkt));
981 ldns_pkt_set_ra(new_pkt, ldns_pkt_ra(pkt));
982 ldns_pkt_set_ad(new_pkt, ldns_pkt_ad(pkt));
983 ldns_pkt_set_opcode(new_pkt, ldns_pkt_get_opcode(pkt));
984 ldns_pkt_set_rcode(new_pkt, ldns_pkt_get_rcode(pkt));
985 ldns_pkt_set_qdcount(new_pkt, ldns_pkt_qdcount(pkt));
986 ldns_pkt_set_ancount(new_pkt, ldns_pkt_ancount(pkt));
987 ldns_pkt_set_nscount(new_pkt, ldns_pkt_nscount(pkt));
988 ldns_pkt_set_arcount(new_pkt, ldns_pkt_arcount(pkt));
989 ldns_pkt_set_answerfrom(new_pkt, ldns_pkt_answerfrom(pkt));
990 ldns_pkt_set_querytime(new_pkt, ldns_pkt_querytime(pkt));
991 ldns_pkt_set_size(new_pkt, ldns_pkt_size(pkt));
992 ldns_pkt_set_tsig(new_pkt, ldns_pkt_tsig(pkt));
994 ldns_pkt_set_edns_udp_size(new_pkt, ldns_pkt_edns_udp_size(pkt));
995 ldns_pkt_set_edns_extended_rcode(new_pkt,
996 ldns_pkt_edns_extended_rcode(pkt));
997 ldns_pkt_set_edns_version(new_pkt, ldns_pkt_edns_version(pkt));
998 ldns_pkt_set_edns_z(new_pkt, ldns_pkt_edns_z(pkt));
999 if(ldns_pkt_edns_data(pkt))
1000 ldns_pkt_set_edns_data(new_pkt,
1001 ldns_rdf_clone(ldns_pkt_edns_data(pkt)));
1002 ldns_pkt_set_edns_do(new_pkt, ldns_pkt_edns_do(pkt));
1004 ldns_rr_list_deep_free(new_pkt->_question);
1005 ldns_rr_list_deep_free(new_pkt->_answer);
1006 ldns_rr_list_deep_free(new_pkt->_authority);
1007 ldns_rr_list_deep_free(new_pkt->_additional);
1008 new_pkt->_question = ldns_rr_list_clone(ldns_pkt_question(pkt));
1009 new_pkt->_answer = ldns_rr_list_clone(ldns_pkt_answer(pkt));
1010 new_pkt->_authority = ldns_rr_list_clone(ldns_pkt_authority(pkt));
1011 new_pkt->_additional = ldns_rr_list_clone(ldns_pkt_additional(pkt));