digraph G { rankdir=LR sgsn [label="SGSN"] subgraph cluster_sgw { style=invisible sgwc [label="SGW-C"] sgwu [label="OsmoUPF as SGW-U\ntunnel proxy\n*netfilter* kernel module",style=bold,shape=box] sgwc -> sgwu [label="PFCP",constraint=false] } subgraph cluster_pgw { style=invisible pgwc [label="PGW-C"] pgwu [label="OsmoUPF as PGW-U\ntunnel proxy\n*netfilter* kernel module",style=bold,shape=box] pgwc -> pgwu [label="PFCP",constraint=false] } subgraph cluster_tdf { style=invisible tdfc [label="TDF-C"] tdfu [label="OsmoUPF as TDF-U\ntunnel en-/decaps\n*GTP* kernel module",style=bold,shape=box] tdfc -> tdfu [label="PFCP",constraint=false] } pdn [label="PDN\n'the internet'"] sgsn -> sgwc -> pgwc -> tdfc [label="GTP-C"] sgsn -> sgwu -> pgwu -> tdfu [label="GTP-U",dir=both] tdfu -> pdn [label="IP",dir=both] }