From dbfb76673539e5b59dac437c6b2a2159c896731c Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Tue, 25 Sep 2018 15:04:19 +0200 Subject: ip/dhcpd: implement rfc3397 dhcp search domain option (dnsdomain) --- sys/src/cmd/ip/dhcp.h | 2 ++ sys/src/cmd/ip/dhcpd/dhcpd.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/sys/src/cmd/ip/dhcp.h b/sys/src/cmd/ip/dhcp.h index 59edf4d3b..f69d4502d 100644 --- a/sys/src/cmd/ip/dhcp.h +++ b/sys/src/cmd/ip/dhcp.h @@ -111,6 +111,8 @@ enum ODtftpserver= 66, ODbootfile= 67, + ODdnsdomain= 119, + /* plan9 vendor info options, v4 addresses only (deprecated) */ OP9fsv4= 128, /* plan9 file servers */ OP9authv4= 129, /* plan9 auth servers */ diff --git a/sys/src/cmd/ip/dhcpd/dhcpd.c b/sys/src/cmd/ip/dhcpd/dhcpd.c index f0b24edef..d74e6391c 100644 --- a/sys/src/cmd/ip/dhcpd/dhcpd.c +++ b/sys/src/cmd/ip/dhcpd/dhcpd.c @@ -161,6 +161,7 @@ char *optname[256] = [ODclientid] "cid", [ODtftpserver] "tftpserver", [ODbootfile] "bf", +[ODdnsdomain] "dnsdomain", }; void addropt(Req*, int, uchar*); @@ -177,6 +178,7 @@ void maskopt(Req*, int, uchar*); void miscoptions(Req*, uchar*); int openlisten(char *net); void p9addrsopt(Req *rp, int t, uchar **ip, int i); +void dnsnamesopt(Req *rp, int t, char *attr, Ndbtuple *nt); void parseoptions(Req*); void proto(Req*, int); void rcvdecline(Req*); @@ -1170,6 +1172,7 @@ miscoptions(Req *rp, uchar *ip) a = attr; if(*rp->ii.domain == 0) a[na++] = "dom"; + a[na++] = "dnsdomain"; for(i = 0; i < sizeof(rp->requested); i++) switch(rp->requested[i]){ case OBrouter: @@ -1228,6 +1231,9 @@ miscoptions(Req *rp, uchar *ip) if(p != nil) stringopt(rp, OBdomainname, p+1); break; + case ODdnsdomain: + dnsnamesopt(rp, ODdnsdomain, "dnsdomain", t); + break; case OBnetbiosns: j = lookupserver("wins", addrs, nelem(addrs), t); addrsopt(rp, OBnetbiosns, addrs, j); @@ -1575,6 +1581,40 @@ hexopt(Req *rp, int t, char *str) op = seprint(op, oe, "%s(%s)", optname[t], str); } +void +dnsnamesopt(Req *rp, int t, char *attr, Ndbtuple *nt) +{ + char *s; + uchar *d; + int n, l; + + for(; nt != nil; nt = nt->entry){ + if(strcmp(nt->attr, attr) != 0) + continue; + d = &rp->p[2]; + for(s = nt->val; *s != 0; s++){ + for(l = 0; *s != 0 && *s != '.'; l++) + s++; + if(l > 077) + goto Skip; + d += l+1; + if(d >= rp->max) + return; + d[-l-1] = l; + memmove(d-l, s-l, l); + } + *d++ = 0; + n = d - &rp->p[2]; + if(n > 255) + continue; + rp->p[0] = t; + rp->p[1] = n; + rp->p = d; + op = seprint(op, oe, "%s(%s)", optname[t], nt->val); + Skip:; + } +} + void arpenter(uchar *ip, uchar *mac, uchar *src) { -- cgit v1.2.3