]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add support for ATMA
authorMark Andrews <marka@isc.org>
Wed, 24 Oct 2018 05:34:40 +0000 (16:34 +1100)
committerMark Andrews <marka@isc.org>
Thu, 25 Oct 2018 02:21:49 +0000 (13:21 +1100)
CHANGES
bin/tests/system/genzone.sh
bin/tests/system/xfer/dig1.good
bin/tests/system/xfer/dig2.good
lib/dns/gen.c
lib/dns/rdata/in_1/atma_34.c [new file with mode: 0644]
lib/dns/rdata/in_1/atma_34.h [new file with mode: 0644]
lib/dns/tests/rdata_test.c
util/copyrights

diff --git a/CHANGES b/CHANGES
index 4c978ad7fd99a7dc738349f87d55c3c9599b6f4e..d3347e0eae4384a248e3c6da67e17c404687acab 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+5057.  [protocol]      Add support for ATMA. [GL #619]
+
 5056.  [placeholder]
 
 5055.  [func]          A default list of primary servers for the root zone is
index 264d4ae674f8d71f4054bd1bd7ab3ff938e66fc3..fac51f7d291f46a00c231a353f219990a8ff182a 100644 (file)
@@ -193,7 +193,11 @@ loc02                      LOC     60 09 00.000 N 24 39 00.000 E 10.00m 20.00m (
 srv01                  SRV 0 0 0 .
 srv02                  SRV 65535 65535 65535  old-slow-box
 
-; type 34 (ATMA - not implemented by BIND)
+; type 34
+atma01                 ATMA    +61200000000
+atma02                 ATMA    +61.2.0000.0000
+atma03                 ATMA    1234567890abcdef
+atma04                 ATMA    f.e.d.c.b.a.0.9.8.7.6.5.4.3.2.1
 
 ; type 35
 naptr01                        NAPTR   0 0 "" "" "" . 
index aba6a43ac363e296eff59d125e26599164cafa1e..f45627ab70ac9219f491faef214573c2438e5192 100644 (file)
@@ -12,6 +12,10 @@ aaaa02.example.              3600    IN      AAAA    fd92:7065:b8e:ffff::5
 afsdb01.example.       3600    IN      AFSDB   0 hostname.example.
 afsdb02.example.       3600    IN      AFSDB   65535 .
 apl01.example.         3600    IN      APL     !1:10.0.0.1/32 1:10.0.0.0/24
+atma01.example.                3600    IN      ATMA    +61200000000
+atma02.example.                3600    IN      ATMA    +61200000000
+atma03.example.                3600    IN      ATMA    1234567890abcdef
+atma04.example.                3600    IN      ATMA    fedcba0987654321
 avc.example.           3600    IN      AVC     "foo:bar"
 caa01.example.         3600    IN      CAA     0 issue "ca.example.net; policy=ev"
 caa02.example.         3600    IN      CAA     128 tbs "Unknown"
index 40c8c405b41045b013daafb00fd2eb624972c4f7..8b1751ea48ebfe37f555e47bef0d21571b31e728 100644 (file)
@@ -12,6 +12,10 @@ aaaa02.example.              3600    IN      AAAA    fd92:7065:b8e:ffff::5
 afsdb01.example.       3600    IN      AFSDB   0 hostname.example.
 afsdb02.example.       3600    IN      AFSDB   65535 .
 apl01.example.         3600    IN      APL     !1:10.0.0.1/32 1:10.0.0.1/24
+atma01.example.                3600    IN      ATMA    +61200000000
+atma02.example.                3600    IN      ATMA    +61200000000
+atma03.example.                3600    IN      ATMA    1234567890abcdef
+atma04.example.                3600    IN      ATMA    fedcba0987654321
 avc.example.           3600    IN      AVC     "foo:bar"
 caa01.example.         3600    IN      CAA     0 issue "ca.example.net; policy=ev"
 caa02.example.         3600    IN      CAA     128 tbs "Unknown"
index 1492aa67bd7c496f225d7d8e5bc8a273a9e10a79..885b7d659daf1f4ba9f72ebe03b602f2361b28e9 100644 (file)
@@ -698,7 +698,6 @@ main(int argc, char **argv) {
                insert_into_typenames(0, "reserved0", RESERVED);
                insert_into_typenames(31, "eid", RESERVED);
                insert_into_typenames(32, "nimloc", RESERVED);
-               insert_into_typenames(34, "atma", RESERVED);
                insert_into_typenames(100, "uinfo", RESERVED);
                insert_into_typenames(101, "uid", RESERVED);
                insert_into_typenames(102, "gid", RESERVED);
diff --git a/lib/dns/rdata/in_1/atma_34.c b/lib/dns/rdata/in_1/atma_34.c
new file mode 100644 (file)
index 0000000..b5d1aa1
--- /dev/null
@@ -0,0 +1,317 @@
+/*
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * See the COPYRIGHT file distributed with this work for additional
+ * information regarding copyright ownership.
+ */
+
+/* http://www.broadband-forum.org/ftp/pub/approved-specs/af-dans-0152.000.pdf */
+
+#ifndef RDATA_IN_1_ATMA_22_C
+#define RDATA_IN_1_ATMA_22_C
+
+#define RRTYPE_ATMA_ATTRIBUTES (0)
+
+static inline isc_result_t
+fromtext_in_atma(ARGS_FROMTEXT) {
+       isc_token_t token;
+       isc_textregion_t *sr;
+       int n;
+       bool valid = false;
+       bool lastwasperiod = true;      /* leading periods not allowed */
+       int digits = 0;
+       unsigned char c = 0;
+
+       REQUIRE(type == dns_rdatatype_atma);
+       REQUIRE(rdclass == dns_rdataclass_in);
+
+       UNUSED(type);
+       UNUSED(origin);
+       UNUSED(options);
+       UNUSED(rdclass);
+       UNUSED(callbacks);
+
+       /* ATM End System Address (AESA) format or E.164 */
+       RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+                                     false));
+       sr = &token.value.as_textregion;
+       if (sr->length < 1) {
+               RETTOK(ISC_R_UNEXPECTEDEND);
+       }
+
+       if (sr->base[0] != '+') {
+               /*
+                * Format 0: ATM End System Address (AESA) format.
+                */
+               c = 0;
+               RETERR(mem_tobuffer(target, &c, 1));
+               while (sr->length > 0) {
+                       if (sr->base[0] == '.') {
+                               if (lastwasperiod) {
+                                       RETTOK(DNS_R_SYNTAX);
+                               }
+                               isc_textregion_consume(sr, 1);
+                               lastwasperiod = true;
+                               continue;
+                       }
+                       if ((n = hexvalue(sr->base[0])) == -1) {
+                               RETTOK(DNS_R_SYNTAX);
+                       }
+                       c <<= 4;
+                       c += n;
+                       if (++digits == 2) {
+                               RETERR(mem_tobuffer(target, &c, 1));
+                               valid = true;
+                               digits = 0;
+                               c = 0;
+                       }
+                       isc_textregion_consume(sr, 1);
+                       lastwasperiod = false;
+               }
+               if (digits != 0 || !valid || lastwasperiod) {
+                       RETTOK(ISC_R_UNEXPECTEDEND);
+               }
+       } else {
+               /*
+                * Format 1:  E.164.
+                */
+               c = 1;
+               RETERR(mem_tobuffer(target, &c, 1));
+               isc_textregion_consume(sr, 1);
+               while (sr->length > 0) {
+                       if (sr->base[0] == '.') {
+                               if (lastwasperiod) {
+                                       RETTOK(DNS_R_SYNTAX);
+                               }
+                               isc_textregion_consume(sr, 1);
+                               lastwasperiod = true;
+                               continue;
+                       }
+                       if ((sr->base[0] < '0') || (sr->base[0] > '9')) {
+                               RETTOK(DNS_R_SYNTAX);
+                       }
+                       RETERR(mem_tobuffer(target, sr->base, 1));
+                       isc_textregion_consume(sr, 1);
+                       lastwasperiod = false;
+               }
+               if (lastwasperiod) {
+                       RETTOK(ISC_R_UNEXPECTEDEND);
+               }
+       }
+       return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+totext_in_atma(ARGS_TOTEXT) {
+       isc_region_t region;
+       char buf[sizeof("xx")];
+
+       REQUIRE(rdata->type == dns_rdatatype_atma);
+       REQUIRE(rdata->rdclass == dns_rdataclass_in);
+       REQUIRE(rdata->length != 0);
+
+       UNUSED(tctx);
+
+       dns_rdata_toregion(rdata, &region);
+       INSIST(region.length > 1);
+       switch (region.base[0]) {
+       case 0:
+               isc_region_consume(&region, 1);
+               while (region.length != 0) {
+                       snprintf(buf, sizeof(buf), "%02x", region.base[0]);
+                       isc_region_consume(&region, 1);
+                       RETERR(str_totext(buf, target));
+               }
+               break;
+       case 1:
+               RETERR(str_totext("+", target));
+               isc_region_consume(&region, 1);
+               RETERR(mem_tobuffer(target, region.base, region.length));
+               break;
+       default:
+               return (ISC_R_NOTIMPLEMENTED);
+       }
+       return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+fromwire_in_atma(ARGS_FROMWIRE) {
+       isc_region_t region;
+
+       REQUIRE(type == dns_rdatatype_atma);
+       REQUIRE(rdclass == dns_rdataclass_in);
+
+       UNUSED(type);
+       UNUSED(dctx);
+       UNUSED(options);
+       UNUSED(rdclass);
+
+       isc_buffer_activeregion(source, &region);
+       if (region.length < 2) {
+               return (ISC_R_UNEXPECTEDEND);
+       }
+       if (region.base[0] == 1) {
+               unsigned int i;
+               for (i = 1; i < region.length; i++) {
+                       if (region.base[i] < '0' || region.base[i] > '9') {
+                               return (DNS_R_FORMERR);
+                       }
+               }
+       }
+       RETERR(mem_tobuffer(target, region.base, region.length));
+       isc_buffer_forward(source, region.length);
+       return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+towire_in_atma(ARGS_TOWIRE) {
+       REQUIRE(rdata->type == dns_rdatatype_atma);
+       REQUIRE(rdata->rdclass == dns_rdataclass_in);
+       REQUIRE(rdata->length != 0);
+
+       UNUSED(cctx);
+
+       return (mem_tobuffer(target, rdata->data, rdata->length));
+}
+
+static inline int
+compare_in_atma(ARGS_COMPARE) {
+       isc_region_t r1;
+       isc_region_t r2;
+
+       REQUIRE(rdata1->type == rdata2->type);
+       REQUIRE(rdata1->rdclass == rdata2->rdclass);
+       REQUIRE(rdata1->type == dns_rdatatype_atma);
+       REQUIRE(rdata1->rdclass == dns_rdataclass_in);
+       REQUIRE(rdata1->length != 0);
+       REQUIRE(rdata2->length != 0);
+
+       dns_rdata_toregion(rdata1, &r1);
+       dns_rdata_toregion(rdata2, &r2);
+       return (isc_region_compare(&r1, &r2));
+}
+
+static inline isc_result_t
+fromstruct_in_atma(ARGS_FROMSTRUCT) {
+       dns_rdata_in_atma_t *atma = source;
+
+       REQUIRE(type == dns_rdatatype_atma);
+       REQUIRE(rdclass == dns_rdataclass_in);
+       REQUIRE(source != NULL);
+       REQUIRE(atma->common.rdtype == type);
+       REQUIRE(atma->common.rdclass == rdclass);
+       REQUIRE(atma->atma != NULL || atma->atma_len == 0);
+
+       UNUSED(type);
+       UNUSED(rdclass);
+
+       RETERR(mem_tobuffer(target, &atma->format, 1));
+       return (mem_tobuffer(target, atma->atma, atma->atma_len));
+}
+
+static inline isc_result_t
+tostruct_in_atma(ARGS_TOSTRUCT) {
+       dns_rdata_in_atma_t *atma = target;
+       isc_region_t r;
+
+       REQUIRE(rdata->type == dns_rdatatype_atma);
+       REQUIRE(rdata->rdclass == dns_rdataclass_in);
+       REQUIRE(target != NULL);
+       REQUIRE(rdata->length != 0);
+
+       atma->common.rdclass = rdata->rdclass;
+       atma->common.rdtype = rdata->type;
+       ISC_LINK_INIT(&atma->common, link);
+
+       dns_rdata_toregion(rdata, &r);
+       atma->format = r.base[0];
+       isc_region_consume(&r, 1);
+       atma->atma_len = r.length;
+       atma->atma = mem_maybedup(mctx, r.base, r.length);
+       if (atma->atma == NULL) {
+               return (ISC_R_NOMEMORY);
+       }
+
+       atma->mctx = mctx;
+       return (ISC_R_SUCCESS);
+}
+
+static inline void
+freestruct_in_atma(ARGS_FREESTRUCT) {
+       dns_rdata_in_atma_t *atma = source;
+
+       REQUIRE(source != NULL);
+       REQUIRE(atma->common.rdclass == dns_rdataclass_in);
+       REQUIRE(atma->common.rdtype == dns_rdatatype_atma);
+
+       if (atma->mctx == NULL) {
+               return;
+       }
+
+       if (atma->atma != NULL) {
+               isc_mem_free(atma->mctx, atma->atma);
+       }
+       atma->mctx = NULL;
+}
+
+static inline isc_result_t
+additionaldata_in_atma(ARGS_ADDLDATA) {
+       REQUIRE(rdata->type == dns_rdatatype_atma);
+       REQUIRE(rdata->rdclass == dns_rdataclass_in);
+
+       UNUSED(rdata);
+       UNUSED(add);
+       UNUSED(arg);
+
+       return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+digest_in_atma(ARGS_DIGEST) {
+       isc_region_t r;
+
+       REQUIRE(rdata->type == dns_rdatatype_atma);
+       REQUIRE(rdata->rdclass == dns_rdataclass_in);
+
+       dns_rdata_toregion(rdata, &r);
+
+       return ((digest)(arg, &r));
+}
+
+static inline bool
+checkowner_in_atma(ARGS_CHECKOWNER) {
+
+       REQUIRE(type == dns_rdatatype_atma);
+       REQUIRE(rdclass == dns_rdataclass_in);
+
+       UNUSED(name);
+       UNUSED(type);
+       UNUSED(rdclass);
+       UNUSED(wildcard);
+
+       return (true);
+}
+
+static inline bool
+checknames_in_atma(ARGS_CHECKNAMES) {
+
+       REQUIRE(rdata->type == dns_rdatatype_atma);
+       REQUIRE(rdata->rdclass == dns_rdataclass_in);
+
+       UNUSED(rdata);
+       UNUSED(owner);
+       UNUSED(bad);
+
+       return (true);
+}
+
+static inline int
+casecompare_in_atma(ARGS_COMPARE) {
+       return (compare_in_atma(rdata1, rdata2));
+}
+
+#endif /* RDATA_IN_1_atma_22_C */
diff --git a/lib/dns/rdata/in_1/atma_34.h b/lib/dns/rdata/in_1/atma_34.h
new file mode 100644 (file)
index 0000000..80cd3be
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * See the COPYRIGHT file distributed with this work for additional
+ * information regarding copyright ownership.
+ */
+
+#ifndef IN_1_ATMA_22_H
+#define IN_1_ATMA_22_H 1
+
+
+/*!
+ *  \brief Per RFC1706 */
+
+typedef struct dns_rdata_in_atma {
+       dns_rdatacommon_t       common;
+       isc_mem_t               *mctx;
+       unsigned char           format;
+       unsigned char           *atma;
+       uint16_t                atma_len;
+} dns_rdata_in_atma_t;
+
+#endif /* IN_1_ATMA_22_H */
index 127836e9eb75b1537ac6c1ca4114c8d308e584ac..506a35f7c2d64a23bc15c0eea844f80e09858aaf 100644 (file)
@@ -346,6 +346,81 @@ check_rdata(const text_ok_t *text_ok, const wire_ok_t *wire_ok,
  ***** Individual unit tests
  *****/
 
+ATF_TC(atma);
+ATF_TC_HEAD(atma, tc) {
+       atf_tc_set_md_var(tc, "descr", "ATMA RDATA manipulations");
+}
+ATF_TC_BODY(atma, tc) {
+       text_ok_t text_ok[] = {
+               TEXT_VALID("00"),
+               TEXT_VALID_CHANGED("0.0", "00"),
+               /*
+                * multiple consecutive periods
+                */
+               TEXT_INVALID("0..0"),
+               /*
+                * trailing period
+                */
+               TEXT_INVALID("00."),
+               /*
+                * leading period
+                */
+               TEXT_INVALID(".00"),
+               /*
+                * Not full octets.
+                */
+               TEXT_INVALID("000"),
+               /*
+                * E.164
+                */
+               TEXT_VALID("+61200000000"),
+               /*
+                * E.164 with periods
+                */
+               TEXT_VALID_CHANGED("+61.2.0000.0000", "+61200000000"),
+               /*
+                * E.164 with period at end
+                */
+               TEXT_INVALID("+61200000000."),
+               /*
+                * E.164 with multiple consecutive periods
+                */
+               TEXT_INVALID("+612..00000000"),
+               /*
+                * E.164 with period before the leading digit.
+                */
+               TEXT_INVALID("+.61200000000"),
+               /*
+                * Sentinel.
+                */
+               TEXT_SENTINEL()
+       };
+       wire_ok_t wire_ok[] = {
+               /*
+                * Too short.
+                */
+               WIRE_INVALID(0x00),
+               WIRE_INVALID(0x01),
+               /*
+                * all digits
+                */
+               WIRE_VALID(0x01, '6', '1', '2', '0', '0', '0'),
+               /*
+                * non digit
+                */
+               WIRE_INVALID(0x01, '+', '6', '1', '2', '0', '0', '0'),
+               /*
+                * Sentinel.
+                */
+               WIRE_SENTINEL()
+       };
+
+       UNUSED(tc);
+
+       check_rdata(text_ok, wire_ok, false, dns_rdataclass_in,
+                   dns_rdatatype_atma, sizeof(dns_rdata_in_atma_t));
+}
+
 /*
  * CSYNC tests.
  *
@@ -1215,6 +1290,7 @@ ATF_TC_BODY(wks, tc) {
  *****/
 
 ATF_TP_ADD_TCS(tp) {
+       ATF_TP_ADD_TC(tp, atma);
        ATF_TP_ADD_TC(tp, csync);
        ATF_TP_ADD_TC(tp, doa);
        ATF_TP_ADD_TC(tp, edns_client_subnet);
index 0b1c9238212eb2bf8428a998d430b002e7d3cebf..3f122d59a76b3565646c6b8d69400a59608f7828 100644 (file)
 ./lib/dns/rdata/in_1/aaaa_28.h                 C       1999,2000,2001,2004,2005,2007,2016,2018
 ./lib/dns/rdata/in_1/apl_42.c                  C       2002,2004,2005,2007,2008,2009,2014,2015,2016,2018
 ./lib/dns/rdata/in_1/apl_42.h                  C       2002,2004,2005,2007,2016,2018
+./lib/dns/rdata/in_1/atma_34.c                 C       2018
+./lib/dns/rdata/in_1/atma_34.h                 C       2018
 ./lib/dns/rdata/in_1/dhcid_49.c                        C       2006,2007,2009,2011,2012,2015,2016,2017,2018
 ./lib/dns/rdata/in_1/dhcid_49.h                        C       2006,2007,2016,2018
 ./lib/dns/rdata/in_1/kx_36.c                   C       1999,2000,2001,2003,2004,2005,2007,2009,2015,2016,2017,2018