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