From: Marek VavruĊĦa Date: Wed, 14 Mar 2018 21:13:33 +0000 (-0700) Subject: kres: added rr:merge_data(source) for RR merging X-Git-Tag: v2.4.0~54^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7afae4e58c98bb91e753c1ce6c0ae29b6e8be028;p=thirdparty%2Fknot-resolver.git kres: added rr:merge_data(source) for RR merging This is generally useful for parsing records from packet, as they are broken into individual RRs that need reassembling. --- diff --git a/daemon/lua/kres-gen.lua b/daemon/lua/kres-gen.lua index ebdcdf1ca..7a8e59732 100644 --- a/daemon/lua/kres-gen.lua +++ b/daemon/lua/kres-gen.lua @@ -246,6 +246,7 @@ uint16_t knot_rdata_rdlen(const knot_rdata_t *); uint8_t *knot_rdata_data(const knot_rdata_t *); size_t knot_rdata_array_size(uint16_t); knot_rdata_t *knot_rdataset_at(const knot_rdataset_t *, size_t); +int knot_rdataset_merge(knot_rdataset_t *, const knot_rdataset_t *, knot_mm_t *); int knot_rrset_add_rdata(knot_rrset_t *, const uint8_t *, const uint16_t, const uint32_t, knot_mm_t *); void knot_rrset_init_empty(knot_rrset_t *); uint32_t knot_rrset_ttl(const knot_rrset_t *); diff --git a/daemon/lua/kres-gen.sh b/daemon/lua/kres-gen.sh index 4061f75a1..9c7b55818 100755 --- a/daemon/lua/kres-gen.sh +++ b/daemon/lua/kres-gen.sh @@ -105,6 +105,7 @@ printf "\tchar _stub[];\n};\n" knot_rdata_data knot_rdata_array_size knot_rdataset_at + knot_rdataset_merge knot_rrset_add_rdata knot_rrset_init_empty knot_rrset_ttl diff --git a/daemon/lua/kres.lua b/daemon/lua/kres.lua index 5cdccaab6..f035b50b8 100644 --- a/daemon/lua/kres.lua +++ b/daemon/lua/kres.lua @@ -334,6 +334,14 @@ ffi.metatype( knot_rrset_t, { if ret ~= 0 then return nil, knot_strerror(ret) end return true end, + -- Merge data from another RR set into the current one + merge_rdata = function (rr, source) + assert(ffi.istype(knot_rrset_t, rr)) + assert(ffi.istype(knot_rrset_t, source)) + local ret = knot.knot_rdataset_merge(rr.rrs, source.rrs, nil) + if ret ~= 0 then return nil, knot_strerror(ret) end + return true + end, -- Return type covered by this RRSIG type_covered = function(rr, pos) assert(ffi.istype(knot_rrset_t, rr)) diff --git a/tests/config/basic.test.lua b/tests/config/basic.test.lua index 5e771fbd0..82b7ebbd7 100644 --- a/tests/config/basic.test.lua +++ b/tests/config/basic.test.lua @@ -45,16 +45,23 @@ local function test_rrset_functions() same(rr:class(kres.class.IN), kres.class.IN, 'can restore a class') same(rr.type, kres.type.A, 'created RR has correct type') -- test adding rdata - local rdata = '\1\2\3\4' - ok(rr:add_rdata(rdata, #rdata, 66), 'adding RDATA works') + ok(rr:add_rdata('\1\2\3\4', 4, 66), 'adding RDATA works') -- test conversion to text - same(rr:txt_dump(), 'com. 66 A 1.2.3.4\n', 'RR to text works') + local expect = 'com. 66 A 1.2.3.4\n' + same(rr:txt_dump(), expect, 'RR to text works') -- create a dummy rrsig local rrsig = kres.rrset(kres.str2dname('com.'), kres.type.RRSIG, kres.class.IN) rrsig:add_rdata('\0\1', 2, 0) -- check rrsig matching same(rr.type, rrsig:type_covered(), 'rrsig type covered matches covered RR type') ok(rr:is_covered_by(rrsig), 'rrsig is covering a record') + -- test rrset merging + local copy = kres.rrset(rr:owner(), rr.type) + ok(copy:add_rdata('\4\3\2\1', 4, 66), 'adding second RDATA works') + ok(rr:merge_rdata(copy), 'merge_rdata works') + expect = 'com. 66 A 1.2.3.4\n' .. + 'com. 66 A 4.3.2.1\n' + same(rr:txt_dump(), expect, 'merge_rdata actually merged RDATA') end -- test dns library packet interface