1253592Serwin/*
2262706Serwin * Copyright (C) 2013, 2014  Internet Systems Consortium, Inc. ("ISC")
3253592Serwin *
4253592Serwin * Permission to use, copy, modify, and/or distribute this software for any
5253592Serwin * purpose with or without fee is hereby granted, provided that the above
6253592Serwin * copyright notice and this permission notice appear in all copies.
7253592Serwin *
8253592Serwin * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9253592Serwin * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10253592Serwin * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11253592Serwin * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12253592Serwin * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13253592Serwin * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14253592Serwin * PERFORMANCE OF THIS SOFTWARE.
15253592Serwin */
16253592Serwin
17253592Serwin#ifndef RDATA_GENERIC_NID_104_C
18253592Serwin#define RDATA_GENERIC_NID_104_C
19253592Serwin
20253592Serwin#include <string.h>
21253592Serwin
22253592Serwin#include <isc/net.h>
23253592Serwin
24253592Serwin#define RRTYPE_NID_ATTRIBUTES (0)
25253592Serwin
26253592Serwinstatic inline isc_result_t
27253592Serwinfromtext_nid(ARGS_FROMTEXT) {
28253592Serwin	isc_token_t token;
29253592Serwin	unsigned char locator[NS_LOCATORSZ];
30253592Serwin
31253592Serwin	REQUIRE(type == 104);
32253592Serwin
33253592Serwin	UNUSED(type);
34253592Serwin	UNUSED(rdclass);
35253592Serwin	UNUSED(origin);
36253592Serwin	UNUSED(options);
37253592Serwin	UNUSED(callbacks);
38253592Serwin
39253592Serwin	RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
40253592Serwin				      ISC_FALSE));
41253592Serwin	if (token.value.as_ulong > 0xffffU)
42253592Serwin		RETTOK(ISC_R_RANGE);
43253592Serwin	RETERR(uint16_tobuffer(token.value.as_ulong, target));
44253592Serwin
45253592Serwin	RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
46253592Serwin				      ISC_FALSE));
47253592Serwin
48253592Serwin	if (locator_pton(DNS_AS_STR(token), locator) != 1)
49253592Serwin		RETTOK(DNS_R_SYNTAX);
50253592Serwin	return (mem_tobuffer(target, locator, NS_LOCATORSZ));
51253592Serwin}
52253592Serwin
53253592Serwinstatic inline isc_result_t
54253592Serwintotext_nid(ARGS_TOTEXT) {
55253592Serwin	isc_region_t region;
56253592Serwin	char buf[sizeof("xxxx:xxxx:xxxx:xxxx")];
57253592Serwin	unsigned short num;
58253592Serwin
59253592Serwin	REQUIRE(rdata->type == 104);
60253592Serwin	REQUIRE(rdata->length != 0);
61253592Serwin
62253592Serwin	UNUSED(tctx);
63253592Serwin
64253592Serwin	dns_rdata_toregion(rdata, &region);
65253592Serwin	num = uint16_fromregion(&region);
66253592Serwin	isc_region_consume(&region, 2);
67253592Serwin	sprintf(buf, "%u", num);
68253592Serwin	RETERR(str_totext(buf, target));
69253592Serwin
70253592Serwin	RETERR(str_totext(" ", target));
71253592Serwin
72253592Serwin	sprintf(buf, "%x:%x:%x:%x",
73253592Serwin		region.base[0]<<8 | region.base[1],
74253592Serwin		region.base[2]<<8 | region.base[3],
75253592Serwin		region.base[4]<<8 | region.base[5],
76253592Serwin		region.base[6]<<8 | region.base[7]);
77253592Serwin	return (str_totext(buf, target));
78253592Serwin}
79253592Serwin
80253592Serwinstatic inline isc_result_t
81253592Serwinfromwire_nid(ARGS_FROMWIRE) {
82253592Serwin	isc_region_t sregion;
83253592Serwin
84253592Serwin	REQUIRE(type == 104);
85253592Serwin
86253592Serwin	UNUSED(type);
87253592Serwin	UNUSED(options);
88253592Serwin	UNUSED(rdclass);
89253592Serwin	UNUSED(dctx);
90253592Serwin
91253592Serwin	isc_buffer_activeregion(source, &sregion);
92253592Serwin	if (sregion.length != 10)
93253592Serwin		return (DNS_R_FORMERR);
94253592Serwin	isc_buffer_forward(source, sregion.length);
95253592Serwin	return (mem_tobuffer(target, sregion.base, sregion.length));
96253592Serwin}
97253592Serwin
98253592Serwinstatic inline isc_result_t
99253592Serwintowire_nid(ARGS_TOWIRE) {
100253592Serwin
101253592Serwin	REQUIRE(rdata->type == 104);
102253592Serwin	REQUIRE(rdata->length == 10);
103253592Serwin
104253592Serwin	UNUSED(cctx);
105253592Serwin
106253592Serwin	return (mem_tobuffer(target, rdata->data, rdata->length));
107253592Serwin}
108253592Serwin
109253592Serwinstatic inline int
110253592Serwincompare_nid(ARGS_COMPARE) {
111253592Serwin	isc_region_t region1;
112253592Serwin	isc_region_t region2;
113253592Serwin
114253592Serwin	REQUIRE(rdata1->type == rdata2->type);
115253592Serwin	REQUIRE(rdata1->rdclass == rdata2->rdclass);
116253592Serwin	REQUIRE(rdata1->type == 104);
117253592Serwin	REQUIRE(rdata1->length == 10);
118253592Serwin	REQUIRE(rdata2->length == 10);
119253592Serwin
120253592Serwin	dns_rdata_toregion(rdata1, &region1);
121253592Serwin	dns_rdata_toregion(rdata2, &region2);
122253592Serwin	return (isc_region_compare(&region1, &region2));
123253592Serwin}
124253592Serwin
125253592Serwinstatic inline isc_result_t
126253592Serwinfromstruct_nid(ARGS_FROMSTRUCT) {
127253592Serwin	dns_rdata_nid_t *nid = source;
128253592Serwin
129253592Serwin	REQUIRE(type == 104);
130253592Serwin	REQUIRE(source != NULL);
131253592Serwin	REQUIRE(nid->common.rdtype == type);
132253592Serwin	REQUIRE(nid->common.rdclass == rdclass);
133253592Serwin
134253592Serwin	UNUSED(type);
135253592Serwin	UNUSED(rdclass);
136253592Serwin
137253592Serwin	RETERR(uint16_tobuffer(nid->pref, target));
138253592Serwin	return (mem_tobuffer(target, nid->nid, sizeof(nid->nid)));
139253592Serwin}
140253592Serwin
141253592Serwinstatic inline isc_result_t
142253592Serwintostruct_nid(ARGS_TOSTRUCT) {
143253592Serwin	isc_region_t region;
144253592Serwin	dns_rdata_nid_t *nid = target;
145253592Serwin
146253592Serwin	REQUIRE(rdata->type == 104);
147253592Serwin	REQUIRE(target != NULL);
148253592Serwin	REQUIRE(rdata->length == 10);
149253592Serwin
150253592Serwin	UNUSED(mctx);
151253592Serwin
152253592Serwin	nid->common.rdclass = rdata->rdclass;
153253592Serwin	nid->common.rdtype = rdata->type;
154253592Serwin	ISC_LINK_INIT(&nid->common, link);
155253592Serwin
156253592Serwin	dns_rdata_toregion(rdata, &region);
157253592Serwin	nid->pref = uint16_fromregion(&region);
158262706Serwin	memmove(nid->nid, region.base, region.length);
159253592Serwin	return (ISC_R_SUCCESS);
160253592Serwin}
161253592Serwin
162253592Serwinstatic inline void
163253592Serwinfreestruct_nid(ARGS_FREESTRUCT) {
164253592Serwin	dns_rdata_nid_t *nid = source;
165253592Serwin
166253592Serwin	REQUIRE(source != NULL);
167253592Serwin	REQUIRE(nid->common.rdtype == 104);
168253592Serwin
169253592Serwin	return;
170253592Serwin}
171253592Serwin
172253592Serwinstatic inline isc_result_t
173253592Serwinadditionaldata_nid(ARGS_ADDLDATA) {
174253592Serwin
175253592Serwin	REQUIRE(rdata->type == 104);
176253592Serwin	REQUIRE(rdata->length == 10);
177253592Serwin
178253592Serwin	UNUSED(rdata);
179253592Serwin	UNUSED(add);
180253592Serwin	UNUSED(arg);
181253592Serwin
182253592Serwin	return (ISC_R_SUCCESS);
183253592Serwin}
184253592Serwin
185253592Serwinstatic inline isc_result_t
186253592Serwindigest_nid(ARGS_DIGEST) {
187253592Serwin	isc_region_t r;
188253592Serwin
189253592Serwin	REQUIRE(rdata->type == 104);
190253592Serwin	REQUIRE(rdata->length == 10);
191253592Serwin
192253592Serwin	dns_rdata_toregion(rdata, &r);
193253592Serwin
194253592Serwin	return ((digest)(arg, &r));
195253592Serwin}
196253592Serwin
197253592Serwinstatic inline isc_boolean_t
198253592Serwincheckowner_nid(ARGS_CHECKOWNER) {
199253592Serwin
200253592Serwin	REQUIRE(type == 104);
201253592Serwin
202253592Serwin	UNUSED(name);
203253592Serwin	UNUSED(type);
204253592Serwin	UNUSED(rdclass);
205253592Serwin	UNUSED(wildcard);
206253592Serwin
207253592Serwin	return (ISC_TRUE);
208253592Serwin}
209253592Serwin
210253592Serwinstatic inline isc_boolean_t
211253592Serwinchecknames_nid(ARGS_CHECKNAMES) {
212253592Serwin
213253592Serwin	REQUIRE(rdata->type == 104);
214253592Serwin	REQUIRE(rdata->length == 10);
215253592Serwin
216253592Serwin	UNUSED(rdata);
217253592Serwin	UNUSED(owner);
218253592Serwin	UNUSED(bad);
219253592Serwin
220253592Serwin	return (ISC_TRUE);
221253592Serwin}
222253592Serwin
223253592Serwinstatic inline int
224253592Serwincasecompare_nid(ARGS_COMPARE) {
225253592Serwin	return (compare_nid(rdata1, rdata2));
226253592Serwin}
227253592Serwin
228253592Serwin#endif	/* RDATA_GENERIC_NID_104_C */
229