Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

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