]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Decrease TTLs in subnetcache
authorYuri Schaeffer <yuri@nlnetlabs.nl>
Fri, 24 Apr 2015 09:31:50 +0000 (09:31 +0000)
committerYuri Schaeffer <yuri@nlnetlabs.nl>
Fri, 24 Apr 2015 09:31:50 +0000 (09:31 +0000)
git-svn-id: file:///svn/unbound/branches/edns-subnet@3413 be551aaa-1e26-0410-a405-d3ace91eadb9

edns-subnet/subnetmod.c
services/cache/dns.c
services/cache/dns.h

index 2b4865a0b268a1a8efc046c5cc201c7f29ccb5c4..07bec51685c9529c9e3933a72a906c17a857337f 100644 (file)
@@ -158,6 +158,7 @@ update_cache(struct module_qstate *qstate, int id)
        struct slabhash *subnet_msg_cache = 
                ((struct subnet_env*)qstate->env->modinfo[id])->subnet_msg_cache;
        struct edns_data *edns = &qstate->edns_client_in;
+       size_t i;
        
        /** We already calculated hash upon lookup */
        hashvalue_t h = qstate->minfo[id] ? 
@@ -193,6 +194,13 @@ update_cache(struct module_qstate *qstate, int id)
                return;
        }
        rep = reply_info_copy(qstate->return_msg->rep, qstate->env->alloc, NULL);
+       
+       /* store RRsets */
+       for(i=0; i<rep->rrset_count; i++) {
+               rep->ref[i].key = rep->rrsets[i];
+               rep->ref[i].id = rep->rrsets[i]->id;
+       }
+       reply_info_set_ttls(rep, *qstate->env->now);
        rep->flags |= (BIT_RA | BIT_QR); /* fix flags to be sensible for */
        rep->flags &= ~(BIT_AA | BIT_CD);/* a reply based on the cache   */
        addrtree_insert(tree, (addrkey_t*)edns->subnet_addr, 
@@ -218,7 +226,6 @@ lookup_and_reply(struct module_qstate *qstate, int id)
        struct edns_data *edns = &qstate->edns_client_in;
        struct addrtree *tree;
        struct addrnode *node;
-       struct reply_info *rep;
        
        if (iq) iq->qinfo_hash = h; /** Might be useful on cache miss */
        e = slabhash_lookup(sne->subnet_msg_cache, h, &qstate->qinfo, 0);
@@ -236,17 +243,15 @@ lookup_and_reply(struct module_qstate *qstate, int id)
                lock_rw_unlock(&e->lock);
                return 0;
        }
-       rep = node->elem;
-       rep = reply_info_copy(rep, env->alloc, qstate->region);
+
+       qstate->return_msg = tomsg(env, &qstate->qinfo,
+               (struct reply_info *)node->elem, qstate->region, *env->now,
+               env->scratch);
        lock_rw_unlock(&e->lock);
-       qstate->return_msg = (struct dns_msg*)regional_alloc(
-               qstate->region, sizeof(struct dns_msg));
-       if (!qstate->return_msg) {
-               log_err("subnet: found in cache but alloc failed");
+       
+       if (!qstate->return_msg) { /** TTL expired */
                return 0;
        }
-       qstate->return_msg->rep = rep;
-       memcpy(&qstate->return_msg->qinfo, &qstate->qinfo, sizeof(struct query_info));
        
        if (edns->subnet_downstream) { /* relay to interested client */
                memcpy(&qstate->edns_client_out, edns, sizeof(struct edns_data));
index c663b8e8b9a2aaccda0d60211c91958e75acb01f..124eaebca68c9a89262481271b1bf3fc57c99a6c 100644 (file)
@@ -454,7 +454,11 @@ gen_dns_msg(struct regional* region, struct query_info* q, size_t num)
 }
 
 /** generate dns_msg from cached message */
+#ifdef CLIENT_SUBNET
+struct dns_msg*
+#else
 static struct dns_msg*
+#endif
 tomsg(struct module_env* env, struct query_info* q, struct reply_info* r, 
        struct regional* region, time_t now, struct regional* scratch)
 {
index 05a3e62965430ea3fde6deacd7779e40e22616ce..03da9c38a69267f50f48ea0a17de13c4397c69b7 100644 (file)
@@ -125,6 +125,13 @@ struct delegpt* dns_cache_find_delegation(struct module_env* env,
        uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, 
        struct regional* region, struct dns_msg** msg, time_t timenow);
 
+#ifdef CLIENT_SUBNET
+/** generate dns_msg from cached message */
+struct dns_msg* tomsg(struct module_env* env, struct query_info* q,
+       struct reply_info* r, struct regional* region, time_t now,
+       struct regional* scratch);
+#endif
+
 /** 
  * Find cached message 
  * @param env: module environment with the DNS cache.