summaryrefslogtreecommitdiff
path: root/src/libknot/nameserver/name-server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libknot/nameserver/name-server.c')
-rw-r--r--src/libknot/nameserver/name-server.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/libknot/nameserver/name-server.c b/src/libknot/nameserver/name-server.c
index 4a95240..ee956e7 100644
--- a/src/libknot/nameserver/name-server.c
+++ b/src/libknot/nameserver/name-server.c
@@ -1753,7 +1753,7 @@ static inline int ns_referral(const knot_node_t *node,
&& knot_query_dnssec_requested(
knot_packet_query(resp))) {
ret = ns_add_rrsigs(ds_rrset, resp, node->owner,
- knot_response_add_rrset_authority,
+ knot_response_add_rrset_answer,
1);
}
} else {
@@ -1919,7 +1919,6 @@ static int ns_answer_from_node(const knot_node_t *node,
}
}
} else { // else put authority NS
- assert(previous == NULL);
assert(closest_encloser == knot_node_parent(node)
|| !knot_dname_is_wildcard(knot_node_owner(node))
|| knot_dname_compare(qname, knot_node_owner(node)) == 0);
@@ -2141,14 +2140,19 @@ static int ns_answer_from_zone(const knot_zone_contents_t *zone,
uint16_t qtype = knot_packet_qtype(resp);
search:
- find_ret = knot_zone_contents_find_dname(zone, qname, &node,
- &closest_encloser, &previous);
-// node = knot_node_current(node);
-// closest_encloser = knot_node_current(closest_encloser);
-// previous = knot_node_current(previous);
- previous = NULL; // TODO REVIEW LS
+ // Searching for a name directly is faster than when we need previous dname
+ node = knot_zone_contents_find_node(zone, qname);
+ if (node != NULL) {
+ // If node is found, closest_encloser is equal to node itself
+ closest_encloser = node;
+ find_ret = KNOT_ZONE_NAME_FOUND;
+ } else {
+ // We need previous and closest encloser, full search has to be done
+ find_ret = knot_zone_contents_find_dname(zone, qname, &node,
+ &closest_encloser, &previous);
if (find_ret == KNOT_EINVAL) {
- return NS_ERR_SERVFAIL;
+ return NS_ERR_SERVFAIL;
+ }
}
dbg_ns_exec_verb(