diff options
Diffstat (limited to 'doc')
-rw-r--r-- | doc/examples/osmo-msc/osmo-msc.cfg | 19 | ||||
-rw-r--r-- | doc/examples/osmo-msc/osmo-msc_custom-sccp.cfg | 19 | ||||
-rw-r--r-- | doc/examples/osmo-msc/osmo-msc_multi-cs7.cfg | 19 | ||||
-rw-r--r-- | doc/manuals/chapters/running.adoc | 39 | ||||
-rw-r--r-- | doc/manuals/chapters/sgs.adoc | 55 | ||||
-rw-r--r-- | doc/manuals/osmomsc-usermanual.adoc | 8 | ||||
-rw-r--r-- | doc/sequence_charts/Makefile.am | 13 | ||||
-rwxr-xr-x | doc/sequence_charts/msc_log_to_ladder.py | 65 | ||||
-rw-r--r-- | doc/sequence_charts/voice_call_external_mncc.msc (renamed from doc/sequence_charts/voice_call_full.msc) | 109 | ||||
-rw-r--r-- | doc/sequence_charts/voice_call_internal_mncc.msc | 129 |
10 files changed, 369 insertions, 106 deletions
diff --git a/doc/examples/osmo-msc/osmo-msc.cfg b/doc/examples/osmo-msc/osmo-msc.cfg index 83b2c6fec..7c5fe2d55 100644 --- a/doc/examples/osmo-msc/osmo-msc.cfg +++ b/doc/examples/osmo-msc/osmo-msc.cfg @@ -1,21 +1,30 @@ ! ! OsmoMSC configuration saved from vty ! +log stderr + logging color 1 + logging print category-hex 0 + logging print category 1 + logging timestamp 0 + logging print file basename last + logging print level 1 + line vty no login ! network - network country code 1 - mobile network code 1 + network country code 001 + mobile network code 01 short name OsmoMSC long name OsmoMSC encryption a5 0 rrlp mode none mm info 1 + mgw 0 + remote-ip 127.0.0.1 + remote-port 2427 + local-port 2728 msc - mgw remote-ip 127.0.0.1 - mgw remote-port 2427 - mgw local-port 2728 assign-tmsi auth-tuple-max-reuse-count 3 auth-tuple-reuse-on-error 1 diff --git a/doc/examples/osmo-msc/osmo-msc_custom-sccp.cfg b/doc/examples/osmo-msc/osmo-msc_custom-sccp.cfg index d949ef9a0..503359899 100644 --- a/doc/examples/osmo-msc/osmo-msc_custom-sccp.cfg +++ b/doc/examples/osmo-msc/osmo-msc_custom-sccp.cfg @@ -1,6 +1,14 @@ ! ! OsmoMSC configuration saved from vty ! +log stderr + logging color 1 + logging print category-hex 0 + logging print category 1 + logging timestamp 0 + logging print file basename last + logging print level 1 + line vty no login ! @@ -12,16 +20,19 @@ network encryption a5 0 rrlp mode none mm info 1 + mgw 0 + remote-ip 127.0.0.1 + remote-port 2427 + local-port 2728 cs7 instance 0 point-code 0.23.1 asp asp-clnt-OsmoMSC-A-Iu 2905 0 m3ua ! where to reach the STP: remote-ip 127.0.0.5 -! local-ip 10.23.24.1 + !local-ip 10.23.24.1 + role asp + sctp-role client msc cs7-instance-a 0 cs7-instance-iu 0 - mgw remote-ip 127.0.0.1 - mgw remote-port 2427 - mgw local-port 2728 assign-tmsi diff --git a/doc/examples/osmo-msc/osmo-msc_multi-cs7.cfg b/doc/examples/osmo-msc/osmo-msc_multi-cs7.cfg index cb1157db3..22f8734de 100644 --- a/doc/examples/osmo-msc/osmo-msc_multi-cs7.cfg +++ b/doc/examples/osmo-msc/osmo-msc_multi-cs7.cfg @@ -1,6 +1,14 @@ ! ! OsmoMSC configuration saved from vty ! +log stderr + logging color 1 + logging print category-hex 0 + logging print category 1 + logging timestamp 0 + logging print file basename last + logging print level 1 + line vty no login ! @@ -12,18 +20,23 @@ network encryption a5 0 rrlp mode none mm info 1 + mgw 0 + remote-ip 127.0.0.1 + remote-port 2427 + local-port 2728 cs7 instance 0 point-code 0.23.1 asp asp-clnt-OsmoMSC-A 2905 0 m3ua remote-ip 127.0.0.5 + role asp + sctp-role client cs7 instance 1 point-code 0.23.2 asp asp-clnt-OsmoMSC-Iu 2905 0 m3ua remote-ip 127.0.0.6 + role asp + sctp-role client msc cs7-instance-a 0 cs7-instance-iu 1 - mgw remote-ip 127.0.0.1 - mgw remote-port 2427 - mgw local-port 2728 assign-tmsi diff --git a/doc/manuals/chapters/running.adoc b/doc/manuals/chapters/running.adoc index 86653954e..3041145dc 100644 --- a/doc/manuals/chapters/running.adoc +++ b/doc/manuals/chapters/running.adoc @@ -74,15 +74,8 @@ msc More on MNCC in <<mncc-external>>. -The SGs interface by default listens on 0.0.0.0:29118. Configure a different IP and/or port for each osmo-msc instance. -You may also want to configure different VLR names: - ----- -sgs - local-ip 127.0.0.1 - local-port 29118 - vlr-name vlr.example.net ----- +The SGs interface by default listens on 0.0.0.0:29118 (SCTP). Each instance of OsmoMSC must use a different IP address +and/or port. For details about the configuration of the SGs interface, see section <<sgs>>. For the following links, OsmoMSC acts as a client and does not listen/bind to a specific interface, and will hence not encounter conflicts for multiple instances @@ -107,6 +100,7 @@ cs7 instance 0 point-code 0.23.1 asp asp-clnt-OsmoMSC-A-Iu 2905 0 m3ua remote-ip 127.0.0.1 + role asp sctp-role client ---- @@ -118,9 +112,13 @@ Note that _A_ and _IuCS_ may use different SCCP instances, if so desired: cs7 instance 0 asp my-OsmoMSC-A 2905 0 m3ua remote-ip 10.23.42.1 + role asp + sctp-role client cs7 instance 1 asp my-OsmoMSC-Iu 2905 0 m3ua remote-ip 10.23.42.2 + role asp + sctp-role client msc cs7-instance-a 0 cs7-instance-iu 1 @@ -149,11 +147,26 @@ default port for MGCP (2427) on local host (127.0.0.1). Here is an example configuration for a remote MGW: ---- -msc - mgw remote-ip 10.9.8.7 - mgw remote-port 2427 - mgw reset-endpoint rtpbridge/* <1> +network + mgw 0 + remote-ip 10.9.8.7 + remote-port 2427 + reset-endpoint rtpbridge/* <1> ---- <1> The 'reset-endpoint' setting instructs the OsmoMGW to send a wildcarded DLCX to the media gateway. This helps to clear lingering calls from the media gateway when the OsmoMSC is restarted. + +OsmoMSC is also able to handle a pool of media gateways for load +distribution. See also <<mgw_pooling>>. + +[NOTE] +==== +Previous versions of OsmoMSC (1.9.0 and below) didn't have the 'mgw' VTY node and +hence didn't support the MGW pooling feature. Therefore, historically the MGW +related commands where placed under the `msc` VTY node. The MGW related commands +under the `msc` VTY are still parsed and used but its use is deprecated and +hence discouraged in favour of the new `mgw` node. Writing the config to a file +from within OsmoMSC will automatically convert the config to use the new `mgw` +node. +==== diff --git a/doc/manuals/chapters/sgs.adoc b/doc/manuals/chapters/sgs.adoc new file mode 100644 index 000000000..1f0240bed --- /dev/null +++ b/doc/manuals/chapters/sgs.adoc @@ -0,0 +1,55 @@ +[[sgs]] +== SGs interface + +OsmoMSC offers an SGs interface using the SGsAP protocol. The SGs interface is an +optional interface between a 2G (GERAN) / 3G (UTRAN) MSC and an 4G (EUTRAN) MME. +Its purpose is to facilitate both CSFB (Circuit-Switched Fall Back) and SMSoS +(SMS over SGs). It is used for Mobility management (MM) and paging procedures +between the EPS (Evolved Packet Services) and CS (Circuit Switched) domain. + +=== VTY configuration + +The SGs interface implementation in OsmoMSC is automatically active and requires +only minimal configuration. When no specific configuration is provided OsmoMSC +will listen on 0.0.0.0:29118 (SCTP) for incoming connections. + +This is sufficient in the most configurations, but in larger installations, +where services are either tied to specific interfaces and/or more instances of +OsmoMSC run in parallel, a custom configuration is necessary. + +The user has the option to configure the IP address (`local-ip`) and the SCTP +port (`local-port`) and also the `vlr-name` that OsmoMSC uses to identify itself +towards the MME. It should be noted that the `vlr-name` is usually the DNS name +for the IP address of the VLR/MSC, so IP address used and the `vlr-name` should +match the DNS server entry. + +---- +sgs + local-ip 127.0.0.1 + local-port 29118 + vlr-name vlr.example.net +---- + +In order to fine tune the behavior of the SGs interface the user also has +control over the relevant timers (`ts5`, `ts6-2`, `ts7`, `ts11`, `ts14`, `ts15`) +and counters (`ns7`, `ns11`). Each timer and counter has to be configured +separately. In the following example we change the value of ts and ns11. + +---- +sgs + timer ts7 23 + counter ns11 100 +---- + + +[NOTE] +==== +In case multiple instances of OsmoMSC run in parallel, it is advised to use a +different `vlr-name` for each instance. In any case it must be ensured that the +SGs interface of each instance is bound to a different IP address and/or port. +==== + +=== Connection monitoring + +The user can use the VTY command `show sgs-connections` to list the MMEs that +are currently connected to OsmoMSC. diff --git a/doc/manuals/osmomsc-usermanual.adoc b/doc/manuals/osmomsc-usermanual.adoc index 7ba45d40f..45be140f5 100644 --- a/doc/manuals/osmomsc-usermanual.adoc +++ b/doc/manuals/osmomsc-usermanual.adoc @@ -22,6 +22,10 @@ include::./common/chapters/vty.adoc[] include::./common/chapters/logging.adoc[] +include::./common/chapters/sigtran-osmocom.adoc[] + +include::./common/chapters/cs7-config.adoc[] + include::./common/chapters/cs7-config.adoc[] include::{srcdir}/chapters/net.adoc[] @@ -32,6 +36,10 @@ include::./common/chapters/mncc.adoc[] include::{srcdir}/chapters/osmux_msc.adoc[] +include::./common/chapters/mgwpool.adoc[] + +include::{srcdir}/chapters/sgs.adoc[] + include::./common/chapters/control_if.adoc[] include::./common/chapters/gsup.adoc[] diff --git a/doc/sequence_charts/Makefile.am b/doc/sequence_charts/Makefile.am index 5efe8558b..7a5277643 100644 --- a/doc/sequence_charts/Makefile.am +++ b/doc/sequence_charts/Makefile.am @@ -4,24 +4,19 @@ all: charts: msc dot EXTRA_DIST = \ - inter_bsc_ho.msc \ - inter_msc_ho.msc \ - mncc_call_fsm.msc \ - call_reestablishment.msc \ + $(srcdir)/*.msc \ $(NULL) CLEANFILES = \ - inter_bsc_ho.png \ - inter_msc_ho.png \ - mncc_call_fsm.png \ - voice_call_full.png \ + $(builddir)/*.png \ $(NULL) msc: \ $(builddir)/mncc_call_fsm.png \ $(builddir)/inter_bsc_ho.png \ $(builddir)/inter_msc_ho.png \ - $(builddir)/voice_call_full.png \ + $(builddir)/voice_call_external_mncc.png \ + $(builddir)/voice_call_internal_mncc.png \ $(builddir)/call_reestablishment.png \ $(NULL) diff --git a/doc/sequence_charts/msc_log_to_ladder.py b/doc/sequence_charts/msc_log_to_ladder.py index 30b6594db..9bfb9c9c2 100755 --- a/doc/sequence_charts/msc_log_to_ladder.py +++ b/doc/sequence_charts/msc_log_to_ladder.py @@ -53,7 +53,7 @@ UE = 'ms' #'ue' MS_UE_UNKNOWN = 'ms' #None MSC = 'msc' MGW = 'mgw' -SIP = 'sip' +MNCC = 'mncc' MO = 'mo' MT = 'mt' @@ -69,7 +69,7 @@ class OutputBase: self.start_with_re = re.compile(start_with_re) def head(self): - self.writeln('# Generated by msc_log_to_ladder.py') + self.writeln('# Generated by osmo-msc.git/doc/sequence_charts/msc_log_to_ladder.py') def tail(self): pass @@ -129,7 +129,7 @@ class OutputLadder(OutputBase): mo_mt = arrow.mo_mt or MO def prepend_mo_mt(name): - if name in ('.', SIP): + if name in ('.', MNCC): return name return '%s%s' % (mo_mt, name) @@ -222,7 +222,7 @@ class OutputMscgen(OutputBase): mo_mt = arrow.mo_mt or MO def prepend_mo_mt(name): - if name in ('.', SIP): + if name in ('.', MNCC): return name return '%s%s' % (mo_mt, name) @@ -371,6 +371,7 @@ class Parse: self.output = output self.linenr = 0 self.rules = [] + self.rules_hit = {} self.seen_udtrace_mncc = False self.callrefs_mo_mt = {} @@ -390,6 +391,7 @@ class Parse: re_str = docstr.splitlines()[0] self.rules.append(Rule(name=member, re_str=re_str, handler=func)) + self.rules_hit[member] = 0 @@ -403,7 +405,7 @@ class Parse: #('moue', 'UE,hNodeB (MO)'), ('momgw', 'MGW for MSC (MO)'), ('momsc', 'MSC (MO)'), - ('sip', 'MNCC to PBX via\nosmo-sip-connector'), + ('mncc', 'MNCC'), ('mtmsc', 'MSC (MT)'), ('mtmgw', 'MGW for MSC (MT)'), ('mtms', 'BSS,MS (MT)\\nhNodeB,UE (MT)'), @@ -448,6 +450,7 @@ class Parse: for rule in self.rules: if rule.match(line): + self.rules_hit[rule.name] = self.rules_hit.get(rule.name, 0) + 1 break RE_DTAP_NAME = re.compile('.*GSM48_MT_([^_]+)_(.+)') @@ -473,7 +476,8 @@ class Parse: dtap = '%s %s' % m.groups() if 'IMSI_DETACH_IND' in dtap: - # detecting IMSI Detach separately + # detecting IMSI Detach separately, because this log line does not contain the IMSI. + # By using the rule_imsi_detach(), we can accurately put it on the MO/MT side. return True if l3type == 'NONE' and not tx and dtap.endswith('PAG_RESP'): @@ -497,6 +501,7 @@ class Parse: imsi = m.group(1) e = MO_MT_UNKNOWN self.diagram.add_line(Arrow(e, MS_UE_UNKNOWN, '>', MSC, 'IMSI Detach', imsi=imsi)) + return True def rule_mgcp_tx(self, m): r'.*mgw-endp\([^)]*:([^:]+):([^:]+)\).* (rtpbridge[^ ]+) .* RTP_TO_(RAN|CN)( CI=([^:]+)|): ([^ :]+).*: Sending' @@ -512,19 +517,20 @@ class Parse: return True def rule_mgcp_rx(self, m): - r'.*mgw-endp\([^)]*:([^:]+):([^:]+)\).* (rtpbridge[^ ]+) .* RTP_TO_(RAN|CN)( CI=([^:]+)|).*: received successful response to ([^:]+): (.*)' - ran, l3type, endp, rtp_to, cond_ci, ci, verb, details = m.groups() + r'.*mgw-endp\(([^)]+):([^:)]+):([^:)]+)\).* (rtpbridge[^ ]+) .* RTP_TO_(RAN|CN)( CI=([^:]+)|).*: received successful response to ([^:]+): RTP=[^:]+:([0-9.:]+)' + subscr, ran_conn, l3type, endp, rtp_to, cond_ci, ci, verb, rtp = m.groups() e = mo_mt_from_l3type(l3type) endp = self.mask_value('EP', endp) ci = self.mask_value('CI', ci) ci_str = '' if ci: ci_str = ' %s' % ci - self.diagram.add_line(Arrow(e, MGW, '>', MSC, 'for %s: %s OK\\n%s%s' % (rtp_to, verb, endp, ci_str))) + rtp = self.mask_value('IP:port', rtp) + self.diagram.add_line(Arrow(e, MGW, '>', MSC, 'for %s: %s OK\\n%s%s %s' % (rtp_to, verb, endp, ci_str, rtp))) return True def rule_ran_tx(self, m): - r'.*msc_a\(([^)]*):([^:]+):([^:]+)\).* RAN encode: ([^: ]+): (.+)$' + r'.*msc_a\(([^)]+):([^:)]+):([^:)]+)\).* RAN encode: ([^: ]+): (.+)$' subscr, ran_conn, l3type, ran_type, msg_type = m.groups() @@ -538,8 +544,6 @@ class Parse: # skip 'RAB Assignment: rab_id=1, rtp=192.168.178.66:50008, use_x213_nsap=1' return True - if l3type == 'NONE': - return True e = mo_mt_from_l3type(l3type) @@ -555,7 +559,7 @@ class Parse: return True def rule_ran_rx(self, m): - r'.*msc_a\(([^)]*):([^:]+):([^:]+)\).* RAN decode: ([^: ]+) (.+)$' + r'.*msc_a\(([^)]+):([^:)]+):([^:)]+)\).* RAN decode: ([^: ]+) (.+)$' subscr, ran_conn, l3type, ran_type, msg_type = m.groups() @@ -563,8 +567,6 @@ class Parse: # will get DTAP details from rule_dtap() instead, not from BSSMAP logging return True - if l3type == 'NONE': - return True e = mo_mt_from_l3type(l3type) @@ -589,7 +591,7 @@ class Parse: self.diagram.add_line(Arrow(e, MSC, '<>', '.', 'CC state:\\n%s' % to_state)) return True - def rule_log_mncc(self, m): + def rule_log_mncc_no_rtp(self, m): r'.*trans\(CC[^) ]* [^ )]+:([^:)]+) callref-([^ ]+) [^)]+\) (tx|rx) (MNCC_[^ ]*)$' l3type, callref_hex, tx_rx, mncc_msg = m.groups() @@ -605,12 +607,34 @@ class Parse: except: e = MT - self.diagram.add_line(Arrow(e, MSC, '>' if tx else '<', 'sip', mncc_msg)) + self.diagram.add_line(Arrow(e, MSC, '>' if tx else '<', 'mncc', mncc_msg)) + return True + + def rule_log_mncc_with_rtp(self, m): + r'.*trans\(CC[^) ]* [^ )]+:([^:)]+) callref-([^ ]+) [^)]+\) (tx|rx) (MNCC_[^ ]*) \(RTP=([^){]+)(|{.*})\)$' + l3type, callref_hex, tx_rx, mncc_msg, rtp, codec = m.groups() + + if self.seen_udtrace_mncc: + # If no udtrace is present, take the MNCC logging. + # But if there is udtrace logging available, we should not duplicate those MNCC lines. + return True + + tx = (tx_rx == 'tx') + + try: + e = self.callrefs_mo_mt.get(callref_hex, MT) + except: + e = MT + + rtp = self.mask_value('IP:port', rtp) + self.diagram.add_line(Arrow(e, MSC, '>' if tx else '<', 'mncc', f'{mncc_msg}\\n{rtp}')) return True RE_MNCC_RTP = re.compile(' ip := ([^, ]+), rtp_port := ([0-9]+),') RE_MNCC_CALLREF = re.compile(' callref := ([^ ,]+), ') + # detecting MNCC with udtrace has the advantage that we also get an indication whether RTP information is + # present def rule_udtrace_mncc(self, m): r'.*(write|recv).* (Tx|Rx): \{ msg_type := ([^ ]+) .* u := \{ (.*) \} \}$' write_recv, tx_rx, msg_type, u = m.groups() @@ -650,7 +674,7 @@ class Parse: descr = '%s\\n%s' % (descr, rtp_info) break - self.diagram.add_line(Arrow(e, MSC, '>' if tx else '<', 'sip', descr)) + self.diagram.add_line(Arrow(e, MSC, '>' if tx else '<', 'mncc', descr)) return True def rule_cc_timer(self, m): @@ -680,6 +704,9 @@ def translate(inf, outf, cmdline): break; parse.add_line(line) parse.end() + if cmdline.verbose: + for name, count in parse.rules_hit.items(): + print(f" {name}: {count}") def open_output(inf, cmdline): if cmdline.output_file == '-': @@ -716,6 +743,8 @@ if __name__ == '__main__': ' present. This makes the output reproducible across various logs.') parser.add_argument('-s', '--start-with', dest='start_with_re', default=None, help='Skip until the first message with this label (regex), e.g. -s "CC SETUP"') + parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', + help='show some debug info, like which regex rules were hit and which were not.') cmdline = parser.parse_args() diff --git a/doc/sequence_charts/voice_call_full.msc b/doc/sequence_charts/voice_call_external_mncc.msc index 75fcef2ef..94cedee67 100644 --- a/doc/sequence_charts/voice_call_full.msc +++ b/doc/sequence_charts/voice_call_external_mncc.msc @@ -1,65 +1,68 @@ -# Generated by msc_log_to_ladder.py +# Generated by osmo-msc.git/doc/sequence_charts/msc_log_to_ladder.py msc { hscale="3"; -moms[label="MS,BSS (MO)\nUE,hNodeB (MO)"],momgw[label="MGW for MSC (MO)"],momsc[label="MSC (MO)"],sip[label="MNCC to PBX via\nosmo-sip-connector"],mtmsc[label="MSC (MT)"],mtmgw[label="MGW for MSC (MT)"],mtms[label="BSS,MS (MT)\nhNodeB,UE (MT)"]; +moms[label="MS,BSS (MO)\nUE,hNodeB (MO)"],momgw[label="MGW for MSC (MO)"],momsc[label="MSC (MO)"],mncc[label="MNCC"],mtmsc[label="MSC (MT)"],mtmgw[label="MGW for MSC (MT)"],mtms[label="BSS,MS (MT)\nhNodeB,UE (MT)"]; +moms =>> momsc [label="(BSSMAP) Complete Layer 3 Information"]; moms =>> momsc [label="MM CM_SERV_REQ"]; moms <<= momsc [label="MM AUTH_REQ"]; moms =>> momsc [label="MM AUTH_RESP"]; moms <<= momsc [label="(BSSMAP) CIPHER_MODE_COMMAND"]; moms =>> momsc [label="(BSSMAP) Ciphering Mode Complete"]; +moms <<= momsc [label="(BSSMAP) COMMON_ID"]; moms =>> momsc [label="RR CIPH_M_COMPL"]; moms =>> momsc [label="CC SETUP"]; momsc note momsc [label="CC starts guard timer (180s)"]; momsc abox momsc [label="CC state:\nINITIATED"]; -momsc =>> sip [label="MNCC_SETUP_IND"]; -momsc <<= sip [label="MNCC_RTP_CREATE"]; -momgw <<= momsc [label="for RAN: CRCX\nrtpbridge/*@msc"]; -momgw =>> momsc [label="for RAN: CRCX OK\nEP-1 CI-1"]; +momgw <<= momsc [label="for CN: CRCX\nrtpbridge/*@msc"]; +momgw =>> momsc [label="for CN: CRCX OK\nEP-1 CI-1 IP:port-1"]; +momsc =>> mncc [label="MNCC_SETUP_IND\nIP:port-1"]; +momgw <<= momsc [label="for RAN: CRCX\nEP-1"]; +momsc <<= mncc [label="MNCC_RTP_CREATE"]; +momgw =>> momsc [label="for RAN: CRCX OK\nEP-1 CI-2 IP:port-2"]; moms <<= momsc [label="(BSSMAP) ASSIGNMENT_COMMAND"]; moms =>> momsc [label="(BSSMAP) Assignment Complete"]; -momgw <<= momsc [label="for RAN: MDCX\nEP-1 CI-1"]; -momgw =>> momsc [label="for RAN: MDCX OK\nEP-1 CI-1"]; -momgw <<= momsc [label="for CN: CRCX\nEP-1"]; -momgw =>> momsc [label="for CN: CRCX OK\nEP-1 CI-2"]; -momsc =>> sip [label="MNCC_RTP_CREATE\nIP:port-1"]; -momsc <<= sip [label="MNCC_CALL_PROC_REQ"]; +momgw <<= momsc [label="for RAN: MDCX\nEP-1 CI-2"]; +momsc =>> mncc [label="MNCC_RTP_CREATE\nIP:port-1"]; +momsc <<= mncc [label="MNCC_CALL_PROC_REQ"]; momsc note momsc [label="CC stops guard timer"]; momsc note momsc [label="CC starts guard timer (180s)"]; momsc abox momsc [label="CC state:\nMO_CALL_PROC"]; moms <<= momsc [label="CC CALL_PROC"]; -mtmsc <<= sip [label="MNCC_SETUP_REQ"]; +mtmsc <<= mncc [label="MNCC_SETUP_REQ\nIP:port-1"]; mtms <<= mtmsc [label="Paging"]; +momgw =>> momsc [label="for RAN: MDCX OK\nEP-1 CI-2 IP:port-2"]; +mtms =>> mtmsc [label="(BSSMAP) Complete Layer 3 Information"]; mtms =>> mtmsc [label="RR PAG_RESP"]; mtms <<= mtmsc [label="MM AUTH_REQ"]; -mtms =>> mtmsc [label="MM NULL"]; mtms =>> mtmsc [label="MM AUTH_RESP"]; -mtms <<= mtmsc [label="(RANAP) SecurityModeCommand"]; -mtms =>> mtmsc [label="(RANAP) SecurityModeControl successfulOutcome"]; -mtms <<= mtmsc [label="(RANAP) CommonId"]; +mtms <<= mtmsc [label="(BSSMAP) CIPHER_MODE_COMMAND"]; +mtms =>> mtmsc [label="(BSSMAP) Ciphering Mode Complete"]; +mtms <<= mtmsc [label="(BSSMAP) COMMON_ID"]; mtmsc note mtmsc [label="CC starts timer T303 (30s)"]; mtmsc abox mtmsc [label="CC state:\nCALL_PRESENT"]; mtms <<= mtmsc [label="CC SETUP"]; +mtms =>> mtmsc [label="RR CIPH_M_COMPL"]; mtms =>> mtmsc [label="CC CALL_CONF"]; mtmsc note mtmsc [label="CC stops timer T303"]; mtmsc note mtmsc [label="CC starts timer T310 (30s)"]; +mtmgw <<= mtmsc [label="for CN: CRCX\nrtpbridge/*@msc"]; mtmsc abox mtmsc [label="CC state:\nMO_TERM_CALL_CONF"]; -mtmgw <<= mtmsc [label="for RAN: CRCX\nrtpbridge/*@msc"]; -mtmsc =>> sip [label="MNCC_CALL_CONF_IND"]; -mtmsc <<= sip [label="MNCC_RTP_CREATE"]; -mtmgw =>> mtmsc [label="for RAN: CRCX OK\nEP-2 CI-3"]; -mtms <<= mtmsc [label="(RANAP) RAB AssignmentRequest"]; -mtms =>> mtmsc [label="(RANAP) RAB Assignment Response"]; -mtmgw <<= mtmsc [label="for RAN: MDCX\nEP-2 CI-3"]; -mtmgw =>> mtmsc [label="for RAN: MDCX OK\nEP-2 CI-3"]; -mtmgw <<= mtmsc [label="for CN: CRCX\nEP-2"]; -mtmgw =>> mtmsc [label="for CN: CRCX OK\nEP-2 CI-4"]; -mtmsc =>> sip [label="MNCC_RTP_CREATE\nIP:port-2"]; +mtmsc =>> mncc [label="MNCC_CALL_CONF_IND"]; +mtmsc <<= mncc [label="MNCC_RTP_CREATE"]; +mtmgw =>> mtmsc [label="for CN: CRCX OK\nEP-2 CI-3 IP:port-3"]; +mtmgw <<= mtmsc [label="for RAN: CRCX\nEP-2"]; +mtmgw =>> mtmsc [label="for RAN: CRCX OK\nEP-2 CI-4 IP:port-4"]; +mtms <<= mtmsc [label="(BSSMAP) ASSIGNMENT_COMMAND"]; +mtms =>> mtmsc [label="(BSSMAP) Assignment Complete"]; +mtmgw <<= mtmsc [label="for RAN: MDCX\nEP-2 CI-4"]; +mtmsc =>> mncc [label="MNCC_RTP_CREATE\nIP:port-3"]; +mtmgw =>> mtmsc [label="for RAN: MDCX OK\nEP-2 CI-4 IP:port-4"]; mtms =>> mtmsc [label="CC ALERTING"]; mtmsc note mtmsc [label="CC stops timer T310"]; mtmsc note mtmsc [label="CC starts timer T301 (180s)"]; mtmsc abox mtmsc [label="CC state:\nCALL_RECEIVED"]; -mtmsc =>> sip [label="MNCC_ALERT_IND"]; -momsc <<= sip [label="MNCC_ALERT_REQ"]; +mtmsc =>> mncc [label="MNCC_ALERT_IND\nIP:port-3"]; +momsc <<= mncc [label="MNCC_ALERT_REQ"]; momsc note momsc [label="CC stops guard timer"]; momsc note momsc [label="CC starts guard timer (180s)"]; momsc abox momsc [label="CC state:\nCALL_DELIVERED"]; @@ -67,57 +70,55 @@ moms <<= momsc [label="CC ALERTING"]; mtms =>> mtmsc [label="CC CONNECT"]; mtmsc note mtmsc [label="CC stops timer T301"]; mtmsc abox mtmsc [label="CC state:\nCONNECT_REQUEST"]; -mtmsc =>> sip [label="MNCC_SETUP_CNF"]; -mtmsc <<= sip [label="MNCC_RTP_CONNECT\nIP:port-1"]; -mtmgw <<= mtmsc [label="for CN: MDCX\nEP-2 CI-4"]; -mtmsc <<= sip [label="MNCC_SETUP_COMPL_REQ"]; +mtmsc =>> mncc [label="MNCC_SETUP_CNF\nIP:port-3"]; +mtmsc <<= mncc [label="MNCC_RTP_CONNECT\nIP:port-1"]; +mtmgw <<= mtmsc [label="for CN: MDCX\nEP-2 CI-3"]; +mtmsc <<= mncc [label="MNCC_SETUP_COMPL_REQ"]; mtmsc note mtmsc [label="CC starts guard timer (180s)"]; mtmsc abox mtmsc [label="CC state:\nACTIVE"]; mtmsc note mtmsc [label="CC stops guard timer"]; mtms <<= mtmsc [label="CC CONNECT_ACK"]; -mtmgw =>> mtmsc [label="for CN: MDCX OK\nEP-2 CI-4"]; -momsc <<= sip [label="MNCC_RTP_CONNECT\nIP:port-2"]; -momgw <<= momsc [label="for CN: MDCX\nEP-1 CI-2"]; -momsc <<= sip [label="MNCC_SETUP_RSP"]; +momsc <<= mncc [label="MNCC_RTP_CONNECT\nIP:port-3"]; +momgw <<= momsc [label="for CN: MDCX\nEP-1 CI-1"]; +momsc <<= mncc [label="MNCC_SETUP_RSP"]; momsc note momsc [label="CC stops guard timer"]; momsc note momsc [label="CC starts guard timer (180s)"]; momsc note momsc [label="CC starts timer T313 (30s)"]; momsc abox momsc [label="CC state:\nCONNECT_IND"]; moms <<= momsc [label="CC CONNECT"]; -momgw =>> momsc [label="for CN: MDCX OK\nEP-1 CI-2"]; +mtmgw =>> mtmsc [label="for CN: MDCX OK\nEP-2 CI-3 IP:port-3"]; +momgw =>> momsc [label="for CN: MDCX OK\nEP-1 CI-1 IP:port-1"]; moms =>> momsc [label="CC CONNECT_ACK"]; momsc note momsc [label="CC stops timer T313"]; momsc abox momsc [label="CC state:\nACTIVE"]; momsc note momsc [label="CC stops guard timer"]; -momsc =>> sip [label="MNCC_SETUP_COMPL_IND"]; +momsc =>> mncc [label="MNCC_SETUP_COMPL_IND"]; moms =>> momsc [label="CC DISCONNECT"]; momsc abox momsc [label="CC state:\nDISCONNECT_IND"]; -momsc =>> sip [label="MNCC_DISC_IND"]; -momsc <<= sip [label="MNCC_REL_REQ"]; +momsc =>> mncc [label="MNCC_DISC_IND"]; +momsc <<= mncc [label="MNCC_REL_REQ"]; momsc note momsc [label="CC starts guard timer (180s)"]; momsc note momsc [label="CC starts timer T308 (10s)"]; momsc abox momsc [label="CC state:\nRELEASE_REQ"]; moms <<= momsc [label="CC RELEASE"]; -mtmsc <<= sip [label="MNCC_DISC_REQ"]; +mtmsc <<= mncc [label="MNCC_DISC_REQ"]; mtmsc note mtmsc [label="CC starts guard timer (180s)"]; mtmsc note mtmsc [label="CC starts timer T306 (30s)"]; mtmsc abox mtmsc [label="CC state:\nDISCONNECT_IND"]; mtms <<= mtmsc [label="CC DISCONNECT"]; +mtms =>> mtmsc [label="CC RELEASE"]; +mtmsc note mtmsc [label="CC stops timer T306"]; +mtms <<= mtmsc [label="CC RELEASE_COMPL"]; +mtmsc =>> mncc [label="MNCC_REL_IND"]; +mtmsc abox mtmsc [label="CC state:\nNULL"]; +mtmsc note mtmsc [label="CC stops guard timer"]; +mtms <<= mtmsc [label="(BSSMAP) CLEAR_COMMAND"]; +mtms =>> mtmsc [label="(BSSMAP) Clear Complete"]; moms =>> momsc [label="CC RELEASE_COMPL"]; momsc note momsc [label="CC stops timer T308"]; +momsc =>> mncc [label="MNCC_REL_CNF"]; momsc abox momsc [label="CC state:\nNULL"]; momsc note momsc [label="CC stops guard timer"]; moms <<= momsc [label="(BSSMAP) CLEAR_COMMAND"]; -momsc =>> sip [label="MNCC_REL_CNF"]; moms =>> momsc [label="(BSSMAP) Clear Complete"]; -mtms =>> mtmsc [label="CC RELEASE"]; -mtmsc note mtmsc [label="CC stops timer T306"]; -mtms <<= mtmsc [label="CC RELEASE_COMPL"]; -mtmsc abox mtmsc [label="CC state:\nNULL"]; -mtmsc note mtmsc [label="CC stops guard timer"]; -mtms <<= mtmsc [label="(RANAP) Iu Release"]; -mtmsc =>> sip [label="MNCC_REL_IND"]; -mtms =>> mtmsc [label="(RANAP) Iu Release successfulOutcome"]; -moms =>> momsc [label="IMSI Detach"]; -mtms =>> mtmsc [label="IMSI Detach"]; } diff --git a/doc/sequence_charts/voice_call_internal_mncc.msc b/doc/sequence_charts/voice_call_internal_mncc.msc new file mode 100644 index 000000000..898c1ff9a --- /dev/null +++ b/doc/sequence_charts/voice_call_internal_mncc.msc @@ -0,0 +1,129 @@ +# Generated by osmo-msc.git/doc/sequence_charts/msc_log_to_ladder.py +msc { +hscale="3"; +moms[label="MS,BSS (MO)\nUE,hNodeB (MO)"],momgw[label="MGW for MSC (MO)"],momsc[label="MSC (MO)"],mncc[label="MNCC"],mtmsc[label="MSC (MT)"],mtmgw[label="MGW for MSC (MT)"],mtms[label="BSS,MS (MT)\nhNodeB,UE (MT)"]; +moms =>> momsc [label="(BSSMAP) Complete Layer 3 Information"]; +moms =>> momsc [label="MM CM_SERV_REQ"]; +moms <<= momsc [label="MM AUTH_REQ"]; +moms =>> momsc [label="MM AUTH_RESP"]; +moms <<= momsc [label="(BSSMAP) CIPHER_MODE_COMMAND"]; +moms =>> momsc [label="(BSSMAP) Ciphering Mode Complete"]; +moms <<= momsc [label="(BSSMAP) COMMON_ID"]; +moms =>> momsc [label="RR CIPH_M_COMPL"]; +moms =>> momsc [label="CC SETUP"]; +momsc note momsc [label="CC starts guard timer (180s)"]; +momsc abox momsc [label="CC state:\nINITIATED"]; +momgw <<= momsc [label="for CN: CRCX\nrtpbridge/*@msc"]; +momgw =>> momsc [label="for CN: CRCX OK\nEP-1 CI-1 IP:port-1"]; +momsc =>> mncc [label="MNCC_SETUP_IND\nIP:port-1"]; +momsc <<= mncc [label="MNCC_CALL_PROC_REQ"]; +momsc note momsc [label="CC stops guard timer"]; +momsc note momsc [label="CC starts guard timer (180s)"]; +momsc abox momsc [label="CC state:\nMO_CALL_PROC"]; +moms <<= momsc [label="CC CALL_PROC"]; +momsc <<= mncc [label="MNCC_LCHAN_MODIFY"]; +momsc note momsc [label="CC stops guard timer"]; +momsc note momsc [label="CC starts guard timer (180s)"]; +mtmsc <<= mncc [label="MNCC_SETUP_REQ\nIP:port-1"]; +mtms <<= mtmsc [label="Paging"]; +momgw <<= momsc [label="for RAN: CRCX\nEP-1"]; +momgw =>> momsc [label="for RAN: CRCX OK\nEP-1 CI-2 IP:port-2"]; +moms <<= momsc [label="(BSSMAP) ASSIGNMENT_COMMAND"]; +mtms =>> mtmsc [label="(BSSMAP) Complete Layer 3 Information"]; +mtms =>> mtmsc [label="RR PAG_RESP"]; +mtms <<= mtmsc [label="MM AUTH_REQ"]; +moms =>> momsc [label="(BSSMAP) Assignment Complete"]; +momgw <<= momsc [label="for RAN: MDCX\nEP-1 CI-2"]; +momsc =>> mncc [label="MNCC_RTP_CREATE\nIP:port-1"]; +momgw =>> momsc [label="for RAN: MDCX OK\nEP-1 CI-2 IP:port-2"]; +mtms =>> mtmsc [label="MM AUTH_RESP"]; +mtms <<= mtmsc [label="(BSSMAP) CIPHER_MODE_COMMAND"]; +mtms =>> mtmsc [label="(BSSMAP) Ciphering Mode Complete"]; +mtms <<= mtmsc [label="(BSSMAP) COMMON_ID"]; +mtmsc note mtmsc [label="CC starts timer T303 (30s)"]; +mtmsc abox mtmsc [label="CC state:\nCALL_PRESENT"]; +mtms <<= mtmsc [label="CC SETUP"]; +mtms =>> mtmsc [label="RR CIPH_M_COMPL"]; +mtms =>> mtmsc [label="CC CALL_CONF"]; +mtmsc note mtmsc [label="CC stops timer T303"]; +mtmsc note mtmsc [label="CC starts timer T310 (30s)"]; +mtmgw <<= mtmsc [label="for CN: CRCX\nrtpbridge/*@msc"]; +mtmsc abox mtmsc [label="CC state:\nMO_TERM_CALL_CONF"]; +mtmsc =>> mncc [label="MNCC_CALL_CONF_IND"]; +mtmsc <<= mncc [label="MNCC_LCHAN_MODIFY"]; +mtmsc note mtmsc [label="CC starts guard timer (180s)"]; +mtmgw =>> mtmsc [label="for CN: CRCX OK\nEP-2 CI-3 IP:port-3"]; +mtmgw <<= mtmsc [label="for RAN: CRCX\nEP-2"]; +mtmgw =>> mtmsc [label="for RAN: CRCX OK\nEP-2 CI-4 IP:port-4"]; +mtms <<= mtmsc [label="(BSSMAP) ASSIGNMENT_COMMAND"]; +mtms =>> mtmsc [label="(BSSMAP) Assignment Complete"]; +mtmgw <<= mtmsc [label="for RAN: MDCX\nEP-2 CI-4"]; +mtmsc =>> mncc [label="MNCC_RTP_CREATE\nIP:port-3"]; +mtmgw =>> mtmsc [label="for RAN: MDCX OK\nEP-2 CI-4 IP:port-4"]; +mtms =>> mtmsc [label="CC ALERTING"]; +mtmsc note mtmsc [label="CC stops timer T310"]; +mtmsc note mtmsc [label="CC starts timer T301 (180s)"]; +mtmsc abox mtmsc [label="CC state:\nCALL_RECEIVED"]; +mtmsc =>> mncc [label="MNCC_ALERT_IND\nIP:port-3"]; +momsc <<= mncc [label="MNCC_ALERT_REQ\nIP:port-3"]; +momsc note momsc [label="CC stops guard timer"]; +momsc note momsc [label="CC starts guard timer (180s)"]; +momsc abox momsc [label="CC state:\nCALL_DELIVERED"]; +momgw <<= momsc [label="for CN: MDCX\nEP-1 CI-1"]; +moms <<= momsc [label="CC ALERTING"]; +momgw =>> momsc [label="for CN: MDCX OK\nEP-1 CI-1 IP:port-1"]; +mtms =>> mtmsc [label="CC CONNECT"]; +mtmsc note mtmsc [label="CC stops timer T301"]; +mtmsc abox mtmsc [label="CC state:\nCONNECT_REQUEST"]; +mtmsc =>> mncc [label="MNCC_SETUP_CNF\nIP:port-3"]; +mtmsc <<= mncc [label="MNCC_SETUP_COMPL_REQ"]; +mtmsc note mtmsc [label="CC stops guard timer"]; +mtmsc note mtmsc [label="CC starts guard timer (180s)"]; +mtmsc abox mtmsc [label="CC state:\nACTIVE"]; +mtmsc note mtmsc [label="CC stops guard timer"]; +mtms <<= mtmsc [label="CC CONNECT_ACK"]; +momsc <<= mncc [label="MNCC_SETUP_RSP\nIP:port-3"]; +momsc note momsc [label="CC stops guard timer"]; +momsc note momsc [label="CC starts guard timer (180s)"]; +momsc note momsc [label="CC starts timer T313 (30s)"]; +momsc abox momsc [label="CC state:\nCONNECT_IND"]; +moms <<= momsc [label="CC CONNECT"]; +mtmgw <<= mtmsc [label="for CN: MDCX\nEP-2 CI-3"]; +mtmgw =>> mtmsc [label="for CN: MDCX OK\nEP-2 CI-3 IP:port-3"]; +moms =>> momsc [label="CC CONNECT_ACK"]; +momsc note momsc [label="CC stops timer T313"]; +momsc abox momsc [label="CC state:\nACTIVE"]; +momsc note momsc [label="CC stops guard timer"]; +momsc =>> mncc [label="MNCC_SETUP_COMPL_IND"]; +moms =>> momsc [label="CC DISCONNECT"]; +momsc abox momsc [label="CC state:\nDISCONNECT_IND"]; +momsc =>> mncc [label="MNCC_DISC_IND"]; +momsc <<= mncc [label="MNCC_REL_REQ"]; +momsc note momsc [label="CC starts guard timer (180s)"]; +momsc note momsc [label="CC starts timer T308 (10s)"]; +momsc abox momsc [label="CC state:\nRELEASE_REQ"]; +moms <<= momsc [label="CC RELEASE"]; +mtmsc <<= mncc [label="MNCC_DISC_REQ"]; +mtmsc note mtmsc [label="CC starts guard timer (180s)"]; +mtmsc note mtmsc [label="CC starts timer T306 (30s)"]; +mtmsc abox mtmsc [label="CC state:\nDISCONNECT_IND"]; +mtms <<= mtmsc [label="CC DISCONNECT"]; +mtms =>> mtmsc [label="CC RELEASE"]; +mtmsc note mtmsc [label="CC stops timer T306"]; +mtms <<= mtmsc [label="CC RELEASE_COMPL"]; +mtmsc =>> mncc [label="MNCC_REL_IND"]; +momsc <<= mncc [label="MNCC_REL_REQ"]; +momsc note momsc [label="CC stops guard timer"]; +momsc note momsc [label="CC starts guard timer (180s)"]; +mtmsc abox mtmsc [label="CC state:\nNULL"]; +mtmsc note mtmsc [label="CC stops guard timer"]; +mtms <<= mtmsc [label="(BSSMAP) CLEAR_COMMAND"]; +mtms =>> mtmsc [label="(BSSMAP) Clear Complete"]; +moms =>> momsc [label="CC RELEASE_COMPL"]; +momsc note momsc [label="CC stops timer T308"]; +momsc =>> mncc [label="MNCC_REL_CNF"]; +momsc abox momsc [label="CC state:\nNULL"]; +momsc note momsc [label="CC stops guard timer"]; +moms <<= momsc [label="(BSSMAP) CLEAR_COMMAND"]; +moms =>> momsc [label="(BSSMAP) Clear Complete"]; +} |