diff options
Diffstat (limited to 'doc')
-rw-r--r-- | doc/sequence_charts/Makefile.am | 20 | ||||
-rw-r--r-- | doc/sequence_charts/inter_bsc_ho.msc | 36 | ||||
-rw-r--r-- | doc/sequence_charts/inter_msc_ho.msc | 82 | ||||
-rw-r--r-- | doc/sequence_charts/mncc_fsm.msc | 84 |
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"]; +} |