line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Net::DNS::Parameters; |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
################################################ |
4
|
|
|
|
|
|
|
## |
5
|
|
|
|
|
|
|
## Domain Name System (DNS) Parameters |
6
|
|
|
|
|
|
|
## (last updated 2023-04-28) |
7
|
|
|
|
|
|
|
## |
8
|
|
|
|
|
|
|
################################################ |
9
|
|
|
|
|
|
|
|
10
|
96
|
|
|
96
|
|
74778
|
use strict; |
|
96
|
|
|
|
|
210
|
|
|
96
|
|
|
|
|
2845
|
|
11
|
96
|
|
|
96
|
|
473
|
use warnings; |
|
96
|
|
|
|
|
178
|
|
|
96
|
|
|
|
|
4180
|
|
12
|
|
|
|
|
|
|
our $VERSION = (qw$Id: Parameters.pm 1921 2023-05-08 18:39:59Z willem $)[2]; |
13
|
|
|
|
|
|
|
|
14
|
96
|
|
|
96
|
|
1070
|
use integer; |
|
96
|
|
|
|
|
236
|
|
|
96
|
|
|
|
|
528
|
|
15
|
96
|
|
|
96
|
|
2238
|
use Carp; |
|
96
|
|
|
|
|
234
|
|
|
96
|
|
|
|
|
6964
|
|
16
|
|
|
|
|
|
|
|
17
|
96
|
|
|
96
|
|
720
|
use base qw(Exporter); |
|
96
|
|
|
|
|
299
|
|
|
96
|
|
|
|
|
191704
|
|
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
our @EXPORT_OK = qw( |
20
|
|
|
|
|
|
|
classbyname classbyval %classbyname |
21
|
|
|
|
|
|
|
typebyname typebyval %typebyname |
22
|
|
|
|
|
|
|
opcodebyname opcodebyval |
23
|
|
|
|
|
|
|
rcodebyname rcodebyval |
24
|
|
|
|
|
|
|
ednsoptionbyname ednsoptionbyval |
25
|
|
|
|
|
|
|
dsotypebyname dsotypebyval |
26
|
|
|
|
|
|
|
); |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
our %EXPORT_TAGS = ( |
29
|
|
|
|
|
|
|
class => [qw(classbyname classbyval)], |
30
|
|
|
|
|
|
|
type => [qw(typebyname typebyval)], |
31
|
|
|
|
|
|
|
opcode => [qw(opcodebyname opcodebyval)], |
32
|
|
|
|
|
|
|
rcode => [qw(rcodebyname rcodebyval)], |
33
|
|
|
|
|
|
|
ednsoption => [qw(ednsoptionbyname ednsoptionbyval)], |
34
|
|
|
|
|
|
|
dsotype => [qw(dsotypebyname dsotypebyval)], |
35
|
|
|
|
|
|
|
); |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
# Registry: DNS CLASSes |
39
|
|
|
|
|
|
|
my @classbyname = ( |
40
|
|
|
|
|
|
|
IN => 1, # RFC1035 |
41
|
|
|
|
|
|
|
CH => 3, # Chaosnet |
42
|
|
|
|
|
|
|
HS => 4, # Hesiod |
43
|
|
|
|
|
|
|
NONE => 254, # RFC2136 |
44
|
|
|
|
|
|
|
ANY => 255, # RFC1035 |
45
|
|
|
|
|
|
|
); |
46
|
|
|
|
|
|
|
our %classbyval = reverse( CLASS0 => 0, @classbyname ); |
47
|
|
|
|
|
|
|
push @classbyname, map { /^\d/ ? $_ : lc($_) } @classbyname; |
48
|
|
|
|
|
|
|
our %classbyname = ( '*' => 255, @classbyname ); |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
# Registry: Resource Record (RR) TYPEs |
52
|
|
|
|
|
|
|
my @typebyname = ( |
53
|
|
|
|
|
|
|
A => 1, # RFC1035 |
54
|
|
|
|
|
|
|
NS => 2, # RFC1035 |
55
|
|
|
|
|
|
|
MD => 3, # RFC1035 |
56
|
|
|
|
|
|
|
MF => 4, # RFC1035 |
57
|
|
|
|
|
|
|
CNAME => 5, # RFC1035 |
58
|
|
|
|
|
|
|
SOA => 6, # RFC1035 |
59
|
|
|
|
|
|
|
MB => 7, # RFC1035 |
60
|
|
|
|
|
|
|
MG => 8, # RFC1035 |
61
|
|
|
|
|
|
|
MR => 9, # RFC1035 |
62
|
|
|
|
|
|
|
NULL => 10, # RFC1035 |
63
|
|
|
|
|
|
|
WKS => 11, # RFC1035 |
64
|
|
|
|
|
|
|
PTR => 12, # RFC1035 |
65
|
|
|
|
|
|
|
HINFO => 13, # RFC1035 |
66
|
|
|
|
|
|
|
MINFO => 14, # RFC1035 |
67
|
|
|
|
|
|
|
MX => 15, # RFC1035 |
68
|
|
|
|
|
|
|
TXT => 16, # RFC1035 |
69
|
|
|
|
|
|
|
RP => 17, # RFC1183 |
70
|
|
|
|
|
|
|
AFSDB => 18, # RFC1183 RFC5864 |
71
|
|
|
|
|
|
|
X25 => 19, # RFC1183 |
72
|
|
|
|
|
|
|
ISDN => 20, # RFC1183 |
73
|
|
|
|
|
|
|
RT => 21, # RFC1183 |
74
|
|
|
|
|
|
|
NSAP => 22, # RFC1706 https://datatracker.ietf.org/doc/status-change-int-tlds-to-historic |
75
|
|
|
|
|
|
|
'NSAP-PTR' => 23, # RFC1706 https://datatracker.ietf.org/doc/status-change-int-tlds-to-historic |
76
|
|
|
|
|
|
|
SIG => 24, # RFC2536 RFC2931 RFC3110 RFC4034 |
77
|
|
|
|
|
|
|
KEY => 25, # RFC2536 RFC2539 RFC3110 RFC4034 |
78
|
|
|
|
|
|
|
PX => 26, # RFC2163 |
79
|
|
|
|
|
|
|
GPOS => 27, # RFC1712 |
80
|
|
|
|
|
|
|
AAAA => 28, # RFC3596 |
81
|
|
|
|
|
|
|
LOC => 29, # RFC1876 |
82
|
|
|
|
|
|
|
NXT => 30, # RFC2535 RFC3755 |
83
|
|
|
|
|
|
|
EID => 31, # http://ana-3.lcs.mit.edu/~jnc/nimrod/dns.txt |
84
|
|
|
|
|
|
|
NIMLOC => 32, # http://ana-3.lcs.mit.edu/~jnc/nimrod/dns.txt |
85
|
|
|
|
|
|
|
SRV => 33, # RFC2782 |
86
|
|
|
|
|
|
|
ATMA => 34, # http://www.broadband-forum.org/ftp/pub/approved-specs/af-dans-0152.000.pdf |
87
|
|
|
|
|
|
|
NAPTR => 35, # RFC3403 |
88
|
|
|
|
|
|
|
KX => 36, # RFC2230 |
89
|
|
|
|
|
|
|
CERT => 37, # RFC4398 |
90
|
|
|
|
|
|
|
A6 => 38, # RFC2874 RFC3226 RFC6563 |
91
|
|
|
|
|
|
|
DNAME => 39, # RFC6672 |
92
|
|
|
|
|
|
|
SINK => 40, # draft-eastlake-kitchen-sink |
93
|
|
|
|
|
|
|
OPT => 41, # RFC3225 RFC6891 |
94
|
|
|
|
|
|
|
APL => 42, # RFC3123 |
95
|
|
|
|
|
|
|
DS => 43, # RFC4034 |
96
|
|
|
|
|
|
|
SSHFP => 44, # RFC4255 |
97
|
|
|
|
|
|
|
IPSECKEY => 45, # RFC4025 |
98
|
|
|
|
|
|
|
RRSIG => 46, # RFC4034 |
99
|
|
|
|
|
|
|
NSEC => 47, # RFC4034 RFC9077 |
100
|
|
|
|
|
|
|
DNSKEY => 48, # RFC4034 |
101
|
|
|
|
|
|
|
DHCID => 49, # RFC4701 |
102
|
|
|
|
|
|
|
NSEC3 => 50, # RFC5155 RFC9077 |
103
|
|
|
|
|
|
|
NSEC3PARAM => 51, # RFC5155 |
104
|
|
|
|
|
|
|
TLSA => 52, # RFC6698 |
105
|
|
|
|
|
|
|
SMIMEA => 53, # RFC8162 |
106
|
|
|
|
|
|
|
HIP => 55, # RFC8005 |
107
|
|
|
|
|
|
|
NINFO => 56, # |
108
|
|
|
|
|
|
|
RKEY => 57, # |
109
|
|
|
|
|
|
|
TALINK => 58, # |
110
|
|
|
|
|
|
|
CDS => 59, # RFC7344 |
111
|
|
|
|
|
|
|
CDNSKEY => 60, # RFC7344 |
112
|
|
|
|
|
|
|
OPENPGPKEY => 61, # RFC7929 |
113
|
|
|
|
|
|
|
CSYNC => 62, # RFC7477 |
114
|
|
|
|
|
|
|
ZONEMD => 63, # RFC8976 |
115
|
|
|
|
|
|
|
SVCB => 64, # RFC-ietf-dnsop-svcb-https-12 |
116
|
|
|
|
|
|
|
HTTPS => 65, # RFC-ietf-dnsop-svcb-https-12 |
117
|
|
|
|
|
|
|
SPF => 99, # RFC7208 |
118
|
|
|
|
|
|
|
UINFO => 100, # IANA-Reserved |
119
|
|
|
|
|
|
|
UID => 101, # IANA-Reserved |
120
|
|
|
|
|
|
|
GID => 102, # IANA-Reserved |
121
|
|
|
|
|
|
|
UNSPEC => 103, # IANA-Reserved |
122
|
|
|
|
|
|
|
NID => 104, # RFC6742 |
123
|
|
|
|
|
|
|
L32 => 105, # RFC6742 |
124
|
|
|
|
|
|
|
L64 => 106, # RFC6742 |
125
|
|
|
|
|
|
|
LP => 107, # RFC6742 |
126
|
|
|
|
|
|
|
EUI48 => 108, # RFC7043 |
127
|
|
|
|
|
|
|
EUI64 => 109, # RFC7043 |
128
|
|
|
|
|
|
|
TKEY => 249, # RFC2930 |
129
|
|
|
|
|
|
|
TSIG => 250, # RFC8945 |
130
|
|
|
|
|
|
|
IXFR => 251, # RFC1995 |
131
|
|
|
|
|
|
|
AXFR => 252, # RFC1035 RFC5936 |
132
|
|
|
|
|
|
|
MAILB => 253, # RFC1035 |
133
|
|
|
|
|
|
|
MAILA => 254, # RFC1035 |
134
|
|
|
|
|
|
|
ANY => 255, # RFC1035 RFC6895 RFC8482 |
135
|
|
|
|
|
|
|
URI => 256, # RFC7553 |
136
|
|
|
|
|
|
|
CAA => 257, # RFC8659 |
137
|
|
|
|
|
|
|
AVC => 258, # |
138
|
|
|
|
|
|
|
DOA => 259, # draft-durand-doa-over-dns |
139
|
|
|
|
|
|
|
AMTRELAY => 260, # RFC8777 |
140
|
|
|
|
|
|
|
TA => 32768, # http://cameo.library.cmu.edu/ http://www.watson.org/~weiler/INI1999-19.pdf |
141
|
|
|
|
|
|
|
DLV => 32769, # RFC8749 RFC4431 |
142
|
|
|
|
|
|
|
); |
143
|
|
|
|
|
|
|
our %typebyval = reverse( TYPE0 => 0, @typebyname ); |
144
|
|
|
|
|
|
|
push @typebyname, map { /^\d/ ? $_ : lc($_) } @typebyname; |
145
|
|
|
|
|
|
|
our %typebyname = ( '*' => 255, @typebyname ); |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
# Registry: DNS OpCodes |
149
|
|
|
|
|
|
|
my @opcodebyname = ( |
150
|
|
|
|
|
|
|
QUERY => 0, # RFC1035 |
151
|
|
|
|
|
|
|
IQUERY => 1, # RFC3425 |
152
|
|
|
|
|
|
|
STATUS => 2, # RFC1035 |
153
|
|
|
|
|
|
|
NOTIFY => 4, # RFC1996 |
154
|
|
|
|
|
|
|
UPDATE => 5, # RFC2136 |
155
|
|
|
|
|
|
|
DSO => 6, # RFC8490 |
156
|
|
|
|
|
|
|
); |
157
|
|
|
|
|
|
|
our %opcodebyval = reverse @opcodebyname; |
158
|
|
|
|
|
|
|
push @opcodebyname, map { /^\d/ ? $_ : lc($_) } @opcodebyname; |
159
|
|
|
|
|
|
|
our %opcodebyname = ( NS_NOTIFY_OP => 4, @opcodebyname ); |
160
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
# Registry: DNS RCODEs |
163
|
|
|
|
|
|
|
my @rcodebyname = ( |
164
|
|
|
|
|
|
|
NOERROR => 0, # RFC1035 |
165
|
|
|
|
|
|
|
FORMERR => 1, # RFC1035 |
166
|
|
|
|
|
|
|
SERVFAIL => 2, # RFC1035 |
167
|
|
|
|
|
|
|
NXDOMAIN => 3, # RFC1035 |
168
|
|
|
|
|
|
|
NOTIMP => 4, # RFC1035 |
169
|
|
|
|
|
|
|
REFUSED => 5, # RFC1035 |
170
|
|
|
|
|
|
|
YXDOMAIN => 6, # RFC2136 RFC6672 |
171
|
|
|
|
|
|
|
YXRRSET => 7, # RFC2136 |
172
|
|
|
|
|
|
|
NXRRSET => 8, # RFC2136 |
173
|
|
|
|
|
|
|
NOTAUTH => 9, # RFC2136 |
174
|
|
|
|
|
|
|
NOTAUTH => 9, # RFC8945 |
175
|
|
|
|
|
|
|
NOTZONE => 10, # RFC2136 |
176
|
|
|
|
|
|
|
DSOTYPENI => 11, # RFC8490 |
177
|
|
|
|
|
|
|
BADVERS => 16, # RFC6891 |
178
|
|
|
|
|
|
|
BADSIG => 16, # RFC8945 |
179
|
|
|
|
|
|
|
BADKEY => 17, # RFC8945 |
180
|
|
|
|
|
|
|
BADTIME => 18, # RFC8945 |
181
|
|
|
|
|
|
|
BADMODE => 19, # RFC2930 |
182
|
|
|
|
|
|
|
BADNAME => 20, # RFC2930 |
183
|
|
|
|
|
|
|
BADALG => 21, # RFC2930 |
184
|
|
|
|
|
|
|
BADTRUNC => 22, # RFC8945 |
185
|
|
|
|
|
|
|
BADCOOKIE => 23, # RFC7873 |
186
|
|
|
|
|
|
|
); |
187
|
|
|
|
|
|
|
our %rcodebyval = reverse( BADSIG => 16, @rcodebyname ); |
188
|
|
|
|
|
|
|
push @rcodebyname, map { /^\d/ ? $_ : lc($_) } @rcodebyname; |
189
|
|
|
|
|
|
|
our %rcodebyname = @rcodebyname; |
190
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
# Registry: DNS EDNS0 Option Codes (OPT) |
193
|
|
|
|
|
|
|
my @ednsoptionbyname = ( |
194
|
|
|
|
|
|
|
LLQ => 1, # RFC8764 |
195
|
|
|
|
|
|
|
UL => 2, # http://files.dns-sd.org/draft-sekar-dns-ul.txt |
196
|
|
|
|
|
|
|
NSID => 3, # RFC5001 |
197
|
|
|
|
|
|
|
DAU => 5, # RFC6975 |
198
|
|
|
|
|
|
|
DHU => 6, # RFC6975 |
199
|
|
|
|
|
|
|
N3U => 7, # RFC6975 |
200
|
|
|
|
|
|
|
'CLIENT-SUBNET' => 8, # RFC7871 |
201
|
|
|
|
|
|
|
EXPIRE => 9, # RFC7314 |
202
|
|
|
|
|
|
|
COOKIE => 10, # RFC7873 |
203
|
|
|
|
|
|
|
'TCP-KEEPALIVE' => 11, # RFC7828 |
204
|
|
|
|
|
|
|
PADDING => 12, # RFC7830 |
205
|
|
|
|
|
|
|
CHAIN => 13, # RFC7901 |
206
|
|
|
|
|
|
|
'KEY-TAG' => 14, # RFC8145 |
207
|
|
|
|
|
|
|
'EXTENDED-ERROR' => 15, # RFC8914 |
208
|
|
|
|
|
|
|
'CLIENT-TAG' => 16, # draft-bellis-dnsop-edns-tags |
209
|
|
|
|
|
|
|
'SERVER-TAG' => 17, # draft-bellis-dnsop-edns-tags |
210
|
|
|
|
|
|
|
'UMBRELLA-IDENT' => 20292, # https://developer.cisco.com/docs/cloud-security/#!integrating-network-devic |
211
|
|
|
|
|
|
|
DEVICEID => 26946, # https://developer.cisco.com/docs/cloud-security/#!network-devices-getting-s |
212
|
|
|
|
|
|
|
); |
213
|
|
|
|
|
|
|
our %ednsoptionbyval = reverse @ednsoptionbyname; |
214
|
|
|
|
|
|
|
push @ednsoptionbyname, map { /^\d/ ? $_ : lc($_) } @ednsoptionbyname; |
215
|
|
|
|
|
|
|
our %ednsoptionbyname = @ednsoptionbyname; |
216
|
|
|
|
|
|
|
|
217
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
# Registry: DNS Header Flags |
219
|
|
|
|
|
|
|
my @dnsflagbyname = ( |
220
|
|
|
|
|
|
|
AA => 0x0400, # RFC1035 |
221
|
|
|
|
|
|
|
TC => 0x0200, # RFC1035 |
222
|
|
|
|
|
|
|
RD => 0x0100, # RFC1035 |
223
|
|
|
|
|
|
|
RA => 0x0080, # RFC1035 |
224
|
|
|
|
|
|
|
AD => 0x0020, # RFC4035 RFC6840 |
225
|
|
|
|
|
|
|
CD => 0x0010, # RFC4035 RFC6840 |
226
|
|
|
|
|
|
|
); |
227
|
|
|
|
|
|
|
push @dnsflagbyname, map { /^\d/ ? $_ : lc($_) } @dnsflagbyname; |
228
|
|
|
|
|
|
|
our %dnsflagbyname = @dnsflagbyname; |
229
|
|
|
|
|
|
|
|
230
|
|
|
|
|
|
|
|
231
|
|
|
|
|
|
|
# Registry: EDNS Header Flags (16 bits) |
232
|
|
|
|
|
|
|
my @ednsflagbyname = ( |
233
|
|
|
|
|
|
|
DO => 0x8000, # RFC4035 RFC3225 RFC6840 |
234
|
|
|
|
|
|
|
); |
235
|
|
|
|
|
|
|
push @ednsflagbyname, map { /^\d/ ? $_ : lc($_) } @ednsflagbyname; |
236
|
|
|
|
|
|
|
our %ednsflagbyname = @ednsflagbyname; |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
|
239
|
|
|
|
|
|
|
# Registry: DSO Type Codes |
240
|
|
|
|
|
|
|
my @dsotypebyname = ( |
241
|
|
|
|
|
|
|
KEEPALIVE => 0x0001, # RFC8490 |
242
|
|
|
|
|
|
|
RETRYDELAY => 0x0002, # RFC8490 |
243
|
|
|
|
|
|
|
ENCRYPTIONPADDING => 0x0003, # RFC8490 |
244
|
|
|
|
|
|
|
SUBSCRIBE => 0x0040, # RFC8765 |
245
|
|
|
|
|
|
|
PUSH => 0x0041, # RFC8765 |
246
|
|
|
|
|
|
|
UNSUBSCRIBE => 0x0042, # RFC8765 |
247
|
|
|
|
|
|
|
RECONFIRM => 0x0043, # RFC8765 |
248
|
|
|
|
|
|
|
); |
249
|
|
|
|
|
|
|
our %dsotypebyval = reverse @dsotypebyname; |
250
|
|
|
|
|
|
|
push @dsotypebyname, map { /^\d/ ? $_ : lc($_) } @dsotypebyname; |
251
|
|
|
|
|
|
|
our %dsotypebyname = @dsotypebyname; |
252
|
|
|
|
|
|
|
|
253
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
# Registry: Extended DNS Error Codes |
255
|
|
|
|
|
|
|
my @dnserrorbyval = ( |
256
|
|
|
|
|
|
|
0 => 'Other Error', # RFC8914 |
257
|
|
|
|
|
|
|
1 => 'Unsupported DNSKEY Algorithm', # RFC8914 |
258
|
|
|
|
|
|
|
2 => 'Unsupported DS Digest Type', # RFC8914 |
259
|
|
|
|
|
|
|
3 => 'Stale Answer', # RFC8914 RFC8767 |
260
|
|
|
|
|
|
|
4 => 'Forged Answer', # RFC8914 |
261
|
|
|
|
|
|
|
5 => 'DNSSEC Indeterminate', # RFC8914 |
262
|
|
|
|
|
|
|
6 => 'DNSSEC Bogus', # RFC8914 |
263
|
|
|
|
|
|
|
7 => 'Signature Expired', # RFC8914 |
264
|
|
|
|
|
|
|
8 => 'Signature Not Yet Valid', # RFC8914 |
265
|
|
|
|
|
|
|
9 => 'DNSKEY Missing', # RFC8914 |
266
|
|
|
|
|
|
|
10 => 'RRSIGs Missing', # RFC8914 |
267
|
|
|
|
|
|
|
11 => 'No Zone Key Bit Set', # RFC8914 |
268
|
|
|
|
|
|
|
12 => 'NSEC Missing', # RFC8914 |
269
|
|
|
|
|
|
|
13 => 'Cached Error', # RFC8914 |
270
|
|
|
|
|
|
|
14 => 'Not Ready', # RFC8914 |
271
|
|
|
|
|
|
|
15 => 'Blocked', # RFC8914 |
272
|
|
|
|
|
|
|
16 => 'Censored', # RFC8914 |
273
|
|
|
|
|
|
|
17 => 'Filtered', # RFC8914 |
274
|
|
|
|
|
|
|
18 => 'Prohibited', # RFC8914 |
275
|
|
|
|
|
|
|
19 => 'Stale NXDomain Answer', # RFC8914 |
276
|
|
|
|
|
|
|
20 => 'Not Authoritative', # RFC8914 |
277
|
|
|
|
|
|
|
21 => 'Not Supported', # RFC8914 |
278
|
|
|
|
|
|
|
22 => 'No Reachable Authority', # RFC8914 |
279
|
|
|
|
|
|
|
23 => 'Network Error', # RFC8914 |
280
|
|
|
|
|
|
|
24 => 'Invalid Data', # RFC8914 |
281
|
|
|
|
|
|
|
25 => 'Signature Expired before Valid', # https://github.com/NLnetLabs/unbound/pull/604#discussion_r802678343 |
282
|
|
|
|
|
|
|
26 => 'Too Early', # RFC9250 |
283
|
|
|
|
|
|
|
27 => 'Unsupported NSEC3 Iterations Value', # RFC9276 |
284
|
|
|
|
|
|
|
28 => 'Unable to conform to policy', # draft-homburg-dnsop-codcp-00 |
285
|
|
|
|
|
|
|
29 => 'Synthesized', # https://github.com/PowerDNS/pdns/pull/12334 |
286
|
|
|
|
|
|
|
); |
287
|
|
|
|
|
|
|
our %dnserrorbyval = @dnserrorbyval; |
288
|
|
|
|
|
|
|
|
289
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
######## |
291
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
# The following functions are wrappers around similarly named hashes. |
293
|
|
|
|
|
|
|
|
294
|
|
|
|
|
|
|
sub classbyname { |
295
|
1142
|
|
|
1142
|
1
|
3052
|
my $name = shift; |
296
|
|
|
|
|
|
|
|
297
|
1142
|
|
100
|
|
|
5343
|
return $classbyname{$name} || $classbyname{uc $name} || return do { |
298
|
|
|
|
|
|
|
croak qq[unknown class "$name"] unless $name =~ m/^(CLASS)?(\d+)/i; |
299
|
|
|
|
|
|
|
my $val = 0 + $2; |
300
|
|
|
|
|
|
|
croak qq[classbyname("$name") out of range] if $val > 0x7fff; |
301
|
|
|
|
|
|
|
return $val; |
302
|
|
|
|
|
|
|
} |
303
|
|
|
|
|
|
|
} |
304
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
sub classbyval { |
306
|
1092
|
|
|
1092
|
1
|
6732
|
my $arg = shift; |
307
|
|
|
|
|
|
|
|
308
|
1092
|
|
100
|
|
|
4455
|
return $classbyval{$arg} || return do { |
309
|
|
|
|
|
|
|
my $val = ( $arg += 0 ) & 0x7fff; # MSB used by mDNS |
310
|
|
|
|
|
|
|
croak qq[classbyval($arg) out of range] if $arg > 0xffff; |
311
|
|
|
|
|
|
|
return $classbyval{$arg} = $classbyval{$val} || "CLASS$val"; |
312
|
|
|
|
|
|
|
} |
313
|
|
|
|
|
|
|
} |
314
|
|
|
|
|
|
|
|
315
|
|
|
|
|
|
|
|
316
|
|
|
|
|
|
|
sub typebyname { |
317
|
1041
|
|
|
1041
|
1
|
3758
|
my $name = shift; |
318
|
|
|
|
|
|
|
|
319
|
1041
|
|
100
|
|
|
89754
|
return $typebyname{$name} || return do { |
320
|
|
|
|
|
|
|
if ( $name =~ m/^(TYPE)?(\d+)/i ) { |
321
|
|
|
|
|
|
|
my $val = 0 + $2; |
322
|
|
|
|
|
|
|
croak qq[typebyname("$name") out of range] if $val > 0xffff; |
323
|
|
|
|
|
|
|
return $val; |
324
|
|
|
|
|
|
|
} |
325
|
|
|
|
|
|
|
_typespec("$name.RRNAME") unless $typebyname{uc $name}; |
326
|
|
|
|
|
|
|
return $typebyname{uc $name} || croak qq[unknown type "$name"]; |
327
|
|
|
|
|
|
|
} |
328
|
|
|
|
|
|
|
} |
329
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
sub typebyval { |
331
|
2989
|
|
|
2989
|
1
|
130352
|
my $val = shift; |
332
|
|
|
|
|
|
|
|
333
|
2989
|
|
100
|
|
|
13054
|
return $typebyval{$val} || return do { |
334
|
|
|
|
|
|
|
$val += 0; |
335
|
|
|
|
|
|
|
croak qq[typebyval($val) out of range] if $val > 0xffff; |
336
|
|
|
|
|
|
|
$typebyval{$val} = "TYPE$val"; |
337
|
|
|
|
|
|
|
_typespec("$val.RRTYPE"); |
338
|
|
|
|
|
|
|
return $typebyval{$val}; |
339
|
|
|
|
|
|
|
} |
340
|
|
|
|
|
|
|
} |
341
|
|
|
|
|
|
|
|
342
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
sub opcodebyname { |
344
|
71
|
|
|
71
|
1
|
977
|
my $arg = shift; |
345
|
71
|
|
|
|
|
179
|
my $val = $opcodebyname{$arg}; |
346
|
71
|
100
|
|
|
|
216
|
return $val if defined $val; |
347
|
2
|
100
|
|
|
|
15
|
return $arg if $arg =~ /^\d/; |
348
|
1
|
|
|
|
|
96
|
croak qq[unknown opcode "$arg"]; |
349
|
|
|
|
|
|
|
} |
350
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
sub opcodebyval { |
352
|
72
|
|
|
72
|
1
|
3222
|
my $val = shift; |
353
|
72
|
|
100
|
|
|
353
|
return $opcodebyval{$val} || return "$val"; |
354
|
|
|
|
|
|
|
} |
355
|
|
|
|
|
|
|
|
356
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
sub rcodebyname { |
358
|
58
|
|
|
58
|
1
|
1006
|
my $arg = shift; |
359
|
58
|
|
|
|
|
201
|
my $val = $rcodebyname{$arg}; |
360
|
58
|
100
|
|
|
|
227
|
return $val if defined $val; |
361
|
8
|
100
|
|
|
|
107
|
return $arg if $arg =~ /^\d/; |
362
|
1
|
|
|
|
|
92
|
croak qq[unknown rcode "$arg"]; |
363
|
|
|
|
|
|
|
} |
364
|
|
|
|
|
|
|
|
365
|
|
|
|
|
|
|
sub rcodebyval { |
366
|
325
|
|
|
325
|
1
|
10894
|
my $val = shift; |
367
|
325
|
|
100
|
|
|
2125
|
return $rcodebyval{$val} || return "$val"; |
368
|
|
|
|
|
|
|
} |
369
|
|
|
|
|
|
|
|
370
|
|
|
|
|
|
|
|
371
|
|
|
|
|
|
|
sub ednsoptionbyname { |
372
|
156
|
|
|
156
|
1
|
619
|
my $arg = shift; |
373
|
156
|
|
|
|
|
338
|
my $val = $ednsoptionbyname{$arg}; |
374
|
156
|
100
|
|
|
|
416
|
return $val if defined $val; |
375
|
38
|
100
|
|
|
|
161
|
return $arg if $arg =~ /^\d/; |
376
|
1
|
|
|
|
|
93
|
croak qq[unknown option "$arg"]; |
377
|
|
|
|
|
|
|
} |
378
|
|
|
|
|
|
|
|
379
|
|
|
|
|
|
|
sub ednsoptionbyval { |
380
|
118
|
|
|
118
|
1
|
9375
|
my $val = shift; |
381
|
118
|
|
100
|
|
|
409
|
return $ednsoptionbyval{$val} || return "$val"; |
382
|
|
|
|
|
|
|
} |
383
|
|
|
|
|
|
|
|
384
|
|
|
|
|
|
|
|
385
|
|
|
|
|
|
|
sub dsotypebyname { |
386
|
9
|
|
|
9
|
1
|
357
|
my $arg = shift; |
387
|
9
|
|
|
|
|
58
|
my $val = $dsotypebyname{$arg}; |
388
|
9
|
100
|
|
|
|
37
|
return $val if defined $val; |
389
|
2
|
100
|
|
|
|
12
|
return $arg if $arg =~ /^\d/; |
390
|
1
|
|
|
|
|
95
|
croak qq[unknown DSO type "$arg"]; |
391
|
|
|
|
|
|
|
} |
392
|
|
|
|
|
|
|
|
393
|
|
|
|
|
|
|
sub dsotypebyval { |
394
|
9
|
|
|
9
|
1
|
4207
|
my $val = shift; |
395
|
9
|
|
100
|
|
|
41
|
return $dsotypebyval{$val} || return "$val"; |
396
|
|
|
|
|
|
|
} |
397
|
|
|
|
|
|
|
|
398
|
|
|
|
|
|
|
|
399
|
96
|
|
|
96
|
|
934
|
use constant EXTLANG => defined eval { require Net::DNS::Extlang }; |
|
96
|
|
|
|
|
227
|
|
|
96
|
|
|
|
|
254
|
|
|
96
|
|
|
|
|
34760
|
|
400
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
sub _typespec { |
402
|
5
|
|
|
5
|
|
12
|
my $generate = defined wantarray; |
403
|
5
|
|
|
|
|
11
|
return EXTLANG ? eval <<'END' : ''; ## no critic |
404
|
|
|
|
|
|
|
my ($node) = @_; ## draft-levine-dnsextlang |
405
|
|
|
|
|
|
|
my $instance = Net::DNS::Extlang->new(); |
406
|
|
|
|
|
|
|
my $basename = $instance->domain || return ''; |
407
|
|
|
|
|
|
|
|
408
|
|
|
|
|
|
|
require Net::DNS::Resolver; |
409
|
|
|
|
|
|
|
my $resolver = Net::DNS::Resolver->new(); |
410
|
|
|
|
|
|
|
my $response = $resolver->send( "$node.$basename", 'TXT' ) || return ''; |
411
|
|
|
|
|
|
|
|
412
|
|
|
|
|
|
|
foreach my $txt ( grep { $_->type eq 'TXT' } $response->answer ) { |
413
|
|
|
|
|
|
|
my @stanza = $txt->txtdata; |
414
|
|
|
|
|
|
|
my ( $tag, $identifier, @attribute ) = @stanza; |
415
|
|
|
|
|
|
|
next unless defined($tag) && $tag =~ /^RRTYPE=\d+$/; |
416
|
|
|
|
|
|
|
if ( $identifier =~ /^(\w+):(\d+)\W*/ ) { |
417
|
|
|
|
|
|
|
my ( $mnemonic, $rrtype ) = ( uc($1), $2 ); |
418
|
|
|
|
|
|
|
croak qq["$mnemonic" is a CLASS identifier] if $classbyname{$mnemonic}; |
419
|
|
|
|
|
|
|
for ( typebyval($rrtype) ) { |
420
|
|
|
|
|
|
|
next if /^$mnemonic$/i; # duplicate registration |
421
|
|
|
|
|
|
|
croak qq["$mnemonic" conflicts with TYPE$rrtype ($_)] unless /^TYPE\d+$/; |
422
|
|
|
|
|
|
|
my $known = $typebyname{$mnemonic}; |
423
|
|
|
|
|
|
|
croak qq["$mnemonic" conflicts with TYPE$known] if $known; |
424
|
|
|
|
|
|
|
$typebyval{$rrtype} = $mnemonic; |
425
|
|
|
|
|
|
|
$typebyname{$mnemonic} = $rrtype; |
426
|
|
|
|
|
|
|
} |
427
|
|
|
|
|
|
|
} |
428
|
|
|
|
|
|
|
return unless $generate; |
429
|
|
|
|
|
|
|
|
430
|
|
|
|
|
|
|
my $recipe = $instance->xlstorerecord( $identifier, @attribute ); |
431
|
|
|
|
|
|
|
return $instance->compilerr($recipe); |
432
|
|
|
|
|
|
|
} |
433
|
|
|
|
|
|
|
END |
434
|
|
|
|
|
|
|
} |
435
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
|
437
|
|
|
|
|
|
|
1; |
438
|
|
|
|
|
|
|
__END__ |