From fee90af59a465544ff0aa26cf33636f4e46df935 Mon Sep 17 00:00:00 2001 From: Lubos Slovak <lubos.slovak@nic.cz> Date: Wed, 4 Sep 2013 15:52:39 +0200 Subject: [PATCH] Added DNSSEC debug messages. refs #4 --- configure.ac | 1 + src/knot/server/zones.c | 10 +++++++ src/libknot/dnssec/zone-events.c | 10 ++++++- src/libknot/dnssec/zone-nsec.c | 17 ++++++++++- src/libknot/dnssec/zone-sign.c | 11 ++++---- src/libknot/util/debug.h | 48 ++++++++++++++++++++++++++++++++ 6 files changed, 90 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index 168de915b..7f86e2bdb 100644 --- a/configure.ac +++ b/configure.ac @@ -93,6 +93,7 @@ AC_ARG_ENABLE([debug], hash) AC_DEFINE([KNOT_HASH_DEBUG], [1], [Hashtable debug.]) ;; compiler) AC_DEFINE([KNOT_COMPILER_DEBUG], [1], [Zone compiler debug.]) ;; stash) AC_DEFINE([KNOT_STASH_DEBUG], [1], [Hash table stash debug.]) ;; + dnssec) AC_DEFINE([KNOT_DNSSEC_DEBUG], [1], [DNSSEC debug.]) ;; esac done ], []) diff --git a/src/knot/server/zones.c b/src/knot/server/zones.c index eeb68c293..31108411e 100644 --- a/src/knot/server/zones.c +++ b/src/knot/server/zones.c @@ -1005,6 +1005,8 @@ static int zones_journal_apply(knot_zone_t *zone) log_server_info("Zone '%s' serial %u -> %u.\n", zd->conf->name, serial, knot_zone_serial(contents)); + dbg_zones("Old zone contents: %p, new: %p\n", + zone->contents, contents); rcu_read_unlock(); apply_ret = xfrin_switch_zone(zone, contents, XFR_TYPE_IIN); @@ -1356,6 +1358,10 @@ static int zones_insert_zone(conf_zone_t *z, knot_zone_t **dst, /* Ensure both new and old have zone contents. */ knot_zone_contents_t *zc = knot_zone_get_contents(zone); knot_zone_contents_t *zc_old = knot_zone_get_contents(z_old); + + dbg_zones("Going to calculate diff. Old contents: %p, new: %p\n", + zc_old, zc); + knot_changesets_t *diff_chs = NULL; if (z->build_diffs && zc && zc_old && zone_changed) { diff_chs = knot_changesets_create(KNOT_CHANGESET_TYPE_IXFR); @@ -1370,6 +1376,7 @@ static int zones_insert_zone(conf_zone_t *z, knot_zone_t **dst, rcu_read_unlock(); return KNOT_ENOMEM; } + dbg_zones(stderr, "Generating diff.\n"); int ret = zones_create_changeset(z_old, zone, diff_ch); if (ret == KNOT_ENODIFF) { @@ -1418,6 +1425,9 @@ static int zones_insert_zone(conf_zone_t *z, knot_zone_t **dst, knot_update_serial_t soa_up = zones_changesets_empty(diff_chs) ? KNOT_SOA_SERIAL_INC : KNOT_SOA_SERIAL_KEEP; + + dbg_zones(stderr, "Signing zone, serial policy: %d\n", + soa_up); int ret = knot_dnssec_zone_sign(zone, sec_ch, soa_up); if (ret != KNOT_EOK) { knot_changesets_free(&diff_chs); diff --git a/src/libknot/dnssec/zone-events.c b/src/libknot/dnssec/zone-events.c index 371479781..d3d06a39a 100644 --- a/src/libknot/dnssec/zone-events.c +++ b/src/libknot/dnssec/zone-events.c @@ -25,6 +25,7 @@ #include "libknot/dnssec/zone-keys.h" #include "libknot/dnssec/policy.h" #include "libknot/zone/zone.h" +#include "libknot/util/debug.h" static uint32_t time_now(void) { @@ -50,10 +51,13 @@ static void init_forced_policy(knot_dnssec_policy_t *p, static int zone_sign(knot_zone_t *zone, knot_changeset_t *out_ch, bool force, knot_update_serial_t soa_up) { - if (zone == NULL) { + if (zone == NULL) { return KNOT_EINVAL; } + dbg_dnssec_verb("Changeset emtpy before generating NSEC chain: %d\n", + knot_changeset_is_empty(out_ch)); + conf_zone_t *zone_config = ((zonedata_t *)knot_zone_data(zone))->conf; int result = KNOT_EOK; @@ -104,6 +108,8 @@ static int zone_sign(knot_zone_t *zone, knot_changeset_t *out_ch, bool force, free_zone_keys(&zone_keys); return result; } + dbg_dnssec_verb("Changeset emtpy after generating NSEC chain: %d\n", + knot_changeset_is_empty(out_ch)); // add missing signatures result = knot_zone_sign(zone->contents, &zone_keys, &policy, out_ch); @@ -116,6 +122,8 @@ static int zone_sign(knot_zone_t *zone, knot_changeset_t *out_ch, bool force, free_zone_keys(&zone_keys); return result; } + dbg_dnssec_verb("Changeset emtpy after signing: %d\n", + knot_changeset_is_empty(out_ch)); // Check if only SOA changed if (knot_changeset_is_empty(out_ch) && diff --git a/src/libknot/dnssec/zone-nsec.c b/src/libknot/dnssec/zone-nsec.c index 805aff8dd..36481f6db 100644 --- a/src/libknot/dnssec/zone-nsec.c +++ b/src/libknot/dnssec/zone-nsec.c @@ -29,6 +29,7 @@ #include "libknot/util/utils.h" #include "libknot/zone/zone-contents.h" #include "libknot/zone/zone-diff.h" +#include "libknot/util/debug.h" /* - NSEC chain iteration -------------------------------------------------- */ @@ -195,6 +196,9 @@ static int connect_nsec_nodes(knot_node_t *a, knot_node_t *b, void *d) { nsec_chain_iterate_data_t *data = (nsec_chain_iterate_data_t *)d; + dbg_dnssec_detail("Changeset emtpy during generating NSEC chain: %d\n", + knot_changeset_is_empty(data->changeset)); + knot_rrset_t *old_nsec = knot_node_get_rrset(a, KNOT_RRTYPE_NSEC); int ret = 0; @@ -202,6 +206,12 @@ static int connect_nsec_nodes(knot_node_t *a, knot_node_t *b, void *d) // just remove the NSEC and its RRSIG, they are redundant if (old_nsec != NULL && knot_node_rrset_count(a) == KNOT_NODE_RRSET_COUNT_ONLY_NSEC) { + fprintf(stderr, "foobar\n"); +dbg_dnssec_exec_detail( + char *name = knot_dname_to_str(knot_rrset_owner(old_nsec)); + dbg_dnssec_detail("Removing NSEC at %s.\n", name); + free(name); +); ret = changeset_remove_nsec(old_nsec, data->changeset); return ret; } @@ -217,17 +227,21 @@ static int connect_nsec_nodes(knot_node_t *a, knot_node_t *b, void *d) knot_rrset_t *new_nsec = create_nsec_rrset(knot_node_owner(a), knot_node_owner(b), &rr_types, data->ttl); - if (!new_nsec) + if (!new_nsec) { + dbg_dnssec_detail("Failed to create new NSEC.\n"); return KNOT_ENOMEM; + } if (old_nsec != NULL) { // current NSEC is valid, do nothing if (knot_rrset_equal(new_nsec, old_nsec, KNOT_RRSET_COMPARE_WHOLE)) { + dbg_dnssec_detail("NSECs equal.\n"); knot_rrset_deep_free(&new_nsec, 1, 1); return KNOT_EOK; } + dbg_dnssec_detail("NSECs not equal, replacing.\n"); // current NSEC is invalid, replace it and drop RRSIG // mark the node, so later we know this NSEC needs new RRSIGs knot_node_set_replaced_nsec(a); @@ -238,6 +252,7 @@ static int connect_nsec_nodes(knot_node_t *a, knot_node_t *b, void *d) } } + dbg_dnssec_detail("Adding new NSEC to changeset.\n"); // Add new NSEC to the changeset (no matter if old was removed) return knot_changeset_add_rrset(data->changeset, new_nsec, KNOT_CHANGESET_ADD); diff --git a/src/libknot/dnssec/zone-sign.c b/src/libknot/dnssec/zone-sign.c index 801ac272f..444cd0cfa 100644 --- a/src/libknot/dnssec/zone-sign.c +++ b/src/libknot/dnssec/zone-sign.c @@ -574,8 +574,7 @@ static int add_rrsigs_for_nsec(knot_rrset_t *rrset, void *data) } if (res != KNOT_EOK) { - fprintf(stderr, "add_rrsigs_for_nsec() for NSEC" - "failed\n"); + dbg_dnssec_detail("add_rrsigs_for_nsec() for NSEC failed\n"); } return res; @@ -617,21 +616,21 @@ int knot_zone_sign(const knot_zone_contents_t *zone, result = zone_tree_sign(zone->nodes, zone_keys, policy, out_ch); if (result != KNOT_EOK) { - fprintf(stderr, "zone_tree_sign() on normal nodes failed\n"); + dbg_dnssec_detail("zone_tree_sign() on normal nodes failed\n"); return result; } result = zone_tree_sign(zone->nsec3_nodes, zone_keys, policy, out_ch); if (result != KNOT_EOK) { - fprintf(stderr, "zone_tree_sign() on nsec3 nodes failed\n"); + dbg_dnssec_detail("zone_tree_sign() on nsec3 nodes failed\n"); return result; } // sign all NSEC and NSEC3 RRs in changeset result = sign_nsec(zone_keys, policy, out_ch); if (result != KNOT_EOK) { - fprintf(stderr, "sign_nsec() failed\n"); + dbg_dnssec_detail("sign_nsec() failed\n"); return result; } @@ -656,6 +655,8 @@ int knot_zone_sign_update_soa(const knot_zone_contents_t *zone, const knot_dnssec_policy_t *policy, knot_changeset_t *changeset) { + dbg_dnssec_verb("Updating SOA...\n"); + knot_node_t *apex = knot_zone_contents_get_apex(zone); knot_rrset_t *soa = knot_node_get_rrset(apex, KNOT_RRTYPE_SOA); diff --git a/src/libknot/util/debug.h b/src/libknot/util/debug.h index 826260a10..f4a51a292 100644 --- a/src/libknot/util/debug.h +++ b/src/libknot/util/debug.h @@ -873,6 +873,54 @@ void knot_zone_contents_dump(knot_zone_contents_t *zone); #define dbg_rrset_exec_detail(cmds) #endif +#ifdef KNOT_DNSSEC_DEBUG + +/* Brief messages. */ +#ifdef DEBUG_ENABLE_BRIEF +#define dbg_dnssec(msg...) log_msg(LOG_SERVER, LOG_DEBUG, msg) +#define dbg_dnssec_hex(data, len) hex_log(LOG_SERVER, (data), (len)) +#define dbg_dnssec_exec(cmds) do { cmds } while (0) +#else +#define dbg_dnssec(msg...) +#define dbg_dnssec_hex(data, len) +#define dbg_dnssec_exec(cmds) +#endif + +/* Verbose messages. */ +#ifdef DEBUG_ENABLE_VERBOSE +#define dbg_dnssec_verb(msg...) log_msg(LOG_SERVER, LOG_DEBUG, msg) +#define dbg_dnssec_hex_verb(data, len) hex_log(LOG_SERVER, (data), (len)) +#define dbg_dnssec_exec_verb(cmds) do { cmds } while (0) +#else +#define dbg_dnssec_verb(msg...) +#define dbg_dnssec_hex_verb(data, len) +#define dbg_dnssec_exec_verb(cmds) +#endif + +/* Detail messages. */ +#ifdef DEBUG_ENABLE_DETAILS +#define dbg_dnssec_detail(msg...) log_msg(LOG_SERVER, LOG_DEBUG, msg) +#define dbg_dnssec_hex_detail(data, len) hex_log(LOG_SERVER, (data), (len)) +#define dbg_dnssec_exec_detail(cmds) do { cmds } while (0) +#else +#define dbg_dnssec_detail(msg...) +#define dbg_dnssec_hex_detail(data, len) +#define dbg_dnssec_exec_detail(cmds) +#endif + +/* No messages. */ +#else +#define dbg_dnssec(msg...) +#define dbg_dnssec_hex(data, len) +#define dbg_dnssec_exec(cmds) +#define dbg_dnssec_verb(msg...) +#define dbg_dnssec_hex_verb(data, len) +#define dbg_dnssec_exec_verb(cmds) +#define dbg_dnssec_detail(msg...) +#define dbg_dnssec_hex_detail(data, len) +#define dbg_dnssec_exec_detail(cmds) +#endif + /******************************************************************************/ #endif /* _KNOT_DEBUG_H_ */ -- GitLab