Commit 4f370bada5 for bind

commit 4f370bada51f340cd7a2a478853f98e2f3a4a6e9
Author: Alessio Podda <alessio@isc.org>
Date:   Tue Aug 25 03:32:06 2026 +0200

    Move RDATA wire serialization out of generated code

    Move the _towire functions to a single file, and replace the generated
    RDATA_TOWIRE switch with an hardcoded one. This will allow further
    refactoring down the road.

diff --git a/lib/dns/gen.c b/lib/dns/gen.c
index eb2ad120e4..88548e50cd 100644
--- a/lib/dns/gen.c
+++ b/lib/dns/gen.c
@@ -56,11 +56,6 @@
 #define FROMWIRETYPE  "type"
 #define FROMWIREDEF   "use_default = true"

-#define TOWIREARGS  "rdata, cctx, target"
-#define TOWIRECLASS "rdata->rdclass"
-#define TOWIRETYPE  "rdata->type"
-#define TOWIREDEF   "use_default = true"
-
 #define FROMSTRUCTARGS	"rdclass, type, source, target"
 #define FROMSTRUCTCLASS "rdclass"
 #define FROMSTRUCTTYPE	"type"
@@ -767,8 +762,6 @@ main(int argc, char **argv) {
 			 TOTEXTCLASS, TOTEXTDEF);
 		doswitch("FROMWIRESWITCH", "fromwire", FROMWIREARGS,
 			 FROMWIRETYPE, FROMWIRECLASS, FROMWIREDEF);
-		doswitch("TOWIRESWITCH", "towire", TOWIREARGS, TOWIRETYPE,
-			 TOWIRECLASS, TOWIREDEF);
 		doswitch("COMPARESWITCH", "compare", COMPAREARGS, COMPARETYPE,
 			 COMPARECLASS, COMPAREDEF);
 		doswitch("CASECOMPARESWITCH", "casecompare", COMPAREARGS,
diff --git a/lib/dns/meson.build b/lib/dns/meson.build
index 2e85ae277a..2248b0588a 100644
--- a/lib/dns/meson.build
+++ b/lib/dns/meson.build
@@ -78,6 +78,7 @@ dns_srcset.add(

 dns_srcset.add(
     files(
+        'rdata/towire.c',
         'zone/viewname.c',
         'acl.c',
         'adb.c',
diff --git a/lib/dns/rdata.c b/lib/dns/rdata.c
index 423a915f6f..498064795d 100644
--- a/lib/dns/rdata.c
+++ b/lib/dns/rdata.c
@@ -90,11 +90,6 @@

 #define CALL_FROMWIRE rdclass, type, source, dctx, target

-#define ARGS_TOWIRE \
-	dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target
-
-#define CALL_TOWIRE rdata, cctx, target
-
 #define ARGS_COMPARE const dns_rdata_t *rdata1, const dns_rdata_t *rdata2

 #define CALL_COMPARE rdata1, rdata2
@@ -297,7 +292,6 @@ static isc_result_t generic_tostruct_tlsa(ARGS_TOSTRUCT);
 static isc_result_t generic_fromtext_in_svcb(ARGS_FROMTEXT);
 static isc_result_t generic_totext_in_svcb(ARGS_TOTEXT);
 static isc_result_t generic_fromwire_in_svcb(ARGS_FROMWIRE);
-static isc_result_t generic_towire_in_svcb(ARGS_TOWIRE);
 static isc_result_t generic_fromstruct_in_svcb(ARGS_FROMSTRUCT);
 static isc_result_t generic_tostruct_in_svcb(ARGS_TOSTRUCT);
 static isc_result_t generic_additionaldata_in_svcb(ARGS_ADDLDATA);
@@ -979,45 +973,6 @@ dns_rdata_fromwire(dns_rdata_t *rdata, dns_rdataclass_t rdclass,
 	return result;
 }

-isc_result_t
-dns_rdata_towire(dns_rdata_t *rdata, dns_compress_t *cctx,
-		 isc_buffer_t *target) {
-	isc_result_t result = ISC_R_NOTIMPLEMENTED;
-	bool use_default = false;
-	isc_region_t tr;
-	isc_buffer_t st;
-
-	REQUIRE(rdata != NULL);
-	REQUIRE(DNS_RDATA_VALIDFLAGS(rdata));
-
-	/*
-	 * Some DynDNS meta-RRs have empty rdata.
-	 */
-	if ((rdata->flags & DNS_RDATA_UPDATE) != 0) {
-		INSIST(rdata->length == 0);
-		return ISC_R_SUCCESS;
-	}
-
-	st = *target;
-
-	TOWIRESWITCH
-
-	if (use_default) {
-		isc_buffer_availableregion(target, &tr);
-		if (tr.length < rdata->length) {
-			return ISC_R_NOSPACE;
-		}
-		memmove(tr.base, rdata->data, rdata->length);
-		isc_buffer_add(target, rdata->length);
-		return ISC_R_SUCCESS;
-	}
-	if (result != ISC_R_SUCCESS) {
-		*target = st;
-		dns_compress_rollback(cctx, target->used);
-	}
-	return result;
-}
-
 /*
  * If the binary data in 'src' is valid uncompressed wire format
  * rdata of class 'rdclass' and type 'type', return ISC_R_SUCCESS
diff --git a/lib/dns/rdata/any_255/tsig_250.c b/lib/dns/rdata/any_255/tsig_250.c
index 78cbd416d3..d45c4c8ee6 100644
--- a/lib/dns/rdata/any_255/tsig_250.c
+++ b/lib/dns/rdata/any_255/tsig_250.c
@@ -308,24 +308,6 @@ fromwire_any_tsig(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, n + 2);
 }

-static isc_result_t
-towire_any_tsig(ARGS_TOWIRE) {
-	isc_region_t sr;
-	dns_name_t name;
-
-	REQUIRE(rdata->type == dns_rdatatype_tsig);
-	REQUIRE(rdata->rdclass == dns_rdataclass_any);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	dns_rdata_toregion(rdata, &sr);
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &sr);
-	RETERR(dns_name_towire(&name, cctx, target));
-	isc_region_consume(&sr, name_length(&name));
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_any_tsig(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/ch_3/a_1.c b/lib/dns/rdata/ch_3/a_1.c
index a229ff347c..e233981d77 100644
--- a/lib/dns/rdata/ch_3/a_1.c
+++ b/lib/dns/rdata/ch_3/a_1.c
@@ -129,36 +129,6 @@ fromwire_ch_a(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_ch_a(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t sregion;
-	isc_region_t tregion;
-
-	REQUIRE(rdata->type == dns_rdatatype_a);
-	REQUIRE(rdata->rdclass == dns_rdataclass_ch);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, true);
-
-	dns_name_init(&name);
-
-	dns_rdata_toregion(rdata, &sregion);
-
-	dns_name_fromregion(&name, &sregion);
-	isc_region_consume(&sregion, name_length(&name));
-	RETERR(dns_name_towire(&name, cctx, target));
-
-	isc_buffer_availableregion(target, &tregion);
-	if (tregion.length < 2) {
-		return ISC_R_NOSPACE;
-	}
-
-	memmove(tregion.base, sregion.base, 2);
-	isc_buffer_add(target, 2);
-	return ISC_R_SUCCESS;
-}
-
 static int
 compare_ch_a(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/afsdb_18.c b/lib/dns/rdata/generic/afsdb_18.c
index e713eb6b5f..f76b5e9ec3 100644
--- a/lib/dns/rdata/generic/afsdb_18.c
+++ b/lib/dns/rdata/generic/afsdb_18.c
@@ -124,31 +124,6 @@ fromwire_afsdb(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_afsdb(ARGS_TOWIRE) {
-	isc_region_t tr;
-	isc_region_t sr;
-	dns_name_t name;
-
-	REQUIRE(rdata->type == dns_rdatatype_afsdb);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	isc_buffer_availableregion(target, &tr);
-	dns_rdata_toregion(rdata, &sr);
-	if (tr.length < 2) {
-		return ISC_R_NOSPACE;
-	}
-	memmove(tr.base, sr.base, 2);
-	isc_region_consume(&sr, 2);
-	isc_buffer_add(target, 2);
-
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &sr);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_afsdb(ARGS_COMPARE) {
 	int result;
diff --git a/lib/dns/rdata/generic/amtrelay_260.c b/lib/dns/rdata/generic/amtrelay_260.c
index 3a5f4aedce..603502ccee 100644
--- a/lib/dns/rdata/generic/amtrelay_260.c
+++ b/lib/dns/rdata/generic/amtrelay_260.c
@@ -230,19 +230,6 @@ fromwire_amtrelay(ARGS_FROMWIRE) {
 	}
 }

-static isc_result_t
-towire_amtrelay(ARGS_TOWIRE) {
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_amtrelay);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &region);
-	return mem_tobuffer(target, region.base, region.length);
-}
-
 static int
 compare_amtrelay(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/avc_258.c b/lib/dns/rdata/generic/avc_258.c
index 16c479d78a..19836be1b2 100644
--- a/lib/dns/rdata/generic/avc_258.c
+++ b/lib/dns/rdata/generic/avc_258.c
@@ -38,15 +38,6 @@ fromwire_avc(ARGS_FROMWIRE) {
 	return generic_fromwire_txt(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_avc(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_avc);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_avc(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/brid_68.c b/lib/dns/rdata/generic/brid_68.c
index dcfd651029..d1c5faae1c 100644
--- a/lib/dns/rdata/generic/brid_68.c
+++ b/lib/dns/rdata/generic/brid_68.c
@@ -79,16 +79,6 @@ fromwire_brid(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_brid(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_brid);
-	REQUIRE(rdata->length > 0);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_brid(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/caa_257.c b/lib/dns/rdata/generic/caa_257.c
index 5151b810b5..1ec6522659 100644
--- a/lib/dns/rdata/generic/caa_257.c
+++ b/lib/dns/rdata/generic/caa_257.c
@@ -411,20 +411,6 @@ fromwire_caa(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, sr.length);
 }

-static isc_result_t
-towire_caa(ARGS_TOWIRE) {
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_caa);
-	REQUIRE(rdata->length >= 3U);
-	REQUIRE(rdata->data != NULL);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &region);
-	return mem_tobuffer(target, region.base, region.length);
-}
-
 static int
 compare_caa(ARGS_COMPARE) {
 	isc_region_t r1, r2;
diff --git a/lib/dns/rdata/generic/cdnskey_60.c b/lib/dns/rdata/generic/cdnskey_60.c
index 38aabccdf6..099c770e20 100644
--- a/lib/dns/rdata/generic/cdnskey_60.c
+++ b/lib/dns/rdata/generic/cdnskey_60.c
@@ -42,19 +42,6 @@ fromwire_cdnskey(ARGS_FROMWIRE) {
 	return generic_fromwire_key(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_cdnskey(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_cdnskey);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_cdnskey(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/cds_59.c b/lib/dns/rdata/generic/cds_59.c
index da6381da37..eb5d88ca2e 100644
--- a/lib/dns/rdata/generic/cds_59.c
+++ b/lib/dns/rdata/generic/cds_59.c
@@ -42,19 +42,6 @@ fromwire_cds(ARGS_FROMWIRE) {
 	return generic_fromwire_ds(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_cds(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_cds);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_cds(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/cert_37.c b/lib/dns/rdata/generic/cert_37.c
index 8e14f6e0ec..236ceae2eb 100644
--- a/lib/dns/rdata/generic/cert_37.c
+++ b/lib/dns/rdata/generic/cert_37.c
@@ -134,19 +134,6 @@ fromwire_cert(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, sr.length);
 }

-static isc_result_t
-towire_cert(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_cert);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_cert(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/cname_5.c b/lib/dns/rdata/generic/cname_5.c
index 8f0a8dbcd8..f1e02c8a88 100644
--- a/lib/dns/rdata/generic/cname_5.c
+++ b/lib/dns/rdata/generic/cname_5.c
@@ -75,23 +75,6 @@ fromwire_cname(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_cname(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_cname);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, true);
-
-	dns_name_init(&name);
-	dns_rdata_toregion(rdata, &region);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_cname(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/csync_62.c b/lib/dns/rdata/generic/csync_62.c
index 68eee0feb3..771de600ee 100644
--- a/lib/dns/rdata/generic/csync_62.c
+++ b/lib/dns/rdata/generic/csync_62.c
@@ -110,16 +110,6 @@ fromwire_csync(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_csync(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_csync);
-	REQUIRE(rdata->length >= 6);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_csync(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/dlv_32769.c b/lib/dns/rdata/generic/dlv_32769.c
index a6b817267d..c5b92954fe 100644
--- a/lib/dns/rdata/generic/dlv_32769.c
+++ b/lib/dns/rdata/generic/dlv_32769.c
@@ -42,19 +42,6 @@ fromwire_dlv(ARGS_FROMWIRE) {
 	return generic_fromwire_ds(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_dlv(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_dlv);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_dlv(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/dname_39.c b/lib/dns/rdata/generic/dname_39.c
index 270e16f7ad..ffc73a3c84 100644
--- a/lib/dns/rdata/generic/dname_39.c
+++ b/lib/dns/rdata/generic/dname_39.c
@@ -76,22 +76,6 @@ fromwire_dname(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_dname(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_dname);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	dns_name_init(&name);
-	dns_rdata_toregion(rdata, &region);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_dname(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/dnskey_48.c b/lib/dns/rdata/generic/dnskey_48.c
index a32733eaaf..757f8e5992 100644
--- a/lib/dns/rdata/generic/dnskey_48.c
+++ b/lib/dns/rdata/generic/dnskey_48.c
@@ -42,20 +42,6 @@ fromwire_dnskey(ARGS_FROMWIRE) {
 	return generic_fromwire_key(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_dnskey(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata != NULL);
-	REQUIRE(rdata->type == dns_rdatatype_dnskey);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_dnskey(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/doa_259.c b/lib/dns/rdata/generic/doa_259.c
index 017202ec0a..ed4f81f36c 100644
--- a/lib/dns/rdata/generic/doa_259.c
+++ b/lib/dns/rdata/generic/doa_259.c
@@ -155,20 +155,6 @@ fromwire_doa(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, region.base, region.length);
 }

-static isc_result_t
-towire_doa(ARGS_TOWIRE) {
-	isc_region_t region;
-
-	UNUSED(cctx);
-
-	REQUIRE(rdata != NULL);
-	REQUIRE(rdata->type == dns_rdatatype_doa);
-	REQUIRE(rdata->length != 0);
-
-	dns_rdata_toregion(rdata, &region);
-	return mem_tobuffer(target, region.base, region.length);
-}
-
 static int
 compare_doa(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/ds_43.c b/lib/dns/rdata/generic/ds_43.c
index 9c636278b9..7f79198b71 100644
--- a/lib/dns/rdata/generic/ds_43.c
+++ b/lib/dns/rdata/generic/ds_43.c
@@ -204,19 +204,6 @@ fromwire_ds(ARGS_FROMWIRE) {
 	return generic_fromwire_ds(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_ds(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_ds);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_ds(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/dsync_66.c b/lib/dns/rdata/generic/dsync_66.c
index 7158574c0a..7be856fc18 100644
--- a/lib/dns/rdata/generic/dsync_66.c
+++ b/lib/dns/rdata/generic/dsync_66.c
@@ -181,26 +181,6 @@ fromwire_dsync(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_dsync(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_dsync);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-
-	dns_rdata_toregion(rdata, &region);
-	RETERR(mem_tobuffer(target, region.base, 5));
-	isc_region_consume(&region, 5);
-
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_dsync(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/eui48_108.c b/lib/dns/rdata/generic/eui48_108.c
index 2755dd8935..28ca4dac80 100644
--- a/lib/dns/rdata/generic/eui48_108.c
+++ b/lib/dns/rdata/generic/eui48_108.c
@@ -96,16 +96,6 @@ fromwire_eui48(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sregion.base, sregion.length);
 }

-static isc_result_t
-towire_eui48(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_eui48);
-	REQUIRE(rdata->length == 6);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_eui48(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/eui64_109.c b/lib/dns/rdata/generic/eui64_109.c
index 816b82dffa..34ac52d5e8 100644
--- a/lib/dns/rdata/generic/eui64_109.c
+++ b/lib/dns/rdata/generic/eui64_109.c
@@ -100,16 +100,6 @@ fromwire_eui64(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sregion.base, sregion.length);
 }

-static isc_result_t
-towire_eui64(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_eui64);
-	REQUIRE(rdata->length == 8);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_eui64(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/gpos_27.c b/lib/dns/rdata/generic/gpos_27.c
index a3cdaaca94..a6f387e8e8 100644
--- a/lib/dns/rdata/generic/gpos_27.c
+++ b/lib/dns/rdata/generic/gpos_27.c
@@ -77,16 +77,6 @@ fromwire_gpos(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_gpos(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_gpos);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_gpos(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/hhit_67.c b/lib/dns/rdata/generic/hhit_67.c
index e2209d7a68..f8f1b72163 100644
--- a/lib/dns/rdata/generic/hhit_67.c
+++ b/lib/dns/rdata/generic/hhit_67.c
@@ -79,16 +79,6 @@ fromwire_hhit(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_hhit(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_hhit);
-	REQUIRE(rdata->length > 0);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_hhit(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/hinfo_13.c b/lib/dns/rdata/generic/hinfo_13.c
index 7738c67184..aa971c805a 100644
--- a/lib/dns/rdata/generic/hinfo_13.c
+++ b/lib/dns/rdata/generic/hinfo_13.c
@@ -63,16 +63,6 @@ fromwire_hinfo(ARGS_FROMWIRE) {
 	return txt_fromwire(source, target);
 }

-static isc_result_t
-towire_hinfo(ARGS_TOWIRE) {
-	UNUSED(cctx);
-
-	REQUIRE(rdata->type == dns_rdatatype_hinfo);
-	REQUIRE(rdata->length != 0);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_hinfo(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/hip_55.c b/lib/dns/rdata/generic/hip_55.c
index 8d71476cdd..71f3b40790 100644
--- a/lib/dns/rdata/generic/hip_55.c
+++ b/lib/dns/rdata/generic/hip_55.c
@@ -231,19 +231,6 @@ fromwire_hip(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_hip(ARGS_TOWIRE) {
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_hip);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &region);
-	return mem_tobuffer(target, region.base, region.length);
-}
-
 static int
 compare_hip(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/ipseckey_45.c b/lib/dns/rdata/generic/ipseckey_45.c
index aa92309e52..2746df444e 100644
--- a/lib/dns/rdata/generic/ipseckey_45.c
+++ b/lib/dns/rdata/generic/ipseckey_45.c
@@ -265,19 +265,6 @@ fromwire_ipseckey(ARGS_FROMWIRE) {
 	}
 }

-static isc_result_t
-towire_ipseckey(ARGS_TOWIRE) {
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_ipseckey);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &region);
-	return mem_tobuffer(target, region.base, region.length);
-}
-
 static int
 compare_ipseckey(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/isdn_20.c b/lib/dns/rdata/generic/isdn_20.c
index 2675837753..fbf20e0b6e 100644
--- a/lib/dns/rdata/generic/isdn_20.c
+++ b/lib/dns/rdata/generic/isdn_20.c
@@ -81,16 +81,6 @@ fromwire_isdn(ARGS_FROMWIRE) {
 	return txt_fromwire(source, target);
 }

-static isc_result_t
-towire_isdn(ARGS_TOWIRE) {
-	UNUSED(cctx);
-
-	REQUIRE(rdata->type == dns_rdatatype_isdn);
-	REQUIRE(rdata->length != 0);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_isdn(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/key_25.c b/lib/dns/rdata/generic/key_25.c
index 3d8fd3908c..0f791bdbb1 100644
--- a/lib/dns/rdata/generic/key_25.c
+++ b/lib/dns/rdata/generic/key_25.c
@@ -253,20 +253,6 @@ fromwire_key(ARGS_FROMWIRE) {
 	return generic_fromwire_key(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_key(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata != NULL);
-	REQUIRE(rdata->type == dns_rdatatype_key);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_key(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/keydata_65533.c b/lib/dns/rdata/generic/keydata_65533.c
index e9b60525d5..235c4a9602 100644
--- a/lib/dns/rdata/generic/keydata_65533.c
+++ b/lib/dns/rdata/generic/keydata_65533.c
@@ -262,18 +262,6 @@ fromwire_keydata(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, sr.length);
 }

-static isc_result_t
-towire_keydata(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_keydata);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_keydata(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/l32_105.c b/lib/dns/rdata/generic/l32_105.c
index a711c6170a..d522875bac 100644
--- a/lib/dns/rdata/generic/l32_105.c
+++ b/lib/dns/rdata/generic/l32_105.c
@@ -96,16 +96,6 @@ fromwire_l32(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sregion.base, sregion.length);
 }

-static isc_result_t
-towire_l32(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_l32);
-	REQUIRE(rdata->length == 6);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_l32(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/l64_106.c b/lib/dns/rdata/generic/l64_106.c
index 92aebba585..b5fa2a6122 100644
--- a/lib/dns/rdata/generic/l64_106.c
+++ b/lib/dns/rdata/generic/l64_106.c
@@ -94,16 +94,6 @@ fromwire_l64(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sregion.base, sregion.length);
 }

-static isc_result_t
-towire_l64(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_l64);
-	REQUIRE(rdata->length == 10);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_l64(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/loc_29.c b/lib/dns/rdata/generic/loc_29.c
index acf3667a43..7f6454a8bd 100644
--- a/lib/dns/rdata/generic/loc_29.c
+++ b/lib/dns/rdata/generic/loc_29.c
@@ -657,16 +657,6 @@ fromwire_loc(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, 16);
 }

-static isc_result_t
-towire_loc(ARGS_TOWIRE) {
-	UNUSED(cctx);
-
-	REQUIRE(rdata->type == dns_rdatatype_loc);
-	REQUIRE(rdata->length != 0);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_loc(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/lp_107.c b/lib/dns/rdata/generic/lp_107.c
index 75fd8d3854..dc5cd8ae43 100644
--- a/lib/dns/rdata/generic/lp_107.c
+++ b/lib/dns/rdata/generic/lp_107.c
@@ -98,16 +98,6 @@ fromwire_lp(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_lp(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_lp);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_lp(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/mb_7.c b/lib/dns/rdata/generic/mb_7.c
index 2e0e64e626..6ff4925b2f 100644
--- a/lib/dns/rdata/generic/mb_7.c
+++ b/lib/dns/rdata/generic/mb_7.c
@@ -74,23 +74,6 @@ fromwire_mb(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_mb(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_mb);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, true);
-
-	dns_name_init(&name);
-	dns_rdata_toregion(rdata, &region);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_mb(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/md_3.c b/lib/dns/rdata/generic/md_3.c
index 265bbd19bb..f04545a836 100644
--- a/lib/dns/rdata/generic/md_3.c
+++ b/lib/dns/rdata/generic/md_3.c
@@ -74,23 +74,6 @@ fromwire_md(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_md(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_md);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, true);
-
-	dns_name_init(&name);
-	dns_rdata_toregion(rdata, &region);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_md(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/mf_4.c b/lib/dns/rdata/generic/mf_4.c
index d481f68d22..831c2dafe1 100644
--- a/lib/dns/rdata/generic/mf_4.c
+++ b/lib/dns/rdata/generic/mf_4.c
@@ -74,23 +74,6 @@ fromwire_mf(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_mf(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_mf);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, true);
-
-	dns_name_init(&name);
-	dns_rdata_toregion(rdata, &region);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_mf(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/mg_8.c b/lib/dns/rdata/generic/mg_8.c
index f4b4ff8997..a64cd7aa95 100644
--- a/lib/dns/rdata/generic/mg_8.c
+++ b/lib/dns/rdata/generic/mg_8.c
@@ -74,23 +74,6 @@ fromwire_mg(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_mg(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_mg);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, true);
-
-	dns_name_init(&name);
-	dns_rdata_toregion(rdata, &region);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_mg(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/minfo_14.c b/lib/dns/rdata/generic/minfo_14.c
index eb17f0fd32..dd10df9488 100644
--- a/lib/dns/rdata/generic/minfo_14.c
+++ b/lib/dns/rdata/generic/minfo_14.c
@@ -110,33 +110,6 @@ fromwire_minfo(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&email, source, dctx, target);
 }

-static isc_result_t
-towire_minfo(ARGS_TOWIRE) {
-	isc_region_t region;
-	dns_name_t rmail;
-	dns_name_t email;
-
-	REQUIRE(rdata->type == dns_rdatatype_minfo);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, true);
-
-	dns_name_init(&rmail);
-	dns_name_init(&email);
-
-	dns_rdata_toregion(rdata, &region);
-
-	dns_name_fromregion(&rmail, &region);
-	isc_region_consume(&region, name_length(&rmail));
-
-	RETERR(dns_name_towire(&rmail, cctx, target));
-
-	dns_name_fromregion(&rmail, &region);
-	isc_region_consume(&region, rmail.length);
-
-	return dns_name_towire(&rmail, cctx, target);
-}
-
 static int
 compare_minfo(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/mr_9.c b/lib/dns/rdata/generic/mr_9.c
index a48bbaac29..95a70075e7 100644
--- a/lib/dns/rdata/generic/mr_9.c
+++ b/lib/dns/rdata/generic/mr_9.c
@@ -74,23 +74,6 @@ fromwire_mr(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_mr(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_mr);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, true);
-
-	dns_name_init(&name);
-	dns_rdata_toregion(rdata, &region);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_mr(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/mx_15.c b/lib/dns/rdata/generic/mx_15.c
index 2a7b069b25..4a46070545 100644
--- a/lib/dns/rdata/generic/mx_15.c
+++ b/lib/dns/rdata/generic/mx_15.c
@@ -149,26 +149,6 @@ fromwire_mx(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_mx(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_mx);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, true);
-
-	dns_rdata_toregion(rdata, &region);
-	RETERR(mem_tobuffer(target, region.base, 2));
-	isc_region_consume(&region, 2);
-
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_mx(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/naptr_35.c b/lib/dns/rdata/generic/naptr_35.c
index 914ed1906c..fce21632b6 100644
--- a/lib/dns/rdata/generic/naptr_35.c
+++ b/lib/dns/rdata/generic/naptr_35.c
@@ -351,48 +351,6 @@ fromwire_naptr(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_naptr(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_naptr);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	/*
-	 * Order, preference.
-	 */
-	dns_rdata_toregion(rdata, &sr);
-	RETERR(mem_tobuffer(target, sr.base, 4));
-	isc_region_consume(&sr, 4);
-
-	/*
-	 * Flags.
-	 */
-	RETERR(mem_tobuffer(target, sr.base, sr.base[0] + 1));
-	isc_region_consume(&sr, sr.base[0] + 1);
-
-	/*
-	 * Service.
-	 */
-	RETERR(mem_tobuffer(target, sr.base, sr.base[0] + 1));
-	isc_region_consume(&sr, sr.base[0] + 1);
-
-	/*
-	 * Regexp.
-	 */
-	RETERR(mem_tobuffer(target, sr.base, sr.base[0] + 1));
-	isc_region_consume(&sr, sr.base[0] + 1);
-
-	/*
-	 * Replacement.
-	 */
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &sr);
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_naptr(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/nid_104.c b/lib/dns/rdata/generic/nid_104.c
index 8d261712e3..c26b39ba9f 100644
--- a/lib/dns/rdata/generic/nid_104.c
+++ b/lib/dns/rdata/generic/nid_104.c
@@ -94,16 +94,6 @@ fromwire_nid(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sregion.base, sregion.length);
 }

-static isc_result_t
-towire_nid(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_nid);
-	REQUIRE(rdata->length == 10);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_nid(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/ninfo_56.c b/lib/dns/rdata/generic/ninfo_56.c
index 4261796882..d0b199a715 100644
--- a/lib/dns/rdata/generic/ninfo_56.c
+++ b/lib/dns/rdata/generic/ninfo_56.c
@@ -38,15 +38,6 @@ fromwire_ninfo(ARGS_FROMWIRE) {
 	return generic_fromwire_txt(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_ninfo(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_ninfo);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_ninfo(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/ns_2.c b/lib/dns/rdata/generic/ns_2.c
index f4aa667927..b7785f98a8 100644
--- a/lib/dns/rdata/generic/ns_2.c
+++ b/lib/dns/rdata/generic/ns_2.c
@@ -88,23 +88,6 @@ fromwire_ns(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_ns(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_ns);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, true);
-
-	dns_name_init(&name);
-	dns_rdata_toregion(rdata, &region);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_ns(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/nsec3_50.c b/lib/dns/rdata/generic/nsec3_50.c
index e85de115fb..32592f3156 100644
--- a/lib/dns/rdata/generic/nsec3_50.c
+++ b/lib/dns/rdata/generic/nsec3_50.c
@@ -248,19 +248,6 @@ fromwire_nsec3(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_nsec3(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_nsec3);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_nsec3(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/nsec3param_51.c b/lib/dns/rdata/generic/nsec3param_51.c
index 978d43ef61..d4fc565fce 100644
--- a/lib/dns/rdata/generic/nsec3param_51.c
+++ b/lib/dns/rdata/generic/nsec3param_51.c
@@ -170,19 +170,6 @@ fromwire_nsec3param(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_nsec3param(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_nsec3param);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_nsec3param(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/nsec_47.c b/lib/dns/rdata/generic/nsec_47.c
index ed20fa7773..5838828ddc 100644
--- a/lib/dns/rdata/generic/nsec_47.c
+++ b/lib/dns/rdata/generic/nsec_47.c
@@ -95,24 +95,6 @@ fromwire_nsec(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_nsec(ARGS_TOWIRE) {
-	isc_region_t sr;
-	dns_name_t name;
-
-	REQUIRE(rdata->type == dns_rdatatype_nsec);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	dns_name_init(&name);
-	dns_rdata_toregion(rdata, &sr);
-	dns_name_fromregion(&name, &sr);
-	isc_region_consume(&sr, name_length(&name));
-	RETERR(dns_name_towire(&name, cctx, target));
-
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_nsec(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/null_10.c b/lib/dns/rdata/generic/null_10.c
index 10bdf4a951..98804e896c 100644
--- a/lib/dns/rdata/generic/null_10.c
+++ b/lib/dns/rdata/generic/null_10.c
@@ -53,15 +53,6 @@ fromwire_null(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, sr.length);
 }

-static isc_result_t
-towire_null(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_null);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_null(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/nxt_30.c b/lib/dns/rdata/generic/nxt_30.c
index 7c2d1d9ed2..059bf14018 100644
--- a/lib/dns/rdata/generic/nxt_30.c
+++ b/lib/dns/rdata/generic/nxt_30.c
@@ -162,24 +162,6 @@ fromwire_nxt(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_nxt(ARGS_TOWIRE) {
-	isc_region_t sr;
-	dns_name_t name;
-
-	REQUIRE(rdata->type == dns_rdatatype_nxt);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	dns_name_init(&name);
-	dns_rdata_toregion(rdata, &sr);
-	dns_name_fromregion(&name, &sr);
-	isc_region_consume(&sr, name_length(&name));
-	RETERR(dns_name_towire(&name, cctx, target));
-
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_nxt(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/openpgpkey_61.c b/lib/dns/rdata/generic/openpgpkey_61.c
index 359d54f6bf..01ed049b27 100644
--- a/lib/dns/rdata/generic/openpgpkey_61.c
+++ b/lib/dns/rdata/generic/openpgpkey_61.c
@@ -87,19 +87,6 @@ fromwire_openpgpkey(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, sr.length);
 }

-static isc_result_t
-towire_openpgpkey(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_openpgpkey);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_openpgpkey(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/opt_41.c b/lib/dns/rdata/generic/opt_41.c
index 71f223e370..619cf588c8 100644
--- a/lib/dns/rdata/generic/opt_41.c
+++ b/lib/dns/rdata/generic/opt_41.c
@@ -301,15 +301,6 @@ fromwire_opt(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_opt(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_opt);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_opt(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/ptr_12.c b/lib/dns/rdata/generic/ptr_12.c
index 0687f578d4..de3d13e641 100644
--- a/lib/dns/rdata/generic/ptr_12.c
+++ b/lib/dns/rdata/generic/ptr_12.c
@@ -92,23 +92,6 @@ fromwire_ptr(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_ptr(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_ptr);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, true);
-
-	dns_name_init(&name);
-	dns_rdata_toregion(rdata, &region);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_ptr(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/resinfo_261.c b/lib/dns/rdata/generic/resinfo_261.c
index 23ce4e8d54..67e7f0b1d4 100644
--- a/lib/dns/rdata/generic/resinfo_261.c
+++ b/lib/dns/rdata/generic/resinfo_261.c
@@ -38,15 +38,6 @@ fromwire_resinfo(ARGS_FROMWIRE) {
 	return generic_fromwire_txt(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_resinfo(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_resinfo);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_resinfo(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/rkey_57.c b/lib/dns/rdata/generic/rkey_57.c
index 6b98aed70b..b001bee660 100644
--- a/lib/dns/rdata/generic/rkey_57.c
+++ b/lib/dns/rdata/generic/rkey_57.c
@@ -38,20 +38,6 @@ fromwire_rkey(ARGS_FROMWIRE) {
 	return generic_fromwire_key(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_rkey(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata != NULL);
-	REQUIRE(rdata->type == dns_rdatatype_rkey);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_rkey(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/rp_17.c b/lib/dns/rdata/generic/rp_17.c
index ab3c3e725d..3c735e307f 100644
--- a/lib/dns/rdata/generic/rp_17.c
+++ b/lib/dns/rdata/generic/rp_17.c
@@ -119,32 +119,6 @@ fromwire_rp(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&email, source, dctx, target);
 }

-static isc_result_t
-towire_rp(ARGS_TOWIRE) {
-	isc_region_t region;
-	dns_name_t rmail;
-	dns_name_t email;
-
-	REQUIRE(rdata->type == dns_rdatatype_rp);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	dns_name_init(&rmail);
-	dns_name_init(&email);
-
-	dns_rdata_toregion(rdata, &region);
-
-	dns_name_fromregion(&rmail, &region);
-	isc_region_consume(&region, rmail.length);
-
-	RETERR(dns_name_towire(&rmail, cctx, target));
-
-	dns_name_fromregion(&rmail, &region);
-	isc_region_consume(&region, rmail.length);
-
-	return dns_name_towire(&rmail, cctx, target);
-}
-
 static int
 compare_rp(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/rrsig_46.c b/lib/dns/rdata/generic/rrsig_46.c
index 3540dbdc30..fb40e5910f 100644
--- a/lib/dns/rdata/generic/rrsig_46.c
+++ b/lib/dns/rdata/generic/rrsig_46.c
@@ -339,42 +339,6 @@ fromwire_rrsig(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, sr.length);
 }

-static isc_result_t
-towire_rrsig(ARGS_TOWIRE) {
-	isc_region_t sr;
-	dns_name_t name;
-
-	REQUIRE(rdata->type == dns_rdatatype_rrsig);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	dns_rdata_toregion(rdata, &sr);
-	/*
-	 * type covered: 2
-	 * algorithm: 1
-	 * labels: 1
-	 * original ttl: 4
-	 * signature expiration: 4
-	 * time signed: 4
-	 * key footprint: 2
-	 */
-	RETERR(mem_tobuffer(target, sr.base, 18));
-	isc_region_consume(&sr, 18);
-
-	/*
-	 * Signer.
-	 */
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &sr);
-	isc_region_consume(&sr, name_length(&name));
-	RETERR(dns_name_towire(&name, cctx, target));
-
-	/*
-	 * Signature.
-	 */
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_rrsig(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/rt_21.c b/lib/dns/rdata/generic/rt_21.c
index 735399866f..a3849c7487 100644
--- a/lib/dns/rdata/generic/rt_21.c
+++ b/lib/dns/rdata/generic/rt_21.c
@@ -123,31 +123,6 @@ fromwire_rt(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_rt(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-	isc_region_t tr;
-
-	REQUIRE(rdata->type == dns_rdatatype_rt);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	isc_buffer_availableregion(target, &tr);
-	dns_rdata_toregion(rdata, &region);
-	if (tr.length < 2) {
-		return ISC_R_NOSPACE;
-	}
-	memmove(tr.base, region.base, 2);
-	isc_region_consume(&region, 2);
-	isc_buffer_add(target, 2);
-
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_rt(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/generic/sig_24.c b/lib/dns/rdata/generic/sig_24.c
index 9dd8d3a4ba..73f5bb673b 100644
--- a/lib/dns/rdata/generic/sig_24.c
+++ b/lib/dns/rdata/generic/sig_24.c
@@ -306,42 +306,6 @@ fromwire_sig(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, sr.length);
 }

-static isc_result_t
-towire_sig(ARGS_TOWIRE) {
-	isc_region_t sr;
-	dns_name_t name;
-
-	REQUIRE(rdata->type == dns_rdatatype_sig);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	dns_rdata_toregion(rdata, &sr);
-	/*
-	 * type covered: 2
-	 * algorithm: 1
-	 * labels: 1
-	 * original ttl: 4
-	 * signature expiration: 4
-	 * time signed: 4
-	 * key footprint: 2
-	 */
-	RETERR(mem_tobuffer(target, sr.base, 18));
-	isc_region_consume(&sr, 18);
-
-	/*
-	 * Signer.
-	 */
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &sr);
-	isc_region_consume(&sr, name_length(&name));
-	RETERR(dns_name_towire(&name, cctx, target));
-
-	/*
-	 * Signature.
-	 */
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_sig(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/sink_40.c b/lib/dns/rdata/generic/sink_40.c
index 0072e29415..9b2f042cb3 100644
--- a/lib/dns/rdata/generic/sink_40.c
+++ b/lib/dns/rdata/generic/sink_40.c
@@ -123,16 +123,6 @@ fromwire_sink(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_sink(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_sink);
-	REQUIRE(rdata->length >= 3);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_sink(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/smimea_53.c b/lib/dns/rdata/generic/smimea_53.c
index c45e3a7858..91fd72ff37 100644
--- a/lib/dns/rdata/generic/smimea_53.c
+++ b/lib/dns/rdata/generic/smimea_53.c
@@ -38,19 +38,6 @@ fromwire_smimea(ARGS_FROMWIRE) {
 	return generic_fromwire_tlsa(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_smimea(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_smimea);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_smimea(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/soa_6.c b/lib/dns/rdata/generic/soa_6.c
index 574495b6f5..b80940d8ab 100644
--- a/lib/dns/rdata/generic/soa_6.c
+++ b/lib/dns/rdata/generic/soa_6.c
@@ -195,41 +195,6 @@ fromwire_soa(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_soa(ARGS_TOWIRE) {
-	isc_region_t sregion;
-	isc_region_t tregion;
-	dns_name_t mname;
-	dns_name_t rname;
-
-	REQUIRE(rdata->type == dns_rdatatype_soa);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, true);
-
-	dns_name_init(&mname);
-	dns_name_init(&rname);
-
-	dns_rdata_toregion(rdata, &sregion);
-
-	dns_name_fromregion(&mname, &sregion);
-	isc_region_consume(&sregion, name_length(&mname));
-	RETERR(dns_name_towire(&mname, cctx, target));
-
-	dns_name_fromregion(&rname, &sregion);
-	isc_region_consume(&sregion, name_length(&rname));
-	RETERR(dns_name_towire(&rname, cctx, target));
-
-	isc_buffer_availableregion(target, &tregion);
-	if (tregion.length < 20) {
-		return ISC_R_NOSPACE;
-	}
-
-	memmove(tregion.base, sregion.base, 20);
-	isc_buffer_add(target, 20);
-	return ISC_R_SUCCESS;
-}
-
 static int
 compare_soa(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/spf_99.c b/lib/dns/rdata/generic/spf_99.c
index 59c315d5b6..09af592086 100644
--- a/lib/dns/rdata/generic/spf_99.c
+++ b/lib/dns/rdata/generic/spf_99.c
@@ -38,15 +38,6 @@ fromwire_spf(ARGS_FROMWIRE) {
 	return generic_fromwire_txt(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_spf(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_spf);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_spf(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/sshfp_44.c b/lib/dns/rdata/generic/sshfp_44.c
index 68d2f66936..c947ce231a 100644
--- a/lib/dns/rdata/generic/sshfp_44.c
+++ b/lib/dns/rdata/generic/sshfp_44.c
@@ -148,19 +148,6 @@ fromwire_sshfp(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, sr.length);
 }

-static isc_result_t
-towire_sshfp(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_sshfp);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_sshfp(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/ta_32768.c b/lib/dns/rdata/generic/ta_32768.c
index 121a036273..8274db710e 100644
--- a/lib/dns/rdata/generic/ta_32768.c
+++ b/lib/dns/rdata/generic/ta_32768.c
@@ -39,19 +39,6 @@ fromwire_ta(ARGS_FROMWIRE) {
 	return generic_fromwire_ds(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_ta(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_ta);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_ta(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/talink_58.c b/lib/dns/rdata/generic/talink_58.c
index c1f395210b..44ce3e7f87 100644
--- a/lib/dns/rdata/generic/talink_58.c
+++ b/lib/dns/rdata/generic/talink_58.c
@@ -96,31 +96,6 @@ fromwire_talink(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&next, source, dctx, target);
 }

-static isc_result_t
-towire_talink(ARGS_TOWIRE) {
-	isc_region_t sregion;
-	dns_name_t prev;
-	dns_name_t next;
-
-	REQUIRE(rdata->type == dns_rdatatype_talink);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-
-	dns_name_init(&prev);
-	dns_name_init(&next);
-
-	dns_rdata_toregion(rdata, &sregion);
-
-	dns_name_fromregion(&prev, &sregion);
-	isc_region_consume(&sregion, name_length(&prev));
-	RETERR(dns_name_towire(&prev, cctx, target));
-
-	dns_name_fromregion(&next, &sregion);
-	isc_region_consume(&sregion, name_length(&next));
-	return dns_name_towire(&next, cctx, target);
-}
-
 static int
 compare_talink(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/generic/tkey_249.c b/lib/dns/rdata/generic/tkey_249.c
index fe55be05a8..a76b8b0667 100644
--- a/lib/dns/rdata/generic/tkey_249.c
+++ b/lib/dns/rdata/generic/tkey_249.c
@@ -294,27 +294,6 @@ fromwire_tkey(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, n + 2);
 }

-static isc_result_t
-towire_tkey(ARGS_TOWIRE) {
-	isc_region_t sr;
-	dns_name_t name;
-
-	REQUIRE(rdata->type == dns_rdatatype_tkey);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	/*
-	 * Algorithm.
-	 */
-	dns_rdata_toregion(rdata, &sr);
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &sr);
-	RETERR(dns_name_towire(&name, cctx, target));
-	isc_region_consume(&sr, name_length(&name));
-
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_tkey(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/tlsa_52.c b/lib/dns/rdata/generic/tlsa_52.c
index e6644e9009..07c1b734b8 100644
--- a/lib/dns/rdata/generic/tlsa_52.c
+++ b/lib/dns/rdata/generic/tlsa_52.c
@@ -159,19 +159,6 @@ fromwire_tlsa(ARGS_FROMWIRE) {
 	return generic_fromwire_tlsa(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_tlsa(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_tlsa);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_tlsa(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/txt_16.c b/lib/dns/rdata/generic/txt_16.c
index 622db8beb4..18a2888f05 100644
--- a/lib/dns/rdata/generic/txt_16.c
+++ b/lib/dns/rdata/generic/txt_16.c
@@ -103,15 +103,6 @@ fromwire_txt(ARGS_FROMWIRE) {
 	return generic_fromwire_txt(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_txt(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_txt);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_txt(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/uri_256.c b/lib/dns/rdata/generic/uri_256.c
index 659c68bfe7..4aa55107ba 100644
--- a/lib/dns/rdata/generic/uri_256.c
+++ b/lib/dns/rdata/generic/uri_256.c
@@ -119,19 +119,6 @@ fromwire_uri(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, region.base, region.length);
 }

-static isc_result_t
-towire_uri(ARGS_TOWIRE) {
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_uri);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &region);
-	return mem_tobuffer(target, region.base, region.length);
-}
-
 static int
 compare_uri(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/wallet_262.c b/lib/dns/rdata/generic/wallet_262.c
index c0ad0ab6ae..ee0c33da55 100644
--- a/lib/dns/rdata/generic/wallet_262.c
+++ b/lib/dns/rdata/generic/wallet_262.c
@@ -38,15 +38,6 @@ fromwire_wallet(ARGS_FROMWIRE) {
 	return generic_fromwire_txt(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_wallet(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_wallet);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_wallet(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/x25_19.c b/lib/dns/rdata/generic/x25_19.c
index 3d77d77b78..1a3a60e38c 100644
--- a/lib/dns/rdata/generic/x25_19.c
+++ b/lib/dns/rdata/generic/x25_19.c
@@ -82,16 +82,6 @@ fromwire_x25(ARGS_FROMWIRE) {
 	return txt_fromwire(source, target);
 }

-static isc_result_t
-towire_x25(ARGS_TOWIRE) {
-	UNUSED(cctx);
-
-	REQUIRE(rdata->type == dns_rdatatype_x25);
-	REQUIRE(rdata->length != 0);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_x25(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/generic/zonemd_63.c b/lib/dns/rdata/generic/zonemd_63.c
index f8703ffcc3..820ad964b8 100644
--- a/lib/dns/rdata/generic/zonemd_63.c
+++ b/lib/dns/rdata/generic/zonemd_63.c
@@ -191,19 +191,6 @@ fromwire_zonemd(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, sr.length);
 }

-static isc_result_t
-towire_zonemd(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_zonemd);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_zonemd(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/hs_4/a_1.c b/lib/dns/rdata/hs_4/a_1.c
index 6cd60eb75f..769f0f459a 100644
--- a/lib/dns/rdata/hs_4/a_1.c
+++ b/lib/dns/rdata/hs_4/a_1.c
@@ -88,25 +88,6 @@ fromwire_hs_a(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_hs_a(ARGS_TOWIRE) {
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_a);
-	REQUIRE(rdata->rdclass == dns_rdataclass_hs);
-	REQUIRE(rdata->length == 4);
-
-	UNUSED(cctx);
-
-	isc_buffer_availableregion(target, &region);
-	if (region.length < rdata->length) {
-		return ISC_R_NOSPACE;
-	}
-	memmove(region.base, rdata->data, rdata->length);
-	isc_buffer_add(target, 4);
-	return ISC_R_SUCCESS;
-}
-
 static int
 compare_hs_a(ARGS_COMPARE) {
 	int order;
diff --git a/lib/dns/rdata/in_1/a6_38.c b/lib/dns/rdata/in_1/a6_38.c
index 05a9e7eba2..5acf4047b5 100644
--- a/lib/dns/rdata/in_1/a6_38.c
+++ b/lib/dns/rdata/in_1/a6_38.c
@@ -203,35 +203,6 @@ fromwire_in_a6(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_in_a6(ARGS_TOWIRE) {
-	isc_region_t sr;
-	dns_name_t name;
-	unsigned char prefixlen;
-	unsigned char octets;
-
-	REQUIRE(rdata->type == dns_rdatatype_a6);
-	REQUIRE(rdata->rdclass == dns_rdataclass_in);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	dns_rdata_toregion(rdata, &sr);
-	prefixlen = sr.base[0];
-	INSIST(prefixlen <= 128);
-
-	octets = 1 + 16 - prefixlen / 8;
-	RETERR(mem_tobuffer(target, sr.base, octets));
-	isc_region_consume(&sr, octets);
-
-	if (prefixlen == 0) {
-		return ISC_R_SUCCESS;
-	}
-
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &sr);
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_in_a6(ARGS_COMPARE) {
 	int order;
diff --git a/lib/dns/rdata/in_1/a_1.c b/lib/dns/rdata/in_1/a_1.c
index 4faa025cae..1d05d71ce3 100644
--- a/lib/dns/rdata/in_1/a_1.c
+++ b/lib/dns/rdata/in_1/a_1.c
@@ -91,25 +91,6 @@ fromwire_in_a(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_in_a(ARGS_TOWIRE) {
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_a);
-	REQUIRE(rdata->rdclass == dns_rdataclass_in);
-	REQUIRE(rdata->length == 4);
-
-	UNUSED(cctx);
-
-	isc_buffer_availableregion(target, &region);
-	if (region.length < rdata->length) {
-		return ISC_R_NOSPACE;
-	}
-	memmove(region.base, rdata->data, rdata->length);
-	isc_buffer_add(target, 4);
-	return ISC_R_SUCCESS;
-}
-
 static int
 compare_in_a(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/in_1/aaaa_28.c b/lib/dns/rdata/in_1/aaaa_28.c
index e40fb31fe2..2bd21e07a0 100644
--- a/lib/dns/rdata/in_1/aaaa_28.c
+++ b/lib/dns/rdata/in_1/aaaa_28.c
@@ -107,25 +107,6 @@ fromwire_in_aaaa(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_in_aaaa(ARGS_TOWIRE) {
-	isc_region_t region;
-
-	UNUSED(cctx);
-
-	REQUIRE(rdata->type == dns_rdatatype_aaaa);
-	REQUIRE(rdata->rdclass == dns_rdataclass_in);
-	REQUIRE(rdata->length == 16);
-
-	isc_buffer_availableregion(target, &region);
-	if (region.length < rdata->length) {
-		return ISC_R_NOSPACE;
-	}
-	memmove(region.base, rdata->data, rdata->length);
-	isc_buffer_add(target, 16);
-	return ISC_R_SUCCESS;
-}
-
 static int
 compare_in_aaaa(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/in_1/apl_42.c b/lib/dns/rdata/in_1/apl_42.c
index a621dc71a2..ae48390eef 100644
--- a/lib/dns/rdata/in_1/apl_42.c
+++ b/lib/dns/rdata/in_1/apl_42.c
@@ -235,16 +235,6 @@ fromwire_in_apl(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr2.base, sr2.length);
 }

-static isc_result_t
-towire_in_apl(ARGS_TOWIRE) {
-	UNUSED(cctx);
-
-	REQUIRE(rdata->type == dns_rdatatype_apl);
-	REQUIRE(rdata->rdclass == dns_rdataclass_in);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_in_apl(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/in_1/atma_34.c b/lib/dns/rdata/in_1/atma_34.c
index b7fc31da38..1a0ee0c3a3 100644
--- a/lib/dns/rdata/in_1/atma_34.c
+++ b/lib/dns/rdata/in_1/atma_34.c
@@ -168,17 +168,6 @@ fromwire_in_atma(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static 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 int
 compare_in_atma(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/in_1/dhcid_49.c b/lib/dns/rdata/in_1/dhcid_49.c
index e58742d0f9..5ca1e4ad8b 100644
--- a/lib/dns/rdata/in_1/dhcid_49.c
+++ b/lib/dns/rdata/in_1/dhcid_49.c
@@ -85,20 +85,6 @@ fromwire_in_dhcid(ARGS_FROMWIRE) {
 	return mem_tobuffer(target, sr.base, sr.length);
 }

-static isc_result_t
-towire_in_dhcid(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_dhcid);
-	REQUIRE(rdata->rdclass == dns_rdataclass_in);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_in_dhcid(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/in_1/eid_31.c b/lib/dns/rdata/in_1/eid_31.c
index aeb5fc9f72..dbb32dc008 100644
--- a/lib/dns/rdata/in_1/eid_31.c
+++ b/lib/dns/rdata/in_1/eid_31.c
@@ -78,17 +78,6 @@ fromwire_in_eid(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_in_eid(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_eid);
-	REQUIRE(rdata->rdclass == dns_rdataclass_in);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_in_eid(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/in_1/https_65.c b/lib/dns/rdata/in_1/https_65.c
index 2bb979c1eb..511b6115e0 100644
--- a/lib/dns/rdata/in_1/https_65.c
+++ b/lib/dns/rdata/in_1/https_65.c
@@ -47,14 +47,6 @@ fromwire_in_https(ARGS_FROMWIRE) {
 	return generic_fromwire_in_svcb(CALL_FROMWIRE);
 }

-static isc_result_t
-towire_in_https(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_https);
-	REQUIRE(rdata->length != 0);
-
-	return generic_towire_in_svcb(CALL_TOWIRE);
-}
-
 static int
 compare_in_https(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/in_1/kx_36.c b/lib/dns/rdata/in_1/kx_36.c
index 330e7514b3..14f84d5569 100644
--- a/lib/dns/rdata/in_1/kx_36.c
+++ b/lib/dns/rdata/in_1/kx_36.c
@@ -101,26 +101,6 @@ fromwire_in_kx(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_in_kx(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_kx);
-	REQUIRE(rdata->rdclass == dns_rdataclass_in);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	dns_rdata_toregion(rdata, &region);
-	RETERR(mem_tobuffer(target, region.base, 2));
-	isc_region_consume(&region, 2);
-
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_in_kx(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/in_1/nimloc_32.c b/lib/dns/rdata/in_1/nimloc_32.c
index 59f8269d25..cbb681c3d4 100644
--- a/lib/dns/rdata/in_1/nimloc_32.c
+++ b/lib/dns/rdata/in_1/nimloc_32.c
@@ -78,17 +78,6 @@ fromwire_in_nimloc(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_in_nimloc(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_nimloc);
-	REQUIRE(rdata->rdclass == dns_rdataclass_in);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_in_nimloc(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/in_1/nsap-ptr_23.c b/lib/dns/rdata/in_1/nsap-ptr_23.c
index 345ad06516..616376fb5d 100644
--- a/lib/dns/rdata/in_1/nsap-ptr_23.c
+++ b/lib/dns/rdata/in_1/nsap-ptr_23.c
@@ -79,23 +79,6 @@ fromwire_in_nsap_ptr(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_in_nsap_ptr(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_nsap_ptr);
-	REQUIRE(rdata->rdclass == dns_rdataclass_in);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	dns_name_init(&name);
-	dns_rdata_toregion(rdata, &region);
-	dns_name_fromregion(&name, &region);
-
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_in_nsap_ptr(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/in_1/nsap_22.c b/lib/dns/rdata/in_1/nsap_22.c
index c3ef48481d..4a90aaaa94 100644
--- a/lib/dns/rdata/in_1/nsap_22.c
+++ b/lib/dns/rdata/in_1/nsap_22.c
@@ -113,17 +113,6 @@ fromwire_in_nsap(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_in_nsap(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_nsap);
-	REQUIRE(rdata->rdclass == dns_rdataclass_in);
-	REQUIRE(rdata->length != 0);
-
-	UNUSED(cctx);
-
-	return mem_tobuffer(target, rdata->data, rdata->length);
-}
-
 static int
 compare_in_nsap(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/in_1/px_26.c b/lib/dns/rdata/in_1/px_26.c
index d563645989..18822c73b1 100644
--- a/lib/dns/rdata/in_1/px_26.c
+++ b/lib/dns/rdata/in_1/px_26.c
@@ -147,39 +147,6 @@ fromwire_in_px(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_in_px(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->type == dns_rdatatype_px);
-	REQUIRE(rdata->rdclass == dns_rdataclass_in);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	/*
-	 * Preference.
-	 */
-	dns_rdata_toregion(rdata, &region);
-	RETERR(mem_tobuffer(target, region.base, 2));
-	isc_region_consume(&region, 2);
-
-	/*
-	 * MAP822.
-	 */
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &region);
-	RETERR(dns_name_towire(&name, cctx, target));
-	isc_region_consume(&region, name_length(&name));
-
-	/*
-	 * MAPX400.
-	 */
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &region);
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_in_px(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/in_1/srv_33.c b/lib/dns/rdata/in_1/srv_33.c
index 4332768d08..1be27b55c7 100644
--- a/lib/dns/rdata/in_1/srv_33.c
+++ b/lib/dns/rdata/in_1/srv_33.c
@@ -177,30 +177,6 @@ fromwire_in_srv(ARGS_FROMWIRE) {
 	return dns_name_fromwire(&name, source, dctx, target);
 }

-static isc_result_t
-towire_in_srv(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t sr;
-
-	REQUIRE(rdata->type == dns_rdatatype_srv);
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-	/*
-	 * Priority, weight, port.
-	 */
-	dns_rdata_toregion(rdata, &sr);
-	RETERR(mem_tobuffer(target, sr.base, 6));
-	isc_region_consume(&sr, 6);
-
-	/*
-	 * Target.
-	 */
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &sr);
-	return dns_name_towire(&name, cctx, target);
-}
-
 static int
 compare_in_srv(ARGS_COMPARE) {
 	dns_name_t name1;
diff --git a/lib/dns/rdata/in_1/svcb_64.c b/lib/dns/rdata/in_1/svcb_64.c
index d2b589f0b4..f77b75df19 100644
--- a/lib/dns/rdata/in_1/svcb_64.c
+++ b/lib/dns/rdata/in_1/svcb_64.c
@@ -938,44 +938,6 @@ fromwire_in_svcb(ARGS_FROMWIRE) {
 	return generic_fromwire_in_svcb(CALL_FROMWIRE);
 }

-static isc_result_t
-generic_towire_in_svcb(ARGS_TOWIRE) {
-	dns_name_t name;
-	isc_region_t region;
-
-	REQUIRE(rdata->length != 0);
-
-	dns_compress_setpermitted(cctx, false);
-
-	/*
-	 * SvcPriority.
-	 */
-	dns_rdata_toregion(rdata, &region);
-	RETERR(mem_tobuffer(target, region.base, 2));
-	isc_region_consume(&region, 2);
-
-	/*
-	 * TargetName.
-	 */
-	dns_name_init(&name);
-	dns_name_fromregion(&name, &region);
-	RETERR(dns_name_towire(&name, cctx, target));
-	isc_region_consume(&region, name_length(&name));
-
-	/*
-	 * SvcParams.
-	 */
-	return mem_tobuffer(target, region.base, region.length);
-}
-
-static isc_result_t
-towire_in_svcb(ARGS_TOWIRE) {
-	REQUIRE(rdata->type == dns_rdatatype_svcb);
-	REQUIRE(rdata->length != 0);
-
-	return generic_towire_in_svcb(CALL_TOWIRE);
-}
-
 static int
 compare_in_svcb(ARGS_COMPARE) {
 	isc_region_t region1;
diff --git a/lib/dns/rdata/in_1/wks_11.c b/lib/dns/rdata/in_1/wks_11.c
index d3560c0e32..9280573513 100644
--- a/lib/dns/rdata/in_1/wks_11.c
+++ b/lib/dns/rdata/in_1/wks_11.c
@@ -244,20 +244,6 @@ fromwire_in_wks(ARGS_FROMWIRE) {
 	return ISC_R_SUCCESS;
 }

-static isc_result_t
-towire_in_wks(ARGS_TOWIRE) {
-	isc_region_t sr;
-
-	UNUSED(cctx);
-
-	REQUIRE(rdata->type == dns_rdatatype_wks);
-	REQUIRE(rdata->rdclass == dns_rdataclass_in);
-	REQUIRE(rdata->length != 0);
-
-	dns_rdata_toregion(rdata, &sr);
-	return mem_tobuffer(target, sr.base, sr.length);
-}
-
 static int
 compare_in_wks(ARGS_COMPARE) {
 	isc_region_t r1;
diff --git a/lib/dns/rdata/towire.c b/lib/dns/rdata/towire.c
new file mode 100644
index 0000000000..8f69d5afdf
--- /dev/null
+++ b/lib/dns/rdata/towire.c
@@ -0,0 +1,1742 @@
+/*
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+ *
+ * SPDX-License-Identifier: MPL-2.0
+ *
+ * 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 https://mozilla.org/MPL/2.0/.
+ *
+ * See the COPYRIGHT file distributed with this work for additional
+ * information regarding copyright ownership.
+ */
+
+#include <isc/result.h>
+
+#include <dns/name.h>
+#include <dns/compress.h>
+#include <dns/rdata.h>
+
+static unsigned int
+name_length(const dns_name_t *name) {
+	return name->length;
+}
+
+static isc_result_t
+mem_tobuffer(isc_buffer_t *target, void *base, unsigned int length) {
+	isc_region_t tr;
+
+	if (length == 0U) {
+		return ISC_R_SUCCESS;
+	}
+
+	isc_buffer_availableregion(target, &tr);
+	if (length > tr.length) {
+		return ISC_R_NOSPACE;
+	}
+	if (tr.base != base) {
+		memmove(tr.base, base, length);
+	}
+	isc_buffer_add(target, length);
+	return ISC_R_SUCCESS;
+}
+
+
+#define CALL_TOWIRE rdata, cctx, target
+
+#define ARGS_TOWIRE \
+	dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target
+
+static isc_result_t
+generic_towire_in_svcb(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+
+	/*
+	 * SvcPriority.
+	 */
+	dns_rdata_toregion(rdata, &region);
+	RETERR(mem_tobuffer(target, region.base, 2));
+	isc_region_consume(&region, 2);
+
+	/*
+	 * TargetName.
+	 */
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &region);
+	RETERR(dns_name_towire(&name, cctx, target));
+	isc_region_consume(&region, name_length(&name));
+
+	/*
+	 * SvcParams.
+	 */
+	return mem_tobuffer(target, region.base, region.length);
+}
+
+static isc_result_t
+towire_any_tsig(ARGS_TOWIRE) {
+	isc_region_t sr;
+	dns_name_t name;
+
+	REQUIRE(rdata->type == dns_rdatatype_tsig);
+	REQUIRE(rdata->rdclass == dns_rdataclass_any);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	dns_rdata_toregion(rdata, &sr);
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &sr);
+	RETERR(dns_name_towire(&name, cctx, target));
+	isc_region_consume(&sr, name_length(&name));
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_ch_a(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t sregion;
+	isc_region_t tregion;
+
+	REQUIRE(rdata->type == dns_rdatatype_a);
+	REQUIRE(rdata->rdclass == dns_rdataclass_ch);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, true);
+
+	dns_name_init(&name);
+
+	dns_rdata_toregion(rdata, &sregion);
+
+	dns_name_fromregion(&name, &sregion);
+	isc_region_consume(&sregion, name_length(&name));
+	RETERR(dns_name_towire(&name, cctx, target));
+
+	isc_buffer_availableregion(target, &tregion);
+	if (tregion.length < 2) {
+		return ISC_R_NOSPACE;
+	}
+
+	memmove(tregion.base, sregion.base, 2);
+	isc_buffer_add(target, 2);
+	return ISC_R_SUCCESS;
+}
+
+
+static isc_result_t
+towire_afsdb(ARGS_TOWIRE) {
+	isc_region_t tr;
+	isc_region_t sr;
+	dns_name_t name;
+
+	REQUIRE(rdata->type == dns_rdatatype_afsdb);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	isc_buffer_availableregion(target, &tr);
+	dns_rdata_toregion(rdata, &sr);
+	if (tr.length < 2) {
+		return ISC_R_NOSPACE;
+	}
+	memmove(tr.base, sr.base, 2);
+	isc_region_consume(&sr, 2);
+	isc_buffer_add(target, 2);
+
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &sr);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_amtrelay(ARGS_TOWIRE) {
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_amtrelay);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &region);
+	return mem_tobuffer(target, region.base, region.length);
+}
+
+
+static isc_result_t
+towire_avc(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_avc);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_brid(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_brid);
+	REQUIRE(rdata->length > 0);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_caa(ARGS_TOWIRE) {
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_caa);
+	REQUIRE(rdata->length >= 3U);
+	REQUIRE(rdata->data != NULL);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &region);
+	return mem_tobuffer(target, region.base, region.length);
+}
+
+
+static isc_result_t
+towire_cdnskey(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_cdnskey);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_cds(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_cds);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_cert(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_cert);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_cname(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_cname);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, true);
+
+	dns_name_init(&name);
+	dns_rdata_toregion(rdata, &region);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_csync(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_csync);
+	REQUIRE(rdata->length >= 6);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_dlv(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_dlv);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_dname(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_dname);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	dns_name_init(&name);
+	dns_rdata_toregion(rdata, &region);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_dnskey(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata != NULL);
+	REQUIRE(rdata->type == dns_rdatatype_dnskey);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_doa(ARGS_TOWIRE) {
+	isc_region_t region;
+
+	UNUSED(cctx);
+
+	REQUIRE(rdata != NULL);
+	REQUIRE(rdata->type == dns_rdatatype_doa);
+	REQUIRE(rdata->length != 0);
+
+	dns_rdata_toregion(rdata, &region);
+	return mem_tobuffer(target, region.base, region.length);
+}
+
+
+static isc_result_t
+towire_ds(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_ds);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_dsync(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_dsync);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+
+	dns_rdata_toregion(rdata, &region);
+	RETERR(mem_tobuffer(target, region.base, 5));
+	isc_region_consume(&region, 5);
+
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_eui48(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_eui48);
+	REQUIRE(rdata->length == 6);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_eui64(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_eui64);
+	REQUIRE(rdata->length == 8);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_gpos(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_gpos);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_hhit(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_hhit);
+	REQUIRE(rdata->length > 0);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_hinfo(ARGS_TOWIRE) {
+	UNUSED(cctx);
+
+	REQUIRE(rdata->type == dns_rdatatype_hinfo);
+	REQUIRE(rdata->length != 0);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_hip(ARGS_TOWIRE) {
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_hip);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &region);
+	return mem_tobuffer(target, region.base, region.length);
+}
+
+
+static isc_result_t
+towire_ipseckey(ARGS_TOWIRE) {
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_ipseckey);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &region);
+	return mem_tobuffer(target, region.base, region.length);
+}
+
+
+static isc_result_t
+towire_isdn(ARGS_TOWIRE) {
+	UNUSED(cctx);
+
+	REQUIRE(rdata->type == dns_rdatatype_isdn);
+	REQUIRE(rdata->length != 0);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_key(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata != NULL);
+	REQUIRE(rdata->type == dns_rdatatype_key);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_keydata(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_keydata);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_l32(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_l32);
+	REQUIRE(rdata->length == 6);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_l64(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_l64);
+	REQUIRE(rdata->length == 10);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_loc(ARGS_TOWIRE) {
+	UNUSED(cctx);
+
+	REQUIRE(rdata->type == dns_rdatatype_loc);
+	REQUIRE(rdata->length != 0);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_lp(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_lp);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_mb(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_mb);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, true);
+
+	dns_name_init(&name);
+	dns_rdata_toregion(rdata, &region);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_md(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_md);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, true);
+
+	dns_name_init(&name);
+	dns_rdata_toregion(rdata, &region);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_mf(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_mf);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, true);
+
+	dns_name_init(&name);
+	dns_rdata_toregion(rdata, &region);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_mg(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_mg);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, true);
+
+	dns_name_init(&name);
+	dns_rdata_toregion(rdata, &region);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_minfo(ARGS_TOWIRE) {
+	isc_region_t region;
+	dns_name_t rmail;
+	dns_name_t email;
+
+	REQUIRE(rdata->type == dns_rdatatype_minfo);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, true);
+
+	dns_name_init(&rmail);
+	dns_name_init(&email);
+
+	dns_rdata_toregion(rdata, &region);
+
+	dns_name_fromregion(&rmail, &region);
+	isc_region_consume(&region, name_length(&rmail));
+
+	RETERR(dns_name_towire(&rmail, cctx, target));
+
+	dns_name_fromregion(&rmail, &region);
+	isc_region_consume(&region, rmail.length);
+
+	return dns_name_towire(&rmail, cctx, target);
+}
+
+
+static isc_result_t
+towire_mr(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_mr);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, true);
+
+	dns_name_init(&name);
+	dns_rdata_toregion(rdata, &region);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_mx(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_mx);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, true);
+
+	dns_rdata_toregion(rdata, &region);
+	RETERR(mem_tobuffer(target, region.base, 2));
+	isc_region_consume(&region, 2);
+
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_naptr(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_naptr);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	/*
+	 * Order, preference.
+	 */
+	dns_rdata_toregion(rdata, &sr);
+	RETERR(mem_tobuffer(target, sr.base, 4));
+	isc_region_consume(&sr, 4);
+
+	/*
+	 * Flags.
+	 */
+	RETERR(mem_tobuffer(target, sr.base, sr.base[0] + 1));
+	isc_region_consume(&sr, sr.base[0] + 1);
+
+	/*
+	 * Service.
+	 */
+	RETERR(mem_tobuffer(target, sr.base, sr.base[0] + 1));
+	isc_region_consume(&sr, sr.base[0] + 1);
+
+	/*
+	 * Regexp.
+	 */
+	RETERR(mem_tobuffer(target, sr.base, sr.base[0] + 1));
+	isc_region_consume(&sr, sr.base[0] + 1);
+
+	/*
+	 * Replacement.
+	 */
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &sr);
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_nid(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_nid);
+	REQUIRE(rdata->length == 10);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_ninfo(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_ninfo);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_ns(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_ns);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, true);
+
+	dns_name_init(&name);
+	dns_rdata_toregion(rdata, &region);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_nsec3(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_nsec3);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_nsec3param(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_nsec3param);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_nsec(ARGS_TOWIRE) {
+	isc_region_t sr;
+	dns_name_t name;
+
+	REQUIRE(rdata->type == dns_rdatatype_nsec);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	dns_name_init(&name);
+	dns_rdata_toregion(rdata, &sr);
+	dns_name_fromregion(&name, &sr);
+	isc_region_consume(&sr, name_length(&name));
+	RETERR(dns_name_towire(&name, cctx, target));
+
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_null(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_null);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_nxt(ARGS_TOWIRE) {
+	isc_region_t sr;
+	dns_name_t name;
+
+	REQUIRE(rdata->type == dns_rdatatype_nxt);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	dns_name_init(&name);
+	dns_rdata_toregion(rdata, &sr);
+	dns_name_fromregion(&name, &sr);
+	isc_region_consume(&sr, name_length(&name));
+	RETERR(dns_name_towire(&name, cctx, target));
+
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_openpgpkey(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_openpgpkey);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_opt(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_opt);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_ptr(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_ptr);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, true);
+
+	dns_name_init(&name);
+	dns_rdata_toregion(rdata, &region);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_resinfo(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_resinfo);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_rkey(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata != NULL);
+	REQUIRE(rdata->type == dns_rdatatype_rkey);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_rp(ARGS_TOWIRE) {
+	isc_region_t region;
+	dns_name_t rmail;
+	dns_name_t email;
+
+	REQUIRE(rdata->type == dns_rdatatype_rp);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	dns_name_init(&rmail);
+	dns_name_init(&email);
+
+	dns_rdata_toregion(rdata, &region);
+
+	dns_name_fromregion(&rmail, &region);
+	isc_region_consume(&region, rmail.length);
+
+	RETERR(dns_name_towire(&rmail, cctx, target));
+
+	dns_name_fromregion(&rmail, &region);
+	isc_region_consume(&region, rmail.length);
+
+	return dns_name_towire(&rmail, cctx, target);
+}
+
+
+static isc_result_t
+towire_rrsig(ARGS_TOWIRE) {
+	isc_region_t sr;
+	dns_name_t name;
+
+	REQUIRE(rdata->type == dns_rdatatype_rrsig);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	dns_rdata_toregion(rdata, &sr);
+	/*
+	 * type covered: 2
+	 * algorithm: 1
+	 * labels: 1
+	 * original ttl: 4
+	 * signature expiration: 4
+	 * time signed: 4
+	 * key footprint: 2
+	 */
+	RETERR(mem_tobuffer(target, sr.base, 18));
+	isc_region_consume(&sr, 18);
+
+	/*
+	 * Signer.
+	 */
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &sr);
+	isc_region_consume(&sr, name_length(&name));
+	RETERR(dns_name_towire(&name, cctx, target));
+
+	/*
+	 * Signature.
+	 */
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_rt(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+	isc_region_t tr;
+
+	REQUIRE(rdata->type == dns_rdatatype_rt);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	isc_buffer_availableregion(target, &tr);
+	dns_rdata_toregion(rdata, &region);
+	if (tr.length < 2) {
+		return ISC_R_NOSPACE;
+	}
+	memmove(tr.base, region.base, 2);
+	isc_region_consume(&region, 2);
+	isc_buffer_add(target, 2);
+
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_sig(ARGS_TOWIRE) {
+	isc_region_t sr;
+	dns_name_t name;
+
+	REQUIRE(rdata->type == dns_rdatatype_sig);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	dns_rdata_toregion(rdata, &sr);
+	/*
+	 * type covered: 2
+	 * algorithm: 1
+	 * labels: 1
+	 * original ttl: 4
+	 * signature expiration: 4
+	 * time signed: 4
+	 * key footprint: 2
+	 */
+	RETERR(mem_tobuffer(target, sr.base, 18));
+	isc_region_consume(&sr, 18);
+
+	/*
+	 * Signer.
+	 */
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &sr);
+	isc_region_consume(&sr, name_length(&name));
+	RETERR(dns_name_towire(&name, cctx, target));
+
+	/*
+	 * Signature.
+	 */
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_sink(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_sink);
+	REQUIRE(rdata->length >= 3);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_smimea(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_smimea);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_soa(ARGS_TOWIRE) {
+	isc_region_t sregion;
+	isc_region_t tregion;
+	dns_name_t mname;
+	dns_name_t rname;
+
+	REQUIRE(rdata->type == dns_rdatatype_soa);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, true);
+
+	dns_name_init(&mname);
+	dns_name_init(&rname);
+
+	dns_rdata_toregion(rdata, &sregion);
+
+	dns_name_fromregion(&mname, &sregion);
+	isc_region_consume(&sregion, name_length(&mname));
+	RETERR(dns_name_towire(&mname, cctx, target));
+
+	dns_name_fromregion(&rname, &sregion);
+	isc_region_consume(&sregion, name_length(&rname));
+	RETERR(dns_name_towire(&rname, cctx, target));
+
+	isc_buffer_availableregion(target, &tregion);
+	if (tregion.length < 20) {
+		return ISC_R_NOSPACE;
+	}
+
+	memmove(tregion.base, sregion.base, 20);
+	isc_buffer_add(target, 20);
+	return ISC_R_SUCCESS;
+}
+
+
+static isc_result_t
+towire_spf(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_spf);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_sshfp(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_sshfp);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_ta(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_ta);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_talink(ARGS_TOWIRE) {
+	isc_region_t sregion;
+	dns_name_t prev;
+	dns_name_t next;
+
+	REQUIRE(rdata->type == dns_rdatatype_talink);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+
+	dns_name_init(&prev);
+	dns_name_init(&next);
+
+	dns_rdata_toregion(rdata, &sregion);
+
+	dns_name_fromregion(&prev, &sregion);
+	isc_region_consume(&sregion, name_length(&prev));
+	RETERR(dns_name_towire(&prev, cctx, target));
+
+	dns_name_fromregion(&next, &sregion);
+	isc_region_consume(&sregion, name_length(&next));
+	return dns_name_towire(&next, cctx, target);
+}
+
+
+static isc_result_t
+towire_tkey(ARGS_TOWIRE) {
+	isc_region_t sr;
+	dns_name_t name;
+
+	REQUIRE(rdata->type == dns_rdatatype_tkey);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	/*
+	 * Algorithm.
+	 */
+	dns_rdata_toregion(rdata, &sr);
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &sr);
+	RETERR(dns_name_towire(&name, cctx, target));
+	isc_region_consume(&sr, name_length(&name));
+
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_tlsa(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_tlsa);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_txt(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_txt);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_uri(ARGS_TOWIRE) {
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_uri);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &region);
+	return mem_tobuffer(target, region.base, region.length);
+}
+
+
+static isc_result_t
+towire_wallet(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_wallet);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_x25(ARGS_TOWIRE) {
+	UNUSED(cctx);
+
+	REQUIRE(rdata->type == dns_rdatatype_x25);
+	REQUIRE(rdata->length != 0);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_zonemd(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_zonemd);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_hs_a(ARGS_TOWIRE) {
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_a);
+	REQUIRE(rdata->rdclass == dns_rdataclass_hs);
+	REQUIRE(rdata->length == 4);
+
+	UNUSED(cctx);
+
+	isc_buffer_availableregion(target, &region);
+	if (region.length < rdata->length) {
+		return ISC_R_NOSPACE;
+	}
+	memmove(region.base, rdata->data, rdata->length);
+	isc_buffer_add(target, 4);
+	return ISC_R_SUCCESS;
+}
+
+
+static isc_result_t
+towire_in_a6(ARGS_TOWIRE) {
+	isc_region_t sr;
+	dns_name_t name;
+	unsigned char prefixlen;
+	unsigned char octets;
+
+	REQUIRE(rdata->type == dns_rdatatype_a6);
+	REQUIRE(rdata->rdclass == dns_rdataclass_in);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	dns_rdata_toregion(rdata, &sr);
+	prefixlen = sr.base[0];
+	INSIST(prefixlen <= 128);
+
+	octets = 1 + 16 - prefixlen / 8;
+	RETERR(mem_tobuffer(target, sr.base, octets));
+	isc_region_consume(&sr, octets);
+
+	if (prefixlen == 0) {
+		return ISC_R_SUCCESS;
+	}
+
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &sr);
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_in_a(ARGS_TOWIRE) {
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_a);
+	REQUIRE(rdata->rdclass == dns_rdataclass_in);
+	REQUIRE(rdata->length == 4);
+
+	UNUSED(cctx);
+
+	isc_buffer_availableregion(target, &region);
+	if (region.length < rdata->length) {
+		return ISC_R_NOSPACE;
+	}
+	memmove(region.base, rdata->data, rdata->length);
+	isc_buffer_add(target, 4);
+	return ISC_R_SUCCESS;
+}
+
+
+static isc_result_t
+towire_in_aaaa(ARGS_TOWIRE) {
+	isc_region_t region;
+
+	UNUSED(cctx);
+
+	REQUIRE(rdata->type == dns_rdatatype_aaaa);
+	REQUIRE(rdata->rdclass == dns_rdataclass_in);
+	REQUIRE(rdata->length == 16);
+
+	isc_buffer_availableregion(target, &region);
+	if (region.length < rdata->length) {
+		return ISC_R_NOSPACE;
+	}
+	memmove(region.base, rdata->data, rdata->length);
+	isc_buffer_add(target, 16);
+	return ISC_R_SUCCESS;
+}
+
+
+static isc_result_t
+towire_in_apl(ARGS_TOWIRE) {
+	UNUSED(cctx);
+
+	REQUIRE(rdata->type == dns_rdatatype_apl);
+	REQUIRE(rdata->rdclass == dns_rdataclass_in);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static 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 isc_result_t
+towire_in_dhcid(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_dhcid);
+	REQUIRE(rdata->rdclass == dns_rdataclass_in);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+
+static isc_result_t
+towire_in_eid(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_eid);
+	REQUIRE(rdata->rdclass == dns_rdataclass_in);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_in_https(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_https);
+	REQUIRE(rdata->length != 0);
+
+	return generic_towire_in_svcb(CALL_TOWIRE);
+}
+
+
+static isc_result_t
+towire_in_kx(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_kx);
+	REQUIRE(rdata->rdclass == dns_rdataclass_in);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	dns_rdata_toregion(rdata, &region);
+	RETERR(mem_tobuffer(target, region.base, 2));
+	isc_region_consume(&region, 2);
+
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_in_nimloc(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_nimloc);
+	REQUIRE(rdata->rdclass == dns_rdataclass_in);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_in_nsap_ptr(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_nsap_ptr);
+	REQUIRE(rdata->rdclass == dns_rdataclass_in);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	dns_name_init(&name);
+	dns_rdata_toregion(rdata, &region);
+	dns_name_fromregion(&name, &region);
+
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_in_nsap(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_nsap);
+	REQUIRE(rdata->rdclass == dns_rdataclass_in);
+	REQUIRE(rdata->length != 0);
+
+	UNUSED(cctx);
+
+	return mem_tobuffer(target, rdata->data, rdata->length);
+}
+
+
+static isc_result_t
+towire_in_px(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t region;
+
+	REQUIRE(rdata->type == dns_rdatatype_px);
+	REQUIRE(rdata->rdclass == dns_rdataclass_in);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	/*
+	 * Preference.
+	 */
+	dns_rdata_toregion(rdata, &region);
+	RETERR(mem_tobuffer(target, region.base, 2));
+	isc_region_consume(&region, 2);
+
+	/*
+	 * MAP822.
+	 */
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &region);
+	RETERR(dns_name_towire(&name, cctx, target));
+	isc_region_consume(&region, name_length(&name));
+
+	/*
+	 * MAPX400.
+	 */
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &region);
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_in_srv(ARGS_TOWIRE) {
+	dns_name_t name;
+	isc_region_t sr;
+
+	REQUIRE(rdata->type == dns_rdatatype_srv);
+	REQUIRE(rdata->length != 0);
+
+	dns_compress_setpermitted(cctx, false);
+	/*
+	 * Priority, weight, port.
+	 */
+	dns_rdata_toregion(rdata, &sr);
+	RETERR(mem_tobuffer(target, sr.base, 6));
+	isc_region_consume(&sr, 6);
+
+	/*
+	 * Target.
+	 */
+	dns_name_init(&name);
+	dns_name_fromregion(&name, &sr);
+	return dns_name_towire(&name, cctx, target);
+}
+
+
+static isc_result_t
+towire_in_svcb(ARGS_TOWIRE) {
+	REQUIRE(rdata->type == dns_rdatatype_svcb);
+	REQUIRE(rdata->length != 0);
+
+	return generic_towire_in_svcb(CALL_TOWIRE);
+}
+
+
+static isc_result_t
+towire_in_wks(ARGS_TOWIRE) {
+	isc_region_t sr;
+
+	UNUSED(cctx);
+
+	REQUIRE(rdata->type == dns_rdatatype_wks);
+	REQUIRE(rdata->rdclass == dns_rdataclass_in);
+	REQUIRE(rdata->length != 0);
+
+	dns_rdata_toregion(rdata, &sr);
+	return mem_tobuffer(target, sr.base, sr.length);
+}
+
+#define TOWIRESWITCH \
+	switch (rdata->type) { \
+	case 1: switch (rdata->rdclass) { \
+		case 1: result = towire_in_a(rdata, cctx, target); break; \
+		case 3: result = towire_ch_a(rdata, cctx, target); break; \
+		case 4: result = towire_hs_a(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 2: result = towire_ns(rdata, cctx, target); break; \
+	case 3: result = towire_md(rdata, cctx, target); break; \
+	case 4: result = towire_mf(rdata, cctx, target); break; \
+	case 5: result = towire_cname(rdata, cctx, target); break; \
+	case 6: result = towire_soa(rdata, cctx, target); break; \
+	case 7: result = towire_mb(rdata, cctx, target); break; \
+	case 8: result = towire_mg(rdata, cctx, target); break; \
+	case 9: result = towire_mr(rdata, cctx, target); break; \
+	case 10: result = towire_null(rdata, cctx, target); break; \
+	case 11: switch (rdata->rdclass) { \
+		case 1: result = towire_in_wks(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 12: result = towire_ptr(rdata, cctx, target); break; \
+	case 13: result = towire_hinfo(rdata, cctx, target); break; \
+	case 14: result = towire_minfo(rdata, cctx, target); break; \
+	case 15: result = towire_mx(rdata, cctx, target); break; \
+	case 16: result = towire_txt(rdata, cctx, target); break; \
+	case 17: result = towire_rp(rdata, cctx, target); break; \
+	case 18: result = towire_afsdb(rdata, cctx, target); break; \
+	case 19: result = towire_x25(rdata, cctx, target); break; \
+	case 20: result = towire_isdn(rdata, cctx, target); break; \
+	case 21: result = towire_rt(rdata, cctx, target); break; \
+	case 22: switch (rdata->rdclass) { \
+		case 1: result = towire_in_nsap(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 23: switch (rdata->rdclass) { \
+		case 1: result = towire_in_nsap_ptr(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 24: result = towire_sig(rdata, cctx, target); break; \
+	case 25: result = towire_key(rdata, cctx, target); break; \
+	case 26: switch (rdata->rdclass) { \
+		case 1: result = towire_in_px(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 27: result = towire_gpos(rdata, cctx, target); break; \
+	case 28: switch (rdata->rdclass) { \
+		case 1: result = towire_in_aaaa(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 29: result = towire_loc(rdata, cctx, target); break; \
+	case 30: result = towire_nxt(rdata, cctx, target); break; \
+	case 31: switch (rdata->rdclass) { \
+		case 1: result = towire_in_eid(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 32: switch (rdata->rdclass) { \
+		case 1: result = towire_in_nimloc(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 33: switch (rdata->rdclass) { \
+		case 1: result = towire_in_srv(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 34: switch (rdata->rdclass) { \
+		case 1: result = towire_in_atma(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 35: result = towire_naptr(rdata, cctx, target); break; \
+	case 36: switch (rdata->rdclass) { \
+		case 1: result = towire_in_kx(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 37: result = towire_cert(rdata, cctx, target); break; \
+	case 38: switch (rdata->rdclass) { \
+		case 1: result = towire_in_a6(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 39: result = towire_dname(rdata, cctx, target); break; \
+	case 40: result = towire_sink(rdata, cctx, target); break; \
+	case 41: result = towire_opt(rdata, cctx, target); break; \
+	case 42: switch (rdata->rdclass) { \
+		case 1: result = towire_in_apl(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 43: result = towire_ds(rdata, cctx, target); break; \
+	case 44: result = towire_sshfp(rdata, cctx, target); break; \
+	case 45: result = towire_ipseckey(rdata, cctx, target); break; \
+	case 46: result = towire_rrsig(rdata, cctx, target); break; \
+	case 47: result = towire_nsec(rdata, cctx, target); break; \
+	case 48: result = towire_dnskey(rdata, cctx, target); break; \
+	case 49: switch (rdata->rdclass) { \
+		case 1: result = towire_in_dhcid(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 50: result = towire_nsec3(rdata, cctx, target); break; \
+	case 51: result = towire_nsec3param(rdata, cctx, target); break; \
+	case 52: result = towire_tlsa(rdata, cctx, target); break; \
+	case 53: result = towire_smimea(rdata, cctx, target); break; \
+	case 55: result = towire_hip(rdata, cctx, target); break; \
+	case 56: result = towire_ninfo(rdata, cctx, target); break; \
+	case 57: result = towire_rkey(rdata, cctx, target); break; \
+	case 58: result = towire_talink(rdata, cctx, target); break; \
+	case 59: result = towire_cds(rdata, cctx, target); break; \
+	case 60: result = towire_cdnskey(rdata, cctx, target); break; \
+	case 61: result = towire_openpgpkey(rdata, cctx, target); break; \
+	case 62: result = towire_csync(rdata, cctx, target); break; \
+	case 63: result = towire_zonemd(rdata, cctx, target); break; \
+	case 64: switch (rdata->rdclass) { \
+		case 1: result = towire_in_svcb(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 65: switch (rdata->rdclass) { \
+		case 1: result = towire_in_https(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 66: result = towire_dsync(rdata, cctx, target); break; \
+	case 67: result = towire_hhit(rdata, cctx, target); break; \
+	case 68: result = towire_brid(rdata, cctx, target); break; \
+	case 99: result = towire_spf(rdata, cctx, target); break; \
+	case 104: result = towire_nid(rdata, cctx, target); break; \
+	case 105: result = towire_l32(rdata, cctx, target); break; \
+	case 106: result = towire_l64(rdata, cctx, target); break; \
+	case 107: result = towire_lp(rdata, cctx, target); break; \
+	case 108: result = towire_eui48(rdata, cctx, target); break; \
+	case 109: result = towire_eui64(rdata, cctx, target); break; \
+	case 249: result = towire_tkey(rdata, cctx, target); break; \
+	case 250: switch (rdata->rdclass) { \
+		case 255: result = towire_any_tsig(rdata, cctx, target); break; \
+		default: use_default = true; break; \
+		} \
+		break; \
+	case 256: result = towire_uri(rdata, cctx, target); break; \
+	case 257: result = towire_caa(rdata, cctx, target); break; \
+	case 258: result = towire_avc(rdata, cctx, target); break; \
+	case 259: result = towire_doa(rdata, cctx, target); break; \
+	case 260: result = towire_amtrelay(rdata, cctx, target); break; \
+	case 261: result = towire_resinfo(rdata, cctx, target); break; \
+	case 262: result = towire_wallet(rdata, cctx, target); break; \
+	case 32768: result = towire_ta(rdata, cctx, target); break; \
+	case 32769: result = towire_dlv(rdata, cctx, target); break; \
+	case 65533: result = towire_keydata(rdata, cctx, target); break; \
+	default: use_default = true; break; \
+	}
+
+isc_result_t
+dns_rdata_towire(dns_rdata_t *rdata, dns_compress_t *cctx,
+		 isc_buffer_t *target) {
+	isc_result_t result = ISC_R_NOTIMPLEMENTED;
+	bool use_default = false;
+	isc_region_t tr;
+	isc_buffer_t st;
+
+	REQUIRE(rdata != NULL);
+	REQUIRE(DNS_RDATA_VALIDFLAGS(rdata));
+
+	/*
+	 * Some DynDNS meta-RRs have empty rdata.
+	 */
+	if ((rdata->flags & DNS_RDATA_UPDATE) != 0) {
+		INSIST(rdata->length == 0);
+		return ISC_R_SUCCESS;
+	}
+
+	st = *target;
+
+	TOWIRESWITCH
+
+	if (use_default) {
+		isc_buffer_availableregion(target, &tr);
+		if (tr.length < rdata->length) {
+			return ISC_R_NOSPACE;
+		}
+		memmove(tr.base, rdata->data, rdata->length);
+		isc_buffer_add(target, rdata->length);
+		return ISC_R_SUCCESS;
+	}
+	if (result != ISC_R_SUCCESS) {
+		*target = st;
+		dns_compress_rollback(cctx, target->used);
+	}
+	return result;
+}