construct DS and DNSKEY from cache.

git-svn-id: file:///svn/unbound/trunk@538 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2007-08-21 14:05:10 +00:00
parent 9c8fd98719
commit cf4ef6fbaf
2 changed files with 18 additions and 6 deletions

View file

@ -5,6 +5,7 @@
validated, return the query to client, or send servfail to client. validated, return the query to client, or send servfail to client.
Sets AD bit on validated replies. Sets AD bit on validated replies.
- do not examine security status on an error reply in mesh_done. - do not examine security status on an error reply in mesh_done.
- construct DS, DNSKEY messages from rrset cache.
20 August 2007: Wouter 20 August 2007: Wouter
- validate and positive validation, positive wildcard NSEC validation. - validate and positive validation, positive wildcard NSEC validation.

23
services/cache/dns.c vendored
View file

@ -418,9 +418,9 @@ tomsg(struct module_env* env, struct msgreply_entry* e, struct reply_info* r,
return msg; return msg;
} }
/** synthesize CNAME response from cached CNAME item */ /** synthesize RRset-only response from cached RRset item */
static struct dns_msg* static struct dns_msg*
cname_msg(struct ub_packed_rrset_key* rrset, struct region* region, rrset_msg(struct ub_packed_rrset_key* rrset, struct region* region,
uint32_t now, struct query_info* q) uint32_t now, struct query_info* q)
{ {
struct dns_msg* msg; struct dns_msg* msg;
@ -428,12 +428,13 @@ cname_msg(struct ub_packed_rrset_key* rrset, struct region* region,
rrset->entry.data; rrset->entry.data;
if(now > d->ttl) if(now > d->ttl)
return NULL; return NULL;
msg = gen_dns_msg(region, q, 1); /* only the CNAME RRset */ msg = gen_dns_msg(region, q, 1); /* only the CNAME (or other) RRset */
if(!msg) if(!msg)
return NULL; return NULL;
msg->rep->flags = BIT_QR; /* reply, no AA, no error */ msg->rep->flags = BIT_QR; /* reply, no AA, no error */
msg->rep->qdcount = 1; msg->rep->qdcount = 1;
msg->rep->ttl = d->ttl - now; msg->rep->ttl = d->ttl - now;
msg->rep->security = sec_status_unchecked;
msg->rep->an_numrrsets = 1; msg->rep->an_numrrsets = 1;
msg->rep->ns_numrrsets = 0; msg->rep->ns_numrrsets = 0;
msg->rep->ar_numrrsets = 0; msg->rep->ar_numrrsets = 0;
@ -463,6 +464,7 @@ synth_dname_msg(struct ub_packed_rrset_key* rrset, struct region* region,
msg->rep->flags = BIT_QR; /* reply, no AA, no error */ msg->rep->flags = BIT_QR; /* reply, no AA, no error */
msg->rep->qdcount = 1; msg->rep->qdcount = 1;
msg->rep->ttl = d->ttl - now; msg->rep->ttl = d->ttl - now;
msg->rep->security = sec_status_unchecked;
msg->rep->an_numrrsets = 1; msg->rep->an_numrrsets = 1;
msg->rep->ns_numrrsets = 0; msg->rep->ns_numrrsets = 0;
msg->rep->ar_numrrsets = 0; msg->rep->ar_numrrsets = 0;
@ -574,7 +576,7 @@ dns_cache_lookup(struct module_env* env,
/* see if we have CNAME for this domain */ /* see if we have CNAME for this domain */
if( (rrset=rrset_cache_lookup(env->rrset_cache, qname, qnamelen, if( (rrset=rrset_cache_lookup(env->rrset_cache, qname, qnamelen,
LDNS_RR_TYPE_CNAME, qclass, 0, now, 0))) { LDNS_RR_TYPE_CNAME, qclass, 0, now, 0))) {
struct dns_msg* msg = cname_msg(rrset, region, now, &k); struct dns_msg* msg = rrset_msg(rrset, region, now, &k);
if(msg) { if(msg) {
lock_rw_unlock(&rrset->entry.lock); lock_rw_unlock(&rrset->entry.lock);
return msg; return msg;
@ -582,8 +584,17 @@ dns_cache_lookup(struct module_env* env,
lock_rw_unlock(&rrset->entry.lock); lock_rw_unlock(&rrset->entry.lock);
} }
/* construct DS, DNSKEY messages from rrset cache. TODO */ /* construct DS, DNSKEY messages from rrset cache. */
if((qtype == LDNS_RR_TYPE_DS || qtype == LDNS_RR_TYPE_DNSKEY) &&
(rrset=rrset_cache_lookup(env->rrset_cache, qname, qnamelen,
qtype, qclass, 0, now, 0))) {
struct dns_msg* msg = rrset_msg(rrset, region, now, &k);
if(msg) {
lock_rw_unlock(&rrset->entry.lock);
return msg;
}
lock_rw_unlock(&rrset->entry.lock);
}
return NULL; return NULL;
} }