include::{commondir}/chapters/osmux/osmux.adoc[]

=== Osmux Support in {program-name}

==== {program-name} in a A/IP with IPA/SCCPlite network setup

In this kind of setup, Osmux is transparent to {program-name} and no specific
configuration is required here, since the CN-side of the BSC-attached MGW is
managed directly by the MSC.

So, in this case, only MSC and MGW (both for MSC-attached one and BSC-attached
one) need to be configured explicitly.

==== {program-name} in a 3GPP AoIP network setup

Osmux usage in {program-name} in managed through the VTY command `osmux
(on|off|only)` under the `msc` node. Once enabled (`on` or `only`),
{program-name} will start appending the vendor specific _Osmux Support_ IE in
_BSSMAP RESET_ and _BSSMAP RESET-ACK_ message towards the MSC in order to
announce it supports Osmux. This way, the MSC can decide whether to use Osmux or
not based on this information when setting up a call (this time using _Osmux
CID_ IE). It should be noted that this option should not be enabled unless MSC
managing {program-name} supports handling this extension IE (like OsmoMSC), a
3rd-party MSC might otherwise refuse the related _RESET_/_RESET-ACK_ messages.

{program-name} will behave differently during call set up based on the VTY
command presented above:

* `off`: If _BSSMAP Assign Request_ from MSC contains _Osmux CID_ IE, meaning
  MSC wants to use Osmux for this call, then {program-name} will reject the
  assignment and the call set up will fail.
* `on`: BSC will support and accept both Osmux and non-Osmux (RTP) upon call set
  up. If _BSSMAP Assign Request_ from MSC contains _Osmux CID_ IE,
  {program-name} will instruct its MGW to set up an Osmux connection on the
  CN-side of the MGCP endpoint, and will provide the MSC with its _recvCID_
  through the extension IE _Osmux CID_ appended to the _BSSMAP Assign Complete_
  message. On the other hand, if _BSSMAP Assign Request_ doesn't contain an
  _Osmux CID_ IE, {program-name} will instruct its MGW to set up a regular RTP
  connection on the CN-side of the MGCP endpoint.
* `only`: Same as per `on`, except that {program-name} will accept only Osmux
  calls on the CN-side, this is, if  _BSSMAP Assign Request_ from MSC doesn't
  contain an _Osmux CID_ IE, it will reject the assignment and the call set up
  will fail.

==== Osmux in the ip.access Abis interface

{program-name} can also talk Osmux instead of RTP to an OsmoBTS which supports
the feature. Osmux usage agains the BTS in {program-name} in managed through the
VTY command `osmux (on|off|only)` under the `bts` node.

If a BTS supports Osmux, it may announce the _OSMUX_ BTS feature towards the BSC
over OML. This way, the {program-name} becomes aware that this BTS supports
using Osmux to transfer voice call user data when the AMR codec is selected.

It is then up to {program-name} to decide whether to use Osmux or not when
establishing a new call. If {program-name} decides to use Osmux for a given
call, it will instruct its co-located MGW to set up an Osmux connection in the
endpoint (using the `X-Osmux extension`) and then it will forward the received
Osmux CID to the BTS in the the _IPACC CRCX/MDCX_ messages by means of an extra _Osmux
CID_ IE appended to it.
The IP address and port provided in the same messages refer to the
address and port where Osmux frames with the provided CID are expected to be
received. Similarly, the BTS appends an _Osmux CID_ IE to the _IPACC
CRCX/MDCX ACK_ message it generates, this time with its own local Osmux CID,
which {program-name} will in turn forward back to the co-located MGW.
Same goes for the BTS' local IP address and port where Osmux frames are expected
to be received.

{program-name} will behave differently during call set up based on the VTY
command `use (on|off|only)` under each `bts` node presented above:

* `off`: {program-name} will never attempt use of Osmux against this BTS (default).
* `on`: {program-name} will use Osmux against the BTS if the BTS announced Osmux
  support during OML bringup, and if MGW provided a valid Osmux CID during _MGCP
  CRCX_. Otherwise BSC will simply automatically fall back to using RTP for each
  call. For non-AMR calls, RTP will always be used.
* `only`: Same as per `on`, except that {program-name} will accept only Osmux
  calls on the BTS-side. This is, if  _MGCP CRCX ACK_ from MGW doesn't
  contain an _Osmux CID_ IE or _IPACC CRCX ACK_ from BSC doesn't
  contain an _Osmux CID_ IE, it will reject the assignment and the call set up
  will fail. This means also that only AMR calls (`Channel Mode GSM3`) are
  allowed.
