1 d7094239 2003-11-23 devnull #include <u.h>
2 d7094239 2003-11-23 devnull #include <libc.h>
3 d7094239 2003-11-23 devnull #include <ip.h>
6 d7094239 2003-11-23 devnull v4parseip(uchar *to, char *from)
11 d7094239 2003-11-23 devnull p = from;
12 d7094239 2003-11-23 devnull for(i = 0; i < 4 && *p; i++){
13 d7094239 2003-11-23 devnull to[i] = strtoul(p, &p, 0);
14 d7094239 2003-11-23 devnull if(*p == '.')
17 d7094239 2003-11-23 devnull switch(CLASS(to)){
18 d7094239 2003-11-23 devnull case 0: /* class A - 1 uchar net */
20 d7094239 2003-11-23 devnull if(i == 3){
21 d7094239 2003-11-23 devnull to[3] = to[2];
22 d7094239 2003-11-23 devnull to[2] = to[1];
23 d7094239 2003-11-23 devnull to[1] = 0;
24 d7094239 2003-11-23 devnull } else if (i == 2){
25 d7094239 2003-11-23 devnull to[3] = to[1];
26 d7094239 2003-11-23 devnull to[1] = 0;
29 d7094239 2003-11-23 devnull case 2: /* class B - 2 uchar net */
30 d7094239 2003-11-23 devnull if(i == 3){
31 d7094239 2003-11-23 devnull to[3] = to[2];
32 d7094239 2003-11-23 devnull to[2] = 0;
36 d7094239 2003-11-23 devnull return p;
40 d7094239 2003-11-23 devnull parseip(uchar *to, char *from)
42 d7094239 2003-11-23 devnull int i, elipsis = 0, v4 = 1;
44 d7094239 2003-11-23 devnull char *p, *op;
46 d7094239 2003-11-23 devnull memset(to, 0, IPaddrlen);
47 d7094239 2003-11-23 devnull p = from;
48 d7094239 2003-11-23 devnull for(i = 0; i < 16 && *p; i+=2){
50 d7094239 2003-11-23 devnull x = strtoul(p, &p, 16);
51 d7094239 2003-11-23 devnull if(*p == '.' || (*p == 0 && i == 0)){
52 d7094239 2003-11-23 devnull p = v4parseip(to+i, op);
56 d7094239 2003-11-23 devnull to[i] = x>>8;
57 d7094239 2003-11-23 devnull to[i+1] = x;
58 d7094239 2003-11-23 devnull if(*p == ':'){
60 d7094239 2003-11-23 devnull if(*++p == ':'){
61 d7094239 2003-11-23 devnull elipsis = i+2;
66 d7094239 2003-11-23 devnull if(i < 16){
67 d7094239 2003-11-23 devnull memmove(&to[elipsis+16-i], &to[elipsis], i-elipsis);
68 d7094239 2003-11-23 devnull memset(&to[elipsis], 0, 16-i);
71 d7094239 2003-11-23 devnull to[10] = to[11] = 0xff;
72 d7094239 2003-11-23 devnull return nhgetl(to+12);
74 d7094239 2003-11-23 devnull return 6;
78 d7094239 2003-11-23 devnull * hack to allow ip v4 masks to be entered in the old
82 d7094239 2003-11-23 devnull parseipmask(uchar *to, char *from)
86 d7094239 2003-11-23 devnull uchar *p;
88 d7094239 2003-11-23 devnull if(*from == '/'){
89 d7094239 2003-11-23 devnull /* as a number of prefix bits */
90 d7094239 2003-11-23 devnull i = atoi(from+1);
91 d7094239 2003-11-23 devnull if(i < 0)
93 d7094239 2003-11-23 devnull if(i > 128)
95 d7094239 2003-11-23 devnull memset(to, 0, IPaddrlen);
96 d7094239 2003-11-23 devnull for(p = to; i >= 8; i -= 8)
97 d7094239 2003-11-23 devnull *p++ = 0xff;
98 d7094239 2003-11-23 devnull if(i > 0)
99 d7094239 2003-11-23 devnull *p = ~((1<<(8-i))-1);
100 d7094239 2003-11-23 devnull x = nhgetl(to+IPv4off);
101 d7094239 2003-11-23 devnull } else {
102 d7094239 2003-11-23 devnull /* as a straight bit mask */
103 d7094239 2003-11-23 devnull x = parseip(to, from);
104 d7094239 2003-11-23 devnull if(memcmp(to, v4prefix, IPv4off) == 0)
105 d7094239 2003-11-23 devnull memset(to, 0xff, IPv4off);
107 d7094239 2003-11-23 devnull return x;
111 d7094239 2003-11-23 devnull * parse a v4 ip address/mask in cidr format
114 d7094239 2003-11-23 devnull v4parsecidr(uchar *addr, uchar *mask, char *from)
117 d7094239 2003-11-23 devnull char *p;
118 d7094239 2003-11-23 devnull uchar *a;
120 d7094239 2003-11-23 devnull p = v4parseip(addr, from);
122 d7094239 2003-11-23 devnull if(*p == '/'){
123 d7094239 2003-11-23 devnull /* as a number of prefix bits */
124 d7094239 2003-11-23 devnull i = strtoul(p+1, &p, 0);
125 d7094239 2003-11-23 devnull if(i > 32)
127 d7094239 2003-11-23 devnull memset(mask, 0, IPv4addrlen);
128 d7094239 2003-11-23 devnull for(a = mask; i >= 8; i -= 8)
129 d7094239 2003-11-23 devnull *a++ = 0xff;
130 d7094239 2003-11-23 devnull if(i > 0)
131 d7094239 2003-11-23 devnull *a = ~((1<<(8-i))-1);
133 d7094239 2003-11-23 devnull memcpy(mask, defmask(addr), IPv4addrlen);
134 d7094239 2003-11-23 devnull return p;