Browse Source

Plan 9 from Bell Labs 2007-04-04

David du Colombier 17 years ago
parent
commit
6c90375630

+ 10 - 10
dist/replica/_plan9.db

@@ -341,10 +341,10 @@
 386/bin/ndb - 20000000775 sys sys 985743147 0
 386/bin/ndb/cs - 775 sys sys 1169612028 150911
 386/bin/ndb/csquery - 775 sys sys 1168402337 61702
-386/bin/ndb/dns - 775 sys sys 1174964429 277544
-386/bin/ndb/dnsdebug - 775 sys sys 1174964430 252008
+386/bin/ndb/dns - 775 sys sys 1175655233 277472
+386/bin/ndb/dnsdebug - 775 sys sys 1175655234 252202
 386/bin/ndb/dnsquery - 775 sys sys 1174704818 64417
-386/bin/ndb/dnstcp - 775 sys sys 1175023298 250427
+386/bin/ndb/dnstcp - 775 sys sys 1175655235 250598
 386/bin/ndb/ipquery - 775 sys sys 1169612031 96994
 386/bin/ndb/mkdb - 775 sys sys 1168402340 64211
 386/bin/ndb/mkhash - 775 sys sys 1168402340 84780
@@ -12748,22 +12748,22 @@ sys/src/cmd/mtime.c - 664 sys sys 1036172302 450
 sys/src/cmd/mug.c - 664 sys sys 1157143847 24888
 sys/src/cmd/mv.c - 664 sys sys 1163029439 4682
 sys/src/cmd/ndb - 20000000775 sys sys 1080135004 0
-sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1174690184 6801
+sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1175642286 6881
 sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1174690173 10779
 sys/src/cmd/ndb/cs.c - 664 sys sys 1163208159 33080
 sys/src/cmd/ndb/csquery.c - 664 sys sys 1174626119 1073
 sys/src/cmd/ndb/dblookup.c - 664 sys sys 1174792290 20940
-sys/src/cmd/ndb/dn.c - 664 sys sys 1174930826 32533
+sys/src/cmd/ndb/dn.c - 664 sys sys 1175642250 32545
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1174626121 2505
 sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1174626121 3122
-sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1174887023 25765
-sys/src/cmd/ndb/dns.c - 664 sys sys 1174626124 15895
-sys/src/cmd/ndb/dns.h - 664 sys sys 1174930824 10527
+sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1175642403 26242
+sys/src/cmd/ndb/dns.c - 664 sys sys 1175642266 15906
+sys/src/cmd/ndb/dns.h - 664 sys sys 1175642258 10561
 sys/src/cmd/ndb/dnsdebug.c - 664 sys sys 1174690026 8779
 sys/src/cmd/ndb/dnserver.c - 664 sys sys 1174626125 4400
 sys/src/cmd/ndb/dnsquery.c - 664 sys sys 1174626126 2435
-sys/src/cmd/ndb/dnstcp.c - 664 sys sys 1174965165 7479
-sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1174626126 5497
+sys/src/cmd/ndb/dnstcp.c - 664 sys sys 1175642311 7419
+sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1175642323 5188
 sys/src/cmd/ndb/ipquery.c - 664 sys sys 1124711423 773
 sys/src/cmd/ndb/mkdb.c - 664 sys sys 957402054 2886
 sys/src/cmd/ndb/mkfile - 664 sys sys 1174623575 1984

+ 10 - 10
dist/replica/plan9.db

@@ -341,10 +341,10 @@
 386/bin/ndb - 20000000775 sys sys 985743147 0
 386/bin/ndb/cs - 775 sys sys 1169612028 150911
 386/bin/ndb/csquery - 775 sys sys 1168402337 61702
-386/bin/ndb/dns - 775 sys sys 1174964429 277544
-386/bin/ndb/dnsdebug - 775 sys sys 1174964430 252008
+386/bin/ndb/dns - 775 sys sys 1175655233 277472
+386/bin/ndb/dnsdebug - 775 sys sys 1175655234 252202
 386/bin/ndb/dnsquery - 775 sys sys 1174704818 64417
-386/bin/ndb/dnstcp - 775 sys sys 1175023298 250427
+386/bin/ndb/dnstcp - 775 sys sys 1175655235 250598
 386/bin/ndb/ipquery - 775 sys sys 1169612031 96994
 386/bin/ndb/mkdb - 775 sys sys 1168402340 64211
 386/bin/ndb/mkhash - 775 sys sys 1168402340 84780
@@ -12748,22 +12748,22 @@ sys/src/cmd/mtime.c - 664 sys sys 1036172302 450
 sys/src/cmd/mug.c - 664 sys sys 1157143847 24888
 sys/src/cmd/mv.c - 664 sys sys 1163029439 4682
 sys/src/cmd/ndb - 20000000775 sys sys 1080135004 0
-sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1174690184 6801
+sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1175642286 6881
 sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1174690173 10779
 sys/src/cmd/ndb/cs.c - 664 sys sys 1163208159 33080
 sys/src/cmd/ndb/csquery.c - 664 sys sys 1174626119 1073
 sys/src/cmd/ndb/dblookup.c - 664 sys sys 1174792290 20940
-sys/src/cmd/ndb/dn.c - 664 sys sys 1174930826 32533
+sys/src/cmd/ndb/dn.c - 664 sys sys 1175642250 32545
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1174626121 2505
 sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1174626121 3122
-sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1174887023 25765
-sys/src/cmd/ndb/dns.c - 664 sys sys 1174626124 15895
-sys/src/cmd/ndb/dns.h - 664 sys sys 1174930824 10527
+sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1175642403 26242
+sys/src/cmd/ndb/dns.c - 664 sys sys 1175642266 15906
+sys/src/cmd/ndb/dns.h - 664 sys sys 1175642258 10561
 sys/src/cmd/ndb/dnsdebug.c - 664 sys sys 1174690026 8779
 sys/src/cmd/ndb/dnserver.c - 664 sys sys 1174626125 4400
 sys/src/cmd/ndb/dnsquery.c - 664 sys sys 1174626126 2435
-sys/src/cmd/ndb/dnstcp.c - 664 sys sys 1174965165 7479
-sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1174626126 5497
+sys/src/cmd/ndb/dnstcp.c - 664 sys sys 1175642311 7419
+sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1175642323 5188
 sys/src/cmd/ndb/ipquery.c - 664 sys sys 1124711423 773
 sys/src/cmd/ndb/mkdb.c - 664 sys sys 957402054 2886
 sys/src/cmd/ndb/mkfile - 664 sys sys 1174623575 1984

+ 10 - 0
dist/replica/plan9.log

@@ -48113,3 +48113,13 @@
 1175565606 1 c sys/src/9/pc/sdata.c - 664 sys sys 1175564140 52809
 1175565606 2 c sys/src/boot/pc/pci.c - 664 sys sys 1175564218 20545
 1175565606 3 c sys/src/boot/pc/sdata.c - 664 sys sys 1175564193 38846
+1175643005 0 c sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1175642286 6881
+1175643005 1 c sys/src/cmd/ndb/dn.c - 664 sys sys 1175642250 32545
+1175643005 2 c sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1175642403 26242
+1175643005 3 c sys/src/cmd/ndb/dns.c - 664 sys sys 1175642266 15906
+1175643005 4 c sys/src/cmd/ndb/dns.h - 664 sys sys 1175642258 10561
+1175643005 5 c sys/src/cmd/ndb/dnstcp.c - 664 sys sys 1175642311 7419
+1175643005 6 c sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1175642323 5188
+1175655606 0 c 386/bin/ndb/dns - 775 sys sys 1175655233 277472
+1175655606 1 c 386/bin/ndb/dnsdebug - 775 sys sys 1175655234 252202
+1175655606 2 c 386/bin/ndb/dnstcp - 775 sys sys 1175655235 250598

+ 8 - 6
sys/src/cmd/ndb/convDNS2M.c

@@ -337,6 +337,7 @@ rrloop(RR *rp, int *countp, uchar *p, uchar *ep, Dict *dp, int quest)
 int
 convDNS2M(DNSmsg *m, uchar *buf, int len)
 {
+	ulong trunc = 0;
 	uchar *p, *ep, *np;
 	Dict d;
 
@@ -353,21 +354,22 @@ convDNS2M(DNSmsg *m, uchar *buf, int len)
 	p = rrloop(m->an, &m->ancount, p, ep, &d, 0);
 	p = rrloop(m->ns, &m->nscount, p, ep, &d, 0);
 	p = rrloop(m->ar, &m->arcount, p, ep, &d, 0);
-	if(p > ep)
-		return -1;
+	if(p > ep) {
+		trunc = Ftrunc;
+		dnslog("udp packet full; truncating my reply");
+		p = ep;
+	}
 
 	/* now pack the rest */
 	np = p;
 	p = buf;
 	ep = buf + len;
 	USHORT(m->id);
-	USHORT(m->flags);
+	USHORT(m->flags | trunc);
 	USHORT(m->qdcount);
 	USHORT(m->ancount);
 	USHORT(m->nscount);
 	USHORT(m->arcount);
-	if(p > ep)
-		return -1;
-
+	USED(p);
 	return np - buf;
 }

+ 2 - 2
sys/src/cmd/ndb/dn.c

@@ -488,7 +488,7 @@ getactivity(Request *req, int recursive)
 	 */
 	while(!recursive && dnvars.mutex){
 		unlock(&dnvars);
-		sleep(100);			/* was 200 */
+		sleep(100);			/* tune; was 200 */
 		lock(&dnvars);
 	}
 	rv = ++dnvars.active;
@@ -525,7 +525,7 @@ putactivity(int recursive)
 	dnvars.mutex = 1;
 	while(dnvars.active > 0){
 		unlock(&dnvars);
-		sleep(100);		/* was 100 */
+		sleep(100);		/* tune; was 100 */
 		lock(&dnvars);
 	}
 	unlock(&dnvars);

+ 19 - 8
sys/src/cmd/ndb/dnresolve.c

@@ -316,6 +316,7 @@ udpport(char *mtpt)
 	return fd;
 }
 
+/* generate a DNS UDP query packet */
 int
 mkreq(DN *dp, int type, uchar *buf, int flags, ushort reqno)
 {
@@ -335,8 +336,6 @@ mkreq(DN *dp, int type, uchar *buf, int flags, ushort reqno)
 	m.qd->owner = dp;
 	m.qd->type = type;
 	len = convDNS2M(&m, &buf[OUdphdrsize], Maxudp);
-	if(len < 0)
-		abort();	/* "can't convert" */
 	rrfree(m.qd);
 	return len;
 }
@@ -382,7 +381,7 @@ readreply(int fd, DN *dp, int type, ushort req, uchar *ibuf, DNSmsg *mp,
 		if(now >= endtime)
 			return -1;	/* timed out */
 
-		/* timed read */
+		/* timed read of UDP reply */
 		alarm((endtime - now) * 1000);
 		len = read(fd, ibuf, OUdphdrsize+Maxudpin);
 		alarm(0);
@@ -393,8 +392,13 @@ readreply(int fd, DN *dp, int type, ushort req, uchar *ibuf, DNSmsg *mp,
 		/* convert into internal format  */
 		memset(mp, 0, sizeof(*mp));
 		err = convM2DNS(&ibuf[OUdphdrsize], len, mp, nil);
+		if (mp->flags & Ftrunc) {
+			dnslog("truncated reply, len %d from %I", len, ibuf);
+			/* TODO: reissue query via tcp, process answer */
+			/* for now, salvage what we can */
+		}
 		if(err){
-			dnslog("input err: %s: %I", err, ibuf);
+			dnslog("input err, len %d: %s: %I", len, err, ibuf);
 			continue;
 		}
 		if(debug)
@@ -615,6 +619,7 @@ setdestoutns(Dest *p, int n)
 /*
  *  query name servers.  If the name server returns a pointer to another
  *  name server, recurse.
+ *  BUG: UDP only currently.
  */
 static int
 netquery1(int fd, DN *dp, int type, RR *nsrp, Request *reqp, int depth,
@@ -637,7 +642,9 @@ netquery1(int fd, DN *dp, int type, RR *nsrp, Request *reqp, int depth,
 
 	/* pack request into a message */
 	req = rand();
+	/* 1. generate UDP DNS query packet */
 	len = mkreq(dp, type, obuf, Frecurse|Oquery, req);
+	/* TODO: convert back and see if m.flags&Ftrunc is set */
 
 	/* no server addresses yet */
 	l = dest;
@@ -693,7 +700,8 @@ netquery1(int fd, DN *dp, int type, RR *nsrp, Request *reqp, int depth,
 				logsend(reqp->id, depth, obuf, p->s->name,
 					dp->name, type);
 
-			/* actually send the UDP packet */
+			/* 2. actually send the UDP packet */
+// TODO or send via TCP & keep fd around for reply */
 			if(write(fd, obuf, len + OUdphdrsize) < 0)
 				warning("sending udp msg %r");
 			p->nx++;
@@ -714,6 +722,7 @@ netquery1(int fd, DN *dp, int type, RR *nsrp, Request *reqp, int depth,
 				(inns? "in": "out"), obuf, dp->name,
 				rrname(type, buf, sizeof buf));
 			memset(&m, 0, sizeof m);
+			/* 3. get UDP reply packet */
 			if(readreply(fd, dp, type, req, ibuf, &m, endtime, reqp)
 			    < 0)
 				break;		/* timed out */
@@ -917,8 +926,9 @@ udpquery(char *mntpt, DN *dp, int type, RR *nsrp, Request *reqp, int depth,
 		reqp->aborttime = time(nil) + (patient? Maxreqtm: Maxreqtm/2);
 //		dnslog("udpquery: %s/udp for %s with %s ns", mntpt, dp->name,
 //			(inns? "inside": "outside"));
+		/* tune; was (patient? 15: 10) */
 		rv = netquery1(fd, dp, type, nsrp, reqp, depth,
-			ibuf, obuf, (patient? 15: 10), inns);
+			ibuf, obuf, (patient? 10: 5), inns);
 		close(fd);
 	} else
 		dnslog("can't get udpport for %s query of name %s: %r",
@@ -956,6 +966,7 @@ dnssetup(int domount, char *dns, char *srv, char *mtpt)
 	return fd;
 }
 
+/* this is unfinished */
 static RR *
 rrparse(char *lines)
 {
@@ -1004,7 +1015,7 @@ rrparse(char *lines)
 			break;
 		case Ta:
 		case Taaaa:
-			// "\t%s", dnname(rp->ip));	// TODO parseip
+			// "\t%s", dnname(rp->ip));	// TODO: parseip
 			break;
 		case Tptr:
 			// "\t%s", dnname(rp->ptr));
@@ -1157,7 +1168,7 @@ netquery(DN *dp, int type, RR *nsrp, Request *reqp, int depth)
 		rv = udpquery("/net.alt", dp, type, nsrp, reqp, depth, Patient,
 			Outns);
 	}
-	if (0 && rv == 0)		/* TODO: ask /net.alt/dns directly */
+	if (0 && rv == 0)		/* could ask /net.alt/dns directly */
 		askoutdns(dp, type);
 
 	if(lock)

+ 1 - 1
sys/src/cmd/ndb/dns.c

@@ -15,7 +15,7 @@ enum
 	Maxrrr=			16,
 	Maxfdata=		8192,
 
-	Defmaxage=		60*60,		/* 1 hour */
+	Defmaxage=		3*60*60,	/* tune; was 1 hour */
 
 	Qdir=			0,
 	Qdns=			1,

+ 4 - 3
sys/src/cmd/ndb/dns.h

@@ -142,10 +142,11 @@ enum
 	RRmagic=	0xdeadbabe,
 	DNmagic=	0xa110a110,
 
-	/* parallelism */
-	Maxactive=	32,
+	/* parallelism: tune; was 32 */
+	Maxactive=	64,
 
-	Maxreqtm=	60,	/* max. seconds to process a request */
+	/* tune; was 60 */
+	Maxreqtm=	30,	/* max. seconds to process a request */
 };
 
 typedef struct Area	Area;

+ 2 - 4
sys/src/cmd/ndb/dnstcp.c

@@ -191,14 +191,12 @@ reply(int fd, DNSmsg *rep, Request *req)
 
 
 	len = convDNS2M(rep, buf+2, sizeof(buf) - 2);
-	if(len <= 0)
-		abort();	/* "dnserver: converting reply" */
 	buf[0] = len>>8;
 	buf[1] = len;
 	rv = write(fd, buf, len+2);
 	if(rv != len+2){
-		dnslog("[%d] sending reply: %d instead of %d",
-			getpid(), rv, len+2);
+		dnslog("[%d] sending reply: %d instead of %d", getpid(), rv,
+			len+2);
 		exits(0);
 	}
 }

+ 0 - 12
sys/src/cmd/ndb/dnudpserver.c

@@ -232,7 +232,6 @@ reply(int fd, uchar *buf, DNSmsg *rep, Request *reqp)
 {
 	int len;
 	char tname[32];
-	RR *rp;
 
 	if(debug || (trace && subsume(trace, rep->qd->owner->name)))
 		dnslog("%d: reply (%I/%d) %d %s %s qd %R an %R ns %R ar %R",
@@ -242,17 +241,6 @@ reply(int fd, uchar *buf, DNSmsg *rep, Request *reqp)
 			rep->qd, rep->an, rep->ns, rep->ar);
 
 	len = convDNS2M(rep, &buf[OUdphdrsize], Maxudp);
-	if(len <= 0){
-		dnslog("error converting reply: %s %d",
-			rep->qd->owner->name, rep->qd->type);
-		for(rp = rep->an; rp; rp = rp->next)
-			dnslog("an %R", rp);
-		for(rp = rep->ns; rp; rp = rp->next)
-			dnslog("ns %R", rp);
-		for(rp = rep->ar; rp; rp = rp->next)
-			dnslog("ar %R", rp);
-		return;
-	}
 	len += OUdphdrsize;
 	if(write(fd, buf, len) != len)
 		dnslog("error sending reply: %r");