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 {
    set_egress_port(4);
}