From a91694a4ecf93d6ffdb296bd76ce6aa4801899b0 Mon Sep 17 00:00:00 2001
From: Jan Vcelak <jan.vcelak@nic.cz>
Date: Mon, 13 Jun 2016 12:42:19 +0200
Subject: [PATCH] move requestor from libknot to knot

---
 src/Makefile.am                               |  12 +-
 src/knot/modules/dnsproxy.c                   |   2 +-
 src/knot/nameserver/internet.h                |   2 +-
 src/knot/nameserver/process_query.h           |   2 +-
 src/knot/query/capture.h                      |   2 +-
 .../processing => knot/query}/layer.c         |   4 +-
 .../processing => knot/query}/layer.h         |  12 +-
 .../processing => knot/query}/overlay.c       |   4 +-
 .../processing => knot/query}/overlay.h       |  14 +-
 .../processing => knot/query}/requestor.c     |   4 +-
 .../processing => knot/query}/requestor.h     |   4 +-
 src/knot/server/tcp-handler.c                 |   2 +-
 src/libknot/libknot.h                         |   3 -
 src/libknot/processing/README.md              | 139 ------------------
 src/libknot/processing/doc/requestor.png      | Bin 26920 -> 0 bytes
 tests/requestor.c                             |   4 +-
 16 files changed, 24 insertions(+), 186 deletions(-)
 rename src/{libknot/processing => knot/query}/layer.c (94%)
 rename src/{libknot/processing => knot/query}/layer.h (93%)
 rename src/{libknot/processing => knot/query}/overlay.c (96%)
 rename src/{libknot/processing => knot/query}/overlay.h (90%)
 rename src/{libknot/processing => knot/query}/requestor.c (98%)
 rename src/{libknot/processing => knot/query}/requestor.h (97%)
 delete mode 100644 src/libknot/processing/README.md
 delete mode 100644 src/libknot/processing/doc/requestor.png

diff --git a/src/Makefile.am b/src/Makefile.am
index 93afbbed5f..0970e76e8b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -115,9 +115,6 @@ nobase_libknot_la_HEADERS =			\
 	libknot/packet/pkt.h			\
 	libknot/packet/rrset-wire.h		\
 	libknot/packet/wire.h			\
-	libknot/processing/layer.h		\
-	libknot/processing/overlay.h		\
-	libknot/processing/requestor.h		\
 	libknot/rdata.h				\
 	libknot/rdataset.h			\
 	libknot/rrset-dump.h			\
@@ -153,9 +150,6 @@ libknot_la_SOURCES =				\
 	libknot/packet/pkt.c			\
 	libknot/packet/rrset-wire.c		\
 	libknot/packet/wire.c			\
-	libknot/processing/layer.c		\
-	libknot/processing/overlay.c		\
-	libknot/processing/requestor.c		\
 	libknot/rdata.c				\
 	libknot/rdataset.c			\
 	libknot/rrset-dump.c			\
@@ -336,8 +330,14 @@ libknotd_la_SOURCES =				\
 	knot/nameserver/update.h		\
 	knot/query/capture.c			\
 	knot/query/capture.h			\
+	knot/query/layer.c			\
+	knot/query/layer.h			\
+	knot/query/overlay.c			\
+	knot/query/overlay.h			\
 	knot/query/query.c			\
 	knot/query/query.h			\
+	knot/query/requestor.c			\
+	knot/query/requestor.h			\
 	knot/common/evsched.c			\
 	knot/common/evsched.h			\
 	knot/common/fdset.c			\
diff --git a/src/knot/modules/dnsproxy.c b/src/knot/modules/dnsproxy.c
index 634f70a41e..a194b26532 100644
--- a/src/knot/modules/dnsproxy.c
+++ b/src/knot/modules/dnsproxy.c
@@ -14,7 +14,7 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "libknot/processing/requestor.h"
+#include "knot/query/requestor.h"
 #include "knot/common/log.h"
 #include "knot/modules/dnsproxy.h"
 #include "knot/query/capture.h"
diff --git a/src/knot/nameserver/internet.h b/src/knot/nameserver/internet.h
index 9d968ffa9d..e0b5d81e18 100644
--- a/src/knot/nameserver/internet.h
+++ b/src/knot/nameserver/internet.h
@@ -25,7 +25,7 @@
 #pragma once
 
 #include "libknot/packet/pkt.h"
-#include "libknot/processing/layer.h"
+#include "knot/query/layer.h"
 
 /* Query data (from query processing). */
 struct query_data;
diff --git a/src/knot/nameserver/process_query.h b/src/knot/nameserver/process_query.h
index 518e2e5661..d57eef13a4 100644
--- a/src/knot/nameserver/process_query.h
+++ b/src/knot/nameserver/process_query.h
@@ -24,7 +24,7 @@
 
 #pragma once
 
-#include "libknot/processing/layer.h"
+#include "knot/query/layer.h"
 #include "knot/server/server.h"
 #include "knot/updates/acl.h"
 #include "contrib/sockaddr.h"
diff --git a/src/knot/query/capture.h b/src/knot/query/capture.h
index 9aeca7ee36..2d1e65aed9 100644
--- a/src/knot/query/capture.h
+++ b/src/knot/query/capture.h
@@ -16,7 +16,7 @@
 
 #pragma once
 
-#include "libknot/processing/layer.h"
+#include "knot/query/layer.h"
 #include "libknot/packet/pkt.h"
 
 /*!
diff --git a/src/libknot/processing/layer.c b/src/knot/query/layer.c
similarity index 94%
rename from src/libknot/processing/layer.c
rename to src/knot/query/layer.c
index c920eb3473..991f54c4b3 100644
--- a/src/libknot/processing/layer.c
+++ b/src/knot/query/layer.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -17,7 +17,7 @@
 #include <assert.h>
 
 #include "libknot/attribute.h"
-#include "libknot/processing/layer.h"
+#include "knot/query/layer.h"
 
 /*! \brief Helper for conditional layer call. */
 #define LAYER_CALL(layer, func, ...) \
diff --git a/src/libknot/processing/layer.h b/src/knot/query/layer.h
similarity index 93%
rename from src/libknot/processing/layer.h
rename to src/knot/query/layer.h
index 110770b086..60e1453a9d 100644
--- a/src/libknot/processing/layer.h
+++ b/src/knot/query/layer.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -13,14 +13,6 @@
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-/*!
- * \file layer.h
- *
- * \author Marek Vavrusa <marek.vavrusa@nic.cz>
- *
- * \addtogroup query_processing
- * @{
- */
 
 #pragma once
 
@@ -111,5 +103,3 @@ int knot_layer_consume(knot_layer_t *ctx, knot_pkt_t *pkt);
  * \return Layer state.
  */
 int knot_layer_produce(knot_layer_t *ctx, knot_pkt_t *pkt);
-
-/*! @} */
diff --git a/src/libknot/processing/overlay.c b/src/knot/query/overlay.c
similarity index 96%
rename from src/libknot/processing/overlay.c
rename to src/knot/query/overlay.c
index 9d52625d48..485f1e51a4 100644
--- a/src/libknot/processing/overlay.c
+++ b/src/knot/query/overlay.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
  */
 
 #include "libknot/attribute.h"
-#include "libknot/processing/overlay.h"
+#include "knot/query/overlay.h"
 #include "libknot/errcode.h"
 #include "contrib/mempattern.h"
 #include "contrib/ucw/lists.h"
diff --git a/src/libknot/processing/overlay.h b/src/knot/query/overlay.h
similarity index 90%
rename from src/libknot/processing/overlay.h
rename to src/knot/query/overlay.h
index 1705feb6b4..271369ae66 100644
--- a/src/libknot/processing/overlay.h
+++ b/src/knot/query/overlay.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -13,18 +13,10 @@
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-/*!
- * \file overlay.h
- *
- * \author Marek Vavrusa <marek.vavrusa@nic.cz>
- *
- * \addtogroup query_processing
- * @{
- */
 
 #pragma once
 
-#include "libknot/processing/layer.h"
+#include "knot/query/layer.h"
 
 /*! \brief Processsing overlay (list of aggregated FSMs). */
 struct knot_overlay {
@@ -99,5 +91,3 @@ int knot_overlay_consume(struct knot_overlay *overlay, knot_pkt_t *pkt);
  * \return Overlay state.
  */
 int knot_overlay_produce(struct knot_overlay *overlay, knot_pkt_t *pkt);
-
-/*! @} */
diff --git a/src/libknot/processing/requestor.c b/src/knot/query/requestor.c
similarity index 98%
rename from src/libknot/processing/requestor.c
rename to src/knot/query/requestor.c
index a08257781b..1b9e9c00ad 100644
--- a/src/libknot/processing/requestor.c
+++ b/src/knot/query/requestor.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -17,7 +17,7 @@
 #include <assert.h>
 
 #include "libknot/attribute.h"
-#include "libknot/processing/requestor.h"
+#include "knot/query/requestor.h"
 #include "libknot/errcode.h"
 #include "contrib/mempattern.h"
 #include "contrib/net.h"
diff --git a/src/libknot/processing/requestor.h b/src/knot/query/requestor.h
similarity index 97%
rename from src/libknot/processing/requestor.h
rename to src/knot/query/requestor.h
index 5d38507753..853a03723f 100644
--- a/src/libknot/processing/requestor.h
+++ b/src/knot/query/requestor.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 #include <sys/socket.h>
 #include <sys/time.h>
 
-#include "libknot/processing/overlay.h"
+#include "knot/query/overlay.h"
 #include "libknot/rrtype/tsig.h"
 #include "libknot/mm_ctx.h"
 
diff --git a/src/knot/server/tcp-handler.c b/src/knot/server/tcp-handler.c
index b9e79fb743..b0abbf57d1 100644
--- a/src/knot/server/tcp-handler.c
+++ b/src/knot/server/tcp-handler.c
@@ -37,7 +37,7 @@
 #include "knot/common/fdset.h"
 #include "knot/common/log.h"
 #include "knot/nameserver/process_query.h"
-#include "libknot/processing/overlay.h"
+#include "knot/query/overlay.h"
 #include "contrib/macros.h"
 #include "contrib/mempattern.h"
 #include "contrib/net.h"
diff --git a/src/libknot/libknot.h b/src/libknot/libknot.h
index 0411813b06..90be83c4ca 100644
--- a/src/libknot/libknot.h
+++ b/src/libknot/libknot.h
@@ -48,9 +48,6 @@
 #include "libknot/packet/pkt.h"
 #include "libknot/packet/rrset-wire.h"
 #include "libknot/packet/wire.h"
-#include "libknot/processing/layer.h"
-#include "libknot/processing/overlay.h"
-#include "libknot/processing/requestor.h"
 #include "libknot/rrtype/aaaa.h"
 #include "libknot/rrtype/dnskey.h"
 #include "libknot/rrtype/ds.h"
diff --git a/src/libknot/processing/README.md b/src/libknot/processing/README.md
deleted file mode 100644
index 9c65cbb097..0000000000
--- a/src/libknot/processing/README.md
+++ /dev/null
@@ -1,139 +0,0 @@
-# libknot processing interface
-
-libknot provides generic interfaces for producer/consumer type problems and a way to layer them.
-This is heavily leveraged for packet processing and modules, and enables us to build independent
-data processors and state machines driving them.
-
-## Building blocks
-
-### layer.h
-
-layer represents a set of functions implementing an interface, with 5 possible callbacks:
-
-```c
-	int begin(knot_layer_t *ctx, void *layer_param);
-	int reset(knot_layer_t *ctx);
-	int finish(knot_layer_t *ctx);
-	int consume(knot_layer_t *ctx, knot_pkt_t *pkt);
-	int produce(knot_layer_t *ctx, knot_pkt_t *pkt);
-	int fail(knot_layer_t *ctx, knot_pkt_t *pkt);
-```
-
-An good example of the layer is a [query processor](../../knot/nameserver/process_query.c), where, to give you an example,
-an action `consume` represents query-parsing step, `produce` represents answer generator and `fail` an error response generator.
-
-*Note that*, a layer does not assume anything about the driver, but may enforce call order by requiring the context to be in a specific
-processing state, see `knot_layer_t.state`, and move the driver to next desired state.
-For example, operation `consume` may require the driver to be in `KNOT_STATE_NOOP` and emit:
-
-* `KNOT_STATE_FAIL` if the query is wrong
-* `KNOT_STATE_DONE` if the query doesn't warrant an answer
-* `KNOT_STATE_PRODUCE` if it found an answer
-* `KNOT_STATE_CONSUME` if it requires more queries
-
-*Note that*, I'm using terms "state" and "action" very loosely. State is usually written capitalized and action in lowercase.
-They are named similarly as they're usually cause and effect, a `CONSUME` state leads to `consume` reaction, but that's not always the case.
-
-### overlay.h
-
-An overlay is a stack of layers. It provides similar interface as layer, but their actions are chained.
-The call order goes from the first to the last for all actions. The state emitted from the previous action is
-given as an input to the next action. Example:
-
-```c
-	/* Stack layers. */
-	knot_overlay_add(overlay, first,  param1);
-	knot_overlay_add(overlay, second, param2);
-	knot_overlay_add(overlay, third,  param3);
-	/* Execute */
-	knot_overlay_consume(overlay, pkt);
-```
-Leads to following execution:
-
-```
-	consume(first, pkt)
-	  => consume(second, pkt)
-	     => consume(third, pkt) => FINAL_STATE
-```
-
-*Note that*, an overlay calls `begin` operation as soon as a layer is added into the overlay.
-
-### requestor.h
-
-A requestor is a specific state-machine that in general:
-
-1. prepares a query by passing it to the `produce` overlay action
-2. sends the query and receives response
-3. consumes the response by passing it to the `consume` overlay action
-
-The query may not always be produced, and the I/O or `consume` action may fail, 
-so we get a state machine roughly like this:
-
-![Requestor state machine](doc/requestor.png)
-
-The actual requestor also resets the overlay after each failed attempt, so for example a query may be retransmitted,
-but you get the idea.
-
-The requestor is used for various tasks from server-initiated connections to forwarding queries, and the system of modules
-allows you to extend these operations by adding new layers. A query log might be a good example, as you can monitor not only the
-sent queries and received responses, but also the state of the query processor.
-
-## Example
-
-### Query log
-
-Here's an example of a query log, that can track incoming queries and error responses.
-
-```c
-/*! Track incoming queries. */
-static int dnstrack_query(knot_layer_t *ctx, knot_pkt_t *pkt)
-{
-	char qname[KNOT_DNAME_MAXLEN];
-	knot_dname_to_str(qname, knot_pkt_qname(pkt), sizeof(qname));
-	printf("=> query '%s', parser state: %d\n", qname, ctx->state);
-	return ctx->state; /* Pass-through */
-}
-
-/*! Track error responses. */
-static int dnstrack_fail(knot_layer_t *ctx, knot_pkt_t *pkt)
-{
-	char qname[KNOT_DNAME_MAXLEN];
-	knot_dname_to_str(qname, knot_pkt_qname(pkt), sizeof(qname));
-	printf("=> answer to '%s', rcode: %d\n",
-	       qname, knot_wire_get_rcode(pkt->wire));	
-	return ctx->state;
-}
-
-/*! Module implementation. */
-const knot_layer_api_t *dnstrack_layer(void)
-{
-	static const knot_layer_api_t api = {
-		.consume = &dnstrack_query,
-		.fail    = &dnstrack_fail
-	};
-	return &api;
-}
-
-```
-
-Now you can try it in an overlay. The following is a simplified snippet from the UDP query processor,
-to showcase the real-world usage:
-
-```c
-	/* Prepare overlay */
-	struct knot_overlay overlay;
-	knot_overlay_init(&overlay, NULL);
-	knot_overlay_add(&overlay, process_query_layer(), &param);
-	knot_overlay_add(&overlay, dnstrack_layer(), NULL);
-
-	/* Process packet */
-	int state = knot_overlay_consume(&overlay, query);
-	while (state & (KNOT_STATE_PRODUCE|KNOT_STATE_FAIL)) {
-		state = knot_overlay_produce(&overlay, answer);
-	}
-
-	/* Finalize. */
-	knot_overlay_finish(&overlay);
-	knot_overlay_deinit(&overlay);
-```
-
diff --git a/src/libknot/processing/doc/requestor.png b/src/libknot/processing/doc/requestor.png
deleted file mode 100644
index 522fc4b8030c6b921993ab42ff3b6575942c3667..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 26920
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%0A@pOFHZ%d-^;
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

diff --git a/tests/requestor.c b/tests/requestor.c
index c23938f2de..ab8a6b4661 100644
--- a/tests/requestor.c
+++ b/tests/requestor.c
@@ -22,8 +22,8 @@
 #include <fcntl.h>
 
 #include "knot/conf/conf.h"
-#include "libknot/processing/layer.h"
-#include "libknot/processing/requestor.h"
+#include "knot/query/layer.h"
+#include "knot/query/requestor.h"
 #include "contrib/mempattern.h"
 #include "contrib/net.h"
 #include "contrib/sockaddr.h"
-- 
GitLab