1// Code generated by "go run types_generate.go"; DO NOT EDIT.
2
3package dns
4
5import (
6	"encoding/base64"
7	"net"
8)
9
10// TypeToRR is a map of constructors for each RR type.
11var 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	TypeANY:        func() RR { return new(ANY) },
16	TypeAPL:        func() RR { return new(APL) },
17	TypeAVC:        func() RR { return new(AVC) },
18	TypeCAA:        func() RR { return new(CAA) },
19	TypeCDNSKEY:    func() RR { return new(CDNSKEY) },
20	TypeCDS:        func() RR { return new(CDS) },
21	TypeCERT:       func() RR { return new(CERT) },
22	TypeCNAME:      func() RR { return new(CNAME) },
23	TypeCSYNC:      func() RR { return new(CSYNC) },
24	TypeDHCID:      func() RR { return new(DHCID) },
25	TypeDLV:        func() RR { return new(DLV) },
26	TypeDNAME:      func() RR { return new(DNAME) },
27	TypeDNSKEY:     func() RR { return new(DNSKEY) },
28	TypeDS:         func() RR { return new(DS) },
29	TypeEID:        func() RR { return new(EID) },
30	TypeEUI48:      func() RR { return new(EUI48) },
31	TypeEUI64:      func() RR { return new(EUI64) },
32	TypeGID:        func() RR { return new(GID) },
33	TypeGPOS:       func() RR { return new(GPOS) },
34	TypeHINFO:      func() RR { return new(HINFO) },
35	TypeHIP:        func() RR { return new(HIP) },
36	TypeKEY:        func() RR { return new(KEY) },
37	TypeKX:         func() RR { return new(KX) },
38	TypeL32:        func() RR { return new(L32) },
39	TypeL64:        func() RR { return new(L64) },
40	TypeLOC:        func() RR { return new(LOC) },
41	TypeLP:         func() RR { return new(LP) },
42	TypeMB:         func() RR { return new(MB) },
43	TypeMD:         func() RR { return new(MD) },
44	TypeMF:         func() RR { return new(MF) },
45	TypeMG:         func() RR { return new(MG) },
46	TypeMINFO:      func() RR { return new(MINFO) },
47	TypeMR:         func() RR { return new(MR) },
48	TypeMX:         func() RR { return new(MX) },
49	TypeNAPTR:      func() RR { return new(NAPTR) },
50	TypeNID:        func() RR { return new(NID) },
51	TypeNIMLOC:     func() RR { return new(NIMLOC) },
52	TypeNINFO:      func() RR { return new(NINFO) },
53	TypeNS:         func() RR { return new(NS) },
54	TypeNSAPPTR:    func() RR { return new(NSAPPTR) },
55	TypeNSEC:       func() RR { return new(NSEC) },
56	TypeNSEC3:      func() RR { return new(NSEC3) },
57	TypeNSEC3PARAM: func() RR { return new(NSEC3PARAM) },
58	TypeNULL:       func() RR { return new(NULL) },
59	TypeOPENPGPKEY: func() RR { return new(OPENPGPKEY) },
60	TypeOPT:        func() RR { return new(OPT) },
61	TypePTR:        func() RR { return new(PTR) },
62	TypePX:         func() RR { return new(PX) },
63	TypeRKEY:       func() RR { return new(RKEY) },
64	TypeRP:         func() RR { return new(RP) },
65	TypeRRSIG:      func() RR { return new(RRSIG) },
66	TypeRT:         func() RR { return new(RT) },
67	TypeSIG:        func() RR { return new(SIG) },
68	TypeSMIMEA:     func() RR { return new(SMIMEA) },
69	TypeSOA:        func() RR { return new(SOA) },
70	TypeSPF:        func() RR { return new(SPF) },
71	TypeSRV:        func() RR { return new(SRV) },
72	TypeSSHFP:      func() RR { return new(SSHFP) },
73	TypeTA:         func() RR { return new(TA) },
74	TypeTALINK:     func() RR { return new(TALINK) },
75	TypeTKEY:       func() RR { return new(TKEY) },
76	TypeTLSA:       func() RR { return new(TLSA) },
77	TypeTSIG:       func() RR { return new(TSIG) },
78	TypeTXT:        func() RR { return new(TXT) },
79	TypeUID:        func() RR { return new(UID) },
80	TypeUINFO:      func() RR { return new(UINFO) },
81	TypeURI:        func() RR { return new(URI) },
82	TypeX25:        func() RR { return new(X25) },
83}
84
85// TypeToString is a map of strings for each RR type.
86var TypeToString = map[uint16]string{
87	TypeA:          "A",
88	TypeAAAA:       "AAAA",
89	TypeAFSDB:      "AFSDB",
90	TypeANY:        "ANY",
91	TypeAPL:        "APL",
92	TypeATMA:       "ATMA",
93	TypeAVC:        "AVC",
94	TypeAXFR:       "AXFR",
95	TypeCAA:        "CAA",
96	TypeCDNSKEY:    "CDNSKEY",
97	TypeCDS:        "CDS",
98	TypeCERT:       "CERT",
99	TypeCNAME:      "CNAME",
100	TypeCSYNC:      "CSYNC",
101	TypeDHCID:      "DHCID",
102	TypeDLV:        "DLV",
103	TypeDNAME:      "DNAME",
104	TypeDNSKEY:     "DNSKEY",
105	TypeDS:         "DS",
106	TypeEID:        "EID",
107	TypeEUI48:      "EUI48",
108	TypeEUI64:      "EUI64",
109	TypeGID:        "GID",
110	TypeGPOS:       "GPOS",
111	TypeHINFO:      "HINFO",
112	TypeHIP:        "HIP",
113	TypeISDN:       "ISDN",
114	TypeIXFR:       "IXFR",
115	TypeKEY:        "KEY",
116	TypeKX:         "KX",
117	TypeL32:        "L32",
118	TypeL64:        "L64",
119	TypeLOC:        "LOC",
120	TypeLP:         "LP",
121	TypeMAILA:      "MAILA",
122	TypeMAILB:      "MAILB",
123	TypeMB:         "MB",
124	TypeMD:         "MD",
125	TypeMF:         "MF",
126	TypeMG:         "MG",
127	TypeMINFO:      "MINFO",
128	TypeMR:         "MR",
129	TypeMX:         "MX",
130	TypeNAPTR:      "NAPTR",
131	TypeNID:        "NID",
132	TypeNIMLOC:     "NIMLOC",
133	TypeNINFO:      "NINFO",
134	TypeNS:         "NS",
135	TypeNSEC:       "NSEC",
136	TypeNSEC3:      "NSEC3",
137	TypeNSEC3PARAM: "NSEC3PARAM",
138	TypeNULL:       "NULL",
139	TypeNXT:        "NXT",
140	TypeNone:       "None",
141	TypeOPENPGPKEY: "OPENPGPKEY",
142	TypeOPT:        "OPT",
143	TypePTR:        "PTR",
144	TypePX:         "PX",
145	TypeRKEY:       "RKEY",
146	TypeRP:         "RP",
147	TypeRRSIG:      "RRSIG",
148	TypeRT:         "RT",
149	TypeReserved:   "Reserved",
150	TypeSIG:        "SIG",
151	TypeSMIMEA:     "SMIMEA",
152	TypeSOA:        "SOA",
153	TypeSPF:        "SPF",
154	TypeSRV:        "SRV",
155	TypeSSHFP:      "SSHFP",
156	TypeTA:         "TA",
157	TypeTALINK:     "TALINK",
158	TypeTKEY:       "TKEY",
159	TypeTLSA:       "TLSA",
160	TypeTSIG:       "TSIG",
161	TypeTXT:        "TXT",
162	TypeUID:        "UID",
163	TypeUINFO:      "UINFO",
164	TypeUNSPEC:     "UNSPEC",
165	TypeURI:        "URI",
166	TypeX25:        "X25",
167	TypeNSAPPTR:    "NSAP-PTR",
168}
169
170func (rr *A) Header() *RR_Header          { return &rr.Hdr }
171func (rr *AAAA) Header() *RR_Header       { return &rr.Hdr }
172func (rr *AFSDB) Header() *RR_Header      { return &rr.Hdr }
173func (rr *ANY) Header() *RR_Header        { return &rr.Hdr }
174func (rr *APL) Header() *RR_Header        { return &rr.Hdr }
175func (rr *AVC) Header() *RR_Header        { return &rr.Hdr }
176func (rr *CAA) Header() *RR_Header        { return &rr.Hdr }
177func (rr *CDNSKEY) Header() *RR_Header    { return &rr.Hdr }
178func (rr *CDS) Header() *RR_Header        { return &rr.Hdr }
179func (rr *CERT) Header() *RR_Header       { return &rr.Hdr }
180func (rr *CNAME) Header() *RR_Header      { return &rr.Hdr }
181func (rr *CSYNC) Header() *RR_Header      { return &rr.Hdr }
182func (rr *DHCID) Header() *RR_Header      { return &rr.Hdr }
183func (rr *DLV) Header() *RR_Header        { return &rr.Hdr }
184func (rr *DNAME) Header() *RR_Header      { return &rr.Hdr }
185func (rr *DNSKEY) Header() *RR_Header     { return &rr.Hdr }
186func (rr *DS) Header() *RR_Header         { return &rr.Hdr }
187func (rr *EID) Header() *RR_Header        { return &rr.Hdr }
188func (rr *EUI48) Header() *RR_Header      { return &rr.Hdr }
189func (rr *EUI64) Header() *RR_Header      { return &rr.Hdr }
190func (rr *GID) Header() *RR_Header        { return &rr.Hdr }
191func (rr *GPOS) Header() *RR_Header       { return &rr.Hdr }
192func (rr *HINFO) Header() *RR_Header      { return &rr.Hdr }
193func (rr *HIP) Header() *RR_Header        { return &rr.Hdr }
194func (rr *KEY) Header() *RR_Header        { return &rr.Hdr }
195func (rr *KX) Header() *RR_Header         { return &rr.Hdr }
196func (rr *L32) Header() *RR_Header        { return &rr.Hdr }
197func (rr *L64) Header() *RR_Header        { return &rr.Hdr }
198func (rr *LOC) Header() *RR_Header        { return &rr.Hdr }
199func (rr *LP) Header() *RR_Header         { return &rr.Hdr }
200func (rr *MB) Header() *RR_Header         { return &rr.Hdr }
201func (rr *MD) Header() *RR_Header         { return &rr.Hdr }
202func (rr *MF) Header() *RR_Header         { return &rr.Hdr }
203func (rr *MG) Header() *RR_Header         { return &rr.Hdr }
204func (rr *MINFO) Header() *RR_Header      { return &rr.Hdr }
205func (rr *MR) Header() *RR_Header         { return &rr.Hdr }
206func (rr *MX) Header() *RR_Header         { return &rr.Hdr }
207func (rr *NAPTR) Header() *RR_Header      { return &rr.Hdr }
208func (rr *NID) Header() *RR_Header        { return &rr.Hdr }
209func (rr *NIMLOC) Header() *RR_Header     { return &rr.Hdr }
210func (rr *NINFO) Header() *RR_Header      { return &rr.Hdr }
211func (rr *NS) Header() *RR_Header         { return &rr.Hdr }
212func (rr *NSAPPTR) Header() *RR_Header    { return &rr.Hdr }
213func (rr *NSEC) Header() *RR_Header       { return &rr.Hdr }
214func (rr *NSEC3) Header() *RR_Header      { return &rr.Hdr }
215func (rr *NSEC3PARAM) Header() *RR_Header { return &rr.Hdr }
216func (rr *NULL) Header() *RR_Header       { return &rr.Hdr }
217func (rr *OPENPGPKEY) Header() *RR_Header { return &rr.Hdr }
218func (rr *OPT) Header() *RR_Header        { return &rr.Hdr }
219func (rr *PTR) Header() *RR_Header        { return &rr.Hdr }
220func (rr *PX) Header() *RR_Header         { return &rr.Hdr }
221func (rr *RFC3597) Header() *RR_Header    { return &rr.Hdr }
222func (rr *RKEY) Header() *RR_Header       { return &rr.Hdr }
223func (rr *RP) Header() *RR_Header         { return &rr.Hdr }
224func (rr *RRSIG) Header() *RR_Header      { return &rr.Hdr }
225func (rr *RT) Header() *RR_Header         { return &rr.Hdr }
226func (rr *SIG) Header() *RR_Header        { return &rr.Hdr }
227func (rr *SMIMEA) Header() *RR_Header     { return &rr.Hdr }
228func (rr *SOA) Header() *RR_Header        { return &rr.Hdr }
229func (rr *SPF) Header() *RR_Header        { return &rr.Hdr }
230func (rr *SRV) Header() *RR_Header        { return &rr.Hdr }
231func (rr *SSHFP) Header() *RR_Header      { return &rr.Hdr }
232func (rr *TA) Header() *RR_Header         { return &rr.Hdr }
233func (rr *TALINK) Header() *RR_Header     { return &rr.Hdr }
234func (rr *TKEY) Header() *RR_Header       { return &rr.Hdr }
235func (rr *TLSA) Header() *RR_Header       { return &rr.Hdr }
236func (rr *TSIG) Header() *RR_Header       { return &rr.Hdr }
237func (rr *TXT) Header() *RR_Header        { return &rr.Hdr }
238func (rr *UID) Header() *RR_Header        { return &rr.Hdr }
239func (rr *UINFO) Header() *RR_Header      { return &rr.Hdr }
240func (rr *URI) Header() *RR_Header        { return &rr.Hdr }
241func (rr *X25) Header() *RR_Header        { return &rr.Hdr }
242
243// len() functions
244func (rr *A) len(off int, compression map[string]struct{}) int {
245	l := rr.Hdr.len(off, compression)
246	if len(rr.A) != 0 {
247		l += net.IPv4len
248	}
249	return l
250}
251func (rr *AAAA) len(off int, compression map[string]struct{}) int {
252	l := rr.Hdr.len(off, compression)
253	if len(rr.AAAA) != 0 {
254		l += net.IPv6len
255	}
256	return l
257}
258func (rr *AFSDB) len(off int, compression map[string]struct{}) int {
259	l := rr.Hdr.len(off, compression)
260	l += 2 // Subtype
261	l += domainNameLen(rr.Hostname, off+l, compression, false)
262	return l
263}
264func (rr *ANY) len(off int, compression map[string]struct{}) int {
265	l := rr.Hdr.len(off, compression)
266	return l
267}
268func (rr *APL) len(off int, compression map[string]struct{}) int {
269	l := rr.Hdr.len(off, compression)
270	for _, x := range rr.Prefixes {
271		l += x.len()
272	}
273	return l
274}
275func (rr *AVC) len(off int, compression map[string]struct{}) int {
276	l := rr.Hdr.len(off, compression)
277	for _, x := range rr.Txt {
278		l += len(x) + 1
279	}
280	return l
281}
282func (rr *CAA) len(off int, compression map[string]struct{}) int {
283	l := rr.Hdr.len(off, compression)
284	l++ // Flag
285	l += len(rr.Tag) + 1
286	l += len(rr.Value)
287	return l
288}
289func (rr *CERT) len(off int, compression map[string]struct{}) int {
290	l := rr.Hdr.len(off, compression)
291	l += 2 // Type
292	l += 2 // KeyTag
293	l++    // Algorithm
294	l += base64.StdEncoding.DecodedLen(len(rr.Certificate))
295	return l
296}
297func (rr *CNAME) len(off int, compression map[string]struct{}) int {
298	l := rr.Hdr.len(off, compression)
299	l += domainNameLen(rr.Target, off+l, compression, true)
300	return l
301}
302func (rr *DHCID) len(off int, compression map[string]struct{}) int {
303	l := rr.Hdr.len(off, compression)
304	l += base64.StdEncoding.DecodedLen(len(rr.Digest))
305	return l
306}
307func (rr *DNAME) len(off int, compression map[string]struct{}) int {
308	l := rr.Hdr.len(off, compression)
309	l += domainNameLen(rr.Target, off+l, compression, false)
310	return l
311}
312func (rr *DNSKEY) len(off int, compression map[string]struct{}) int {
313	l := rr.Hdr.len(off, compression)
314	l += 2 // Flags
315	l++    // Protocol
316	l++    // Algorithm
317	l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
318	return l
319}
320func (rr *DS) len(off int, compression map[string]struct{}) int {
321	l := rr.Hdr.len(off, compression)
322	l += 2 // KeyTag
323	l++    // Algorithm
324	l++    // DigestType
325	l += len(rr.Digest) / 2
326	return l
327}
328func (rr *EID) len(off int, compression map[string]struct{}) int {
329	l := rr.Hdr.len(off, compression)
330	l += len(rr.Endpoint) / 2
331	return l
332}
333func (rr *EUI48) len(off int, compression map[string]struct{}) int {
334	l := rr.Hdr.len(off, compression)
335	l += 6 // Address
336	return l
337}
338func (rr *EUI64) len(off int, compression map[string]struct{}) int {
339	l := rr.Hdr.len(off, compression)
340	l += 8 // Address
341	return l
342}
343func (rr *GID) len(off int, compression map[string]struct{}) int {
344	l := rr.Hdr.len(off, compression)
345	l += 4 // Gid
346	return l
347}
348func (rr *GPOS) len(off int, compression map[string]struct{}) int {
349	l := rr.Hdr.len(off, compression)
350	l += len(rr.Longitude) + 1
351	l += len(rr.Latitude) + 1
352	l += len(rr.Altitude) + 1
353	return l
354}
355func (rr *HINFO) len(off int, compression map[string]struct{}) int {
356	l := rr.Hdr.len(off, compression)
357	l += len(rr.Cpu) + 1
358	l += len(rr.Os) + 1
359	return l
360}
361func (rr *HIP) len(off int, compression map[string]struct{}) int {
362	l := rr.Hdr.len(off, compression)
363	l++    // HitLength
364	l++    // PublicKeyAlgorithm
365	l += 2 // PublicKeyLength
366	l += len(rr.Hit) / 2
367	l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
368	for _, x := range rr.RendezvousServers {
369		l += domainNameLen(x, off+l, compression, false)
370	}
371	return l
372}
373func (rr *KX) len(off int, compression map[string]struct{}) int {
374	l := rr.Hdr.len(off, compression)
375	l += 2 // Preference
376	l += domainNameLen(rr.Exchanger, off+l, compression, false)
377	return l
378}
379func (rr *L32) len(off int, compression map[string]struct{}) int {
380	l := rr.Hdr.len(off, compression)
381	l += 2 // Preference
382	if len(rr.Locator32) != 0 {
383		l += net.IPv4len
384	}
385	return l
386}
387func (rr *L64) len(off int, compression map[string]struct{}) int {
388	l := rr.Hdr.len(off, compression)
389	l += 2 // Preference
390	l += 8 // Locator64
391	return l
392}
393func (rr *LOC) len(off int, compression map[string]struct{}) int {
394	l := rr.Hdr.len(off, compression)
395	l++    // Version
396	l++    // Size
397	l++    // HorizPre
398	l++    // VertPre
399	l += 4 // Latitude
400	l += 4 // Longitude
401	l += 4 // Altitude
402	return l
403}
404func (rr *LP) len(off int, compression map[string]struct{}) int {
405	l := rr.Hdr.len(off, compression)
406	l += 2 // Preference
407	l += domainNameLen(rr.Fqdn, off+l, compression, false)
408	return l
409}
410func (rr *MB) len(off int, compression map[string]struct{}) int {
411	l := rr.Hdr.len(off, compression)
412	l += domainNameLen(rr.Mb, off+l, compression, true)
413	return l
414}
415func (rr *MD) len(off int, compression map[string]struct{}) int {
416	l := rr.Hdr.len(off, compression)
417	l += domainNameLen(rr.Md, off+l, compression, true)
418	return l
419}
420func (rr *MF) len(off int, compression map[string]struct{}) int {
421	l := rr.Hdr.len(off, compression)
422	l += domainNameLen(rr.Mf, off+l, compression, true)
423	return l
424}
425func (rr *MG) len(off int, compression map[string]struct{}) int {
426	l := rr.Hdr.len(off, compression)
427	l += domainNameLen(rr.Mg, off+l, compression, true)
428	return l
429}
430func (rr *MINFO) len(off int, compression map[string]struct{}) int {
431	l := rr.Hdr.len(off, compression)
432	l += domainNameLen(rr.Rmail, off+l, compression, true)
433	l += domainNameLen(rr.Email, off+l, compression, true)
434	return l
435}
436func (rr *MR) len(off int, compression map[string]struct{}) int {
437	l := rr.Hdr.len(off, compression)
438	l += domainNameLen(rr.Mr, off+l, compression, true)
439	return l
440}
441func (rr *MX) len(off int, compression map[string]struct{}) int {
442	l := rr.Hdr.len(off, compression)
443	l += 2 // Preference
444	l += domainNameLen(rr.Mx, off+l, compression, true)
445	return l
446}
447func (rr *NAPTR) len(off int, compression map[string]struct{}) int {
448	l := rr.Hdr.len(off, compression)
449	l += 2 // Order
450	l += 2 // Preference
451	l += len(rr.Flags) + 1
452	l += len(rr.Service) + 1
453	l += len(rr.Regexp) + 1
454	l += domainNameLen(rr.Replacement, off+l, compression, false)
455	return l
456}
457func (rr *NID) len(off int, compression map[string]struct{}) int {
458	l := rr.Hdr.len(off, compression)
459	l += 2 // Preference
460	l += 8 // NodeID
461	return l
462}
463func (rr *NIMLOC) len(off int, compression map[string]struct{}) int {
464	l := rr.Hdr.len(off, compression)
465	l += len(rr.Locator) / 2
466	return l
467}
468func (rr *NINFO) len(off int, compression map[string]struct{}) int {
469	l := rr.Hdr.len(off, compression)
470	for _, x := range rr.ZSData {
471		l += len(x) + 1
472	}
473	return l
474}
475func (rr *NS) len(off int, compression map[string]struct{}) int {
476	l := rr.Hdr.len(off, compression)
477	l += domainNameLen(rr.Ns, off+l, compression, true)
478	return l
479}
480func (rr *NSAPPTR) len(off int, compression map[string]struct{}) int {
481	l := rr.Hdr.len(off, compression)
482	l += domainNameLen(rr.Ptr, off+l, compression, false)
483	return l
484}
485func (rr *NSEC3PARAM) len(off int, compression map[string]struct{}) int {
486	l := rr.Hdr.len(off, compression)
487	l++    // Hash
488	l++    // Flags
489	l += 2 // Iterations
490	l++    // SaltLength
491	l += len(rr.Salt) / 2
492	return l
493}
494func (rr *NULL) len(off int, compression map[string]struct{}) int {
495	l := rr.Hdr.len(off, compression)
496	l += len(rr.Data)
497	return l
498}
499func (rr *OPENPGPKEY) len(off int, compression map[string]struct{}) int {
500	l := rr.Hdr.len(off, compression)
501	l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
502	return l
503}
504func (rr *PTR) len(off int, compression map[string]struct{}) int {
505	l := rr.Hdr.len(off, compression)
506	l += domainNameLen(rr.Ptr, off+l, compression, true)
507	return l
508}
509func (rr *PX) len(off int, compression map[string]struct{}) int {
510	l := rr.Hdr.len(off, compression)
511	l += 2 // Preference
512	l += domainNameLen(rr.Map822, off+l, compression, false)
513	l += domainNameLen(rr.Mapx400, off+l, compression, false)
514	return l
515}
516func (rr *RFC3597) len(off int, compression map[string]struct{}) int {
517	l := rr.Hdr.len(off, compression)
518	l += len(rr.Rdata) / 2
519	return l
520}
521func (rr *RKEY) len(off int, compression map[string]struct{}) int {
522	l := rr.Hdr.len(off, compression)
523	l += 2 // Flags
524	l++    // Protocol
525	l++    // Algorithm
526	l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
527	return l
528}
529func (rr *RP) len(off int, compression map[string]struct{}) int {
530	l := rr.Hdr.len(off, compression)
531	l += domainNameLen(rr.Mbox, off+l, compression, false)
532	l += domainNameLen(rr.Txt, off+l, compression, false)
533	return l
534}
535func (rr *RRSIG) len(off int, compression map[string]struct{}) int {
536	l := rr.Hdr.len(off, compression)
537	l += 2 // TypeCovered
538	l++    // Algorithm
539	l++    // Labels
540	l += 4 // OrigTtl
541	l += 4 // Expiration
542	l += 4 // Inception
543	l += 2 // KeyTag
544	l += domainNameLen(rr.SignerName, off+l, compression, false)
545	l += base64.StdEncoding.DecodedLen(len(rr.Signature))
546	return l
547}
548func (rr *RT) len(off int, compression map[string]struct{}) int {
549	l := rr.Hdr.len(off, compression)
550	l += 2 // Preference
551	l += domainNameLen(rr.Host, off+l, compression, false)
552	return l
553}
554func (rr *SMIMEA) len(off int, compression map[string]struct{}) int {
555	l := rr.Hdr.len(off, compression)
556	l++ // Usage
557	l++ // Selector
558	l++ // MatchingType
559	l += len(rr.Certificate) / 2
560	return l
561}
562func (rr *SOA) len(off int, compression map[string]struct{}) int {
563	l := rr.Hdr.len(off, compression)
564	l += domainNameLen(rr.Ns, off+l, compression, true)
565	l += domainNameLen(rr.Mbox, off+l, compression, true)
566	l += 4 // Serial
567	l += 4 // Refresh
568	l += 4 // Retry
569	l += 4 // Expire
570	l += 4 // Minttl
571	return l
572}
573func (rr *SPF) len(off int, compression map[string]struct{}) int {
574	l := rr.Hdr.len(off, compression)
575	for _, x := range rr.Txt {
576		l += len(x) + 1
577	}
578	return l
579}
580func (rr *SRV) len(off int, compression map[string]struct{}) int {
581	l := rr.Hdr.len(off, compression)
582	l += 2 // Priority
583	l += 2 // Weight
584	l += 2 // Port
585	l += domainNameLen(rr.Target, off+l, compression, false)
586	return l
587}
588func (rr *SSHFP) len(off int, compression map[string]struct{}) int {
589	l := rr.Hdr.len(off, compression)
590	l++ // Algorithm
591	l++ // Type
592	l += len(rr.FingerPrint) / 2
593	return l
594}
595func (rr *TA) len(off int, compression map[string]struct{}) int {
596	l := rr.Hdr.len(off, compression)
597	l += 2 // KeyTag
598	l++    // Algorithm
599	l++    // DigestType
600	l += len(rr.Digest) / 2
601	return l
602}
603func (rr *TALINK) len(off int, compression map[string]struct{}) int {
604	l := rr.Hdr.len(off, compression)
605	l += domainNameLen(rr.PreviousName, off+l, compression, false)
606	l += domainNameLen(rr.NextName, off+l, compression, false)
607	return l
608}
609func (rr *TKEY) len(off int, compression map[string]struct{}) int {
610	l := rr.Hdr.len(off, compression)
611	l += domainNameLen(rr.Algorithm, off+l, compression, false)
612	l += 4 // Inception
613	l += 4 // Expiration
614	l += 2 // Mode
615	l += 2 // Error
616	l += 2 // KeySize
617	l += len(rr.Key) / 2
618	l += 2 // OtherLen
619	l += len(rr.OtherData) / 2
620	return l
621}
622func (rr *TLSA) len(off int, compression map[string]struct{}) int {
623	l := rr.Hdr.len(off, compression)
624	l++ // Usage
625	l++ // Selector
626	l++ // MatchingType
627	l += len(rr.Certificate) / 2
628	return l
629}
630func (rr *TSIG) len(off int, compression map[string]struct{}) int {
631	l := rr.Hdr.len(off, compression)
632	l += domainNameLen(rr.Algorithm, off+l, compression, false)
633	l += 6 // TimeSigned
634	l += 2 // Fudge
635	l += 2 // MACSize
636	l += len(rr.MAC) / 2
637	l += 2 // OrigId
638	l += 2 // Error
639	l += 2 // OtherLen
640	l += len(rr.OtherData) / 2
641	return l
642}
643func (rr *TXT) len(off int, compression map[string]struct{}) int {
644	l := rr.Hdr.len(off, compression)
645	for _, x := range rr.Txt {
646		l += len(x) + 1
647	}
648	return l
649}
650func (rr *UID) len(off int, compression map[string]struct{}) int {
651	l := rr.Hdr.len(off, compression)
652	l += 4 // Uid
653	return l
654}
655func (rr *UINFO) len(off int, compression map[string]struct{}) int {
656	l := rr.Hdr.len(off, compression)
657	l += len(rr.Uinfo) + 1
658	return l
659}
660func (rr *URI) len(off int, compression map[string]struct{}) int {
661	l := rr.Hdr.len(off, compression)
662	l += 2 // Priority
663	l += 2 // Weight
664	l += len(rr.Target)
665	return l
666}
667func (rr *X25) len(off int, compression map[string]struct{}) int {
668	l := rr.Hdr.len(off, compression)
669	l += len(rr.PSDNAddress) + 1
670	return l
671}
672
673// copy() functions
674func (rr *A) copy() RR {
675	return &A{rr.Hdr, copyIP(rr.A)}
676}
677func (rr *AAAA) copy() RR {
678	return &AAAA{rr.Hdr, copyIP(rr.AAAA)}
679}
680func (rr *AFSDB) copy() RR {
681	return &AFSDB{rr.Hdr, rr.Subtype, rr.Hostname}
682}
683func (rr *ANY) copy() RR {
684	return &ANY{rr.Hdr}
685}
686func (rr *APL) copy() RR {
687	Prefixes := make([]APLPrefix, len(rr.Prefixes))
688	for i := range rr.Prefixes {
689		Prefixes[i] = rr.Prefixes[i].copy()
690	}
691	return &APL{rr.Hdr, Prefixes}
692}
693func (rr *AVC) copy() RR {
694	Txt := make([]string, len(rr.Txt))
695	copy(Txt, rr.Txt)
696	return &AVC{rr.Hdr, Txt}
697}
698func (rr *CAA) copy() RR {
699	return &CAA{rr.Hdr, rr.Flag, rr.Tag, rr.Value}
700}
701func (rr *CERT) copy() RR {
702	return &CERT{rr.Hdr, rr.Type, rr.KeyTag, rr.Algorithm, rr.Certificate}
703}
704func (rr *CNAME) copy() RR {
705	return &CNAME{rr.Hdr, rr.Target}
706}
707func (rr *CSYNC) copy() RR {
708	TypeBitMap := make([]uint16, len(rr.TypeBitMap))
709	copy(TypeBitMap, rr.TypeBitMap)
710	return &CSYNC{rr.Hdr, rr.Serial, rr.Flags, TypeBitMap}
711}
712func (rr *DHCID) copy() RR {
713	return &DHCID{rr.Hdr, rr.Digest}
714}
715func (rr *DNAME) copy() RR {
716	return &DNAME{rr.Hdr, rr.Target}
717}
718func (rr *DNSKEY) copy() RR {
719	return &DNSKEY{rr.Hdr, rr.Flags, rr.Protocol, rr.Algorithm, rr.PublicKey}
720}
721func (rr *DS) copy() RR {
722	return &DS{rr.Hdr, rr.KeyTag, rr.Algorithm, rr.DigestType, rr.Digest}
723}
724func (rr *EID) copy() RR {
725	return &EID{rr.Hdr, rr.Endpoint}
726}
727func (rr *EUI48) copy() RR {
728	return &EUI48{rr.Hdr, rr.Address}
729}
730func (rr *EUI64) copy() RR {
731	return &EUI64{rr.Hdr, rr.Address}
732}
733func (rr *GID) copy() RR {
734	return &GID{rr.Hdr, rr.Gid}
735}
736func (rr *GPOS) copy() RR {
737	return &GPOS{rr.Hdr, rr.Longitude, rr.Latitude, rr.Altitude}
738}
739func (rr *HINFO) copy() RR {
740	return &HINFO{rr.Hdr, rr.Cpu, rr.Os}
741}
742func (rr *HIP) copy() RR {
743	RendezvousServers := make([]string, len(rr.RendezvousServers))
744	copy(RendezvousServers, rr.RendezvousServers)
745	return &HIP{rr.Hdr, rr.HitLength, rr.PublicKeyAlgorithm, rr.PublicKeyLength, rr.Hit, rr.PublicKey, RendezvousServers}
746}
747func (rr *KX) copy() RR {
748	return &KX{rr.Hdr, rr.Preference, rr.Exchanger}
749}
750func (rr *L32) copy() RR {
751	return &L32{rr.Hdr, rr.Preference, copyIP(rr.Locator32)}
752}
753func (rr *L64) copy() RR {
754	return &L64{rr.Hdr, rr.Preference, rr.Locator64}
755}
756func (rr *LOC) copy() RR {
757	return &LOC{rr.Hdr, rr.Version, rr.Size, rr.HorizPre, rr.VertPre, rr.Latitude, rr.Longitude, rr.Altitude}
758}
759func (rr *LP) copy() RR {
760	return &LP{rr.Hdr, rr.Preference, rr.Fqdn}
761}
762func (rr *MB) copy() RR {
763	return &MB{rr.Hdr, rr.Mb}
764}
765func (rr *MD) copy() RR {
766	return &MD{rr.Hdr, rr.Md}
767}
768func (rr *MF) copy() RR {
769	return &MF{rr.Hdr, rr.Mf}
770}
771func (rr *MG) copy() RR {
772	return &MG{rr.Hdr, rr.Mg}
773}
774func (rr *MINFO) copy() RR {
775	return &MINFO{rr.Hdr, rr.Rmail, rr.Email}
776}
777func (rr *MR) copy() RR {
778	return &MR{rr.Hdr, rr.Mr}
779}
780func (rr *MX) copy() RR {
781	return &MX{rr.Hdr, rr.Preference, rr.Mx}
782}
783func (rr *NAPTR) copy() RR {
784	return &NAPTR{rr.Hdr, rr.Order, rr.Preference, rr.Flags, rr.Service, rr.Regexp, rr.Replacement}
785}
786func (rr *NID) copy() RR {
787	return &NID{rr.Hdr, rr.Preference, rr.NodeID}
788}
789func (rr *NIMLOC) copy() RR {
790	return &NIMLOC{rr.Hdr, rr.Locator}
791}
792func (rr *NINFO) copy() RR {
793	ZSData := make([]string, len(rr.ZSData))
794	copy(ZSData, rr.ZSData)
795	return &NINFO{rr.Hdr, ZSData}
796}
797func (rr *NS) copy() RR {
798	return &NS{rr.Hdr, rr.Ns}
799}
800func (rr *NSAPPTR) copy() RR {
801	return &NSAPPTR{rr.Hdr, rr.Ptr}
802}
803func (rr *NSEC) copy() RR {
804	TypeBitMap := make([]uint16, len(rr.TypeBitMap))
805	copy(TypeBitMap, rr.TypeBitMap)
806	return &NSEC{rr.Hdr, rr.NextDomain, TypeBitMap}
807}
808func (rr *NSEC3) copy() RR {
809	TypeBitMap := make([]uint16, len(rr.TypeBitMap))
810	copy(TypeBitMap, rr.TypeBitMap)
811	return &NSEC3{rr.Hdr, rr.Hash, rr.Flags, rr.Iterations, rr.SaltLength, rr.Salt, rr.HashLength, rr.NextDomain, TypeBitMap}
812}
813func (rr *NSEC3PARAM) copy() RR {
814	return &NSEC3PARAM{rr.Hdr, rr.Hash, rr.Flags, rr.Iterations, rr.SaltLength, rr.Salt}
815}
816func (rr *NULL) copy() RR {
817	return &NULL{rr.Hdr, rr.Data}
818}
819func (rr *OPENPGPKEY) copy() RR {
820	return &OPENPGPKEY{rr.Hdr, rr.PublicKey}
821}
822func (rr *OPT) copy() RR {
823	Option := make([]EDNS0, len(rr.Option))
824	for i, e := range rr.Option {
825		Option[i] = e.copy()
826	}
827	return &OPT{rr.Hdr, Option}
828}
829func (rr *PTR) copy() RR {
830	return &PTR{rr.Hdr, rr.Ptr}
831}
832func (rr *PX) copy() RR {
833	return &PX{rr.Hdr, rr.Preference, rr.Map822, rr.Mapx400}
834}
835func (rr *RFC3597) copy() RR {
836	return &RFC3597{rr.Hdr, rr.Rdata}
837}
838func (rr *RKEY) copy() RR {
839	return &RKEY{rr.Hdr, rr.Flags, rr.Protocol, rr.Algorithm, rr.PublicKey}
840}
841func (rr *RP) copy() RR {
842	return &RP{rr.Hdr, rr.Mbox, rr.Txt}
843}
844func (rr *RRSIG) copy() RR {
845	return &RRSIG{rr.Hdr, rr.TypeCovered, rr.Algorithm, rr.Labels, rr.OrigTtl, rr.Expiration, rr.Inception, rr.KeyTag, rr.SignerName, rr.Signature}
846}
847func (rr *RT) copy() RR {
848	return &RT{rr.Hdr, rr.Preference, rr.Host}
849}
850func (rr *SMIMEA) copy() RR {
851	return &SMIMEA{rr.Hdr, rr.Usage, rr.Selector, rr.MatchingType, rr.Certificate}
852}
853func (rr *SOA) copy() RR {
854	return &SOA{rr.Hdr, rr.Ns, rr.Mbox, rr.Serial, rr.Refresh, rr.Retry, rr.Expire, rr.Minttl}
855}
856func (rr *SPF) copy() RR {
857	Txt := make([]string, len(rr.Txt))
858	copy(Txt, rr.Txt)
859	return &SPF{rr.Hdr, Txt}
860}
861func (rr *SRV) copy() RR {
862	return &SRV{rr.Hdr, rr.Priority, rr.Weight, rr.Port, rr.Target}
863}
864func (rr *SSHFP) copy() RR {
865	return &SSHFP{rr.Hdr, rr.Algorithm, rr.Type, rr.FingerPrint}
866}
867func (rr *TA) copy() RR {
868	return &TA{rr.Hdr, rr.KeyTag, rr.Algorithm, rr.DigestType, rr.Digest}
869}
870func (rr *TALINK) copy() RR {
871	return &TALINK{rr.Hdr, rr.PreviousName, rr.NextName}
872}
873func (rr *TKEY) copy() RR {
874	return &TKEY{rr.Hdr, rr.Algorithm, rr.Inception, rr.Expiration, rr.Mode, rr.Error, rr.KeySize, rr.Key, rr.OtherLen, rr.OtherData}
875}
876func (rr *TLSA) copy() RR {
877	return &TLSA{rr.Hdr, rr.Usage, rr.Selector, rr.MatchingType, rr.Certificate}
878}
879func (rr *TSIG) copy() RR {
880	return &TSIG{rr.Hdr, rr.Algorithm, rr.TimeSigned, rr.Fudge, rr.MACSize, rr.MAC, rr.OrigId, rr.Error, rr.OtherLen, rr.OtherData}
881}
882func (rr *TXT) copy() RR {
883	Txt := make([]string, len(rr.Txt))
884	copy(Txt, rr.Txt)
885	return &TXT{rr.Hdr, Txt}
886}
887func (rr *UID) copy() RR {
888	return &UID{rr.Hdr, rr.Uid}
889}
890func (rr *UINFO) copy() RR {
891	return &UINFO{rr.Hdr, rr.Uinfo}
892}
893func (rr *URI) copy() RR {
894	return &URI{rr.Hdr, rr.Priority, rr.Weight, rr.Target}
895}
896func (rr *X25) copy() RR {
897	return &X25{rr.Hdr, rr.PSDNAddress}
898}
899