464XLAT is an excellent architecture — for networks that control the endpoint. On fixed-line access it requires a translator inside every subscriber's home. We put the choice where you can actually deploy it.
mapsThe question is not which translation is best. It is which one you can actually deploy against the CPE fleet you already have.
464XLAT is two halves. The PLAT sits in your network. The CLAT sits in the customer's equipment — and that is the half you do not own.
Coloured boxes mark what must be provisioned and supported for the
architecture to work. In 464XLAT one of them is in the subscriber's home. In maps both are in your rack.
Every engine is compiled into the same XDP datapath and selected by
cgnat.engine. Start where your CPE fleet is today; move as it turns over.
Switching architecture is a configuration change, not a platform migration. The decision stays reversible.
| Requirement | 464XLAT | maps · CGNAT | mapt |
|---|---|---|---|
| Works with existing CPE | CLAT requiredMobile OSes ship it; residential routers mostly do not. | Any CPENo customer-side change of any kind. | MAP-T requiredOpenWrt and newer vendor CPE. |
| IPv4-only LAN devices keep working | Via CLAT onlyBehind a CLAT-less router they break. | Yes | Yes |
| Per-flow state at the border | Stateful PLATNative IPv6 bypasses it — a real advantage. | Stateful | None — algorithmicNo session table to size, scale or reap. |
| Subscriber logging burden | Per session | Per port blockOne record per block, not per flow. | DeterministicMapping is computable from the address. |
| DNS64 dependency | OptionalCLAT handles IPv4 literals — 464XLAT's real win. | None | None |
| Migration granularity | Per CPEGated on the slowest router in the fleet. | ImmediateDeploy network-side, this week. | Per CPE |
Relative per-flow state the operator must hold and log
Illustrative of architecture, not a benchmark. The IPv6-bypass share depends on how much of your traffic already reaches IPv6-capable destinations — for most operators that is now the majority of volume.
cgnat.engine = nat64 is a full RFC 6146 stateful NAT64 with RFC 6052
prefixes — it is a PLAT. The argument is not that 464XLAT is wrong. It is that on
fixed-line access you should not have to bet the migration on what is inside the customer's router.
ICMP translation
ICMPv6 ↔ ICMPv4 including error-payload rewrite. Without it Path MTU Discovery fails silently and large flows stall.
Explicit fragment path
Configurable drop_fragments policy rather than undefined behaviour under load.
Hairpinning
Subscriber-to-subscriber traffic behind one pool address is translated, not dropped.
Incremental update
Checksum fixed up across the v6/v4 boundary without a full per-packet recompute.
The 1280 floor
IPv6 minimum-MTU handling on the translated path, so real-world MSS behaves.
EIF · ADF · APDF
Endpoint-independent, address-dependent and address-and-port-dependent filtering, per deployment.
maps — the only option that needs nothing from the customer. Deployable now.
mapt — stateless. Removes the session table, the reaper and most of the logging obligation.
nat64 — the PLAT for a 464XLAT or DNS64 deployment. Native IPv6 never touches it.
maps today. The engine is a config key, so the decision is reversible and does not strand the platform.