00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00021 #ifndef LDNS_PACKET_H
00022 #define LDNS_PACKET_H
00023
00024 #define LDNS_MAX_PACKETLEN 65535
00025
00026
00027 #define LDNS_QR 1
00028 #define LDNS_AA 2
00029 #define LDNS_TC 4
00030 #define LDNS_RD 8
00031 #define LDNS_CD 16
00032 #define LDNS_RA 32
00033 #define LDNS_AD 64
00034
00035 #include <ldns/error.h>
00036 #include <ldns/common.h>
00037 #include <ldns/rr.h>
00038 #include <sys/time.h>
00039
00040 #ifdef __cplusplus
00041 extern "C" {
00042 #endif
00043
00044
00045 enum ldns_enum_pkt_opcode {
00046 LDNS_PACKET_QUERY = 0,
00047 LDNS_PACKET_IQUERY = 1,
00048 LDNS_PACKET_STATUS = 2,
00049 LDNS_PACKET_NOTIFY = 4,
00050 LDNS_PACKET_UPDATE = 5
00051 };
00052 typedef enum ldns_enum_pkt_opcode ldns_pkt_opcode;
00053
00054
00055 enum ldns_enum_pkt_rcode {
00056 LDNS_RCODE_NOERROR = 0,
00057 LDNS_RCODE_FORMERR = 1,
00058 LDNS_RCODE_SERVFAIL = 2,
00059 LDNS_RCODE_NXDOMAIN = 3,
00060 LDNS_RCODE_NOTIMPL = 4,
00061 LDNS_RCODE_REFUSED = 5,
00062 LDNS_RCODE_YXDOMAIN = 6,
00063 LDNS_RCODE_YXRRSET = 7,
00064 LDNS_RCODE_NXRRSET = 8,
00065 LDNS_RCODE_NOTAUTH = 9,
00066 LDNS_RCODE_NOTZONE = 10
00067 };
00068 typedef enum ldns_enum_pkt_rcode ldns_pkt_rcode;
00069
00192 struct ldns_struct_hdr
00193 {
00195 uint16_t _id;
00197 bool _qr;
00199 bool _aa;
00201 bool _tc;
00203 bool _rd;
00205 bool _cd;
00207 bool _ra;
00209 bool _ad;
00211 ldns_pkt_opcode _opcode;
00213 uint8_t _rcode;
00215 uint16_t _qdcount;
00217 uint16_t _ancount;
00219 uint16_t _nscount;
00221 uint16_t _arcount;
00222 };
00223 typedef struct ldns_struct_hdr ldns_hdr;
00224
00233 struct ldns_struct_pkt
00234 {
00236 ldns_hdr *_header;
00237
00239 ldns_rdf *_answerfrom;
00241 struct timeval timestamp;
00243 uint32_t _querytime;
00245 size_t _size;
00247 ldns_rr *_tsig_rr;
00249 uint16_t _edns_udp_size;
00251 uint8_t _edns_extended_rcode;
00253 uint8_t _edns_version;
00255 uint16_t _edns_z;
00257 ldns_rdf *_edns_data;
00259 ldns_rr_list *_question;
00261 ldns_rr_list *_answer;
00263 ldns_rr_list *_authority;
00265 ldns_rr_list *_additional;
00266 };
00267 typedef struct ldns_struct_pkt ldns_pkt;
00268
00272 enum ldns_enum_pkt_section {
00273 LDNS_SECTION_QUESTION = 0,
00274 LDNS_SECTION_ANSWER = 1,
00275 LDNS_SECTION_AUTHORITY = 2,
00276 LDNS_SECTION_ADDITIONAL = 3,
00278 LDNS_SECTION_ANY = 4,
00280 LDNS_SECTION_ANY_NOQUESTION = 5
00281 };
00282 typedef enum ldns_enum_pkt_section ldns_pkt_section;
00283
00287 enum ldns_enum_pkt_type {
00288 LDNS_PACKET_QUESTION,
00289 LDNS_PACKET_REFERRAL,
00290 LDNS_PACKET_ANSWER,
00291 LDNS_PACKET_NXDOMAIN,
00292 LDNS_PACKET_NODATA,
00293 LDNS_PACKET_UNKNOWN
00294 };
00295 typedef enum ldns_enum_pkt_type ldns_pkt_type;
00296
00297
00298
00299
00300
00306 uint16_t ldns_pkt_id(const ldns_pkt *p);
00312 bool ldns_pkt_qr(const ldns_pkt *p);
00318 bool ldns_pkt_aa(const ldns_pkt *p);
00324 bool ldns_pkt_tc(const ldns_pkt *p);
00330 bool ldns_pkt_rd(const ldns_pkt *p);
00336 bool ldns_pkt_cd(const ldns_pkt *p);
00342 bool ldns_pkt_ra(const ldns_pkt *p);
00348 bool ldns_pkt_ad(const ldns_pkt *p);
00354 ldns_pkt_opcode ldns_pkt_get_opcode(const ldns_pkt *p);
00360 ldns_pkt_rcode ldns_pkt_get_rcode(const ldns_pkt *p);
00366 uint16_t ldns_pkt_qdcount(const ldns_pkt *p);
00372 uint16_t ldns_pkt_ancount(const ldns_pkt *p);
00378 uint16_t ldns_pkt_nscount(const ldns_pkt *p);
00384 uint16_t ldns_pkt_arcount(const ldns_pkt *p);
00385
00391 ldns_rdf *ldns_pkt_answerfrom(const ldns_pkt *p);
00392
00398 struct timeval ldns_pkt_timestamp(const ldns_pkt *p);
00404 uint32_t ldns_pkt_querytime(const ldns_pkt *p);
00405
00411 size_t ldns_pkt_size(const ldns_pkt *p);
00412
00422 uint16_t ldns_pkt_section_count(const ldns_pkt *p, ldns_pkt_section s);
00423
00429 ldns_rr *ldns_pkt_tsig(const ldns_pkt *p);
00430
00436 ldns_rr_list *ldns_pkt_question(const ldns_pkt *p);
00442 ldns_rr_list *ldns_pkt_answer(const ldns_pkt *p);
00448 ldns_rr_list *ldns_pkt_authority(const ldns_pkt *p);
00454 ldns_rr_list *ldns_pkt_additional(const ldns_pkt *p);
00461 ldns_rr_list *ldns_pkt_all(const ldns_pkt *p);
00468 ldns_rr_list *ldns_pkt_all_noquestion(const ldns_pkt *p);
00469
00477 ldns_rr_list *ldns_pkt_get_section_clone(const ldns_pkt *p, ldns_pkt_section s);
00478
00487 ldns_rr_list *ldns_pkt_rr_list_by_name(ldns_pkt *p, ldns_rdf *r, ldns_pkt_section s);
00496 ldns_rr_list *ldns_pkt_rr_list_by_type(const ldns_pkt *p, ldns_rr_type t, ldns_pkt_section s);
00506 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);
00507
00508
00515 bool ldns_pkt_rr(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr *rr);
00516
00517
00524 bool ldns_pkt_set_flags(ldns_pkt *pkt, uint16_t flags);
00525
00531 void ldns_pkt_set_id(ldns_pkt *p, uint16_t id);
00536 void ldns_pkt_set_random_id(ldns_pkt *p);
00542 void ldns_pkt_set_qr(ldns_pkt *p, bool b);
00548 void ldns_pkt_set_aa(ldns_pkt *p, bool b);
00554 void ldns_pkt_set_tc(ldns_pkt *p, bool b);
00560 void ldns_pkt_set_rd(ldns_pkt *p, bool b);
00566 void ldns_pkt_set_cd(ldns_pkt *p, bool b);
00572 void ldns_pkt_set_ra(ldns_pkt *p, bool b);
00578 void ldns_pkt_set_ad(ldns_pkt *p, bool b);
00579
00585 void ldns_pkt_set_opcode(ldns_pkt *p, ldns_pkt_opcode c);
00591 void ldns_pkt_set_rcode(ldns_pkt *p, uint8_t c);
00597 void ldns_pkt_set_qdcount(ldns_pkt *p, uint16_t c);
00603 void ldns_pkt_set_ancount(ldns_pkt *p, uint16_t c);
00609 void ldns_pkt_set_nscount(ldns_pkt *p, uint16_t c);
00615 void ldns_pkt_set_arcount(ldns_pkt *p, uint16_t c);
00621 void ldns_pkt_set_answerfrom(ldns_pkt *p, ldns_rdf *r);
00627 void ldns_pkt_set_querytime(ldns_pkt *p, uint32_t t);
00633 void ldns_pkt_set_size(ldns_pkt *p, size_t s);
00634
00640 void ldns_pkt_set_timestamp(ldns_pkt *p, struct timeval timeval);
00647 void ldns_pkt_set_section_count(ldns_pkt *p, ldns_pkt_section s, uint16_t x);
00653 void ldns_pkt_set_tsig(ldns_pkt *p, ldns_rr *t);
00654
00661 ldns_pkt_type ldns_pkt_reply_type(ldns_pkt *p);
00662
00668 uint16_t ldns_pkt_edns_udp_size(const ldns_pkt *packet);
00674 uint8_t ldns_pkt_edns_extended_rcode(const ldns_pkt *packet);
00680 uint8_t ldns_pkt_edns_version(const ldns_pkt *packet);
00686 uint16_t ldns_pkt_edns_z(const ldns_pkt *packet);
00692 ldns_rdf *ldns_pkt_edns_data(const ldns_pkt *packet);
00693
00699 bool ldns_pkt_edns_do(const ldns_pkt *packet);
00705 void ldns_pkt_set_edns_do(ldns_pkt *packet, bool value);
00706
00716 bool ldns_pkt_edns(const ldns_pkt *packet);
00717
00723 void ldns_pkt_set_edns_udp_size(ldns_pkt *packet, uint16_t s);
00729 void ldns_pkt_set_edns_extended_rcode(ldns_pkt *packet, uint8_t c);
00735 void ldns_pkt_set_edns_version(ldns_pkt *packet, uint8_t v);
00741 void ldns_pkt_set_edns_z(ldns_pkt *packet, uint16_t z);
00747 void ldns_pkt_set_edns_data(ldns_pkt *packet, ldns_rdf *data);
00748
00753 ldns_pkt *ldns_pkt_new(void);
00754
00760 void ldns_pkt_free(ldns_pkt *packet);
00761
00771 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);
00772
00783 ldns_status ldns_pkt_ixfr_request_new_frm_str(ldns_pkt **p, const char *rr_name, ldns_rr_class rr_class, uint16_t flags, ldns_rr* soa);
00784
00793 ldns_pkt *ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class, uint16_t flags);
00794
00804 ldns_pkt *ldns_pkt_ixfr_request_new(ldns_rdf *rr_name, ldns_rr_class rr_class, uint16_t flags, ldns_rr* soa);
00805
00812 ldns_pkt *ldns_pkt_clone(ldns_pkt *pkt);
00813
00819 void ldns_pkt_set_additional(ldns_pkt *p, ldns_rr_list *rr);
00820
00826 void ldns_pkt_set_answer(ldns_pkt *p, ldns_rr_list *rr);
00827
00833 void ldns_pkt_set_question(ldns_pkt *p, ldns_rr_list *rr);
00834
00840 void ldns_pkt_set_authority(ldns_pkt *p, ldns_rr_list *rr);
00841
00849 bool ldns_pkt_push_rr(ldns_pkt *packet, ldns_pkt_section section, ldns_rr *rr);
00850
00858 bool ldns_pkt_safe_push_rr(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr *rr);
00859
00867 bool ldns_pkt_push_rr_list(ldns_pkt *packet, ldns_pkt_section section, ldns_rr_list *list);
00868
00876 bool ldns_pkt_safe_push_rr_list(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr_list *list);
00877
00883 bool ldns_pkt_empty(ldns_pkt *p);
00884
00885 #ifdef __cplusplus
00886 }
00887 #endif
00888
00889 #endif