<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9667">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">doc: update/fix FSM charts<br><br>Change-Id: I29e31b753e23a4207662e0e385a337e7df836f45<br>---<br>M doc/Makefile.am<br>A doc/assignment-fsm.dot<br>M doc/assignment.msc<br>A doc/handover-inter-bsc-mo-fsm.dot<br>A doc/handover-inter-bsc-mt-fsm.dot<br>M doc/handover-inter-bsc-mt.msc<br>A doc/handover-intra-bsc-fsm.dot<br>M doc/handover.msc<br>M doc/lchan-fsm.dot<br>M doc/lchan.msc<br>A doc/mgw-endpoint-fsm.dot<br>M doc/ms-channel-request.msc<br>12 files changed, 185 insertions(+), 26 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/67/9667/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/Makefile.am b/doc/Makefile.am</span><br><span>index ca0470d..2a855eb 100644</span><br><span>--- a/doc/Makefile.am</span><br><span>+++ b/doc/Makefile.am</span><br><span>@@ -15,8 +15,13 @@</span><br><span>    $(NULL)</span><br><span> </span><br><span> dot: \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(builddir)/assignment-fsm.png \</span><br><span>     $(builddir)/timeslot-fsm.png \</span><br><span>       $(builddir)/lchan-fsm.png \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(builddir)/mgw-endpoint-fsm.png \</span><br><span style="color: hsl(120, 100%, 40%);">+    $(builddir)/handover-intra-bsc-fsm.png \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(builddir)/handover-inter-bsc-mo-fsm.png \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(builddir)/handover-inter-bsc-mt-fsm.png \</span><br><span>  $(NULL)</span><br><span> </span><br><span> $(builddir)/%.png: $(srcdir)/%.msc</span><br><span>diff --git a/doc/assignment-fsm.dot b/doc/assignment-fsm.dot</span><br><span>new file mode 100644</span><br><span>index 0000000..90f7621</span><br><span>--- /dev/null</span><br><span>+++ b/doc/assignment-fsm.dot</span><br><span>@@ -0,0 +1,35 @@</span><br><span style="color: hsl(120, 100%, 40%);">+digraph G {</span><br><span style="color: hsl(120, 100%, 40%);">+rankdir=TB;</span><br><span style="color: hsl(120, 100%, 40%);">+  </span><br><span style="color: hsl(120, 100%, 40%);">+      WAIT_LCHAN_ACTIVE</span><br><span style="color: hsl(120, 100%, 40%);">+     WAIT_RR_ASS_COMPLETE</span><br><span style="color: hsl(120, 100%, 40%);">+  WAIT_LCHAN_ESTABLISHED</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_MGW_ENDPOINT_TO_MSC</span><br><span style="color: hsl(120, 100%, 40%);">+      terminate [shape=box]</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+      gscon [label="conn FSM",shape=box3d];</span><br><span style="color: hsl(120, 100%, 40%);">+       gscon2 [label="conn FSM",shape=box3d];</span><br><span style="color: hsl(120, 100%, 40%);">+      lchan [label="lchan FSM",shape=box3d];</span><br><span style="color: hsl(120, 100%, 40%);">+      old_lchan [label="old lchan",shape=box3d];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        invisible [style="invisible"]</span><br><span style="color: hsl(120, 100%, 40%);">+       invisible -> gscon [label="GSCON_EV_A_ASSIGNMENT_CMD",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+      invisible -> old_lchan [style=invisible,arrowhead=none]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  gscon -> WAIT_LCHAN_ACTIVE [label="assignment_fsm_start()",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_LCHAN_ACTIVE -> lchan [label="lchan_activate()\nFOR_ASSIGNMENT",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan -> WAIT_LCHAN_ACTIVE [label="ASSIGNMENT_EV_\nLCHAN_\nACTIVE,ERROR",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+   lchan -> WAIT_LCHAN_ESTABLISHED [label="ASSIGNMENT_EV_\nLCHAN_\nESTABLISHED,ERROR",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       WAIT_LCHAN_ACTIVE -> WAIT_RR_ASS_COMPLETE</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_RR_ASS_COMPLETE -> old_lchan [label="RR Assignment\nCommand",style=dashed,constraint=false]</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan -> WAIT_RR_ASS_COMPLETE [label="RR Assignment\nComplete",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   WAIT_RR_ASS_COMPLETE -> WAIT_LCHAN_ESTABLISHED</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   WAIT_LCHAN_ESTABLISHED -> WAIT_MGW_ENDPOINT_TO_MSC [label="TCH"]</span><br><span style="color: hsl(120, 100%, 40%);">+ WAIT_LCHAN_ESTABLISHED -> terminate [label="non-TCH"]</span><br><span style="color: hsl(120, 100%, 40%);">+    WAIT_MGW_ENDPOINT_TO_MSC -> terminate</span><br><span style="color: hsl(120, 100%, 40%);">+      terminate -> gscon2 [label="GSCON_EV_\nASSIGNMENT_END",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/doc/assignment.msc b/doc/assignment.msc</span><br><span>index 9f10ea1..872161f 100644</span><br><span>--- a/doc/assignment.msc</span><br><span>+++ b/doc/assignment.msc</span><br><span>@@ -6,7 +6,7 @@</span><br><span>  ms note mgw_msc [label="lchan allocation sequence for BSSMAP Assignment Request"];</span><br><span> </span><br><span>     bsc_gscon <= mgw_msc [label="BSSMAP Assignment Request"];</span><br><span style="color: hsl(0, 100%, 40%);">-  bsc_gscon abox bsc_gscon [label="ST_ASSIGNMENT_\nWAIT_LCHAN"];</span><br><span style="color: hsl(120, 100%, 40%);">+      bsc_gscon abox bsc_gscon [label="ST_ASSIGNMENT_\nWAIT_LCHAN\nT10?"];</span><br><span> </span><br><span>   bsc_lchan <- bsc_gscon [label="lchan_select_by_chan_mode(chan_mode)"];</span><br><span>  |||;</span><br><span>@@ -15,13 +15,13 @@</span><br><span>   bsc_gscon abox bsc_gscon [label="ST_ACTIVE"];</span><br><span>      ---;</span><br><span>         |||;</span><br><span style="color: hsl(0, 100%, 40%);">-    bsc_gscon box bsc_gscon [label="store lchan pointer in conn->lchan_for_assignment"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bsc_gscon box bsc_gscon [label="store lchan pointer in conn->assignment.new_lchan"];</span><br><span>    bsc_lchan <- bsc_gscon [label="lchan_activate(FOR_ASSIGNMENT)"];</span><br><span>        ...;</span><br><span>         |||;</span><br><span>         --- [label="on lchan FSM error or timeout"];</span><br><span style="color: hsl(0, 100%, 40%);">-  bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ALLOC_ERROR"];</span><br><span style="color: hsl(0, 100%, 40%);">-       bsc_gscon box bsc_gscon [label="'forget' all about conn->lchan_for_assignment"];</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ERROR"];</span><br><span style="color: hsl(120, 100%, 40%);">+   bsc_gscon box bsc_gscon [label="'forget' all about conn->assignment.new_lchan"];</span><br><span>        bsc_gscon => mgw_msc [label="BSSMAP Assignment Failure"];</span><br><span>       bsc_gscon abox bsc_gscon [label="ST_ACTIVE"];</span><br><span>      --- [label="END: 'on error'"];</span><br><span>@@ -49,9 +49,9 @@</span><br><span>         bsc_gscon -> bsc_lchan [label="LCHAN_EV_MGW_ENDPOINT_ERROR"];</span><br><span>   bsc_lchan note bsc_gscon [label="conn FSM timeout handler exits and relies on the lchan FSM</span><br><span>             signalling error, which should actually happen immediately:"];</span><br><span style="color: hsl(0, 100%, 40%);">-     bsc_gscon <- bsc_lchan [label="GSCON_EV_LCHAN_ALLOC_ERROR"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bsc_gscon <- bsc_lchan [label="GSCON_EV_LCHAN_ERROR"];</span><br><span>  bsc_gscon abox bsc_gscon [label="ST_ACTIVE"];</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_gscon box bsc_gscon [label="'forget' all about conn->lchan_for_assignment"];</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_gscon box bsc_gscon [label="'forget' all about conn->assignment.new_lchan"];</span><br><span>        bsc_gscon => mgw_msc [label="BSSMAP Assignment Failure"];</span><br><span>       --- [label="END: 'On Timeout'"];</span><br><span>   ...;</span><br><span>@@ -67,13 +67,13 @@</span><br><span>   ...;</span><br><span> </span><br><span>     bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ACTIVE"];</span><br><span style="color: hsl(0, 100%, 40%);">-    bsc_gscon abox bsc_gscon [label="ST_ASSIGNMENT_\nWAIT_COMPLETE\nT10, 6s"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bsc_gscon abox bsc_gscon [label="ST_ASSIGNMENT_\nWAIT_COMPLETE\nT10, 6s? T3107?"];</span><br><span>         ms <= bsc_gscon [label="RR Assignment"];</span><br><span>        ...;</span><br><span>         --- [label="On Timeout"];</span><br><span>  bsc_gscon => mgw_msc [label="BSSMAP Assignment Failure"];</span><br><span>       bsc_gscon -> bsc_lchan [label="LCHAN_EV_LCHAN_RELEASE"];</span><br><span style="color: hsl(0, 100%, 40%);">-   bsc_gscon box bsc_gscon [label="'forget' all about conn->lchan_for_assignment"];</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_gscon box bsc_gscon [label="'forget' all about conn->assignment.new_lchan"];</span><br><span>        --- [label="IF assignment_created_mgw_endpoint == true"];</span><br><span>  bsc_gscon -> bsc_mgcp [label="mgcp_conn_delete()"];</span><br><span>     bsc_gscon note bsc_mgcp [label="If the MGW endpoint didn't exist before the Assignment, release</span><br><span>@@ -84,7 +84,7 @@</span><br><span>         ...;</span><br><span>         ms => bsc_gscon [label="RR Assignment Complete"];</span><br><span>       bsc_gscon -> bsc_lchan [label="OLD lchan: LCHAN_EV_LCHAN_RELEASE"];</span><br><span style="color: hsl(0, 100%, 40%);">-        bsc_gscon box bsc_gscon [label="conn->lchan = conn->lchan_for_assignment"];</span><br><span style="color: hsl(120, 100%, 40%);">+   bsc_gscon box bsc_gscon [label="conn->lchan = conn->assignment.new_lchan"];</span><br><span>  --- [label="IF: chan_mode a speech mode?"];</span><br><span>        bsc_gscon abox bsc_gscon [label="ST_WAIT_MDCX_BTS"];</span><br><span>       bsc_gscon -> bsc_mgcp [label="mgcp_conn_modify()"];</span><br><span>diff --git a/doc/handover-inter-bsc-mo-fsm.dot b/doc/handover-inter-bsc-mo-fsm.dot</span><br><span>new file mode 100644</span><br><span>index 0000000..2832d0f</span><br><span>--- /dev/null</span><br><span>+++ b/doc/handover-inter-bsc-mo-fsm.dot</span><br><span>@@ -0,0 +1,26 @@</span><br><span style="color: hsl(120, 100%, 40%);">+digraph G {</span><br><span style="color: hsl(120, 100%, 40%);">+rankdir=TB;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        invisible [style=invisible]</span><br><span style="color: hsl(120, 100%, 40%);">+   invisible -> mo [label="Measurement Report\nincluding neighbor\nBSS ARFCN",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+        mo [label="inter-BSC MO HO",shape=box];</span><br><span style="color: hsl(120, 100%, 40%);">+        msc [label="msc",shape=box3d];</span><br><span style="color: hsl(120, 100%, 40%);">+    new_bsc [label="new BSC",shape=box3d]</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan [label="lchan",shape=box3d]</span><br><span style="color: hsl(120, 100%, 40%);">+        term [label="terminate",shape=box];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  mo -> WAIT_HO_COMMAND [label="handover_start()"]</span><br><span style="color: hsl(120, 100%, 40%);">+ WAIT_HO_COMMAND -> msc [label="BSSMAP Handover\nRequired",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+  msc -> new_bsc [label="BSSMAP Handover\nRequest",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+   new_bsc -> msc [label="BSSMAP Handover\nRequest Ack",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+       msc -> WAIT_HO_COMMAND [label="BSSMAP Handover\nCommand",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ WAIT_HO_COMMAND -> lchan [label="RR Handover\nCommand\nfrom new BSC",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     WAIT_HO_COMMAND -> WAIT_CLEAR</span><br><span style="color: hsl(120, 100%, 40%);">+      msc -> WAIT_CLEAR [label="BSSMAP Clear Command",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  WAIT_CLEAR -> term</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/doc/handover-inter-bsc-mt-fsm.dot b/doc/handover-inter-bsc-mt-fsm.dot</span><br><span>new file mode 100644</span><br><span>index 0000000..82e101a</span><br><span>--- /dev/null</span><br><span>+++ b/doc/handover-inter-bsc-mt-fsm.dot</span><br><span>@@ -0,0 +1,42 @@</span><br><span style="color: hsl(120, 100%, 40%);">+digraph G {</span><br><span style="color: hsl(120, 100%, 40%);">+rankdir=TB;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        mt [label="inter-BSC MT HO",shape=box];</span><br><span style="color: hsl(120, 100%, 40%);">+        gscon [label="gscon FSM",shape=box3d];</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan [label="lchan FSM",shape=box3d];</span><br><span style="color: hsl(120, 100%, 40%);">+        msc [label="msc",shape=box3d];</span><br><span style="color: hsl(120, 100%, 40%);">+   old_bsc [label="old BSC",shape=box3d]</span><br><span style="color: hsl(120, 100%, 40%);">+       old_lchan [label="old lchan",shape=box3d]</span><br><span style="color: hsl(120, 100%, 40%);">+        term [label="terminate",shape=box];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  invisible [style="invisible"]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     mt -> old_bsc [style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+       old_bsc -> msc [label="BSSMAP Handover Required",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ invisible -> old_lchan [style=invisible,arrowhead=none]</span><br><span style="color: hsl(120, 100%, 40%);">+    msc -> gscon [label="BSSMAP Handover\nRequest",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+     gscon -> WAIT_LCHAN_ACTIVE [label="handover_start()",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_LCHAN_ACTIVE -> lchan [label="lchan_activate()\nFOR_HANDOVER",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan -> WAIT_LCHAN_ACTIVE [label="HO_EV_\nLCHAN_\nACTIVE,ERROR",style=dashed,constraint=false]</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_LCHAN_ACTIVE -> WAIT_RR_HO_DETECT</span><br><span style="color: hsl(120, 100%, 40%);">+       </span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_RR_HO_DETECT -> msc [label="BSSMAP\nHandover\nAccept\nwith\nRR Handover\nCommand",style=dashed,constraint=false]</span><br><span style="color: hsl(120, 100%, 40%);">+        msc -> old_bsc -> old_lchan [label="RR Handover\nCommand",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan -> WAIT_RR_HO_DETECT [label="RR Handover\nDetect",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+    WAIT_RR_HO_DETECT -> WAIT_RR_HO_COMPLETE</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan -> WAIT_RR_HO_COMPLETE [label="RR Handover\nComplete",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_RR_HO_COMPLETE -> WAIT_LCHAN_ESTABLISHED</span><br><span style="color: hsl(120, 100%, 40%);">+      lchan -> WAIT_LCHAN_ESTABLISHED [label="HO_EV_LCHAN_\nESTABLISHED",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       WAIT_LCHAN_ESTABLISHED -> term [label="non-TCH"]</span><br><span style="color: hsl(120, 100%, 40%);">+ WAIT_LCHAN_ESTABLISHED -> WAIT_MGW_ENDPOINT_TO_MSC</span><br><span style="color: hsl(120, 100%, 40%);">+ WAIT_MGW_ENDPOINT_TO_MSC -> term [label="handover_end()",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+   term -> msc [label="BSSMAP Handover\nComplete\n/ Failure",style=dashed,constraint=false]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       err [label="on error",shape=box,style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+       err -> term</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/doc/handover-inter-bsc-mt.msc b/doc/handover-inter-bsc-mt.msc</span><br><span>index 88a52da..52873c1 100644</span><br><span>--- a/doc/handover-inter-bsc-mt.msc</span><br><span>+++ b/doc/handover-inter-bsc-mt.msc</span><br><span>@@ -13,7 +13,7 @@</span><br><span>     bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_TS_READY"];</span><br><span>         ...;</span><br><span>         --- [label="on no lchan, lchan FSM error or timeout"];</span><br><span style="color: hsl(0, 100%, 40%);">-        bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ALLOC_ERROR"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ERROR"];</span><br><span>  bsc_gscon box bsc_gscon [label="handover_end(fail)"];</span><br><span>      bsc_gscon => mgw_msc [label="BSSMAP Handover Failure"];</span><br><span>         ms note bsc_gscon [label="MS happily continues on the old lchan."];</span><br><span>@@ -39,7 +39,7 @@</span><br><span>    bsc_gscon -> bsc_lchan [label="LCHAN_EV_MGW_ENDPOINT_ERROR"];</span><br><span>   bsc_lchan note bsc_gscon [label="conn FSM error handler exits and relies on the lchan FSM</span><br><span>               signalling error, which should actually happen immediately:"];</span><br><span style="color: hsl(0, 100%, 40%);">-     bsc_gscon <- bsc_lchan [label="GSCON_EV_LCHAN_ALLOC_ERROR"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bsc_gscon <- bsc_lchan [label="GSCON_EV_LCHAN_ERROR"];</span><br><span>  bsc_gscon -> bsc_mgcp [label="mgcp_conn_delete()"];</span><br><span>     bsc_gscon box bsc_gscon [label="handover_end(fail)"];</span><br><span>      bsc_gscon => mgw_msc [label="BSSMAP Handover Failure"];</span><br><span>diff --git a/doc/handover-intra-bsc-fsm.dot b/doc/handover-intra-bsc-fsm.dot</span><br><span>new file mode 100644</span><br><span>index 0000000..4eb2561</span><br><span>--- /dev/null</span><br><span>+++ b/doc/handover-intra-bsc-fsm.dot</span><br><span>@@ -0,0 +1,27 @@</span><br><span style="color: hsl(120, 100%, 40%);">+digraph G {</span><br><span style="color: hsl(120, 100%, 40%);">+rankdir=TB;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan [label="lchan FSM",shape=box3d];</span><br><span style="color: hsl(120, 100%, 40%);">+        intra [label="intra-BSC HO",shape=box];</span><br><span style="color: hsl(120, 100%, 40%);">+        old_lchan [label="old lchan",shape=box3d];</span><br><span style="color: hsl(120, 100%, 40%);">+        term [label="terminate",shape=box];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ invisible [style="invisible"]</span><br><span style="color: hsl(120, 100%, 40%);">+       invisible -> intra [style=invisible,arrowhead=none]</span><br><span style="color: hsl(120, 100%, 40%);">+        invisible -> old_lchan [style=invisible,arrowhead=none]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  intra -> WAIT_LCHAN_ACTIVE [label="handover_start()",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_LCHAN_ACTIVE -> lchan [label="lchan_activate(FOR_HANDOVER)",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan -> WAIT_LCHAN_ACTIVE [label="HO_EV_\nLCHAN_\nACTIVE,ERROR",style=dashed,constraint=false]</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_LCHAN_ACTIVE -> WAIT_RR_HO_DETECT</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_RR_HO_DETECT -> old_lchan [label="RR Handover\nCommand",style=dashed,constraint=false]</span><br><span style="color: hsl(120, 100%, 40%);">+     </span><br><span style="color: hsl(120, 100%, 40%);">+      lchan -> WAIT_RR_HO_DETECT [label="RR Handover\nDetect",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+    WAIT_RR_HO_DETECT -> WAIT_RR_HO_COMPLETE</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan -> WAIT_RR_HO_COMPLETE [label="RR Handover\nComplete",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_RR_HO_COMPLETE -> WAIT_LCHAN_ESTABLISHED</span><br><span style="color: hsl(120, 100%, 40%);">+      lchan -> WAIT_LCHAN_ESTABLISHED [label="HO_EV_LCHAN_\nESTABLISHED",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       WAIT_LCHAN_ESTABLISHED -> term [label="handover_end()",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/doc/handover.msc b/doc/handover.msc</span><br><span>index 7529de6..b4307a8 100644</span><br><span>--- a/doc/handover.msc</span><br><span>+++ b/doc/handover.msc</span><br><span>@@ -13,7 +13,7 @@</span><br><span>        bsc_lchan <- bsc_gscon [label="lchan_activate(lchan, FOR_HANDOVER)"];</span><br><span>   ...;</span><br><span>         --- [label="on lchan FSM error or timeout"];</span><br><span style="color: hsl(0, 100%, 40%);">-  bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ALLOC_ERROR"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ERROR"];</span><br><span>  bsc_gscon box bsc_gscon [label="handover_end(fail)"];</span><br><span>      ms note bsc_gscon [label="MS happily continues on the old lchan."];</span><br><span>        bsc_gscon abox bsc_gscon [label="ST_ACTIVE"];</span><br><span>@@ -43,7 +43,7 @@</span><br><span>  bsc_gscon -> bsc_lchan [label="LCHAN_EV_MGW_ENDPOINT_ERROR"];</span><br><span>   bsc_lchan note bsc_gscon [label="conn FSM error handler exits and relies on the lchan FSM</span><br><span>               signalling error, which should actually happen immediately:"];</span><br><span style="color: hsl(0, 100%, 40%);">-     bsc_gscon <- bsc_lchan [label="GSCON_EV_LCHAN_ALLOC_ERROR"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bsc_gscon <- bsc_lchan [label="GSCON_EV_LCHAN_ERROR"];</span><br><span>  bsc_gscon box bsc_gscon [label="handover_end(fail)"];</span><br><span>      --- [label="IF handover_created_mgw_endpoint == true"];</span><br><span>    bsc_gscon -> bsc_mgcp [label="mgcp_conn_delete()"];</span><br><span>diff --git a/doc/lchan-fsm.dot b/doc/lchan-fsm.dot</span><br><span>index dbb283c..b8e348e 100644</span><br><span>--- a/doc/lchan-fsm.dot</span><br><span>+++ b/doc/lchan-fsm.dot</span><br><span>@@ -4,10 +4,11 @@</span><br><span>        invisible [style="invisible"]</span><br><span>      UNUSED [penwidth=3.0]</span><br><span>        WAIT_TS_READY</span><br><span style="color: hsl(0, 100%, 40%);">-   WAIT_MGW_ENDPOINT_AVAILABLE</span><br><span>  WAIT_ACTIV_ACK</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_MGW_ENDPOINT_AVAILABLE</span><br><span>  WAIT_IPACC_CRCX_ACK</span><br><span>  WAIT_IPACC_MDCX_ACK</span><br><span style="color: hsl(120, 100%, 40%);">+   WAIT_MGW_ENDPOINT_CONFIGURED</span><br><span>         WAIT_RLL_ESTABLISH</span><br><span>   ACTIVE [penwidth=3.0]</span><br><span>        WAIT_SAPIS_RELEASED</span><br><span>@@ -17,16 +18,17 @@</span><br><span>    BORKEN</span><br><span>       </span><br><span>     ts [label="timeslot FSM",shape=box3d];</span><br><span style="color: hsl(0, 100%, 40%);">-        gscon [label="conn FSM",shape=box3d];</span><br><span style="color: hsl(120, 100%, 40%);">+       mgwep [label="mgw endpoint\nFSM",shape=box3d];</span><br><span> </span><br><span>         UNUSED -> WAIT_TS_READY [label="lchan_allocate()"]</span><br><span>      WAIT_TS_READY -> WAIT_ACTIV_ACK</span><br><span>   WAIT_ACTIV_ACK -> WAIT_RLL_ESTABLISH</span><br><span>      WAIT_RLL_ESTABLISH -> WAIT_MGW_ENDPOINT_AVAILABLE [label="TCH"]</span><br><span>         WAIT_MGW_ENDPOINT_AVAILABLE -> WAIT_IPACC_CRCX_ACK [label="IPACC BTS"]</span><br><span style="color: hsl(0, 100%, 40%);">-     WAIT_MGW_ENDPOINT_AVAILABLE -> ACTIVE</span><br><span style="color: hsl(120, 100%, 40%);">+      WAIT_MGW_ENDPOINT_AVAILABLE -> WAIT_MGW_ENDPOINT_CONFIGURED</span><br><span>       WAIT_IPACC_CRCX_ACK -> WAIT_IPACC_MDCX_ACK</span><br><span style="color: hsl(0, 100%, 40%);">-   WAIT_IPACC_MDCX_ACK -> ACTIVE</span><br><span style="color: hsl(120, 100%, 40%);">+      WAIT_IPACC_MDCX_ACK -> WAIT_MGW_ENDPOINT_CONFIGURED</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_MGW_ENDPOINT_CONFIGURED -> ACTIVE</span><br><span>    WAIT_RLL_ESTABLISH -> ACTIVE [label="non-TCH"];</span><br><span>         WAIT_RLL_ESTABLISH -> WAIT_RF_RELEASE_ACK [label="timeout",style=dashed,constraint=false]</span><br><span> </span><br><span>@@ -45,9 +47,9 @@</span><br><span> </span><br><span>   WAIT_TS_READY -> UNUSED [label="error/timeout",style=dashed,constraint=false]</span><br><span>   {WAIT_ACTIV_ACK,WAIT_RF_RELEASE_ACK} -> BORKEN [label="error/timeout",style=dashed]</span><br><span style="color: hsl(0, 100%, 40%);">-        {WAIT_MGW_ENDPOINT_AVAILABLE,WAIT_IPACC_CRCX_ACK,WAIT_IPACC_MDCX_ACK} -> WAIT_SAPIS_RELEASED [label=error,style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+    {WAIT_MGW_ENDPOINT_AVAILABLE,WAIT_IPACC_CRCX_ACK,WAIT_IPACC_MDCX_ACK,WAIT_MGW_ENDPOINT_CONFIGURED} -> WAIT_SAPIS_RELEASED [label=error,style=dashed]</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     WAIT_TS_READY -> gscon [label="GSCON_EV_\nENSURE_\nMGW_ENDPOINT",style=dotted]</span><br><span style="color: hsl(0, 100%, 40%);">-     gscon -> WAIT_MGW_ENDPOINT_AVAILABLE [label="LCHAN_EV_\nMGW_ENDPOINT_\n{AVAILABLE,ERROR}",style=dotted]</span><br><span style="color: hsl(120, 100%, 40%);">+  WAIT_TS_READY -> mgwep [label="CRCX",style=dotted]</span><br><span style="color: hsl(120, 100%, 40%);">+       mgwep -> WAIT_MGW_ENDPOINT_AVAILABLE [label="LCHAN_EV_\nMGW_ENDPOINT_\n{AVAILABLE,ERROR}",style=dotted]</span><br><span> </span><br><span> }</span><br><span>diff --git a/doc/lchan.msc b/doc/lchan.msc</span><br><span>index 9b7d663..42f2fb0 100644</span><br><span>--- a/doc/lchan.msc</span><br><span>+++ b/doc/lchan.msc</span><br><span>@@ -72,7 +72,7 @@</span><br><span>   bsc_gscon note bsc_gscon [label="conn FSM should fire on CRCX timeout"];</span><br><span>   bsc_lchan <- bsc_gscon [label="LCHAN_EV_MGW_ENDPOINT_ERROR"];</span><br><span>   bsc_gscon note bsc_gscon [label="conn FSM should not assume anything and wait for</span><br><span style="color: hsl(0, 100%, 40%);">-          GSCON_EV_LCHAN_ALLOC_ERROR"];</span><br><span style="color: hsl(120, 100%, 40%);">+            GSCON_EV_LCHAN_ERROR"];</span><br><span>         bsc_lchan rbox bsc_lchan [label="Do 'On any error'"];</span><br><span>      bsc_lchan abox bsc_lchan [label="LCHAN_ST_UNUSED"];</span><br><span>        bsc_ts <- bsc_lchan [label="TS_EV_LCHAN_UNUSED"];</span><br><span>@@ -142,7 +142,7 @@</span><br><span>         bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nRLL_ESTABLISH\nT3101"];</span><br><span>   ...;</span><br><span>         --- [label="on timeout"];</span><br><span style="color: hsl(0, 100%, 40%);">-     bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ALLOC_ERROR"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ERROR"];</span><br><span>  bsc_lchan -> bsc_lchan [label="lchan_fsm_pre_rf_release()"];</span><br><span>    ---;</span><br><span>         ...;</span><br><span>@@ -166,7 +166,7 @@</span><br><span>   bts <= bsc_lchan [label="IPACC CRCX"];</span><br><span>  ...;</span><br><span>         --- [label="on timeout"];</span><br><span style="color: hsl(0, 100%, 40%);">-     bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ALLOC_ERROR"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ERROR"];</span><br><span>  bsc_lchan -> bsc_lchan [label="lchan_graceful_release()"];</span><br><span>      ---;</span><br><span>         ...;</span><br><span>@@ -182,7 +182,7 @@</span><br><span>           this; SCCPlite: the RTP port is already known from the timeslot+multiplex information."];</span><br><span>       ...;</span><br><span>         --- [label="on timeout"];</span><br><span style="color: hsl(0, 100%, 40%);">-     bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ALLOC_ERROR"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ERROR"];</span><br><span>  bsc_lchan -> bsc_lchan [label="lchan_graceful_release()"];</span><br><span>      ---;</span><br><span>         ...;</span><br><span>@@ -288,7 +288,7 @@</span><br><span>   bts <= bsc_lchan [label="RR Immediate Assign Reject"];</span><br><span>  |||;</span><br><span>         --- [label="IF FOR_ASSIGNMENT or FOR_HANDOVER"];</span><br><span style="color: hsl(0, 100%, 40%);">-      bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ALLOC_ERROR"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ERROR"];</span><br><span>  bsc_gscon note bsc_gscon [label="conn FSM shall immediately 'forget' the lchan"];</span><br><span>  bsc_gscon => mgw_msc [label="BSSMAP\nAssignment Failure",ID=FOR_ASSIGNMENT];</span><br><span>    bsc_gscon => mgw_msc [label="BSSMAP\nHandover Failure",ID="inter-BSC-MT HO"];</span><br><span>diff --git a/doc/mgw-endpoint-fsm.dot b/doc/mgw-endpoint-fsm.dot</span><br><span>new file mode 100644</span><br><span>index 0000000..8ad2e4a</span><br><span>--- /dev/null</span><br><span>+++ b/doc/mgw-endpoint-fsm.dot</span><br><span>@@ -0,0 +1,22 @@</span><br><span style="color: hsl(120, 100%, 40%);">+digraph G {</span><br><span style="color: hsl(120, 100%, 40%);">+rankdir=TB;</span><br><span style="color: hsl(120, 100%, 40%);">+ UNUSED</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_MGW_RESPONSE</span><br><span style="color: hsl(120, 100%, 40%);">+     IN_USE</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_DLCX_ALL</span><br><span style="color: hsl(120, 100%, 40%);">+ terminate [shape=box]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       other [label="other FSM",shape=box3d]</span><br><span style="color: hsl(120, 100%, 40%);">+       other -> UNUSED [label="mgw_{crcx,mdcx}_{bts,msc}()",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     UNUSED -> WAIT_MGW_RESPONSE</span><br><span style="color: hsl(120, 100%, 40%);">+        WAIT_MGW_RESPONSE -> IN_USE</span><br><span style="color: hsl(120, 100%, 40%);">+        IN_USE -> {WAIT_MGW_RESPONSE,WAIT_DLCX_ALL}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      other2 [label="other FSM",shape=box3d]</span><br><span style="color: hsl(120, 100%, 40%);">+      other2 -> IN_USE [label="mgw_{crcx,mdcx,dlcx}_{bts,msc}()",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+ WAIT_DLCX_ALL -> terminate</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       IN_USE -> other2 [label="OTHER_EV_*",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+       IN_USE -> UNUSED [label="last DLCX"]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/doc/ms-channel-request.msc b/doc/ms-channel-request.msc</span><br><span>index 1c5b4bf..4b7de78 100644</span><br><span>--- a/doc/ms-channel-request.msc</span><br><span>+++ b/doc/ms-channel-request.msc</span><br><span>@@ -27,7 +27,7 @@</span><br><span> </span><br><span>    bsc box bsc [label="Store RACH data in lchan->rqd_ref, rqd_ta"];</span><br><span>        bsc -> bsc_lchan [label="lchan_allocate(FOR_MS_CHANNEL_REQUEST)"];</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_ACTIV_ACK\nT3103"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_ACTIV_ACK\nT3101"];</span><br><span>         bsc_lchan note bsc_lchan [label="The lchan FSM knows that FOR_MS_CHANNEL_REQUEST is about</span><br><span>               Immediate Assignment."];</span><br><span>        bts <= bsc_lchan [label="RSL Chan Activ (Immediate Assignment)"];</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9667">change 9667</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/9667"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I29e31b753e23a4207662e0e385a337e7df836f45 </div>
<div style="display:none"> Gerrit-Change-Number: 9667 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>