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]
}
