packet.h
Go to the documentation of this file.
1 /*
2  * packet.h
3  *
4  * DNS packet definitions
5  *
6  * a Net::DNS like library for C
7  *
8  * (c) NLnet Labs, 2005-2006
9  *
10  * See the file LICENSE for the license
11  */
12 
21 #ifndef LDNS_PACKET_H
22 #define LDNS_PACKET_H
23 
24 #define LDNS_MAX_PACKETLEN 65535
25 
26 /* allow flags to be given to mk_query */
27 #define LDNS_QR 1 /* QueRy - query flag */
28 #define LDNS_AA 2 /* Authoritative Answer - server flag */
29 #define LDNS_TC 4 /* TrunCated - server flag */
30 #define LDNS_RD 8 /* Recursion Desired - query flag */
31 #define LDNS_CD 16 /* Checking Disabled - query flag */
32 #define LDNS_RA 32 /* Recursion Available - server flag */
33 #define LDNS_AD 64 /* Authenticated Data - server flag */
34 
35 #include <ldns/error.h>
36 #include <ldns/common.h>
37 #include <ldns/rr.h>
38 #include <sys/time.h>
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 /* opcodes for pkt's */
48  LDNS_PACKET_STATUS = 2, /* there is no 3?? DNS is weird */
51 };
53 
54 /* rcodes for pkts */
67 };
69 
193 {
195  uint16_t _id;
197  bool _qr;
199  bool _aa;
201  bool _tc;
203  bool _rd;
205  bool _cd;
207  bool _ra;
209  bool _ad;
211  ldns_pkt_opcode _opcode; /* XXX 8 bits? */
213  uint8_t _rcode;
215  uint16_t _qdcount;
217  uint16_t _ancount;
219  uint16_t _nscount;
221  uint16_t _arcount;
222 };
223 typedef struct ldns_struct_hdr ldns_hdr;
224 
234 {
237  /* extra items needed in a packet */
241  struct timeval timestamp;
243  uint32_t _querytime;
245  size_t _size;
249  uint16_t _edns_udp_size;
253  uint8_t _edns_version;
255  uint16_t _edns_z;
266 };
267 typedef struct ldns_struct_pkt ldns_pkt;
268 
281 };
283 
294 };
296 
297 /* prototypes */
298 
299 /* read */
300 
306 uint16_t ldns_pkt_id(const ldns_pkt *p);
312 bool ldns_pkt_qr(const ldns_pkt *p);
318 bool ldns_pkt_aa(const ldns_pkt *p);
324 bool ldns_pkt_tc(const ldns_pkt *p);
330 bool ldns_pkt_rd(const ldns_pkt *p);
336 bool ldns_pkt_cd(const ldns_pkt *p);
342 bool ldns_pkt_ra(const ldns_pkt *p);
348 bool ldns_pkt_ad(const ldns_pkt *p);
354 ldns_pkt_opcode ldns_pkt_get_opcode(const ldns_pkt *p);
360 ldns_pkt_rcode ldns_pkt_get_rcode(const ldns_pkt *p);
366 uint16_t ldns_pkt_qdcount(const ldns_pkt *p);
372 uint16_t ldns_pkt_ancount(const ldns_pkt *p);
378 uint16_t ldns_pkt_nscount(const ldns_pkt *p);
384 uint16_t ldns_pkt_arcount(const ldns_pkt *p);
385 
392 
398 struct timeval ldns_pkt_timestamp(const ldns_pkt *p);
404 uint32_t ldns_pkt_querytime(const ldns_pkt *p);
405 
411 size_t ldns_pkt_size(const ldns_pkt *p);
412 
418 ldns_rr *ldns_pkt_tsig(const ldns_pkt *p);
419 
458 
466 ldns_rr_list *ldns_pkt_get_section_clone(const ldns_pkt *p, ldns_pkt_section s);
467 
476 ldns_rr_list *ldns_pkt_rr_list_by_name(ldns_pkt *p, ldns_rdf *r, ldns_pkt_section s);
485 ldns_rr_list *ldns_pkt_rr_list_by_type(const ldns_pkt *p, ldns_rr_type t, ldns_pkt_section s);
495 ldns_rr_list *ldns_pkt_rr_list_by_name_and_type(const ldns_pkt *packet, const ldns_rdf *ownername, ldns_rr_type type, ldns_pkt_section sec);
496 
497 
504 bool ldns_pkt_rr(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr *rr);
505 
506 
513 bool ldns_pkt_set_flags(ldns_pkt *pkt, uint16_t flags);
514 
520 void ldns_pkt_set_id(ldns_pkt *p, uint16_t id);
531 void ldns_pkt_set_qr(ldns_pkt *p, bool b);
537 void ldns_pkt_set_aa(ldns_pkt *p, bool b);
543 void ldns_pkt_set_tc(ldns_pkt *p, bool b);
549 void ldns_pkt_set_rd(ldns_pkt *p, bool b);
555 void ldns_pkt_set_cd(ldns_pkt *p, bool b);
561 void ldns_pkt_set_ra(ldns_pkt *p, bool b);
567 void ldns_pkt_set_ad(ldns_pkt *p, bool b);
568 
574 void ldns_pkt_set_opcode(ldns_pkt *p, ldns_pkt_opcode c);
580 void ldns_pkt_set_rcode(ldns_pkt *p, uint8_t c);
586 void ldns_pkt_set_qdcount(ldns_pkt *p, uint16_t c);
592 void ldns_pkt_set_ancount(ldns_pkt *p, uint16_t c);
598 void ldns_pkt_set_nscount(ldns_pkt *p, uint16_t c);
604 void ldns_pkt_set_arcount(ldns_pkt *p, uint16_t c);
616 void ldns_pkt_set_querytime(ldns_pkt *p, uint32_t t);
622 void ldns_pkt_set_size(ldns_pkt *p, size_t s);
623 
629 void ldns_pkt_set_timestamp(ldns_pkt *p, struct timeval timeval);
636 void ldns_pkt_set_section_count(ldns_pkt *p, ldns_pkt_section s, uint16_t x);
642 void ldns_pkt_set_tsig(ldns_pkt *p, ldns_rr *t);
643 
650 ldns_pkt_type ldns_pkt_reply_type(ldns_pkt *p);
651 
657 uint16_t ldns_pkt_edns_udp_size(const ldns_pkt *packet);
663 uint8_t ldns_pkt_edns_extended_rcode(const ldns_pkt *packet);
669 uint8_t ldns_pkt_edns_version(const ldns_pkt *packet);
675 uint16_t ldns_pkt_edns_z(const ldns_pkt *packet);
681 ldns_rdf *ldns_pkt_edns_data(const ldns_pkt *packet);
682 
688 bool ldns_pkt_edns_do(const ldns_pkt *packet);
694 void ldns_pkt_set_edns_do(ldns_pkt *packet, bool value);
695 
705 bool ldns_pkt_edns(const ldns_pkt *packet);
706 
712 void ldns_pkt_set_edns_udp_size(ldns_pkt *packet, uint16_t s);
718 void ldns_pkt_set_edns_extended_rcode(ldns_pkt *packet, uint8_t c);
724 void ldns_pkt_set_edns_version(ldns_pkt *packet, uint8_t v);
730 void ldns_pkt_set_edns_z(ldns_pkt *packet, uint16_t z);
736 void ldns_pkt_set_edns_data(ldns_pkt *packet, ldns_rdf *data);
737 
743 
749 void ldns_pkt_free(ldns_pkt *packet);
750 
760 ldns_status ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class , uint16_t flags);
761 
770 ldns_pkt *ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class, uint16_t flags);
771 
779 
786 
793 
800 
807 
815 bool ldns_pkt_push_rr(ldns_pkt *packet, ldns_pkt_section section, ldns_rr *rr);
816 
824 bool ldns_pkt_safe_push_rr(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr *rr);
825 
833 bool ldns_pkt_push_rr_list(ldns_pkt *packet, ldns_pkt_section section, ldns_rr_list *list);
834 
842 bool ldns_pkt_safe_push_rr_list(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr_list *list);
843 
849 bool ldns_pkt_empty(ldns_pkt *p);
850 
851 #ifdef __cplusplus
852 }
853 #endif
854 
855 #endif /* LDNS_PACKET_H */