xref: /plan9/sys/src/libip/ipaux.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <ip.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier /*
67dd7cddfSDavid du Colombier  *  well known IP addresses
77dd7cddfSDavid du Colombier  */
87dd7cddfSDavid du Colombier uchar IPv4bcast[IPaddrlen] = {
97dd7cddfSDavid du Colombier 	0, 0, 0, 0,
107dd7cddfSDavid du Colombier 	0, 0, 0, 0,
117dd7cddfSDavid du Colombier 	0, 0, 0xff, 0xff,
127dd7cddfSDavid du Colombier 	0xff, 0xff, 0xff, 0xff
137dd7cddfSDavid du Colombier };
147dd7cddfSDavid du Colombier uchar IPv4allsys[IPaddrlen] = {
157dd7cddfSDavid du Colombier 	0, 0, 0, 0,
167dd7cddfSDavid du Colombier 	0, 0, 0, 0,
177dd7cddfSDavid du Colombier 	0, 0, 0xff, 0xff,
187dd7cddfSDavid du Colombier 	0xe0, 0, 0, 0x01
197dd7cddfSDavid du Colombier };
207dd7cddfSDavid du Colombier uchar IPv4allrouter[IPaddrlen] = {
217dd7cddfSDavid du Colombier 	0, 0, 0, 0,
227dd7cddfSDavid du Colombier 	0, 0, 0, 0,
237dd7cddfSDavid du Colombier 	0, 0, 0xff, 0xff,
247dd7cddfSDavid du Colombier 	0xe0, 0, 0, 0x02
257dd7cddfSDavid du Colombier };
267dd7cddfSDavid du Colombier uchar IPallbits[IPaddrlen] = {
277dd7cddfSDavid du Colombier 	0xff, 0xff, 0xff, 0xff,
287dd7cddfSDavid du Colombier 	0xff, 0xff, 0xff, 0xff,
297dd7cddfSDavid du Colombier 	0xff, 0xff, 0xff, 0xff,
307dd7cddfSDavid du Colombier 	0xff, 0xff, 0xff, 0xff
317dd7cddfSDavid du Colombier };
327dd7cddfSDavid du Colombier uchar IPnoaddr[IPaddrlen];
337dd7cddfSDavid du Colombier 
347dd7cddfSDavid du Colombier /*
357dd7cddfSDavid du Colombier  *  prefix of all v4 addresses
367dd7cddfSDavid du Colombier  */
377dd7cddfSDavid du Colombier uchar v4prefix[IPaddrlen] = {
387dd7cddfSDavid du Colombier 	0, 0, 0, 0,
397dd7cddfSDavid du Colombier 	0, 0, 0, 0,
407dd7cddfSDavid du Colombier 	0, 0, 0xff, 0xff,
417dd7cddfSDavid du Colombier 	0, 0, 0, 0
427dd7cddfSDavid du Colombier };
437dd7cddfSDavid du Colombier 
447dd7cddfSDavid du Colombier int
isv4(uchar * ip)457dd7cddfSDavid du Colombier isv4(uchar *ip)
467dd7cddfSDavid du Colombier {
477dd7cddfSDavid du Colombier 	return memcmp(ip, v4prefix, IPv4off) == 0;
487dd7cddfSDavid du Colombier }
497dd7cddfSDavid du Colombier 
50*80ee5cbfSDavid du Colombier /*
51*80ee5cbfSDavid du Colombier  *  the following routines are unrolled with no memset's to speed
52*80ee5cbfSDavid du Colombier  *  up the usual case
53*80ee5cbfSDavid du Colombier  */
547dd7cddfSDavid du Colombier void
v4tov6(uchar * v6,uchar * v4)557dd7cddfSDavid du Colombier v4tov6(uchar *v6, uchar *v4)
567dd7cddfSDavid du Colombier {
57*80ee5cbfSDavid du Colombier 	v6[0] = 0;
58*80ee5cbfSDavid du Colombier 	v6[1] = 0;
59*80ee5cbfSDavid du Colombier 	v6[2] = 0;
60*80ee5cbfSDavid du Colombier 	v6[3] = 0;
61*80ee5cbfSDavid du Colombier 	v6[4] = 0;
62*80ee5cbfSDavid du Colombier 	v6[5] = 0;
63*80ee5cbfSDavid du Colombier 	v6[6] = 0;
64*80ee5cbfSDavid du Colombier 	v6[7] = 0;
65*80ee5cbfSDavid du Colombier 	v6[8] = 0;
66*80ee5cbfSDavid du Colombier 	v6[9] = 0;
67*80ee5cbfSDavid du Colombier 	v6[10] = 0xff;
68*80ee5cbfSDavid du Colombier 	v6[11] = 0xff;
69*80ee5cbfSDavid du Colombier 	v6[12] = v4[0];
70*80ee5cbfSDavid du Colombier 	v6[13] = v4[1];
71*80ee5cbfSDavid du Colombier 	v6[14] = v4[2];
72*80ee5cbfSDavid du Colombier 	v6[15] = v4[3];
737dd7cddfSDavid du Colombier }
747dd7cddfSDavid du Colombier 
757dd7cddfSDavid du Colombier int
v6tov4(uchar * v4,uchar * v6)767dd7cddfSDavid du Colombier v6tov4(uchar *v4, uchar *v6)
777dd7cddfSDavid du Colombier {
78*80ee5cbfSDavid du Colombier 	if(v6[0] == 0
79*80ee5cbfSDavid du Colombier 	&& v6[1] == 0
80*80ee5cbfSDavid du Colombier 	&& v6[2] == 0
81*80ee5cbfSDavid du Colombier 	&& v6[3] == 0
82*80ee5cbfSDavid du Colombier 	&& v6[4] == 0
83*80ee5cbfSDavid du Colombier 	&& v6[5] == 0
84*80ee5cbfSDavid du Colombier 	&& v6[6] == 0
85*80ee5cbfSDavid du Colombier 	&& v6[7] == 0
86*80ee5cbfSDavid du Colombier 	&& v6[8] == 0
87*80ee5cbfSDavid du Colombier 	&& v6[9] == 0
88*80ee5cbfSDavid du Colombier 	&& v6[10] == 0xff
89*80ee5cbfSDavid du Colombier 	&& v6[11] == 0xff)
90*80ee5cbfSDavid du Colombier 	{
91*80ee5cbfSDavid du Colombier 		v4[0] = v6[12];
92*80ee5cbfSDavid du Colombier 		v4[1] = v6[13];
93*80ee5cbfSDavid du Colombier 		v4[2] = v6[14];
94*80ee5cbfSDavid du Colombier 		v4[3] = v6[15];
957dd7cddfSDavid du Colombier 		return 0;
96*80ee5cbfSDavid du Colombier 	} else {
97*80ee5cbfSDavid du Colombier 		memset(v4, 0, 4);
98*80ee5cbfSDavid du Colombier 		if(memcmp(v6, IPnoaddr, IPaddrlen) == 0)
997dd7cddfSDavid du Colombier 			return 0;
1007dd7cddfSDavid du Colombier 		return -1;
1017dd7cddfSDavid du Colombier 	}
102*80ee5cbfSDavid du Colombier }
103