3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 2013-2016 Internet Systems Consortium, Inc. ("ISC")
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews */
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews#ifndef RDATA_GENERIC_EUI64_109_C
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews#define RDATA_GENERIC_EUI64_109_C
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews#include <string.h>
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews#define RRTYPE_EUI64_ATTRIBUTES (0)
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline isc_result_t
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsfromtext_eui64(ARGS_FROMTEXT) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews isc_token_t token;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews unsigned char eui64[8];
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews unsigned int l0, l1, l2, l3, l4, l5, l6, l7;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews int n;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(type == dns_rdatatype_eui64);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(type);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(rdclass);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(origin);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(options);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(callbacks);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews ISC_FALSE));
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews n = sscanf(DNS_AS_STR(token), "%2x-%2x-%2x-%2x-%2x-%2x-%2x-%2x",
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews &l0, &l1, &l2, &l3, &l4, &l5, &l6, &l7);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews if (n != 8 || l0 > 255U || l1 > 255U || l2 > 255U || l3 > 255U ||
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews l4 > 255U || l5 > 255U || l6 > 255U || l7 > 255U)
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (DNS_R_BADEUI);
ea3dd509f64804198bcd0792e319ce0fa0b10907Tinderbox User
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews eui64[0] = l0;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews eui64[1] = l1;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews eui64[2] = l2;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews eui64[3] = l3;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews eui64[4] = l4;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews eui64[5] = l5;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews eui64[6] = l6;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews eui64[7] = l7;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (mem_tobuffer(target, eui64, sizeof(eui64)));
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline isc_result_t
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewstotext_eui64(ARGS_TOTEXT) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews char buf[sizeof("xx-xx-xx-xx-xx-xx-xx-xx")];
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_eui64);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(rdata->length == 8);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(tctx);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews (void)snprintf(buf, sizeof(buf),
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews "%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x",
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews rdata->data[0], rdata->data[1],
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews rdata->data[2], rdata->data[3],
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews rdata->data[4], rdata->data[5],
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews rdata->data[6], rdata->data[7]);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (str_totext(buf, target));
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline isc_result_t
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsfromwire_eui64(ARGS_FROMWIRE) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews isc_region_t sregion;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(type == dns_rdatatype_eui64);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(type);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(options);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(rdclass);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(dctx);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews isc_buffer_activeregion(source, &sregion);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews if (sregion.length != 8)
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (DNS_R_FORMERR);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews isc_buffer_forward(source, sregion.length);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (mem_tobuffer(target, sregion.base, sregion.length));
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline isc_result_t
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewstowire_eui64(ARGS_TOWIRE) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_eui64);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(rdata->length == 8);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(cctx);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (mem_tobuffer(target, rdata->data, rdata->length));
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline int
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewscompare_eui64(ARGS_COMPARE) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews isc_region_t region1;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews isc_region_t region2;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(rdata1->type == rdata2->type);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(rdata1->rdclass == rdata2->rdclass);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata1->type == dns_rdatatype_eui64);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(rdata1->length == 8);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(rdata2->length == 8);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews dns_rdata_toregion(rdata1, &region1);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews dns_rdata_toregion(rdata2, &region2);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (isc_region_compare(&region1, &region2));
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline isc_result_t
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsfromstruct_eui64(ARGS_FROMSTRUCT) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews dns_rdata_eui64_t *eui64 = source;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(type == dns_rdatatype_eui64);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(source != NULL);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(eui64->common.rdtype == type);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(eui64->common.rdclass == rdclass);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(type);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(rdclass);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (mem_tobuffer(target, eui64->eui64, sizeof(eui64->eui64)));
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline isc_result_t
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewstostruct_eui64(ARGS_TOSTRUCT) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews dns_rdata_eui64_t *eui64 = target;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_eui64);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(target != NULL);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(rdata->length == 8);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(mctx);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews eui64->common.rdclass = rdata->rdclass;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews eui64->common.rdtype = rdata->type;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews ISC_LINK_INIT(&eui64->common, link);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt memmove(eui64->eui64, rdata->data, rdata->length);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (ISC_R_SUCCESS);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline void
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsfreestruct_eui64(ARGS_FREESTRUCT) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews dns_rdata_eui64_t *eui64 = source;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(source != NULL);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(eui64->common.rdtype == dns_rdatatype_eui64);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline isc_result_t
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsadditionaldata_eui64(ARGS_ADDLDATA) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_eui64);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(rdata->length == 8);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(rdata);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(add);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(arg);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (ISC_R_SUCCESS);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline isc_result_t
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsdigest_eui64(ARGS_DIGEST) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews isc_region_t r;
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_eui64);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(rdata->length == 8);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews dns_rdata_toregion(rdata, &r);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return ((digest)(arg, &r));
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline isc_boolean_t
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewscheckowner_eui64(ARGS_CHECKOWNER) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(type == dns_rdatatype_eui64);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(name);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(type);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(rdclass);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(wildcard);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (ISC_TRUE);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline isc_boolean_t
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewschecknames_eui64(ARGS_CHECKNAMES) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_eui64);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews REQUIRE(rdata->length == 8);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(rdata);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(owner);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews UNUSED(bad);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (ISC_TRUE);
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewsstatic inline int
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrewscasecompare_eui64(ARGS_COMPARE) {
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews return (compare_eui64(rdata1, rdata2));
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews}
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews
3a6d62c59f73d024d1b2ba2ac94d7600530166ffMark Andrews#endif /* RDATA_GENERIC_EUI64_109_C */