digraph G { rankdir=TB; labelloc=t; label="gtplab @ sysmocom"; subgraph cluster_gtplab0 { label="gtplab0"; rankdir=TB; gtplab0_10 [label="10.9.25.20/24"]; gtplab0_172_31 [label="172.16.31.1/24"]; tool [label="osmo-upf-load-gen",shape=box3d]; } subgraph cluster_gtplab1 { label="gtplab1"; gtplab1_10 [label="10.9.25.21/24"]; gtplab1_172_31 [label="172.16.31.2/24"]; gtplab1_172_32 [label="172.16.32.1/24"]; upf1 [label="UPF\ntunmap",shape=box3d]; } subgraph cluster_gtplab2 { label="gtplab2"; gtplab2_10 [label="10.9.25.22/24"]; gtplab2_172_32 [label="172.16.32.2/24"]; upf2 [label="UPF\ntunend",shape=box3d]; responder [label="osmo-udp-responder",shape=box3d]; } tool -> gtplab0_10 -> gtplab1_10 -> upf1 [label="PFCP", dir=both]; gtplab0_10 -> gtplab2_10 -> upf2 [label="PFCP", dir=both]; tool -> gtplab0_172_31 -> gtplab1_172_31 -> upf1 [label="GTP tun",style=bold]; upf1 -> gtplab1_172_32 -> gtplab2_172_32 -> upf2 [label="GTP tun",style=bold]; upf2 -> responder [label="UDP/IP",style=bold]; upf2 -> responder [style=dotted,dir=back]; upf1 -> gtplab1_172_32 -> gtplab2_172_32 -> upf2 [style=dotted,dir=back]; tool -> gtplab0_172_31 -> gtplab1_172_31 -> upf1 [style=dotted,dir=back]; }