diff options
author | Alex Musolino <alex@musolino.id.au> | 2019-06-11 15:27:12 +0930 |
---|---|---|
committer | Alex Musolino <alex@musolino.id.au> | 2019-06-11 15:27:12 +0930 |
commit | 39a435ee1c9026ed8b26aa8bb1c03ac7d8d14809 (patch) | |
tree | a3eaf8205992e2aa1204f01a039ca94475c94926 | |
parent | d904a57e1763ac884a749b04f19f3e490a4cec88 (diff) |
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.
-rw-r--r-- | sys/src/cmd/ip/dhcp.h | 1 | ||||
-rw-r--r-- | sys/src/cmd/ip/snoopy/dhcp.c | 51 |
2 files changed, 51 insertions, 1 deletions
diff --git a/sys/src/cmd/ip/dhcp.h b/sys/src/cmd/ip/dhcp.h index 75bdeb62c..924b39106 100644 --- a/sys/src/cmd/ip/dhcp.h +++ b/sys/src/cmd/ip/dhcp.h @@ -112,6 +112,7 @@ enum ODbootfile= 67, ODdnsdomain= 119, + ODclasslessroutes= 121, /* plan9 vendor info options, v4 addresses only (deprecated) */ OP9fsv4= 128, /* plan9 file servers */ diff --git a/sys/src/cmd/ip/snoopy/dhcp.c b/sys/src/cmd/ip/snoopy/dhcp.c index 9d7d2b7a2..66bc40704 100644 --- a/sys/src/cmd/ip/snoopy/dhcp.c +++ b/sys/src/cmd/ip/snoopy/dhcp.c @@ -80,6 +80,52 @@ pserver(char *p, char *e, char *tag, uchar *o, int n) 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_seprint(Msg *m) 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); |