digraph G { rankdir="TB"; v4host [ shape="box" label="IPv4 Host" ]; v6host [ shape="box" label="IPv6 Host" ]; rank=same; parser [ label="Parser"]; deparser [ label="Deparser"]; translation [ label="Translation"]; mismatch [ label="Table Mismatch"]; v4packet [ label="IPv6 Packet"]; v4packet2 [ label="IPv4 Packet"]; v6packet [ label="IPv6 Packet"]; tableentry [ label="Create Table Entry" ]; tablematch [ label="Table Match" ]; reinject [ label="Reinject Packet" ]; controller [ label="Controller Reads Packet" ] deparser [ label="Deparser"]; deparser2 [ label="Deparser"]; subgraph cluster_nat64 { label="P4 Switch"; parser; v4packet; deparser; mismatch; tablematch; translation; deparser2; } subgraph cluster_p4controller { label="P4 Controller"; controller; tableentry; reinject; } v6host->v6packet->parser; parser->v4packet; v4packet->mismatch [ label="1." ]; mismatch->deparser->controller; controller->tableentry->reinject; reinject->parser; v4packet->tablematch [ label="2." ]; tablematch->translation->deparser2; deparser2->v4packet2->v4host; }