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