1135446Strhodes/*
2262706Serwin * Copyright (C) 2004, 2005, 2007, 2009, 2014  Internet Systems Consortium, Inc. ("ISC")
3135446Strhodes * Copyright (C) 1999-2002  Internet Software Consortium.
4135446Strhodes *
5193149Sdougb * Permission to use, copy, modify, and/or distribute this software for any
6135446Strhodes * purpose with or without fee is hereby granted, provided that the above
7135446Strhodes * copyright notice and this permission notice appear in all copies.
8135446Strhodes *
9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11135446Strhodes * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15135446Strhodes * PERFORMANCE OF THIS SOFTWARE.
16135446Strhodes */
17135446Strhodes
18234010Sdougb/* $Id: aaaa_28.c,v 1.47 2009/12/04 22:06:37 tbox Exp $ */
19135446Strhodes
20135446Strhodes/* Reviewed: Thu Mar 16 16:52:50 PST 2000 by bwelling */
21135446Strhodes
22170222Sdougb/* RFC1886 */
23135446Strhodes
24135446Strhodes#ifndef RDATA_IN_1_AAAA_28_C
25135446Strhodes#define RDATA_IN_1_AAAA_28_C
26135446Strhodes
27135446Strhodes#include <isc/net.h>
28135446Strhodes
29135446Strhodes#define RRTYPE_AAAA_ATTRIBUTES (0)
30135446Strhodes
31135446Strhodesstatic inline isc_result_t
32135446Strhodesfromtext_in_aaaa(ARGS_FROMTEXT) {
33135446Strhodes	isc_token_t token;
34135446Strhodes	unsigned char addr[16];
35135446Strhodes	isc_region_t region;
36135446Strhodes
37135446Strhodes	REQUIRE(type == 28);
38135446Strhodes	REQUIRE(rdclass == 1);
39135446Strhodes
40135446Strhodes	UNUSED(type);
41135446Strhodes	UNUSED(origin);
42135446Strhodes	UNUSED(options);
43135446Strhodes	UNUSED(rdclass);
44135446Strhodes	UNUSED(callbacks);
45135446Strhodes
46135446Strhodes	RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
47135446Strhodes				      ISC_FALSE));
48135446Strhodes
49135446Strhodes	if (inet_pton(AF_INET6, DNS_AS_STR(token), addr) != 1)
50135446Strhodes		RETTOK(DNS_R_BADAAAA);
51135446Strhodes	isc_buffer_availableregion(target, &region);
52135446Strhodes	if (region.length < 16)
53135446Strhodes		return (ISC_R_NOSPACE);
54262706Serwin	memmove(region.base, addr, 16);
55135446Strhodes	isc_buffer_add(target, 16);
56135446Strhodes	return (ISC_R_SUCCESS);
57135446Strhodes}
58135446Strhodes
59135446Strhodesstatic inline isc_result_t
60135446Strhodestotext_in_aaaa(ARGS_TOTEXT) {
61135446Strhodes	isc_region_t region;
62135446Strhodes
63135446Strhodes	UNUSED(tctx);
64135446Strhodes
65135446Strhodes	REQUIRE(rdata->type == 28);
66135446Strhodes	REQUIRE(rdata->rdclass == 1);
67135446Strhodes	REQUIRE(rdata->length == 16);
68135446Strhodes
69135446Strhodes	dns_rdata_toregion(rdata, &region);
70135446Strhodes	return (inet_totext(AF_INET6, &region, target));
71135446Strhodes}
72135446Strhodes
73135446Strhodesstatic inline isc_result_t
74135446Strhodesfromwire_in_aaaa(ARGS_FROMWIRE) {
75135446Strhodes	isc_region_t sregion;
76135446Strhodes	isc_region_t tregion;
77135446Strhodes
78135446Strhodes	REQUIRE(type == 28);
79135446Strhodes	REQUIRE(rdclass == 1);
80135446Strhodes
81135446Strhodes	UNUSED(type);
82135446Strhodes	UNUSED(dctx);
83135446Strhodes	UNUSED(options);
84135446Strhodes	UNUSED(rdclass);
85135446Strhodes
86135446Strhodes	isc_buffer_activeregion(source, &sregion);
87135446Strhodes	isc_buffer_availableregion(target, &tregion);
88135446Strhodes	if (sregion.length < 16)
89135446Strhodes		return (ISC_R_UNEXPECTEDEND);
90135446Strhodes	if (tregion.length < 16)
91135446Strhodes		return (ISC_R_NOSPACE);
92135446Strhodes
93262706Serwin	memmove(tregion.base, sregion.base, 16);
94135446Strhodes	isc_buffer_forward(source, 16);
95135446Strhodes	isc_buffer_add(target, 16);
96135446Strhodes	return (ISC_R_SUCCESS);
97135446Strhodes}
98135446Strhodes
99135446Strhodesstatic inline isc_result_t
100135446Strhodestowire_in_aaaa(ARGS_TOWIRE) {
101135446Strhodes	isc_region_t region;
102135446Strhodes
103135446Strhodes	UNUSED(cctx);
104135446Strhodes
105135446Strhodes	REQUIRE(rdata->type == 28);
106135446Strhodes	REQUIRE(rdata->rdclass == 1);
107135446Strhodes	REQUIRE(rdata->length == 16);
108135446Strhodes
109135446Strhodes	isc_buffer_availableregion(target, &region);
110135446Strhodes	if (region.length < rdata->length)
111135446Strhodes		return (ISC_R_NOSPACE);
112262706Serwin	memmove(region.base, rdata->data, rdata->length);
113135446Strhodes	isc_buffer_add(target, 16);
114135446Strhodes	return (ISC_R_SUCCESS);
115135446Strhodes}
116135446Strhodes
117135446Strhodesstatic inline int
118135446Strhodescompare_in_aaaa(ARGS_COMPARE) {
119135446Strhodes	isc_region_t r1;
120135446Strhodes	isc_region_t r2;
121135446Strhodes
122135446Strhodes	REQUIRE(rdata1->type == rdata2->type);
123135446Strhodes	REQUIRE(rdata1->rdclass == rdata2->rdclass);
124135446Strhodes	REQUIRE(rdata1->type == 28);
125135446Strhodes	REQUIRE(rdata1->rdclass == 1);
126135446Strhodes	REQUIRE(rdata1->length == 16);
127135446Strhodes	REQUIRE(rdata2->length == 16);
128135446Strhodes
129135446Strhodes	dns_rdata_toregion(rdata1, &r1);
130135446Strhodes	dns_rdata_toregion(rdata2, &r2);
131135446Strhodes	return (isc_region_compare(&r1, &r2));
132135446Strhodes}
133135446Strhodes
134135446Strhodesstatic inline isc_result_t
135135446Strhodesfromstruct_in_aaaa(ARGS_FROMSTRUCT) {
136135446Strhodes	dns_rdata_in_aaaa_t *aaaa = source;
137135446Strhodes
138135446Strhodes	REQUIRE(type == 28);
139135446Strhodes	REQUIRE(rdclass == 1);
140135446Strhodes	REQUIRE(source != NULL);
141135446Strhodes	REQUIRE(aaaa->common.rdtype == type);
142135446Strhodes	REQUIRE(aaaa->common.rdclass == rdclass);
143135446Strhodes
144135446Strhodes	UNUSED(type);
145135446Strhodes	UNUSED(rdclass);
146135446Strhodes
147135446Strhodes	return (mem_tobuffer(target, aaaa->in6_addr.s6_addr, 16));
148135446Strhodes}
149135446Strhodes
150135446Strhodesstatic inline isc_result_t
151135446Strhodestostruct_in_aaaa(ARGS_TOSTRUCT) {
152135446Strhodes	dns_rdata_in_aaaa_t *aaaa = target;
153135446Strhodes	isc_region_t r;
154135446Strhodes
155135446Strhodes	REQUIRE(rdata->type == 28);
156135446Strhodes	REQUIRE(rdata->rdclass == 1);
157135446Strhodes	REQUIRE(target != NULL);
158135446Strhodes	REQUIRE(rdata->length == 16);
159135446Strhodes
160135446Strhodes	UNUSED(mctx);
161135446Strhodes
162135446Strhodes	aaaa->common.rdclass = rdata->rdclass;
163135446Strhodes	aaaa->common.rdtype = rdata->type;
164135446Strhodes	ISC_LINK_INIT(&aaaa->common, link);
165135446Strhodes
166135446Strhodes	dns_rdata_toregion(rdata, &r);
167135446Strhodes	INSIST(r.length == 16);
168262706Serwin	memmove(aaaa->in6_addr.s6_addr, r.base, 16);
169135446Strhodes
170135446Strhodes	return (ISC_R_SUCCESS);
171135446Strhodes}
172135446Strhodes
173135446Strhodesstatic inline void
174135446Strhodesfreestruct_in_aaaa(ARGS_FREESTRUCT) {
175135446Strhodes	dns_rdata_in_aaaa_t *aaaa = source;
176135446Strhodes
177135446Strhodes	REQUIRE(source != NULL);
178135446Strhodes	REQUIRE(aaaa->common.rdclass == 1);
179135446Strhodes	REQUIRE(aaaa->common.rdtype == 28);
180135446Strhodes
181135446Strhodes	UNUSED(aaaa);
182135446Strhodes}
183135446Strhodes
184135446Strhodesstatic inline isc_result_t
185135446Strhodesadditionaldata_in_aaaa(ARGS_ADDLDATA) {
186135446Strhodes	REQUIRE(rdata->type == 28);
187135446Strhodes	REQUIRE(rdata->rdclass == 1);
188135446Strhodes
189135446Strhodes	UNUSED(rdata);
190135446Strhodes	UNUSED(add);
191135446Strhodes	UNUSED(arg);
192135446Strhodes
193135446Strhodes	return (ISC_R_SUCCESS);
194135446Strhodes}
195135446Strhodes
196135446Strhodesstatic inline isc_result_t
197135446Strhodesdigest_in_aaaa(ARGS_DIGEST) {
198135446Strhodes	isc_region_t r;
199135446Strhodes
200135446Strhodes	REQUIRE(rdata->type == 28);
201135446Strhodes	REQUIRE(rdata->rdclass == 1);
202135446Strhodes
203135446Strhodes	dns_rdata_toregion(rdata, &r);
204135446Strhodes
205135446Strhodes	return ((digest)(arg, &r));
206135446Strhodes}
207135446Strhodes
208135446Strhodesstatic inline isc_boolean_t
209135446Strhodescheckowner_in_aaaa(ARGS_CHECKOWNER) {
210135446Strhodes
211135446Strhodes	REQUIRE(type == 28);
212135446Strhodes	REQUIRE(rdclass == 1);
213135446Strhodes
214135446Strhodes	UNUSED(type);
215135446Strhodes	UNUSED(rdclass);
216135446Strhodes
217135446Strhodes	return (dns_name_ishostname(name, wildcard));
218135446Strhodes}
219135446Strhodes
220135446Strhodesstatic inline isc_boolean_t
221135446Strhodeschecknames_in_aaaa(ARGS_CHECKNAMES) {
222135446Strhodes
223135446Strhodes	REQUIRE(rdata->type == 28);
224135446Strhodes	REQUIRE(rdata->rdclass == 1);
225135446Strhodes
226135446Strhodes	UNUSED(rdata);
227135446Strhodes	UNUSED(owner);
228135446Strhodes	UNUSED(bad);
229135446Strhodes
230135446Strhodes	return (ISC_TRUE);
231135446Strhodes}
232135446Strhodes
233224092Sdougbstatic inline int
234224092Sdougbcasecompare_in_aaaa(ARGS_COMPARE) {
235224092Sdougb	return (compare_in_aaaa(rdata1, rdata2));
236224092Sdougb}
237135446Strhodes#endif	/* RDATA_IN_1_AAAA_28_C */
238