update ipifc with better ip6 error messages. Reference: /n/atom/patch/applied/ipifcip6upd Date: Fri Mar 7 16:07:56 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/9/ip/ipifc.c Fri Mar 7 16:07:36 2014 +++ /sys/src/9/ip/ipifc.c Fri Mar 7 16:07:37 2014 @@ -16,6 +16,7 @@ NHASH = 1<<6, NCACHE = 256, QMAX = 192*1024-1, + Maxv6repr = (128/(4*4))*(4+1), /* limit of xxxx:xxxx:⋯ notation */ }; Medium *media[Maxmedia] = { 0 }; @@ -1152,7 +1153,7 @@ { if(isv4(addr) || ipcmp(addr, IPnoaddr) == 0) return unknownv6; - if(islinklocal(addr) || + else if(islinklocal(addr) || isv6mcast(addr) && (addr[1] & 0xF) <= Link_local_scop) return linklocalv6; else @@ -1607,7 +1608,7 @@ { int plen = 64; long origint = NOW / 1000, preflt = ~0L, validlt = ~0L; - char addr[40], preflen[6]; + char addr[Maxv6repr], preflen[6]; char *params[3]; uchar autoflag = 1, onlink = 1; uchar prefix[IPaddrlen]; @@ -1635,9 +1636,17 @@ return Ebadarg; } - if (parseip(prefix, argv[1]) != 6 || validlt < preflt || plen < 0 || - plen > 64 || islinklocal(prefix)) - return Ebadarg; + if (parseip(prefix, argv[1]) != 6) + return "bad ipv6 address"; + if (validlt < preflt) + return "valid ipv6 lifetime less than preferred lifetime"; + if (plen < 0) + return "negative ipv6 prefix length"; + /* i think that this length limit is bogus - geoff */ +// if (plen > 64) +// return "ipv6 prefix length greater than 64; + if (islinklocal(prefix)) + return "ipv6 prefix is link-local"; lifc = smalloc(sizeof(Iplifc)); lifc->onlink = (onlink != 0); @@ -1648,10 +1657,10 @@ /* issue "add" ctl msg for v6 link-local addr and prefix len */ if(!ifc->m->pref2addr) - return Ebadarg; + return "no pref2addr on interface"; ifc->m->pref2addr(prefix, ifc->mac); /* mac → v6 link-local addr */ - sprint(addr, "%I", prefix); - sprint(preflen, "/%d", plen); + snprint(addr, sizeof addr, "%I", prefix); + snprint(preflen, sizeof preflen, "/%d", plen); params[0] = "add"; params[1] = addr; params[2] = preflen; --- /sys/src/nix/ip/ipifc.c Fri Mar 7 16:07:39 2014 +++ /sys/src/nix/ip/ipifc.c Fri Mar 7 16:07:41 2014 @@ -16,6 +16,7 @@ NHASH = 1<<6, NCACHE = 256, QMAX = 64*1024-1, + Maxv6repr = (128/(4*4))*(4+1), /* limit of xxxx:xxxx:⋯ notation */ }; Medium *media[Maxmedia] = { 0 }; @@ -1152,7 +1153,7 @@ { if(isv4(addr) || ipcmp(addr, IPnoaddr) == 0) return unknownv6; - if(islinklocal(addr) || + else if(islinklocal(addr) || isv6mcast(addr) && (addr[1] & 0xF) <= Link_local_scop) return linklocalv6; else @@ -1607,7 +1608,7 @@ { int plen = 64; long origint = NOW / 1000, preflt = ~0L, validlt = ~0L; - char addr[40], preflen[6]; + char addr[Maxv6repr], preflen[6]; char *params[3]; uchar autoflag = 1, onlink = 1; uchar prefix[IPaddrlen]; @@ -1635,9 +1636,17 @@ return Ebadarg; } - if (parseip(prefix, argv[1]) != 6 || validlt < preflt || plen < 0 || - plen > 64 || islinklocal(prefix)) - return Ebadarg; + if (parseip(prefix, argv[1]) != 6) + return "bad ipv6 address"; + if (validlt < preflt) + return "valid ipv6 lifetime less than preferred lifetime"; + if (plen < 0) + return "negative ipv6 prefix length"; + /* i think that this length limit is bogus - geoff */ +// if (plen > 64) +// return "ipv6 prefix length greater than 64; + if (islinklocal(prefix)) + return "ipv6 prefix is link-local"; lifc = smalloc(sizeof(Iplifc)); lifc->onlink = (onlink != 0); @@ -1648,10 +1657,10 @@ /* issue "add" ctl msg for v6 link-local addr and prefix len */ if(!ifc->m->pref2addr) - return Ebadarg; + return "no pref2addr on interface"; ifc->m->pref2addr(prefix, ifc->mac); /* mac → v6 link-local addr */ - sprint(addr, "%I", prefix); - sprint(preflen, "/%d", plen); + snprint(addr, sizeof addr, "%I", prefix); + snprint(preflen, sizeof preflen, "/%d", plen); params[0] = "add"; params[1] = addr; params[2] = preflen;