Change in osmo-bsc[master]: doc: copy current charts to doc/old/ for later reference

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Neels Hofmeyr gerrit-no-reply at lists.osmocom.org
Thu Jun 7 17:20:47 UTC 2018


Neels Hofmeyr has uploaded this change for review. ( https://gerrit.osmocom.org/9502


Change subject: doc: copy current charts to doc/old/ for later reference
......................................................................

doc: copy current charts to doc/old/ for later reference

Change-Id: Iac18f12529d5961a66e4853dc3a93636eb499127
---
M configure.ac
M doc/Makefile.am
A doc/old/Makefile.am
A doc/old/assignment.msc
A doc/old/handover.msc
A doc/old/lchan-release.msc
A doc/old/ms-channel-request.msc
7 files changed, 587 insertions(+), 0 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/02/9502/1

diff --git a/configure.ac b/configure.ac
index 25bcad7..96d4c5a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -182,4 +182,5 @@
     tests/handover/Makefile
     doc/Makefile
     doc/examples/Makefile
+    doc/old/Makefile
     Makefile)
diff --git a/doc/Makefile.am b/doc/Makefile.am
index ca0470d..c11cb08 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1,5 +1,6 @@
 SUBDIRS = \
 	examples \
+	old \
 	$(NULL)
 
 msc: \
diff --git a/doc/old/Makefile.am b/doc/old/Makefile.am
new file mode 100644
index 0000000..52680ec
--- /dev/null
+++ b/doc/old/Makefile.am
@@ -0,0 +1,13 @@
+msc: \
+	$(builddir)/handover.png \
+	$(builddir)/assignment.png \
+	$(builddir)/lchan-release.png \
+	$(builddir)/ms-channel-request.png \
+	$(NULL)
+
+$(builddir)/%.png: $(srcdir)/%.msc
+	mscgen -T png -o $@ $<
+
+.PHONY: poll
+poll:
+	while true; do $(MAKE) msc; sleep 1; done
diff --git a/doc/old/assignment.msc b/doc/old/assignment.msc
new file mode 100644
index 0000000..d470d01
--- /dev/null
+++ b/doc/old/assignment.msc
@@ -0,0 +1,190 @@
+msc {
+	hscale=3;
+	ms [label="MS"], bts [label="BTS"], bsc[label="BSC"], bsc_gscon[label="BSC conn FSM"], bsc_mgcp[label="BSC mgcp FSM"], mgw[label="MGW"], msc_[label="MSC"];
+
+	ms note msc_ [label="lchan allocation sequence for BSSMAP Assignment Request"];
+
+	bsc <= msc_ [label="BSSMAP Assignment Request"];
+	bsc box bsc [label="bssmap_handle_assignm_req()"];
+	bsc -> bsc_gscon [label="GSCON_EV_A_ASSIGNMENT_CMD"];
+
+	--- [label="is the chan_mode a speech mode?"];
+
+	bsc_gscon abox bsc_gscon [label="ST_WAIT_CRCX_BTS (MGCP_MGW_TIMEOUT = 4s)"];
+	bsc_gscon -> bsc_mgcp [label="mgcp_conn_create()"];
+	bsc_mgcp => mgw [label="CRCX (for BTS)"];
+	bsc_mgcp abox bsc_mgcp [label="ST_CRCX (MGCP_MGW_TIMEOUT = 4s)"];
+	bsc_gscon note bsc_mgcp [label="two timeouts running in parallel"];
+	bsc_gscon note bsc_mgcp [label="note: #define MGCP_MGW_TIMEOUT exists twice,
+				       once in libosmo-mgcp-client,
+				       once in bsc_subscr_conn_fsm.c"];
+	bsc_mgcp -> bsc_gscon [label="mgcp_conn_create() exits"];
+	bsc_gscon -> bsc [label="bssmap_handle_assignm_req() exits"];
+	...;
+	--- [label="On Timeout"];
+	bsc_gscon note bsc_gscon [label="The conn FSM likely timeouts first"];
+	bsc_gscon => msc_ [label="BSSMAP Assignment Failure"];
+	bsc_gscon abox bsc_gscon [label="ST_ACTIVE"];
+	bsc_mgcp note bsc_mgcp [label="The MGCP FSM will timeout right after that, and terminate itself,
+				      emitting the parent_term event set upon mgcp_conn_create():"];
+	bsc_mgcp -> bsc_gscon [label="GSCON_EV_MGW_FAIL_BTS"];
+	bsc_gscon note bsc_gscon [label="GSCON_EV_MGW_FAIL_BTS is handled by the conn FSM allstate
+					handler. It sets conn->user_plane.fi_bts = NULL. There is code
+					that would emit a BSSMAP Assignment Failure, but not in
+					ST_ACTIVE"];
+	--- [label="end: 'On Timeout'"];
+	...;
+
+	bsc_mgcp <= mgw [label="CRCX OK (for BTS)"];
+	bsc_mgcp box bsc_mgcp [label="libosmo-mgcp-client fsm_crcx_resp_cb()"];
+	bsc_mgcp -> bsc_gscon [label="GSCON_EV_MGW_CRCX_RESP_BTS"];
+	--- [label="end: 'is the chan_mode a speech mode?'"];
+
+	bsc_gscon note bsc_gscon [label="for mode=sign, we're still handling GSCON_EV_A_ASSIGNMENT_CMD;
+					 for speech mode, we're handling GSCON_EV_MGW_CRCX_RESP_BTS"];
+	bsc <- bsc_gscon [label="gsm0808_assign_req()"];
+
+	bsc box bsc [label="lchan_alloc(): pick available lchan"];
+	bsc box bsc [label="rsl_chan_activate_lchan()"];
+
+	--- [label="is the chosen lchan on dynamic timeslot that is currently used as PDCH?"];
+	bts <= bsc [label="i) RSL RF Chan Release of PDCH (Osmocom dyn TS)"];
+	bts <= bsc [label="OR ii) RSL PDCH Deact (ip.access dyn TS)"];
+	bsc -> bsc_gscon [label="gsm0808_assign_req() returns early"];
+	bsc_gscon abox bsc_gscon [label="ST_WAIT_ASS_COMPL (GSM0808_T10_VALUE=6s)"];
+	...;
+	bts note bsc_gscon [linecolor="red",
+		label="Osmocom style dyn TS use lchan->act_timer to watch over RF Chan Release, but there
+		seems to be no timer watching over PDCH Deact!"];
+	...;
+	bts => bsc [label="i) RSL RF Chan Release ACK (Osmocom dyn TS)"];
+	bts => bsc [label="OR ii) RSL PDCH Deact ACK (ip.access dyn TS)"];
+	bsc box bsc [label="rsl_chan_activate_lchan() re-invoked"];
+	bsc box bsc [label="lchan->state = LCHAN_S_ACT_REQ"];
+	bts <= bsc [label="RSL Chan Activ"];
+	--- [label="else (no dyn TS switchover)"];
+
+	bsc box bsc [label="lchan->state = LCHAN_S_ACT_REQ"];
+	bts <= bsc [label="RSL Chan Activ"];
+	bsc -> bsc_gscon [label="gsm0808_assign_req() returns"];
+	bsc_gscon abox bsc_gscon [label="ST_WAIT_ASS_COMPL (GSM0808_T10_VALUE=6s)"];
+	---;
+
+	...;
+	--- [label="On Timeout"];
+	bsc_gscon => msc_ [label="BSSMAP Assignment Failure"];
+	bsc_gscon abox bsc_gscon [label="ST_ACTIVE"];
+	bsc_gscon note bsc_mgcp [linecolor="red",
+	  label="The mgcp FSM from CRCX above apparently lacks a cleanup action for this case.
+	         It should be cleaned up eventually when the conn is torn down, but we should
+		 release RTP endpoints as soon as possible."];
+	--- [label="end: 'On Timeout'"];
+	...;
+
+	bts => bsc [label="RSL Chan Activ ACK"];
+	bsc box bsc [label="rsl_rx_chan_act_ack()"];
+	bsc box bsc [label="Stop lchan->act_timer"];
+	bsc box bsc [label="lchan->state = LCHAN_S_ACTIVE"];
+	bsc -> bsc [label="S_LCHAN_ACTIVATE_ACK"];
+	bsc box bsc [label="bsc_api.c handle_chan_ack()"];
+	ms <= bsc [label="RR Assignment Command"];
+
+	...;
+	ms note bsc_gscon [label="We rely on the overall conn FSM ST_WAIT_ASS_COMPL timeout."];
+	...;
+
+	ms => bsc [label="RR Assignment Complete"];
+	bsc box bsc [label="handle_ass_compl()"];
+	--- [label="Release old lchan"];
+	bsc box bsc [label="_lchan_handle_release(sacch_deact=0)"];
+	bsc box bsc [label="rsl_release_sapis_from(start=1)"];
+	bts <= bsc [label="RSL Release Request (Local End)..."];
+	bts <= bsc [label="...for each SAPI except link_id=0"];
+	bsc box bsc [label="rsl_release_request(link_id=0)"];
+	bts <= bsc [label="RSL Release Request (Local End) for link_id=0"];
+	bsc box bsc [label="_lchan_handle_release() returns here, the remaining release is asynchronous;
+	                    see `End: 'Release old lchan'` below."];
+	...;
+	bts note bsc_gscon [linecolor="red",
+	  label="There seems to be no timer watching over RSL Release Request!"];
+	...;
+	bts => bsc [label="RSL Release Confirm..."];
+	bts => bsc [label="...for each SAPI and link_id=0"];
+	bsc abox bsc [label="start T3111"];
+	...;
+	bsc box bsc [label="T3111 expires"];
+	bsc abox bsc [label="Start lchan->act_timer with lchan_deact_tmr_cb"];
+	bts <= bsc [label="RSL RF Channel Release"];
+	...;
+	--- [label="On timeout"];
+	bsc box bsc [label="lchan_deact_tmr_cb()"];
+	bsc box bsc [label="rsl_lchan_mark_broken(): state=LCHAN_S_BROKEN"];
+	bsc box bsc [label="lchan_free()"];
+	bsc -> bsc [label="S_LCHAN_UNEXPECTED_RELEASE"];
+	bsc box bsc [label="bsc_api.c handle_release()"];
+	bsc box bsc [label="bsc->assign_fail()"];
+	bsc -> bsc_gscon [label="GSCON_EV_RR_ASS_FAIL"];
+	bsc note bsc_gscon [linecolor="orange",
+	  label="The name 'RR_ASS_FAIL' might suggest the event means an actual RR Assignment
+		 Failure message being received. Maybe this should be called GSCON_EV_ASSIGNMENT_ERROR."];
+	...;
+	bsc box bsc [label="bsc->clear_request()"];
+	bsc box bsc [label="bsc_clear_request encodes a BSSMAP Clear Request message and passes it on
+	                    to the conn FSM as data argument via:"];
+	bsc -> bsc_gscon [label="GSCON_EV_TX_SCCP"];
+	bsc_gscon => msc_ [label="BSSMAP Clear Request"];
+	bsc note bsc_gscon [linecolor="red",
+	  label="Instead of sending an arbitrary message, the conn FSM should
+		 be explicitly instructed to clear the connection, to be able
+		 to notice if the MSC failed to respond to the Clear Request.
+		 Currently, this relies on the MSC responding with a Clear
+		 Command, hopefully, some time later."];
+	--- [label="End: 'On timeout'"];
+	...;
+	bts => bsc [label="RSL RF Channel Release Ack"];
+	bsc box bsc [label="Stop lchan->act_timer"];
+	bsc box bsc [label="Stop lchan->T3111"];
+	--- [label="End: 'Release old lchan'"];
+	bsc box bsc [label="still in handle_ass_compl()"];
+	bsc note bsc [label="officially take over new lchan: conn->lchan = conn->secondary_lchan"];
+	--- [label="is BTS using IPA Abis? (osmo-bts, ip.access)"];
+	bts <= bsc [label="IPACC CRCX"];
+	---;
+	bsc -> bsc [label="handle_ass_compl() calls bsc_api->assign_compl()"];
+	--- [label="is BTS using IPA Abis? (osmo-bts, ip.access) && conn->user_plane.rtp_ip"];
+	bsc box bsc [label="bsc_assign_compl()"];
+	bsc note bsc [label="set ass_compl.valid = true,
+			    postponing GSCON_EV_RR_ASS_COMPL until after the
+			    IPACC MDCX ACK received in osmo_bsc_audio.c"];
+	bsc box bsc [label="exit early: bsc_assign_compl()"];
+	bsc box bsc [label="exit early: handle_ass_compl()"];
+	bsc box bsc [label="osmo_bsc_audio.c"];
+	bts => bsc [label="IPACC CRCX ACK"];
+	bts <= bsc [label="IPACC MDCX"];
+	bts => bsc [label="IPACC MDCX ACK"];
+	bsc box bsc [label="handle_abisip_signal()"];
+	bsc -> bsc_gscon [label="GSCON_EV_RR_ASS_COMPL"];
+	--- [label="else"];
+	bsc box bsc [label="bsc_assign_compl()"];
+	bsc -> bsc_gscon [label="GSCON_EV_RR_ASS_COMPL"];
+	--- ;
+
+	--- [label="is chan_mode a speech mode?"];
+	bsc_gscon abox bsc_gscon [label="ST_WAIT_MDCX_BTS"];
+	bsc_gscon -> bsc_mgcp [label="mgcp_conn_modify()"];
+	bsc_mgcp note bsc_mgcp [label="same mgcp FSM as above, for BTS side"];
+	bsc_mgcp => mgw [label="MDCX (for BTS)"];
+	bsc_mgcp <= mgw [label="MDCX OK"];
+	bsc_mgcp -> bsc_gscon [label="GSCON_EV_MGW_MDCX_RESP_BTS"];
+	bsc_gscon abox bsc_gscon [label="ST_WAIT_CRCX_MSC"];
+	bsc_gscon -> bsc_mgcp [label="mgcp_conn_create()"];
+	bsc_mgcp note bsc_mgcp [label="second mgcp FSM for MSC side"];
+	bsc_mgcp => mgw [label="CRCX (for MSC)"];
+	bsc_mgcp <= mgw [label="CRCX OK (for MSC)"];
+	bsc_gscon <- bsc_mgcp [label="GSCON_EV_MGW_CRCX_RESP_MSC"];
+	---;
+
+	bsc_gscon => msc_ [label="BSSMAP Assignment Complete"];
+
+	bsc_gscon abox bsc_gscon [label="ST_ACTIVE"];
+}
diff --git a/doc/old/handover.msc b/doc/old/handover.msc
new file mode 100644
index 0000000..8862dd9
--- /dev/null
+++ b/doc/old/handover.msc
@@ -0,0 +1,170 @@
+# Handover between cells, intra-BSC
+msc {
+	hscale=3;
+	ms [label="MS"], bts [label="BTS"], bsc[label="BSC"], bsc_gscon[label="BSC conn FSM"], bsc_mgcp[label="BSC mgcp FSM"], mgw[label="MGW"];
+
+	ms note mgw [label="intra-BSC Handover sequence"];
+
+	bsc_gscon abox bsc_gscon [label="ST_ACTIVE"];
+	bsc box bsc [label="bsc_handover_start(): init conn->ho"];
+	bsc -> bsc_gscon [label="GSCON_EV_HO_START"];
+	bsc <- bsc_gscon [label="bsc_handover_start_gscon()"];
+
+	bsc box bsc [label="lchan_alloc(): pick available lchan"];
+	bsc box bsc [label="rsl_chan_activate_lchan()"];
+
+	--- [label="is the chosen lchan on dynamic timeslot that is currently used as PDCH?"];
+	bts <= bsc [label="i) RSL RF Chan Release of PDCH (Osmocom dyn TS)"];
+	bts <= bsc [label="OR ii) RSL PDCH Deact (ip.access dyn TS)"];
+	bsc -> bsc_gscon [label="bsc_handover_start_gscon() returns early"];
+	bsc_gscon abox bsc_gscon [label="ST_WAIT_HO_COMPL (no timeout, relies on T3103 below)"];
+	...;
+	bts note bsc_gscon [linecolor="red",
+		label="Osmocom style dyn TS use lchan->act_timer to watch over RF Chan Release, but there
+		seems to be no timer watching over PDCH Deact!"];
+	...;
+	bts => bsc [label="i) RSL RF Chan Release ACK (Osmocom dyn TS)"];
+	bts => bsc [label="OR ii) RSL PDCH Deact ACK (ip.access dyn TS)"];
+	bsc box bsc [label="rsl_chan_activate_lchan() re-invoked"];
+	bts <= bsc [label="RSL Chan Activ"];
+	--- [label="else (no dyn TS switchover)"];
+
+	bts <= bsc [label="RSL Chan Activ"];
+	bsc -> bsc_gscon [label="bsc_handover_start_gscon() returns"];
+	---;
+	bsc_gscon abox bsc_gscon [label="ST_WAIT_HO_COMPL (no timeout, relies on T3103 below)"];
+
+	...;
+	bts note bsc_gscon [linecolor="red",
+	  label="There seems to be no timer watching out for RSL Chan Activ ACK/NACK!"];
+	...;
+	bts => bsc [label="RSL Chan Activ ACK"];
+	bsc box bsc [label="rsl_rx_chan_act_ack()"];
+	bsc box bsc [label="Stop lchan->act_timer"];
+	bsc box bsc [label="lchan->state = LCHAN_S_ACTIVE"];
+	bsc -> bsc [label="S_LCHAN_ACTIVATE_ACK"];
+	bsc box bsc [label="handover_logic.c ho_logic_sig_cb()"];
+	bsc box bsc [label="ho_chan_activ_ack()"];
+	bsc note bsc [label="gsm48_send_ho_cmd()"];
+	ms <= bsc [label="RR Handover Command"];
+	bsc abox bsc [label="start T3103"];
+	--- [label="is BTS using IPA Abis? (osmo-bts, ip.access)"];
+	bts <= bsc [label="IPACC CRCX"];
+	bsc -> bsc [label="ho_chan_activ_ack() returns"];
+	bts note bsc [linecolor="red",
+	  label="There seems to be no timer watching over IPACC CRCX ACK/NACK!
+	         If no response is received, we simply ignore that fact and carry on as if
+		 everything was fine."];
+	...;
+	bts note bsc [label="The IPACC CRCX and MDCX ACKs may come back at any time:
+			     before or after the Handover Detect, before or after Handover Complete."];
+	bts note bsc_mgcp [linecolor="red",
+	  label="The CRCX ACK contains vital information for routing the RTP stream.
+	         If the CRCX ACK were very slow, we would not know which RTP/RTPC ports
+		 to point the MGW at, below at mgcp_conn_modify()!
+		 Even though this being unrealistic, we must make sure to receive a CRCX ACK."];
+	...;
+	bsc box bsc [label="osmo_bsc_audio.c"];
+	bts => bsc [label="IPACC CRCX ACK"];
+	bts <= bsc [label="IPACC MDCX"];
+	...;
+	bts note bsc [linecolor="red",
+	  label="There seems to be no timer watching over IPACC MDCX ACK/NACK!
+	         If no response is received, we simply ignore that fact and carry on as if
+		 everything was fine."];
+	...;
+	bts => bsc [label="IPACC MDCX ACK"];
+	bts note bsc [label="IPACC MDCX ACK triggers no events or actions"];
+	---;
+
+	...;
+	ms => bsc [label="RR Handover Detect"];
+	bsc -> bsc [label="S_LCHAN_HANDOVER_DETECT"];
+	bsc box bsc [label="ho_rsl_detect(): no action, only logging"];
+	bsc note bsc_gscon [label="Handover Detect triggers no events or actions"];
+	bsc note bsc_gscon [linecolor="red",
+	  label="upon Handover Detect, we should already start re-routing the RTP!
+	         Instead we wait for Handover Complete."];
+
+	...;
+	ms => bsc [label="RR Handover Complete"];
+	bsc -> bsc [label="S_LCHAN_HANDOVER_COMPL"];
+	bsc box bsc [label="handover_logic.c ho_logic_sig_cb()"];
+	bsc box bsc [label="ho_gsm48_ho_compl()"];
+	bsc box bsc [label="stop T3103"];
+	bts note bsc_gscon [label="If anything goes wrong from this point on, we will not move back
+	                           to the old lchan: would be pointless after Handover Complete."];
+	bsc note bsc [label="officially take over new lchan: conn->lchan = ho->new_lchan"];
+
+	--- [label="Release old lchan"];
+	bsc box bsc [label="_lchan_handle_release(sacch_deact=0)"];
+	bsc box bsc [label="rsl_release_sapis_from(start=1)"];
+	bts <= bsc [label="RSL Release Request (Local End)..."];
+	bts <= bsc [label="...for each SAPI except link_id=0"];
+	bsc box bsc [label="rsl_release_request(link_id=0)"];
+	bts <= bsc [label="RSL Release Request (Local End) for link_id=0"];
+	bsc box bsc [label="_lchan_handle_release() returns here, the remaining release is asynchronous;
+	                    see `End: 'Release old lchan'` below."];
+	...;
+	bts note bsc_gscon [linecolor="red",
+	  label="There seems to be no timer watching over RSL Release Request!"];
+	...;
+	bts => bsc [label="RSL Release Confirm..."];
+	bts => bsc [label="...for each SAPI and link_id=0"];
+	bsc abox bsc [label="start T3111"];
+	...;
+	bsc box bsc [label="T3111 expires"];
+	bsc abox bsc [label="Start lchan->act_timer with lchan_deact_tmr_cb"];
+	bts <= bsc [label="RSL RF Channel Release"];
+	...;
+	--- [label="On timeout"];
+	bsc box bsc [label="lchan_deact_tmr_cb()"];
+	bsc box bsc [label="rsl_lchan_mark_broken(): state=LCHAN_S_BROKEN"];
+	bsc box bsc [label="lchan_free()"];
+	bsc -> bsc [label="S_LCHAN_UNEXPECTED_RELEASE"];
+	bsc box bsc [label="bsc_api.c handle_release()"];
+	bsc box bsc [label="bsc->clear_request()"];
+	bsc box bsc [label="bsc_clear_request encodes a BSSMAP Clear Request message and passes it on
+	                    to the conn FSM as data argument via:"];
+	bsc -> bsc_gscon [label="GSCON_EV_TX_SCCP"];
+	bsc_gscon rbox bsc_gscon [label="BSSMAP Clear Request to MSC"];
+	bsc note bsc_gscon [linecolor="red",
+	  label="During Handover, we actually release the entire conn just because we failed to
+	         gracefully release the old lchan. That is obviously nonsense."];
+	bsc note bsc [label="Stop T3101 (but was not active in this code path)"];
+	bsc -> bsc [label="S_CHALLOC_FREED"];
+	--- [label="End: 'On timeout'"];
+	...;
+	bts => bsc [label="RSL RF Channel Release Ack"];
+	bsc box bsc [label="Stop lchan->act_timer"];
+	bsc box bsc [label="Stop lchan->T3111"];
+	---;
+
+	bsc box bsc [label="still in ho_gsm48_ho_compl()"];
+	bsc note bsc [label="handover_free(), conn->ho = NULL"];
+	bsc -> bsc_gscon [label="GSCON_EV_HO_COMPL"];
+	bsc note bsc_gscon [linecolor="orange",
+	  label="Handover information is cleared before signalling the conn FSM.
+	         That means the conn FSM cannot possibly log sensible information about exactly
+		 which Handover has just completed."];
+
+	bsc_gscon abox bsc_gscon [label="ST_WAIT_MDCX_BTS_HO
+					 (MGCP_MGW_TIMEOUT=4s with MGCP_MGW_HO_TIMEOUT_TIMER_NR)"];
+
+	bsc_gscon -> bsc_mgcp [label="mgcp_conn_modify()"];
+	bsc_mgcp note bsc_mgcp [label="mgcp FSM that was established for old lchan, for BTS side"];
+	bsc_mgcp => mgw [label="MDCX (for BTS)"];
+	...;
+	bsc_gscon note mgw [
+	  label="If we get no MDCX ACK, the MGCP FSM terminates, and emits GSCON_EV_MGW_FAIL_BTS.
+		 Besides invalidating the MGCP FSM pointer, this event has no
+		 effect in ST_WAIT_MDCX_BTS_HO, and we rely on above conn FSM
+		 timeout instead."];
+	bsc_gscon note bsc_gscon [linecolor="red",
+	  label="A timeout of ST_WAIT_MDCX_BTS_HO simply transitions back to ST_ACTIVE!
+	         Even though the MGW failed, we carry on as if everything were fine."];
+	...;
+	bsc_mgcp <= mgw [label="MDCX OK"];
+	bsc_mgcp -> bsc_gscon [label="GSCON_EV_MGW_MDCX_RESP_BTS"];
+	bsc_gscon abox bsc_gscon [label="ST_ACTIVE"];
+}
diff --git a/doc/old/lchan-release.msc b/doc/old/lchan-release.msc
new file mode 100644
index 0000000..f75b559
--- /dev/null
+++ b/doc/old/lchan-release.msc
@@ -0,0 +1,149 @@
+msc {
+	hscale=2;
+	ms [label="MS"], bts [label="BTS"], bsc[label="BSC"], bsc_gscon[label="BSC conn FSM"];
+
+	ms note bsc_gscon [label="various lchan release scenarios"];
+	
+
+	ms rbox bsc_gscon [label="IF BSC releases, from BSSMAP Clear Request"];
+	bsc note bsc [label="lchan_release() may be called with sacch_deact=true or false.
+		Currently, the only time lchan_release(sacch_deact=true) is invoked is upon BSSMAP Clear
+		Command, i.e. when the MSC instructs to stop using an active lchan.
+		Some error handling code paths however directly invoke
+		rsl_rf_chan_release(error=1, SACCH_DEACTIVATE)."];
+
+	---;
+	bsc_gscon note bsc_gscon [label="Rx: BSSMAP Clear Request from MSC"];
+	bsc <- bsc_gscon [label="gsm0808_clear()"];
+	bsc box bsc [label="lchan_release(sacch_deact=1)"];
+	bsc box bsc [label="lchan->state = LCHAN_S_REL_REQ"];
+	bsc box bsc [label="_lchan_handle_release(sacch_deact=1)"];
+	bsc box bsc [label="rsl_release_sapis_from(start=1)"];
+	bts <= bsc [label="RSL Release Request (Local End)..."];
+	bts <= bsc [label="...for each SAPI, except link_id=0"];
+	ms <= bsc [label="RR Channel Release"];
+	ms note bsc [label="There is no ACK for RR Channel Release"];
+	bsc box bsc [label="rsl_deact_sacch()"];
+	bts <= bsc [label="RSL Deactivate SACCH"];
+	bsc abox bsc [label="Start T3109 (net->T3109, t3109_expired())"];
+	...;
+	--- [label="If T3109 expires"];
+	bsc box bsc [label="t3109_expired()"];
+	bsc box bsc [label="rsl_rf_chan_release(error=1)"];
+	bts <= bsc [label="RSL Release Request (Local End)..."];
+	bts <= bsc [label="...for each SAPI, except link_id=0"];
+	bsc box bsc [label="lchan->state = LCHAN_S_REL_REQ"];
+	bts <= bsc [label="RSL RF Channel Release"];
+	---;
+	...;
+	bsc rbox bsc [label="continue in the 'Common' part"];
+	--- [label="END: 'BSSMAP Clear Request'"];
+	...;
+	...;
+
+	ms rbox bsc_gscon [label="IF BSC releases, from implicitly unused lchan"];
+	bsc note bsc [label="The BSC may release old unused lchans after Handover, or release lchans
+		after some error condition."];
+	bsc note bsc [label="BSC decides to release an unused lchan"];
+	bsc box bsc [label="lchan_release(sacch_deact=0)"];
+	bsc box bsc [label="lchan->state = LCHAN_S_REL_REQ"];
+	bsc box bsc [label="_lchan_handle_release(sacch_deact=0)"];
+	bts <= bsc [label="RSL Release Request (Local End)..."];
+	bts <= bsc [label="...for all SAPIs"];
+	...;
+	bts note bsc_gscon [linecolor="red",
+	  label="There seems to be no timer watching over RSL Release Request!"];
+	...;
+	bts => bsc [label="RSL Release Confirm..."];
+	bts => bsc [label="...for all SAPIs"];
+	bsc rbox bsc [label="continue in the 'Common' part"];
+	---;
+	...;
+	...;
+
+	ms rbox bsc_gscon [label="IF MS releases"];
+	ms => bts [label="DISC"];
+	bts => bsc [label="RLL Release Ind..."];
+	bts => bsc [label="...for each SAPI"];
+	bsc rbox bsc [label="continue in the 'Common' part"];
+	---;
+	...;
+	...;
+	ms rbox bsc_gscon [label="Common"];
+	--- [label="for each SAPI (?)"];
+	bts => bsc [label="RLL Release Confirm / RLL Release Ind"];
+	bsc box bsc [label="abis_rsl_rx_rll()"];
+	bsc box bsc [label="mark lchan->sapis[link_id] = LCHAN_SAPI_UNUSED"];
+	bsc box bsc [label="rll_indication()"];
+	bsc box bsc [label="for each bsc_rll_req matching this link_id:
+		disable timer, call cb(BSC_RLLR_IND_REL_IND)"];
+	bsc box bsc [label="rsl_handle_release()"];
+	--- [label="IF all SAPIs are unused"];
+	bsc box bsc [label="Stop T3109"];
+	bsc note bsc [label="T3109 was started if the MSC requested the release"];
+	bsc abox bsc [label="Start T3111 (net->T3111 value, t3111_expired())"];
+	--- [label="END: all SAPIs are unused"];
+	bsc -> bsc_gscon [label="GSCON_EV_RLL_REL_IND (only if RLL Release Ind)"];
+	--- [label="END: for each SAPI"];
+
+	...;
+	bsc box bsc [label="T3111 expires"];
+	bsc box bsc [label="rsl_rf_chan_release()"];
+	bsc box bsc [label="Stop T3109"];
+	bsc note bsc [label="[If lchan->state is LCHAN_S_REL_ERR, don't do anything]"];
+	bsc abox bsc [label="Start lchan->act_timer (4s, lchan_deact_tmr_cb())"];
+	bts <= bsc [label="RSL RF Channel Release"];
+
+	...;
+	--- [label="IF lchan->act_timer expires"];
+	bsc box bsc [label="lchan_deact_tmr_cb()"];
+	bsc box bsc [label="rsl_lchan_mark_broken(): lchan->state = LCHAN_S_BROKEN"];
+	bsc box bsc [label="lchan_free() (see below)"];
+	--- [label="END: 'lchan->act_timer expires'"];
+	...;
+
+	bts => bsc [label="RSL RF Channel Release ACK"];
+	bsc box bsc [label="rsl_rx_rf_chan_rel_ack()"];
+	bsc box bsc [label="Stop lchan->act_timer"];
+	bsc box bsc [label="Stop T3111"];
+
+	--- [label="IF lchan->state == LCHAN_S_BROKEN"];
+	bsc note bsc [label="If an ACK comes in late, for specific BTS models, we may choose to 'repair'
+		the lchan so that it is usable again, by calling do_lchan_free() directly (see below)."];
+	bsc box bsc [label="rsl_rx_rf_chan_rel_ack() exits here and none of below actions happen.
+		The lchan remains LCHAN_S_BROKEN indefinitely."];
+	--- [label="END: lchan->state == LCHAN_S_BROKEN"];
+	bsc box bsc [label="do_lchan_free()"];
+	--- [label="IF lchan->state == LCHAN_S_REL_ERR"];
+	bsc note bsc [label="If release failed, we take the lchan back into operation after due
+		timeout"];
+	bsc abox bsc [label="Start lchan->error_timer (T3111+2, error_timeout_cb())"];
+	bsc note bsc [label="do_lchan_free() continues, async:"];
+	...;
+	bsc box bsc [label="error_timeout_cb()"];
+	bsc box bsc [label="lchan->state = LCHAN_S_NONE"];
+	bsc box bsc [label="dyn TS: activate PDCH..."];
+	--- [label="ELSE"];
+	bsc box bsc [label="lchan->state = LCHAN_S_NONE"];
+	--- [label="END: lchan->state == LCHAN_S_REL_ERR"];
+	bsc box bsc [label="lchan_free()"];
+	--- [label="IF conn is still associated (and not dyn TS in switchover)"];
+	bsc -> bsc [label="S_LCHAN_UNEXPECTED_RELEASE"];
+	bsc box bsc [label="handle_release()"];
+	bsc box bsc [label="Stop T10"];
+	bsc note bsc [linecolor=orange,label="conn->T10 is actually dead code, it is never started.
+		Instead, the conn FSM starts ST_WAIT_ASS_COMPL with a T10 value."];
+	bsc -> bsc_gscon [label="GSCON_EV_RR_ASS_FAIL"];
+	bsc -> bsc_gscon [label="GSCON_EV_TX_SCCP: BSSMAP Clear Request"];
+	bsc box bsc [label="bsc_clear_handover()"];
+	bsc box bsc [label="Stop T3103"];
+	bsc box bsc [label="free handover struct"];
+	bsc box bsc [label="lchan->conn = NULL"];
+	--- [label="END: 'conn is still associated'"];
+	bsc box bsc [label="Stop T3101"];
+	bsc note bsc [label="T3101 is started when sending an RR Immediate Assignment"];
+	bsc -> bsc [label="S_CHALLOC_FREED"];
+	bsc -> bsc [label="rll_lchan_signal()"];
+	bsc box bsc [label="for each bsc_rll_req matching this lchan:
+		disable timer, call cb(BSC_RLLR_IND_REL_IND)"];
+}
diff --git a/doc/old/ms-channel-request.msc b/doc/old/ms-channel-request.msc
new file mode 100644
index 0000000..c0ef60f
--- /dev/null
+++ b/doc/old/ms-channel-request.msc
@@ -0,0 +1,63 @@
+msc {
+	hscale=3;
+	ms [label="MS"], bts [label="BTS"], bsc[label="BSC"], bsc_gscon[label="BSC conn FSM"];
+
+	ms note bsc_gscon [label="lchan allocation sequence for RSL Channel Request"];
+
+	ms => bts [label="RR Channel Request"];
+	bts => bsc [label="RSL Channel Request"];
+	bsc box bsc [label="rsl_rx_chan_rqd()"];
+	bsc note bsc [label="Obtain RACH data from Request: - Reference - Access Delay (TA)
+		- Request Reason - Channel Type"];
+	bsc note bsc [label="If the reason is PDCH, the RACH Request is forwarded to PCU and BSC is no
+		longer concerned (rsl_rx_pchan_rqd())."];
+	bsc note bsc [label="Always try to allocate an SDCCH regardless of the requested type, only if no
+		SDCCH is available, look for the actually requested channel type."];
+	bsc box bsc [label="lchan_alloc(SDCCH, allow_bigger=0)"];
+
+	--- [label="IF no lchan is available (neither SDCCH nor requested type)"];
+	bsc note bsc [label="Figure out T3122 value from bts->T3122, network->T3122 or
+		GSM_T3122_DEFAULT"];
+	bsc box bsc [label="rsl_send_imm_ass_rej()"];
+	bsc note bsc [label="..."];
+	bts <= bsc [label="RR Immediate Assign Reject"];
+	ms <= bts [label="RR Immediate Assign Reject (possibly grouped with up to 4 others)"];
+	bsc note bsc [label="rsl_rx_pchan_rqd() exits, no channel is allocated."];
+	---;
+
+	bsc box bsc [label="Store RACH data in lchan->rqd_ref, rqd_ta"];
+	bsc abox bsc [label="Start lchan->act_timer (4s, lchan_act_tmr_cb())"];
+
+	bsc box bsc [label="rsl_chan_activate_lchan(RSL_ACT_INTRA_IMM_ASS)"];
+	--- [label="is the chosen lchan on dynamic timeslot that is currently used as PDCH?"];
+	bsc box bsc [linecolor=red,label="Osmocom style dyn TS use the lchan->act_timer for an RSL RF
+		Channel Release, to release PDCH mode. This will actually overwrite above act_timer!"];
+	bts <= bsc [label="i) RSL RF Chan Release of PDCH (Osmocom dyn TS)"];
+	bts <= bsc [label="OR ii) RSL PDCH Deact (ip.access dyn TS)"];
+	bsc -> bsc_gscon [label="gsm0808_assign_req() returns early"];
+	bsc_gscon abox bsc_gscon [label="ST_WAIT_ASS_COMPL (GSM0808_T10_VALUE=6s)"];
+	...;
+	bts note bsc_gscon [linecolor="red",
+		label="Osmocom style dyn TS use lchan->act_timer to watch over RF Chan Release, but there
+		seems to be no timer watching over PDCH Deact!"];
+	...;
+	bts => bsc [label="i) RSL RF Chan Release ACK (Osmocom dyn TS)"];
+	bts => bsc [label="OR ii) RSL PDCH Deact ACK (ip.access dyn TS)"];
+	bsc box bsc [label="rsl_chan_activate_lchan() re-invoked"];
+	---;
+
+	bsc box bsc [label="lchan->state = LCHAN_S_ACT_REQ"];
+	bts <= bsc [label="RSL Chan Activ: Immediate Assignment"];
+	...;
+	bsc note bsc [label="Timeout of lchan->act_timer causes the
+		lchan->state to go to LCHAN_S_BROKEN, but no events or actions
+		are triggered."];
+	...;
+	bts => bsc [label="RSL Chan Activ ACK"];
+	bsc box bsc [label="rsl_rx_chan_act_ack()"];
+	bsc box bsc [label="Stop lchan->act_timer"];
+	bsc box bsc [label="lchan->state = LCHAN_S_ACTIVE"];
+	bsc -> bsc [label="S_LCHAN_ACTIVATE_ACK (has no effect)"];
+	bsc note bsc [label="Since this was an Immediate Assignment, no further action is required on
+		behalf of the BSC. The MS is now free to use the lchan."];
+}

-- 
To view, visit https://gerrit.osmocom.org/9502
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iac18f12529d5961a66e4853dc3a93636eb499127
Gerrit-Change-Number: 9502
Gerrit-PatchSet: 1
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>
Gerrit-CC: Jenkins Builder
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180607/2093da6e/attachment.htm>


More information about the gerrit-log mailing list