summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/cmd/ndb/convDNS2M.c8
-rw-r--r--sys/src/cmd/ndb/convM2DNS.c1
-rw-r--r--sys/src/cmd/ndb/dblookup.c13
-rw-r--r--sys/src/cmd/ndb/dn.c79
-rw-r--r--sys/src/cmd/ndb/dnresolve.c17
-rw-r--r--sys/src/cmd/ndb/dns.h7
-rw-r--r--sys/src/cmd/ndb/dnsdebug.c7
7 files changed, 62 insertions, 70 deletions
diff --git a/sys/src/cmd/ndb/convDNS2M.c b/sys/src/cmd/ndb/convDNS2M.c
index 96437df6f..c2c199474 100644
--- a/sys/src/cmd/ndb/convDNS2M.c
+++ b/sys/src/cmd/ndb/convDNS2M.c
@@ -192,18 +192,16 @@ static uchar*
convRR2M(RR *rp, uchar *p, uchar *ep, Dict *dp)
{
uchar *lp, *data;
- int len, ttl;
+ long ttl;
+ int len;
Txt *t;
NAME(rp->owner->name);
USHORT(rp->type);
USHORT(rp->owner->class);
- /* egregious overuse of ttl (it's absolute time in the cache) */
- if(rp->db)
+ if(rp->db || (ttl = (long)(rp->expire - now)) > rp->ttl)
ttl = rp->ttl;
- else
- ttl = rp->ttl - now;
if(ttl < 0)
ttl = 0;
ULONG(ttl);
diff --git a/sys/src/cmd/ndb/convM2DNS.c b/sys/src/cmd/ndb/convM2DNS.c
index 047b1bbec..c2b94c98d 100644
--- a/sys/src/cmd/ndb/convM2DNS.c
+++ b/sys/src/cmd/ndb/convM2DNS.c
@@ -345,7 +345,6 @@ retry:
rp->type = type;
ULONG(rp->ttl);
- rp->ttl += now;
USHORT(len); /* length of data following */
data = sp->p;
assert(data != nil);
diff --git a/sys/src/cmd/ndb/dblookup.c b/sys/src/cmd/ndb/dblookup.c
index ba118a769..657ad1f22 100644
--- a/sys/src/cmd/ndb/dblookup.c
+++ b/sys/src/cmd/ndb/dblookup.c
@@ -17,7 +17,7 @@ enum {
* confused by a zero ttl, and instead of using the data and then
* discarding the RR, they conclude that they don't have valid data.
*/
- Ptrttl = 120,
+ Ptrttl = 2*Min,
};
static Ndb *db;
@@ -611,10 +611,10 @@ dbpair2cache(DN *dp, Ndbtuple *entry, Ndbtuple *pair)
return;
rp->owner = dp;
- dnagenever(dp, 1);
rp->db = 1;
rp->ttl = intval(entry, pair, "ttl", rp->ttl);
rrattach(rp, Notauthoritative);
+ dnagenever(dp);
}
static void
dbtuple2cache(Ndbtuple *t)
@@ -911,9 +911,9 @@ addlocaldnsserver(DN *dp, int class, char *ipaddr, int i)
rp->owner = dp; /* e.g., local#dns#servers */
rp->local = 1;
rp->db = 1;
-// rp->ttl = 10*Min; /* seems too short */
- rp->ttl = (1UL<<31)-1;
+ rp->ttl = 10*Min;
rrattach(rp, Authoritative); /* will not attach rrs in my area */
+ dnagenever(dp);
/* A or AAAA record */
if (parseip(ip, ipaddr) >= 0 && isv4(ip))
@@ -924,9 +924,9 @@ addlocaldnsserver(DN *dp, int class, char *ipaddr, int i)
rp->owner = nsdp;
rp->local = 1;
rp->db = 1;
-// rp->ttl = 10*Min; /* seems too short */
- rp->ttl = (1UL<<31)-1;
+ rp->ttl = 10*Min;
rrattach(rp, Authoritative); /* will not attach rrs in my area */
+ dnagenever(nsdp);
dnslog("added local dns server %s at %s", buf, ipaddr);
}
@@ -983,6 +983,7 @@ addlocaldnsdomain(DN *dp, int class, char *domain)
rp->db = 1;
rp->ttl = 10*Min;
rrattach(rp, Authoritative);
+ dnagenever(dp);
}
/*
diff --git a/sys/src/cmd/ndb/dn.c b/sys/src/cmd/ndb/dn.c
index ffc55ef8f..7383c9e4b 100644
--- a/sys/src/cmd/ndb/dn.c
+++ b/sys/src/cmd/ndb/dn.c
@@ -14,14 +14,10 @@
* figure it out.
*/
enum {
-// Deftarget = 1<<30, /* effectively disable aging */
-// Minage = 1<<30,
-// Defagefreq = 1<<30, /* age names this often (seconds) */
-
/* these settings will trigger frequent aging */
Deftarget = 4000,
- Minage = 5*60,
- Defagefreq = 15*60, /* age names this often (seconds) */
+ Minage = 5*Min,
+ Defagefreq = 15*Min, /* age names this often (seconds) */
};
/*
@@ -305,9 +301,9 @@ dndump(char *file)
for(dp = ht[i]; dp; dp = dp->next){
fprint(fd, "%s\n", dp->name);
for(rp = dp->rr; rp; rp = rp->next) {
- fprint(fd, "\t%R %c%c %lud/%lud\n",
+ fprint(fd, "\t%R %c%c %ld/%lud\n",
rp, rp->auth? 'A': 'U',
- rp->db? 'D': 'N', rp->expire, rp->ttl);
+ rp->db? 'D': 'N', (long)(rp->expire - now), rp->ttl);
if (rronlist(rp, rp->next))
fprint(fd, "*** duplicate:\n");
}
@@ -372,29 +368,28 @@ dnage(DN *dp)
if (canlock(&dnlock))
abort(); /* dnage called with dnlock not held */
diff = now - dp->referenced;
- if(diff < Reserved || dp->keep)
+ if(diff < Reserved || dp->mark != 0)
return;
l = &dp->rr;
while ((rp = *l) != nil){
assert(rp->magic == RRmagic && rp->cached);
- if(!rp->db && (rp->expire < now || diff > dnvars.oldest))
+ if(!rp->db && ((long)(rp->expire - now) <= 0 || diff > dnvars.oldest))
rrdelhead(l); /* rp == *l before; *l == rp->next after */
else
l = &rp->next;
}
}
-#define MARK(dp) { if (dp) (dp)->keep = 1; }
+#define MARK(dp) { if (dp) (dp)->mark |= 2; }
/* mark a domain name and those in its RRs as never to be aged */
void
-dnagenever(DN *dp, int dolock)
+dnagenever(DN *dp)
{
RR *rp;
- if (dolock)
- lock(&dnlock);
+ lock(&dnlock);
/* mark all referenced domain names */
MARK(dp);
@@ -449,11 +444,10 @@ dnagenever(DN *dp, int dolock)
}
}
- if (dolock)
- unlock(&dnlock);
+ unlock(&dnlock);
}
-#define REF(dp) { if (dp) (dp)->refs++; }
+#define REF(dp) { if (dp) (dp)->mark |= 1; }
/*
* periodicly sweep for old records and remove unreferenced domain names
@@ -468,7 +462,7 @@ dnageall(int doit)
RR *rp;
static ulong nextage;
- if(dnvars.names < target || (now < nextage && !doit)){
+ if(dnvars.names < target || ((long)(nextage - now) > 0 && !doit)){
dnvars.oldest = maxage;
return;
}
@@ -483,14 +477,14 @@ dnageall(int doit)
if (agefreq > dnvars.oldest / 2)
nextage = now + dnvars.oldest / 2;
else
- nextage = now + agefreq;
+ nextage = now + (ulong)agefreq;
lock(&dnlock);
/* time out all old entries (and set refs to 0) */
for(i = 0; i < HTLEN; i++)
for(dp = ht[i]; dp; dp = dp->next){
- dp->refs = 0;
+ dp->mark &= ~1;
dnage(dp);
}
@@ -552,7 +546,7 @@ dnageall(int doit)
for(i = 0; i < HTLEN; i++){
l = &ht[i];
for(dp = *l; dp; dp = *l){
- if(dp->rr == nil && dp->refs == 0 && dp->keep == 0){
+ if(dp->rr == nil && dp->mark == 0){
assert(dp->magic == DNmagic);
*l = dp->next;
@@ -586,7 +580,7 @@ dnagedb(void)
/* time out all database entries */
for(i = 0; i < HTLEN; i++)
for(dp = ht[i]; dp; dp = dp->next) {
- dp->keep = 0;
+ dp->mark = 0;
for(rp = dp->rr; rp; rp = rp->next)
if(rp->db)
rp->expire = 0;
@@ -738,23 +732,29 @@ rrattach1(RR *new, int auth)
RR **l;
RR *rp;
DN *dp;
+ ulong ttl;
assert(new->magic == RRmagic && !new->cached);
- if(!new->db) {
- /*
- * try not to let responses expire before we
- * can use them to complete this query, by extending
- * past (or nearly past) expiration time.
- */
- new->expire = new->ttl > now + Min? new->ttl: now + 10*Min;
- } else
- new->expire = now + Year;
+
dp = new->owner;
assert(dp != nil && dp->magic == DNmagic);
new->auth |= auth;
new->next = 0;
/*
+ * try not to let responses expire before we
+ * can use them to complete this query, by extending
+ * past (or nearly past) expiration time.
+ */
+ if(new->db)
+ ttl = Year;
+ else
+ ttl = new->ttl;
+ if(ttl <= Min)
+ ttl = 10*Min;
+ new->expire = now + ttl;
+
+ /*
* find first rr of the right type
*/
l = &dp->rr;
@@ -788,9 +788,8 @@ rrattach1(RR *new, int auth)
}
/* all things equal, pick the newer one */
else if(rp->arg0 == new->arg0 && rp->arg1 == new->arg1){
- /* new drives out old */
- if (new->ttl <= rp->ttl &&
- new->expire <= rp->expire) {
+ /* old drives out new */
+ if((long)(rp->expire - new->expire) > 0) {
rrfree(new);
return;
}
@@ -842,8 +841,8 @@ rrattach(RR *rp, int auth)
next = rp->next;
rp->next = nil;
dp = rp->owner;
- /* avoid any outside spoofing; leave keepers alone */
- if(cfg.cachedb && !rp->db && (dp->keep || inmyarea(dp->name)))
+ /* avoid any outside spoofing */
+ if(cfg.cachedb && !rp->db && inmyarea(dp->name))
rrfree(rp);
else
rrattach1(rp, auth);
@@ -974,8 +973,8 @@ rrlookup(DN *dp, int type, int flag)
for(rp = dp->rr; rp; rp = rp->next){
if(!rp->db)
if(rp->auth)
- if(rp->ttl + 60 > now)
- if(tsame(type, rp->type)){
+ if((long)(rp->expire - now) > 0)
+ if(tsame(type, rp->type)){
if(flag == NOneg && rp->negative)
goto out;
last = rrcopy(rp, last);
@@ -987,7 +986,7 @@ rrlookup(DN *dp, int type, int flag)
/* try for a living unauthoritative network entry */
for(rp = dp->rr; rp; rp = rp->next){
if(!rp->db)
- if(rp->ttl + 60 > now)
+ if((long)(rp->expire - now) > 0)
if(tsame(type, rp->type)){
if(flag == NOneg && rp->negative)
goto out;
@@ -1822,7 +1821,9 @@ dnptr(uchar *net, uchar *mask, char *dom, int forwtype, int subdoms, int ttl)
for(rp = first; rp != nil; rp = nrp){
nrp = rp->next;
rp->next = nil;
+ dp = rp->owner;
rrattach(rp, Authoritative);
+ dnagenever(dp);
}
}
diff --git a/sys/src/cmd/ndb/dnresolve.c b/sys/src/cmd/ndb/dnresolve.c
index b21289c2b..6e8709e94 100644
--- a/sys/src/cmd/ndb/dnresolve.c
+++ b/sys/src/cmd/ndb/dnresolve.c
@@ -346,7 +346,7 @@ issuequery(Query *qp, char *name, int class, int depth, int recurse)
nsrp = randomize(rrlookup(nsdp, Tns, NOneg));
/* if the entry timed out, ignore it */
- if(nsrp && nsrp->ttl < now)
+ if(nsrp && !nsrp->db && (long)(nsrp->expire - now) <= 0)
rrfreelistptr(&nsrp);
if(nsrp){
@@ -397,7 +397,7 @@ dnresolve1(char *name, int class, int type, Request *req, int depth,
}
} else
/* cached entry must still be valid */
- if(rp->ttl > now)
+ if((long)(rp->expire - now) > 0)
/* but Tall entries are special */
if(type != Tall || rp->query == Tall) {
noteinmem();
@@ -850,7 +850,7 @@ cacheneg(DN *dp, int type, int rcode, RR *soarr)
/* the attach can cause soarr to be freed so mine it now */
if(soarr != nil && soarr->soa != nil)
- ttl = soarr->soa->minttl+now;
+ ttl = soarr->soa->minttl;
else
ttl = 5*Min;
@@ -893,11 +893,8 @@ mydnsquery(Query *qp, int medium, uchar *udppkt, int len)
rv = -1;
snprint(domain, sizeof(domain), "%I", udppkt);
- if (myaddr(domain)) {
- dnslog("mydnsquery: trying to send to myself (%s); bzzzt",
- domain);
+ if (myaddr(domain))
return rv;
- }
switch (medium) {
case Udp:
nfd = dup(qp->udpfd, -1);
@@ -1094,13 +1091,11 @@ procansw(Query *qp, DNSmsg *mp, uchar *srcip, int depth, Dest *p)
if(mp->an){
/*
* only use cname answer when returned. some dns servers
- * attach spam address records which poisons the cache.
+ * attach (potential) spam hint address records which poisons the cache.
*/
if((tp = rrremtype(&mp->an, Tcname)) != 0){
- if(mp->an){
- dnslog("removing spam %Q for %Q from %I", mp->an, tp, srcip);
+ if(mp->an)
rrfreelist(mp->an);
- }
mp->an = tp;
}
rrattach(mp->an, (mp->flags & Fauth) != 0);
diff --git a/sys/src/cmd/ndb/dns.h b/sys/src/cmd/ndb/dns.h
index 4c66ac1c4..1e0ae2e86 100644
--- a/sys/src/cmd/ndb/dns.h
+++ b/sys/src/cmd/ndb/dns.h
@@ -194,13 +194,10 @@ struct DN
char *name; /* owner */
RR *rr; /* resource records off this name */
ulong referenced; /* time last referenced */
- ulong lookuptime; /* last time we tried to get a better value */
- /* refs was `char' but we've seen refs > 120, so go whole hog */
- ulong refs; /* for mark and sweep */
ulong ordinal;
ushort class; /* RR class */
- uchar keep; /* flag: never age this name */
uchar respcode; /* response code */
+ uchar mark; /* for mark and sweep */
};
/*
@@ -448,7 +445,7 @@ void db2cache(int);
void dnage(DN*);
void dnageall(int);
void dnagedb(void);
-void dnagenever(DN *, int);
+void dnagenever(DN *);
void dnauthdb(void);
void dncheck(void);
void dndump(char*);
diff --git a/sys/src/cmd/ndb/dnsdebug.c b/sys/src/cmd/ndb/dnsdebug.c
index 0fca5c3cb..ee047a653 100644
--- a/sys/src/cmd/ndb/dnsdebug.c
+++ b/sys/src/cmd/ndb/dnsdebug.c
@@ -141,7 +141,7 @@ prettyrrfmt(Fmt *f)
p = buf;
e = buf + sizeof(buf);
p = seprint(p, e, "%-32.32s %-15.15s %-5.5s", rp->owner->name,
- longtime(rp->db? rp->ttl: (rp->ttl - now)),
+ longtime(rp->ttl),
rrname(rp->type, buf, sizeof buf));
if(rp->negative){
@@ -308,9 +308,10 @@ squirrelserveraddrs(void)
/* look up the resolver address first */
cfg.resolver = 0;
debug = 0;
- if(serveraddrs)
+ if(serveraddrs){
rrfreelist(serveraddrs);
- serveraddrs = nil;
+ serveraddrs = nil;
+ }
rr = getdnsservers(Cin);
l = &serveraddrs;
for(rp = rr; rp != nil; rp = rp->next){