aboutsummaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/examples/osmo-msc/osmo-msc.cfg19
-rw-r--r--doc/examples/osmo-msc/osmo-msc_custom-sccp.cfg19
-rw-r--r--doc/examples/osmo-msc/osmo-msc_multi-cs7.cfg19
-rw-r--r--doc/manuals/chapters/running.adoc39
-rw-r--r--doc/manuals/chapters/sgs.adoc55
-rw-r--r--doc/manuals/osmomsc-usermanual.adoc8
-rw-r--r--doc/sequence_charts/Makefile.am13
-rwxr-xr-xdoc/sequence_charts/msc_log_to_ladder.py65
-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.msc129
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"];
+}