]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
policy.DEBUG: translate rank values to human readable names
authorPetr Špaček <petr.spacek@nic.cz>
Fri, 7 Aug 2020 08:47:49 +0000 (10:47 +0200)
committerPetr Špaček <petr.spacek@nic.cz>
Fri, 7 Aug 2020 14:01:48 +0000 (16:01 +0200)
It is very useful when debugging. This code gets executed only with
special DEBUG policy so we do not need to worry about maximum performance.

daemon/lua/kres-gen.lua
daemon/lua/kres-gen.sh
daemon/lua/kres.lua
lib/resolve.c
lib/resolve.h

index d22e825272f091020177a681397ffd75df34ccb8..9dc6efb9562ce47711afeb0de9b3aae917e37b85 100644 (file)
@@ -357,6 +357,7 @@ int kr_bitcmp(const char *, const char *, int);
 int kr_family_len(int);
 struct sockaddr *kr_straddr_socket(const char *, int, knot_mm_t *);
 int kr_straddr_split(const char *, char * restrict, uint16_t *);
+_Bool kr_rank_test(uint8_t, uint8_t);
 int kr_ranked_rrarray_add(ranked_rr_array_t *, const knot_rrset_t *, uint8_t, _Bool, uint32_t, knot_mm_t *);
 int kr_ranked_rrarray_finalize(ranked_rr_array_t *, uint32_t, knot_mm_t *);
 void kr_qflags_set(struct kr_qflags *, struct kr_qflags);
index 309b7f1d7b0aeb23ea4f8d0ed0a938955c74c37a..d2300c5c0a0d447ee35a697e04e610119687f990 100755 (executable)
@@ -216,6 +216,7 @@ ${CDEFS} ${LIBKRES} functions <<-EOF
        kr_family_len
        kr_straddr_socket
        kr_straddr_split
+       kr_rank_test
        kr_ranked_rrarray_add
        kr_ranked_rrarray_finalize
        kr_qflags_set
index d859fda963864f2bb8dae608efb6748fd12d1a2a..13021d0911f3d381f561a85805f25a33adb147b9 100644 (file)
@@ -904,11 +904,21 @@ local function c_array_iter(t, i)
 end
 
 -- Metatype for a single ranked record array entry (one RRset)
+local function rank_tostring(rank)
+       local names = {}
+       for name, value in pairs(const_rank) do
+               if ffi.C.kr_rank_test(rank, value) then
+                       table.insert(names, string.lower(name))
+               end
+       end
+       return string.format('0%.2o (%s)', rank, table.concat(names, ' '))
+end
+
 local ranked_rr_array_entry_t = ffi.typeof('ranked_rr_array_entry_t')
 ffi.metatype(ranked_rr_array_entry_t, {
        __tostring = function(self)
-               return string.format('; ranked rrset to_wire %s, rank 0%.2o, cached %s, qry_uid %s, revalidations %s\n%s',
-               self.to_wire, self.rank, self.cached, self.qry_uid,
+               return string.format('; ranked rrset to_wire %s, rank %s, cached %s, qry_uid %s, revalidations %s\n%s',
+               self.to_wire, rank_tostring(self.rank), self.cached, self.qry_uid,
                self.revalidation_cnt, string.format('%s', self.rr))
        end
 })
index 7b2eceb9924987d3e32a27fc73aca9d7718ed25c..a765781d79fa52d1ec7230c9feb8b5217f3cc918 100644 (file)
@@ -46,6 +46,17 @@ bool kr_rank_check(uint8_t rank)
        }
 }
 
+bool kr_rank_test(uint8_t rank, uint8_t kr_flag)
+{
+       assert(kr_rank_check(rank) && kr_rank_check(kr_flag));
+       if (kr_flag == KR_RANK_AUTH) {
+               return rank & KR_RANK_AUTH;
+       }
+       assert(!(kr_flag & KR_RANK_AUTH));
+       /* The rest are exclusive values - exactly one has to be set. */
+       return (rank & ~KR_RANK_AUTH) == kr_flag;
+}
+
 /** @internal Set @a yielded to all RRs with matching @a qry_uid. */
 static void set_yield(ranked_rr_array_t *array, const uint32_t qry_uid, const bool yielded)
 {
index bf75b18f94bf8b94267567d65e54b6011dc02d11..17d16f1ae28a88d80262350c4a5e4697f7c38cdd 100644 (file)
@@ -110,16 +110,7 @@ enum kr_rank {
 bool kr_rank_check(uint8_t rank) KR_PURE;
 
 /** Test the presence of any flag/state in a rank, i.e. including KR_RANK_AUTH. */
-static inline bool kr_rank_test(uint8_t rank, uint8_t kr_flag)
-{
-       assert(kr_rank_check(rank) && kr_rank_check(kr_flag));
-       if (kr_flag == KR_RANK_AUTH) {
-               return rank & KR_RANK_AUTH;
-       }
-       assert(!(kr_flag & KR_RANK_AUTH));
-       /* The rest are exclusive values - exactly one has to be set. */
-       return (rank & ~KR_RANK_AUTH) == kr_flag;
-}
+bool kr_rank_test(uint8_t rank, uint8_t kr_flag) KR_PURE KR_EXPORT;
 
 /** Set the rank state. The _AUTH flag is kept as it was. */
 static inline void kr_rank_set(uint8_t *rank, uint8_t kr_flag)