summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2018-09-25 15:04:19 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2018-09-25 15:04:19 +0200
commitdbfb76673539e5b59dac437c6b2a2159c896731c (patch)
tree2db0234cc3882fa131135abedce937b9100574dd
parent12b3c82014efd24fa57037c001c7d3ce78204e5a (diff)
ip/dhcpd: implement rfc3397 dhcp search domain option (dnsdomain)
-rw-r--r--sys/src/cmd/ip/dhcp.h2
-rw-r--r--sys/src/cmd/ip/dhcpd/dhcpd.c40
2 files changed, 42 insertions, 0 deletions
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);
@@ -1576,6 +1582,40 @@ hexopt(Req *rp, int t, char *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)
{
char buf[256];