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;
}
--