]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
kres: added rr:merge_data(source) for RR merging
authorMarek Vavruša <marek@vavrusa.com>
Wed, 14 Mar 2018 21:13:33 +0000 (14:13 -0700)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Mon, 23 Apr 2018 12:34:40 +0000 (14:34 +0200)
This is generally useful for parsing records from packet, as they
are broken into individual RRs that need reassembling.

daemon/lua/kres-gen.lua
daemon/lua/kres-gen.sh
daemon/lua/kres.lua
tests/config/basic.test.lua

index ebdcdf1cae6437369f99f1da4d417fd28e399035..7a8e59732ff906c1bde903beea1db2be658b1922 100644 (file)
@@ -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 *);
index 4061f75a17a6c13d8d5ee2a9b3bfc344e5f2239f..9c7b5581881b517ec6100a92a7ac6ce2af048be0 100755 (executable)
@@ -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
index 5cdccaab6514b11fc6529dcbe6442aabc4d47c5f..f035b50b8ed4d909a933e7de2db7af6c661b1a6e 100644 (file)
@@ -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))
index 5e771fbd08cabd1d3139158db5b0d8a51cebe82c..82b7ebbd7366362d172e276267370881a9134797 100644 (file)
@@ -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