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_L32_105_C 18253592Serwin#define RDATA_GENERIC_L32_105_C 19253592Serwin 20253592Serwin#include <string.h> 21253592Serwin 22253592Serwin#include <isc/net.h> 23253592Serwin 24253592Serwin#define RRTYPE_L32_ATTRIBUTES (0) 25253592Serwin 26253592Serwinstatic inline isc_result_t 27253592Serwinfromtext_l32(ARGS_FROMTEXT) { 28253592Serwin isc_token_t token; 29253592Serwin struct in_addr addr; 30253592Serwin isc_region_t region; 31253592Serwin 32253592Serwin REQUIRE(type == 105); 33253592Serwin 34253592Serwin UNUSED(type); 35253592Serwin UNUSED(rdclass); 36253592Serwin UNUSED(origin); 37253592Serwin UNUSED(options); 38253592Serwin UNUSED(callbacks); 39253592Serwin 40253592Serwin RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number, 41253592Serwin ISC_FALSE)); 42253592Serwin if (token.value.as_ulong > 0xffffU) 43253592Serwin RETTOK(ISC_R_RANGE); 44253592Serwin RETERR(uint16_tobuffer(token.value.as_ulong, target)); 45253592Serwin 46253592Serwin RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string, 47253592Serwin ISC_FALSE)); 48253592Serwin 49253592Serwin if (getquad(DNS_AS_STR(token), &addr, lexer, callbacks) != 1) 50253592Serwin RETTOK(DNS_R_BADDOTTEDQUAD); 51253592Serwin isc_buffer_availableregion(target, ®ion); 52253592Serwin if (region.length < 4) 53253592Serwin return (ISC_R_NOSPACE); 54262706Serwin memmove(region.base, &addr, 4); 55253592Serwin isc_buffer_add(target, 4); 56253592Serwin return (ISC_R_SUCCESS); 57253592Serwin} 58253592Serwin 59253592Serwinstatic inline isc_result_t 60253592Serwintotext_l32(ARGS_TOTEXT) { 61253592Serwin isc_region_t region; 62253592Serwin char buf[sizeof("65000")]; 63253592Serwin unsigned short num; 64253592Serwin 65253592Serwin REQUIRE(rdata->type == 105); 66253592Serwin REQUIRE(rdata->length == 6); 67253592Serwin 68253592Serwin UNUSED(tctx); 69253592Serwin 70253592Serwin dns_rdata_toregion(rdata, ®ion); 71253592Serwin num = uint16_fromregion(®ion); 72253592Serwin isc_region_consume(®ion, 2); 73253592Serwin sprintf(buf, "%u", num); 74253592Serwin RETERR(str_totext(buf, target)); 75253592Serwin 76253592Serwin RETERR(str_totext(" ", target)); 77253592Serwin 78253592Serwin return (inet_totext(AF_INET, ®ion, target)); 79253592Serwin} 80253592Serwin 81253592Serwinstatic inline isc_result_t 82253592Serwinfromwire_l32(ARGS_FROMWIRE) { 83253592Serwin isc_region_t sregion; 84253592Serwin 85253592Serwin REQUIRE(type == 105); 86253592Serwin 87253592Serwin UNUSED(type); 88253592Serwin UNUSED(options); 89253592Serwin UNUSED(rdclass); 90253592Serwin UNUSED(dctx); 91253592Serwin 92253592Serwin isc_buffer_activeregion(source, &sregion); 93253592Serwin if (sregion.length != 6) 94253592Serwin return (DNS_R_FORMERR); 95253592Serwin isc_buffer_forward(source, sregion.length); 96253592Serwin return (mem_tobuffer(target, sregion.base, sregion.length)); 97253592Serwin} 98253592Serwin 99253592Serwinstatic inline isc_result_t 100253592Serwintowire_l32(ARGS_TOWIRE) { 101253592Serwin 102253592Serwin REQUIRE(rdata->type == 105); 103253592Serwin REQUIRE(rdata->length == 6); 104253592Serwin 105253592Serwin UNUSED(cctx); 106253592Serwin 107253592Serwin return (mem_tobuffer(target, rdata->data, rdata->length)); 108253592Serwin} 109253592Serwin 110253592Serwinstatic inline int 111253592Serwincompare_l32(ARGS_COMPARE) { 112253592Serwin isc_region_t region1; 113253592Serwin isc_region_t region2; 114253592Serwin 115253592Serwin REQUIRE(rdata1->type == rdata2->type); 116253592Serwin REQUIRE(rdata1->rdclass == rdata2->rdclass); 117253592Serwin REQUIRE(rdata1->type == 105); 118253592Serwin REQUIRE(rdata1->length == 6); 119253592Serwin REQUIRE(rdata2->length == 6); 120253592Serwin 121253592Serwin dns_rdata_toregion(rdata1, ®ion1); 122253592Serwin dns_rdata_toregion(rdata2, ®ion2); 123253592Serwin return (isc_region_compare(®ion1, ®ion2)); 124253592Serwin} 125253592Serwin 126253592Serwinstatic inline isc_result_t 127253592Serwinfromstruct_l32(ARGS_FROMSTRUCT) { 128253592Serwin dns_rdata_l32_t *l32 = source; 129253592Serwin isc_uint32_t n; 130253592Serwin 131253592Serwin REQUIRE(type == 105); 132253592Serwin REQUIRE(source != NULL); 133253592Serwin REQUIRE(l32->common.rdtype == type); 134253592Serwin REQUIRE(l32->common.rdclass == rdclass); 135253592Serwin 136253592Serwin UNUSED(type); 137253592Serwin UNUSED(rdclass); 138253592Serwin 139253592Serwin RETERR(uint16_tobuffer(l32->pref, target)); 140253592Serwin n = ntohl(l32->l32.s_addr); 141253592Serwin return (uint32_tobuffer(n, target)); 142253592Serwin} 143253592Serwin 144253592Serwinstatic inline isc_result_t 145253592Serwintostruct_l32(ARGS_TOSTRUCT) { 146253592Serwin isc_region_t region; 147253592Serwin dns_rdata_l32_t *l32 = target; 148253592Serwin isc_uint32_t n; 149253592Serwin 150253592Serwin REQUIRE(rdata->type == 105); 151253592Serwin REQUIRE(target != NULL); 152253592Serwin REQUIRE(rdata->length == 6); 153253592Serwin 154253592Serwin UNUSED(mctx); 155253592Serwin 156253592Serwin l32->common.rdclass = rdata->rdclass; 157253592Serwin l32->common.rdtype = rdata->type; 158253592Serwin ISC_LINK_INIT(&l32->common, link); 159253592Serwin 160253592Serwin dns_rdata_toregion(rdata, ®ion); 161253592Serwin l32->pref = uint16_fromregion(®ion); 162253592Serwin n = uint32_fromregion(®ion); 163253592Serwin l32->l32.s_addr = htonl(n); 164253592Serwin return (ISC_R_SUCCESS); 165253592Serwin} 166253592Serwin 167253592Serwinstatic inline void 168253592Serwinfreestruct_l32(ARGS_FREESTRUCT) { 169253592Serwin dns_rdata_l32_t *l32 = source; 170253592Serwin 171253592Serwin REQUIRE(source != NULL); 172253592Serwin REQUIRE(l32->common.rdtype == 105); 173253592Serwin 174253592Serwin return; 175253592Serwin} 176253592Serwin 177253592Serwinstatic inline isc_result_t 178253592Serwinadditionaldata_l32(ARGS_ADDLDATA) { 179253592Serwin 180253592Serwin REQUIRE(rdata->type == 105); 181253592Serwin REQUIRE(rdata->length == 6); 182253592Serwin 183253592Serwin UNUSED(rdata); 184253592Serwin UNUSED(add); 185253592Serwin UNUSED(arg); 186253592Serwin 187253592Serwin return (ISC_R_SUCCESS); 188253592Serwin} 189253592Serwin 190253592Serwinstatic inline isc_result_t 191253592Serwindigest_l32(ARGS_DIGEST) { 192253592Serwin isc_region_t r; 193253592Serwin 194253592Serwin REQUIRE(rdata->type == 105); 195253592Serwin REQUIRE(rdata->length == 6); 196253592Serwin 197253592Serwin dns_rdata_toregion(rdata, &r); 198253592Serwin 199253592Serwin return ((digest)(arg, &r)); 200253592Serwin} 201253592Serwin 202253592Serwinstatic inline isc_boolean_t 203253592Serwincheckowner_l32(ARGS_CHECKOWNER) { 204253592Serwin 205253592Serwin REQUIRE(type == 105); 206253592Serwin 207253592Serwin UNUSED(name); 208253592Serwin UNUSED(type); 209253592Serwin UNUSED(rdclass); 210253592Serwin UNUSED(wildcard); 211253592Serwin 212253592Serwin return (ISC_TRUE); 213253592Serwin} 214253592Serwin 215253592Serwinstatic inline isc_boolean_t 216253592Serwinchecknames_l32(ARGS_CHECKNAMES) { 217253592Serwin 218253592Serwin REQUIRE(rdata->type == 105); 219253592Serwin REQUIRE(rdata->length == 6); 220253592Serwin 221253592Serwin UNUSED(rdata); 222253592Serwin UNUSED(owner); 223253592Serwin UNUSED(bad); 224253592Serwin 225253592Serwin return (ISC_TRUE); 226253592Serwin} 227253592Serwin 228253592Serwinstatic inline int 229253592Serwincasecompare_l32(ARGS_COMPARE) { 230253592Serwin return (compare_l32(rdata1, rdata2)); 231253592Serwin} 232253592Serwin 233253592Serwin#endif /* RDATA_GENERIC_L32_105_C */ 234