ctx->options.REORDER_RR = true;
/* Open resolution context */
- ctx->trust_anchors = map_make(NULL);
- ctx->negative_anchors = map_make(NULL);
+ ctx->trust_anchors = trie_create(NULL);
+ ctx->negative_anchors = trie_create(NULL);
ctx->pool = engine->pool;
ctx->modules = &engine->modules;
ctx->cache_rtt_tout_retry_interval = KR_NS_TIMEOUT_RETRY_INTERVAL;
/* Free data structures */
array_clear(engine->modules);
array_clear(engine->backends);
- kr_ta_clear(&engine->resolver.trust_anchors);
- kr_ta_clear(&engine->resolver.negative_anchors);
+ kr_ta_clear(engine->resolver.trust_anchors);
+ trie_free(engine->resolver.trust_anchors);
+ kr_ta_clear(engine->resolver.negative_anchors);
+ trie_free(engine->resolver.negative_anchors);
free(engine->hostname);
}
struct kr_qflags options;
knot_rrset_t *downstream_opt_rr;
knot_rrset_t *upstream_opt_rr;
- map_t trust_anchors;
- map_t negative_anchors;
+ trie_t *trust_anchors;
+ trie_t *negative_anchors;
struct kr_zonecut root_hints;
struct kr_cache cache;
unsigned int cache_rtt_tout_retry_interval;
struct lru *lru_create_impl(unsigned int, unsigned int, knot_mm_t *, knot_mm_t *);
void *lru_get_impl(struct lru *, const char *, unsigned int, unsigned int, _Bool, _Bool *);
void *mm_realloc(knot_mm_t *, void *, size_t, size_t);
-knot_rrset_t *kr_ta_get(map_t *, const knot_dname_t *);
-int kr_ta_add(map_t *, const knot_dname_t *, uint16_t, uint32_t, const uint8_t *, uint16_t);
-int kr_ta_del(map_t *, const knot_dname_t *);
-void kr_ta_clear(map_t *);
+knot_rrset_t *kr_ta_get(trie_t *, const knot_dname_t *);
+int kr_ta_add(trie_t *, const knot_dname_t *, uint16_t, uint32_t, const uint8_t *, uint16_t);
+int kr_ta_del(trie_t *, const knot_dname_t *);
+void kr_ta_clear(trie_t *);
_Bool kr_dnssec_key_ksk(const uint8_t *);
_Bool kr_dnssec_key_revoked(const uint8_t *);
int kr_dnssec_key_tag(uint16_t, const uint8_t *, size_t);
struct kr_qflags options;
knot_rrset_t *downstream_opt_rr;
knot_rrset_t *upstream_opt_rr;
- map_t trust_anchors;
- map_t negative_anchors;
+ trie_t *trust_anchors;
+ trie_t *negative_anchors;
struct kr_zonecut root_hints;
struct kr_cache cache;
unsigned int cache_rtt_tout_retry_interval;
struct lru *lru_create_impl(unsigned int, unsigned int, knot_mm_t *, knot_mm_t *);
void *lru_get_impl(struct lru *, const char *, unsigned int, unsigned int, _Bool, _Bool *);
void *mm_realloc(knot_mm_t *, void *, size_t, size_t);
-knot_rrset_t *kr_ta_get(map_t *, const knot_dname_t *);
-int kr_ta_add(map_t *, const knot_dname_t *, uint16_t, uint32_t, const uint8_t *, uint16_t);
-int kr_ta_del(map_t *, const knot_dname_t *);
-void kr_ta_clear(map_t *);
+knot_rrset_t *kr_ta_get(trie_t *, const knot_dname_t *);
+int kr_ta_add(trie_t *, const knot_dname_t *, uint16_t, uint32_t, const uint8_t *, uint16_t);
+int kr_ta_del(trie_t *, const knot_dname_t *);
+void kr_ta_clear(trie_t *);
_Bool kr_dnssec_key_ksk(const uint8_t *);
_Bool kr_dnssec_key_revoked(const uint8_t *);
int kr_dnssec_key_tag(uint16_t, const uint8_t *, size_t);
goto zonemd;
struct kr_context *resolver = &the_worker->engine->resolver;
const knot_rrset_t * const ds = c->ds ? c->ds :
- kr_ta_get(&resolver->trust_anchors, z_import->origin);
+ kr_ta_get(resolver->trust_anchors, z_import->origin);
if (!ds) {
if (!kr_ta_closest(resolver, z_import->origin, KNOT_RRTYPE_DNSKEY))
goto zonemd; // our TAs say we're insecure
#include "lib/resolve.h"
#include "lib/utils.h"
-knot_rrset_t *kr_ta_get(map_t *trust_anchors, const knot_dname_t *name)
+knot_rrset_t *kr_ta_get(trie_t *trust_anchors, const knot_dname_t *name)
{
- return map_get(trust_anchors, (const char *)name);
+ trie_val_t *val = trie_get_try(trust_anchors, (const char *)name, strlen((const char *)name));
+ return (val) ? *val : NULL;
}
const knot_dname_t * kr_ta_closest(const struct kr_context *ctx, const knot_dname_t *name,
}
while (name) {
struct kr_context *ctx_nc = (struct kr_context *)/*const-cast*/ctx;
- if (kr_ta_get(&ctx_nc->trust_anchors, name)) {
+ if (kr_ta_get(ctx_nc->trust_anchors, name)) {
return name;
}
- if (kr_ta_get(&ctx_nc->negative_anchors, name)) {
+ if (kr_ta_get(ctx_nc->negative_anchors, name)) {
return NULL;
}
name = knot_wire_next_label(name, NULL);
}
/* @internal Insert new TA to trust anchor set, rdata MUST be of DS type. */
-static int insert_ta(map_t *trust_anchors, const knot_dname_t *name,
+static int insert_ta(trie_t *trust_anchors, const knot_dname_t *name,
uint32_t ttl, const uint8_t *rdata, uint16_t rdlen)
{
bool is_new_key = false;
return kr_error(ENOMEM);
}
if (is_new_key) {
- return map_set(trust_anchors, (const char *)name, ta_rr);
+ trie_val_t *val = trie_get_ins(trust_anchors, (const char *)name, strlen((const char *)name));
+ if (kr_fails_assert(val))
+ return kr_error(EINVAL);
+ *val = ta_rr;
}
return kr_ok();
}
-int kr_ta_add(map_t *trust_anchors, const knot_dname_t *name, uint16_t type,
+int kr_ta_add(trie_t *trust_anchors, const knot_dname_t *name, uint16_t type,
uint32_t ttl, const uint8_t *rdata, uint16_t rdlen)
{
if (!trust_anchors || !name) {
}
/* Delete record data */
-static int del_record(const char *k, void *v, void *ext)
+static int del_record(trie_val_t *v, void *ext)
{
- knot_rrset_t *ta_rr = v;
+ knot_rrset_t *ta_rr = *v;
if (ta_rr) {
knot_rrset_free(ta_rr, NULL);
}
return 0;
}
-int kr_ta_del(map_t *trust_anchors, const knot_dname_t *name)
+int kr_ta_del(trie_t *trust_anchors, const knot_dname_t *name)
{
- knot_rrset_t *ta_rr = kr_ta_get(trust_anchors, name);
- if (ta_rr) {
- del_record(NULL, ta_rr, NULL);
- map_del(trust_anchors, (const char *)name);
- }
+ knot_rrset_t *ta_rr;
+ int ret = trie_del(trust_anchors, (const char *)name, strlen((const char *)name),
+ (trie_val_t *) &ta_rr);
+ if (ret == KNOT_EOK && ta_rr)
+ knot_rrset_free(ta_rr, NULL);
return kr_ok();
}
-void kr_ta_clear(map_t *trust_anchors)
+void kr_ta_clear(trie_t *trust_anchors)
{
- map_walk(trust_anchors, del_record, NULL);
- map_clear(trust_anchors);
+ trie_apply(trust_anchors, del_record, NULL);
+ trie_clear(trust_anchors);
}
#pragma once
#include "lib/defines.h"
-#include "lib/generic/map.h"
+#include "lib/generic/trie.h"
#include <libknot/rrset.h>
/**
* @return non-empty RRSet or NULL
*/
KR_EXPORT
-knot_rrset_t *kr_ta_get(map_t *trust_anchors, const knot_dname_t *name);
+knot_rrset_t *kr_ta_get(trie_t *trust_anchors, const knot_dname_t *name);
/**
* Add TA to trust store. DS or DNSKEY types are supported.
* @param trust_anchors trust store
* @param name name of the TA
* @param type RR type of the TA (DS or DNSKEY)
- * @param ttl
- * @param rdata
- * @param rdlen
+ * @param ttl
+ * @param rdata
+ * @param rdlen
* @return 0 or an error
*/
KR_EXPORT
-int kr_ta_add(map_t *trust_anchors, const knot_dname_t *name, uint16_t type,
+int kr_ta_add(trie_t *trust_anchors, const knot_dname_t *name, uint16_t type,
uint32_t ttl, const uint8_t *rdata, uint16_t rdlen);
struct kr_context;
* @return 0 or an error
*/
KR_EXPORT
-int kr_ta_del(map_t *trust_anchors, const knot_dname_t *name);
+int kr_ta_del(trie_t *trust_anchors, const knot_dname_t *name);
/**
* Clear trust store.
* @param trust_anchors trust store
*/
KR_EXPORT
-void kr_ta_clear(map_t *trust_anchors);
+void kr_ta_clear(trie_t *trust_anchors);
static int forward_trust_chain_check(struct kr_request *request, struct kr_query *qry, bool resume)
{
struct kr_rplan *rplan = &request->rplan;
- map_t *trust_anchors = &request->ctx->trust_anchors;
- map_t *negative_anchors = &request->ctx->negative_anchors;
+ trie_t *trust_anchors = request->ctx->trust_anchors;
+ trie_t *negative_anchors = request->ctx->negative_anchors;
if (qry->parent != NULL &&
!(qry->forward_flags.CNAME) &&
static int trust_chain_check(struct kr_request *request, struct kr_query *qry)
{
struct kr_rplan *rplan = &request->rplan;
- map_t *trust_anchors = &request->ctx->trust_anchors;
- map_t *negative_anchors = &request->ctx->negative_anchors;
+ trie_t *trust_anchors = request->ctx->trust_anchors;
+ trie_t *negative_anchors = request->ctx->negative_anchors;
/* Disable DNSSEC if it enters NTA. */
if (kr_ta_get(negative_anchors, qry->zone_cut.name)){
knot_rrset_t *downstream_opt_rr;
knot_rrset_t *upstream_opt_rr;
- map_t trust_anchors;
- map_t negative_anchors;
+ trie_t *trust_anchors;
+ trie_t *negative_anchors;
struct kr_zonecut root_hints;
struct kr_cache cache;
unsigned cache_rtt_tout_retry_interval;