From 5d8bff6ba05a45627b2af43447b5832165fc0eac Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Wed, 12 Jan 2022 02:35:01 +0100 Subject: add initial FSM design charts Related: SYS#5599 Change-Id: I55474daa6bb204a0fe7da0a3bf888bb7d1c46677 --- doc/Makefile.am | 3 +++ doc/charts/Makefile.am | 24 +++++++++++++++++++++++ doc/charts/pfcp_and_gtp.dot | 20 +++++++++++++++++++ doc/charts/pfcp_cp_peer_fsm.dot | 39 ++++++++++++++++++++++++++++++++++++++ doc/charts/pfcp_cp_session_fsm.dot | 28 +++++++++++++++++++++++++++ doc/charts/pfcp_heartbeat_fsm.dot | 21 ++++++++++++++++++++ doc/charts/pfcp_overview.dot | 23 ++++++++++++++++++++++ doc/charts/pfcp_up_peer_fsm.dot | 27 ++++++++++++++++++++++++++ doc/charts/pfcp_up_session_fsm.dot | 21 ++++++++++++++++++++ 9 files changed, 206 insertions(+) create mode 100644 doc/charts/Makefile.am create mode 100644 doc/charts/pfcp_and_gtp.dot create mode 100644 doc/charts/pfcp_cp_peer_fsm.dot create mode 100644 doc/charts/pfcp_cp_session_fsm.dot create mode 100644 doc/charts/pfcp_heartbeat_fsm.dot create mode 100644 doc/charts/pfcp_overview.dot create mode 100644 doc/charts/pfcp_up_peer_fsm.dot create mode 100644 doc/charts/pfcp_up_session_fsm.dot (limited to 'doc') 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"] + +} -- cgit v1.2.3