1*58da3067SDavid du Colombier #include <u.h>
2*58da3067SDavid du Colombier #include <libc.h>
3*58da3067SDavid du Colombier #include <ip.h>
4*58da3067SDavid du Colombier
5*58da3067SDavid du Colombier static uchar classmask[4][16] = {
6*58da3067SDavid du Colombier 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0x00,0x00,0x00,
7*58da3067SDavid du Colombier 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0x00,0x00,0x00,
8*58da3067SDavid du Colombier 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0x00,0x00,
9*58da3067SDavid du Colombier 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x00,
10*58da3067SDavid du Colombier };
11*58da3067SDavid du Colombier
12*58da3067SDavid du Colombier static uchar v6loopback[IPaddrlen] = {
13*58da3067SDavid du Colombier 0, 0, 0, 0,
14*58da3067SDavid du Colombier 0, 0, 0, 0,
15*58da3067SDavid du Colombier 0, 0, 0, 0,
16*58da3067SDavid du Colombier 0, 0, 0, 0x01
17*58da3067SDavid du Colombier };
18*58da3067SDavid du Colombier
19*58da3067SDavid du Colombier static uchar v6linklocal[IPaddrlen] = {
20*58da3067SDavid du Colombier 0xfe, 0x80, 0, 0,
21*58da3067SDavid du Colombier 0, 0, 0, 0,
22*58da3067SDavid du Colombier 0, 0, 0, 0,
23*58da3067SDavid du Colombier 0, 0, 0, 0
24*58da3067SDavid du Colombier };
25*58da3067SDavid du Colombier static uchar v6linklocalmask[IPaddrlen] = {
26*58da3067SDavid du Colombier 0xff, 0xff, 0xff, 0xff,
27*58da3067SDavid du Colombier 0xff, 0xff, 0xff, 0xff,
28*58da3067SDavid du Colombier 0, 0, 0, 0,
29*58da3067SDavid du Colombier 0, 0, 0, 0
30*58da3067SDavid du Colombier };
31*58da3067SDavid du Colombier static int v6llpreflen = 8; /* link-local prefix length in bytes */
32*58da3067SDavid du Colombier
33*58da3067SDavid du Colombier static uchar v6multicast[IPaddrlen] = {
34*58da3067SDavid du Colombier 0xff, 0, 0, 0,
35*58da3067SDavid du Colombier 0, 0, 0, 0,
36*58da3067SDavid du Colombier 0, 0, 0, 0,
37*58da3067SDavid du Colombier 0, 0, 0, 0
38*58da3067SDavid du Colombier };
39*58da3067SDavid du Colombier static uchar v6multicastmask[IPaddrlen] = {
40*58da3067SDavid du Colombier 0xff, 0, 0, 0,
41*58da3067SDavid du Colombier 0, 0, 0, 0,
42*58da3067SDavid du Colombier 0, 0, 0, 0,
43*58da3067SDavid du Colombier 0, 0, 0, 0
44*58da3067SDavid du Colombier };
45*58da3067SDavid du Colombier static int v6mcpreflen = 1; /* multicast prefix length */
46*58da3067SDavid du Colombier
47*58da3067SDavid du Colombier static uchar v6solicitednode[IPaddrlen] = {
48*58da3067SDavid du Colombier 0xff, 0x02, 0, 0,
49*58da3067SDavid du Colombier 0, 0, 0, 0,
50*58da3067SDavid du Colombier 0, 0, 0, 0x01,
51*58da3067SDavid du Colombier 0xff, 0, 0, 0
52*58da3067SDavid du Colombier };
53*58da3067SDavid du Colombier static uchar v6solicitednodemask[IPaddrlen] = {
54*58da3067SDavid du Colombier 0xff, 0xff, 0xff, 0xff,
55*58da3067SDavid du Colombier 0xff, 0xff, 0xff, 0xff,
56*58da3067SDavid du Colombier 0xff, 0xff, 0xff, 0xff,
57*58da3067SDavid du Colombier 0xff, 0x0, 0x0, 0x0
58*58da3067SDavid du Colombier };
59*58da3067SDavid du Colombier static int v6snpreflen = 13;
60*58da3067SDavid du Colombier
61*58da3067SDavid du Colombier uchar*
defmask(uchar * ip)62*58da3067SDavid du Colombier defmask(uchar *ip)
63*58da3067SDavid du Colombier {
64*58da3067SDavid du Colombier if(isv4(ip))
65*58da3067SDavid du Colombier return classmask[ip[IPv4off]>>6];
66*58da3067SDavid du Colombier else {
67*58da3067SDavid du Colombier if(ipcmp(ip, v6loopback) == 0)
68*58da3067SDavid du Colombier return IPallbits;
69*58da3067SDavid du Colombier else if(memcmp(ip, v6linklocal, v6llpreflen) == 0)
70*58da3067SDavid du Colombier return v6linklocalmask;
71*58da3067SDavid du Colombier else if(memcmp(ip, v6solicitednode, v6snpreflen) == 0)
72*58da3067SDavid du Colombier return v6solicitednodemask;
73*58da3067SDavid du Colombier else if(memcmp(ip, v6multicast, v6mcpreflen) == 0)
74*58da3067SDavid du Colombier return v6multicastmask;
75*58da3067SDavid du Colombier return IPallbits;
76*58da3067SDavid du Colombier }
77*58da3067SDavid du Colombier }
78*58da3067SDavid du Colombier
79*58da3067SDavid du Colombier void
maskip(uchar * from,uchar * mask,uchar * to)80*58da3067SDavid du Colombier maskip(uchar *from, uchar *mask, uchar *to)
81*58da3067SDavid du Colombier {
82*58da3067SDavid du Colombier int i;
83*58da3067SDavid du Colombier
84*58da3067SDavid du Colombier for(i = 0; i < IPaddrlen; i++)
85*58da3067SDavid du Colombier to[i] = from[i] & mask[i];
86*58da3067SDavid du Colombier }
87