ref: 4631102321da63a1959ceccaa1b1091b09c112f1
parent: f12ca802b4d7783898e6e5c1537c44af461f12ed
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Feb 12 17:00:46 EST 2019
libip: sync with 9front
--- a/include/ip.h
+++ b/include/ip.h
@@ -10,9 +10,9 @@
int eipfmt(Fmt*);
int isv4(uchar*);
vlong parseip(uchar*, char*);
-vlong parseipmask(uchar*, char*);
+vlong parseipmask(uchar*, char*, int);
+vlong parseipandmask(uchar*, uchar*, char*, char*);
char* v4parseip(uchar*, char*);
-char* v4parsecidr(uchar*, uchar*, char*);
void hnputv(void*, uvlong);
void hnputl(void*, uint);
--- a/libip/parseip.c
+++ b/libip/parseip.c
@@ -112,7 +112,7 @@
}
if(v4){
to[10] = to[11] = 0xff;
- return nhgetl(to + IPv4off);
+ return (ulong)nhgetl(to + IPv4off);
} else
return 6;
}
@@ -122,10 +122,10 @@
* style
*/
vlong
-parseipmask(uchar *to, char *from)
+parseipmask(uchar *to, char *from, int v4)
{
- int i, w;
vlong x;
+ int i, w;
uchar *p;
if(*from == '/'){
@@ -133,6 +133,8 @@
i = atoi(from+1);
if(i < 0)
i = 0;
+ if(i <= 32 && v4)
+ i += 96;
if(i > 128)
i = 128;
w = i;
@@ -141,48 +143,34 @@
*p++ = 0xff;
if(i > 0)
*p = ~((1<<(8-i))-1);
- x = nhgetl(to+IPv4off);
/*
* identify as ipv6 if the mask is inexpressible as a v4 mask
* (because it has too few mask bits). Arguably, we could
* always return 6 here.
*/
- if (w < 8*(IPaddrlen-IPv4addrlen))
- return 6;
+ if (w < 96)
+ return v4 ? -1 : 6;
+ x = (ulong)nhgetl(to+IPv4off);
} else {
/* as a straight v4 bit mask */
x = parseip(to, from);
- if (x != -1)
- x = (ulong)nhgetl(to + IPv4off);
if(memcmp(to, v4prefix, IPv4off) == 0)
memset(to, 0xff, IPv4off);
+ else if(v4)
+ x = -1;
}
return x;
}
-/*
- * parse a v4 ip address/mask in cidr format
- */
-char*
-v4parsecidr(uchar *addr, uchar *mask, char *from)
+vlong
+parseipandmask(uchar *ip, uchar *mask, char *ipstr, char *maskstr)
{
- int i;
- char *p;
- uchar *a;
+ vlong x;
- p = v4parseip(addr, from);
-
- if(*p == '/'){
- /* as a number of prefix bits */
- i = strtoul(p+1, &p, 0);
- if(i > 32)
- i = 32;
- memset(mask, 0, IPv4addrlen);
- for(a = mask; i >= 8; i -= 8)
- *a++ = 0xff;
- if(i > 0)
- *a = ~((1<<(8-i))-1);
- } else
- memcpy(mask, defmask(addr), IPv4addrlen);
- return p;
+ x = parseip(ip, ipstr);
+ if(maskstr == nil)
+ memset(mask, 0xff, IPaddrlen);
+ else if(parseipmask(mask, maskstr, memcmp(ip, v4prefix, IPv4off) == 0) == -1)
+ x = -1;
+ return x;
}