diff options
author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2018-09-10 16:32:55 +0000 |
---|---|---|
committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2018-09-10 16:32:55 +0000 |
commit | dcaa814d350c5ee7deb2164502a24f2f698b9799 (patch) | |
tree | 9cb62373e6c424da021043a171564ced3bb19501 /edns-subnet | |
parent | 4aea2433fa04a7a86c8972869bd021b7a3622dc8 (diff) |
Notes
Diffstat (limited to 'edns-subnet')
-rw-r--r-- | edns-subnet/subnetmod.c | 12 | ||||
-rw-r--r-- | edns-subnet/subnetmod.h | 4 |
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 { |