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_EUI48_108_C
18253592Serwin#define RDATA_GENERIC_EUI48_108_C
19253592Serwin
20253592Serwin#include <string.h>
21253592Serwin
22253592Serwin#define RRTYPE_EUI48_ATTRIBUTES (0)
23253592Serwin
24253592Serwinstatic inline isc_result_t
25253592Serwinfromtext_eui48(ARGS_FROMTEXT) {
26253592Serwin	isc_token_t token;
27253592Serwin	unsigned char eui48[6];
28253592Serwin	unsigned int l0, l1, l2, l3, l4, l5;
29253592Serwin	int n;
30253592Serwin
31253592Serwin	REQUIRE(type == 108);
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_string,
40253592Serwin				      ISC_FALSE));
41253592Serwin	n = sscanf(DNS_AS_STR(token), "%2x-%2x-%2x-%2x-%2x-%2x",
42253592Serwin		   &l0, &l1, &l2, &l3, &l4, &l5);
43253592Serwin	if (n != 6 || l0 > 255U || l1 > 255U || l2 > 255U || l3 > 255U ||
44253592Serwin	    l4 > 255U || l5 > 255U)
45253592Serwin		return (DNS_R_BADEUI);
46253592Serwin
47253592Serwin	eui48[0] = l0;
48253592Serwin	eui48[1] = l1;
49253592Serwin	eui48[2] = l2;
50253592Serwin	eui48[3] = l3;
51253592Serwin	eui48[4] = l4;
52253592Serwin	eui48[5] = l5;
53253592Serwin	return (mem_tobuffer(target, eui48, sizeof(eui48)));
54253592Serwin}
55253592Serwin
56253592Serwinstatic inline isc_result_t
57253592Serwintotext_eui48(ARGS_TOTEXT) {
58253592Serwin	char buf[sizeof("xx-xx-xx-xx-xx-xx")];
59253592Serwin
60253592Serwin	REQUIRE(rdata->type == 108);
61253592Serwin	REQUIRE(rdata->length == 6);
62253592Serwin
63253592Serwin	UNUSED(tctx);
64253592Serwin
65253592Serwin	(void)snprintf(buf, sizeof(buf), "%02x-%02x-%02x-%02x-%02x-%02x",
66253592Serwin		       rdata->data[0], rdata->data[1], rdata->data[2],
67253592Serwin		       rdata->data[3], rdata->data[4], rdata->data[5]);
68253592Serwin	return (str_totext(buf, target));
69253592Serwin}
70253592Serwin
71253592Serwinstatic inline isc_result_t
72253592Serwinfromwire_eui48(ARGS_FROMWIRE) {
73253592Serwin	isc_region_t sregion;
74253592Serwin
75253592Serwin	REQUIRE(type == 108);
76253592Serwin
77253592Serwin	UNUSED(type);
78253592Serwin	UNUSED(options);
79253592Serwin	UNUSED(rdclass);
80253592Serwin	UNUSED(dctx);
81253592Serwin
82253592Serwin	isc_buffer_activeregion(source, &sregion);
83253592Serwin	if (sregion.length != 6)
84253592Serwin		return (DNS_R_FORMERR);
85253592Serwin	isc_buffer_forward(source, sregion.length);
86253592Serwin	return (mem_tobuffer(target, sregion.base, sregion.length));
87253592Serwin}
88253592Serwin
89253592Serwinstatic inline isc_result_t
90253592Serwintowire_eui48(ARGS_TOWIRE) {
91253592Serwin
92253592Serwin	REQUIRE(rdata->type == 108);
93253592Serwin	REQUIRE(rdata->length == 6);
94253592Serwin
95253592Serwin	UNUSED(cctx);
96253592Serwin
97253592Serwin	return (mem_tobuffer(target, rdata->data, rdata->length));
98253592Serwin}
99253592Serwin
100253592Serwinstatic inline int
101253592Serwincompare_eui48(ARGS_COMPARE) {
102253592Serwin	isc_region_t region1;
103253592Serwin	isc_region_t region2;
104253592Serwin
105253592Serwin	REQUIRE(rdata1->type == rdata2->type);
106253592Serwin	REQUIRE(rdata1->rdclass == rdata2->rdclass);
107253592Serwin	REQUIRE(rdata1->type == 108);
108253592Serwin	REQUIRE(rdata1->length == 6);
109253592Serwin	REQUIRE(rdata2->length == 6);
110253592Serwin
111253592Serwin	dns_rdata_toregion(rdata1, &region1);
112253592Serwin	dns_rdata_toregion(rdata2, &region2);
113253592Serwin	return (isc_region_compare(&region1, &region2));
114253592Serwin}
115253592Serwin
116253592Serwinstatic inline isc_result_t
117253592Serwinfromstruct_eui48(ARGS_FROMSTRUCT) {
118253592Serwin	dns_rdata_eui48_t *eui48 = source;
119253592Serwin
120253592Serwin	REQUIRE(type == 108);
121253592Serwin	REQUIRE(source != NULL);
122253592Serwin	REQUIRE(eui48->common.rdtype == type);
123253592Serwin	REQUIRE(eui48->common.rdclass == rdclass);
124253592Serwin
125253592Serwin	UNUSED(type);
126253592Serwin	UNUSED(rdclass);
127253592Serwin
128253592Serwin	return (mem_tobuffer(target, eui48->eui48, sizeof(eui48->eui48)));
129253592Serwin}
130253592Serwin
131253592Serwinstatic inline isc_result_t
132253592Serwintostruct_eui48(ARGS_TOSTRUCT) {
133253592Serwin	dns_rdata_eui48_t *eui48 = target;
134253592Serwin
135253592Serwin	REQUIRE(rdata->type == 108);
136253592Serwin	REQUIRE(target != NULL);
137253592Serwin	REQUIRE(rdata->length == 6);
138253592Serwin
139253592Serwin	UNUSED(mctx);
140253592Serwin
141253592Serwin	eui48->common.rdclass = rdata->rdclass;
142253592Serwin	eui48->common.rdtype = rdata->type;
143253592Serwin	ISC_LINK_INIT(&eui48->common, link);
144253592Serwin
145262706Serwin	memmove(eui48->eui48, rdata->data, rdata->length);
146253592Serwin	return (ISC_R_SUCCESS);
147253592Serwin}
148253592Serwin
149253592Serwinstatic inline void
150253592Serwinfreestruct_eui48(ARGS_FREESTRUCT) {
151253592Serwin	dns_rdata_eui48_t *eui48 = source;
152253592Serwin
153253592Serwin	REQUIRE(source != NULL);
154253592Serwin	REQUIRE(eui48->common.rdtype == 108);
155253592Serwin
156253592Serwin	return;
157253592Serwin}
158253592Serwin
159253592Serwinstatic inline isc_result_t
160253592Serwinadditionaldata_eui48(ARGS_ADDLDATA) {
161253592Serwin
162253592Serwin	REQUIRE(rdata->type == 108);
163253592Serwin	REQUIRE(rdata->length == 6);
164253592Serwin
165253592Serwin	UNUSED(rdata);
166253592Serwin	UNUSED(add);
167253592Serwin	UNUSED(arg);
168253592Serwin
169253592Serwin	return (ISC_R_SUCCESS);
170253592Serwin}
171253592Serwin
172253592Serwinstatic inline isc_result_t
173253592Serwindigest_eui48(ARGS_DIGEST) {
174253592Serwin	isc_region_t r;
175253592Serwin
176253592Serwin	REQUIRE(rdata->type == 108);
177253592Serwin	REQUIRE(rdata->length == 6);
178253592Serwin
179253592Serwin	dns_rdata_toregion(rdata, &r);
180253592Serwin
181253592Serwin	return ((digest)(arg, &r));
182253592Serwin}
183253592Serwin
184253592Serwinstatic inline isc_boolean_t
185253592Serwincheckowner_eui48(ARGS_CHECKOWNER) {
186253592Serwin
187253592Serwin	REQUIRE(type == 108);
188253592Serwin
189253592Serwin	UNUSED(name);
190253592Serwin	UNUSED(type);
191253592Serwin	UNUSED(rdclass);
192253592Serwin	UNUSED(wildcard);
193253592Serwin
194253592Serwin	return (ISC_TRUE);
195253592Serwin}
196253592Serwin
197253592Serwinstatic inline isc_boolean_t
198253592Serwinchecknames_eui48(ARGS_CHECKNAMES) {
199253592Serwin
200253592Serwin	REQUIRE(rdata->type == 108);
201253592Serwin	REQUIRE(rdata->length == 6);
202253592Serwin
203253592Serwin	UNUSED(rdata);
204253592Serwin	UNUSED(owner);
205253592Serwin	UNUSED(bad);
206253592Serwin
207253592Serwin	return (ISC_TRUE);
208253592Serwin}
209253592Serwin
210253592Serwinstatic inline int
211253592Serwincasecompare_eui48(ARGS_COMPARE) {
212253592Serwin	return (compare_eui48(rdata1, rdata2));
213253592Serwin}
214253592Serwin
215253592Serwin#endif	/* RDATA_GENERIC_EUI48_108_C */
216