summaryrefslogtreecommitdiff
path: root/edns-subnet
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2018-09-10 16:32:55 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2018-09-10 16:32:55 +0000
commitdcaa814d350c5ee7deb2164502a24f2f698b9799 (patch)
tree9cb62373e6c424da021043a171564ced3bb19501 /edns-subnet
parent4aea2433fa04a7a86c8972869bd021b7a3622dc8 (diff)
Notes
Diffstat (limited to 'edns-subnet')
-rw-r--r--edns-subnet/subnetmod.c12
-rw-r--r--edns-subnet/subnetmod.h4
2 files changed, 14 insertions, 2 deletions
diff --git a/edns-subnet/subnetmod.c b/edns-subnet/subnetmod.c
index ae2523b86c234..1a5044e427cc8 100644
--- a/edns-subnet/subnetmod.c
+++ b/edns-subnet/subnetmod.c
@@ -464,7 +464,12 @@ eval_response(struct module_qstate *qstate, int id, struct subnet_qstate *sq)
memset(c_out, 0, sizeof(*c_out));
- if (!qstate->return_msg) return module_error;
+ if (!qstate->return_msg) {
+ /* already an answer and its not a message, but retain
+ * the actual rcode, instead of module_error, so send
+ * module_finished */
+ return module_finished;
+ }
/* We have not asked for subnet data */
if (!sq->subnet_sent) {
@@ -511,6 +516,7 @@ eval_response(struct module_qstate *qstate, int id, struct subnet_qstate *sq)
lock_rw_wrlock(&sne->biglock);
update_cache(qstate, id);
+ sne->num_msg_nocache++;
lock_rw_unlock(&sne->biglock);
if (sq->subnet_downstream) {
@@ -693,6 +699,7 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
lock_rw_wrlock(&sne->biglock);
if (lookup_and_reply(qstate, id, sq)) {
+ sne->num_msg_cache++;
lock_rw_unlock(&sne->biglock);
verbose(VERB_QUERY, "subnet: answered from cache");
qstate->ext_state[id] = module_finished;
@@ -741,7 +748,8 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
/* Query handed back by next module, we have a 'final' answer */
if(sq && event == module_event_moddone) {
qstate->ext_state[id] = eval_response(qstate, id, sq);
- if(qstate->ext_state[id] == module_finished) {
+ if(qstate->ext_state[id] == module_finished &&
+ qstate->return_msg) {
ecs_opt_list_append(&sq->ecs_client_out,
&qstate->edns_opts_front_out, qstate);
}
diff --git a/edns-subnet/subnetmod.h b/edns-subnet/subnetmod.h
index c7f56327f9d2a..f417a64a45b06 100644
--- a/edns-subnet/subnetmod.h
+++ b/edns-subnet/subnetmod.h
@@ -61,6 +61,10 @@ struct subnet_env {
/** allocation service */
struct alloc_cache alloc;
lock_rw_type biglock;
+ /** number of messages from cache */
+ size_t num_msg_cache;
+ /** number of messages not from cache */
+ size_t num_msg_nocache;
};
struct subnet_msg_cache_data {