Main Page
Related Pages
Data Structures
Files
File List
Globals
ldns
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 */
45
enum
ldns_enum_pkt_opcode
{
46
LDNS_PACKET_QUERY
= 0,
47
LDNS_PACKET_IQUERY
= 1,
48
LDNS_PACKET_STATUS
= 2,
/* there is no 3?? DNS is weird */
49
LDNS_PACKET_NOTIFY
= 4,
50
LDNS_PACKET_UPDATE
= 5
51
};
52
typedef
enum
ldns_enum_pkt_opcode
ldns_pkt_opcode
;
53
54
/* rcodes for pkts */
55
enum
ldns_enum_pkt_rcode
{
56
LDNS_RCODE_NOERROR
= 0,
57
LDNS_RCODE_FORMERR
= 1,
58
LDNS_RCODE_SERVFAIL
= 2,
59
LDNS_RCODE_NXDOMAIN
= 3,
60
LDNS_RCODE_NOTIMPL
= 4,
61
LDNS_RCODE_REFUSED
= 5,
62
LDNS_RCODE_YXDOMAIN
= 6,
63
LDNS_RCODE_YXRRSET
= 7,
64
LDNS_RCODE_NXRRSET
= 8,
65
LDNS_RCODE_NOTAUTH
= 9,
66
LDNS_RCODE_NOTZONE
= 10
67
};
68
typedef
enum
ldns_enum_pkt_rcode
ldns_pkt_rcode
;
69
192
struct
ldns_struct_hdr
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
233
struct
ldns_struct_pkt
234
{
236
ldns_hdr
*
_header
;
237
/* extra items needed in a packet */
239
ldns_rdf
*
_answerfrom
;
241
struct
timeval
timestamp
;
243
uint32_t
_querytime
;
245
size_t
_size
;
247
ldns_rr
*
_tsig_rr
;
249
uint16_t
_edns_udp_size
;
251
uint8_t
_edns_extended_rcode
;
253
uint8_t
_edns_version
;
255
uint16_t
_edns_z
;
257
ldns_rdf
*
_edns_data
;
259
ldns_rr_list
*
_question
;
261
ldns_rr_list
*
_answer
;
263
ldns_rr_list
*
_authority
;
265
ldns_rr_list
*
_additional
;
266
};
267
typedef
struct
ldns_struct_pkt
ldns_pkt
;
268
272
enum
ldns_enum_pkt_section
{
273
LDNS_SECTION_QUESTION
= 0,
274
LDNS_SECTION_ANSWER
= 1,
275
LDNS_SECTION_AUTHORITY
= 2,
276
LDNS_SECTION_ADDITIONAL
= 3,
278
LDNS_SECTION_ANY
= 4,
280
LDNS_SECTION_ANY_NOQUESTION
= 5
281
};
282
typedef
enum
ldns_enum_pkt_section
ldns_pkt_section
;
283
287
enum
ldns_enum_pkt_type
{
288
LDNS_PACKET_QUESTION
,
289
LDNS_PACKET_REFERRAL
,
290
LDNS_PACKET_ANSWER
,
291
LDNS_PACKET_NXDOMAIN
,
292
LDNS_PACKET_NODATA
,
293
LDNS_PACKET_UNKNOWN
294
};
295
typedef
enum
ldns_enum_pkt_type
ldns_pkt_type
;
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
391
ldns_rdf
*
ldns_pkt_answerfrom
(
const
ldns_pkt
*p);
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
425
ldns_rr_list
*
ldns_pkt_question
(
const
ldns_pkt
*p);
431
ldns_rr_list
*
ldns_pkt_answer
(
const
ldns_pkt
*p);
437
ldns_rr_list
*
ldns_pkt_authority
(
const
ldns_pkt
*p);
443
ldns_rr_list
*
ldns_pkt_additional
(
const
ldns_pkt
*p);
450
ldns_rr_list
*
ldns_pkt_all
(
const
ldns_pkt
*p);
457
ldns_rr_list
*
ldns_pkt_all_noquestion
(
const
ldns_pkt
*p);
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
);
525
void
ldns_pkt_set_random_id
(
ldns_pkt
*p);
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);
610
void
ldns_pkt_set_answerfrom
(
ldns_pkt
*p,
ldns_rdf
*r);
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
742
ldns_pkt
*
ldns_pkt_new
();
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
778
ldns_pkt
*
ldns_pkt_clone
(
ldns_pkt
*pkt);
779
785
void
ldns_pkt_set_additional
(
ldns_pkt
*p,
ldns_rr_list
*rr);
786
792
void
ldns_pkt_set_answer
(
ldns_pkt
*p,
ldns_rr_list
*rr);
793
799
void
ldns_pkt_set_question
(
ldns_pkt
*p,
ldns_rr_list
*rr);
800
806
void
ldns_pkt_set_authority
(
ldns_pkt
*p,
ldns_rr_list
*rr);
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 */
Generated on Tue Aug 6 2013 17:02:42 for ldns by
1.8.4