]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Answers use same case as query does.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 26 Feb 2008 20:45:20 +0000 (20:45 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 26 Feb 2008 20:45:20 +0000 (20:45 +0000)
git-svn-id: file:///svn/unbound/trunk@993 be551aaa-1e26-0410-a405-d3ace91eadb9

daemon/worker.c
doc/Changelog
iterator/iterator.c
services/mesh.c
services/mesh.h

index 6758855af4b07385fd87bec58ace07717b42c66a..5c2839be45e715a205312d8d5b3e2aac6754a34c 100644 (file)
@@ -505,11 +505,10 @@ all_rrsets_secure(struct reply_info* rep) {
 
 /** answer query from the cache */
 static int
-answer_from_cache(struct worker* worker, struct lruhash_entry* e, uint16_t id,
-       uint16_t flags, struct comm_reply* repinfo, struct edns_data* edns)
+answer_from_cache(struct worker* worker, struct query_info* qinfo,
+       struct reply_info* rep, uint16_t id, uint16_t flags, 
+       struct comm_reply* repinfo, struct edns_data* edns)
 {
-       struct msgreply_entry* mrentry = (struct msgreply_entry*)e->key;
-       struct reply_info* rep = (struct reply_info*)e->data;
        uint32_t timenow = *worker->env.now;
        uint16_t udpsize = edns->udp_size;
        int secure;
@@ -547,7 +546,7 @@ answer_from_cache(struct worker* worker, struct lruhash_entry* e, uint16_t id,
                edns->ext_rcode = 0;
                edns->bits &= EDNS_DO;
                error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL, 
-                       &mrentry->key, id, flags, edns);
+                       qinfo, id, flags, edns);
                rrset_array_unlock_touch(worker->env.rrset_cache, 
                        worker->scratchpad, rep->ref, rep->rrset_count);
                regional_free_all(worker->scratchpad);
@@ -573,11 +572,11 @@ answer_from_cache(struct worker* worker, struct lruhash_entry* e, uint16_t id,
        edns->udp_size = EDNS_ADVERTISED_SIZE;
        edns->ext_rcode = 0;
        edns->bits &= EDNS_DO;
-       if(!reply_info_answer_encode(&mrentry->key, rep, id, flags, 
+       if(!reply_info_answer_encode(qinfo, rep, id, flags, 
                repinfo->c->buffer, timenow, 1, worker->scratchpad,
                udpsize, edns, (int)(edns->bits & EDNS_DO), secure)) {
                error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL, 
-                       &mrentry->key, id, flags, edns);
+                       qinfo, id, flags, edns);
        }
        /* cannot send the reply right now, because blocking network syscall
         * is bad while holding locks. */
@@ -787,7 +786,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
        h = query_info_hash(&qinfo);
        if((e=slabhash_lookup(worker->env.msg_cache, h, &qinfo, 0))) {
                /* answer from cache - we have acquired a readlock on it */
-               if(answer_from_cache(worker, e, 
+               if(answer_from_cache(worker, &qinfo, 
+                       (struct reply_info*)e->data, 
                        *(uint16_t*)ldns_buffer_begin(c->buffer), 
                        ldns_buffer_read_u16_at(c->buffer, 2), repinfo, 
                        &edns)) {
@@ -817,8 +817,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
                worker->stats.num_query_list_exceeded++;
                comm_point_drop_reply(repinfo);
                return 0;
-       } else if(worker->env.mesh->num_reply_addrs > 
-               worker->request_size*256) {
+       } else if(worker->env.mesh->num_reply_addrs>worker->request_size*16) {
                verbose(VERB_ALGO, "Too many requests queued. "
                        "dropping incoming query.");
                worker->stats.num_query_list_exceeded++;
index 77bc864109958a0c8914741c205dd548e0d1865a..5ba74dd46291bf2523d244c2edb5d0784b57a589 100644 (file)
@@ -2,6 +2,7 @@
        - delay utility delays TCP as well. If the server that is forwarded 
          to has a TCP error, the delay utility closes the connection.
        - delay does REUSE_ADDR, and can handle a server that closes its end.
+       - answers use casing from query.
 
 25 February 2008: Wouter
        - delay utility works. Gets decent thoughput too (>20000).
index b33f7654bc68be08ba1f303cf600012f76b24948..54d93297bd585615e3fd32ece189d58abb5e2888 100644 (file)
@@ -1566,11 +1566,6 @@ processFinished(struct module_qstate* qstate, struct iter_qstate* iq,
                                        LDNS_RCODE_SERVFAIL);
                }
        }
-       if(query_dname_compare(qstate->qinfo.qname, 
-               iq->response->qinfo.qname) == 0) {
-               /* use server supplied upper/lower case */
-               qstate->qinfo.qname = iq->response->qinfo.qname;
-       }
        qstate->return_rcode = LDNS_RCODE_NOERROR;
        qstate->return_msg = iq->response;
        return 0;
index cef363dc746f35553163f943220c58adb104020b..d7ed4d9afd2d579303abe481d70e3eea7b15653d 100644 (file)
@@ -160,7 +160,7 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
        if(!s->reply_list && !s->cb_list)
                was_noreply = 1;
        /* add reply to s */
-       if(!mesh_state_add_reply(s, edns, rep, qid, qflags)) {
+       if(!mesh_state_add_reply(s, edns, rep, qid, qflags, qinfo->qname)) {
                        log_err("mesh_new_client: out of memory; SERVFAIL");
                        error_encode(rep->c->buffer, LDNS_RCODE_SERVFAIL,
                                qinfo, qid, qflags, edns);
@@ -540,8 +540,11 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
                                prev->query_reply.c->buffer);
                ldns_buffer_write_at(r->query_reply.c->buffer, 0, 
                        &r->qid, sizeof(uint16_t));
+               ldns_buffer_write_at(r->query_reply.c->buffer, 12, 
+                       r->qname, m->s.qinfo.qname_len);
                comm_point_send_reply(&r->query_reply);
        } else if(rcode) {
+               m->s.qinfo.qname = r->qname;
                error_encode(r->query_reply.c->buffer, rcode, &m->s.qinfo,
                        r->qid, r->qflags, &r->edns);
                comm_point_send_reply(&r->query_reply);
@@ -551,6 +554,7 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
                r->edns.udp_size = EDNS_ADVERTISED_SIZE;
                r->edns.ext_rcode = 0;
                r->edns.bits &= EDNS_DO;
+               m->s.qinfo.qname = r->qname;
                if(!reply_info_answer_encode(&m->s.qinfo, rep, r->qid, 
                        r->qflags, r->query_reply.c->buffer, 0, 1, 
                        m->s.env->scratch, udp_size, &r->edns, 
@@ -640,7 +644,7 @@ int mesh_state_add_cb(struct mesh_state* s, struct edns_data* edns,
 }
 
 int mesh_state_add_reply(struct mesh_state* s, struct edns_data* edns,
-        struct comm_reply* rep, uint16_t qid, uint16_t qflags)
+        struct comm_reply* rep, uint16_t qid, uint16_t qflags, uint8_t* qname)
 {
        struct mesh_reply* r = regional_alloc(s->s.region, 
                sizeof(struct mesh_reply));
@@ -652,6 +656,10 @@ int mesh_state_add_reply(struct mesh_state* s, struct edns_data* edns,
        r->qflags = qflags;
        r->start_time = *s->s.env->now_tv;
        r->next = s->reply_list;
+       r->qname = regional_alloc_init(s->s.region, qname, 
+               s->s.qinfo.qname_len);
+       if(!r->qname)
+               return 0;
        s->reply_list = r;
        return 1;
 
index dd888c835c2e961ba3ccacaae04b9a045d8febd2..aded72703c5c6561eb60f587b946a0ce48c86086 100644 (file)
@@ -156,6 +156,8 @@ struct mesh_reply {
        uint16_t qid;
        /** flags of query, for reply flags */
        uint16_t qflags;
+       /** qname from this query. len same as mesh qinfo. */
+       uint8_t* qname;
 };
 
 /** 
@@ -375,10 +377,11 @@ int mesh_state_attachment(struct mesh_state* super, struct mesh_state* sub);
  * @param rep: comm point reply info.
  * @param qid: ID of reply.
  * @param qflags: original query flags.
+ * @param qname: original query name.
  * @return: 0 on alloc error.
  */
 int mesh_state_add_reply(struct mesh_state* s, struct edns_data* edns, 
-       struct comm_reply* rep, uint16_t qid, uint16_t qflags);
+       struct comm_reply* rep, uint16_t qid, uint16_t qflags, uint8_t* qname);
 
 /**
  * Create new callback structure and attach it to a mesh state.