/* Check if at least header is parsed. */
if (pkt->parsed < pkt->size) {
- knot_pkt_free(&pkt);
return NS_PROC_FAIL;
}
/* Accept only queries. */
if (knot_wire_get_qr(pkt->wire)) {
- knot_pkt_free(&pkt);
return NS_PROC_NOOP; /* Ignore. */
}
knot_pkt_t *answer = param->result->ans;
knot_wire_set_id(answer->wire, knot_wire_get_id(pkt->wire));
- /* Free query and finish. */
- knot_pkt_free(&pkt);
-
if (ret != 0) {
return NS_PROC_FAIL;
} else {
knot_layer_t proc;
memset(&proc, 0, sizeof(knot_layer_t));
proc.mm = ctx->pool;
- knot_process_begin(&proc, LAYER_QUERY, ¶m);
- int state = knot_process_in(&proc, (uint8_t *)buf->base, nread);
+ knot_layer_begin(&proc, LAYER_QUERY, ¶m);
+
+ knot_pkt_t *query = knot_pkt_new((uint8_t *)buf->base, nread, ctx->pool);
+ knot_pkt_parse(query, 0);
+ int state = knot_layer_in(&proc, query);
if (state & (NS_PROC_DONE|NS_PROC_FAIL)) {
worker_send(handle, result.ans, addr);
}
/* Cleanup. */
- knot_process_finish(&proc);
+ knot_layer_finish(&proc);
kr_result_deinit(&result);
kr_context_reset(&ctx->resolve);
buf_free((uv_handle_t *)handle, buf);
+ knot_pkt_free(&query);
}
void worker_init(struct worker_ctx *worker, mm_ctx_t *mm)
#include "lib/delegpt.h"
#include <common/mempool.h>
-static void delegpt_free(struct kr_delegpt *dp, mm_ctx_t *mm)
+static void delegpt_free(struct kr_ns *dp, mm_ctx_t *mm)
{
mm_free(mm, dp->name);
mm_free(mm, dp);
return *val;
}
-struct kr_delegpt *kr_delegpt_create(const knot_dname_t *name, mm_ctx_t *mm)
+struct kr_ns *kr_ns_create(const knot_dname_t *name, mm_ctx_t *mm)
{
- struct kr_delegpt *dp = mm_alloc(mm, sizeof(struct kr_delegpt));
- memset(dp, 0, sizeof(struct kr_delegpt));
- dp->name = knot_dname_copy(name, mm);
- dp->flags = DP_LAME;
- return dp;
+ struct kr_ns *ns = mm_alloc(mm, sizeof(struct kr_ns));
+ memset(ns, 0, sizeof(struct kr_ns));
+ ns->name = knot_dname_copy(name, mm);
+ ns->flags = DP_LAME;
+ return ns;
}
-void kr_delegpt_add(list_t *list, struct kr_delegpt *dp)
+void kr_ns_append(list_t *list, struct kr_ns *ns)
{
- add_tail(list, (node_t *)dp);
+ add_tail(list, (node_t *)ns);
}
-void kr_delegpt_remove(struct kr_delegpt *dp, mm_ctx_t *mm)
+void kr_ns_remove(struct kr_ns *ns, mm_ctx_t *mm)
{
- rem_node((node_t *)dp);
- delegpt_free(dp, mm);
+ rem_node((node_t *)ns);
+ delegpt_free(ns, mm);
+}
+
+int kr_ns_resolve(struct kr_ns *ns)
+{
+ return -1;
}
#include <common/sockaddr.h>
#include <common/trie/hat-trie.h>
-/*! \brief Delegation point flag. */
-enum kr_deleg_flag {
+/*! \brief Name server flag. */
+enum kr_ns_flag {
DP_LAME = 0,
DP_RESOLVED
};
struct kr_context;
-/*! \brief Delegation point. */
-struct kr_delegpt {
+/*! \brief Name server. */
+struct kr_ns {
node_t node;
knot_dname_t *name;
struct sockaddr_storage addr;
* choose next and move DPs from the other half for next sweep.
*/
-struct kr_delegpt *kr_delegpt_create(const knot_dname_t *name, mm_ctx_t *mm);
-void kr_delegpt_add(list_t *list, struct kr_delegpt *dp);
-void kr_delegpt_remove(struct kr_delegpt *dp, mm_ctx_t *mm);
-int kr_delegpt_resolve(struct kr_delegpt *dp);
+struct kr_ns *kr_ns_create(const knot_dname_t *name, mm_ctx_t *mm);
+void kr_ns_append(list_t *list, struct kr_ns *ns);
+void kr_ns_remove(struct kr_ns *ns, mm_ctx_t *mm);
+int kr_ns_resolve(struct kr_ns *ns);
#pragma once
-#include <libknot/processing/process.h>
+#include <libknot/processing/layer.h>
#include "lib/context.h"
/*!
}
const knot_dname_t *dp_name = knot_ns_name(&dp->rrs, 0);
- struct kr_delegpt *ns_new = kr_delegpt_create(dp_name, resolve->dp_map.pool);
+ struct kr_ns *ns_new = kr_ns_create(dp_name, resolve->dp_map.pool);
/* Check if there's a glue for the record. */
int ret = glue_record(pkt, dp_name, (struct sockaddr *)&ns_new->addr);
/* TODO: API for duplicates? */
ns_new->flags |= DP_LAME;
/* TODO: resolve. */
- kr_delegpt_add(dplist, ns_new);
+ kr_ns_append(dplist, ns_new);
return -1;
}
/* Add name server. */
ns_new->flags |= DP_RESOLVED;
- kr_delegpt_add(dplist, ns_new);
+ kr_ns_append(dplist, ns_new);
return 0;
}
/* Initialize static root hints. */
for (unsigned i = 0; i < HINT_COUNT; ++i) {
- struct kr_delegpt *ns = kr_delegpt_create(SBELT[i].name, resolve->dp_map.pool);
+ struct kr_ns *ns = kr_ns_create(SBELT[i].name, resolve->dp_map.pool);
if (ns != NULL) {
sockaddr_set(&ns->addr, AF_INET, SBELT[i].addr, 53);
ns->flags |= DP_RESOLVED;
- kr_delegpt_add(dp, ns);
+ kr_ns_append(dp, ns);
}
}
return;
}
- struct kr_delegpt *ns = NULL;
+ struct kr_ns *ns = NULL;
WALK_LIST(ns, *dp) {
if (ns->flags & DP_RESOLVED) {
break;