]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/ip/snoopy/dhcp.c
snoopy(8): add support for dhcp classless static routes option
[plan9front.git] / sys / src / cmd / ip / snoopy / dhcp.c
index 9d7d2b7a23aafd98d753b4b76648e2c749e40035..66bc407049bdcb42b6e737d8ce28e1bef73899a8 100644 (file)
@@ -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);