]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/resolve: per-request options, worker.resolve() support
authorMarek Vavruša <marek.vavrusa@nic.cz>
Sat, 18 Jul 2015 22:55:29 +0000 (00:55 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Sat, 18 Jul 2015 23:24:00 +0000 (01:24 +0200)
daemon/README.rst
daemon/bindings.c
daemon/worker.c
daemon/worker.h
lib/resolve.c
lib/resolve.h
lib/rplan.c
lib/rplan.h
tests/test_rplan.c

index c6c495f1180d144c57996b31dbc66bfc1005ba0d..c9a0309e82e7883827ce5614d77df81c3d9def31 100644 (file)
@@ -521,11 +521,12 @@ you can see the statistics or schedule new queries.
 
        print(worker.stats().concurrent)
 
-.. function:: worker.resolve(qname, qtype[, qclass = kres.class.IN])
+.. function:: worker.resolve(qname, qtype[, qclass = kres.class.IN, options = 0])
 
    :param string qname: Query name (e.g. 'com.')
    :param number qtype: Query type (e.g. ``kres.type.NS``)
    :param number qclass: Query class *(optional)* (e.g. ``kres.class.IN``)
+   :param number options: Resolution options (see query flags)
    :return: boolean
 
    Resolve a query, there is currently no callback when its finished, but you can track the query
index 419703dfefdafc20c84b7762767dd6297463a788..29af9e62d3d18b0119e40436cacd4e5ab33c5010 100644 (file)
@@ -578,8 +578,19 @@ static int wrk_resolve(lua_State *L)
        }
        knot_pkt_put_question(pkt, dname, rrclass, rrtype);
        knot_wire_set_rd(pkt->wire);
+       /* Add OPT RR */
+       pkt->opt_rr = mm_alloc(&pkt->mm, sizeof(*pkt->opt_rr));
+       if (!pkt->opt_rr) {
+               return kr_error(ENOMEM);
+       }
+       int ret = knot_edns_init(pkt->opt_rr, KR_EDNS_PAYLOAD, 0, KR_EDNS_VERSION, &pkt->mm);
+       if (ret != 0) {
+               knot_pkt_free(&pkt);
+               return 0;
+       }
        /* Resolve it */
-       int ret = worker_resolve(worker, pkt);
+       unsigned options = lua_tointeger(L, 4);
+       ret = worker_resolve(worker, pkt, options);
        knot_pkt_free(&pkt);
        lua_pushboolean(L, ret == 0);
        return 1;
index 85cffe38615b24b90b4ba91bda60ce4fc1621f2d..31586bd290c30c1f04f23111c447e07435e6efed 100644 (file)
@@ -93,7 +93,7 @@ static struct qr_task *qr_task_create(struct worker_ctx *worker, uv_handle_t *ha
 {
        /* How much can client handle? */
        size_t answer_max = KNOT_WIRE_MIN_PKTSIZE;
-       if (!addr) { /* TCP */
+       if (!addr && handle) { /* TCP */
                answer_max = KNOT_WIRE_MAX_PKTSIZE;
        } else if (knot_pkt_has_edns(query)) { /* EDNS */
                answer_max = MAX(knot_edns_get_payload(query->opt_rr), KNOT_WIRE_MIN_PKTSIZE);
@@ -404,7 +404,7 @@ int worker_exec(struct worker_ctx *worker, uv_handle_t *handle, knot_pkt_t *quer
        return qr_task_step(task, query);
 }
 
-int worker_resolve(struct worker_ctx *worker, knot_pkt_t *query)
+int worker_resolve(struct worker_ctx *worker, knot_pkt_t *query, unsigned options)
 {
        if (!worker) {
                return kr_error(EINVAL);
@@ -415,6 +415,7 @@ int worker_resolve(struct worker_ctx *worker, knot_pkt_t *query)
        if (!task) {
                return kr_error(ENOMEM);
        }
+       task->req.options |= options;
        return qr_task_step(task, query);
 }
 
index 6364761d6370147fbf89b26cb6d306c2840c80e3..21cc0b97adf5f0a3f8a94ab790f5df6f3301ed76 100644 (file)
@@ -58,7 +58,7 @@ int worker_exec(struct worker_ctx *worker, uv_handle_t *handle, knot_pkt_t *quer
  * Schedule query for resolution.
  * @return 0 or an error code
  */
-int worker_resolve(struct worker_ctx *worker, knot_pkt_t *query);
+int worker_resolve(struct worker_ctx *worker, knot_pkt_t *query, unsigned options);
 
 /** Reserve worker buffers */
 int worker_reserve(struct worker_ctx *worker, size_t ring_maxlen);
index bc51b17846893629959a47b454d4f1b7e7d10c59..84ef95baf96477959ded7c23c0ffd08cd2e105c6 100644 (file)
@@ -345,13 +345,14 @@ int kr_resolve(struct kr_context* ctx, knot_pkt_t *answer,
 int kr_resolve_begin(struct kr_request *request, struct kr_context *ctx, knot_pkt_t *answer)
 {
        /* Initialize request */
-       kr_rplan_init(&request->rplan, ctx, &request->pool);
        knot_overlay_init(&request->overlay, &request->pool);
        request->ctx = ctx;
        request->answer = answer;
+       request->options = ctx->options;
        prepare_layers(request);
 
        /* Expect first query */
+       kr_rplan_init(&request->rplan, request, &request->pool);
        return KNOT_STATE_CONSUME;
 }
 
index 8a976229d1e38e0c69475ee821b35fae1b28af40..fbc207b8673f556d71b862e1aa654959e5f5b8c1 100644 (file)
@@ -128,6 +128,7 @@ struct kr_request {
     struct knot_overlay overlay;
     knot_pkt_t *answer;
     mm_ctx_t pool;
+    uint32_t options;
 };
 
 /**
index cbf3a130d42e374737628b61dc4347b2f92320b7..11760a99aa20e928ae9126a5196c538da807d161 100644 (file)
@@ -65,7 +65,7 @@ static void query_free(mm_ctx_t *pool, struct kr_query *qry)
        mm_free(pool, qry);
 }
 
-int kr_rplan_init(struct kr_rplan *rplan, struct kr_context *context, mm_ctx_t *pool)
+int kr_rplan_init(struct kr_rplan *rplan, struct kr_request *request, mm_ctx_t *pool)
 {
        if (rplan == NULL) {
                return KNOT_EINVAL;
@@ -74,7 +74,7 @@ int kr_rplan_init(struct kr_rplan *rplan, struct kr_context *context, mm_ctx_t *
        memset(rplan, 0, sizeof(struct kr_rplan));
 
        rplan->pool = pool;
-       rplan->context = context;
+       rplan->request = request;
        init_list(&rplan->pending);
        init_list(&rplan->resolved);
        return KNOT_EOK;
@@ -117,7 +117,7 @@ struct kr_query *kr_rplan_push(struct kr_rplan *rplan, struct kr_query *parent,
        }
        qry->sclass = cls;
        qry->stype = type;
-       qry->flags = rplan->context->options;
+       qry->flags = rplan->request->options;
        qry->parent = parent;
        gettimeofday(&qry->timestamp, NULL);
        add_tail(&rplan->pending, &qry->node);
index ccf300a1baf625eb03fb533a100ea00f09b325ef..a459f4c5b2a795f47f8cf3bca2bc11a928993a5f 100644 (file)
@@ -75,17 +75,17 @@ struct kr_query {
 struct kr_rplan {
        list_t pending;              /**< List of pending queries. */
        list_t resolved;             /**< List of resolved queries. */
-       struct kr_context *context;  /**< Parent resolution context. */
+       struct kr_request *request;  /**< Parent resolution request. */
        mm_ctx_t *pool;              /**< Temporary memory pool. */
 };
 
 /**
  * Initialize resolution plan (empty).
  * @param rplan plan instance
- * @param context resolution context
+ * @param request resolution request
  * @param pool ephemeral memory pool for whole resolution
  */
-int kr_rplan_init(struct kr_rplan *rplan, struct kr_context *context, mm_ctx_t *pool);
+int kr_rplan_init(struct kr_rplan *rplan, struct kr_request *request, mm_ctx_t *pool);
 
 /**
  * Deinitialize resolution plan, aborting any uncommited transactions.
index d5eb1faba75dd4c6b46365391910e1cfc5344404..5a8eb3ed691b26a5eac0f8a4a1f7610769e3409e 100644 (file)
@@ -44,8 +44,9 @@ static void test_rplan_push(void **state)
 {
        mm_ctx_t mm;
        test_mm_ctx_init(&mm);
-       struct kr_context context = {
-               .pool = &mm,
+       struct kr_request request = {
+               .pool = mm,
+               .flags = 0,
        };
 
        struct kr_rplan rplan;