2019-07-28 18:08:28 +00:00
|
|
|
port_t v6_out = 64;
|
|
|
|
port_t v4_out = 16;
|
|
|
|
|
|
|
|
/* nat64 */
|
|
|
|
/*
|
|
|
|
>>> int(ipaddress.IPv4Address("10.0.0.0"))
|
|
|
|
167772160
|
|
|
|
>>> int(ipaddress.IPv6Address("2001:db8:42::"))
|
|
|
|
42540766411362381960998550477184434176
|
|
|
|
*/
|
|
|
|
|
|
|
|
ipv6_addr_t v6_src = 42540766411362381960998550477184434176; /* 2001:db8:42:: -> v6 source range*/
|
|
|
|
ipv6_addr_t v6_dst = 42540766411362381960998550477184434176; /* 2001:db8:42:: -> v6 source range*/
|
|
|
|
ipv6_addr_t nat64_prefix = 42540766411362381960998550477184434176; /* 2001:db8:42:: -> v6 destination range */
|
|
|
|
ipv4_addr_t v4_dst = 167772160; /* 10.0.0.0 -> v4 destination range */
|
|
|
|
|
|
|
|
|
|
|
|
/* if it is ipv6, we always translate to IPv4 and output on v4_out */
|
|
|
|
if(hdr.ipv6.isValid()) {
|
|
|
|
nat64_static(v6_src, v4_dst, nat64_prefix);
|
|
|
|
|
|
|
|
if(hdr.udp.isValid()) {
|
|
|
|
delta_udp_from_v6_to_v4
|
|
|
|
}
|
|
|
|
|
|
|
|
if(hdr.tcp.isValid()) {
|
|
|
|
delta_tcp_from_v6_to_v4
|
|
|
|
}
|
|
|
|
|
|
|
|
set_egress_port(v4_out);
|
|
|
|
|
|
|
|
} else if(hdr.ipv4.isValid()) {
|
|
|
|
nat46_static(v6_dst, v4_dst, nat64_prefix);
|
|
|
|
|
|
|
|
if(hdr.udp.isValid()) {
|
|
|
|
delta_udp_from_v4_to_v6
|
|
|
|
}
|
|
|
|
|
|
|
|
if(hdr.tcp.isValid()) {
|
|
|
|
delta_tcp_from_v4_to_v6
|
|
|
|
}
|
|
|
|
|
|
|
|
set_egress_port(v6_out);
|
|
|
|
} else {
|
2019-07-29 07:37:01 +00:00
|
|
|
set_egress_port(4);
|
2019-07-28 18:08:28 +00:00
|
|
|
}
|