ref: 39a435ee1c9026ed8b26aa8bb1c03ac7d8d14809
parent: d904a57e1763ac884a749b04f19f3e490a4cec88
author: Alex Musolino <alex@musolino.id.au>
date: Tue Jun 11 11:27:12 EDT 2019
snoopy(8): add support for dhcp classless static routes option To complement the new cl-routes field, the bootp static routes option has been renamed to cf-routes and the network/gateway pairs are separated with a right arrow.
--- a/sys/src/cmd/ip/dhcp.h
+++ b/sys/src/cmd/ip/dhcp.h
@@ -112,6 +112,7 @@
ODbootfile= 67,
ODdnsdomain= 119,
+ ODclasslessroutes= 121,
/* plan9 vendor info options, v4 addresses only (deprecated) */
OP9fsv4= 128, /* plan9 file servers */
--- a/sys/src/cmd/ip/snoopy/dhcp.c
+++ b/sys/src/cmd/ip/snoopy/dhcp.c
@@ -80,6 +80,52 @@
return p;
}
+static char*
+pcfroutes(char *p, char *e, char *tag, uchar *o, int n)
+{
+ int i;
+
+ p = seprint(p, e, "%s=(", tag);
+ i = 0;
+ while(n >= 8){
+ if(i++ > 0)
+ p = seprint(p, e, " ");
+ p = seprint(p, e, "%V→%V", o, o+4);
+ o += 8;
+ n -= 8;
+ }
+ p = seprint(p, e, ")");
+ return p;
+}
+
+static char*
+pclroutes(char *p, char *e, char *tag, uchar *o, int n)
+{
+ uchar addr[4];
+ int i, nbits, nocts;
+
+ p = seprint(p, e, "%s=(", tag);
+ i = 0;
+ while(n >= 5){
+ nbits = *o++;
+ n--;
+ nocts = nbits <= 32 ? (nbits+7)/8 : 4;
+ if(n < nocts+4)
+ break;
+ memset(addr, 0, 4);
+ memmove(addr, o, nocts);
+ o += nocts;
+ n -= nocts;
+ if(i++ > 0)
+ p = seprint(p, e, " ");
+ p = seprint(p, e, "%V/%d→%V", addr, nbits, o);
+ o += 4;
+ n -= 4;
+ }
+ p = seprint(p, e, ")");
+ return p;
+}
+
static char *dhcptype[256] =
{
[Discover] "Discover",
@@ -264,7 +310,10 @@
p = pserver(p, e, "rsrouter", o, n);
break;
case OBstaticroutes:
- p = phex(p, e, "staticroutes", o, n);
+ p = pcfroutes(p, e, "cf-routes", o, n);
+ break;
+ case ODclasslessroutes:
+ p = pclroutes(p, e, "cl-routes", o, n);
break;
case OBtrailerencap:
p = phex(p, e, "trailerencap", o, n);