2008-12-31 14:41:21 +02:00
|
|
|
#include "wrapper.h"
|
|
|
|
#include "translate_ip.h"
|
|
|
|
|
2008-12-31 22:08:53 +02:00
|
|
|
struct in_addr ipaddr_6to4(const struct in6_addr ip6_addr)
|
2008-12-31 14:41:21 +02:00
|
|
|
{
|
|
|
|
struct ip6addr_ip4part *addr;
|
|
|
|
struct in_addr ip4_addr;
|
|
|
|
char ip4_str[15];
|
|
|
|
|
2008-12-31 22:08:53 +02:00
|
|
|
/* define the IPv6 address */
|
|
|
|
addr = (struct ip6addr_ip4part *) (&ip6_addr);
|
2008-12-31 14:41:21 +02:00
|
|
|
|
|
|
|
/* build IPv4 address */
|
|
|
|
sprintf(ip4_str, "%d.%d.%d.%d", addr->a, addr->b, addr->c, addr->d);
|
|
|
|
inet_aton(ip4_str, &ip4_addr);
|
|
|
|
|
|
|
|
return ip4_addr;
|
|
|
|
}
|
2009-01-06 18:14:51 +02:00
|
|
|
|
|
|
|
struct in6_addr ipaddr_4to6(const struct in_addr ip4_addr)
|
|
|
|
{
|
|
|
|
struct ip6addr_ip4part *addr;
|
|
|
|
struct in6_addr ip6_addr;
|
|
|
|
char ip4_str[15];
|
|
|
|
char *ip4_p;
|
|
|
|
unsigned int ip4_a[4];
|
|
|
|
|
|
|
|
/* create a temporary IPv6 variable */
|
|
|
|
addr = (struct ip6addr_ip4part *) malloc(sizeof(struct ip6addr_ip4part));
|
|
|
|
|
|
|
|
/* copy IPv6 prefix of WrapSix IPv6 addresses */
|
|
|
|
memcpy(addr, &ip6addr_wrapsix, 12);
|
|
|
|
|
|
|
|
/* copy the rest of the IPv6 address (the IPv4 address) */
|
|
|
|
ip4_p = inet_ntoa(ip4_addr);
|
|
|
|
memcpy(&ip4_str, ip4_p, 15);
|
|
|
|
sscanf(ip4_str, "%d.%d.%d.%d", &ip4_a[0], &ip4_a[1], &ip4_a[2], &ip4_a[3]);
|
|
|
|
addr->a = (unsigned char) ip4_a[0];
|
|
|
|
addr->b = (unsigned char) ip4_a[1];
|
|
|
|
addr->c = (unsigned char) ip4_a[2];
|
|
|
|
addr->d = (unsigned char) ip4_a[3];
|
|
|
|
|
|
|
|
/* copy the complete IPv6 address */
|
|
|
|
memcpy(&ip6_addr, addr, sizeof(struct in6_addr));
|
|
|
|
|
|
|
|
/* free allocated memory */
|
|
|
|
free(addr);
|
|
|
|
|
|
|
|
return ip6_addr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void build_ip6_hdr(struct ip6_hdr *ip, struct in6_addr ip_src, struct in6_addr ip_dest, unsigned short paylen, unsigned char proto, unsigned char ttl)
|
|
|
|
{
|
|
|
|
ip->ip6_src = ip_src;
|
|
|
|
ip->ip6_dst = ip_dest;
|
|
|
|
ip->ip6_flow = 0;
|
|
|
|
ip->ip6_vfc = 0x60;
|
|
|
|
ip->ip6_plen = htons(paylen);
|
|
|
|
ip->ip6_nxt = proto;
|
|
|
|
ip->ip6_hlim = ttl;
|
|
|
|
}
|