From: Petr Špaček Date: Fri, 7 Aug 2020 08:47:49 +0000 (+0200) Subject: policy.DEBUG: translate rank values to human readable names X-Git-Tag: v5.1.3~16^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f61d2055330ebc32656d68d3fcea68ed7c865c5a;p=thirdparty%2Fknot-resolver.git policy.DEBUG: translate rank values to human readable names 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. --- diff --git a/daemon/lua/kres-gen.lua b/daemon/lua/kres-gen.lua index d22e82527..9dc6efb95 100644 --- a/daemon/lua/kres-gen.lua +++ b/daemon/lua/kres-gen.lua @@ -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); diff --git a/daemon/lua/kres-gen.sh b/daemon/lua/kres-gen.sh index 309b7f1d7..d2300c5c0 100755 --- a/daemon/lua/kres-gen.sh +++ b/daemon/lua/kres-gen.sh @@ -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 diff --git a/daemon/lua/kres.lua b/daemon/lua/kres.lua index d859fda96..13021d091 100644 --- a/daemon/lua/kres.lua +++ b/daemon/lua/kres.lua @@ -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 }) diff --git a/lib/resolve.c b/lib/resolve.c index 7b2eceb99..a765781d7 100644 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -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) { diff --git a/lib/resolve.h b/lib/resolve.h index bf75b18f9..17d16f1ae 100644 --- a/lib/resolve.h +++ b/lib/resolve.h @@ -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)