xref: /plan9/sys/src/libip/classmask.c (revision ea58ad6fbee60d5a3fca57ac646881779dd8f0ea)
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