1 #ifndef DNS_H
2 #define DNS_H
3 
4 #define DNS_CLASS_IN     1
5 #define DNS_CLASS_CH     3
6 #define DNS_CLASS_HS     4
7 #define DNS_CLASS_NONE 254
8 #define DNS_CLASS_ALL  255
9 
10 #define DNS_TYPE_ALL 255
11 
12 #define DNS_TYPE_IN_A       1
13 #define DNS_TYPE_IN_NS      2
14 /* ... */
15 #define DNS_TYPE_IN_CNAME   5
16 #define DNS_TYPE_IN_SOA     6
17 /* ... */
18 /* #define DNS_TYPE_IN_WKS    11 */
19 #define DNS_TYPE_IN_PTR    12
20 #define DNS_TYPE_IN_HINFO  13
21 /* ... */
22 #define DNS_TYPE_IN_MX     15
23 #define DNS_TYPE_IN_TXT    16
24 /* ... */
25 #define DNS_TYPE_IN_AAAA   28
26 #define DNS_TYPE_IN_SRV    33
27 /* ... */
28 /* #define DNS_TYPE_IN_A6     38 -- experimental again */
29 /* ... */
30 #define DNS_TYPE_IN_IXFR  251
31 #define DNS_TYPE_IN_AXFR  252
32 
33 
34 #define DNS_TYPE_CH_A         1
35 #define DNS_TYPE_CH_TXT      16 /* version.bind */
36 
37 #define DNS_HDR_QR         (1U<<15)
38 #define DNS_HDR_OPCOFF     (11)
39 #define DNS_HDR_OPCMASK    (15U<<DNS_HDR_OPCOFF)
40 #define DNS_HDR_OPC_QUERY  ( 0U<<DNS_HDR_OPCOFF)
41 #define DNS_HDR_OPC_IQUERY ( 1U<<DNS_HDR_OPCOFF)
42 #define DNS_HDR_OPC_STATUS ( 2U<<DNS_HDR_OPCOFF)
43 #define DNS_HDR_OPC_NOTIFY ( 4U<<DNS_HDR_OPCOFF)
44 #define DNS_HDR_OPC_UPDATE ( 5U<<DNS_HDR_OPCOFF)
45 #define DNS_HDR_AA         (1U<<10)
46 #define DNS_HDR_TC         (1U<<9)
47 #define DNS_HDR_RD         (1U<<8)
48 #define DNS_HDR_RA         (1U<<7)
49 #define DNS_HDR_ZOFF       (4)
50 #define DNS_HDR_ZMASK      (0x7U<<DNS_HDR_ZOFF)
51 #define DNS_HDR_ROFF       (0)
52 #define DNS_HDR_RMASK      (0xFU<<DNS_HDR_ROFF)
53 #define DNS_HDR_R_NONE     ( 0U<<DNS_HDR_ROFF)
54 #define DNS_HDR_R_BFMT     ( 1U<<DNS_HDR_ROFF)
55 #define DNS_HDR_R_SERV     ( 2U<<DNS_HDR_ROFF)
56 #define DNS_HDR_R_NAME     ( 3U<<DNS_HDR_ROFF)
57 #define DNS_HDR_R_NSUP     ( 4U<<DNS_HDR_ROFF)
58 #define DNS_HDR_R_REFU     ( 5U<<DNS_HDR_ROFF)
59 /* yxdomain 6 */
60 /* yxrrset  7 */
61 /* nxrrset  8 */
62 /* notauth  9 */
63 /* notzone 10 */
64 
65 #define DNS_HDR_RSZ       (6)
66 
67 #define DNS_LABEL_IS_PTR(x) ((0xC0 & (x)) == 0xC0)
68 
69 struct Dns_base
70 {
71  struct Vstr_base *io_w_serv;
72  struct Vstr_base *io_w_user;
73 
74  struct Vlg       *io_dbg;
75 
76  unsigned int opt_recur : 1;
77 };
78 
79 typedef struct Dns_base Dns_base;
80 
81 extern const char *dns_name_type_ch(unsigned int num);
82 extern const char *dns_name_type_in(unsigned int num);
83 extern const char *dns_name_class(unsigned int num);
84 extern const char *dns_name_hdr_r(unsigned int num);
85 
86 extern unsigned int dns_get_msg_len(Vstr_base *s1, size_t pos);
87 extern void dns_app_recq_pkt(struct Dns_base *, unsigned int qcount, ...);
88 extern void dns_dbg_prnt_pkt(struct Dns_base *, Vstr_base *pkt);
89 extern void dns_sc_ui_out(struct Dns_base *, Vstr_base *pkt);
90 
91 #endif
92