% cat >/sys/lib/dist/changes/1175643005.0.txt << EOF Need clarification from Geoff on this and other recent DNS changes, though this one seems to be largely whitespace and comment related with some NS record changes. I'll need to take a deeper look into this, in any case. These and (previous changes missing from this directory) are related to: • Add support for SRV records • Recognize truncated UDP replies and re-issue the query via TCP • Support servers straddling a firewall. • Various bugfixes (caching and small sizes). Visible changes should be described in ndb(8) EOF [geoff] --rw-rw-r-- M 77 glenda sys 32939 Apr 7 01:59 sys/src/cmd/ndb/dn.c /n/sourcesdump/2007/0407/plan9/sys/src/cmd/ndb/dn.c:311,318 - /n/sources/plan9/sys/src/cmd/ndb/dn.c:311,318 } if(dnvars.names >= target) { - dnslog("more names (%lud) than target (%lud)", - dnvars.names, target); + dnslog("more names (%lud) than target (%lud)", dnvars.names, + target); dnvars.oldest /= 2; } nextage = now + maxage; /n/sourcesdump/2007/0407/plan9/sys/src/cmd/ndb/dn.c:595,601 - /n/sources/plan9/sys/src/cmd/ndb/dn.c:595,602 } /* all things equal, pick the newer one */ - if(rp->arg0 == new->arg0 && rp->arg1 == new->arg1){ + if(rp->arg0 == new->arg0 && rp->arg1 == new->arg1 && + (rp->type != Tsrv || rp->srv == new->srv)){ /* new drives out old */ if (new->ttl > rp->ttl || new->expire > rp->expire){ /n/sourcesdump/2007/0407/plan9/sys/src/cmd/ndb/dn.c:1474,1480 - /n/sources/plan9/sys/src/cmd/ndb/dn.c:1475,1482 return r1->owner == r2->owner && r1->type == r2->type && r1->arg0 == r2->arg0 - && r1->arg1 == r2->arg1; + && r1->arg1 == r2->arg1 + && (r1->type != Tsrv || r1->srv == r2->srv); } void /n/sourcesdump/2007/0407/plan9/sys/src/cmd/ndb/dn.c:1509,1514 - /n/sources/plan9/sys/src/cmd/ndb/dn.c:1511,1533 return 1; } + int isaslug(uchar nsip[]); + + static int + rrisslug(RR *rp) + { + uchar addr[IPaddrlen]; + RR *iprr; + + if (rp->type != Tns) + return 0; + iprr = rrlookup(rp->host, Ta, NOneg); + if (iprr == nil) + return 0; + parseip(addr, iprr->ip->name); + return isaslug(addr); + } + /* * randomize the order we return items to provide some * load balancing for servers. /n/sourcesdump/2007/0407/plan9/sys/src/cmd/ndb/dn.c:1524,1530 - /n/sources/plan9/sys/src/cmd/ndb/dn.c:1543,1549 if(rp == nil || rp->next == nil) return rp; - /* just randomize addresses and mx's */ + /* just randomize addresses, mx's and ns's */ for(x = rp; x; x = x->next) if(x->type != Ta && x->type != Tmx && x->type != Tns) return rp; /n/sourcesdump/2007/0407/plan9/sys/src/cmd/ndb/dn.c:1545,1551 - /n/sources/plan9/sys/src/cmd/ndb/dn.c:1564,1570 rp = x->next; x->next = nil; - if(n&1){ + if(n&1 && x->type == Tns && rrisslug(x)){ /* add to tail */ if(last == nil) first = x; /n/sourcesdump/2007/0407/plan9/sys/src/cmd/ndb/dn.c:1563,1568 - /n/sources/plan9/sys/src/cmd/ndb/dn.c:1582,1588 /* reroll the dice */ n >>= 1; } + return first; } [geoff] --rw-rw-r-- M 77 glenda sys 5251 Apr 7 02:00 sys/src/cmd/ndb/dnudpserver.c /n/sourcesdump/2007/0407/plan9/sys/src/cmd/ndb/dnudpserver.c:146,158 - /n/sources/plan9/sys/src/cmd/ndb/dnudpserver.c:146,156 goto freereq; } - if(debug || (trace && subsume(trace, reqmsg.qd->owner->name))){ + if(debug || (trace && subsume(trace, reqmsg.qd->owner->name))) dnslog("%d: serve (%I/%d) %d %s %s", req.id, buf, uh->rport[0]<<8 | uh->rport[1], - reqmsg.id, - reqmsg.qd->owner->name, + reqmsg.id, reqmsg.qd->owner->name, rrname(reqmsg.qd->type, tname, sizeof tname)); - } p = clientrxmit(&reqmsg, buf); if(p == nil){ /n/sourcesdump/2007/0407/plan9/sys/src/cmd/ndb/dnudpserver.c:172,177 - /n/sources/plan9/sys/src/cmd/ndb/dnudpserver.c:170,176 dnnotify(&reqmsg, &repmsg, &req); break; } + /* send reply on fd to address in buf's udp hdr */ reply(fd, buf, &repmsg, &req); rrfreelist(repmsg.qd); rrfreelist(repmsg.an); [geoff] --rw-rw-r-- M 77 glenda sys 29811 Apr 7 02:36 sys/src/cmd/ndb/dnresolve.c [diffs elided - too long] [diff -c /n/sourcesdump/2007/0407/plan9/sys/src/cmd/ndb/dnresolve.c /n/sources/plan9/sys/src/cmd/ndb/dnresolve.c]