]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- More efficient mesh accounting per client.
authorGeorge Thessalonikefs <george@nlnetlabs.nl>
Tue, 30 May 2023 21:34:31 +0000 (23:34 +0200)
committerGeorge Thessalonikefs <george@nlnetlabs.nl>
Tue, 30 May 2023 21:34:31 +0000 (23:34 +0200)
services/mesh.c

index 22defd58032124de6ae3bb2b9836978df3238582..53bbbfc21d99d4d4ad79f1ea349a508b618fdaf7 100644 (file)
@@ -1425,6 +1425,7 @@ void mesh_query_done(struct mesh_state* mstate)
        struct reply_info* rep = (mstate->s.return_msg?
                mstate->s.return_msg->rep:NULL);
        struct timeval tv = {0, 0};
+       int i = 0;
        /* No need for the serve expired timer anymore; we are going to reply. */
        if(mstate->s.serve_expired_data) {
                comm_timer_delete(mstate->s.serve_expired_data->timer);
@@ -1444,6 +1445,7 @@ void mesh_query_done(struct mesh_state* mstate)
                }
        }
        for(r = mstate->reply_list; r; r = r->next) {
+               i++;
                tv = r->start_time;
 
                /* if a response-ip address block has been stored the
@@ -1455,16 +1457,6 @@ void mesh_query_done(struct mesh_state* mstate)
                                mstate->s.qinfo.qclass, r->local_alias,
                                &r->query_reply.client_addr,
                                r->query_reply.client_addrlen);
-                       if(mstate->s.env->cfg->stat_extended &&
-                               mstate->s.respip_action_info->rpz_used) {
-                               if(mstate->s.respip_action_info->rpz_disabled)
-                                       mstate->s.env->mesh->rpz_action[RPZ_DISABLED_ACTION]++;
-                               if(mstate->s.respip_action_info->rpz_cname_override)
-                                       mstate->s.env->mesh->rpz_action[RPZ_CNAME_OVERRIDE_ACTION]++;
-                               else
-                                       mstate->s.env->mesh->rpz_action[respip_action_to_rpz_action(
-                                               mstate->s.respip_action_info->action)]++;
-                       }
                }
 
                /* if this query is determined to be dropped during the
@@ -1493,14 +1485,29 @@ void mesh_query_done(struct mesh_state* mstate)
                        }
                        prev = r;
                        prev_buffer = r_buffer;
-
-                       /* Account for each reply sent. */
-                       if(mstate->s.env->cfg->stat_extended
-                               && mstate->s.is_cachedb_answer) {
-                               mstate->s.env->mesh->ans_cachedb++;
-                       }
                }
        }
+       /* Account for each reply sent. */
+       if(i > 0 && mstate->s.respip_action_info &&
+               mstate->s.respip_action_info->addrinfo &&
+               mstate->s.env->cfg->stat_extended &&
+               mstate->s.respip_action_info->rpz_used) {
+               if(mstate->s.respip_action_info->rpz_disabled)
+                       mstate->s.env->mesh->rpz_action[RPZ_DISABLED_ACTION] += i;
+               if(mstate->s.respip_action_info->rpz_cname_override)
+                       mstate->s.env->mesh->rpz_action[RPZ_CNAME_OVERRIDE_ACTION] += i;
+               else
+                       mstate->s.env->mesh->rpz_action[respip_action_to_rpz_action(
+                               mstate->s.respip_action_info->action)] += i;
+       }
+       if(!mstate->s.is_drop && i > 0) {
+               if(mstate->s.env->cfg->stat_extended
+                       && mstate->s.is_cachedb_answer) {
+                       mstate->s.env->mesh->ans_cachedb += i;
+               }
+       }
+
+       /* Mesh area accounting */
        if(mstate->reply_list) {
                mstate->reply_list = NULL;
                if(!mstate->reply_list && !mstate->cb_list) {
@@ -1513,6 +1520,7 @@ void mesh_query_done(struct mesh_state* mstate)
                        mstate->s.env->mesh->num_detached_states++;
        }
        mstate->replies_sent = 1;
+
        while((c = mstate->cb_list) != NULL) {
                /* take this cb off the list; so that the list can be
                 * changed, eg. by adds from the callback routine */
@@ -1525,11 +1533,6 @@ void mesh_query_done(struct mesh_state* mstate)
                if(!mstate->reply_list && !mstate->cb_list &&
                        mstate->super_set.count == 0)
                        mstate->s.env->mesh->num_detached_states++;
-               /* Account for each callback. */
-               if(mstate->s.env->cfg->stat_extended
-                       && mstate->s.is_cachedb_answer) {
-                       mstate->s.env->mesh->ans_cachedb++;
-               }
                mesh_do_callback(mstate, mstate->s.return_rcode, rep, c, &tv);
        }
 }
@@ -2038,6 +2041,7 @@ mesh_serve_expired_callback(void* arg)
        struct timeval tv = {0, 0};
        int must_validate = (!(qstate->query_flags&BIT_CD)
                || qstate->env->cfg->ignore_cd) && qstate->env->need_to_validate;
+       int i = 0;
        if(!qstate->serve_expired_data) return;
        verbose(VERB_ALGO, "Serve expired: Trying to reply with expired data");
        comm_timer_delete(qstate->serve_expired_data->timer);
@@ -2109,6 +2113,7 @@ mesh_serve_expired_callback(void* arg)
                log_dns_msg("Serve expired lookup", &qstate->qinfo, msg->rep);
 
        for(r = mstate->reply_list; r; r = r->next) {
+               i++;
                tv = r->start_time;
 
                /* If address info is returned, it means the action should be an
@@ -2118,16 +2123,6 @@ mesh_serve_expired_callback(void* arg)
                                qstate->qinfo.qtype, qstate->qinfo.qclass,
                                r->local_alias, &r->query_reply.client_addr,
                                r->query_reply.client_addrlen);
-
-                       if(qstate->env->cfg->stat_extended && actinfo.rpz_used) {
-                               if(actinfo.rpz_disabled)
-                                       qstate->env->mesh->rpz_action[RPZ_DISABLED_ACTION]++;
-                               if(actinfo.rpz_cname_override)
-                                       qstate->env->mesh->rpz_action[RPZ_CNAME_OVERRIDE_ACTION]++;
-                               else
-                                       qstate->env->mesh->rpz_action[
-                                               respip_action_to_rpz_action(actinfo.action)]++;
-                       }
                }
 
                /* Add EDE Stale Answer (RCF8914). Ignore global ede as this is
@@ -2147,11 +2142,23 @@ mesh_serve_expired_callback(void* arg)
                        tcp_req_info_remove_mesh_state(r->query_reply.c->tcp_req_info, mstate);
                prev = r;
                prev_buffer = r_buffer;
-
-               /* Account for each reply sent. */
-               mesh->ans_expired++;
-
        }
+       /* Account for each reply sent. */
+       if(i > 0) {
+               mesh->ans_expired += i;
+               if(actinfo.addrinfo && qstate->env->cfg->stat_extended &&
+                       actinfo.rpz_used) {
+                       if(actinfo.rpz_disabled)
+                               qstate->env->mesh->rpz_action[RPZ_DISABLED_ACTION] += i;
+                       if(actinfo.rpz_cname_override)
+                               qstate->env->mesh->rpz_action[RPZ_CNAME_OVERRIDE_ACTION] += i;
+                       else
+                               qstate->env->mesh->rpz_action[
+                                       respip_action_to_rpz_action(actinfo.action)] += i;
+               }
+       }
+
+       /* Mesh area accounting */
        if(mstate->reply_list) {
                mstate->reply_list = NULL;
                if(!mstate->reply_list && !mstate->cb_list) {
@@ -2162,6 +2169,7 @@ mesh_serve_expired_callback(void* arg)
                        }
                }
        }
+
        while((c = mstate->cb_list) != NULL) {
                /* take this cb off the list; so that the list can be
                 * changed, eg. by adds from the callback routine */
@@ -2174,8 +2182,6 @@ mesh_serve_expired_callback(void* arg)
                if(!mstate->reply_list && !mstate->cb_list &&
                        mstate->super_set.count == 0)
                        qstate->env->mesh->num_detached_states++;
-               /* Account for each callback. */
-               mesh->ans_expired++;
                mesh_do_callback(mstate, LDNS_RCODE_NOERROR, msg->rep, c, &tv);
        }
 }