|
Packit |
6c4009 |
#include <stdio.h>
|
|
Packit |
6c4009 |
#include <string.h>
|
|
Packit |
6c4009 |
#include <arpa/inet.h>
|
|
Packit |
6c4009 |
#include <netinet/ip6.h>
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
static int
|
|
Packit |
6c4009 |
do_test (void)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
int res = 0;
|
|
Packit |
6c4009 |
char buf[1000];
|
|
Packit |
6c4009 |
void *p = inet6_rth_init (buf, 24, IPV6_RTHDR_TYPE_0, 0);
|
|
Packit |
6c4009 |
if (p == NULL)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("first inet6_rth_init failed");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
else if (inet6_rth_add (p, &in6addr_any) == 0)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("first inet6_rth_add succeeded");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
p = inet6_rth_init (buf, 24, IPV6_RTHDR_TYPE_0, 1);
|
|
Packit |
6c4009 |
if (p == NULL)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("second inet6_rth_init failed");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
else if (inet6_rth_add (p, &in6addr_any) != 0)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("second inet6_rth_add failed");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
for (int nseg = 4; nseg < 6; ++nseg)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
printf ("nseg = %d\n", nseg);
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
p = inet6_rth_init (buf, sizeof (buf), IPV6_RTHDR_TYPE_0, nseg);
|
|
Packit |
6c4009 |
if (p == NULL)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("third inet6_rth_init failed");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
else
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
struct in6_addr tmp;
|
|
Packit |
6c4009 |
memset (&tmp, '\0', sizeof (tmp));
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
for (int i = 0; i < nseg; ++i)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
tmp.s6_addr[0] = i;
|
|
Packit |
6c4009 |
if (inet6_rth_add (p, &tmp) != 0)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
printf ("call %d of third inet6_rth_add failed\n", i + 1);
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
goto out;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
((struct ip6_rthdr0 *) p)->ip6r0_segleft = 0;
|
|
Packit |
6c4009 |
if (inet6_rth_segments (p) != nseg)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("\
|
|
Packit |
6c4009 |
inet6_rth_segments returned wrong value after loop with third inet6_rth_add");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
goto out;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
union
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
char buffer[1000];
|
|
Packit |
6c4009 |
struct ip6_rthdr0 rthdr0;
|
|
Packit |
6c4009 |
} buf2;
|
|
Packit |
6c4009 |
if (inet6_rth_reverse (p, buf2.buffer) != 0)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("first inet6_rth_reverse call failed");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
goto out;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
if (buf2.rthdr0.ip6r0_segleft != nseg)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("segleft after first inet6_rth_reverse wrong");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
if (inet6_rth_segments (p) != inet6_rth_segments (buf2.buffer))
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("number of seconds after first inet6_rth_reverse differs");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
goto out;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
for (int i = 0; i < nseg; ++i)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
struct in6_addr *addr = inet6_rth_getaddr (buf2.buffer, i);
|
|
Packit |
6c4009 |
if (addr == NULL)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
printf ("call %d of first inet6_rth_getaddr failed\n",
|
|
Packit |
6c4009 |
i + 1);
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
else if (addr->s6_addr[0] != nseg - 1 - i
|
|
Packit |
6c4009 |
|| memcmp (&addr->s6_addr[1], &in6addr_any.s6_addr[1],
|
|
Packit |
6c4009 |
sizeof (in6addr_any)
|
|
Packit |
6c4009 |
- sizeof (in6addr_any.s6_addr[0])) != 0)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
char addrbuf[100];
|
|
Packit |
6c4009 |
inet_ntop (AF_INET6, addr, addrbuf, sizeof (addrbuf));
|
|
Packit |
6c4009 |
printf ("\
|
|
Packit |
6c4009 |
address %d after first inet6_rth_reverse wrong (%s)\n",
|
|
Packit |
6c4009 |
i + 1, addrbuf);
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
out:
|
|
Packit |
6c4009 |
;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
p = inet6_rth_init (buf, sizeof (buf), IPV6_RTHDR_TYPE_0, nseg);
|
|
Packit |
6c4009 |
if (p == NULL)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("fourth inet6_rth_init failed");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
else
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
struct in6_addr tmp;
|
|
Packit |
6c4009 |
memset (&tmp, '\0', sizeof (tmp));
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
for (int i = 0; i < nseg; ++i)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
tmp.s6_addr[0] = i;
|
|
Packit |
6c4009 |
if (inet6_rth_add (p, &tmp) != 0)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
printf ("call %d of fourth inet6_rth_add failed\n", i + 1);
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
goto out2;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
((struct ip6_rthdr0 *) p)->ip6r0_segleft = 0;
|
|
Packit |
6c4009 |
if (inet6_rth_segments (p) != nseg)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("\
|
|
Packit |
6c4009 |
inet6_rth_segments returned wrong value after loop with fourth inet6_rth_add");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
goto out2;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
if (inet6_rth_reverse (p, p) != 0)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("second inet6_rth_reverse call failed");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
goto out2;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
if (((struct ip6_rthdr0 *) p)->ip6r0_segleft != nseg)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
puts ("segleft after second inet6_rth_reverse wrong");
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
for (int i = 0; i < nseg; ++i)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
struct in6_addr *addr = inet6_rth_getaddr (p, i);
|
|
Packit |
6c4009 |
if (addr == NULL)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
printf ("call %d of second inet6_rth_getaddr failed\n",
|
|
Packit |
6c4009 |
i + 1);
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
else if (addr->s6_addr[0] != nseg - 1 - i
|
|
Packit |
6c4009 |
|| memcmp (&addr->s6_addr[1], &in6addr_any.s6_addr[1],
|
|
Packit |
6c4009 |
sizeof (in6addr_any)
|
|
Packit |
6c4009 |
- sizeof (in6addr_any.s6_addr[0])) != 0)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
char addrbuf[100];
|
|
Packit |
6c4009 |
inet_ntop (AF_INET6, addr, addrbuf, sizeof (addrbuf));
|
|
Packit |
6c4009 |
printf ("\
|
|
Packit |
6c4009 |
address %d after second inet6_rth_reverse wrong (%s)\n",
|
|
Packit |
6c4009 |
i + 1, addrbuf);
|
|
Packit |
6c4009 |
res = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
out2:
|
|
Packit |
6c4009 |
;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
return res;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
#define TEST_FUNCTION do_test ()
|
|
Packit |
6c4009 |
#include "../test-skeleton.c"
|