aboutsummaryrefslogtreecommitdiffstats
path: root/doc/sequence_charts
diff options
context:
space:
mode:
Diffstat (limited to 'doc/sequence_charts')
-rw-r--r--doc/sequence_charts/Makefile.am20
-rw-r--r--doc/sequence_charts/inter_bsc_ho.msc36
-rw-r--r--doc/sequence_charts/inter_msc_ho.msc82
-rw-r--r--doc/sequence_charts/mncc_fsm.msc84
4 files changed, 222 insertions, 0 deletions
diff --git a/doc/sequence_charts/Makefile.am b/doc/sequence_charts/Makefile.am
new file mode 100644
index 000000000..75e250a5f
--- /dev/null
+++ b/doc/sequence_charts/Makefile.am
@@ -0,0 +1,20 @@
+all: msc dot
+
+msc: \
+ $(builddir)/mncc_fsm.png \
+ $(builddir)/inter_bsc_ho.png \
+ $(builddir)/inter_msc_ho.png \
+ $(NULL)
+
+dot: \
+ $(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/sequence_charts/inter_bsc_ho.msc b/doc/sequence_charts/inter_bsc_ho.msc
new file mode 100644
index 000000000..2bc1276ef
--- /dev/null
+++ b/doc/sequence_charts/inter_bsc_ho.msc
@@ -0,0 +1,36 @@
+msc {
+ hscale=2;
+ bsca [label="BSC-A"], i[label="MSC-I"], a[label="MSC-A"], t[label="MSC-T"], bscb[label="BSC-B"];
+
+ i note t [label="'MSC-A,I,T' are explained in 3GPP TS 49.008 '4.3 Roles of MSC-A, MSC-I and MSC-T'"];
+ i note i [label="I = Internal; the MSC that does BSSMAP to the BSC (may change to a remote MSC-B after HO)"];
+ a note a [label="A = first; the MSC that has MM control BSSMAP to the BSC (never changes)"];
+ t note t [label="T = transitory; the MSC that a handover is going towards (may be MSC-A for inter-BSC HO, may be a remote MSC-B)"];
+
+ bsca => i [label="BSSMAP Handover Required"];
+ i -> a [label="BSSMAP Handover Required"];
+
+ a -> t [label="MAP Prepare Handover"];
+ t => bscb [label="BSSMAP Handover Request"];
+ t <= bscb [label="BSSMAP Handover Request ACK"];
+ a <- t [label="MAP Prepare Handover Response"];
+ i <- a [label="MAP Prepare Handover Response"];
+ bsca <= i [label="BSSMAP Handover Command"];
+
+ --- [label="MS sends RACH to new cell"];
+
+ t <= bscb [label="BSSMAP Handover Detected"];
+ a <- t [label="MAP Access Signaling Request"];
+
+ t <= bscb [label="BSSMAP Handover Complete"];
+ a <- t [label="MAP Send End Signal"];
+
+
+ a abox a [label="MSC-A accepts the new BSC"];
+ i note t [label="previous MSC-I gets dropped, MSC-T becomes the new MSC-I"];
+ i abox i [label="discard"];
+ t abox t [label="MSC-I"];
+
+ bsca <= i [label="BSSMAP Clear Command"];
+
+}
diff --git a/doc/sequence_charts/inter_msc_ho.msc b/doc/sequence_charts/inter_msc_ho.msc
new file mode 100644
index 000000000..f7572d1b5
--- /dev/null
+++ b/doc/sequence_charts/inter_msc_ho.msc
@@ -0,0 +1,82 @@
+msc {
+ hscale=2;
+ bsca [label="BSC-A"], ai[label="MSC-I (at MSC-A)"], a[label="MSC-A"], bt[label="MSC-T (at MSC-B)"], bi[label="MSC-I (at MSC-B)"], bscb[label="BSC-B"],
+ ct[label="MSC-T (at MSC-C)"], bscc[label="BSC-C"];
+
+ ai note bt [label="'MSC-A,I,T' are explained in 3GPP TS 49.008 '4.3 Roles of MSC-A, MSC-I and MSC-T'"];
+ ai note ai [label="I = Internal; the MSC that does BSSMAP to the BSC (may change to a remote MSC-B after HO)"];
+ a note a [label="A = first; the MSC that has MM control (never changes)"];
+ bt note bi [label="B = second; the MSC that acts as BSS relay for MSC-A"];
+ bt note bt [label="T = transitory; the MSC that a handover is going towards (may be MSC-A for inter-BSC HO, may be a remote MSC-B)"];
+
+ bsca => ai [label="BSSMAP Handover Required"];
+ ai -> a [label="BSSMAP Handover Required"];
+
+ a rbox a [label="MSC-A routes all MSC-T messages to remote MSC-B."];
+
+ a => bt [label="MAP Prepare Handover"];
+ a note bt [label="in Osmocom, MAP messages are actually sent as GSUP, to the HLR"];
+
+ bt rbox bt [label="MSC-B routes all MSC-A type messages back to MSC-A."];
+ bt rbox bt [label="MSC-B generates a Handover MSISDN"];
+
+ bt => bscb [label="BSSMAP Handover Request"];
+ bt <= bscb [label="BSSMAP Handover Request ACK"];
+ a <= bt [label="MAP Prepare Handover Response"];
+
+ a => bt [label="establish SIP call to Handover MSISDN via external MNCC"];
+
+ ai <- a [label="BSSMAP Handover Command"];
+ bsca <= ai [label="BSSMAP Handover Command"];
+
+ --- [label="MS sends RACH to new cell"];
+
+ bt <= bscb [label="BSSMAP Handover Detected"];
+ a <= bt [label="MAP Access Signaling Request"];
+
+ bt <= bscb [label="BSSMAP Handover Complete"];
+ a <= bt [label="MAP Send End Signal"];
+ bt rbox bt [label="MSC-B drops the generated Handover MSISDN"];
+
+ a abox a [label="MSC-A accepts the new MSC-B and BSC"];
+ ai note bt [label="previous MSC-I (A) gets dropped, MSC-T (B) becomes the new MSC-I"];
+ ai rbox a [label="MSC-A performs all MSC-I tasks via MAP at remote MSC-B's MSC-I."];
+ bt abox bi [label="MSC-I"];
+ ai abox ai [label="discard"];
+ bsca <= ai [label="BSSMAP Clear Command"];
+
+ ...;
+ ...;
+
+ --- [label="Another inter-MSC handover"];
+ a note bi [label="MSC-A remains in charge"];
+
+ bscb => bi [label="BSSMAP Handover Required"];
+ bi => a [label="BSSMAP Handover Required"];
+
+ a rbox a [label="MSC-A routes all MSC-T messages to remote MSC-C."];
+
+ a => ct [label="MAP Prepare Handover"];
+ ct rbox ct [label="MSC-C routes all MSC-A type messages back to MSC-A."];
+ ct => bscc [label="BSSMAP Handover Request"];
+ ct <= bscc [label="BSSMAP Handover Request ACK"];
+ a <= ct [label="MAP Prepare Handover Response"];
+ a => bi [label="MAP Prepare Handover Response"];
+ bscb <= bi [label="BSSMAP Handover Command"];
+
+ --- [label="MS sends RACH to new cell"];
+
+ ct <= bscc [label="BSSMAP Handover Detected"];
+ a <= ct [label="MAP Access Signaling Request"];
+
+ ct <= bscc [label="BSSMAP Handover Complete"];
+ a <= ct [label="MAP Send End Signal"];
+
+ a abox a [label="MSC-A accepts the new MSC-C and BSC"];
+ bi note ct [label="previous MSC-I (B) gets dropped, MSC-T (B) becomes the new MSC-I"];
+ ai rbox a [label="MSC-A performs all MSC-I tasks via MAP at remote MSC-C's MSC-I."];
+ ct abox ct [label="MSC-I"];
+ bi abox bi [label="discard"];
+ bscb <= bi [label="BSSMAP Clear Command"];
+
+}
diff --git a/doc/sequence_charts/mncc_fsm.msc b/doc/sequence_charts/mncc_fsm.msc
new file mode 100644
index 000000000..ae5e0a211
--- /dev/null
+++ b/doc/sequence_charts/mncc_fsm.msc
@@ -0,0 +1,84 @@
+msc {
+ hscale=2;
+ msc1[label="osmo-msc"], mncc1[label="MNCC FSM"], pbx[label="MNCC server (osmo-sip-connector)"], mncc2[label="MNCC FSM"], msc2[label="osmo-msc"];
+
+ mncc1 note mncc1 [label="The typical progression of an outgoing call, i.e. a call initiated by osmo-msc, as
+ implemented in mncc_fsm.h, mncc_fsm.c"];
+ mncc2 note mncc2 [label="The typical progression of an incoming call, i.e. a call initiated by the PBX, as
+ implemented in mncc_fsm.h, mncc_fsm.c"];
+
+ mncc1 abox mncc1 [label="MNCC_ST_NOT_STARTED"];
+ msc1 rbox msc1 [label="mncc_outgoing_start()"];
+ msc1 -> mncc1 [label="MNCC_EV_OUTGOING_START"];
+
+ mncc1 abox mncc1 [label="MNCC_ST_OUTGOING_WAIT_PROCEEDING"];
+ mncc1 => pbx [label="MNCC_SETUP_IND
+ \n callref, IMSI, called and calling number"];
+ mncc1 <= pbx [label="MNCC_RTP_CREATE
+ \n callref"];
+ mncc1 rbox mncc1 [label="mncc_rx_rtp_create()"];
+ mncc1 => pbx [label="MNCC_RTP_CREATE
+ \n callref, RTP IP address and port"];
+ mncc1 <= pbx [label="MNCC_CALL_PROC_REQ
+ \n callref, RTP IP address and port"];
+ mncc1 abox mncc1 [label="MNCC_ST_OUTGOING_WAIT_COMPLETE"];
+
+ msc2 <= pbx [label="MNCC_SETUP_REQ
+ \n callref, called and calling number"];
+ mncc2 abox mncc2 [label="MNCC_ST_NOT_STARTED"];
+ msc2 rbox msc2 [label="mncc_incoming_start()"];
+ msc2 -> mncc2 [label="MNCC_EV_INCOMING_START"];
+ mncc2 abox mncc2 [label="MNCC_ST_INCOMING_WAIT_COMPLETE"];
+ mncc2 => pbx [label="MNCC_CALL_CONF_IND
+ \n callref, bearer capabilities, cccap and IMSI"];
+ mncc2 <= pbx [label="MNCC_RTP_CREATE
+ \n callref"];
+ mncc2 rbox mncc2 [label="mncc_rx_rtp_create()"];
+ mncc2 => pbx [label="MNCC_RTP_CREATE
+ \n callref, RTP IP address and port"];
+ mncc2 => pbx [label="MNCC_ALERT_IND
+ \n callref"];
+
+ mncc1 <= pbx [label="MNCC_ALERT_REQ
+ \n callref and progress"];
+
+ mncc2 => pbx [label="MNCC_SETUP_CNF
+ \n callref, imsi and connected number"];
+ mncc2 <= pbx [label="MNCC_RTP_CONNECT
+ \n callref, RTP IP and port"];
+ mncc2 rbox mncc2 [label="mncc_rx_rtp_connect()"];
+ mncc2 <= pbx [label="MNCC_SETUP_COMPL_REQ
+ \n callref"];
+ mncc2 abox mncc2 [label="MNCC_ST_TALKING"];
+
+ mncc1 <= pbx [label="MNCC_RTP_CONNECT
+ \n callref, RTP IP and port"];
+ mncc1 rbox mncc1 [label="mncc_rx_rtp_connect()"];
+ msc1 <- mncc1 [label="rtp_stream_set_remote_addr()"];
+ mncc1 <= pbx [label="MNCC_SETUP_RSP
+ \n callref"];
+ mncc1 => pbx [label="MNCC_SETUP_COMPL_IND
+ \n callref"];
+ mncc1 abox mncc1 [label="MNCC_ST_TALKING"];
+
+ ...;
+ ... [label="Call goes on for a while..."];
+ ...;
+
+ mncc1 rbox mncc1 [label="mncc_release()"];
+ mncc1 => pbx [label="MNCC_DISC_IND
+ \n callref and cause"];
+ mncc1 abox mncc1 [label="MNCC_ST_WAIT_RELEASE_ACK"];
+ mncc1 <= pbx [label="MNCC_REL_REQ
+ \n callref and cause"];
+
+ mncc2 <= pbx [label="MNCC_DISC_REQ
+ \n callref and cause"];
+ mncc2 => pbx [label="MNCC_REL_IND
+ \n callref and cause"];
+ mncc2 abox mncc2 [label="terminated"];
+
+ mncc1 => pbx [label="MNCC_REL_CNF
+ \n callref"];
+ mncc1 abox mncc1 [label="terminated"];
+}