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, 2004, 2005
00009  *
00010  * See the file LICENSE for the license
00011  */
00012 
00013 #ifndef _LDNS_PACKET_H
00014 #define _LDNS_PACKET_H
00015 
00016 #include <ldns/error.h>
00017 #include <ldns/common.h>
00018 #include <ldns/rr.h>
00019 
00020 /* opcodes for pkt's */
00021 enum ldns_enum_pkt_opcode {
00022         LDNS_PACKET_QUERY = 0,
00023         LDNS_PACKET_IQUERY = 1,
00024         LDNS_PACKET_STATUS = 2, /* there is no 3?? DNS is weird */
00025         LDNS_PACKET_NOTIFY = 4,
00026         LDNS_PACKET_UPDATE = 5
00027 };
00028 typedef enum ldns_enum_pkt_opcode ldns_pkt_opcode;
00029 
00035 struct ldns_struct_hdr
00036 {
00038         uint16_t _id;
00040         bool _qr;
00042         bool _aa;
00044         bool _tc;
00046         bool _rd;
00048         bool _cd;
00050         bool _ra;
00052         bool _ad;
00054         ldns_pkt_opcode _opcode;         /* XXX 8 bits? */
00056         uint8_t _rcode;
00058         uint16_t _qdcount;
00060         uint16_t _ancount;
00062         uint16_t _nscount;
00064         uint16_t _arcount;
00065 };
00066 typedef struct ldns_struct_hdr ldns_hdr;
00067 
00073 struct ldns_struct_pkt
00074 {
00076         ldns_hdr *_header;
00077         /* extra items needed in a packet */
00079         uint16_t _answersize;
00080         ldns_rdf *_answerfrom;
00081         char *_when;
00083         uint32_t _querytime;
00085         size_t _size;
00087         ldns_rr *_tsig_rr;
00089         uint16_t _edns_udp_size;
00090         uint8_t _edns_extended_rcode;
00091         uint8_t _edns_version;
00092         uint16_t _edns_z;
00093         ldns_rdf *_edns_data;
00096         ldns_rr_list    *_question;
00098         ldns_rr_list    *_answer;
00100         ldns_rr_list    *_authority;
00102         ldns_rr_list    *_additional;
00103 };
00104 typedef struct ldns_struct_pkt ldns_pkt;
00105 
00109 enum ldns_enum_pkt_section {
00110         LDNS_SECTION_QUESTION = 0,
00111         LDNS_SECTION_ANSWER = 1,
00112         LDNS_SECTION_AUTHORITY = 2,
00113         LDNS_SECTION_ADDITIONAL = 3,
00115         LDNS_SECTION_ANY = 4,
00117         LDNS_SECTION_ANY_NOQUESTION = 5
00118 };
00119 typedef enum ldns_enum_pkt_section ldns_pkt_section;    
00120 
00124 enum ldns_enum_pkt_type {
00125         LDNS_PACKET_QUESTION,
00126         LDNS_PACKET_REFERRAL,
00127         LDNS_PACKET_ANSWER,
00128         LDNS_PACKET_NXDOMAIN,
00129         LDNS_PACKET_NODATA,
00130         LDNS_PACKET_UNKNOWN
00131 };
00132 typedef enum ldns_enum_pkt_type ldns_pkt_type;
00133 
00134 /* prototypes */
00135 /* read */
00136 uint16_t ldns_pkt_id(const ldns_pkt *p);
00137 bool ldns_pkt_qr(const ldns_pkt *p);
00138 bool ldns_pkt_aa(const ldns_pkt *p);
00139 bool ldns_pkt_tc(const ldns_pkt *p);
00140 bool ldns_pkt_rd(const ldns_pkt *p);
00141 bool ldns_pkt_cd(const ldns_pkt *p);
00142 bool ldns_pkt_ra(const ldns_pkt *p);
00143 bool ldns_pkt_ad(const ldns_pkt *p);
00144 
00145 /* conflict with ldns_pkt_opcode type */
00146 ldns_pkt_opcode ldns_pkt_get_opcode(const ldns_pkt *p);
00147 uint8_t ldns_pkt_rcode(const ldns_pkt *p);
00148 uint16_t ldns_pkt_qdcount(const ldns_pkt *p);
00149 uint16_t ldns_pkt_ancount(const ldns_pkt *p);
00150 uint16_t ldns_pkt_nscount(const ldns_pkt *p);
00151 uint16_t ldns_pkt_arcount(const ldns_pkt *p);
00152 ldns_rdf *ldns_pkt_answerfrom(const ldns_pkt *p);
00153 char *ldns_pkt_when(const ldns_pkt *p);
00154 uint32_t ldns_pkt_querytime(const ldns_pkt *p);
00155 size_t ldns_pkt_size(const ldns_pkt *p);
00156 ldns_rr *ldns_pkt_tsig(const ldns_pkt *p);
00157 
00158 ldns_rr_list *ldns_pkt_question(const ldns_pkt *p);
00159 ldns_rr_list *ldns_pkt_answer(const ldns_pkt *p);
00160 ldns_rr_list *ldns_pkt_authority(const ldns_pkt *p);
00161 ldns_rr_list *ldns_pkt_additional(const ldns_pkt *p);
00162 
00170 ldns_rr_list *ldns_pkt_get_section_clone(ldns_pkt *p, ldns_pkt_section s);
00171 
00172 ldns_rr_list *ldns_pkt_rr_list_by_name(ldns_pkt *p, ldns_rdf *r, ldns_pkt_section s);
00173 ldns_rr_list *ldns_pkt_rr_list_by_type(ldns_pkt *p, ldns_rr_type t, ldns_pkt_section s);
00174 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);
00175 
00182 bool ldns_pkt_set_flags(ldns_pkt *pkt, uint16_t flags);
00183 
00184 void ldns_pkt_set_id(ldns_pkt *p, uint16_t id);
00185 void ldns_pkt_set_random_id(ldns_pkt *p);
00186 void ldns_pkt_set_qr(ldns_pkt *p, bool b);
00187 void ldns_pkt_set_aa(ldns_pkt *p, bool b);
00188 void ldns_pkt_set_tc(ldns_pkt *p, bool b);
00189 void ldns_pkt_set_rd(ldns_pkt *p, bool b);
00190 void ldns_pkt_set_cd(ldns_pkt *p, bool b);
00191 void ldns_pkt_set_ra(ldns_pkt *p, bool b);
00192 void ldns_pkt_set_ad(ldns_pkt *p, bool b);
00193 void ldns_pkt_set_opcode(ldns_pkt *p, ldns_pkt_opcode c);
00194 void ldns_pkt_set_rcode(ldns_pkt *p, uint8_t c);
00195 void ldns_pkt_set_qdcount(ldns_pkt *p, uint16_t c);
00196 void ldns_pkt_set_ancount(ldns_pkt *p, uint16_t c);
00197 void ldns_pkt_set_nscount(ldns_pkt *p, uint16_t c);
00198 void ldns_pkt_set_arcount(ldns_pkt *p, uint16_t c);
00199 void ldns_pkt_set_answerfrom(ldns_pkt *p, ldns_rdf *r);
00200 void ldns_pkt_set_querytime(ldns_pkt *p, uint32_t t);
00201 void ldns_pkt_set_size(ldns_pkt *p, size_t s);
00202 void ldns_pkt_set_when(ldns_pkt *p, char *w);
00203 void ldns_pkt_set_section_count(ldns_pkt *p, ldns_pkt_section s, uint16_t x);
00204 void ldns_pkt_set_tsig(ldns_pkt *p, ldns_rr *t);
00205 
00212 ldns_pkt_type ldns_pkt_reply_type(ldns_pkt *p);
00213 
00214 uint16_t ldns_pkt_edns_udp_size(const ldns_pkt *packet);
00215 uint8_t ldns_pkt_edns_extended_rcode(const ldns_pkt *packet);
00216 uint8_t ldns_pkt_edns_version(const ldns_pkt *packet);
00217 uint16_t ldns_pkt_edns_z(const ldns_pkt *packet);
00218 ldns_rdf *ldns_pkt_edns_data(const ldns_pkt *packet);
00219 bool ldns_pkt_edns_do(const ldns_pkt *packet);
00220 void ldns_pkt_set_edns_do(ldns_pkt *packet, bool value);
00221 
00231 bool ldns_pkt_edns(const ldns_pkt *packet);
00232 void ldns_pkt_set_edns_udp_size(ldns_pkt *packet, uint16_t s);
00233 void ldns_pkt_set_edns_extended_rcode(ldns_pkt *packet, uint8_t c);
00234 void ldns_pkt_set_edns_version(ldns_pkt *packet, uint8_t v);
00235 void ldns_pkt_set_edns_z(ldns_pkt *packet, uint16_t z);
00236 void ldns_pkt_set_edns_data(ldns_pkt *packet, ldns_rdf *data);
00237 
00242 ldns_pkt *ldns_pkt_new();
00243 
00249 void ldns_pkt_free(ldns_pkt *packet);
00250 
00259 ldns_pkt *ldns_pkt_query_new_frm_str(const char *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class , uint16_t flags);
00260 
00269 ldns_pkt *ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class, uint16_t flags);
00270 
00277 ldns_pkt *ldns_pkt_clone(ldns_pkt *pkt);
00278 
00279 /* lua helper stuff */
00280 ldns_rr * ldns_pkt_get_rr(ldns_pkt *p, uint16_t n);
00281 ldns_rr * ldns_pkt_set_rr(ldns_pkt *p, ldns_rr *rr, uint16_t n);
00282 bool ldns_pkt_insert_rr(ldns_pkt *p, ldns_rr *rr, uint16_t n);
00283         
00284 
00285 
00286 #define LDNS_MAX_PACKETLEN         65535
00287 
00288 /* allow flags to be given to mk_query */
00289 #define LDNS_QR         1
00290 #define LDNS_AA         2
00291 #define LDNS_TC         4
00292 #define LDNS_RD         8
00293 #define LDNS_CD         16
00294 #define LDNS_RA         32
00295 #define LDNS_AD         64
00296 
00297 #endif  /* !_LDNS_PACKET_H */

Generated on Fri Sep 14 20:08:42 2007 for ldns by  doxygen 1.5.1