rdata.md revision 8e24455c8f0f4b4118b908c3d8ffda923d850e3e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Copyright (C) 1999-2001, 2004, 2007, 2016, 2017 Internet Systems Consortium, Inc. ("ISC")
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - This Source Code Form is subject to the terms of the Mozilla Public
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - License, v. 2.0. If a copy of the MPL was not distributed with this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - file, You can obtain one at http://mozilla.org/MPL/2.0/.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## RDATA Types
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync### Overview
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe dns rdata routines (`dns_rdata_fromtext()`,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`dns_rdata_totext()`, `dns_rdata_fromwire()`,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`dns_rdata_towire()` `dns_rdata_fromstruct()`,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`dns_rdata_tostruct()` and `dns_rdata_compare()`)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare designed to provide a single set of routines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfor encoding, decoding and comparing dns data preventing the problems that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncoccurred in BIND 8.x and earlier, in which there were multiple places in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccode base that decoded wire format to internal format or compared rdata,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncsometimes with subtly different behaviour (bugs), and sometimes failing to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncsupport a particular type, leading to internal inconsistancy.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEach of these generic routines calls type-specific routines that provide
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncthe type-specific details.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFrom time to time new types are defined and it is necessary to add these types
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncinto the existing structure. This document is written to provide instruction
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncon how to do this.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync### Adding new RDATA types
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAdding a new rdata type requires determining whether the new rdata type is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass-specific or generic, writing code to perform the rdata operations for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctype, then integrating it into the build by placing the code into the rdata
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchierachy at the correct location under `lib/dns/rdata`. Running `make clean`
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfollowed by `make` in `lib/dns` will cause the new rdata type to be picked up
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncand compiled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEach rdata module must perform the following operations:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync* Convert from text format to internal format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync* Convert from internal format to text format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync* Convert from wire format to internal format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync* Convert from internal format to wire format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync* Convert from a structure to internal format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync* Convert from internal format to a structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync* Compare two rdata in internal format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThere is an additional set of support functions and macros only available to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#### RDATA Hierarchy
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe `rdata` hierarchy has the following format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync classname_classnumber/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInitial rdata hierarchy:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#### CLASSNAME and TYPENAME
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncClass and type names must be from the following alphabet and less that 11
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccharacters in length or otherwise they will be ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPermissible alphabet: a to z, 0 to 9 and dash (-).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDash is mapped to underscore (_) for the C function names below.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#### Internal Format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe internal format chosen is DNS wire format without any compression being
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncapplied to domain names in the rdata.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#### Converting from text format to internal format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe functions to convert from text format has the following call formats and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncis declared as follows for class-generic functions.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fromtext_typename(dns_rdataclass_t class, dns_rdatatype_t type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_lex_t *lexer, dns_name_t *origin,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_boolean_t downcase, isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncClass specific functions contain the class name in addition to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fromtext_classname_typename(dns_rdataclass_t class,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_rdatatype_t type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_lex_t *lexer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_name_t *origin,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_boolean_t downcase,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|Parameter|Description |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|---------|-----------------------|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`class`|This argument should be ignored when used with a class-generic RR type, otherwise `REQUIRE(class == <value>)` should be present at the start of the function.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`type`|This should be tested with a `REQUIRE(type == <value>)` statement at the begining of the function.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`lexer`|This is used to read the input text stream.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`origin`|This is a absolute name used to qualify unqualified / partially qualified domain names in the text stream. It is passed to the name parsing routines.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`downcase`|This is passed to the name parsing routines to determine whether to downcase the names it generates or leave them in the case they are presented in.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`target`|This is a `BINARY` buffer into which to write the internal format of the rdata record being read.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`fromtext_typename()` reads tokens from `lexer`,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncup to but not including the end of line (EOL) token or end of file (EOF) token.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIf the EOL / EOF token is read it should be returned to the input stream.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`gettoken()` should be used to read the next token from the input stream.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`isc_lex_ungettoken()` should be used to return EOL / EOF (or any other token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncto the input stream if the EOL / EOF token is read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUnused tokens will cause `dns_rdata_fromtext()` to return `DNS_R_EXTRATOKEN` if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`fromtext_typename()` was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`fromtext_typename()` reads external input and as such is a high
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncsecurity area and must be paranoid about its input.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#### Converting from internal format to text format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync totext_typename(dns_rdata_t *rdata, dns_name_t *origin,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync totext_classname_typename(dns_rdata_t *rdata,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_name_t *origin, isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|Parameter|Description |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|---------|-----------------------|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`rdata`|This is the rdata record to be converted from internal format to text. `rdata->type` (and `rdata->class` for class-specific RR types) should be checked at the start of the function with `REQUIRE` statements.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`origin`|If this is not `NULL`, then any domain names with this suffix should be written out as unqualified subdomains. `name_prefix()` can be used to check whether `origin` is `NULL` and provide the correct arguments to the name conversion routines.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`target`|This is a `TEXT` buffer into which to write the output.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#### Converting from wire format to internal format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fromwire_typename(dns_rdataclass_t class,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_rdatatype_t type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_buffer_t *source,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_decompress_t *dctx,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_boolean_t downcase,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fromwire_classname_typename(dns_rdataclass_t class,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_rdatatype_t type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_buffer_t *source,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_decompress_t *dctx,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_boolean_t downcase,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`fromwire_classname_typename()` is required to set the valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdecompression methods if there is a domain name in the rdata.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (dns_decompress_edns(dctx) >= # || !dns_decompress_strict(dctx))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_decompress_setmethods(dctx, DNS_COMPRESS_ALL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|Parameter|Description |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|---------|-----------------------|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`class`|This argument should be ignored when used with a class-generic RR type otherwise `REQUIRE(class == <value>)` should be present at the start of the function.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`type`|This should be tested with a `REQUIRE(type == <value>)` statement at the begining of the function.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`source`|This is a `BINARY` buffer with the `active` region containing a resource record in wire format.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`dctx`|This is the decompression context and is passed to `dns_name_fromwire()`, along with `downcase`, to enable a compressed domain name to be extracted from the source.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`downcase`|This is passed to `dns_name_fromwire()` to say whether the extracted domain name should be downcased during the extraction.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`target`|This is a `BINARY` buffer into which the decompressed and checked resource record is written.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`fromwire_typename()` is a security sensitive routine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncas it reads external data, and should take extreme care to ensure that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncthe input data matches its description.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIf the `active` buffer is not empty at completion and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`fromwire_typename()` was otherwise successful, `dns_rdata_fromwire()`
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwill return `DNS_R_EXTRADATA`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#### Converting from internal format to wire format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync towire_typename(dns_rdata_t *rdata,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_compress_t *cctx,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync towire_classname_typename(dns_rdata_t *rdata,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_compress_t *cctx,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`towire_classname_typename()` is required to set the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncallowed name compression methods based on the EDNS version, if there
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncis a domain name in the rdata.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (dns_compress_getedns(cctx) >= #)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|Parameter|Description |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|---------|-----------------------|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`rdata`|This is the rdata record to be converted from internal format to text. `rdata->type` (and `rdata->class` for class-specific RR types) should be checked at the start of the function with `REQUIRE` statements.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`cctx`|This is the compression context. It should be passed to `dns_name_towire()` when putting domain names on the wire.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`target`|This is a `BINARY` buffer into which to write the rdata|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSimple RR types without domain names can use the following code to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctransfer the contents of the `rdata` to the target buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (mem_tobuffer(target, rdata->data, rdata->length));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#### Converting from a structure to internal format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fromstruct_typename(dns_rdataclass_t class,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_rdatatype_t type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void *source,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fromstruct_classname_typename(dns_rdataclass_t class,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_rdatatype_t type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void *source,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|Parameter|Description |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|---------|-----------------------|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`class`|This argument should be ignored when used with a class-generic RR type otherwise `REQUIRE(class == <value>)` should be present at the start of the function.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`type`|This should be tested with a `REQUIRE(type == <value>)` statement at the beginning of the function.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`source`|This points to a type-specific structure.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`target`|This is a `BINARY` buffer into which to write the internal format of the rdata record being read in.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#### Converting from internal format to a structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tostruct_typename(dns_rdata_t *rdata, void *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tostruct_classname_typename(dns_rdata_t *rdata, void *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|Parameter|Description |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|---------|-----------------------|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`rdata`|This is the rdata record to be converted from internal format to a structure. `rdata->type` (and `rdata->class` for class-specific RR types) should be checked at the start of the function with `REQUIRE` statements.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|`target`|Pointer to a type-specific structure.|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#### Comparing two rdata in internal format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync compare_typename(dns_rdata_t *rdata1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_rdata_t *rdata2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync compare_classname_typename(dns_rdata_t *rdata1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_rdata_t *rdata2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis function compares `rdata1` and `rdata2` as required for DNSSEC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncordering. The routine should ensure that the `type` and `class` of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctwo rdata match with `REQUIRE(rdata1->type == rdata2->type);` and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`REQUIRE(rdata1->class == rdata2->class);` statements. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`rdata->type` should also be verified, and if the RR type is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass-specific, also the `rdata->class`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`compare_classname_typename()` returns -1, 0, 1.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#### Support Functions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe following static support functions are available to use.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static unsigned int
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync name_length(dns_name_t *name);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns the length of `name`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync txt_totext(isc_region_t *source, isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExtracts the octet-length-tagged text string at the start of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`source` and writes it as a quoted string to `target`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`source` is adjusted so that it points to first octet after the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctext string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns `DNS_R_NOSPACE` or `DNS_R_SUCCESS`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync txt_fromtext(isc_textregion_t *source, isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTake the text region `source` and convert it to a length-tagged
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctext string, writing it to `target`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns `DNS_R_NOSPACE`, `DNS_R_TEXTTOLONG` or `DNS_R_SUCCESS`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync txt_fromwire(isc_buffer_t *source, isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRead an octet-length-tagged text string from `source` and write it to `target`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEnsures that octet-length-tagged text string was wholly within the active area
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncof `source`. Adjusts the active area of `source` so that it refers to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfirst octet after the octet-length-tagged text string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns `DNS_R_UNEXPECTEDEND`, `DNS_R_NOSPACE` or `DNS_R_SUCCESS`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static isc_boolean_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync name_prefix(dns_name_t *name, dns_name_t *origin, dns_name_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIf `origin` is NULL or the root label, set `target` to refer to `name` and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncreturn `ISC_FALSE`. Otherwise, see if `name` is a subdomain of `origin` and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncnot equal to it. If so, make `target` refer to the prefix of `name` and return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`ISC_TRUE`. Otherwise, make `target` refer to `name` and return `ISC_FALSE`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTypical use:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync totext_typename(dns_rdata_t *rdata, dns_name_t *origin,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_buffer_t * target)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_region_t region;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_name_t name, prefix;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_boolean_t sub;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_name_init(&name, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_name_init(&prefix, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_rdata_toregion(rdata, ®ion);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dns_name_fromregion(&name, ®ion);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sub = name_prefix(&name, origin, &prefix);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (dns_name_totext(&prefix, sub, target));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstr_totext(char *source, isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAdds the `NULL`-terminated string `source`, up to but not including `NULL`,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncto `target`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns `DNS_R_NOSPACE` and `DNS_R_SUCCESS`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static isc_boolean_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer_empty(isc_buffer_t *source);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns `ISC_TRUE` if the active region of `source` is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncempty otherwise `ISC_FALSE`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static void
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer_fromregion(isc_buffer_t *buffer, isc_region_t *region,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unsigned int type);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMake `buffer` refer to the memory in `region` and make it active.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_tobuffer(isc_uint32_t value, isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWrite the 32 bit `value` in network order to `target`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns `DNS_R_NOSPACE` and `DNS_R_SUCCESS`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncuint16_tobuffer(isc_uint32_t value, isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWrite them 16 bit `value` in network order to `target`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns `ISC_R_RANGE`, `DNS_R_NOSPACE` and `DNS_R_SUCCESS`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static isc_uint32_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint32_fromregion(isc_region_t *region);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns the 32 bit at the start of `region` in host byte order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRequires `(region->length >= 4)`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static isc_uint16_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync uint16_fromregion(isc_region_t *region);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns the 16 bit at the start of `region` in host byte order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRequires `(region->length >= 2)`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gettoken(isc_lex_t *lexer, isc_token_t *token,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isc_tokentype_t expect, isc_boolean_t eol);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGets the next token from the input stream `lexer`. Ensures that the returned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctoken matches `expect` (isc_tokentype_qstring can also return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncisc_tokentype_string), or isc_tokentype_eol and isc_tokentype_eof if `eol` is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns `DNS_R_UNEXPECTED`, `DNS_R_UNEXPECTEDEND`, `DNS_R_UNEXPECTEDTOKEN` and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync`DNS_R_SUCCESS`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mem_tobuffer(isc_buffer_t *target, void *base, unsigned int length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAdd the memory referred to by `base` to `target`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns `DNS_R_NOSPACE` and `DNS_R_SUCCESS`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync compare_region(isc_region_t *r1, isc_region_t *r2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompares two regions, returning -1, 0, 1 based on their DNSSEC ordering.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync hexvalue(char value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns the hexadecimal value of `value`, or -1 if not a hexadecimal character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync decvalue(char value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns the decimal value of `value`, or -1 if not a decimal character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync base64_totext(isc_region_t *source, isc_buffer_t *target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncConvert the region referred to by `source` to Base64 encoded text and put it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncinto `target`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns `DNS_R_NOSPACE` or `DNS_R_SUCCESS`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static dns_result_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync base64_tobuffer(isc_lex_t *lexer, isc_buffer_t *target, int length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRead a series of tokens from `lexer` that containing base64 data until one of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncend of line, `length` (`length` >= 0) bytes have been read or base64 pad
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccharacters are seen. If `length` < 0 it is ignored; otherwise, it is an
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncerror if there are not `length` octets of data or if when processing a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns `DNS_R_BADBASE64`, `DNS_R_UNEXPECTED`, `DNS_R_UNEXPECTEDEND`,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync time_totext(unsigned long value, isc_buffer_t *target);`
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncConvert the date represented by `value` into YYYYMMDDHHMMSS format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctaking into account the active epochs. This code is Y2K and Y2038 compliant.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTake the date in `source` and convert it to seconds since January 1, 1970
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync(ignoring leap seconds) and place the least significant 32 bits into `target`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturns `ISC_R_RANGE`, `DNS_R_SYNTAX`, `DNS_R_NOSPACE` and `DNS_R_SUCCESS`.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEvaluate `x` and call `return (<value of x>);` if the result is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncnot `ISC_R_SUCCESS`.