}
/* Either way it resolves current query. */
- query->resolved = true;
+ query->flags |= QUERY_RESOLVED;
return KNOT_STATE_DONE;
}
assert(pkt && ctx);
struct kr_layer_param *param = ctx->data;
struct kr_query *query = kr_rplan_current(param->rplan);
- if (query == NULL || query->resolved) {
+ if (query == NULL || (query->flags & QUERY_RESOLVED)) {
return ctx->state;
}
#include <libknot/rrtype/rdname.h>
#include "lib/layer/iterate.h"
+#include "lib/cache.h"
#include "lib/module.h"
#define DEBUG_MSG(fmt...) QRDEBUG(kr_rplan_current(param->rplan), " cc ", fmt)
int state = read_cache_rr(txn, &cache_rr, timestamp, callback, param);
if (state == KNOT_STATE_DONE) {
DEBUG_MSG("=> satisfied from cache\n");
- cur->resolved = true;
+ cur->flags |= QUERY_RESOLVED;
return state;
}
}
}
- cur->resolved = true;
+ cur->flags |= QUERY_RESOLVED;
return KNOT_STATE_DONE;
}
{
if (kr_rplan_satisfies(cur, cur->ns.name, KNOT_CLASS_IN, KNOT_RRTYPE_A) ||
kr_rplan_satisfies(cur, cur->ns.name, KNOT_CLASS_IN, KNOT_RRTYPE_AAAA) ||
+ cur->flags & QUERY_AWAIT_ADDR) {
DEBUG_MSG("=> dependency loop, bailing out\n");
kr_rplan_pop(param->rplan, cur);
return KNOT_EOK;
(void) kr_rplan_push(param->rplan, cur, cur->ns.name, KNOT_CLASS_IN, KNOT_RRTYPE_AAAA);
(void) kr_rplan_push(param->rplan, cur, cur->ns.name, KNOT_CLASS_IN, KNOT_RRTYPE_A);
+ cur->flags |= QUERY_AWAIT_ADDR;
return KNOT_EOK;
}
/** Query flags */
enum kr_query_flag {
QUERY_NO_MINIMIZE = 1 << 0, /**< Don't minimize QNAME. */
- QUERY_TCP = 1 << 1 /**< Use TCP for this query. */
+ QUERY_TCP = 1 << 1, /**< Use TCP for this query. */
+ QUERY_RESOLVED = 1 << 2, /**< Query is resolved. */
+ QUERY_AWAIT_ADDR = 1 << 3 /**< Query is waiting for NS address. */
};
/**
struct kr_zonecut zone_cut;
struct timeval timestamp;
knot_dname_t *sname;
- bool resolved;
uint16_t stype;
uint16_t sclass;
uint16_t id;
knot_rrset_add_rdata(&rr, raw_addr, addr_len, 0, ¶m->answer->mm);
callback(&rr, 0, param);
- cur->resolved = true;
+ cur->flags |= QUERY_RESOLVED;
return KNOT_STATE_DONE;
}
}