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_L64_106_C 18253592Serwin#define RDATA_GENERIC_L64_106_C 19253592Serwin 20253592Serwin#include <string.h> 21253592Serwin 22253592Serwin#include <isc/net.h> 23253592Serwin 24253592Serwin#define RRTYPE_L64_ATTRIBUTES (0) 25253592Serwin 26253592Serwinstatic inline isc_result_t 27253592Serwinfromtext_l64(ARGS_FROMTEXT) { 28253592Serwin isc_token_t token; 29253592Serwin unsigned char locator[NS_LOCATORSZ]; 30253592Serwin 31253592Serwin REQUIRE(type == 106); 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_l64(ARGS_TOTEXT) { 55253592Serwin isc_region_t region; 56253592Serwin char buf[sizeof("xxxx:xxxx:xxxx:xxxx")]; 57253592Serwin unsigned short num; 58253592Serwin 59253592Serwin REQUIRE(rdata->type == 106); 60253592Serwin REQUIRE(rdata->length == 10); 61253592Serwin 62253592Serwin UNUSED(tctx); 63253592Serwin 64253592Serwin dns_rdata_toregion(rdata, ®ion); 65253592Serwin num = uint16_fromregion(®ion); 66253592Serwin isc_region_consume(®ion, 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_l64(ARGS_FROMWIRE) { 82253592Serwin isc_region_t sregion; 83253592Serwin 84253592Serwin REQUIRE(type == 106); 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_l64(ARGS_TOWIRE) { 100253592Serwin 101253592Serwin REQUIRE(rdata->type == 106); 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_l64(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 == 106); 117253592Serwin REQUIRE(rdata1->length == 10); 118253592Serwin REQUIRE(rdata2->length == 10); 119253592Serwin 120253592Serwin dns_rdata_toregion(rdata1, ®ion1); 121253592Serwin dns_rdata_toregion(rdata2, ®ion2); 122253592Serwin return (isc_region_compare(®ion1, ®ion2)); 123253592Serwin} 124253592Serwin 125253592Serwinstatic inline isc_result_t 126253592Serwinfromstruct_l64(ARGS_FROMSTRUCT) { 127253592Serwin dns_rdata_l64_t *l64 = source; 128253592Serwin 129253592Serwin REQUIRE(type == 106); 130253592Serwin REQUIRE(source != NULL); 131253592Serwin REQUIRE(l64->common.rdtype == type); 132253592Serwin REQUIRE(l64->common.rdclass == rdclass); 133253592Serwin 134253592Serwin UNUSED(type); 135253592Serwin UNUSED(rdclass); 136253592Serwin 137253592Serwin RETERR(uint16_tobuffer(l64->pref, target)); 138253592Serwin return (mem_tobuffer(target, l64->l64, sizeof(l64->l64))); 139253592Serwin} 140253592Serwin 141253592Serwinstatic inline isc_result_t 142253592Serwintostruct_l64(ARGS_TOSTRUCT) { 143253592Serwin isc_region_t region; 144253592Serwin dns_rdata_l64_t *l64 = target; 145253592Serwin 146253592Serwin REQUIRE(rdata->type == 106); 147253592Serwin REQUIRE(target != NULL); 148253592Serwin REQUIRE(rdata->length == 10); 149253592Serwin 150253592Serwin UNUSED(mctx); 151253592Serwin 152253592Serwin l64->common.rdclass = rdata->rdclass; 153253592Serwin l64->common.rdtype = rdata->type; 154253592Serwin ISC_LINK_INIT(&l64->common, link); 155253592Serwin 156253592Serwin dns_rdata_toregion(rdata, ®ion); 157253592Serwin l64->pref = uint16_fromregion(®ion); 158262706Serwin memmove(l64->l64, region.base, region.length); 159253592Serwin return (ISC_R_SUCCESS); 160253592Serwin} 161253592Serwin 162253592Serwinstatic inline void 163253592Serwinfreestruct_l64(ARGS_FREESTRUCT) { 164253592Serwin dns_rdata_l64_t *l64 = source; 165253592Serwin 166253592Serwin REQUIRE(source != NULL); 167253592Serwin REQUIRE(l64->common.rdtype == 106); 168253592Serwin 169253592Serwin return; 170253592Serwin} 171253592Serwin 172253592Serwinstatic inline isc_result_t 173253592Serwinadditionaldata_l64(ARGS_ADDLDATA) { 174253592Serwin 175253592Serwin REQUIRE(rdata->type == 106); 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_l64(ARGS_DIGEST) { 187253592Serwin isc_region_t r; 188253592Serwin 189253592Serwin REQUIRE(rdata->type == 106); 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_l64(ARGS_CHECKOWNER) { 199253592Serwin 200253592Serwin REQUIRE(type == 106); 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_l64(ARGS_CHECKNAMES) { 212253592Serwin 213253592Serwin REQUIRE(rdata->type == 106); 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_l64(ARGS_COMPARE) { 225253592Serwin return (compare_l64(rdata1, rdata2)); 226253592Serwin} 227253592Serwin 228253592Serwin#endif /* RDATA_GENERIC_L64_106_C */ 229