packet.h

Go to the documentation of this file.
00001 /*
00002  * packet.h
00003  *
00004  * DNS packet definitions
00005  *
00006  * a Net::DNS like library for C
00007  *
00008  * (c) NLnet Labs, 2005-2006
00009  *
00010  * See the file LICENSE for the license
00011  */
00012 
00021 #ifndef LDNS_PACKET_H
00022 #define LDNS_PACKET_H
00023 
00024 #define LDNS_MAX_PACKETLEN         65535
00025 
00026 /* allow flags to be given to mk_query */
00027 #define LDNS_QR         1       /* QueRy - query flag */
00028 #define LDNS_AA         2       /* Authoritative Answer - server flag */
00029 #define LDNS_TC         4       /* TrunCated - server flag */
00030 #define LDNS_RD         8       /* Recursion Desired - query flag */
00031 #define LDNS_CD         16      /* Checking Disabled - query flag */
00032 #define LDNS_RA         32      /* Recursion Available - server flag */
00033 #define LDNS_AD         64      /* Authenticated Data - server flag */
00034 
00035 #include <ldns/error.h>
00036 #include <ldns/common.h>
00037 #include <ldns/rr.h>
00038 #include <sys/time.h>
00039 
00040 /* opcodes for pkt's */
00041 enum ldns_enum_pkt_opcode {
00042         LDNS_PACKET_QUERY = 0,
00043         LDNS_PACKET_IQUERY = 1,
00044         LDNS_PACKET_STATUS = 2, /* there is no 3?? DNS is weird */
00045         LDNS_PACKET_NOTIFY = 4,
00046         LDNS_PACKET_UPDATE = 5
00047 };
00048 typedef enum ldns_enum_pkt_opcode ldns_pkt_opcode;
00049 
00050 /* rcodes for pkts */
00051 enum ldns_enum_pkt_rcode {
00052         LDNS_RCODE_NOERROR = 0,
00053         LDNS_RCODE_FORMERR = 1,
00054         LDNS_RCODE_SERVFAIL = 2,
00055         LDNS_RCODE_NXDOMAIN = 3,
00056         LDNS_RCODE_NOTIMPL = 4,
00057         LDNS_RCODE_REFUSED = 5,
00058         LDNS_RCODE_YXDOMAIN = 6,
00059         LDNS_RCODE_YXRRSET = 7,
00060         LDNS_RCODE_NXRRSET = 8,
00061         LDNS_RCODE_NOTAUTH = 9,
00062         LDNS_RCODE_NOTZONE = 10
00063 };
00064 typedef enum ldns_enum_pkt_rcode ldns_pkt_rcode;
00065 
00188 struct ldns_struct_hdr
00189 {
00191         uint16_t _id;
00193         bool _qr;
00195         bool _aa;
00197         bool _tc;
00199         bool _rd;
00201         bool _cd;
00203         bool _ra;
00205         bool _ad;
00207         ldns_pkt_opcode _opcode;         /* XXX 8 bits? */
00209         uint8_t _rcode;
00211         uint16_t _qdcount;
00213         uint16_t _ancount;
00215         uint16_t _nscount;
00217         uint16_t _arcount;
00218 };
00219 typedef struct ldns_struct_hdr ldns_hdr;
00220 
00229 struct ldns_struct_pkt
00230 {
00232         ldns_hdr *_header;
00233         /* extra items needed in a packet */
00235         ldns_rdf *_answerfrom;
00237         struct timeval timestamp;
00239         uint32_t _querytime;
00241         size_t _size;
00243         ldns_rr *_tsig_rr;
00245         uint16_t _edns_udp_size;
00247         uint8_t _edns_extended_rcode;
00249         uint8_t _edns_version;
00251         uint16_t _edns_z;
00253         ldns_rdf *_edns_data;
00255         ldns_rr_list    *_question;
00257         ldns_rr_list    *_answer;
00259         ldns_rr_list    *_authority;
00261         ldns_rr_list    *_additional;
00262 };
00263 typedef struct ldns_struct_pkt ldns_pkt;
00264 
00268 enum ldns_enum_pkt_section {
00269         LDNS_SECTION_QUESTION = 0,
00270         LDNS_SECTION_ANSWER = 1,
00271         LDNS_SECTION_AUTHORITY = 2,
00272         LDNS_SECTION_ADDITIONAL = 3,
00274         LDNS_SECTION_ANY = 4,
00276         LDNS_SECTION_ANY_NOQUESTION = 5
00277 };
00278 typedef enum ldns_enum_pkt_section ldns_pkt_section;    
00279 
00283 enum ldns_enum_pkt_type {
00284         LDNS_PACKET_QUESTION,
00285         LDNS_PACKET_REFERRAL,
00286         LDNS_PACKET_ANSWER,
00287         LDNS_PACKET_NXDOMAIN,
00288         LDNS_PACKET_NODATA,
00289         LDNS_PACKET_UNKNOWN
00290 };
00291 typedef enum ldns_enum_pkt_type ldns_pkt_type;
00292 
00293 /* prototypes */
00294 
00295 /* read */
00296 
00302 uint16_t ldns_pkt_id(const ldns_pkt *p);
00308 bool ldns_pkt_qr(const ldns_pkt *p);
00314 bool ldns_pkt_aa(const ldns_pkt *p);
00320 bool ldns_pkt_tc(const ldns_pkt *p);
00326 bool ldns_pkt_rd(const ldns_pkt *p);
00332 bool ldns_pkt_cd(const ldns_pkt *p);
00338 bool ldns_pkt_ra(const ldns_pkt *p);
00344 bool ldns_pkt_ad(const ldns_pkt *p);
00350 ldns_pkt_opcode ldns_pkt_get_opcode(const ldns_pkt *p);
00356 ldns_pkt_rcode ldns_pkt_get_rcode(const ldns_pkt *p);
00362 uint16_t ldns_pkt_qdcount(const ldns_pkt *p);
00368 uint16_t ldns_pkt_ancount(const ldns_pkt *p);
00374 uint16_t ldns_pkt_nscount(const ldns_pkt *p);
00380 uint16_t ldns_pkt_arcount(const ldns_pkt *p);
00381 
00387 ldns_rdf *ldns_pkt_answerfrom(const ldns_pkt *p);
00388 
00394 struct timeval ldns_pkt_timestamp(const ldns_pkt *p);
00400 uint32_t ldns_pkt_querytime(const ldns_pkt *p);
00401 
00407 size_t ldns_pkt_size(const ldns_pkt *p);
00408 
00414 ldns_rr *ldns_pkt_tsig(const ldns_pkt *p);
00415 
00421 ldns_rr_list *ldns_pkt_question(const ldns_pkt *p);
00427 ldns_rr_list *ldns_pkt_answer(const ldns_pkt *p);
00433 ldns_rr_list *ldns_pkt_authority(const ldns_pkt *p);
00439 ldns_rr_list *ldns_pkt_additional(const ldns_pkt *p);
00440 
00448 ldns_rr_list *ldns_pkt_get_section_clone(ldns_pkt *p, ldns_pkt_section s);
00449 
00458 ldns_rr_list *ldns_pkt_rr_list_by_name(ldns_pkt *p, ldns_rdf *r, ldns_pkt_section s);
00467 ldns_rr_list *ldns_pkt_rr_list_by_type(ldns_pkt *p, ldns_rr_type t, ldns_pkt_section s);
00477 ldns_rr_list *ldns_pkt_rr_list_by_name_and_type(ldns_pkt *packet, ldns_rdf *ownername, ldns_rr_type type, ldns_pkt_section sec);
00478 
00479 
00486 bool ldns_pkt_rr(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr *rr);
00487 
00488 
00495 bool ldns_pkt_set_flags(ldns_pkt *pkt, uint16_t flags);
00496 
00502 void ldns_pkt_set_id(ldns_pkt *p, uint16_t id);
00507 void ldns_pkt_set_random_id(ldns_pkt *p);
00513 void ldns_pkt_set_qr(ldns_pkt *p, bool b);
00519 void ldns_pkt_set_aa(ldns_pkt *p, bool b);
00525 void ldns_pkt_set_tc(ldns_pkt *p, bool b);
00531 void ldns_pkt_set_rd(ldns_pkt *p, bool b);
00537 void ldns_pkt_set_cd(ldns_pkt *p, bool b);
00543 void ldns_pkt_set_ra(ldns_pkt *p, bool b);
00549 void ldns_pkt_set_ad(ldns_pkt *p, bool b);
00550 
00556 void ldns_pkt_set_opcode(ldns_pkt *p, ldns_pkt_opcode c);
00562 void ldns_pkt_set_rcode(ldns_pkt *p, uint8_t c);
00568 void ldns_pkt_set_qdcount(ldns_pkt *p, uint16_t c);
00574 void ldns_pkt_set_ancount(ldns_pkt *p, uint16_t c);
00580 void ldns_pkt_set_nscount(ldns_pkt *p, uint16_t c);
00586 void ldns_pkt_set_arcount(ldns_pkt *p, uint16_t c);
00592 void ldns_pkt_set_answerfrom(ldns_pkt *p, ldns_rdf *r);
00598 void ldns_pkt_set_querytime(ldns_pkt *p, uint32_t t);
00604 void ldns_pkt_set_size(ldns_pkt *p, size_t s);
00605 
00611 void ldns_pkt_set_timestamp(ldns_pkt *p, struct timeval);
00618 void ldns_pkt_set_section_count(ldns_pkt *p, ldns_pkt_section s, uint16_t x);
00624 void ldns_pkt_set_tsig(ldns_pkt *p, ldns_rr *t);
00625 
00632 ldns_pkt_type ldns_pkt_reply_type(ldns_pkt *p);
00633 
00639 uint16_t ldns_pkt_edns_udp_size(const ldns_pkt *packet);
00645 uint8_t ldns_pkt_edns_extended_rcode(const ldns_pkt *packet);
00651 uint8_t ldns_pkt_edns_version(const ldns_pkt *packet);
00657 uint16_t ldns_pkt_edns_z(const ldns_pkt *packet);
00663 ldns_rdf *ldns_pkt_edns_data(const ldns_pkt *packet);
00664 
00670 bool ldns_pkt_edns_do(const ldns_pkt *packet);
00676 void ldns_pkt_set_edns_do(ldns_pkt *packet, bool value);
00677 
00687 bool ldns_pkt_edns(const ldns_pkt *packet);
00688 
00694 void ldns_pkt_set_edns_udp_size(ldns_pkt *packet, uint16_t s);
00700 void ldns_pkt_set_edns_extended_rcode(ldns_pkt *packet, uint8_t c);
00706 void ldns_pkt_set_edns_version(ldns_pkt *packet, uint8_t v);
00712 void ldns_pkt_set_edns_z(ldns_pkt *packet, uint16_t z);
00718 void ldns_pkt_set_edns_data(ldns_pkt *packet, ldns_rdf *data);
00719 
00724 ldns_pkt *ldns_pkt_new();
00725 
00731 void ldns_pkt_free(ldns_pkt *packet);
00732 
00742 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);
00743 
00752 ldns_pkt *ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class, uint16_t flags);
00753 
00760 ldns_pkt *ldns_pkt_clone(ldns_pkt *pkt);
00761 
00767 void ldns_pkt_set_additional(ldns_pkt *p, ldns_rr_list *rr);
00768 
00774 void ldns_pkt_set_answer(ldns_pkt *p, ldns_rr_list *rr);
00775 
00781 void ldns_pkt_set_question(ldns_pkt *p, ldns_rr_list *rr);
00782 
00788 void ldns_pkt_set_authority(ldns_pkt *p, ldns_rr_list *rr);
00789 
00797 bool ldns_pkt_push_rr(ldns_pkt *packet, ldns_pkt_section section, ldns_rr *rr);
00798 
00806 bool ldns_pkt_safe_push_rr(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr *rr);
00807 
00815 bool ldns_pkt_push_rr_list(ldns_pkt *packet, ldns_pkt_section section, ldns_rr_list *list);
00816 
00824 bool ldns_pkt_safe_push_rr_list(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr_list *list);
00825 
00831 bool ldns_pkt_empty(ldns_pkt *p);
00832 
00833 #endif  /* LDNS_PACKET_H */

Generated on Wed Feb 20 20:24:22 2008 for ldns by  doxygen 1.5.5