1
2
3 package dns
4
5 import (
6 "encoding/base64"
7 "net"
8 )
9
10
11 var TypeToRR = map[uint16]func() RR{
12 TypeA: func() RR { return new(A) },
13 TypeAAAA: func() RR { return new(AAAA) },
14 TypeAFSDB: func() RR { return new(AFSDB) },
15 TypeAMTRELAY: func() RR { return new(AMTRELAY) },
16 TypeANY: func() RR { return new(ANY) },
17 TypeAPL: func() RR { return new(APL) },
18 TypeAVC: func() RR { return new(AVC) },
19 TypeCAA: func() RR { return new(CAA) },
20 TypeCDNSKEY: func() RR { return new(CDNSKEY) },
21 TypeCDS: func() RR { return new(CDS) },
22 TypeCERT: func() RR { return new(CERT) },
23 TypeCNAME: func() RR { return new(CNAME) },
24 TypeCSYNC: func() RR { return new(CSYNC) },
25 TypeDHCID: func() RR { return new(DHCID) },
26 TypeDLV: func() RR { return new(DLV) },
27 TypeDNAME: func() RR { return new(DNAME) },
28 TypeDNSKEY: func() RR { return new(DNSKEY) },
29 TypeDS: func() RR { return new(DS) },
30 TypeEID: func() RR { return new(EID) },
31 TypeEUI48: func() RR { return new(EUI48) },
32 TypeEUI64: func() RR { return new(EUI64) },
33 TypeGID: func() RR { return new(GID) },
34 TypeGPOS: func() RR { return new(GPOS) },
35 TypeHINFO: func() RR { return new(HINFO) },
36 TypeHIP: func() RR { return new(HIP) },
37 TypeHTTPS: func() RR { return new(HTTPS) },
38 TypeIPSECKEY: func() RR { return new(IPSECKEY) },
39 TypeKEY: func() RR { return new(KEY) },
40 TypeKX: func() RR { return new(KX) },
41 TypeL32: func() RR { return new(L32) },
42 TypeL64: func() RR { return new(L64) },
43 TypeLOC: func() RR { return new(LOC) },
44 TypeLP: func() RR { return new(LP) },
45 TypeMB: func() RR { return new(MB) },
46 TypeMD: func() RR { return new(MD) },
47 TypeMF: func() RR { return new(MF) },
48 TypeMG: func() RR { return new(MG) },
49 TypeMINFO: func() RR { return new(MINFO) },
50 TypeMR: func() RR { return new(MR) },
51 TypeMX: func() RR { return new(MX) },
52 TypeNAPTR: func() RR { return new(NAPTR) },
53 TypeNID: func() RR { return new(NID) },
54 TypeNIMLOC: func() RR { return new(NIMLOC) },
55 TypeNINFO: func() RR { return new(NINFO) },
56 TypeNS: func() RR { return new(NS) },
57 TypeNSAPPTR: func() RR { return new(NSAPPTR) },
58 TypeNSEC: func() RR { return new(NSEC) },
59 TypeNSEC3: func() RR { return new(NSEC3) },
60 TypeNSEC3PARAM: func() RR { return new(NSEC3PARAM) },
61 TypeNULL: func() RR { return new(NULL) },
62 TypeOPENPGPKEY: func() RR { return new(OPENPGPKEY) },
63 TypeOPT: func() RR { return new(OPT) },
64 TypePTR: func() RR { return new(PTR) },
65 TypePX: func() RR { return new(PX) },
66 TypeRKEY: func() RR { return new(RKEY) },
67 TypeRP: func() RR { return new(RP) },
68 TypeRRSIG: func() RR { return new(RRSIG) },
69 TypeRT: func() RR { return new(RT) },
70 TypeSIG: func() RR { return new(SIG) },
71 TypeSMIMEA: func() RR { return new(SMIMEA) },
72 TypeSOA: func() RR { return new(SOA) },
73 TypeSPF: func() RR { return new(SPF) },
74 TypeSRV: func() RR { return new(SRV) },
75 TypeSSHFP: func() RR { return new(SSHFP) },
76 TypeSVCB: func() RR { return new(SVCB) },
77 TypeTA: func() RR { return new(TA) },
78 TypeTALINK: func() RR { return new(TALINK) },
79 TypeTKEY: func() RR { return new(TKEY) },
80 TypeTLSA: func() RR { return new(TLSA) },
81 TypeTSIG: func() RR { return new(TSIG) },
82 TypeTXT: func() RR { return new(TXT) },
83 TypeUID: func() RR { return new(UID) },
84 TypeUINFO: func() RR { return new(UINFO) },
85 TypeURI: func() RR { return new(URI) },
86 TypeX25: func() RR { return new(X25) },
87 TypeZONEMD: func() RR { return new(ZONEMD) },
88 }
89
90
91 var TypeToString = map[uint16]string{
92 TypeA: "A",
93 TypeAAAA: "AAAA",
94 TypeAFSDB: "AFSDB",
95 TypeAMTRELAY: "AMTRELAY",
96 TypeANY: "ANY",
97 TypeAPL: "APL",
98 TypeATMA: "ATMA",
99 TypeAVC: "AVC",
100 TypeAXFR: "AXFR",
101 TypeCAA: "CAA",
102 TypeCDNSKEY: "CDNSKEY",
103 TypeCDS: "CDS",
104 TypeCERT: "CERT",
105 TypeCNAME: "CNAME",
106 TypeCSYNC: "CSYNC",
107 TypeDHCID: "DHCID",
108 TypeDLV: "DLV",
109 TypeDNAME: "DNAME",
110 TypeDNSKEY: "DNSKEY",
111 TypeDS: "DS",
112 TypeEID: "EID",
113 TypeEUI48: "EUI48",
114 TypeEUI64: "EUI64",
115 TypeGID: "GID",
116 TypeGPOS: "GPOS",
117 TypeHINFO: "HINFO",
118 TypeHIP: "HIP",
119 TypeHTTPS: "HTTPS",
120 TypeIPSECKEY: "IPSECKEY",
121 TypeISDN: "ISDN",
122 TypeIXFR: "IXFR",
123 TypeKEY: "KEY",
124 TypeKX: "KX",
125 TypeL32: "L32",
126 TypeL64: "L64",
127 TypeLOC: "LOC",
128 TypeLP: "LP",
129 TypeMAILA: "MAILA",
130 TypeMAILB: "MAILB",
131 TypeMB: "MB",
132 TypeMD: "MD",
133 TypeMF: "MF",
134 TypeMG: "MG",
135 TypeMINFO: "MINFO",
136 TypeMR: "MR",
137 TypeMX: "MX",
138 TypeNAPTR: "NAPTR",
139 TypeNID: "NID",
140 TypeNIMLOC: "NIMLOC",
141 TypeNINFO: "NINFO",
142 TypeNS: "NS",
143 TypeNSEC: "NSEC",
144 TypeNSEC3: "NSEC3",
145 TypeNSEC3PARAM: "NSEC3PARAM",
146 TypeNULL: "NULL",
147 TypeNXT: "NXT",
148 TypeNone: "None",
149 TypeOPENPGPKEY: "OPENPGPKEY",
150 TypeOPT: "OPT",
151 TypePTR: "PTR",
152 TypePX: "PX",
153 TypeRKEY: "RKEY",
154 TypeRP: "RP",
155 TypeRRSIG: "RRSIG",
156 TypeRT: "RT",
157 TypeReserved: "Reserved",
158 TypeSIG: "SIG",
159 TypeSMIMEA: "SMIMEA",
160 TypeSOA: "SOA",
161 TypeSPF: "SPF",
162 TypeSRV: "SRV",
163 TypeSSHFP: "SSHFP",
164 TypeSVCB: "SVCB",
165 TypeTA: "TA",
166 TypeTALINK: "TALINK",
167 TypeTKEY: "TKEY",
168 TypeTLSA: "TLSA",
169 TypeTSIG: "TSIG",
170 TypeTXT: "TXT",
171 TypeUID: "UID",
172 TypeUINFO: "UINFO",
173 TypeUNSPEC: "UNSPEC",
174 TypeURI: "URI",
175 TypeX25: "X25",
176 TypeZONEMD: "ZONEMD",
177 TypeNSAPPTR: "NSAP-PTR",
178 }
179
180 func (rr *A) Header() *RR_Header { return &rr.Hdr }
181 func (rr *AAAA) Header() *RR_Header { return &rr.Hdr }
182 func (rr *AFSDB) Header() *RR_Header { return &rr.Hdr }
183 func (rr *AMTRELAY) Header() *RR_Header { return &rr.Hdr }
184 func (rr *ANY) Header() *RR_Header { return &rr.Hdr }
185 func (rr *APL) Header() *RR_Header { return &rr.Hdr }
186 func (rr *AVC) Header() *RR_Header { return &rr.Hdr }
187 func (rr *CAA) Header() *RR_Header { return &rr.Hdr }
188 func (rr *CDNSKEY) Header() *RR_Header { return &rr.Hdr }
189 func (rr *CDS) Header() *RR_Header { return &rr.Hdr }
190 func (rr *CERT) Header() *RR_Header { return &rr.Hdr }
191 func (rr *CNAME) Header() *RR_Header { return &rr.Hdr }
192 func (rr *CSYNC) Header() *RR_Header { return &rr.Hdr }
193 func (rr *DHCID) Header() *RR_Header { return &rr.Hdr }
194 func (rr *DLV) Header() *RR_Header { return &rr.Hdr }
195 func (rr *DNAME) Header() *RR_Header { return &rr.Hdr }
196 func (rr *DNSKEY) Header() *RR_Header { return &rr.Hdr }
197 func (rr *DS) Header() *RR_Header { return &rr.Hdr }
198 func (rr *EID) Header() *RR_Header { return &rr.Hdr }
199 func (rr *EUI48) Header() *RR_Header { return &rr.Hdr }
200 func (rr *EUI64) Header() *RR_Header { return &rr.Hdr }
201 func (rr *GID) Header() *RR_Header { return &rr.Hdr }
202 func (rr *GPOS) Header() *RR_Header { return &rr.Hdr }
203 func (rr *HINFO) Header() *RR_Header { return &rr.Hdr }
204 func (rr *HIP) Header() *RR_Header { return &rr.Hdr }
205 func (rr *HTTPS) Header() *RR_Header { return &rr.Hdr }
206 func (rr *IPSECKEY) Header() *RR_Header { return &rr.Hdr }
207 func (rr *KEY) Header() *RR_Header { return &rr.Hdr }
208 func (rr *KX) Header() *RR_Header { return &rr.Hdr }
209 func (rr *L32) Header() *RR_Header { return &rr.Hdr }
210 func (rr *L64) Header() *RR_Header { return &rr.Hdr }
211 func (rr *LOC) Header() *RR_Header { return &rr.Hdr }
212 func (rr *LP) Header() *RR_Header { return &rr.Hdr }
213 func (rr *MB) Header() *RR_Header { return &rr.Hdr }
214 func (rr *MD) Header() *RR_Header { return &rr.Hdr }
215 func (rr *MF) Header() *RR_Header { return &rr.Hdr }
216 func (rr *MG) Header() *RR_Header { return &rr.Hdr }
217 func (rr *MINFO) Header() *RR_Header { return &rr.Hdr }
218 func (rr *MR) Header() *RR_Header { return &rr.Hdr }
219 func (rr *MX) Header() *RR_Header { return &rr.Hdr }
220 func (rr *NAPTR) Header() *RR_Header { return &rr.Hdr }
221 func (rr *NID) Header() *RR_Header { return &rr.Hdr }
222 func (rr *NIMLOC) Header() *RR_Header { return &rr.Hdr }
223 func (rr *NINFO) Header() *RR_Header { return &rr.Hdr }
224 func (rr *NS) Header() *RR_Header { return &rr.Hdr }
225 func (rr *NSAPPTR) Header() *RR_Header { return &rr.Hdr }
226 func (rr *NSEC) Header() *RR_Header { return &rr.Hdr }
227 func (rr *NSEC3) Header() *RR_Header { return &rr.Hdr }
228 func (rr *NSEC3PARAM) Header() *RR_Header { return &rr.Hdr }
229 func (rr *NULL) Header() *RR_Header { return &rr.Hdr }
230 func (rr *OPENPGPKEY) Header() *RR_Header { return &rr.Hdr }
231 func (rr *OPT) Header() *RR_Header { return &rr.Hdr }
232 func (rr *PTR) Header() *RR_Header { return &rr.Hdr }
233 func (rr *PX) Header() *RR_Header { return &rr.Hdr }
234 func (rr *RFC3597) Header() *RR_Header { return &rr.Hdr }
235 func (rr *RKEY) Header() *RR_Header { return &rr.Hdr }
236 func (rr *RP) Header() *RR_Header { return &rr.Hdr }
237 func (rr *RRSIG) Header() *RR_Header { return &rr.Hdr }
238 func (rr *RT) Header() *RR_Header { return &rr.Hdr }
239 func (rr *SIG) Header() *RR_Header { return &rr.Hdr }
240 func (rr *SMIMEA) Header() *RR_Header { return &rr.Hdr }
241 func (rr *SOA) Header() *RR_Header { return &rr.Hdr }
242 func (rr *SPF) Header() *RR_Header { return &rr.Hdr }
243 func (rr *SRV) Header() *RR_Header { return &rr.Hdr }
244 func (rr *SSHFP) Header() *RR_Header { return &rr.Hdr }
245 func (rr *SVCB) Header() *RR_Header { return &rr.Hdr }
246 func (rr *TA) Header() *RR_Header { return &rr.Hdr }
247 func (rr *TALINK) Header() *RR_Header { return &rr.Hdr }
248 func (rr *TKEY) Header() *RR_Header { return &rr.Hdr }
249 func (rr *TLSA) Header() *RR_Header { return &rr.Hdr }
250 func (rr *TSIG) Header() *RR_Header { return &rr.Hdr }
251 func (rr *TXT) Header() *RR_Header { return &rr.Hdr }
252 func (rr *UID) Header() *RR_Header { return &rr.Hdr }
253 func (rr *UINFO) Header() *RR_Header { return &rr.Hdr }
254 func (rr *URI) Header() *RR_Header { return &rr.Hdr }
255 func (rr *X25) Header() *RR_Header { return &rr.Hdr }
256 func (rr *ZONEMD) Header() *RR_Header { return &rr.Hdr }
257
258
259 func (rr *A) len(off int, compression map[string]struct{}) int {
260 l := rr.Hdr.len(off, compression)
261 if len(rr.A) != 0 {
262 l += net.IPv4len
263 }
264 return l
265 }
266
267 func (rr *AAAA) len(off int, compression map[string]struct{}) int {
268 l := rr.Hdr.len(off, compression)
269 if len(rr.AAAA) != 0 {
270 l += net.IPv6len
271 }
272 return l
273 }
274
275 func (rr *AFSDB) len(off int, compression map[string]struct{}) int {
276 l := rr.Hdr.len(off, compression)
277 l += 2
278 l += domainNameLen(rr.Hostname, off+l, compression, false)
279 return l
280 }
281
282 func (rr *AMTRELAY) len(off int, compression map[string]struct{}) int {
283 l := rr.Hdr.len(off, compression)
284 l++
285 l++
286 switch rr.GatewayType {
287 case AMTRELAYIPv4:
288 l += net.IPv4len
289 case AMTRELAYIPv6:
290 l += net.IPv6len
291 case AMTRELAYHost:
292 l += len(rr.GatewayHost) + 1
293 }
294 return l
295 }
296
297 func (rr *ANY) len(off int, compression map[string]struct{}) int {
298 l := rr.Hdr.len(off, compression)
299 return l
300 }
301
302 func (rr *APL) len(off int, compression map[string]struct{}) int {
303 l := rr.Hdr.len(off, compression)
304 for _, x := range rr.Prefixes {
305 l += x.len()
306 }
307 return l
308 }
309
310 func (rr *AVC) len(off int, compression map[string]struct{}) int {
311 l := rr.Hdr.len(off, compression)
312 for _, x := range rr.Txt {
313 l += len(x) + 1
314 }
315 return l
316 }
317
318 func (rr *CAA) len(off int, compression map[string]struct{}) int {
319 l := rr.Hdr.len(off, compression)
320 l++
321 l += len(rr.Tag) + 1
322 l += len(rr.Value)
323 return l
324 }
325
326 func (rr *CERT) len(off int, compression map[string]struct{}) int {
327 l := rr.Hdr.len(off, compression)
328 l += 2
329 l += 2
330 l++
331 l += base64.StdEncoding.DecodedLen(len(rr.Certificate))
332 return l
333 }
334
335 func (rr *CNAME) len(off int, compression map[string]struct{}) int {
336 l := rr.Hdr.len(off, compression)
337 l += domainNameLen(rr.Target, off+l, compression, true)
338 return l
339 }
340
341 func (rr *DHCID) len(off int, compression map[string]struct{}) int {
342 l := rr.Hdr.len(off, compression)
343 l += base64.StdEncoding.DecodedLen(len(rr.Digest))
344 return l
345 }
346
347 func (rr *DNAME) len(off int, compression map[string]struct{}) int {
348 l := rr.Hdr.len(off, compression)
349 l += domainNameLen(rr.Target, off+l, compression, false)
350 return l
351 }
352
353 func (rr *DNSKEY) len(off int, compression map[string]struct{}) int {
354 l := rr.Hdr.len(off, compression)
355 l += 2
356 l++
357 l++
358 l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
359 return l
360 }
361
362 func (rr *DS) len(off int, compression map[string]struct{}) int {
363 l := rr.Hdr.len(off, compression)
364 l += 2
365 l++
366 l++
367 l += len(rr.Digest) / 2
368 return l
369 }
370
371 func (rr *EID) len(off int, compression map[string]struct{}) int {
372 l := rr.Hdr.len(off, compression)
373 l += len(rr.Endpoint) / 2
374 return l
375 }
376
377 func (rr *EUI48) len(off int, compression map[string]struct{}) int {
378 l := rr.Hdr.len(off, compression)
379 l += 6
380 return l
381 }
382
383 func (rr *EUI64) len(off int, compression map[string]struct{}) int {
384 l := rr.Hdr.len(off, compression)
385 l += 8
386 return l
387 }
388
389 func (rr *GID) len(off int, compression map[string]struct{}) int {
390 l := rr.Hdr.len(off, compression)
391 l += 4
392 return l
393 }
394
395 func (rr *GPOS) len(off int, compression map[string]struct{}) int {
396 l := rr.Hdr.len(off, compression)
397 l += len(rr.Longitude) + 1
398 l += len(rr.Latitude) + 1
399 l += len(rr.Altitude) + 1
400 return l
401 }
402
403 func (rr *HINFO) len(off int, compression map[string]struct{}) int {
404 l := rr.Hdr.len(off, compression)
405 l += len(rr.Cpu) + 1
406 l += len(rr.Os) + 1
407 return l
408 }
409
410 func (rr *HIP) len(off int, compression map[string]struct{}) int {
411 l := rr.Hdr.len(off, compression)
412 l++
413 l++
414 l += 2
415 l += len(rr.Hit) / 2
416 l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
417 for _, x := range rr.RendezvousServers {
418 l += domainNameLen(x, off+l, compression, false)
419 }
420 return l
421 }
422
423 func (rr *IPSECKEY) len(off int, compression map[string]struct{}) int {
424 l := rr.Hdr.len(off, compression)
425 l++
426 l++
427 l++
428 switch rr.GatewayType {
429 case IPSECGatewayIPv4:
430 l += net.IPv4len
431 case IPSECGatewayIPv6:
432 l += net.IPv6len
433 case IPSECGatewayHost:
434 l += len(rr.GatewayHost) + 1
435 }
436 l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
437 return l
438 }
439
440 func (rr *KX) len(off int, compression map[string]struct{}) int {
441 l := rr.Hdr.len(off, compression)
442 l += 2
443 l += domainNameLen(rr.Exchanger, off+l, compression, false)
444 return l
445 }
446
447 func (rr *L32) len(off int, compression map[string]struct{}) int {
448 l := rr.Hdr.len(off, compression)
449 l += 2
450 if len(rr.Locator32) != 0 {
451 l += net.IPv4len
452 }
453 return l
454 }
455
456 func (rr *L64) len(off int, compression map[string]struct{}) int {
457 l := rr.Hdr.len(off, compression)
458 l += 2
459 l += 8
460 return l
461 }
462
463 func (rr *LOC) len(off int, compression map[string]struct{}) int {
464 l := rr.Hdr.len(off, compression)
465 l++
466 l++
467 l++
468 l++
469 l += 4
470 l += 4
471 l += 4
472 return l
473 }
474
475 func (rr *LP) len(off int, compression map[string]struct{}) int {
476 l := rr.Hdr.len(off, compression)
477 l += 2
478 l += domainNameLen(rr.Fqdn, off+l, compression, false)
479 return l
480 }
481
482 func (rr *MB) len(off int, compression map[string]struct{}) int {
483 l := rr.Hdr.len(off, compression)
484 l += domainNameLen(rr.Mb, off+l, compression, true)
485 return l
486 }
487
488 func (rr *MD) len(off int, compression map[string]struct{}) int {
489 l := rr.Hdr.len(off, compression)
490 l += domainNameLen(rr.Md, off+l, compression, true)
491 return l
492 }
493
494 func (rr *MF) len(off int, compression map[string]struct{}) int {
495 l := rr.Hdr.len(off, compression)
496 l += domainNameLen(rr.Mf, off+l, compression, true)
497 return l
498 }
499
500 func (rr *MG) len(off int, compression map[string]struct{}) int {
501 l := rr.Hdr.len(off, compression)
502 l += domainNameLen(rr.Mg, off+l, compression, true)
503 return l
504 }
505
506 func (rr *MINFO) len(off int, compression map[string]struct{}) int {
507 l := rr.Hdr.len(off, compression)
508 l += domainNameLen(rr.Rmail, off+l, compression, true)
509 l += domainNameLen(rr.Email, off+l, compression, true)
510 return l
511 }
512
513 func (rr *MR) len(off int, compression map[string]struct{}) int {
514 l := rr.Hdr.len(off, compression)
515 l += domainNameLen(rr.Mr, off+l, compression, true)
516 return l
517 }
518
519 func (rr *MX) len(off int, compression map[string]struct{}) int {
520 l := rr.Hdr.len(off, compression)
521 l += 2
522 l += domainNameLen(rr.Mx, off+l, compression, true)
523 return l
524 }
525
526 func (rr *NAPTR) len(off int, compression map[string]struct{}) int {
527 l := rr.Hdr.len(off, compression)
528 l += 2
529 l += 2
530 l += len(rr.Flags) + 1
531 l += len(rr.Service) + 1
532 l += len(rr.Regexp) + 1
533 l += domainNameLen(rr.Replacement, off+l, compression, false)
534 return l
535 }
536
537 func (rr *NID) len(off int, compression map[string]struct{}) int {
538 l := rr.Hdr.len(off, compression)
539 l += 2
540 l += 8
541 return l
542 }
543
544 func (rr *NIMLOC) len(off int, compression map[string]struct{}) int {
545 l := rr.Hdr.len(off, compression)
546 l += len(rr.Locator) / 2
547 return l
548 }
549
550 func (rr *NINFO) len(off int, compression map[string]struct{}) int {
551 l := rr.Hdr.len(off, compression)
552 for _, x := range rr.ZSData {
553 l += len(x) + 1
554 }
555 return l
556 }
557
558 func (rr *NS) len(off int, compression map[string]struct{}) int {
559 l := rr.Hdr.len(off, compression)
560 l += domainNameLen(rr.Ns, off+l, compression, true)
561 return l
562 }
563
564 func (rr *NSAPPTR) len(off int, compression map[string]struct{}) int {
565 l := rr.Hdr.len(off, compression)
566 l += domainNameLen(rr.Ptr, off+l, compression, false)
567 return l
568 }
569
570 func (rr *NSEC3PARAM) len(off int, compression map[string]struct{}) int {
571 l := rr.Hdr.len(off, compression)
572 l++
573 l++
574 l += 2
575 l++
576 l += len(rr.Salt) / 2
577 return l
578 }
579
580 func (rr *NULL) len(off int, compression map[string]struct{}) int {
581 l := rr.Hdr.len(off, compression)
582 l += len(rr.Data)
583 return l
584 }
585
586 func (rr *OPENPGPKEY) len(off int, compression map[string]struct{}) int {
587 l := rr.Hdr.len(off, compression)
588 l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
589 return l
590 }
591
592 func (rr *PTR) len(off int, compression map[string]struct{}) int {
593 l := rr.Hdr.len(off, compression)
594 l += domainNameLen(rr.Ptr, off+l, compression, true)
595 return l
596 }
597
598 func (rr *PX) len(off int, compression map[string]struct{}) int {
599 l := rr.Hdr.len(off, compression)
600 l += 2
601 l += domainNameLen(rr.Map822, off+l, compression, false)
602 l += domainNameLen(rr.Mapx400, off+l, compression, false)
603 return l
604 }
605
606 func (rr *RFC3597) len(off int, compression map[string]struct{}) int {
607 l := rr.Hdr.len(off, compression)
608 l += len(rr.Rdata) / 2
609 return l
610 }
611
612 func (rr *RKEY) len(off int, compression map[string]struct{}) int {
613 l := rr.Hdr.len(off, compression)
614 l += 2
615 l++
616 l++
617 l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
618 return l
619 }
620
621 func (rr *RP) len(off int, compression map[string]struct{}) int {
622 l := rr.Hdr.len(off, compression)
623 l += domainNameLen(rr.Mbox, off+l, compression, false)
624 l += domainNameLen(rr.Txt, off+l, compression, false)
625 return l
626 }
627
628 func (rr *RRSIG) len(off int, compression map[string]struct{}) int {
629 l := rr.Hdr.len(off, compression)
630 l += 2
631 l++
632 l++
633 l += 4
634 l += 4
635 l += 4
636 l += 2
637 l += domainNameLen(rr.SignerName, off+l, compression, false)
638 l += base64.StdEncoding.DecodedLen(len(rr.Signature))
639 return l
640 }
641
642 func (rr *RT) len(off int, compression map[string]struct{}) int {
643 l := rr.Hdr.len(off, compression)
644 l += 2
645 l += domainNameLen(rr.Host, off+l, compression, false)
646 return l
647 }
648
649 func (rr *SMIMEA) len(off int, compression map[string]struct{}) int {
650 l := rr.Hdr.len(off, compression)
651 l++
652 l++
653 l++
654 l += len(rr.Certificate) / 2
655 return l
656 }
657
658 func (rr *SOA) len(off int, compression map[string]struct{}) int {
659 l := rr.Hdr.len(off, compression)
660 l += domainNameLen(rr.Ns, off+l, compression, true)
661 l += domainNameLen(rr.Mbox, off+l, compression, true)
662 l += 4
663 l += 4
664 l += 4
665 l += 4
666 l += 4
667 return l
668 }
669
670 func (rr *SPF) len(off int, compression map[string]struct{}) int {
671 l := rr.Hdr.len(off, compression)
672 for _, x := range rr.Txt {
673 l += len(x) + 1
674 }
675 return l
676 }
677
678 func (rr *SRV) len(off int, compression map[string]struct{}) int {
679 l := rr.Hdr.len(off, compression)
680 l += 2
681 l += 2
682 l += 2
683 l += domainNameLen(rr.Target, off+l, compression, false)
684 return l
685 }
686
687 func (rr *SSHFP) len(off int, compression map[string]struct{}) int {
688 l := rr.Hdr.len(off, compression)
689 l++
690 l++
691 l += len(rr.FingerPrint) / 2
692 return l
693 }
694
695 func (rr *SVCB) len(off int, compression map[string]struct{}) int {
696 l := rr.Hdr.len(off, compression)
697 l += 2
698 l += domainNameLen(rr.Target, off+l, compression, false)
699 for _, x := range rr.Value {
700 l += 4 + int(x.len())
701 }
702 return l
703 }
704
705 func (rr *TA) len(off int, compression map[string]struct{}) int {
706 l := rr.Hdr.len(off, compression)
707 l += 2
708 l++
709 l++
710 l += len(rr.Digest) / 2
711 return l
712 }
713
714 func (rr *TALINK) len(off int, compression map[string]struct{}) int {
715 l := rr.Hdr.len(off, compression)
716 l += domainNameLen(rr.PreviousName, off+l, compression, false)
717 l += domainNameLen(rr.NextName, off+l, compression, false)
718 return l
719 }
720
721 func (rr *TKEY) len(off int, compression map[string]struct{}) int {
722 l := rr.Hdr.len(off, compression)
723 l += domainNameLen(rr.Algorithm, off+l, compression, false)
724 l += 4
725 l += 4
726 l += 2
727 l += 2
728 l += 2
729 l += len(rr.Key) / 2
730 l += 2
731 l += len(rr.OtherData) / 2
732 return l
733 }
734
735 func (rr *TLSA) len(off int, compression map[string]struct{}) int {
736 l := rr.Hdr.len(off, compression)
737 l++
738 l++
739 l++
740 l += len(rr.Certificate) / 2
741 return l
742 }
743
744 func (rr *TSIG) len(off int, compression map[string]struct{}) int {
745 l := rr.Hdr.len(off, compression)
746 l += domainNameLen(rr.Algorithm, off+l, compression, false)
747 l += 6
748 l += 2
749 l += 2
750 l += len(rr.MAC) / 2
751 l += 2
752 l += 2
753 l += 2
754 l += len(rr.OtherData) / 2
755 return l
756 }
757
758 func (rr *TXT) len(off int, compression map[string]struct{}) int {
759 l := rr.Hdr.len(off, compression)
760 for _, x := range rr.Txt {
761 l += len(x) + 1
762 }
763 return l
764 }
765
766 func (rr *UID) len(off int, compression map[string]struct{}) int {
767 l := rr.Hdr.len(off, compression)
768 l += 4
769 return l
770 }
771
772 func (rr *UINFO) len(off int, compression map[string]struct{}) int {
773 l := rr.Hdr.len(off, compression)
774 l += len(rr.Uinfo) + 1
775 return l
776 }
777
778 func (rr *URI) len(off int, compression map[string]struct{}) int {
779 l := rr.Hdr.len(off, compression)
780 l += 2
781 l += 2
782 l += len(rr.Target)
783 return l
784 }
785
786 func (rr *X25) len(off int, compression map[string]struct{}) int {
787 l := rr.Hdr.len(off, compression)
788 l += len(rr.PSDNAddress) + 1
789 return l
790 }
791
792 func (rr *ZONEMD) len(off int, compression map[string]struct{}) int {
793 l := rr.Hdr.len(off, compression)
794 l += 4
795 l++
796 l++
797 l += len(rr.Digest) / 2
798 return l
799 }
800
801
802 func (rr *A) copy() RR {
803 return &A{rr.Hdr, cloneSlice(rr.A)}
804 }
805
806 func (rr *AAAA) copy() RR {
807 return &AAAA{rr.Hdr, cloneSlice(rr.AAAA)}
808 }
809
810 func (rr *AFSDB) copy() RR {
811 return &AFSDB{rr.Hdr, rr.Subtype, rr.Hostname}
812 }
813
814 func (rr *AMTRELAY) copy() RR {
815 return &AMTRELAY{
816 rr.Hdr,
817 rr.Precedence,
818 rr.GatewayType,
819 cloneSlice(rr.GatewayAddr),
820 rr.GatewayHost,
821 }
822 }
823
824 func (rr *ANY) copy() RR {
825 return &ANY{rr.Hdr}
826 }
827
828 func (rr *APL) copy() RR {
829 Prefixes := make([]APLPrefix, len(rr.Prefixes))
830 for i, e := range rr.Prefixes {
831 Prefixes[i] = e.copy()
832 }
833 return &APL{rr.Hdr, Prefixes}
834 }
835
836 func (rr *AVC) copy() RR {
837 return &AVC{rr.Hdr, cloneSlice(rr.Txt)}
838 }
839
840 func (rr *CAA) copy() RR {
841 return &CAA{
842 rr.Hdr,
843 rr.Flag,
844 rr.Tag,
845 rr.Value,
846 }
847 }
848
849 func (rr *CDNSKEY) copy() RR {
850 return &CDNSKEY{*rr.DNSKEY.copy().(*DNSKEY)}
851 }
852
853 func (rr *CDS) copy() RR {
854 return &CDS{*rr.DS.copy().(*DS)}
855 }
856
857 func (rr *CERT) copy() RR {
858 return &CERT{
859 rr.Hdr,
860 rr.Type,
861 rr.KeyTag,
862 rr.Algorithm,
863 rr.Certificate,
864 }
865 }
866
867 func (rr *CNAME) copy() RR {
868 return &CNAME{rr.Hdr, rr.Target}
869 }
870
871 func (rr *CSYNC) copy() RR {
872 return &CSYNC{
873 rr.Hdr,
874 rr.Serial,
875 rr.Flags,
876 cloneSlice(rr.TypeBitMap),
877 }
878 }
879
880 func (rr *DHCID) copy() RR {
881 return &DHCID{rr.Hdr, rr.Digest}
882 }
883
884 func (rr *DLV) copy() RR {
885 return &DLV{*rr.DS.copy().(*DS)}
886 }
887
888 func (rr *DNAME) copy() RR {
889 return &DNAME{rr.Hdr, rr.Target}
890 }
891
892 func (rr *DNSKEY) copy() RR {
893 return &DNSKEY{
894 rr.Hdr,
895 rr.Flags,
896 rr.Protocol,
897 rr.Algorithm,
898 rr.PublicKey,
899 }
900 }
901
902 func (rr *DS) copy() RR {
903 return &DS{
904 rr.Hdr,
905 rr.KeyTag,
906 rr.Algorithm,
907 rr.DigestType,
908 rr.Digest,
909 }
910 }
911
912 func (rr *EID) copy() RR {
913 return &EID{rr.Hdr, rr.Endpoint}
914 }
915
916 func (rr *EUI48) copy() RR {
917 return &EUI48{rr.Hdr, rr.Address}
918 }
919
920 func (rr *EUI64) copy() RR {
921 return &EUI64{rr.Hdr, rr.Address}
922 }
923
924 func (rr *GID) copy() RR {
925 return &GID{rr.Hdr, rr.Gid}
926 }
927
928 func (rr *GPOS) copy() RR {
929 return &GPOS{
930 rr.Hdr,
931 rr.Longitude,
932 rr.Latitude,
933 rr.Altitude,
934 }
935 }
936
937 func (rr *HINFO) copy() RR {
938 return &HINFO{rr.Hdr, rr.Cpu, rr.Os}
939 }
940
941 func (rr *HIP) copy() RR {
942 return &HIP{
943 rr.Hdr,
944 rr.HitLength,
945 rr.PublicKeyAlgorithm,
946 rr.PublicKeyLength,
947 rr.Hit,
948 rr.PublicKey,
949 cloneSlice(rr.RendezvousServers),
950 }
951 }
952
953 func (rr *HTTPS) copy() RR {
954 return &HTTPS{*rr.SVCB.copy().(*SVCB)}
955 }
956
957 func (rr *IPSECKEY) copy() RR {
958 return &IPSECKEY{
959 rr.Hdr,
960 rr.Precedence,
961 rr.GatewayType,
962 rr.Algorithm,
963 cloneSlice(rr.GatewayAddr),
964 rr.GatewayHost,
965 rr.PublicKey,
966 }
967 }
968
969 func (rr *KEY) copy() RR {
970 return &KEY{*rr.DNSKEY.copy().(*DNSKEY)}
971 }
972
973 func (rr *KX) copy() RR {
974 return &KX{rr.Hdr, rr.Preference, rr.Exchanger}
975 }
976
977 func (rr *L32) copy() RR {
978 return &L32{rr.Hdr, rr.Preference, cloneSlice(rr.Locator32)}
979 }
980
981 func (rr *L64) copy() RR {
982 return &L64{rr.Hdr, rr.Preference, rr.Locator64}
983 }
984
985 func (rr *LOC) copy() RR {
986 return &LOC{
987 rr.Hdr,
988 rr.Version,
989 rr.Size,
990 rr.HorizPre,
991 rr.VertPre,
992 rr.Latitude,
993 rr.Longitude,
994 rr.Altitude,
995 }
996 }
997
998 func (rr *LP) copy() RR {
999 return &LP{rr.Hdr, rr.Preference, rr.Fqdn}
1000 }
1001
1002 func (rr *MB) copy() RR {
1003 return &MB{rr.Hdr, rr.Mb}
1004 }
1005
1006 func (rr *MD) copy() RR {
1007 return &MD{rr.Hdr, rr.Md}
1008 }
1009
1010 func (rr *MF) copy() RR {
1011 return &MF{rr.Hdr, rr.Mf}
1012 }
1013
1014 func (rr *MG) copy() RR {
1015 return &MG{rr.Hdr, rr.Mg}
1016 }
1017
1018 func (rr *MINFO) copy() RR {
1019 return &MINFO{rr.Hdr, rr.Rmail, rr.Email}
1020 }
1021
1022 func (rr *MR) copy() RR {
1023 return &MR{rr.Hdr, rr.Mr}
1024 }
1025
1026 func (rr *MX) copy() RR {
1027 return &MX{rr.Hdr, rr.Preference, rr.Mx}
1028 }
1029
1030 func (rr *NAPTR) copy() RR {
1031 return &NAPTR{
1032 rr.Hdr,
1033 rr.Order,
1034 rr.Preference,
1035 rr.Flags,
1036 rr.Service,
1037 rr.Regexp,
1038 rr.Replacement,
1039 }
1040 }
1041
1042 func (rr *NID) copy() RR {
1043 return &NID{rr.Hdr, rr.Preference, rr.NodeID}
1044 }
1045
1046 func (rr *NIMLOC) copy() RR {
1047 return &NIMLOC{rr.Hdr, rr.Locator}
1048 }
1049
1050 func (rr *NINFO) copy() RR {
1051 return &NINFO{rr.Hdr, cloneSlice(rr.ZSData)}
1052 }
1053
1054 func (rr *NS) copy() RR {
1055 return &NS{rr.Hdr, rr.Ns}
1056 }
1057
1058 func (rr *NSAPPTR) copy() RR {
1059 return &NSAPPTR{rr.Hdr, rr.Ptr}
1060 }
1061
1062 func (rr *NSEC) copy() RR {
1063 return &NSEC{rr.Hdr, rr.NextDomain, cloneSlice(rr.TypeBitMap)}
1064 }
1065
1066 func (rr *NSEC3) copy() RR {
1067 return &NSEC3{
1068 rr.Hdr,
1069 rr.Hash,
1070 rr.Flags,
1071 rr.Iterations,
1072 rr.SaltLength,
1073 rr.Salt,
1074 rr.HashLength,
1075 rr.NextDomain,
1076 cloneSlice(rr.TypeBitMap),
1077 }
1078 }
1079
1080 func (rr *NSEC3PARAM) copy() RR {
1081 return &NSEC3PARAM{
1082 rr.Hdr,
1083 rr.Hash,
1084 rr.Flags,
1085 rr.Iterations,
1086 rr.SaltLength,
1087 rr.Salt,
1088 }
1089 }
1090
1091 func (rr *NULL) copy() RR {
1092 return &NULL{rr.Hdr, rr.Data}
1093 }
1094
1095 func (rr *OPENPGPKEY) copy() RR {
1096 return &OPENPGPKEY{rr.Hdr, rr.PublicKey}
1097 }
1098
1099 func (rr *OPT) copy() RR {
1100 Option := make([]EDNS0, len(rr.Option))
1101 for i, e := range rr.Option {
1102 Option[i] = e.copy()
1103 }
1104 return &OPT{rr.Hdr, Option}
1105 }
1106
1107 func (rr *PTR) copy() RR {
1108 return &PTR{rr.Hdr, rr.Ptr}
1109 }
1110
1111 func (rr *PX) copy() RR {
1112 return &PX{
1113 rr.Hdr,
1114 rr.Preference,
1115 rr.Map822,
1116 rr.Mapx400,
1117 }
1118 }
1119
1120 func (rr *RFC3597) copy() RR {
1121 return &RFC3597{rr.Hdr, rr.Rdata}
1122 }
1123
1124 func (rr *RKEY) copy() RR {
1125 return &RKEY{
1126 rr.Hdr,
1127 rr.Flags,
1128 rr.Protocol,
1129 rr.Algorithm,
1130 rr.PublicKey,
1131 }
1132 }
1133
1134 func (rr *RP) copy() RR {
1135 return &RP{rr.Hdr, rr.Mbox, rr.Txt}
1136 }
1137
1138 func (rr *RRSIG) copy() RR {
1139 return &RRSIG{
1140 rr.Hdr,
1141 rr.TypeCovered,
1142 rr.Algorithm,
1143 rr.Labels,
1144 rr.OrigTtl,
1145 rr.Expiration,
1146 rr.Inception,
1147 rr.KeyTag,
1148 rr.SignerName,
1149 rr.Signature,
1150 }
1151 }
1152
1153 func (rr *RT) copy() RR {
1154 return &RT{rr.Hdr, rr.Preference, rr.Host}
1155 }
1156
1157 func (rr *SIG) copy() RR {
1158 return &SIG{*rr.RRSIG.copy().(*RRSIG)}
1159 }
1160
1161 func (rr *SMIMEA) copy() RR {
1162 return &SMIMEA{
1163 rr.Hdr,
1164 rr.Usage,
1165 rr.Selector,
1166 rr.MatchingType,
1167 rr.Certificate,
1168 }
1169 }
1170
1171 func (rr *SOA) copy() RR {
1172 return &SOA{
1173 rr.Hdr,
1174 rr.Ns,
1175 rr.Mbox,
1176 rr.Serial,
1177 rr.Refresh,
1178 rr.Retry,
1179 rr.Expire,
1180 rr.Minttl,
1181 }
1182 }
1183
1184 func (rr *SPF) copy() RR {
1185 return &SPF{rr.Hdr, cloneSlice(rr.Txt)}
1186 }
1187
1188 func (rr *SRV) copy() RR {
1189 return &SRV{
1190 rr.Hdr,
1191 rr.Priority,
1192 rr.Weight,
1193 rr.Port,
1194 rr.Target,
1195 }
1196 }
1197
1198 func (rr *SSHFP) copy() RR {
1199 return &SSHFP{
1200 rr.Hdr,
1201 rr.Algorithm,
1202 rr.Type,
1203 rr.FingerPrint,
1204 }
1205 }
1206
1207 func (rr *SVCB) copy() RR {
1208 Value := make([]SVCBKeyValue, len(rr.Value))
1209 for i, e := range rr.Value {
1210 Value[i] = e.copy()
1211 }
1212 return &SVCB{
1213 rr.Hdr,
1214 rr.Priority,
1215 rr.Target,
1216 Value,
1217 }
1218 }
1219
1220 func (rr *TA) copy() RR {
1221 return &TA{
1222 rr.Hdr,
1223 rr.KeyTag,
1224 rr.Algorithm,
1225 rr.DigestType,
1226 rr.Digest,
1227 }
1228 }
1229
1230 func (rr *TALINK) copy() RR {
1231 return &TALINK{rr.Hdr, rr.PreviousName, rr.NextName}
1232 }
1233
1234 func (rr *TKEY) copy() RR {
1235 return &TKEY{
1236 rr.Hdr,
1237 rr.Algorithm,
1238 rr.Inception,
1239 rr.Expiration,
1240 rr.Mode,
1241 rr.Error,
1242 rr.KeySize,
1243 rr.Key,
1244 rr.OtherLen,
1245 rr.OtherData,
1246 }
1247 }
1248
1249 func (rr *TLSA) copy() RR {
1250 return &TLSA{
1251 rr.Hdr,
1252 rr.Usage,
1253 rr.Selector,
1254 rr.MatchingType,
1255 rr.Certificate,
1256 }
1257 }
1258
1259 func (rr *TSIG) copy() RR {
1260 return &TSIG{
1261 rr.Hdr,
1262 rr.Algorithm,
1263 rr.TimeSigned,
1264 rr.Fudge,
1265 rr.MACSize,
1266 rr.MAC,
1267 rr.OrigId,
1268 rr.Error,
1269 rr.OtherLen,
1270 rr.OtherData,
1271 }
1272 }
1273
1274 func (rr *TXT) copy() RR {
1275 return &TXT{rr.Hdr, cloneSlice(rr.Txt)}
1276 }
1277
1278 func (rr *UID) copy() RR {
1279 return &UID{rr.Hdr, rr.Uid}
1280 }
1281
1282 func (rr *UINFO) copy() RR {
1283 return &UINFO{rr.Hdr, rr.Uinfo}
1284 }
1285
1286 func (rr *URI) copy() RR {
1287 return &URI{
1288 rr.Hdr,
1289 rr.Priority,
1290 rr.Weight,
1291 rr.Target,
1292 }
1293 }
1294
1295 func (rr *X25) copy() RR {
1296 return &X25{rr.Hdr, rr.PSDNAddress}
1297 }
1298
1299 func (rr *ZONEMD) copy() RR {
1300 return &ZONEMD{
1301 rr.Hdr,
1302 rr.Serial,
1303 rr.Scheme,
1304 rr.Hash,
1305 rr.Digest,
1306 }
1307 }
1308
View as plain text