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,
12 static uchar v6loopback[IPaddrlen] = {
19 static uchar v6linklocal[IPaddrlen] = {
25 static uchar v6linklocalmask[IPaddrlen] = {
26 0xff, 0xff, 0xff, 0xff,
27 0xff, 0xff, 0xff, 0xff,
31 static int v6llpreflen = 8; /* link-local prefix length in bytes */
33 static uchar v6multicast[IPaddrlen] = {
39 static uchar v6multicastmask[IPaddrlen] = {
45 static int v6mcpreflen = 1; /* multicast prefix length */
47 static uchar v6solicitednode[IPaddrlen] = {
53 static uchar v6solicitednodemask[IPaddrlen] = {
54 0xff, 0xff, 0xff, 0xff,
55 0xff, 0xff, 0xff, 0xff,
56 0xff, 0xff, 0xff, 0xff,
59 static int v6snpreflen = 13;
65 return classmask[ip[IPv4off]>>6];
67 if(ipcmp(ip, v6loopback) == 0)
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;
80 maskip(uchar *from, uchar *mask, uchar *to)
84 for(i = 0; i < IPaddrlen; i++)
85 to[i] = from[i] & mask[i];