aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2022-01-12 02:35:01 +0100
committerNeels Hofmeyr <neels@hofmeyr.de>2022-06-16 13:04:33 +0200
commit5d8bff6ba05a45627b2af43447b5832165fc0eac (patch)
tree28c91026e8711e702dfdcc80a9d484d91fa87423
parentd6ac69d6f6397da8f4d9e2fa0cd4c03ef0a2c06f (diff)
add initial FSM design charts
-rw-r--r--configure.ac1
-rw-r--r--doc/Makefile.am3
-rw-r--r--doc/charts/Makefile.am24
-rw-r--r--doc/charts/pfcp_and_gtp.dot20
-rw-r--r--doc/charts/pfcp_cp_peer_fsm.dot39
-rw-r--r--doc/charts/pfcp_cp_session_fsm.dot28
-rw-r--r--doc/charts/pfcp_heartbeat_fsm.dot21
-rw-r--r--doc/charts/pfcp_overview.dot23
-rw-r--r--doc/charts/pfcp_up_peer_fsm.dot27
-rw-r--r--doc/charts/pfcp_up_session_fsm.dot21
10 files changed, 207 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index f84c8ac..30bd554 100644
--- a/configure.ac
+++ b/configure.ac
@@ -99,5 +99,6 @@ AC_OUTPUT(
tests/libosmo-gtlv/test_tliv/Makefile
tests/libosmo-pfcp/Makefile
doc/Makefile
+ doc/charts/Makefile
contrib/Makefile
Makefile)
diff --git a/doc/Makefile.am b/doc/Makefile.am
index e69de29..8de9f98 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = \
+ charts \
+ $(NULL)
diff --git a/doc/charts/Makefile.am b/doc/charts/Makefile.am
new file mode 100644
index 0000000..af0736d
--- /dev/null
+++ b/doc/charts/Makefile.am
@@ -0,0 +1,24 @@
+msc: \
+ $(builddir)/pfcp_msgs.png \
+ $(builddir)/pfcp_msgs_gtp.png \
+ $(NULL)
+
+dot: \
+ $(builddir)/pfcp_overview.png \
+ $(builddir)/pfcp_cp_peer_fsm.png \
+ $(builddir)/pfcp_up_peer_fsm.png \
+ $(builddir)/pfcp_heartbeat_fsm.png \
+ $(builddir)/pfcp_cp_session_fsm.png \
+ $(builddir)/pfcp_up_session_fsm.png \
+ $(builddir)/pfcp_and_gtp.png \
+ $(NULL)
+
+$(builddir)/%.png: $(srcdir)/%.msc
+ mscgen -T png -o $@ $<
+
+$(builddir)/%.png: $(srcdir)/%.dot
+ dot -Tpng $< > $@
+
+.PHONY: poll
+poll:
+ while true; do $(MAKE) msc dot; sleep 1; done
diff --git a/doc/charts/pfcp_and_gtp.dot b/doc/charts/pfcp_and_gtp.dot
new file mode 100644
index 0000000..5c160b3
--- /dev/null
+++ b/doc/charts/pfcp_and_gtp.dot
@@ -0,0 +1,20 @@
+digraph G {
+rankdir=LR
+labelloc=t; label="PFCP and GTP"
+
+SGSN [label="SGSN\n123.44.0.9"]
+SGWC [label="SGW-C\n123.44.05"]
+subgraph cluster_UPF {
+ label="OsmoUPF";
+ SGWU [label="SGW-U\n123.44.0.6"];
+ GTPk [label="kernel GTP\n123.44.0.6"]
+}
+
+SGSN -> SGWC [label="S4\nGTPv2-C"]
+SGWC -> SGWU [label="Sxa\nPFCP\nSession Establishment:\n"]
+SGSN -> GTPk [label="S4\nGTPv1-U",dir=both]
+
+MS [label="MS\n192.168.104.176"]
+MS -> SGSN [dir=both]
+
+}
diff --git a/doc/charts/pfcp_cp_peer_fsm.dot b/doc/charts/pfcp_cp_peer_fsm.dot
new file mode 100644
index 0000000..101fe07
--- /dev/null
+++ b/doc/charts/pfcp_cp_peer_fsm.dot
@@ -0,0 +1,39 @@
+digraph G {
+rankdir=TB
+labelloc=t; label="PFCP CP peer FSM\nControl Plane side, managing association with remote UP peer"
+
+cp [label="CP function",shape="box"]
+
+cp -> WAIT_ASSOC_SETUP_RESP [label="cp_peer_associate()"]
+
+txrx [label="PFCP socket",shape="box"]
+WAIT_ASSOC_SETUP_RESP -> txrx [label="tx_assoc_setup_req()",style=dotted]
+txrx -> WAIT_ASSOC_SETUP_RESP [label="EV_RX_ASSOC_SETUP_RESP",style=dotted]
+WAIT_ASSOC_SETUP_RESP -> ASSOCIATED [label="Assoc Setup Resp"]
+
+WAIT_ASSOC_SETUP_RESP -> WAIT_ASSOC_SETUP_RESP [label="retry"]
+
+heartbeat [label="PFCP heartbeat FSM",shape=box3d]
+ASSOCIATED -> heartbeat [label="alloc()",style=dotted]
+heartbeat -> ASSOCIATED [label="EV_HEARTBEAT_FAILURE",style=dotted]
+
+txrx2 [label="PFCP socket",shape="box"]
+txrx2 -> ASSOCIATED [label="EV_RX_ASSOC_UPDATE_REQ\n3GPP TS 29.244 6.2.7.3.1",style=dotted]
+GRACEFUL_RELEASE -> txrx2 [label="tx_assoc_update_resp()",style=dotted]
+
+cp_session [label="PFCP CP session FSM",shape=box3d]
+cp -> ASSOCIATED [label="cp_peer_session_create()",style=dotted]
+ASSOCIATED -> cp_session [label="cp_session_create()",style=dotted]
+cp -> cp_session [style=invisible,arrowhead=none]
+
+ASSOCIATED -> GRACEFUL_RELEASE [label="Association Update\nindicating graceful release"]
+
+cp -> ASSOCIATED [label="cp_peer_release()",style=dotted]
+ASSOCIATED -> term [label="cp_peer_release()\nHeartbeat failure"]
+
+ASSOCIATED -> WAIT_ASSOC_SETUP_RESP [label="Heartbeat failure"]
+
+GRACEFUL_RELEASE -> term
+term [shape="octagon"]
+
+}
diff --git a/doc/charts/pfcp_cp_session_fsm.dot b/doc/charts/pfcp_cp_session_fsm.dot
new file mode 100644
index 0000000..0319608
--- /dev/null
+++ b/doc/charts/pfcp_cp_session_fsm.dot
@@ -0,0 +1,28 @@
+digraph G {
+rankdir=TB
+labelloc=t; label="PFCP CP session FSM"
+
+cp [label="CP function",shape=box]
+cp -> WAIT_ESTABLISHMENT_RESP [label="cp_session_create(cp_peer)\niff cp_peer in state ASSOCIATED"]
+
+txrx [label="PFCP socket",shape=box]
+
+WAIT_ESTABLISHMENT_RESP -> txrx [label="tx_session_est_req()",style=dotted]
+txrx -> WAIT_ESTABLISHMENT_RESP [label="EV_RX_SESSION_EST_RESP",style=dotted]
+
+WAIT_ESTABLISHMENT_RESP -> ESTABLISHED [label="Est Resp"]
+
+cp -> ESTABLISHED [label="cp_session_modify()",style=dotted]
+ESTABLISHED -> WAIT_MODIFICATION_RESP [label="cp_session_modify()"]
+WAIT_MODIFICATION_RESP -> txrx [label="tx_session_mod_req()",style=dotted]
+txrx -> WAIT_MODIFICATION_RESP [label="EV_RX_SESSION_MOD_RESP",style=dotted,constraint=false]
+WAIT_MODIFICATION_RESP -> ESTABLISHED [label="Mod Resp"]
+
+cp -> ESTABLISHED [label="cp_session_delete()",style=dotted]
+ESTABLISHED -> WAIT_DELETION_RESP [label="cp_session_delete()"]
+WAIT_DELETION_RESP -> txrx [label="tx_session_del_req()",style=dotted]
+txrx -> WAIT_DELETION_RESP [label="EV_RX_SESSION_DEL_RESP",style=dotted,constraint=false]
+WAIT_DELETION_RESP -> term
+term [shape="octagon"]
+
+}
diff --git a/doc/charts/pfcp_heartbeat_fsm.dot b/doc/charts/pfcp_heartbeat_fsm.dot
new file mode 100644
index 0000000..b5b4584
--- /dev/null
+++ b/doc/charts/pfcp_heartbeat_fsm.dot
@@ -0,0 +1,21 @@
+digraph G {
+rankdir=TB
+labelloc=t; label="PFCP heartbeat FSM"
+
+peer [label="PFCP CP/UP peer FSM",shape=box3d]
+txrx [label="PFCP socket",shape=box]
+
+peer -> IDLE [label="alloc()"]
+IDLE -> WAIT_HEARTBEAT_RESP -> IDLE
+WAIT_HEARTBEAT_RESP -> term
+term [shape="octagon"]
+
+WAIT_HEARTBEAT_RESP -> txrx [label="tx_heartbeat_req()",style=dotted]
+txrx -> WAIT_HEARTBEAT_RESP [label="HEARTBEAT_EV_RX_RESP",style=dotted]
+
+term -> peer [label="PEER_EV_HEARTBEAT_FAILURE",style=dotted]
+
+txrx2 [label="PFCP socket",shape=box]
+txrx2 -> txrx2 [label="rx Heartbeat Req\ntx Heartbeat Resp",style=dotted]
+
+}
diff --git a/doc/charts/pfcp_overview.dot b/doc/charts/pfcp_overview.dot
new file mode 100644
index 0000000..33fa9a0
--- /dev/null
+++ b/doc/charts/pfcp_overview.dot
@@ -0,0 +1,23 @@
+digraph G {
+rankdir=TB
+labelloc=t; label="PFCP Overview\n3GPP TS 29.244 3.1, 5.8.1"
+
+subgraph cluster_N1_CP {
+ label="Node: Control Plane function";style=dotted
+ N1_E_CP [label="CP Entity"]
+}
+
+subgraph cluster_N2_UP {
+ label="Node: User Plane function\nNode ID: my-userplane.com\n(FQDN may provide multiple PFCP Entities)";style=dotted
+ N2_E_UP [label="UP Entity\n8.7.6.1"]
+ N2_E_UP2 [label="UP Entity\n8.7.6.2"]
+}
+
+subgraph cluster_N3_UP {
+ label="Node: User Plane function\nNode ID: 1.2.3.4\n(IP address means only one PFCP Entity)";style=dotted
+ N3_E_UP [label="UP Entity\n1.2.3.4\n(osmo-upf)"]
+}
+
+N1_E_CP -> N3_E_UP [label="PFCP Request"]
+N1_E_CP -> N2_E_UP
+}
diff --git a/doc/charts/pfcp_up_peer_fsm.dot b/doc/charts/pfcp_up_peer_fsm.dot
new file mode 100644
index 0000000..60152f7
--- /dev/null
+++ b/doc/charts/pfcp_up_peer_fsm.dot
@@ -0,0 +1,27 @@
+digraph G {
+rankdir=TB
+labelloc=t; label="PFCP UP peer FSM\nUser Plane side, managing association with remote CP peer"
+
+txrx [label="PFCP socket",shape="box"]
+
+txrx -> NOT_ASSOCIATED [label="rx PFCP msg from\nnew remote IP"]
+txrx -> NOT_ASSOCIATED [label="EV_RX_ASSOC_SETUP_REQ",style=dotted]
+
+NOT_ASSOCIATED -> ASSOCIATED [label="Assoc Setup Req",shape="box"]
+
+heartbeat [label="PFCP heartbeat FSM",shape=box3d]
+ASSOCIATED -> heartbeat [label="alloc()",style=dotted]
+heartbeat -> ASSOCIATED [label="EV_HEARTBEAT_FAILURE",style=dotted]
+
+txrx -> ASSOCIATED [label="EV_RX_SESSION_EST_REQ",style=dotted]
+up_session [label="PFCP UP session FSM",shape=box3d]
+ASSOCIATED -> up_session [label="up_session_create()",style=dotted]
+
+txrx -> ASSOCIATED [label="EV_RX_ASSOC_UPD_REQ",style=dotted]
+ASSOCIATED -> GRACEFUL_RELEASE [label="Association Update\nindicating graceful release"]
+
+ASSOCIATED -> term [label="Heartbeat failure"]
+GRACEFUL_RELEASE -> term
+term [shape="octagon"]
+
+}
diff --git a/doc/charts/pfcp_up_session_fsm.dot b/doc/charts/pfcp_up_session_fsm.dot
new file mode 100644
index 0000000..b4a06f5
--- /dev/null
+++ b/doc/charts/pfcp_up_session_fsm.dot
@@ -0,0 +1,21 @@
+digraph G {
+rankdir=TB
+labelloc=t; label="PFCP UP session FSM"
+
+peer [label="PFCP UP peer FSM",shape=box3d]
+peer -> ESTABLISHED [label="rx_session_est_req()"]
+
+txrx [label="PFCP socket",shape="box"]
+txrx2 [label="PFCP socket",shape="box"]
+
+txrx -> ESTABLISHED [label="EV_RX_SESSION_MOD_REQ",style=dotted]
+ESTABLISHED -> txrx [label="tx_session_mod_resp()",style=dotted,constraint=false]
+ESTABLISHED -> ESTABLISHED [label="Mod"]
+
+txrx2 -> ESTABLISHED [label="EV_RX_SESSION_DEL_REQ",style=dotted]
+ESTABLISHED -> txrx2 [label="tx_session_del_resp()",style=dotted,constraint=false]
+
+ESTABLISHED -> term [label="Deletion"]
+term [shape="octagon"]
+
+}