From ba63bb981af2189c23b36815d673acd76be5d88a Mon Sep 17 00:00:00 2001
From: Jan Kadlec <jan.kadlec@nic.cz>
Date: Tue, 6 May 2014 13:51:22 +0200
Subject: [PATCH] zone-events: Removed TSIG todos, moved serial checking.

---
 src/knot/nameserver/axfr.c | 16 ++++++----------
 src/knot/nameserver/ixfr.c | 18 ++----------------
 src/knot/zone/zone.c       | 14 ++++++++++++++
 src/knot/zone/zone.h       |  4 ++++
 4 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/src/knot/nameserver/axfr.c b/src/knot/nameserver/axfr.c
index 5fcad8e68..3d401b3f7 100644
--- a/src/knot/nameserver/axfr.c
+++ b/src/knot/nameserver/axfr.c
@@ -225,7 +225,7 @@ int axfr_query(knot_pkt_t *pkt, struct query_data *qdata)
 		return NS_PROC_DONE;
 		break;
 	default:          /* Generic error. */
-		AXFROUT_LOG(LOG_ERR, "%s", knot_strerror(ret));
+		AXFROUT_LOG(LOG_ERR, "Failed: %s", knot_strerror(ret));
 		return NS_PROC_FAIL;
 	}
 }
@@ -329,12 +329,6 @@ static int process_axfr_packet(knot_pkt_t *pkt, struct xfr_proc *proc)
 		const knot_rrset_t *rr = &answer->rr[i];
 		if (rr->type == KNOT_RRTYPE_SOA &&
 		    node_rrtype_exists(zc.z->apex, KNOT_RRTYPE_SOA)) {
-			// Last SOA, last message, check TSIG.
-//			int ret = xfrin_check_tsig(pkt, xfr, 1);
-#warning TODO: TSIG API
-//			if (ret != KNOT_EOK) {
-//				return ret;
-//			}
 			return NS_PROC_DONE;
 		} else {
 			int ret = zcreator_step(&zc, rr);
@@ -344,9 +338,6 @@ static int process_axfr_packet(knot_pkt_t *pkt, struct xfr_proc *proc)
 		}
 	}
 
-	// Check possible TSIG at the end of DNS message.
-//	return xfrin_check_tsig(pkt, xfr, knot_ns_tsig_required(xfr->packet_nr));
-#warning TODO: TSIG API
 	return NS_PROC_MORE;
 }
 
@@ -356,6 +347,11 @@ int axfr_process_answer(knot_pkt_t *pkt, struct answer_data *data)
 	int ret = KNOT_EOK;
 	if (data->ext == NULL) {
 		NS_NEED_TSIG_SIGNED(&data->param->tsig_ctx, 0);
+		if (!zone_transfer_needed(data->param->zone, pkt)) {
+			AXFRIN_LOG(LOG_INFO, "Zone is up-to-date.");
+			return NS_PROC_DONE;
+		}
+
 		ret = axfr_answer_init(data);
 		if (ret != KNOT_EOK) {
 			return NS_PROC_FAIL;
diff --git a/src/knot/nameserver/ixfr.c b/src/knot/nameserver/ixfr.c
index 163eed169..75bdaab75 100644
--- a/src/knot/nameserver/ixfr.c
+++ b/src/knot/nameserver/ixfr.c
@@ -319,6 +319,7 @@ static int ixfrin_answer_init(struct answer_data *data)
 	}
 	proc->state = IXFR_START;
 	proc->zone = data->param->zone;
+	proc->mm = data->mm;
 
 	data->ext = proc;
 	data->ext_cleanup = &ixfrin_cleanup;
@@ -515,19 +516,6 @@ static bool out_of_zone(const knot_rrset_t *rr, struct ixfr_proc *proc)
 	       !knot_dname_is_equal(rr->owner, proc->zone->name);
 }
 
-/*! \brief Returns true if final SOA in transfer has newer serial than zone */
-static bool transfer_needed(const zone_t *zone, const knot_pkt_t *pkt)
-{
-	const knot_pktsection_t *answer = knot_pkt_section(pkt, KNOT_ANSWER);
-	const knot_rrset_t soa = answer->rr[0];
-	if (soa.type != KNOT_RRTYPE_SOA) {
-		return false;
-	}
-
-	return knot_serial_compare(zone_contents_serial(zone->contents),
-	                           knot_soa_serial(&soa.rrs)) < 0;
-}
-
 /*!
  * \brief Processes IXFR reply packet and fills in the changesets structure.
  *
@@ -568,8 +556,6 @@ static int process_ixfrin_packet(knot_pkt_t *pkt, struct answer_data *adata)
 		}
 	}
 
-#warning TODO TSIG
-
 	return NS_PROC_MORE;
 }
 
@@ -642,7 +628,7 @@ int ixfr_process_answer(knot_pkt_t *pkt, struct answer_data *adata)
 {
 	if (adata->ext == NULL) {
 		NS_NEED_TSIG_SIGNED(&adata->param->tsig_ctx, 0);
-		if (!transfer_needed(adata->param->zone, pkt)) {
+		if (!zone_transfer_needed(adata->param->zone, pkt)) {
 			IXFRIN_LOG(LOG_INFO, "Server has newer zone.");
 			return NS_PROC_DONE;
 		}
diff --git a/src/knot/zone/zone.c b/src/knot/zone/zone.c
index 58448ae17..816dc5060 100644
--- a/src/knot/zone/zone.c
+++ b/src/knot/zone/zone.c
@@ -32,6 +32,7 @@
 #include "libknot/dname.h"
 #include "libknot/dnssec/random.h"
 #include "libknot/util/utils.h"
+#include "libknot/rdata/soa.h"
 
 /*!
  * \brief Set ACL list from configuration.
@@ -354,3 +355,16 @@ struct request_data *zone_update_dequeue(zone_t *zone)
 
 	return ret;
 }
+
+bool zone_transfer_needed(const zone_t *zone, const knot_pkt_t *pkt)
+{
+	const knot_pktsection_t *answer = knot_pkt_section(pkt, KNOT_ANSWER);
+	const knot_rrset_t soa = answer->rr[0];
+	if (soa.type != KNOT_RRTYPE_SOA) {
+		return false;
+	}
+
+	return knot_serial_compare(zone_contents_serial(zone->contents),
+	                           knot_soa_serial(&soa.rrs)) < 0;
+}
+
diff --git a/src/knot/zone/zone.h b/src/knot/zone/zone.h
index 5ce5106b4..0724fa52b 100644
--- a/src/knot/zone/zone.h
+++ b/src/knot/zone/zone.h
@@ -141,4 +141,8 @@ int zone_update_enqueue(zone_t *zone, knot_pkt_t *pkt, struct process_query_para
 /*! \brief Dequeue UPDATE request. */
 struct request_data *zone_update_dequeue(zone_t *zone);
 
+/*! \brief Returns true if final SOA in transfer has newer serial than zone */
+bool zone_transfer_needed(const zone_t *zone, const knot_pkt_t *pkt);
+
+
 /*! @} */
-- 
GitLab