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
}
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;
{
/* 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);
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);
if (!task) {
return kr_error(ENOMEM);
}
+ task->req.options |= options;
return qr_task_step(task, query);
}
* 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);
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;
}
struct knot_overlay overlay;
knot_pkt_t *answer;
mm_ctx_t pool;
+ uint32_t options;
};
/**
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;
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;
}
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);
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.
{
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;