<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-manuals/+/14839">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">common: Introduce Osmux documentation<br><br>Change-Id: I182d94c63f7d74ef882b77be59a95b1b7d8a4e5e<br>---<br>A common/chapters/osmux/mgcp_extension_osmux.adoc<br>A common/chapters/osmux/mo_call_osmux_aoip.msc<br>A common/chapters/osmux/mo_call_osmux_sccplite.msc<br>A common/chapters/osmux/mo_call_osmux_sccplite_nat.msc<br>A common/chapters/osmux/network_osmux_aoip.dot<br>A common/chapters/osmux/network_osmux_sccplite.dot<br>A common/chapters/osmux/network_osmux_sccplite_nat.dot<br>A common/chapters/osmux/osmux.adoc<br>8 files changed, 550 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/common/chapters/osmux/mgcp_extension_osmux.adoc b/common/chapters/osmux/mgcp_extension_osmux.adoc</span><br><span>new file mode 100644</span><br><span>index 0000000..c12e9ef</span><br><span>--- /dev/null</span><br><span>+++ b/common/chapters/osmux/mgcp_extension_osmux.adoc</span><br><span>@@ -0,0 +1,115 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[[mgcp-extension-osmux]]</span><br><span style="color: hsl(120, 100%, 40%);">+=== Osmux and MGCP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+`X-Osmux` indicates to OsmoMGW that a given connection of an `rtpbridge`</span><br><span style="color: hsl(120, 100%, 40%);">+endpoint has to be configured in order to handle Osmux frames instead of RTP</span><br><span style="color: hsl(120, 100%, 40%);">+messages on the data plane.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== `X-Osmux` Format</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The value part of `X-Osmux` must be one integer in range [0..255], or</span><br><span style="color: hsl(120, 100%, 40%);">+alternatively only on request messages, an asterisk (*) if the value is not yet</span><br><span style="color: hsl(120, 100%, 40%);">+known.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+`X-Osmux` must be issued in the MGCP header section (typically as its last</span><br><span style="color: hsl(120, 100%, 40%);">+item), before the SDP section starts.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+`X-Osmux` can be included inside `CRCX` and `MDCX` request messages, as well as</span><br><span style="color: hsl(120, 100%, 40%);">+their respective response messages.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+In request messages, the value part of `X-Osmux` specifies the CID to be used by</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoMGW to _send_ Osmux frames to the remote peer for that connection, also</span><br><span style="color: hsl(120, 100%, 40%);">+known as _sendCID_.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+In response messages, the value part of `X-Osmux` specifies the CID where</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoMGW expect to _receive_ Osmux frames from the remote peer for that</span><br><span style="color: hsl(120, 100%, 40%);">+connection, also known as _recvCID_.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Example: `X-Osmux` format with a known CID 3.</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+X-Osmux: 3</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%);">+.Example: `X-Osmux` format with a wildcard (not yet known) CID.</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+X-Osmux: *</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%);">+==== `X-Osmux` Considerations</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+If the MGCP client is willing to use Osmux for a given connection, it shall</span><br><span style="color: hsl(120, 100%, 40%);">+specify so during `CRCX` time, and not later. If at `CRCX` time the MGCP client</span><br><span style="color: hsl(120, 100%, 40%);">+doesn't yet know the _sendCID_, it can use an astersik (*) and provide</span><br><span style="color: hsl(120, 100%, 40%);">+_sendCID_ later within `MDCX` messages.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+All subsequent `MDCX` messages sent towards an Osmux connection must contain the</span><br><span style="color: hsl(120, 100%, 40%);">+original _sendCID_ sent during `CRCX`. The same way, all `MDCX` response shall</span><br><span style="color: hsl(120, 100%, 40%);">+contain the _recvCID_ sent during `CRCX`.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The other required connection address parameters, such as IP address, port, and</span><br><span style="color: hsl(120, 100%, 40%);">+codecs, are negotiated through MGCP and SDP as usual, but in this case the IP</span><br><span style="color: hsl(120, 100%, 40%);">+address and port specific the Osmux socket IP address and port to use, that</span><br><span style="color: hsl(120, 100%, 40%);">+together with the Osmux CID conform the entire tuple identifying a Osmux stream.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Since Osmux only supports AMR codec payloads, the SDP must specify use of AMR</span><br><span style="color: hsl(120, 100%, 40%);">+codec.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Example: `CRCX` message that instructs OsmoMGW to create an Osmux connection</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+CRCX 189 rtpbridge/1@mgw MGCP 1.0</span><br><span style="color: hsl(120, 100%, 40%);">+C: 36</span><br><span style="color: hsl(120, 100%, 40%);">+M: sendrecv</span><br><span style="color: hsl(120, 100%, 40%);">+X-Osmux: 2</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+v=0</span><br><span style="color: hsl(120, 100%, 40%);">+o=- 36 23 IN IP4 172.18.2.20</span><br><span style="color: hsl(120, 100%, 40%);">+s=-</span><br><span style="color: hsl(120, 100%, 40%);">+c=IN IP4 1.2.3.4</span><br><span style="color: hsl(120, 100%, 40%);">+t=0 0</span><br><span style="color: hsl(120, 100%, 40%);">+m=audio 2342 RTP/AVP 112</span><br><span style="color: hsl(120, 100%, 40%);">+a=fmtp:112</span><br><span style="color: hsl(120, 100%, 40%);">+a=rtpmap:112 AMR/8000/1</span><br><span style="color: hsl(120, 100%, 40%);">+a=ptime:20</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%);">+.Example: response to `CRCX` containing the <<recvCID>></span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+200 189 OK</span><br><span style="color: hsl(120, 100%, 40%);">+I: 07E41584</span><br><span style="color: hsl(120, 100%, 40%);">+X-Osmux: 2</span><br><span style="color: hsl(120, 100%, 40%);">+Z: rtpbridge/1@mgw</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+v=0</span><br><span style="color: hsl(120, 100%, 40%);">+o=- foo 21 IN IP4 172.18.1.20</span><br><span style="color: hsl(120, 100%, 40%);">+s=-</span><br><span style="color: hsl(120, 100%, 40%);">+c=IN IP4 172.18.1.20</span><br><span style="color: hsl(120, 100%, 40%);">+t=0 0</span><br><span style="color: hsl(120, 100%, 40%);">+m=audio 11002 RTP/AVP 112</span><br><span style="color: hsl(120, 100%, 40%);">+a=rtpmap:112 AMR/8000</span><br><span style="color: hsl(120, 100%, 40%);">+a=ptime:20</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%);">+==== `X-Osmux` Support</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+`X-Osmux` is known to be supported by OsmoMGW on the MGCP server side, and by</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC as well as OsmoMSC on the MGCP client side (through libosmo-mgcp-cli).</span><br><span style="color: hsl(120, 100%, 40%);">+No other programs supporting this feature are known or envisioned at the time of</span><br><span style="color: hsl(120, 100%, 40%);">+writing this document.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+In OmoMGW, Osmux support is managed through VTY.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Example: Sample config file section with Osmux configuation</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+mgcp</span><br><span style="color: hsl(120, 100%, 40%);">+ ...</span><br><span style="color: hsl(120, 100%, 40%);">+ osmux on <1></span><br><span style="color: hsl(120, 100%, 40%);">+ osmux bind-ip 172.18.1.20 <2></span><br><span style="color: hsl(120, 100%, 40%);">+ osmux port 1984 <3></span><br><span style="color: hsl(120, 100%, 40%);">+ osmux batch-factor 4 <4></span><br><span style="color: hsl(120, 100%, 40%);">+ osmux dummy on <5></span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+<1> Allow clients to set allocate Osmux connections in `rtpbridge` endpoints, while still allowing RTP connections</span><br><span style="color: hsl(120, 100%, 40%);">+<2> Bind the Osmux socket to the provided IP address</span><br><span style="color: hsl(120, 100%, 40%);">+<3> Bind the Osmux socket to the provided UDP port</span><br><span style="color: hsl(120, 100%, 40%);">+<4> Batch up to 4 RTP payloads of the same stream on each Osmux frame</span><br><span style="color: hsl(120, 100%, 40%);">+<5> Periodically send Osmux dummy frames, useful to punch a hole in NATs and maintain connections opened.</span><br><span>diff --git a/common/chapters/osmux/mo_call_osmux_aoip.msc b/common/chapters/osmux/mo_call_osmux_aoip.msc</span><br><span>new file mode 100644</span><br><span>index 0000000..9cb2e50</span><br><span>--- /dev/null</span><br><span>+++ b/common/chapters/osmux/mo_call_osmux_aoip.msc</span><br><span>@@ -0,0 +1,54 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# MO-call with Osmux enable on 3GPP AoIP</span><br><span style="color: hsl(120, 100%, 40%);">+msc {</span><br><span style="color: hsl(120, 100%, 40%);">+   hscale=2;</span><br><span style="color: hsl(120, 100%, 40%);">+     ms [label="MS"], bts [label="OsmoBTS"], bsc[label="OsmoBSC"], mgw_bsc[label="OsmoMGW(bsc)"], m_sc[label="MSC"], mgw_msc[label="OsmoMGW(msc)"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  bsc <- m_sc  [label="BSSMAP RESET (with extension IE: Osmux Support)"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bsc -> m_sc  [label="BSSMAP RESET ACK (with extension IE: Osmux Support)"];</span><br><span style="color: hsl(120, 100%, 40%);">+      ...;</span><br><span style="color: hsl(120, 100%, 40%);">+  ms box mgw_msc  [label="We assume a SDCCH is already established"];</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%);">+        ms -> bsc    [label="DTAP CM Service Request"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bsc -> m_sc  [label="Complete Layer 3 Information DTAP CM Service Request"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   # Allocate MGW/MSC Osmux endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+     m_sc -> mgw_msc      [label="MGCP CRCX rtpbridge/*@mgw, X-Osmux: *"];</span><br><span style="color: hsl(120, 100%, 40%);">+    mgw_msc box mgw_msc     [label="Bind to MGW-local Osmux Port (1984)\nAllocate new endpoint 1, recvCID 5"];</span><br><span style="color: hsl(120, 100%, 40%);">+  mgw_msc -> m_sc      [label="MGCP CRCX rtpbridge/1@mgw OK (MGW:1984, X-Osmux: 5)"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    bsc <- m_sc  [label="BSSAP ASSGN REQ (3GPP AoIP, extension IE: Osmux CID 5)"];</span><br><span style="color: hsl(120, 100%, 40%);">+   bts <- bsc   [label="RSL CHAN ACT"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bts -> bsc   [label="RSL CHAN ACT ACK"];</span><br><span style="color: hsl(120, 100%, 40%);">+ ms <- bsc      [label="Assignment Command"];</span><br><span style="color: hsl(120, 100%, 40%);">+     ms -> bsc      [label="Assignment Complete"];</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%);">+        # connect BTS RTP with BSC-MGW RTP</span><br><span style="color: hsl(120, 100%, 40%);">+    bts <- bsc   [label="IPA CRCX"];</span><br><span style="color: hsl(120, 100%, 40%);">+ bts box bts     [label="Bind to BTS-local RTP Port (1000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+        bts -> bsc   [label="IPA CRCX ACK (BTS:1000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bsc -> mgw_bsc       [label="MGCP CRCX rtpbridge/2@mgw (BTS:1000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+     mgw_bsc box mgw_bsc     [label="Bind to MGW-local RTP Port (2000)\nConnect to BTS:1000"];</span><br><span style="color: hsl(120, 100%, 40%);">+   bsc <- mgw_bsc       [label="MGCP CRCX rtpbridge/2@mgw OK (MGW:2000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bts <- bsc   [label="IPA MDCX (MGW:2000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+      bts box bts     [label="Connect RTP socket to remote (MGW) RTP Port"];</span><br><span style="color: hsl(120, 100%, 40%);">+      bts -> bsc   [label="IPA MDCX ACK"];</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%);">+        mgw_bsc <- bsc       [label="MGCP CRCX rtpbridge/2@mgw (MSC:1984, X-Osmux: 5)"];</span><br><span style="color: hsl(120, 100%, 40%);">+ mgw_bsc box mgw_bsc     [label="Bind to MGW-local Osmux Port (1985)\nConnect to MSC:1984\nAllocate new recvCID 7"];</span><br><span style="color: hsl(120, 100%, 40%);">+ mgw_bsc -> bsc       [label="MGCP CRCX rtpbridge/2@mgw OK (MGW:1985, X-Osmux: 7)"];</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%);">+        bsc -> m_sc  [label="BSSAP ASSGN CMPL (3GPP AoIP MGW:1985, extension IE: Osmux CID 7)"];</span><br><span style="color: hsl(120, 100%, 40%);">+ m_sc box m_sc   [label="Connect remote Osmux to MGW addr from ASSGN CMPL"];</span><br><span style="color: hsl(120, 100%, 40%);">+ m_sc -> mgw_msc      [label="MGCP MDCX rtpbridge/1@mgw (MGW:1985, X-Osmux: 7)"];</span><br><span style="color: hsl(120, 100%, 40%);">+ m_sc <- mgw_msc      [label="MGCP MDCX rtpbridge/1@mgw OK (X-Osmux: 5)"];</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%);">+        mgw_bsc <=> mgw_msc       [label="Osmux Audio MGW:1985 MSC:1984, CID(uplink):5, CID(downlink):7"];</span><br><span style="color: hsl(120, 100%, 40%);">+    bts <=> mgw_bsc   [label="RTP Audio BTS:1000 MGW:2000"];</span><br><span style="color: hsl(120, 100%, 40%);">+      ms <=> bts        [label="Um Audio (bidirectional)"];</span><br><span style="color: hsl(120, 100%, 40%);">+ ms <-> m_sc       [label="DTAP CC ALERTING"];</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/common/chapters/osmux/mo_call_osmux_sccplite.msc b/common/chapters/osmux/mo_call_osmux_sccplite.msc</span><br><span>new file mode 100644</span><br><span>index 0000000..903da46</span><br><span>--- /dev/null</span><br><span>+++ b/common/chapters/osmux/mo_call_osmux_sccplite.msc</span><br><span>@@ -0,0 +1,58 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# MO-call with Osmux enable on 3GPP AoIP using A/IP with IPA/SCCPlite</span><br><span style="color: hsl(120, 100%, 40%);">+msc {</span><br><span style="color: hsl(120, 100%, 40%);">+ hscale=2;</span><br><span style="color: hsl(120, 100%, 40%);">+     ms [label="MS"], bts [label="OsmoBTS"], bsc[label="OsmoBSC"], mgw_bsc[label="OsmoMGW(bsc)"], m_sc[label="MSC"], mgw_msc[label="OsmoMGW(msc)"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  ms box m_sc     [label="We assume a SDCCH is already established"];</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%);">+        ms -> bsc    [label="DTAP CM Service Request"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bsc -> m_sc  [label="Complete Layer 3 Information DTAP CM Service Request"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bsc <- m_sc  [label="Connection Confirmed"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   # Allocate MGW/MSC Osmux endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+     m_sc -> mgw_msc      [label="MGCP CRCX *@mgw, X-Osmux: *"];</span><br><span style="color: hsl(120, 100%, 40%);">+      mgw_msc box mgw_msc     [label="Bind to MGW-local Osmux Port (1984)\nAllocate new endpoint 1, recvCID 5"];</span><br><span style="color: hsl(120, 100%, 40%);">+  mgw_msc -> m_sc      [label="MGCP CRCX rtpbridge/1@mgw OK (MGW:1984, X-Osmux: 5)"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    bsc <- m_sc     [label="BSSAP ASSGN REQ (CIC:1)"];</span><br><span style="color: hsl(120, 100%, 40%);">+       bts <- bsc      [label="RSL CHAN ACT"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bts -> bsc      [label="RSL CHAN ACT ACK"];</span><br><span style="color: hsl(120, 100%, 40%);">+      ms <- bsc      [label="Assignment Command"];</span><br><span style="color: hsl(120, 100%, 40%);">+     ms -> bsc      [label="Assignment Complete"];</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%);">+        # connect BTS RTP with BSC-MGW RTP, CIC is used as MGW endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+       bts <- bsc   [label="IPA CRCX"];</span><br><span style="color: hsl(120, 100%, 40%);">+ bts box bts     [label="Bind to BTS-local RTP Port (1000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+        bts -> bsc   [label="IPA CRCX ACK (BTS:1000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bsc -> mgw_bsc       [label="MGCP CRCX 1@mgw (BTS:1000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+       mgw_bsc box mgw_bsc     [label="Bind to MGW-local RTP Port (2000)\nConnect to BTS:1000"];</span><br><span style="color: hsl(120, 100%, 40%);">+   bsc <- mgw_bsc       [label="MGCP CRCX 1@mgw OK (MGW:2000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+    bts <- bsc   [label="IPA MDCX (MGW:2000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+      bts box bts     [label="Connect RTP socket to remote (MGW) RTP Port"];</span><br><span style="color: hsl(120, 100%, 40%);">+      bts -> bsc   [label="IPA MDCX ACK"];</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%);">+        bsc -> m_sc      [label="BSSMAP ASSGN Complete"];</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%);">+        # MSC configures BSC-MGW MSC-side of the endpoint through MGCP UDP forwarding</span><br><span style="color: hsl(120, 100%, 40%);">+ mgw_bsc <- m_sc    [label="MGCP CRCX 1@mgw (MSC:1984, X-Osmux: 5)"];</span><br><span style="color: hsl(120, 100%, 40%);">+     mgw_bsc box mgw_bsc   [label="Bind to BTS-local Osmux Port (1985)\nAllocate new recvCID 7"];</span><br><span style="color: hsl(120, 100%, 40%);">+        mgw_bsc -> m_sc    [label="MGCP CRCX 1@mgw OK (MGW:1985, X-Osmux: 7)"];</span><br><span style="color: hsl(120, 100%, 40%);">+  mgw_bsc <- m_sc    [label="MGCP MDCX 1@mgw (recvonly) "];</span><br><span style="color: hsl(120, 100%, 40%);">+        mgw_bsc box mgw_bsc   [label="Connect Osmux socket to remote (MSC) Osmux Port"];</span><br><span style="color: hsl(120, 100%, 40%);">+    mgw_bsc -> m_sc    [label="MGCP MDCX 1@mgw OK"];</span><br><span style="color: hsl(120, 100%, 40%);">+ mgw_bsc <= mgw_msc    [label="Osmux Audio MGW:1985 MSC:1984, CID(downlink):7"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bts <= mgw_bsc     [label="RTP Audio BTS:1000 MGW:2000"];</span><br><span style="color: hsl(120, 100%, 40%);">+        ms <= bts       [label="Um Audio (unidirectional)"];</span><br><span style="color: hsl(120, 100%, 40%);">+     ms <- m_sc      [label="DTAP CC ALERTING"];</span><br><span style="color: hsl(120, 100%, 40%);">+      ...;</span><br><span style="color: hsl(120, 100%, 40%);">+  mgw_bsc <- m_sc    [label="MGCP MDCX 1@mgw (sndrecv) "];</span><br><span style="color: hsl(120, 100%, 40%);">+ mgw_bsc box mgw_bsc   [label="Switch to bi-directional audio"];</span><br><span style="color: hsl(120, 100%, 40%);">+     mgw_bsc -> m_sc    [label="MGCP MDCX 1@mgw OK"];</span><br><span style="color: hsl(120, 100%, 40%);">+ mgw_bsc <=> mgw_msc   [label="Osmux Audio MGW:1985 MSC:1984, CID(uplink):5, CID(downlink):7"];</span><br><span style="color: hsl(120, 100%, 40%);">+        bts <=> mgw_bsc    [label="RTP Audio BTS:1000 MGW:2000"];</span><br><span style="color: hsl(120, 100%, 40%);">+     ms <=> bts      [label="Um Audio (bidirectional)"];</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/common/chapters/osmux/mo_call_osmux_sccplite_nat.msc b/common/chapters/osmux/mo_call_osmux_sccplite_nat.msc</span><br><span>new file mode 100644</span><br><span>index 0000000..2aa8105</span><br><span>--- /dev/null</span><br><span>+++ b/common/chapters/osmux/mo_call_osmux_sccplite_nat.msc</span><br><span>@@ -0,0 +1,77 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# MO-call with Osmux enable on 3GPP AoIP using A/IP with IPA/SCCPlite with a BSC-NAT between BSC and MSC</span><br><span style="color: hsl(120, 100%, 40%);">+msc {</span><br><span style="color: hsl(120, 100%, 40%);">+    hscale=2;</span><br><span style="color: hsl(120, 100%, 40%);">+     ms [label="MS"], bts [label="OsmoBTS"], bsc[label="OsmoBSC"], mgw_bsc[label="OsmoMGW(bsc)"], bscnat[label="OsmoBSCNAT"], m_sc[label="MSC"], mgw_msc[label="OsmoMGW(msc)"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ms box m_sc     [label="We assume a SDCCH is already established"];</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%);">+        ms -> bsc    [label="DTAP CM Service Request"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bsc -> m_sc  [label="Complete Layer 3 Information DTAP CM Service Request"];</span><br><span style="color: hsl(120, 100%, 40%);">+     bsc <- m_sc  [label="Connection Confirmed"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   # Allocate MGW/MSC RTP endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+       m_sc -> mgw_msc      [label="MGCP CRCX *@mgw"];</span><br><span style="color: hsl(120, 100%, 40%);">+  mgw_msc box mgw_msc     [label="Bind to MGW-local RTP Port (3000)\nAllocate new endpoint 1"];</span><br><span style="color: hsl(120, 100%, 40%);">+       mgw_msc -> m_sc      [label="MGCP CRCX rtpbridge/1@mgw OK (MGW:3000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bscnat <- m_sc     [label="BSSAP ASSGN REQ (CIC:1)"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # NAT: MGW/MSC Osmux endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+ #bscnat -> bscnat    [label="MGCP CRCX *@mgw, X-Osmux: *"];</span><br><span style="color: hsl(120, 100%, 40%);">+      mgw_msc box mgw_msc     [label="Bind to MGW-local Osmux Port (1984)\nAllocate new endpoint 2, recvCID 5"];</span><br><span style="color: hsl(120, 100%, 40%);">+  #mgw_msc -> m_sc     [label="MGCP CRCX rtpbridge/1@mgw OK (MGW:1984, X-Osmux: 5)"];</span><br><span style="color: hsl(120, 100%, 40%);">+      bsc <- bscnat    [label="BSSAP ASSGN REQ (CIC:2)"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    bts <- bsc      [label="RSL CHAN ACT"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bts -> bsc      [label="RSL CHAN ACT ACK"];</span><br><span style="color: hsl(120, 100%, 40%);">+      ms <- bsc      [label="Assignment Command"];</span><br><span style="color: hsl(120, 100%, 40%);">+     ms -> bsc      [label="Assignment Complete"];</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%);">+        # connect BTS RTP with BSC-MGW RTP, CIC is used as MGW endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+       bts <- bsc   [label="IPA CRCX"];</span><br><span style="color: hsl(120, 100%, 40%);">+ bts box bts     [label="Bind to BTS-local RTP Port (1000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+        bts -> bsc   [label="IPA CRCX ACK (BTS:1000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bsc -> mgw_bsc       [label="MGCP CRCX 1@mgw (BTS:1000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+       mgw_bsc box mgw_bsc     [label="Bind to MGW-local RTP Port (2000)\nConnect to BTS:1000"];</span><br><span style="color: hsl(120, 100%, 40%);">+   bsc <- mgw_bsc       [label="MGCP CRCX 1@mgw OK (MGW:2000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+    bts <- bsc   [label="IPA MDCX (MGW:2000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+      bts box bts     [label="Connect RTP socket to remote (MGW) RTP Port"];</span><br><span style="color: hsl(120, 100%, 40%);">+      bts -> bsc   [label="IPA MDCX ACK"];</span><br><span style="color: hsl(120, 100%, 40%);">+     #bsc -> mgw_bsc      [label="MGCP MDCX 1@mgw (optional)"];</span><br><span style="color: hsl(120, 100%, 40%);">+       #bsc <- mgw_bsc      [label="MGCP MDCX 1@mgw OK (optional)"];</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%);">+        bsc -> bscnat      [label="BSSMAP ASSGN Complete"];</span><br><span style="color: hsl(120, 100%, 40%);">+      bscnat -> m_sc     [label="BSSMAP ASSGN Complete"];</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%);">+        # MSC configures BSC-MGW MSC-side of the endpoint through MGCP UDP forwarding</span><br><span style="color: hsl(120, 100%, 40%);">+ bscnat <- m_sc    [label="MGCP CRCX 1@mgw (MSC:3000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+  bscnat box bscnat [label="Allocate new endpoint 2\nAllocate new recvCID 5\nBind to local Osmux Port (1984)\nBind to local RTP port 4000"];</span><br><span style="color: hsl(120, 100%, 40%);">+  mgw_bsc <- bscnat [label="MGCP CRCX 2@mgw (MSC:1984, X-Osmux: 5)"];</span><br><span style="color: hsl(120, 100%, 40%);">+      mgw_bsc -> bscnat    [label="MGCP CRCX 2@mgw OK (MGW:1985, X-Osmux: 7)"];</span><br><span style="color: hsl(120, 100%, 40%);">+        bscnat -> m_sc    [label="MGCP CRCX 1@mgw OK (MGW:4000)"];</span><br><span style="color: hsl(120, 100%, 40%);">+       bscnat <- m_sc    [label="MGCP MDCX 1@mgw (recvonly) "];</span><br><span style="color: hsl(120, 100%, 40%);">+ mgw_bsc <- bscnat    [label="MGCP MDCX 2@mgw (recvonly) "];</span><br><span style="color: hsl(120, 100%, 40%);">+      mgw_bsc box mgw_bsc   [label="Connect Osmux socket to remote (MSC) Osmux Port"];</span><br><span style="color: hsl(120, 100%, 40%);">+    mgw_bsc -> bscnat    [label="MGCP MDCX 2@mgw OK"];</span><br><span style="color: hsl(120, 100%, 40%);">+       bscnat -> m_sc    [label="MGCP MDCX 1@mgw OK"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        bscnat <= mgw_msc    [label="RTP Audio BSCNAT:4000 MGW:3000"];</span><br><span style="color: hsl(120, 100%, 40%);">+   mgw_bsc <= bscnat [label="Osmux Audio MGW:1985 BSCNAT:1984, CID(downlink):7"];</span><br><span style="color: hsl(120, 100%, 40%);">+   bts <= mgw_bsc     [label="RTP Audio BTS:1000 MGW:2000"];</span><br><span style="color: hsl(120, 100%, 40%);">+        ms <= bts       [label="Um Audio (unidirectional)"];</span><br><span style="color: hsl(120, 100%, 40%);">+     ms <- m_sc      [label="DTAP CC ALERTING"];</span><br><span style="color: hsl(120, 100%, 40%);">+      ...;</span><br><span style="color: hsl(120, 100%, 40%);">+  bscnat <- m_sc    [label="MGCP MDCX 1@mgw (sndrecv) "];</span><br><span style="color: hsl(120, 100%, 40%);">+  mgw_bsc <- bscnat    [label="MGCP MDCX 2@mgw (sndrecv) "];</span><br><span style="color: hsl(120, 100%, 40%);">+       mgw_bsc box mgw_bsc   [label="Switch to bi-directional audio"];</span><br><span style="color: hsl(120, 100%, 40%);">+     mgw_bsc -> bscnat    [label="MGCP MDCX 2@mgw OK"];</span><br><span style="color: hsl(120, 100%, 40%);">+       bscnat -> m_sc    [label="MGCP MDCX 1@mgw OK"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        bscnat <=> mgw_msc    [label="RTP Audio BSCNAT:4000 MGW:3000"];</span><br><span style="color: hsl(120, 100%, 40%);">+       mgw_bsc <=> bscnat   [label="Osmux Audio MGW:1985 MSC:1984, CID(uplink):5, CID(downlink):7"];</span><br><span style="color: hsl(120, 100%, 40%);">+ bts <=> mgw_bsc    [label="RTP Audio BTS:1000 MGW:2000"];</span><br><span style="color: hsl(120, 100%, 40%);">+     ms <=> bts      [label="Um Audio (bidirectional)"];</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/common/chapters/osmux/network_osmux_aoip.dot b/common/chapters/osmux/network_osmux_aoip.dot</span><br><span>new file mode 100644</span><br><span>index 0000000..7531e6a</span><br><span>--- /dev/null</span><br><span>+++ b/common/chapters/osmux/network_osmux_aoip.dot</span><br><span>@@ -0,0 +1,32 @@</span><br><span style="color: hsl(120, 100%, 40%);">+digraph G {</span><br><span style="color: hsl(120, 100%, 40%);">+        rankdir = LR;</span><br><span style="color: hsl(120, 100%, 40%);">+ subgraph cluster_RAN {</span><br><span style="color: hsl(120, 100%, 40%);">+                OsmoBTS1 [label="OsmoBTS"];</span><br><span style="color: hsl(120, 100%, 40%);">+         OsmoBTS2 [label="OsmoBTS"];</span><br><span style="color: hsl(120, 100%, 40%);">+         OsmoBSC;</span><br><span style="color: hsl(120, 100%, 40%);">+              OsmoMGW [label="OsmoMGW\n(for BSC)"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             OsmoBTS1 -> OsmoBSC [label="Abis/IP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+             OsmoBTS2 -> OsmoBSC [label="Abis/IP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+             OsmoBSC -> OsmoMGW [label="MGCP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+         { rank = same; OsmoBSC; OsmoMGW }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           OsmoBTS1 -> OsmoMGW [label="RTP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+         OsmoBTS2 -> OsmoMGW [label="RTP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               label = "RAN";</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     subgraph cluster_CN {</span><br><span style="color: hsl(120, 100%, 40%);">+         OsmoMGW1 [label="OsmoMGW\n(for MSC)"];</span><br><span style="color: hsl(120, 100%, 40%);">+              OsmoMSC [label="MSC\ne.g. OsmoMSC"];</span><br><span style="color: hsl(120, 100%, 40%);">+                Core [label="Other CN Elements"];</span><br><span style="color: hsl(120, 100%, 40%);">+           OsmoMSC -> Core [label="MAP/ISUP/SIP/GSUP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+               OsmoMSC -> OsmoMGW1 [label="MGCP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+                { rank = same; OsmoMSC; OsmoMGW1 }</span><br><span style="color: hsl(120, 100%, 40%);">+            OsmoMGW -> OsmoMGW1 [label="Osmux", dir="both", color=red];</span><br><span style="color: hsl(120, 100%, 40%);">+            OsmoMGW1 -> Core [label="RTP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+            label = "CN";</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%);">+   OsmoBSC -> OsmoMSC [label="3GPP AoIP\nvia SIGTRAN/STP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/common/chapters/osmux/network_osmux_sccplite.dot b/common/chapters/osmux/network_osmux_sccplite.dot</span><br><span>new file mode 100644</span><br><span>index 0000000..678a61e</span><br><span>--- /dev/null</span><br><span>+++ b/common/chapters/osmux/network_osmux_sccplite.dot</span><br><span>@@ -0,0 +1,33 @@</span><br><span style="color: hsl(120, 100%, 40%);">+digraph G {</span><br><span style="color: hsl(120, 100%, 40%);">+    rankdir = LR;</span><br><span style="color: hsl(120, 100%, 40%);">+ subgraph cluster_RAN {</span><br><span style="color: hsl(120, 100%, 40%);">+                OsmoBTS1 [label="OsmoBTS"];</span><br><span style="color: hsl(120, 100%, 40%);">+         OsmoBTS2 [label="OsmoBTS"];</span><br><span style="color: hsl(120, 100%, 40%);">+         OsmoBSC;</span><br><span style="color: hsl(120, 100%, 40%);">+              OsmoMGW [label="OsmoMGW\n(for BSC)"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             OsmoBTS1 -> OsmoBSC [label="Abis/IP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+             OsmoBTS2 -> OsmoBSC [label="Abis/IP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+             OsmoBSC -> OsmoMGW [label="MGCP (BTS side)", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+              { rank = same; OsmoBSC; OsmoMGW }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           OsmoBTS1 -> OsmoMGW [label="RTP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+         OsmoBTS2 -> OsmoMGW [label="RTP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               label = "RAN";</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     subgraph cluster_CN {</span><br><span style="color: hsl(120, 100%, 40%);">+         OsmoMGW1 [label="OsmoMGW\n(for MSC)"];</span><br><span style="color: hsl(120, 100%, 40%);">+              OsmoMSC [label="MSC\ne.g. OsmoMSC"];</span><br><span style="color: hsl(120, 100%, 40%);">+                Core [label="Other CN Elements"];</span><br><span style="color: hsl(120, 100%, 40%);">+           OsmoMSC -> Core [label="MAP/ISUP/SIP/GSUP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+               OsmoMSC -> OsmoMGW1 [label="MGCP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+                { rank = same; OsmoMSC; OsmoMGW1 }</span><br><span style="color: hsl(120, 100%, 40%);">+            OsmoMGW -> OsmoMGW1 [label="Osmux", dir="both", color=red];</span><br><span style="color: hsl(120, 100%, 40%);">+            OsmoMGW1 -> Core [label="RTP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+            label = "CN";</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%);">+   OsmoBSC -> OsmoMSC [label="3GPP AoIP\nvia IPA/SCCPlite", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+  OsmoMGW -> OsmoMSC [label="MGCP (CN side)\n(IPA/UDP forwarding via BSC)", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/common/chapters/osmux/network_osmux_sccplite_nat.dot b/common/chapters/osmux/network_osmux_sccplite_nat.dot</span><br><span>new file mode 100644</span><br><span>index 0000000..021d0ec</span><br><span>--- /dev/null</span><br><span>+++ b/common/chapters/osmux/network_osmux_sccplite_nat.dot</span><br><span>@@ -0,0 +1,40 @@</span><br><span style="color: hsl(120, 100%, 40%);">+digraph G {</span><br><span style="color: hsl(120, 100%, 40%);">+      rankdir = LR;</span><br><span style="color: hsl(120, 100%, 40%);">+ subgraph cluster_RAN {</span><br><span style="color: hsl(120, 100%, 40%);">+                OsmoBTS1 [label="OsmoBTS"];</span><br><span style="color: hsl(120, 100%, 40%);">+         OsmoBTS2 [label="OsmoBTS"];</span><br><span style="color: hsl(120, 100%, 40%);">+         OsmoBSC;</span><br><span style="color: hsl(120, 100%, 40%);">+              OsmoMGW [label="OsmoMGW\n(for BSC)"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             OsmoBTS1 -> OsmoBSC [label="Abis/IP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+             OsmoBTS2 -> OsmoBSC [label="Abis/IP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+             OsmoBSC -> OsmoMGW [label="MGCP (BTS side)", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+              { rank = same; OsmoBSC; OsmoMGW }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           OsmoBTS1 -> OsmoMGW [label="RTP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+         OsmoBTS2 -> OsmoMGW [label="RTP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               label = "RAN";</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     subgraph cluster_BSCNAT {</span><br><span style="color: hsl(120, 100%, 40%);">+             OsmoBSCNAT;</span><br><span style="color: hsl(120, 100%, 40%);">+           label = "BSCNAT";</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     subgraph cluster_CN {</span><br><span style="color: hsl(120, 100%, 40%);">+         OsmoMGW1 [label="OsmoMGW\n(for MSC)"];</span><br><span style="color: hsl(120, 100%, 40%);">+              OsmoMSC [label="MSC\ne.g. OsmoMSC"];</span><br><span style="color: hsl(120, 100%, 40%);">+                Core [label="Other CN Elements"];</span><br><span style="color: hsl(120, 100%, 40%);">+           OsmoMSC -> Core [label="MAP/ISUP/SIP/GSUP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+               OsmoMSC -> OsmoMGW1 [label="MGCP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+                { rank = same; OsmoMSC; OsmoMGW1 }</span><br><span style="color: hsl(120, 100%, 40%);">+            OsmoMGW -> OsmoBSCNAT [label="Osmux", dir="both", color=red];</span><br><span style="color: hsl(120, 100%, 40%);">+          OsmoMGW1 -> Core [label="RTP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+            label = "CN";</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%);">+   OsmoBSC -> OsmoBSCNAT [label="3GPP AoIP\nvia IPA/SCCPlite", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+       OsmoMGW -> OsmoBSCNAT [label="MGCP (CN side)\n(IPA/UDP forwarding via BSC)", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+      OsmoBSCNAT -> OsmoMSC [label="3GPP AoIP\nvia IPA/SCCPlite", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+       OsmoBSCNAT -> OsmoMSC [label="MGCP\nvia UDP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+     OsmoBSCNAT -> OsmoMGW1 [label="RTP", dir="both"];</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/common/chapters/osmux/osmux.adoc b/common/chapters/osmux/osmux.adoc</span><br><span>new file mode 100644</span><br><span>index 0000000..5e53b60</span><br><span>--- /dev/null</span><br><span>+++ b/common/chapters/osmux/osmux.adoc</span><br><span>@@ -0,0 +1,141 @@</span><br><span style="color: hsl(120, 100%, 40%);">+== Osmux</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+`Osmux` is a protocol aimed at multiplexing and transmitting voice and</span><br><span style="color: hsl(120, 100%, 40%);">+signalling traffic from multiple sources in order to reduce the overall</span><br><span style="color: hsl(120, 100%, 40%);">+bandwidth consumption. This feature becomes specially meaningful in case of</span><br><span style="color: hsl(120, 100%, 40%);">+satellite based GSM systems, where the transmission cost on the back-haul is</span><br><span style="color: hsl(120, 100%, 40%);">+relatively expensive. In such environment, even seemingly small protocol</span><br><span style="color: hsl(120, 100%, 40%);">+optimizations, eg. message batching and trunking, can result in significant cost</span><br><span style="color: hsl(120, 100%, 40%);">+reduction.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Full reference document for the osmux protocol can be found here:</span><br><span style="color: hsl(120, 100%, 40%);">+http://ftp.osmocom.org/docs/latest/osmux-reference.pdf</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+In Osmocom satellite based GSM networks, the satellite link is envisioned to be</span><br><span style="color: hsl(120, 100%, 40%);">+in between the BSS and the core network, that is, between the BSC and the MSC</span><br><span style="color: hsl(120, 100%, 40%);">+(or BSC-NAT). Hence, Osmocom components can make use of `Osmux` protocol to</span><br><span style="color: hsl(120, 100%, 40%);">+multiplex payload audio streams from call legs between OsmoBSC and OsmoMSC (or</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSCNAT). The MGW attached those components need of course also be aware of</span><br><span style="color: hsl(120, 100%, 40%);">+`Osmux` existence in order to properly set up the audio data plane.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+=== Osmux and NAT</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+It is quite usual for satellite based links to use NATs, which means any or both</span><br><span style="color: hsl(120, 100%, 40%);">+of the two components at each side of the satellite link (BSC and MSC/BSC-NAT)</span><br><span style="color: hsl(120, 100%, 40%);">+may end up being behind a NAT and being unable to provide the real public</span><br><span style="color: hsl(120, 100%, 40%);">+address to its peer on the other side of the satellite.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+As a result, upon call parameter negotiation (RTP/Osmux IP address and port),</span><br><span style="color: hsl(120, 100%, 40%);">+those parameters won't be entirely useful and some specific logic needs to be</span><br><span style="color: hsl(120, 100%, 40%);">+introduced into the network components to circumvent the NAT under those cases.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+For instance, if the BSC and its co-located MGW (BSC/MGW from now on) is under a</span><br><span style="color: hsl(120, 100%, 40%);">+NAT, it may end up providing its private address and port as RTP/Osmux</span><br><span style="color: hsl(120, 100%, 40%);">+parameters to the MSC/MGW through GSM protocols, but MSC will fail to send any</span><br><span style="color: hsl(120, 100%, 40%);">+message to that tuple because of the NAT or routing issues (due to IP address</span><br><span style="color: hsl(120, 100%, 40%);">+being a private address). In that scenario, MSC/MGW needs to be aware that</span><br><span style="color: hsl(120, 100%, 40%);">+there's a NAT and wait until an RTP/Osmux message arrives from the BSC/MGW host.</span><br><span style="color: hsl(120, 100%, 40%);">+It then can, from that message source IP address and port (and CID in case of</span><br><span style="color: hsl(120, 100%, 40%);">+Osmux), discover the real public IP address and port of the peer (BSC/MGW). From</span><br><span style="color: hsl(120, 100%, 40%);">+that point on, the BSC/MGW punched a hole in the NAT (its connection table is</span><br><span style="color: hsl(120, 100%, 40%);">+updated) and MSC/MGW is able to send data back to it on that connection.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Moreover, NATs tend to drop connections from their connection tables after some</span><br><span style="color: hsl(120, 100%, 40%);">+inactivity time, meaning a peer may receive notice about the other end not being</span><br><span style="color: hsl(120, 100%, 40%);">+available while it actually is. This means the GSM network needs to be</span><br><span style="color: hsl(120, 100%, 40%);">+configured in a way to ensure inactivity periods are short enough that this</span><br><span style="color: hsl(120, 100%, 40%);">+cannot occur. That's the reason why OsmoMGW provides the `osmux dummy` VTY</span><br><span style="color: hsl(120, 100%, 40%);">+command to enable sending dummy packets from time to time to keep the</span><br><span style="color: hsl(120, 100%, 40%);">+connections alive.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+=== CID allocation</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Each peer (BSC/MGW and MSC/MGW) allocates its own _recvCID_, and receives from</span><br><span style="color: hsl(120, 100%, 40%);">+the peer through the used GSM protocol the peer's _recvCID_, which becomes</span><br><span style="color: hsl(120, 100%, 40%);">+the local _sendCID_ for that connection.</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%);">+BSC/MGW(recvCID=Y,sendCID=?)<-X--MSC/MGW(recvCID=X,sendCID=?)</span><br><span style="color: hsl(120, 100%, 40%);">+BSC/MGW(recvCID=Y,sendCID=X)--Y->MSC/MGW(recvCID=X,sendCID=Y)</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%);">+This way each peer is responsible for allocating and managing their own local</span><br><span style="color: hsl(120, 100%, 40%);">+address (CID) space. This is basically the same that happens with regular IP</span><br><span style="color: hsl(120, 100%, 40%);">+address and port in the RTP case (and those also apply when Osmux is used, but</span><br><span style="color: hsl(120, 100%, 40%);">+an extra identifier, the CID, is allocated).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+In an ideal scenario, without NAT, each BSC/MGW would have a public,</span><br><span style="color: hsl(120, 100%, 40%);">+differentiated and unique IP and port set tuple, And MSC/MGW should be able to</span><br><span style="color: hsl(120, 100%, 40%);">+identify messages coming from them by easily matching source IP address, port</span><br><span style="color: hsl(120, 100%, 40%);">+(and CID in Osmux case) against the parameters negotiated during call set up.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+In this kind of scenario, MSC/MGW could easily open and manage one Osmux socket</span><br><span style="color: hsl(120, 100%, 40%);">+per BSC (based on SDP IPaddr and port parameters), with same `<localIPaddr,</span><br><span style="color: hsl(120, 100%, 40%);">+localPort>` tuple, allowing for 256 Osmux CIDs per BSC and hence call legs per</span><br><span style="color: hsl(120, 100%, 40%);">+BSC. Each of the peers could actually have more than one Osmux socket towards</span><br><span style="color: hsl(120, 100%, 40%);">+the other peer, by using a pool of ports or IP addresses, so there's really not</span><br><span style="color: hsl(120, 100%, 40%);">+limit if required as long as there's a way to infer the initially negotiated</span><br><span style="color: hsl(120, 100%, 40%);">+`<srcIP, srcPort, dstIP, dstPort, sendCID>` tuple from the received audio</span><br><span style="color: hsl(120, 100%, 40%);">+packets.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+However, due to some constrains from in between NATs explained in section above,</span><br><span style="color: hsl(120, 100%, 40%);">+BSC/MGW IP address and port are not a priory known, and could change between</span><br><span style="color: hsl(120, 100%, 40%);">+different connections coming from it. As a result, it is difficult to infer the</span><br><span style="color: hsl(120, 100%, 40%);">+entire tuple, so for now MGW needs to allocate its Osmux _recvCID_ in a clever</span><br><span style="color: hsl(120, 100%, 40%);">+way, in order to be able to identify the full tuple from it.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Hence, currently OsmoMGW CID allocation implementation shares CID between all</span><br><span style="color: hsl(120, 100%, 40%);">+connections, which means it can only handle up to 256 concurrent Osmux</span><br><span style="color: hsl(120, 100%, 40%);">+connections (call legs).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Future work in OsmoMGW (https://osmocom.org/issues/4092[OS#4092]) plans to use a</span><br><span style="color: hsl(120, 100%, 40%);">+set of local ports for Osmux sockets instead of only 1 currently used. This way</span><br><span style="color: hsl(120, 100%, 40%);">+local ports can be matched against specific `<remoteIP, remotePort>` tuples and</span><br><span style="color: hsl(120, 100%, 40%);">+have an entire 256 Osmux CID space per `<remoteIP, remotePort>` (aka per peer).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+=== 3GPP AoIP network setup with Osmux</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[[fig-network-osmux-aoip]]</span><br><span style="color: hsl(120, 100%, 40%);">+.Sample node diagram of a 3GPP AoIP network with Osmux enabled</span><br><span style="color: hsl(120, 100%, 40%);">+[graphviz]</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+include::network_osmux_aoip.dot[]</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%);">+.MO-call with Osmux enable on 3GPP AoIP</span><br><span style="color: hsl(120, 100%, 40%);">+[mscgen]</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+include::mo_call_osmux_aoip.msc[]</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%);">+=== SCCPLite network setup with Osmux</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[[fig-network-osmux-sccplite]]</span><br><span style="color: hsl(120, 100%, 40%);">+.Sample node diagram of a 3GPP AoIP using A/IP with IPA/SCCPlite network with Osmux enabled</span><br><span style="color: hsl(120, 100%, 40%);">+[graphviz]</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+include::network_osmux_sccplite.dot[]</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%);">+.MO-call with Osmux enable on 3GPP AoIP using A/IP with IPA/SCCPlite</span><br><span style="color: hsl(120, 100%, 40%);">+["mscgen"]</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+include::mo_call_osmux_sccplite.msc[]</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%);">+=== SCCPLite network setup with Osmux + BSC-NAT</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[[fig-network-osmux-sccplite-nat]]</span><br><span style="color: hsl(120, 100%, 40%);">+.Sample node diagram of a 3GPP AoIP using A/IP with IPA/SCCPlite network and BSC-NAT with Osmux enabled</span><br><span style="color: hsl(120, 100%, 40%);">+[graphviz]</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+include::network_osmux_sccplite_nat.dot[]</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%);">+.MO-call with Osmux enable on 3GPP AoIP using A/IP with IPA/SCCPlite with a BSC-NAT between BSC and MSC</span><br><span style="color: hsl(120, 100%, 40%);">+["mscgen"]</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+include::mo_call_osmux_sccplite_nat.msc[]</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%);">+include::mgcp_extension_osmux.adoc[]</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-manuals/+/14839">change 14839</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/c/osmo-gsm-manuals/+/14839"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-gsm-manuals </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I182d94c63f7d74ef882b77be59a95b1b7d8a4e5e </div>
<div style="display:none"> Gerrit-Change-Number: 14839 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>