]>
Commit | Line | Data |
---|---|---|
aff33962 | 1 | /* dnsmasq is Copyright (c) 2000-2015 Simon Kelley |
572b41eb SK |
2 | |
3 | This program is free software; you can redistribute it and/or modify | |
4 | it under the terms of the GNU General Public License as published by | |
5 | the Free Software Foundation; version 2 dated June, 1991, or | |
6 | (at your option) version 3 dated 29 June, 2007. | |
7 | ||
8 | This program is distributed in the hope that it will be useful, | |
9 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | GNU General Public License for more details. | |
12 | ||
13 | You should have received a copy of the GNU General Public License | |
14 | along with this program. If not, see <http://www.gnu.org/licenses/>. | |
15 | */ | |
16 | ||
c72daea8 SK |
17 | #define NAMESERVER_PORT 53 |
18 | #define TFTP_PORT 69 | |
19 | ||
572b41eb SK |
20 | #define IN6ADDRSZ 16 |
21 | #define INADDRSZ 4 | |
22 | ||
23 | #define PACKETSZ 512 /* maximum packet size */ | |
24 | #define MAXDNAME 1025 /* maximum presentation domain name */ | |
25 | #define RRFIXEDSZ 10 /* #/bytes of fixed data in r record */ | |
26 | #define MAXLABEL 63 /* maximum length of domain label */ | |
27 | ||
28 | #define NOERROR 0 /* no error */ | |
29 | #define FORMERR 1 /* format error */ | |
30 | #define SERVFAIL 2 /* server failure */ | |
31 | #define NXDOMAIN 3 /* non existent domain */ | |
32 | #define NOTIMP 4 /* not implemented */ | |
33 | #define REFUSED 5 /* query refused */ | |
34 | ||
35 | #define QUERY 0 /* opcode */ | |
36 | ||
37 | #define C_IN 1 /* the arpa internet */ | |
38 | #define C_CHAOS 3 /* for chaos net (MIT) */ | |
cbf13a2a | 39 | #define C_HESIOD 4 /* hesiod */ |
572b41eb SK |
40 | #define C_ANY 255 /* wildcard match */ |
41 | ||
42 | #define T_A 1 | |
5f8e58f4 SK |
43 | #define T_NS 2 |
44 | #define T_MD 3 | |
45 | #define T_MF 4 | |
572b41eb SK |
46 | #define T_CNAME 5 |
47 | #define T_SOA 6 | |
5f8e58f4 SK |
48 | #define T_MB 7 |
49 | #define T_MG 8 | |
50 | #define T_MR 9 | |
572b41eb | 51 | #define T_PTR 12 |
5f8e58f4 | 52 | #define T_MINFO 14 |
572b41eb SK |
53 | #define T_MX 15 |
54 | #define T_TXT 16 | |
5f8e58f4 SK |
55 | #define T_RP 17 |
56 | #define T_AFSDB 18 | |
57 | #define T_RT 21 | |
572b41eb | 58 | #define T_SIG 24 |
5f8e58f4 | 59 | #define T_PX 26 |
572b41eb | 60 | #define T_AAAA 28 |
5f8e58f4 | 61 | #define T_NXT 30 |
572b41eb SK |
62 | #define T_SRV 33 |
63 | #define T_NAPTR 35 | |
5f8e58f4 SK |
64 | #define T_KX 36 |
65 | #define T_DNAME 39 | |
572b41eb | 66 | #define T_OPT 41 |
a669f012 GB |
67 | #define T_DS 43 |
68 | #define T_RRSIG 46 | |
69 | #define T_NSEC 47 | |
70 | #define T_DNSKEY 48 | |
5107ace1 | 71 | #define T_NSEC3 50 |
572b41eb SK |
72 | #define T_TKEY 249 |
73 | #define T_TSIG 250 | |
b75e9363 | 74 | #define T_AXFR 252 |
572b41eb SK |
75 | #define T_MAILB 253 |
76 | #define T_ANY 255 | |
77 | ||
ed4c0767 | 78 | #define EDNS0_OPTION_MAC 65001 /* dyndns.org temporary assignment */ |
c3edf383 | 79 | #define EDNS0_OPTION_CLIENT_SUBNET 8 /* IANA */ |
ed4c0767 | 80 | |
572b41eb SK |
81 | struct dns_header { |
82 | u16 id; | |
83 | u8 hb3,hb4; | |
84 | u16 qdcount,ancount,nscount,arcount; | |
7de060b0 | 85 | }; |
572b41eb | 86 | |
bd7bfa21 | 87 | #define HB3_QR 0x80 /* Query */ |
572b41eb | 88 | #define HB3_OPCODE 0x78 |
bd7bfa21 | 89 | #define HB3_AA 0x04 /* Authoritative Answer */ |
90 | #define HB3_TC 0x02 /* TrunCated */ | |
91 | #define HB3_RD 0x01 /* Recursion Desired */ | |
572b41eb | 92 | |
bd7bfa21 | 93 | #define HB4_RA 0x80 /* Recursion Available */ |
94 | #define HB4_AD 0x20 /* Authenticated Data */ | |
95 | #define HB4_CD 0x10 /* Checking Disabled */ | |
572b41eb SK |
96 | #define HB4_RCODE 0x0f |
97 | ||
98 | #define OPCODE(x) (((x)->hb3 & HB3_OPCODE) >> 3) | |
9d633048 SK |
99 | #define SET_OPCODE(x, code) (x)->hb3 = ((x)->hb3 & ~HB3_OPCODE) | code |
100 | ||
572b41eb SK |
101 | #define RCODE(x) ((x)->hb4 & HB4_RCODE) |
102 | #define SET_RCODE(x, code) (x)->hb4 = ((x)->hb4 & ~HB4_RCODE) | code | |
103 | ||
104 | #define GETSHORT(s, cp) { \ | |
105 | unsigned char *t_cp = (unsigned char *)(cp); \ | |
106 | (s) = ((u16)t_cp[0] << 8) \ | |
107 | | ((u16)t_cp[1]) \ | |
108 | ; \ | |
109 | (cp) += 2; \ | |
110 | } | |
111 | ||
112 | #define GETLONG(l, cp) { \ | |
113 | unsigned char *t_cp = (unsigned char *)(cp); \ | |
114 | (l) = ((u32)t_cp[0] << 24) \ | |
115 | | ((u32)t_cp[1] << 16) \ | |
116 | | ((u32)t_cp[2] << 8) \ | |
117 | | ((u32)t_cp[3]) \ | |
118 | ; \ | |
119 | (cp) += 4; \ | |
120 | } | |
121 | ||
122 | #define PUTSHORT(s, cp) { \ | |
123 | u16 t_s = (u16)(s); \ | |
124 | unsigned char *t_cp = (unsigned char *)(cp); \ | |
125 | *t_cp++ = t_s >> 8; \ | |
126 | *t_cp = t_s; \ | |
127 | (cp) += 2; \ | |
128 | } | |
129 | ||
130 | #define PUTLONG(l, cp) { \ | |
131 | u32 t_l = (u32)(l); \ | |
132 | unsigned char *t_cp = (unsigned char *)(cp); \ | |
133 | *t_cp++ = t_l >> 24; \ | |
134 | *t_cp++ = t_l >> 16; \ | |
135 | *t_cp++ = t_l >> 8; \ | |
136 | *t_cp = t_l; \ | |
137 | (cp) += 4; \ | |
138 | } | |
139 | ||
c3e0b9b6 SK |
140 | #define CHECK_LEN(header, pp, plen, len) \ |
141 | ((size_t)((pp) - (unsigned char *)(header) + (len)) <= (plen)) | |
142 | ||
143 | #define ADD_RDLEN(header, pp, plen, len) \ | |
144 | (!CHECK_LEN(header, pp, plen, len) ? 0 : (((pp) += (len)), 1)) | |
cbe379ad SK |
145 | |
146 | /* Escape character in our presentation format for names. | |
b8f16556 SK |
147 | Cannot be '.' or /000 and must be !isprint(). |
148 | Note that escaped chars are stored as | |
149 | <NAME_ESCAPE> <orig-char+1> | |
150 | to ensure that the escaped form of /000 doesn't include /000 | |
151 | */ | |
cbe379ad | 152 | #define NAME_ESCAPE 1 |