13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <ip.h>
43e12c5d1SDavid du Colombier
5*ea58ad6fSDavid du Colombier static uchar classmask[4][16] = {
67dd7cddfSDavid du Colombier 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0x00,0x00,0x00,
77dd7cddfSDavid du Colombier 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0x00,0x00,0x00,
87dd7cddfSDavid du Colombier 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0x00,0x00,
97dd7cddfSDavid du Colombier 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x00,
103e12c5d1SDavid du Colombier };
113e12c5d1SDavid du Colombier
12*ea58ad6fSDavid du Colombier static uchar v6loopback[IPaddrlen] = {
13*ea58ad6fSDavid du Colombier 0, 0, 0, 0,
14*ea58ad6fSDavid du Colombier 0, 0, 0, 0,
15*ea58ad6fSDavid du Colombier 0, 0, 0, 0,
16*ea58ad6fSDavid du Colombier 0, 0, 0, 0x01
17*ea58ad6fSDavid du Colombier };
18*ea58ad6fSDavid du Colombier
19*ea58ad6fSDavid du Colombier static uchar v6linklocal[IPaddrlen] = {
20*ea58ad6fSDavid du Colombier 0xfe, 0x80, 0, 0,
21*ea58ad6fSDavid du Colombier 0, 0, 0, 0,
22*ea58ad6fSDavid du Colombier 0, 0, 0, 0,
23*ea58ad6fSDavid du Colombier 0, 0, 0, 0
24*ea58ad6fSDavid du Colombier };
25*ea58ad6fSDavid du Colombier static uchar v6linklocalmask[IPaddrlen] = {
26*ea58ad6fSDavid du Colombier 0xff, 0xff, 0xff, 0xff,
27*ea58ad6fSDavid du Colombier 0xff, 0xff, 0xff, 0xff,
28*ea58ad6fSDavid du Colombier 0, 0, 0, 0,
29*ea58ad6fSDavid du Colombier 0, 0, 0, 0
30*ea58ad6fSDavid du Colombier };
31*ea58ad6fSDavid du Colombier static int v6llpreflen = 8; /* link-local prefix length in bytes */
32*ea58ad6fSDavid du Colombier
33*ea58ad6fSDavid du Colombier static uchar v6multicast[IPaddrlen] = {
34*ea58ad6fSDavid du Colombier 0xff, 0, 0, 0,
35*ea58ad6fSDavid du Colombier 0, 0, 0, 0,
36*ea58ad6fSDavid du Colombier 0, 0, 0, 0,
37*ea58ad6fSDavid du Colombier 0, 0, 0, 0
38*ea58ad6fSDavid du Colombier };
39*ea58ad6fSDavid du Colombier static uchar v6multicastmask[IPaddrlen] = {
40*ea58ad6fSDavid du Colombier 0xff, 0, 0, 0,
41*ea58ad6fSDavid du Colombier 0, 0, 0, 0,
42*ea58ad6fSDavid du Colombier 0, 0, 0, 0,
43*ea58ad6fSDavid du Colombier 0, 0, 0, 0
44*ea58ad6fSDavid du Colombier };
45*ea58ad6fSDavid du Colombier static int v6mcpreflen = 1; /* multicast prefix length */
46*ea58ad6fSDavid du Colombier
47*ea58ad6fSDavid du Colombier static uchar v6solicitednode[IPaddrlen] = {
48*ea58ad6fSDavid du Colombier 0xff, 0x02, 0, 0,
49*ea58ad6fSDavid du Colombier 0, 0, 0, 0,
50*ea58ad6fSDavid du Colombier 0, 0, 0, 0x01,
51*ea58ad6fSDavid du Colombier 0xff, 0, 0, 0
52*ea58ad6fSDavid du Colombier };
53*ea58ad6fSDavid du Colombier static uchar v6solicitednodemask[IPaddrlen] = {
54*ea58ad6fSDavid du Colombier 0xff, 0xff, 0xff, 0xff,
55*ea58ad6fSDavid du Colombier 0xff, 0xff, 0xff, 0xff,
56*ea58ad6fSDavid du Colombier 0xff, 0xff, 0xff, 0xff,
57*ea58ad6fSDavid du Colombier 0xff, 0x0, 0x0, 0x0
58*ea58ad6fSDavid du Colombier };
59*ea58ad6fSDavid du Colombier static int v6snpreflen = 13;
60*ea58ad6fSDavid du Colombier
617dd7cddfSDavid du Colombier uchar*
defmask(uchar * ip)627dd7cddfSDavid du Colombier defmask(uchar *ip)
637dd7cddfSDavid du Colombier {
64*ea58ad6fSDavid du Colombier if(isv4(ip))
657dd7cddfSDavid du Colombier return classmask[ip[IPv4off]>>6];
66*ea58ad6fSDavid du Colombier else {
67*ea58ad6fSDavid du Colombier if(ipcmp(ip, v6loopback) == 0)
68*ea58ad6fSDavid du Colombier return IPallbits;
69*ea58ad6fSDavid du Colombier else if(memcmp(ip, v6linklocal, v6llpreflen) == 0)
70*ea58ad6fSDavid du Colombier return v6linklocalmask;
71*ea58ad6fSDavid du Colombier else if(memcmp(ip, v6solicitednode, v6snpreflen) == 0)
72*ea58ad6fSDavid du Colombier return v6solicitednodemask;
73*ea58ad6fSDavid du Colombier else if(memcmp(ip, v6multicast, v6mcpreflen) == 0)
74*ea58ad6fSDavid du Colombier return v6multicastmask;
75*ea58ad6fSDavid du Colombier return IPallbits;
76*ea58ad6fSDavid du Colombier }
777dd7cddfSDavid du Colombier }
787dd7cddfSDavid du Colombier
793e12c5d1SDavid du Colombier void
maskip(uchar * from,uchar * mask,uchar * to)807dd7cddfSDavid du Colombier maskip(uchar *from, uchar *mask, uchar *to)
813e12c5d1SDavid du Colombier {
823e12c5d1SDavid du Colombier int i;
833e12c5d1SDavid du Colombier
847dd7cddfSDavid du Colombier for(i = 0; i < IPaddrlen; i++)
857dd7cddfSDavid du Colombier to[i] = from[i] & mask[i];
863e12c5d1SDavid du Colombier }
87