On 19/02/2023 20.04, Blažej Krajňák wrote:
    local msg = '1 resolver.example. alpn=dot ipv4hint=192.0.2.1
ipv6hint=2001:db8::1'

    answer:put(qry.sname, 900, answer:qclass(), kres.type.SVCB,
string.char(#msg) .. msg)

This part won't construct correct wire format for SVCB.

I think this example should work:

-- Parse RDATA, from presentation to wire-format.
-- in: a string or table of strings, each a line describing RRTYPE+RDATA
-- out: a table of RDATA strings in wire-format
function parse_rdata(strs, nothing)
	local zonefile = require('zonefile')
	if nothing ~= nil then -- accidents like forgetting braces
		error('one string or table of strings is accepted', 2)
	end
	if type(strs) ~= 'table' then strs = { strs } end -- TODO: allow this case?
	local res = {}
	for _, line in ipairs(strs) do
		if type(line) ~= 'string' then
			error('one string or table of strings is accepted', 2)
		end
		local rrs = zonefile.string('. ' .. line)
		if #rrs == 0 then error('failed to parse line: ' .. line, 2) end
		for _, rr in ipairs(rrs) do
			table.insert(res, rr.rdata)
		end
	end
	return res
end

svcb_str = {
	'SVCB 1 dns.quad9.net. alpn=dot port=853 ipv4hint=9.9.9.9,149.112.112.112 ipv6hint=2620:fe::fe',
	'SVCB 2 dns.quad9.net. mandatory=key65380 alpn=h2 port=443 ipv4hint=9.9.9.9,149.112.112.112 ipv6hint=2620:fe::fe key65380="/dns-query{?dns}"',
}

policy.add(
    policy.suffix(
        policy.ANSWER({ [kres.type.SVCB] = { rdata=parse_rdata(svcb_str), ttl=300 } }, true),
		{ todname('_dns.resolver.arpa') }))