Re: djbdns/dnscache epoll patch, qmerge and dnscurve included

Sami Farin <[email protected]> Thu, 14 Oct 2010 00:06:57 +0300
Newsgroups gmane.network.djbdns
Message-ID <[email protected]>
qmerge feature with dnscurve was easy to make work right.

diff --git a/CHANGES.safari b/CHANGES.safari
index 2751577..1bcd3e2 100644
--- a/CHANGES.safari
+++ b/CHANGES.safari
@@ -59,3 +59,6 @@ First version
    disable, "rm -f dnscache; make dnscache" .
  - use static allocation for `records' in query.c.
 
+20101013
+ - dns_transmit.c: support qmerge for dnscurve queries.
+
diff --git a/dns_transmit.c b/dns_transmit.c
index 56f2dce..d73f1d5 100644
--- a/dns_transmit.c
+++ b/dns_transmit.c
@@ -205,15 +205,25 @@ void dns_enable_merge(void (*f)(const char *, const char *, const char *))
   merge_logger = f;
 }
 
+static inline const char* get_domain(struct dns_transmit *d)
+{
+  if (d->keys)
+    return d->name;
+  else
+    return d->query + 14;
+}
+
 static uint64 merge_hash(struct dns_transmit *x)
 {
   uint64 tmp64;
   uint32 tmp32;
   uint16 qtype;
+  const char *nameptr;
 
   byte_copy(&tmp32, 4, x->servers + 4 * x->curserver);
   qtype = x->qtype[0] << 8 | x->qtype[1];
-  tmp64 = jhash(x->query + 14, dns_domain_length(x->query + 14), list_seed);
+  nameptr = get_domain(x);
+  tmp64 = jhash(nameptr, dns_domain_length(nameptr), list_seed);
   tmp64 <<= 32;
   tmp64 |= jhash_3words(tmp32, qtype, (tmp64 >> 32), list_seed2);
   return tmp64;
@@ -227,13 +237,12 @@ static int merge_equal(struct dns_transmit *a, struct dns_transmit *b)
   if (a == b) return 1;
   if (!a->query || !b->query) return 0;
   if (a->key != b->key) return 0;
-  if (a->query == b->query) return 1;
   ip2 = b->servers + 4 * b->curserver;
   ip1 = a->servers + 4 * a->curserver;
 
   return byte_equal(ip1, 4, ip2) &&
          byte_equal(a->qtype, 2, b->qtype) &&
-         dns_domain_equal(a->query + 14, b->query + 14);
+         dns_domain_equal(get_domain(a), get_domain(b));
 }
 
 struct list_head merges_active_table[MERGE_HASH_SIZE];
@@ -446,7 +455,7 @@ static int thisudp(struct dns_transmit *d)
         if (try_merge(d)) {
           merges++;
           if (merge_logger)
-            merge_logger(ip, d->qtype, d->query + 14);
+            merge_logger(ip, d->qtype, get_domain(d));
           return 0;
         }
 

--