xref: /plan9/sys/src/cmd/unix/drawterm/libip/classmask.c (revision 58da3067adcdccaaa043d0bfde28ba83b7ced07d)
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