diff --git a/doc/plan.org b/doc/plan.org index 44f55df..0620d34 100644 --- a/doc/plan.org +++ b/doc/plan.org @@ -106,7 +106,7 @@ | 2019-03-14 | NAT64 static rewrite | | | | - table support | | | | - checksum not yet ported for translations | | -| | - how to get mask from lpm table match? | | +| | - how to get mask from lpm table match? | | | | - how to get network from lpm match? | | | | | | | | | | @@ -1053,6 +1053,64 @@ DEBUG:main:INCOMING: ) hdr.ipv6.payload_length; } - action nat64_static(ipv4_addr_t v6_network, ipv4_addr_t v4_network) { + /* nat64_prefix is the same as the matching key, but without the mask */ + action nat64_static(ipv4_addr_t v6_network, ipv4_addr_t v4_network, ipv6_addr_t nat64_prefix) { ipv6_addr_t src_offset = hdr.ipv6.src_addr - v6_network; - ipv4_addr_t src = v4_network + (ipv4_addr_t) src_offset; + ipv4_addr_t src = v4_network + (ipv4_addr_t) src_offset; - ipv4_addr_t dst_offset = hdr.ipv6.dst_addr - LPM_MATCH_NETWORK_ADDRESS_IN_TABLE; + ipv6_addr_t dst = (ipv4_addr_t) hdr.ipv6.dst_addr - nat64_prefix; nat64_generic(src, dst); } - action nat46_static(ipv4_addr_t v4_network, ipv6_addr_t nat64_prefix ) { - ipv6_addr_t src = hdr.ipv4.dst_addr - v4_network; - ipv6_addr_t src = hdr.ipv4.dst_addr - v4_network; + /* matching key: v4_network specified again */ + action nat46_static(ipv6_addr_t v6_network, ipv4_addr_t v4_network, ipv6_addr_t nat64_prefix ) { + ipv6_addr_t src = nat64_prefix + (ipv6_addr_t) hdr.ipv4.src_addr; + + ipv4_addr_t dst_offset = hdr.ipv4.dst_addr - v4_network; + ipv6_addr_t dst = v6_network + (ipv6_addr_t) dst_offset; nat46_generic(src, dst); }