code: plan9front

Download patch

ref: 65db7054815f4efcdd1c6c9638b6e7f05950f481
parent: ffd294e0da7a60613920a463f4522320fea0b765
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Jun 14 17:31:44 EDT 2015

ndb/dns: cleanup forwarding code (redistrib())

instead of copying the whole packet, just save the
udp header and restore it aftwards. dont call redistrib()
when there are no forwards (this should be almost always
the case).

--- a/sys/src/cmd/ndb/dns.h
+++ b/sys/src/cmd/ndb/dns.h
@@ -523,7 +523,6 @@
 /* dnserver.c */
 void	dnserver(DNSmsg*, DNSmsg*, Request*, uchar *, int);
 void	dnudpserver(char*);
-void	dntcpserver(char*);
 
 /* dnnotify.c */
 void	dnnotify(DNSmsg*, DNSmsg*, Request*);
--- a/sys/src/cmd/ndb/dnudpserver.c
+++ b/sys/src/cmd/ndb/dnudpserver.c
@@ -29,7 +29,7 @@
 	ulong	lastdial;
 };
 Forwtarg forwtarg[10];
-int currtarg;
+int forwtcount;
 
 static char *hmsg = "headers";
 
@@ -75,11 +75,11 @@
 {
 	Forwtarg *tp;
 
-	if (currtarg >= nelem(forwtarg)) {
+	if (forwtcount >= nelem(forwtarg)) {
 		dnslog("too many forwarding targets");
 		return -1;
 	}
-	tp = forwtarg + currtarg;
+	tp = forwtarg + forwtcount;
 	if (parseip(tp->addr, host) < 0) {
 		dnslog("can't parse ip %s", host);
 		return -1;
@@ -91,7 +91,7 @@
 
 	free(tp->host);
 	tp->host = estrdup(host);
-	currtarg++;
+	forwtcount++;
 	return 0;
 }
 
@@ -102,18 +102,18 @@
 static void
 redistrib(uchar *buf, int len)
 {
-	static uchar outpkt[Udphdrsize + Maxudp + 1024];
+	uchar save[Udphdrsize];
 	Forwtarg *tp;
 	Udphdr *uh;
 
-	assert(len <= sizeof outpkt);
-	memmove(outpkt, buf, len);
-	uh = (Udphdr *)outpkt;
-	for (tp = forwtarg; tp < forwtarg + currtarg; tp++)
+	memmove(save, buf, Udphdrsize);
+
+	uh = (Udphdr *)buf;
+	for (tp = forwtarg; tp < forwtarg + forwtcount; tp++)
 		if (tp->fd > 0) {
-			memmove(outpkt, tp->addr, sizeof tp->addr);
+			memmove(uh->raddr, tp->addr, sizeof tp->addr);
 			hnputs(uh->rport, 53);		/* dns port */
-			if (write(tp->fd, outpkt, len) != len) {
+			if (write(tp->fd, buf, len) != len) {
 				close(tp->fd);
 				tp->fd = -1;
 			}
@@ -121,6 +121,8 @@
 			tp->lastdial = time(nil);
 			tp->fd = udpport(mntpt);
 		}
+
+	memmove(buf, save, Udphdrsize);
 }
 
 /*
@@ -180,7 +182,8 @@
 		if(len <= Udphdrsize)
 			goto restart;
 
-		redistrib(buf, len);
+		if(forwtcount > 0)
+			redistrib(buf, len);
 
 		uh = (Udphdr*)buf;
 		len -= Udphdrsize;